diff --git a/DOCKER_SYSTEMD_GUIDE.md b/DOCKER_SYSTEMD_GUIDE.md new file mode 100644 index 0000000..be5b82e --- /dev/null +++ b/DOCKER_SYSTEMD_GUIDE.md @@ -0,0 +1,247 @@ +# Guida Servizio Systemd per Docker Compose + +## Panoramica + +Vengono creati **2 servizi systemd**: + +1. **terrain-docker.service** - Gestisce i container Docker (PostgreSQL + Mosquitto) +2. **terrain-monitor.service** - Gestisce il backend FastAPI (dipende da terrain-docker) + +**Ordine di avvio automatico**: +`docker → terrain-docker (PostgreSQL + Mosquitto) → terrain-monitor (Backend)` + +## Installazione sul server cloud + +### Passo 1: Carica i file sul server + +```bash +# Dal workspace locale +cd /home/alex/devel/web-app-python + +scp terrain-docker.service alex@94.177.199.207:/tmp/ +scp terrain-monitor.service alex@94.177.199.207:/tmp/ +scp start_backend.sh alex@94.177.199.207:/home/alex/devel/web-app-python/ +``` + +### Passo 2: Installa i servizi sul server cloud + +```bash +# Connettiti al server +ssh alex@94.177.199.207 + +# Copia i servizi in systemd +sudo cp /tmp/terrain-docker.service /etc/systemd/system/ +sudo cp /tmp/terrain-monitor.service /etc/systemd/system/ + +# Rendi eseguibile lo script di avvio +cd /home/alex/devel/web-app-python +chmod +x start_backend.sh + +# Ricarica systemd +sudo systemctl daemon-reload +``` + +### Passo 3: Abilita e avvia i servizi + +```bash +# Abilita avvio automatico al boot +sudo systemctl enable terrain-docker +sudo systemctl enable terrain-monitor + +# Avvia i servizi (terrain-docker parte automaticamente prima di terrain-monitor) +sudo systemctl start terrain-docker +sudo systemctl start terrain-monitor + +# Verifica che tutto funzioni +sudo systemctl status terrain-docker +sudo systemctl status terrain-monitor +``` + +## Comandi utili + +### Gestione servizio Docker + +```bash +# Avvia i container +sudo systemctl start terrain-docker + +# Ferma i container +sudo systemctl stop terrain-docker + +# Riavvia i container +sudo systemctl restart terrain-docker + +# Stato dei container +sudo systemctl status terrain-docker +docker-compose ps +``` + +### Gestione servizio Backend + +```bash +# Avvia il backend +sudo systemctl start terrain-monitor + +# Ferma il backend +sudo systemctl stop terrain-monitor + +# Riavvia il backend (dopo modifiche al codice) +sudo systemctl restart terrain-monitor + +# Stato del backend +sudo systemctl status terrain-monitor + +# Log in tempo reale +sudo journalctl -u terrain-monitor -f +``` + +### Riavviare tutto l'ambiente + +```bash +# Riavvia prima i container, poi il backend +sudo systemctl restart terrain-docker +sleep 5 +sudo systemctl restart terrain-monitor +``` + +### Fermare tutto + +```bash +# Ferma nell'ordine inverso +sudo systemctl stop terrain-monitor +sudo systemctl stop terrain-docker +``` + +## Ordine delle dipendenze + +``` +Boot + ↓ +docker.service (Docker daemon) + ↓ +terrain-docker.service (PostgreSQL + Mosquitto containers) + ↓ +terrain-monitor.service (FastAPI backend) +``` + +Se `terrain-docker` non parte, `terrain-monitor` non partirà automaticamente. + +## Verifica funzionamento + +### 1. Verifica che i container siano running + +```bash +docker-compose ps +``` + +Output atteso: +``` +NAME STATUS PORTS +terrain_monitor-mosquitto-1 Up X minutes 0.0.0.0:1883->1883/tcp +terrain_monitor-postgres-1 Up X minutes 0.0.0.0:5432->5432/tcp +``` + +### 2. Verifica che il backend risponda + +```bash +curl http://localhost:8000/health +``` + +Output atteso: +```json +{"status":"healthy","mqtt_connected":true} +``` + +### 3. Verifica i log + +```bash +# Log Docker Compose +sudo journalctl -u terrain-docker -n 20 + +# Log Backend +sudo journalctl -u terrain-monitor -n 50 + +# Log in tempo reale di entrambi (in due terminali) +sudo journalctl -u terrain-docker -f +sudo journalctl -u terrain-monitor -f +``` + +## Troubleshooting + +### I container non partono + +```bash +# Verifica che Docker sia attivo +sudo systemctl status docker + +# Prova manualmente +cd /home/alex/devel/web-app-python +docker-compose up -d +docker-compose ps +docker-compose logs +``` + +### Il backend non si connette al database/MQTT + +```bash +# Verifica che i container siano raggiungibili +docker exec -it terrain_monitor-postgres-1 pg_isready +docker exec -it terrain_monitor-mosquitto-1 mosquitto -h + +# Controlla i log del backend +sudo journalctl -u terrain-monitor -n 100 +``` + +### Al riavvio del server i servizi non partono + +```bash +# Verifica che siano abilitati +sudo systemctl is-enabled terrain-docker +sudo systemctl is-enabled terrain-monitor + +# Abilita se necessario +sudo systemctl enable terrain-docker +sudo systemctl enable terrain-monitor +``` + +### Modificare la configurazione dei servizi + +```bash +# Modifica il servizio +sudo nano /etc/systemd/system/terrain-docker.service +# oppure +sudo nano /etc/systemd/system/terrain-monitor.service + +# Ricarica sempre dopo le modifiche +sudo systemctl daemon-reload + +# Riavvia il servizio modificato +sudo systemctl restart terrain-docker +sudo systemctl restart terrain-monitor +``` + +## Note importanti + +1. **Type=oneshot**: Il servizio terrain-docker usa `Type=oneshot` perché docker-compose è un comando che parte e termina (i container continuano a girare in background). + +2. **RemainAfterExit=yes**: Questo dice a systemd che il servizio è ancora attivo anche se il comando è terminato. + +3. **Before/After**: Definiscono l'ordine di avvio. `terrain-docker` parte PRIMA di `terrain-monitor`. + +4. **Requires vs Wants**: + - `Requires`: Se terrain-docker fallisce, terrain-monitor non parte + - `Wants`: Preferibile ma non obbligatorio + +5. **User e Group**: Entrambi i servizi girano come utente `alex`. Assicurati che: + - L'utente possa eseguire docker-compose (gruppo docker) + - Abbia i permessi sui file del progetto + +6. **Path di docker-compose**: Se `docker-compose` non è in `/usr/bin/`, trova il path con `which docker-compose` e aggiornalo nel servizio. + +## Aggiunta utente al gruppo docker (se necessario) + +```bash +# Se ricevi errori di permessi Docker +sudo usermod -aG docker alex +# Poi rilogga o riavvia il server +``` diff --git a/terrain-docker.service b/terrain-docker.service new file mode 100644 index 0000000..65e7104 --- /dev/null +++ b/terrain-docker.service @@ -0,0 +1,24 @@ +[Unit] +Description=Terrain Monitor Docker Services (PostgreSQL + Mosquitto) +Requires=docker.service +After=docker.service +Before=terrain-monitor.service + +[Service] +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=/home/alex/devel/web-app-python +User=alex +Group=alex + +# Avvia i container +ExecStart=/usr/bin/docker-compose up -d + +# Ferma i container +ExecStop=/usr/bin/docker-compose down + +# Riavvia i container se necessario +ExecReload=/usr/bin/docker-compose restart + +[Install] +WantedBy=multi-user.target diff --git a/terrain-monitor.service b/terrain-monitor.service index 2df6792..310f078 100644 --- a/terrain-monitor.service +++ b/terrain-monitor.service @@ -1,7 +1,8 @@ [Unit] Description=Terrain Monitor Backend Service -After=network.target postgresql.service mosquitto.service -Wants=postgresql.service mosquitto.service +After=network.target terrain-docker.service +Wants=terrain-docker.service +Requires=terrain-docker.service [Service] Type=simple