Files
supabase-pinger/progress.md
T
2026-04-24 13:25:39 +02:00

7.8 KiB

Progress

Stato Attuale

Data riferimento: 2026-04-24

Il progetto ha oggi:

  • README, PRD e progress.md committati su remote;
  • .gitignore con esclusione di .env e connessione.md;
  • app.py — entrypoint Python con config loader, database client, loop resiliente e shutdown ordinato;
  • requirements.txt con dipendenze minime (psycopg2-binary, python-dotenv);
  • .env.example completo;
  • Dockerfile e docker-compose.yml.

Obiettivo di Sviluppo

Realizzare un servizio Python dockerizzato che mantenga attivo un database Supabase free tier tramite query periodiche di keep-alive, con configurazione via .env, processo long-running e documentazione operativa essenziale.

Principi di Esecuzione

  • tenere il perimetro minimale e focalizzato;
  • evitare dipendenze inutili;
  • non esporre segreti nel repository;
  • validare ogni fase con una verifica eseguibile;
  • rilasciare una V1 utilizzabile prima di aggiungere feature opzionali.

Roadmap di Sviluppo

Fase 0. Messa in sicurezza del repository

Obiettivo: Ridurre subito il rischio di esposizione credenziali e allineare il repository a una baseline di sicurezza minima.

Attivita':

  • verificare quali file contengono credenziali o connection string reali;
  • rimuovere i segreti dal contenuto versionato e sostituirli con placeholder;
  • assicurare che .env sia ignorato da git;
  • mantenere .env.example come unico riferimento versionabile;
  • rivedere la documentazione per evitare esempi che inducano a committare segreti.

Deliverable:

  • repository senza credenziali reali in chiaro;
  • .gitignore corretto;
  • linee guida documentate per la gestione dei segreti.

Verifica:

  • ricerca testuale nel repository per individuare host, password, key e DSN;
  • conferma che .env non sia tracciato;
  • review manuale dei file documentali.

Stato:

  • completataconnessione.md non tracciato, .env escluso da .gitignore, nessuna credenziale in chiaro nel repository.

Fase 1. Bootstrap del progetto Python

Obiettivo: Creare la struttura minima eseguibile del servizio.

Attivita':

  • creare app.py o entrypoint equivalente;
  • definire requirements.txt con dipendenze minime;
  • scegliere libreria di connessione PostgreSQL adatta al caso d'uso;
  • predisporre struttura semplice senza over-engineering;
  • definire convenzioni di logging e gestione errori.

Deliverable:

  • scheletro applicativo Python avviabile;
  • dipendenze dichiarate;
  • entrypoint unico chiaro.

Verifica:

  • avvio locale del processo Python;
  • import delle dipendenze senza errori;
  • controllo sintattico del file principale.

Stato:

  • completataapp.py con logging strutturato, requirements.txt con psycopg2-binary e python-dotenv, sintassi verificata.

Fase 2. Configurazione e validazione environment

Obiettivo: Caricare e validare in modo affidabile tutte le variabili richieste dal PRD.

Attivita':

  • implementare lettura delle env dal runtime;
  • validare presenza di host, porta, database, user, password, query e intervallo;
  • gestire messaggi di errore chiari per configurazioni incomplete;
  • creare .env.example coerente con README e PRD;
  • definire default prudenti solo dove sensato.

Deliverable:

  • loader di configurazione affidabile;
  • .env.example pronto all'uso;
  • error handling per startup configuration.

Verifica:

  • avvio con configurazione completa;
  • fallimento atteso con env mancanti;
  • coerenza tra .env.example, README e PRD.

Stato:

  • completataload_config() in app.py valida tutte le variabili obbligatorie con messaggi di errore espliciti e uscita controllata; .env.example coerente con PRD e README.

Fase 3. Connessione a Supabase/PostgreSQL

Obiettivo: Stabilire la connessione al database e isolare il layer di accesso.

Attivita':

  • implementare apertura connessione al database;
  • eseguire una query di test controllata;
  • gestire timeout, eccezioni e chiusura connessione;
  • evitare logging di segreti o DSN completi;
  • preparare una funzione dedicata al keep-alive.

Deliverable:

  • client database funzionante;
  • funzione di ping riusabile;
  • logging tecnico minimo ma utile.

Verifica:

  • esecuzione riuscita di SELECT 1;;
  • simulazione di errore credenziali o host non raggiungibile;
  • log chiari e privi di segreti.

Stato:

  • completata — funzione ping() in app.py con connect_timeout, gestione OperationalError e Error, chiusura connessione in finally, nessun segreto nei log.

Fase 4. Loop di keep-alive e resilienza runtime

Obiettivo: Trasformare il ping singolo in un servizio continuo e resiliente.

Attivita':

  • implementare loop infinito controllato;
  • usare PING_INTERVAL_MINUTES come scheduling applicativo;
  • loggare avvio ciclo, esito e prossima esecuzione;
  • mantenere il processo attivo anche in caso di errore operativo;
  • gestire terminazione ordinata su stop del container.

Deliverable:

  • runtime long-running stabile;
  • gestione errori non distruttiva;
  • shutdown ordinato.

Verifica:

  • il processo resta attivo dopo un ping riuscito;
  • il processo resta attivo dopo un ping fallito;
  • stop manuale con chiusura ordinata.

Stato:

  • completatarun() in app.py con loop while not _shutdown, sleep a blocchi da 10s per risposta rapida a SIGTERM/SIGINT, handler segnali registrati, log di next-run ad ogni ciclo.

Fase 5. Containerizzazione Docker

Obiettivo: Rendere il servizio distribuibile e persistente tramite Docker.

Attivita':

  • scrivere Dockerfile minimale;
  • configurare comando di avvio del processo Python;
  • verificare passaggio variabili con --env-file .env;
  • definire uso raccomandato di --restart unless-stopped;
  • aggiungere eventuale supporto docker compose.

Deliverable:

  • immagine Docker buildabile;
  • esecuzione container funzionante;
  • esempio compose essenziale.

Verifica:

  • docker build completato con successo;
  • container avviato e logs leggibili;
  • persistenza del processo finche' non viene fermato.

Stato:

  • completataDockerfile con python:3.12-slim, flag -u per output non bufferizzato, docker-compose.yml con restart: unless-stopped.

Fase 6. Documentazione operativa e rifinitura V1

Obiettivo: Concludere la prima versione con documentazione e uso coerente.

Attivita':

  • allineare README, PRD, .env.example e struttura reale del repository;
  • documentare build, run, stop e troubleshooting base;
  • rimuovere ambiguita' su intervallo di ping raccomandato;
  • chiarire i limiti del tool rispetto ai termini del free tier;
  • aggiungere checklist rapida di avvio.

Deliverable:

  • documentazione finale coerente con il codice;
  • repository pronto per primo utilizzo;
  • baseline V1 chiusa.

Verifica:

  • review incrociata documentazione vs file reali;
  • onboarding test: un utente tecnico deve riuscire ad avviare il servizio dai documenti;
  • lint markdown senza errori.

Stato:

  • completata

Backlog Post-V1

  • retry con backoff configurabile;
  • healthcheck Docker dedicato;
  • endpoint o comando di self-test;
  • notifiche opzionali via webhook o Telegram;
  • metriche esportabili;
  • supporto a query alternativa di keep-alive con tabella di log.

Ordine di Esecuzione Consigliato

  1. Fase 0
  2. Fase 1
  3. Fase 2
  4. Fase 3
  5. Fase 4
  6. Fase 5
  7. Fase 6

Definizione di Done per la V1

La V1 e' completata quando:

  • il repository non contiene segreti reali;
  • esiste .env.example completo;
  • il servizio Python si avvia con configurazione valida;
  • il servizio esegue la query di keep-alive verso Supabase;
  • il processo resta attivo nel tempo;
  • il container Docker funziona con --env-file .env e --restart unless-stopped;
  • la documentazione corrisponde ai file realmente presenti nel repository.

Prossima Attivita' Operativa

Fasi 0-6 completate. V1 chiusa con test operativo end-to-end su pooler Supabase IPv4.

Nota operativa: usare host pooler (aws-1-eu-central-1.pooler.supabase.com) su porta 6543 con utente postgres.<project-ref> per ambienti senza connettivita' IPv6.