Docker in pratica: i comandi e le buone pratiche con cui gestiamo GLPI

Come NexTool gestisce e mantiene GLPI su Docker per i clienti: architettura con volumi separati, un docker-compose di produzione, i comandi che usiamo davvero nel supporto e le buone pratiche (tag fisso, non-root, secret e backup del volume).

Docker ha smesso di essere una moda ed è diventato il modo standard con cui consegniamo e manteniamo GLPI per i clienti. Invece di installare PHP, MariaDB e il web server direttamente sul sistema operativo, impacchettiamo GLPI e le sue dipendenze in container versionati - il che rende l'installazione riproducibile, il rollback banale e la manutenzione prevedibile. Questa guida raccoglie i comandi che usiamo davvero ogni giorno nel supporto e le pratiche che applichiamo per far girare il service desk in produzione in sicurezza.

Come facciamo girare GLPI su Docker

L'architettura che standardizziamo è volutamente snella: un container per l'applicazione GLPI (PHP-FPM e web server), uno per il database MariaDB e, quando il volume di ticket lo giustifica, un Redis per sessione e cache. Tutto orchestrato da un unico docker-compose.yml, dietro un reverse proxy con TLS. I dati che devono sopravvivere a qualsiasi ricreazione del container - database, file caricati e configurazione - vivono in volumi con nome, mai dentro il container. Questa separazione tra codice (l'immagine, usa e getta) e stato (il volume, prezioso) è ciò che trasforma un aggiornamento di versione di GLPI in un'operazione di minuti, e non in una notte intera.

Artefatto: lo stack GLPI che provisioniamo

Questo è lo scheletro del compose che avviamo a ogni deployment, già con volumi separati e senza credenziali in chiaro dentro il file:

# docker-compose.yml - stack GLPI di produzione
services:
  glpi:
    image: glpi/glpi:11.0        # tag fisso, mai 'latest'
    restart: unless-stopped
    depends_on:
      - glpidb
    volumes:
      - glpi_files:/var/glpi     # file caricati e configurazione di GLPI
    networks: [ edge, internal ]

  glpidb:
    image: mariadb:11.4
    restart: unless-stopped
    environment:
      MARIADB_DATABASE: glpi
      MARIADB_USER: glpi
      MARIADB_PASSWORD_FILE: /run/secrets/db_password   # password via secret, mai in chiaro
    volumes:
      - glpi_db:/var/lib/mysql   # il database vive qui, fuori dal container
    networks: [ internal ]
    secrets: [ db_password ]

volumes:
  glpi_files:
  glpi_db:

networks:
  edge:      # esposta al reverse proxy
  internal:  # database privato, senza rotta esterna
    internal: true

secrets:
  db_password:
    file: ./secrets/db_password.txt   # file 600, fuori da git

I comandi che usiamo davvero nel supporto

Nel quotidiano, pochi comandi risolvono la maggior parte degli interventi. Questi sono quelli che il team digita quasi senza pensarci:

ComandoQuando lo usiamo mantenendo GLPI
docker compose up -dAvvia o aggiorna lo stack dopo una modifica al compose o al tag dell'immagine
docker compose logs -f glpiSegue l'errore di un ticket in tempo reale quando il cliente segnala un guasto
docker compose exec glpi bashEntra nel container per eseguire php bin/console (cron, cache, migrazione)
docker compose psVerifica che applicazione e database siano attivi prima di aprire un incidente
docker statsDiagnostica i picchi di CPU e memoria quando la lamentela è la lentezza
docker compose down (senza -v)Ricrea lo stack conservando i volumi; il -v cancellerebbe il database

L'errore comune - e costoso - che abbiamo visto in operatori distratti è eseguire docker compose down -v pensando che riavvii solo i container. Il flag -v rimuove i volumi, e con essi l'intero database di GLPI. Nel supporto trattiamo -v come un comando distruttivo: non compare in nessuna procedura operativa, e ogni backup di volume viene validato prima di qualsiasi manutenzione che gli si avvicini.

Buone pratiche che applichiamo in produzione

  • Tag fisso, mai latest - fissiamo la versione dell'immagine (es. glpi/glpi:11.0, mariadb:11.4) affinché un pull non porti una versione inattesa nel mezzo di una manutenzione.
  • Non-root e privilegio minimo - l'applicazione non gira come root, e il database resta sulla rete internal, senza rotta esterna, raggiungibile solo dal container GLPI.
  • Secret fuori dal compose - la password del database entra tramite un Docker secret o un file montato in sola lettura, mai in environment: in chiaro committato su git.
  • Il volume è sacro - database, file e configurazione in volumi con nome, con un dump logico giornaliero del database testato con un ripristino reale (un backup mai ripristinato non è un backup).
  • Immagini snelle e scansionate - una base slim e la scansione con Trivy o Docker Scout per non portare una CVE nota in produzione.

Un dettaglio che conosce solo chi mantiene GLPI in container: aggiornare la versione di GLPI non è solo cambiare il tag dell'immagine. Dopo il docker compose up -d con l'immagine nuova, bisogna eseguire la migrazione del database dalla console dentro il container, altrimenti l'applicazione parte puntando a uno schema vecchio e restituisce un errore 500 alla prima schermata. Per questo la nostra procedura di aggiornamento concatena sempre lo stesso ordine: backup del volume del database, cambio del tag, up -d, migrazione e solo allora l'apertura dell'accesso all'utente. Quando il cliente usa il plugin NexTool, questo stesso avvio ricarica i moduli dell'ecosistema - quindi validiamo anche la salute delle integrazioni (code di webhook, sincronizzazione) prima di dichiarare l'ambiente stabile.

Se la tua operatività su GLPI gira ancora installata direttamente sul server, senza volumi separati né backup testato, NexTool implementa e mantiene quell'ambiente su Docker nel modo giusto - con uno stack versionato, aggiornamenti prevedibili e osservabilità accanto al service desk. Parla con noi del supporto di GLPI su container.


Questo contenuto è stato prodotto con l'ausilio dell'intelligenza artificiale e revisionato dal team Nextool Solutions.

Domande Frequenti

Perché lo stack in container è riproducibile e lo stato (database, file, configurazione) è isolato nei volumi. Questo rende gli aggiornamenti di versione prevedibili, il rollback banale e la manutenzione un'operazione di minuti, invece di un'installazione manuale difficile da riprodurre su un altro ambiente.

Ogni giorno usiamo docker compose up -d (avviare/aggiornare), docker compose logs -f glpi (seguire gli errori in tempo reale), docker compose exec glpi bash (eseguire la console GLPI), docker compose ps (verificare che app e database siano attivi) e docker stats (diagnosticare i picchi di CPU e memoria).

docker compose down da solo ferma e rimuove i container ma conserva i volumi con nome - il database resta intatto. A cancellare i dati è il flag -v (docker compose down -v), che rimuove anche i volumi. Trattiamo -v come un comando distruttivo e non entra mai in una procedura di routine.

Ciò che va salvato è lo stato, non l'immagine. Facciamo un dump logico giornaliero del database (dal container MariaDB) e una copia del volume dei file caricati e della configurazione. Soprattutto, testiamo il ripristino: un backup mai ripristinato non conta come backup.

L'ordine conta: prima il backup del volume del database, poi il cambio del tag dell'immagine, docker compose up -d, la migrazione del database dalla console nel container e solo allora l'apertura dell'accesso. Saltare la migrazione fa partire l'applicazione con uno schema vecchio e restituisce un errore 500.

Hai bisogno di aiuto?