# Tutorial: Persistenza Dati Database (EBS Volume Simulation) In questo tutorial imparerai come i dati del database persistono oltre il ciclo di vita del container, simulando EBS volumes in AWS. ## Obiettivo Verificare che i dati del database sopravvivano al riavvio e alla rimozione del container. ## Prerequisiti - Tutorial 01 completato - Database in esecuzione - Dati di test creati --- ## Passo 1: Verifica volume esistente Verifica che il volume nominativo sia stato creato. Esegui: ```bash # Lista volumi Docker docker volume ls | grep db-data # Atteso: # local lab05_db-data ``` Il volume è nominativo (`local` driver), quindi i dati sopravvivono. --- ## Passo 2: Inserisci dati di test Crea dati che persisteranno oltre il riavvio. Esegui: ```bash # Crea tabella con timestamp docker exec lab05-db psql -U lab05_user -d lab05_db -c " CREATE TABLE IF NOT EXISTS persistence_test ( id SERIAL PRIMARY KEY, message TEXT, created_at TIMESTAMP DEFAULT NOW() ); " # Inserisci dati con timestamp unico docker exec lab05-db psql -U lab05_user -d lab05_db -c " INSERT INTO persistence_test (message) VALUES ('Test persistenza - $(date +%s)'); " ``` --- ## Passo 3: Verifica dati prima del riavvio Esegui: ```bash # Conta righe docker exec lab05-db psql -U lab05_user -d lab05_db -t -c " SELECT COUNT(*) FROM persistence_test; " # Salva l'ID per verifica row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c " SELECT COUNT(*) FROM persistence_test;" | tr -d ' ') echo "Righe prima del riavvio: $row_count" ``` --- ## Passo 4: Ferma e rimuovi il container Simula un failure del database. Esegui: ```bash # Ferma il container docker-compose stop db # Rimuovi il container (NON il volume!) docker-compose rm -f db # Verifica che il container sia rimosso docker ps -a | grep lab05-db ``` Atteso: Nessun output (container rimosso) --- ## Passo 5: Riavvia il database Crea un nuovo container con lo stesso volume. Esegui: ```bash # Riavvia il database docker-compose up -d db # Attendi che sia pronto sleep 10 # Verifica health docker exec lab05-db pg_isready -U lab05_user ``` --- ## Passo 6: Verifica dati dopo riavvio I dati devono essere ancora presenti. Esegui: ```bash # Conta righe dopo riavvio new_row_count=$(docker exec lab05-db psql -U lab05_user -d lab05_db -t -c " SELECT COUNT(*) FROM persistence_test;" | tr -d ' ') echo "Righe dopo il riavvio: $new_row_count" ``` Verifica: ```bash # Se i conti sono uguali, SUCCESSO if [ "$row_count" = "$new_row_count" ]; then echo "✓ DATI PERSISTITI CORRETTAMENTE" else echo "✗ DATI PERSI - ERRORE" fi ``` --- ## Passo 7: Verifica contenuto volume Esplora il volume per capire come PostgreSQL memorizza i dati. Esegui: ```bash # Trova il mount point del volume docker inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Source}}{{end}}{{end}}' # Lista file nel volume (come root) sudo ls -la /var/lib/docker/volumes/lab05_db-data/_data/ ``` Struttura chiave: - `base/`: dati database - `global/`: configurazione globale - `pg_wal/`: write-ahead log --- ## Passo 8: Test persistenza totale Rimuovi TUTTO e ricrea da zero. Esegui: ```bash # Ferma e rimuovi tutto docker-compose down -v # Nota: -v rimuove anche i volumi! NON usare -v per preservare dati # Riavvia docker-compose up -d # Verifica che i dati siano PERSI (corretto con -v) docker exec lab05-db psql -U lab05_user -d lab05_db -c " SELECT COUNT(*) FROM persistence_test; " ``` Atteso: ERRORE (tabella non esiste) perché i dati sono stati rimossi. --- ## Parallelismo con AWS EBS | Locale | AWS | |--------|-----| | Named volume | EBS volume | | Volume mount point | EBS mount point | | Data survives container restart | Data survives instance reboot | | Data lost with volume rm | Data lost with EBS deletion | --- ## INF-04 Compliance Check Verifica che la configurazione sia INF-04 compliant. Esegui: ```bash # Verifica volume montato grep -A 20 "db:" docker-compose.yml | grep "/var/lib/postgresql/data" # Verifica volume nominativo grep "db-data:" docker-compose.yml # Verifica driver local grep -A 3 "volumes:" docker-compose.yml | grep -A 2 "db-data:" ``` Tutte le verifiche devono passare. --- ## Troubleshooting ### Dati persi dopo riavvio ```bash # Verifica che il volume sia nominativo docker volume inspect lab05_db-data # Verifica montaggio corretto docker inspect lab05-db --format '{{json .Mounts}}' | jq ``` ### Volume non trovato ```bash # Lista tutti i volumi docker volume ls # Se il volume non esiste, ricrea docker volume create lab05_db-data ``` ### Permesso negato su volume ```bash # Verifica proprietà volume sudo ls -la /var/lib/docker/volumes/lab05_db-data/ # PostgreSQL deve poter scrivere sudo chown -R 999:999 /var/lib/docker/volumes/lab05_db-data/ ``` --- Prossimo tutorial: Configurare security e access control.