Vai al contenuto

๐Ÿ“‚ Struttura del filesystem

LibreFolio conserva tutto ciรฒ che memorizza in un'unica directory dati: il database, i file caricati, i report del broker e i log. La sua struttura รจ tutto ciรฒ che devi conoscere per backup e manutenzione.

Installazione Directory dati
Host (Pipenv) backend/data/prod/ nella cartella del progetto, o il percorso in LIBREFOLIO_DATA_DIR
Docker Compose LibreFolio-data/ accanto a docker-compose.yml (/app/backend/data/prod-docker all'interno del container)

๐Ÿ—‚๏ธ Struttura delle directory

backend/data/
โ”œโ”€โ”€ ๐Ÿ“‚ prod/                          # Dati di produzione (predefinito)
โ”‚   โ”œโ”€โ”€ ๐Ÿ—ƒ๏ธ sqlite/
โ”‚   โ”‚   โ””โ”€โ”€ ๐Ÿ“„ app.db                 # Database SQLite principale (modalitร  WAL)
โ”‚   โ”œโ”€โ”€ ๐Ÿ–ผ๏ธ custom-uploads/            # File caricati nell'app
โ”‚   โ”œโ”€โ”€ ๐Ÿ“Š broker_reports/
โ”‚   โ”‚   โ”œโ”€โ”€ ๐Ÿ“ฅ uploaded/              # Report in attesa di essere letti
โ”‚   โ”‚   โ”œโ”€โ”€ โœ… parsed/                # Report letti con successo
โ”‚   โ”‚   โ””โ”€โ”€ โŒ failed/                # Report che non รจ stato possibile leggere
โ”‚   โ”œโ”€โ”€ ๐Ÿ“ logs/                      # File di log dell'applicazione
โ”‚   โ”œโ”€โ”€ ๐ŸŽญ scenario_catalog/          # Opzionale: i tuoi scenari di stress
โ”‚   โ””โ”€โ”€ ๐Ÿ“‹ scheduler_state.json       # Ultima esecuzione delle sincronizzazioni programmate
โ”‚
โ””โ”€โ”€ ๐Ÿงช test/                          # Dati di test (completamente isolati)
    โ”œโ”€โ”€ ๐Ÿ—ƒ๏ธ sqlite/app.db
    โ”œโ”€โ”€ ๐Ÿ–ผ๏ธ custom-uploads/
    โ”œโ”€โ”€ ๐Ÿ“Š broker_reports/
    โ””โ”€โ”€ ๐Ÿ“ logs/

๐Ÿ“– Cosa contiene ciascuna directory

๐Ÿ—ƒ๏ธ sqlite/

  • ๐Ÿ“„ app.db contiene tutti i dati strutturati: utenti, broker, transazioni, asset, prezzi, tassi di cambio e impostazioni.
  • ๐Ÿ“Ž app.db-wal e app.db-shm sono i file di lavoro di SQLite (modalitร  WAL), previsti mentre il server รจ in esecuzione: non copiare mai app.db da solo mentre il server รจ attivo.
  • ๐Ÿ”’ app.db.post-migration.lock รจ un file vuoto usato all'avvio: lascialo al suo posto. Un file chiamato app.db.pre-<fix>-<UTC time>.bak รจ una copia conservata dopo una correzione post-migrazione non riuscita: eliminalo una volta che non ti serve piรน.

๐Ÿ–ผ๏ธ custom-uploads/

File caricati nell'app, come quelli della pagina File, e gli avatar predefiniti. Ogni file ha un nome casuale e un file .json accanto che lo descrive: mantieni le coppie insieme.

๐Ÿ“Š broker_reports/

I report del broker caricati per l'importazione, in una cartella broker_<id>/ per broker:

  • ๐Ÿ“ฅ uploaded/ โ€” in attesa di essere letti
  • โœ… parsed/ โ€” letti con successo
  • โŒ failed/ โ€” non รจ stato possibile leggerli, conservati per poter controllare il motivo

Un report si sposta da uploaded/ a parsed/ o failed/, quindi il suo file originale รจ sempre in una delle tre cartelle.

๐Ÿ“ logs/

  • ๐Ÿ“„ librefolio.log contiene un record JSON per riga; il server stampa il log anche sulla sua console.
  • ๐Ÿ—“๏ธ Ogni lunedรฌ (UTC) il file viene archiviato e compresso (.gz); vengono conservati gli ultimi 52 archivi, un anno.
  • ๐ŸŽš๏ธ LOG_LEVEL in .env imposta quanto viene scritto (predefinito INFO).
๐Ÿ“ถ Livelli di log โ€” cosa registra ciascuno

Ogni livello registra anche tutti quelli piรน gravi.

Livello Cosa registra
๐Ÿ”ฌ TRACE Dati granulari ad alta frequenza: singoli tassi di cambio analizzati, punti di prezzo per asset
๐Ÿ› DEBUG Dettagli operativi interni: quale provider รจ stato usato, risultati intermedi, decisioni algoritmiche
โ„น๏ธ INFO (predefinito) Operazioni significative dell'utente: sincronizzazione completata, importazione, login, risorsa creata/eliminata
โš ๏ธ WARNING Anomalie recuperabili: fallback attivato, dati opzionali mancanti, modalitร  degradata
โŒ ERROR Errori gestiti: operazioni fallite, corruzione dei dati, provider non raggiungibile
๐Ÿ’€ CRITICAL Errori fatali che arrestano il processo
  • Produzione: LOG_LEVEL=INFO โ€” segnale pulito, senza rumore
  • Risoluzione dei problemi: LOG_LEVEL=DEBUG โ€” vedi cosa sta decidendo il sistema
  • Debug approfondito FX/prezzi: LOG_LEVEL=TRACE โ€” vedi ogni singolo punto dati

๐Ÿ”— Per gli sviluppatori: Directory dati su disco โ€” ogni file, il suo formato e il codice che lo scrive, incluso scenario_catalog/.


๐ŸŒ Variabili d'ambiente

  • LIBREFOLIO_DATA_DIR sposta la directory dati di produzione, e LIBREFOLIO_TEST_DATA_DIR quella di test. Un percorso relativo parte dalla cartella del progetto.
  • Con Docker Compose il percorso all'interno del container รจ fisso: per conservare i dati altrove sull'host, modifica il lato sinistro del volume ./LibreFolio-data:/app/backend/data/prod-docker in docker-compose.yml.

Le altre variabili, e il file .env, sono descritte in Configurazione.


๐Ÿ’พ Backup

๐Ÿ“ฆ Backup semplice

Il modo piรน semplice per eseguire il backup di LibreFolio รจ copiare l'intera directory dati:

# Arresta prima il server (per garantire la coerenza del database)
cp -r backend/data/prod/ /path/to/backup/librefolio-$(date +%Y%m%d)/

๐Ÿณ Backup Docker

Con Docker Compose, la directory dati รจ la cartella LibreFolio-data/ sull'host, quindi non serve alcun comando di copia Docker. Arresta il container per una copia coerente:

docker compose stop librefolio
cp -r ./LibreFolio-data/ /path/to/backup/librefolio-$(date +%Y%m%d)/
docker compose start librefolio
๐Ÿ”„ Esegui il backup del database senza arrestare il server

Il backup online di SQLite crea una copia coerente mentre il server รจ in esecuzione. Richiede lo strumento sqlite3:

sqlite3 backend/data/prod/sqlite/app.db ".backup '/path/to/backup/app.db'"

Con Docker, il database รจ ./LibreFolio-data/sqlite/app.db. Questo comando copia solo il database: copia le cartelle sottostanti come al solito.

โœ… Cosa includere nel backup

Come minimo, esegui il backup di:

  1. sqlite/app.db โ€” Tutti i tuoi dati (utenti, transazioni, impostazioni, tassi di cambio)
  2. custom-uploads/ โ€” File caricati dall'utente (avatar, documenti)
  3. broker_reports/ โ€” I report originali del broker, nel caso in cui tu debba importarli di nuovo
  4. scenario_catalog/ โ€” I tuoi scenari di stress, se ne hai aggiunti

Se lo spazio รจ limitato, sqlite/app.db da solo conserva tutti i dati strutturati: i file e i report possono essere caricati di nuovo se li hai ancora.