📂 Structure du système de fichiers
LibreFolio conserve tout ce qu'il stocke dans un répertoire de données : la base de données, les fichiers téléversés, les rapports de courtier et les journaux. Il suffit de connaître son organisation pour les sauvegardes et la maintenance.
| Installation | Répertoire de données |
|---|---|
| Hôte (Pipenv) | backend/data/prod/ dans le dossier du projet, ou le chemin dans LIBREFOLIO_DATA_DIR |
| Docker Compose | LibreFolio-data/ à côté de docker-compose.yml (/app/backend/data/prod-docker à l'intérieur du conteneur) |
🗂️ Organisation des répertoires
backend/data/
├── 📂 prod/ # Données de production (par défaut)
│ ├── 🗃️ sqlite/
│ │ └── 📄 app.db # Base de données SQLite principale (mode WAL)
│ ├── 🖼️ custom-uploads/ # Fichiers téléversés dans l'application
│ ├── 📊 broker_reports/
│ │ ├── 📥 uploaded/ # Rapports en attente de lecture
│ │ ├── ✅ parsed/ # Rapports lus avec succès
│ │ └── ❌ failed/ # Rapports qui n'ont pas pu être lus
│ ├── 📝 logs/ # Fichiers journaux de l'application
│ ├── 🎭 scenario_catalog/ # Optionnel : vos propres scénarios de stress
│ └── 📋 scheduler_state.json # Dernière exécution des synchronisations planifiées
│
└── 🧪 test/ # Données de test (complètement isolées)
├── 🗃️ sqlite/app.db
├── 🖼️ custom-uploads/
├── 📊 broker_reports/
└── 📝 logs/
📖 Contenu de chaque répertoire
🗃️ sqlite/
- 📄
app.dbcontient toutes les données structurées : utilisateurs, courtiers, transactions, actifs, prix, taux de change et paramètres. - 📎
app.db-waletapp.db-shmsont les fichiers de travail de SQLite (mode WAL), attendus pendant que le serveur fonctionne : ne copiez jamaisapp.dbseul pendant que le serveur est démarré. - 🔒
app.db.post-migration.lockest un fichier vide utilisé au démarrage : laissez-le en place. Un fichier nomméapp.db.pre-<fix>-<UTC time>.bakest une copie conservée après un échec de correctif post-migration : supprimez-le dès que vous n'en avez plus besoin.
🖼️ custom-uploads/
Fichiers téléversés dans l'application, comme ceux de la page Fichiers, ainsi que les avatars par défaut. Chaque fichier a un nom aléatoire et un fichier .json à côté qui le décrit : conservez les paires ensemble.
📊 broker_reports/
Les rapports de courtier téléversés pour importation, dans un dossier broker_<id>/ par courtier :
- 📥
uploaded/— en attente de lecture - ✅
parsed/— lus avec succès - ❌
failed/— n'ont pas pu être lus, conservés pour que vous puissiez vérifier pourquoi
Un rapport passe de uploaded/ à parsed/ ou failed/, donc son fichier d'origine se trouve toujours dans l'un des trois dossiers.
📝 logs/
- 📄
librefolio.logcontient un enregistrement JSON par ligne ; le serveur affiche aussi le journal dans sa console. - 🗓️ Chaque lundi (UTC), le fichier est archivé et compressé (
.gz) ; les 52 dernières archives, soit un an, sont conservées. - 🎚️
LOG_LEVELdans.envdéfinit la quantité écrite (par défautINFO).
📶 Niveaux de journalisation — ce que chacun enregistre
Chaque niveau enregistre aussi tous les niveaux plus graves.
| Niveau | Ce qu'il enregistre |
|---|---|
🔬 TRACE |
Données granulaires à haute fréquence : taux de change individuels analysés, points de prix par actif |
🐛 DEBUG |
Détails internes opérationnels : quel fournisseur a été utilisé, résultats intermédiaires, décisions algorithmiques |
ℹ️ INFO (par défaut) |
Opérations utilisateur significatives : synchronisation terminée, importation, connexion, ressource créée/supprimée |
⚠️ WARNING |
Anomalies récupérables : fallback activé, données optionnelles manquantes, mode dégradé |
❌ ERROR |
Erreurs gérées : opérations échouées, corruption de données, fournisseur inaccessible |
💀 CRITICAL |
Erreurs fatales qui arrêtent le processus |
- Production :
LOG_LEVEL=INFO— signal propre, sans bruit - Dépannage :
LOG_LEVEL=DEBUG— voir ce que le système décide - Débogage approfondi FX/prix :
LOG_LEVEL=TRACE— voir chaque point de données individuel
🔗 Pour les développeurs : Répertoire de données sur disque — chaque fichier, son format et le code qui l'écrit, scenario_catalog/ inclus.
🌍 Variables d'environnement
LIBREFOLIO_DATA_DIRdéplace le répertoire de données de production, etLIBREFOLIO_TEST_DATA_DIRcelui de test. Un chemin relatif part du dossier du projet.- Avec Docker Compose, le chemin à l'intérieur du conteneur est fixe : pour conserver les données ailleurs sur l'hôte, modifiez le côté gauche du volume
./LibreFolio-data:/app/backend/data/prod-dockerdansdocker-compose.yml.
Les autres variables, ainsi que le fichier .env, sont décrites dans Configuration.
💾 Sauvegarde
📦 Sauvegarde simple
La façon la plus simple de sauvegarder LibreFolio est de copier l'intégralité du répertoire de données :
# Arrêtez d'abord le serveur (pour garantir la cohérence de la base de données)
cp -r backend/data/prod/ /path/to/backup/librefolio-$(date +%Y%m%d)/
🐳 Sauvegarde Docker
Avec Docker Compose, le répertoire de données est le dossier LibreFolio-data/ sur l'hôte, donc aucune commande de copie Docker n'est nécessaire. Arrêtez le conteneur pour une copie cohérente :
docker compose stop librefolio
cp -r ./LibreFolio-data/ /path/to/backup/librefolio-$(date +%Y%m%d)/
docker compose start librefolio
🔄 Sauvegarder la base de données sans arrêter le serveur
La sauvegarde en ligne de SQLite réalise une copie cohérente pendant que le serveur fonctionne. Elle nécessite l'outil sqlite3 :
Avec Docker, la base de données est ./LibreFolio-data/sqlite/app.db. Cela ne copie que la base de données : copiez les dossiers ci-dessous comme d'habitude.
✅ Éléments à sauvegarder
Au minimum, sauvegardez :
sqlite/app.db— Toutes vos données (utilisateurs, transactions, paramètres, taux de change)custom-uploads/— Fichiers téléversés par l'utilisateur (avatars, documents)broker_reports/— Les rapports de courtier originaux, au cas où vous auriez besoin de les importer à nouveauscenario_catalog/— Vos propres scénarios de stress, si vous en avez ajouté
Si l'espace de stockage est limité, sqlite/app.db seul conserve toutes les données structurées : les fichiers et les rapports peuvent être téléversés à nouveau si vous les avez encore.