Files
laboratori-cloud/labs/lab-05-database/tutorial/02-data-persistence.md
Luca Sacchi Ricciardi f8544afe35 docs(06-02): create Diátaxis documentation for Lab 05 Database & RDS
Documentation (6 files, 1500+ lines):
Tutorials (3):
- 01-deploy-rds-database.md: Deploy PostgreSQL in private network
- 02-data-persistence.md: Data persistence with named volumes
- 03-security-compliance.md: INF-01/02/03/04 compliance

How-to Guides (1):
- connect-to-postgresql.md: Connection methods

Reference (1):
- postgresql-commands.md: PostgreSQL command reference

Explanation (1):
- database-rds-parallels.md: Docker↔RDS parallels with architecture diagrams

Key concepts:
- PostgreSQL container → RDS Instance
- Private network → VPC Private Subnet
- Named volume → EBS volume
- Resource limits → DB instance class

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 17:41:29 +02:00

4.8 KiB

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:

# 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:

# 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:

# 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:

# 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:

# 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:

# 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:

# 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:

# 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:

# 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:

# 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

# 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

# Lista tutti i volumi
docker volume ls

# Se il volume non esiste, ricrea
docker volume create lab05_db-data

Permesso negato su volume

# 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.