docker service

This commit is contained in:
2025-10-20 20:12:41 +02:00
parent 47512950ee
commit 03fe6fba26
3 changed files with 274 additions and 2 deletions

247
DOCKER_SYSTEMD_GUIDE.md Normal file
View File

@@ -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
```

24
terrain-docker.service Normal file
View File

@@ -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

View File

@@ -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