diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..b063ecb --- /dev/null +++ b/.env.production @@ -0,0 +1,27 @@ +# Configurazione per il server cloud in produzione +# Questo file deve essere copiato sul server come .env + +# Database (localhost sul server cloud perché PostgreSQL è locale) +DATABASE_URL=postgresql://terrain_user:terrain_pass@localhost:5432/terrain_monitor + +# MQTT Broker (localhost sul server cloud perché Mosquitto è locale) +MQTT_BROKER_HOST=localhost +MQTT_BROKER_PORT=1883 +MQTT_USERNAME= +MQTT_PASSWORD= + +# Topic MQTT +MQTT_TOPIC_ALARMS=terrain/+/+/alarms +MQTT_TOPIC_TELEMETRY=terrain/+/+/telemetry +MQTT_TOPIC_STATUS=terrain/+/+/status + +# Security +SECRET_KEY=batt1l0ngs3cur3k3y +ALGORITHM=HS256 +ACCESS_TOKEN_EXPIRE_MINUTES=30 + +# Firebase +FIREBASE_CREDENTIALS_PATH=/home/alex/devel/web-app-python/serviceAccountKey.json + +# Debug (False in produzione) +DEBUG=False diff --git a/SYSTEMD_INSTALL_GUIDE.md b/SYSTEMD_INSTALL_GUIDE.md new file mode 100644 index 0000000..e3ac2fb --- /dev/null +++ b/SYSTEMD_INSTALL_GUIDE.md @@ -0,0 +1,196 @@ +# Guida Installazione Servizio Systemd sul Server Cloud + +## File da caricare sul server (94.177.199.207) + +1. `start_backend.sh` - Script di avvio +2. `terrain-monitor.service` - File di servizio systemd +3. `.env.production` - Variabili d'ambiente per produzione + +## Istruzioni di installazione + +### Passo 1: Carica i file sul server + +```bash +# Da questo workspace locale, copia i file sul server cloud +scp start_backend.sh alex@94.177.199.207:/home/alex/devel/web-app-python/ +scp .env.production alex@94.177.199.207:/home/alex/devel/web-app-python/ +scp terrain-monitor.service alex@94.177.199.207:/tmp/ +``` + +### Passo 2: Connettiti al server cloud + +```bash +ssh alex@94.177.199.207 +``` + +### Passo 3: Configura i file sul server + +```bash +# Vai nella directory del progetto +cd /home/alex/devel/web-app-python + +# Rendi eseguibile lo script di avvio +chmod +x start_backend.sh + +# Copia il file .env.production come .env (BACKUP prima il vecchio .env!) +cp .env .env.backup +cp .env.production .env + +# Verifica che il path nel file .env sia corretto +nano .env # Controlla FIREBASE_CREDENTIALS_PATH e altri path +``` + +### Passo 4: Installa il servizio systemd + +```bash +# Copia il file di servizio nella directory systemd +sudo cp /tmp/terrain-monitor.service /etc/systemd/system/ + +# Ricarica la configurazione systemd +sudo systemctl daemon-reload + +# Abilita il servizio per l'avvio automatico +sudo systemctl enable terrain-monitor + +# Avvia il servizio +sudo systemctl start terrain-monitor +``` + +### Passo 5: Verifica lo stato del servizio + +```bash +# Controlla lo stato del servizio +sudo systemctl status terrain-monitor + +# Visualizza i log in tempo reale +sudo journalctl -u terrain-monitor -f + +# Visualizza gli ultimi 50 log +sudo journalctl -u terrain-monitor -n 50 +``` + +## Comandi utili per gestire il servizio + +### Avviare il servizio +```bash +sudo systemctl start terrain-monitor +``` + +### Fermare il servizio +```bash +sudo systemctl stop terrain-monitor +``` + +### Riavviare il servizio +```bash +sudo systemctl restart terrain-monitor +``` + +### Ricaricare dopo modifiche al codice +```bash +sudo systemctl restart terrain-monitor +``` + +### Vedere i log +```bash +# Log in tempo reale +sudo journalctl -u terrain-monitor -f + +# Log delle ultime 2 ore +sudo journalctl -u terrain-monitor --since "2 hours ago" + +# Log di oggi +sudo journalctl -u terrain-monitor --since today + +# Log con filtro per errori +sudo journalctl -u terrain-monitor -p err +``` + +### Disabilitare l'avvio automatico +```bash +sudo systemctl disable terrain-monitor +``` + +### Riabilitare l'avvio automatico +```bash +sudo systemctl enable terrain-monitor +``` + +## Verifica che funzioni correttamente + +Dopo l'avvio, verifica che: + +1. **Il servizio sia attivo**: + ```bash + sudo systemctl status terrain-monitor + # Dovrebbe mostrare: Active: active (running) + ``` + +2. **Il backend risponda**: + ```bash + curl http://localhost:8000/health + # Dovrebbe rispondere: {"status":"healthy","mqtt_connected":true} + ``` + +3. **MQTT sia connesso** (nei log): + ```bash + sudo journalctl -u terrain-monitor -n 20 + # Cerca: "Connesso al broker MQTT" + # Cerca: "Client MQTT creato con ID: terrain_backend_..." + ``` + +## Troubleshooting + +### Il servizio non parte + +```bash +# Controlla i log per errori +sudo journalctl -u terrain-monitor -n 50 + +# Verifica i permessi +ls -la /home/alex/devel/web-app-python/start_backend.sh + +# Prova ad eseguire manualmente lo script +cd /home/alex/devel/web-app-python +./start_backend.sh +``` + +### Errori di connessione database/MQTT + +```bash +# Verifica che PostgreSQL sia in esecuzione +sudo systemctl status postgresql + +# Verifica che Mosquitto sia in esecuzione +sudo systemctl status mosquitto + +# Controlla le variabili d'ambiente +cat /home/alex/devel/web-app-python/.env +``` + +### Il servizio si riavvia continuamente + +```bash +# Guarda i log per capire l'errore +sudo journalctl -u terrain-monitor -f + +# Aumenta il RestartSec se serve +sudo nano /etc/systemd/system/terrain-monitor.service +# Cambia RestartSec=10 in RestartSec=30 +sudo systemctl daemon-reload +sudo systemctl restart terrain-monitor +``` + +## Note importanti + +1. **User e Group**: Il servizio gira con l'utente `alex`. Assicurati che sia l'utente corretto sul server. + +2. **Path assoluti**: Tutti i path nel file .env e nel servizio devono essere assoluti, non relativi. + +3. **Firebase credentials**: Assicurati che il file `serviceAccountKey.json` esista nel path specificato. + +4. **Firewall**: Verifica che la porta 8000 sia aperta nel firewall se devi accedere dall'esterno. + +5. **Riavvio automatico**: Il servizio è configurato per riavviarsi automaticamente in caso di crash (Restart=always). + +6. **Log rotation**: I log di systemd/journald hanno una rotazione automatica. Non è necessario configurarla. diff --git a/start_backend.sh b/start_backend.sh new file mode 100755 index 0000000..b932fa7 --- /dev/null +++ b/start_backend.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Script di avvio per il backend Terrain Monitor +# Questo script carica le variabili d'ambiente e avvia il server + +set -e + +# Directory del progetto +PROJECT_DIR="/home/alex/devel/web-app-python" +cd "$PROJECT_DIR" + +# Carica variabili d'ambiente dal file .env +if [ -f "$PROJECT_DIR/.env" ]; then + export $(grep -v '^#' "$PROJECT_DIR/.env" | xargs) +fi + +# Attiva l'ambiente virtuale +source "$PROJECT_DIR/.venv/bin/activate" + +# Avvia il server con uvicorn +exec uvicorn main:app --host 0.0.0.0 --port 8000 --log-level info diff --git a/terrain-monitor.service b/terrain-monitor.service new file mode 100644 index 0000000..2df6792 --- /dev/null +++ b/terrain-monitor.service @@ -0,0 +1,28 @@ +[Unit] +Description=Terrain Monitor Backend Service +After=network.target postgresql.service mosquitto.service +Wants=postgresql.service mosquitto.service + +[Service] +Type=simple +User=alex +Group=alex +WorkingDirectory=/home/alex/devel/web-app-python +EnvironmentFile=/home/alex/devel/web-app-python/.env +ExecStart=/home/alex/devel/web-app-python/start_backend.sh + +# Restart configuration +Restart=always +RestartSec=10 + +# Security settings +NoNewPrivileges=true +PrivateTmp=true + +# Logging +StandardOutput=journal +StandardError=journal +SyslogIdentifier=terrain-monitor + +[Install] +WantedBy=multi-user.target