docker service
This commit is contained in:
247
DOCKER_SYSTEMD_GUIDE.md
Normal file
247
DOCKER_SYSTEMD_GUIDE.md
Normal 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
24
terrain-docker.service
Normal 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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user