📂 Estructura del Sistema de Archivos
LibreFolio almacena todos los datos persistentes en un directorio estructurado bajo backend/data/. Comprender esta estructura es importante para el respaldo, la depuración y el mantenimiento.
🗂️ Diseño del Directorio
backend/data/
├── 📂 prod/ # Datos de producción (predeterminado)
│ ├── 🗃️ sqlite/
│ │ └── 📄 app.db # Base de datos SQLite principal (modo WAL)
│ ├── 🖼️ custom-uploads/ # Archivos subidos por el usuario
│ │ ├── 📄 {uuid}.{ext} # Archivo binario (imagen, documento, etc.)
│ │ └── 📋 {uuid}.json # Archivo de metadatos adjunto (usuario que subió, fecha, tipo MIME)
│ ├── 📊 broker_reports/
│ │ ├── 📥 uploaded/ # Informes esperando ser procesados
│ │ ├── ✅ parsed/ # Informes procesados con éxito
│ │ └── ❌ failed/ # Informes que fallaron al procesarse
│ └── 📝 logs/ # Archivos de registro de la aplicación
│
└── 🧪 test/ # Datos de prueba (completamente aislados)
├── 🗃️ sqlite/app.db
├── 🖼️ custom-uploads/
├── 📊 broker_reports/
└── 📝 logs/
📖 Qué hay en cada Directorio
🗃️ sqlite/app.db
La base de datos SQLite principal. Contiene todos los datos de la aplicación: usuarios, brókers, transacciones, tipos de cambio FX, configuración, etc.
- 📝 Utiliza el modo de registro WAL (Write-Ahead Logging) para un mejor acceso concurrente
- 📎 Los archivos
.db-waly.db-shmson archivos temporales de WAL; son esperados y gestionados por SQLite
Inmersión para desarrolladores: Esquema de la Base de Datos
🖼️ custom-uploads/
Archivos subidos por los usuarios a través de la página de Archivos. Cada subida crea dos archivos:
- 📄
{uuid}.{ext}— El archivo binario real (ej.a1b2c3d4.png) - 📋
{uuid}.json— Metadatos que incluyen: nombre de archivo original, tipo MIME, tamaño del archivo, fecha de subida e ID del usuario que lo subió
Inmersión para desarrolladores: Componente de Subida de Archivos
📊 broker_reports/
Archivos de informes de brókers para el sistema BRIM (Broker Report Import Manager):
- 📥
uploaded/— Archivos en bruto tal como fueron subidos por los usuarios (CSV, Excel) - ✅
parsed/— Archivos que han sido procesados con éxito (transacciones extraídas) - ❌
failed/— Archivos que fallaron al procesarse (se conservan para depuración; consulte los logs para más detalles)
Inmersión para desarrolladores: Arquitectura de BRIM
📝 logs/
Registros de la aplicación en formato JSON estructurado (vía structlog).
🌍 Variables de Entorno
| Variable | Predeterminado | Descripción |
|---|---|---|
LIBREFOLIO_DATA_DIR |
./backend/data/prod |
Sobrescribe la ruta del directorio de datos de producción |
LIBREFOLIO_TEST_MODE |
0 |
Establézcalo en 1 para usar backend/data/test/ en lugar de prod/ |
PORT |
8000 |
Puerto del servidor de producción |
TEST_PORT |
8001 |
Puerto del servidor de prueba (usado cuando LIBREFOLIO_TEST_MODE=1) |
💾 Respaldo
📦 Respaldo Simple
La forma más sencilla de respaldar LibreFolio es copiar todo el directorio de datos:
# Detenga el servidor primero (para asegurar la consistencia de la base de datos)
cp -r backend/data/prod/ /path/to/backup/librefolio-$(date +%Y%m%d)/
🐳 Respaldo de Docker
Si se ejecuta vía Docker, el directorio de datos normalmente está montado como un volumen:
# Buscar el volumen
docker volume inspect librefolio_data
# Copiar los datos hacia afuera
docker cp librefolio-container:/app/backend/data/prod/ ./backup/
✅ Qué respaldar
Como mínimo, respalde:
sqlite/app.db— Todos sus datos (usuarios, transacciones, configuración, tipos de cambio FX)custom-uploads/— Archivos subidos por usuarios (avatares, documentos)broker_reports/uploaded/— Informes originales de brókers (en caso de que necesite procesarlos nuevamente)
Respaldo solo de base de datos
Si el almacenamiento es limitado, respaldar solo sqlite/app.db preserva todos los datos estructurados. Los archivos siempre pueden volver a subirse.
🔧 Mantenimiento desde la Terminal del Host
🐳 Docker exec
# Acceder al shell del contenedor
docker exec -it librefolio-container /bin/bash
# Ejecutar comandos de dev.py dentro del contenedor
./dev.py user list
./dev.py user reset admin newpassword
./dev.py db upgrade
💻 Acceso directo (no Docker)
# Desde la raíz del proyecto
./dev.py user list # Listar todos los usuarios
./dev.py user reset <user> <pw> # Restablecer la contraseña de un usuario
./dev.py user promote <user> # Otorgar privilegios de superusuario
./dev.py user demote <user> # Eliminar privilegios de superusuario
./dev.py db upgrade # Aplicar migraciones pendientes
./dev.py db create-clean # Restablecer base de datos (ADVERTENCIA: elimina todos los datos)
Para una lista completa de comandos CLI, consulte Herramientas CLI.