Operación y despliegue
Deploy automático
- Merge a
main. - GitHub Actions ejecuta:
make lintmake testalembic upgrade --sqlcheck para migraciones pendientes.
- SSH al VPS (
VPS_HOST,VPS_USER,VPS_KEY). git pull,make migrate,make seed_min.sudo systemctl restart illanes00-ep(hasta migrar al unit templadoillanes00-ep@production).- Smoke tests (
/healthz,/api/0.6.9/health,/api/0.6.9/hello).
Comandos locales
make dev: corre Uvicorn con autoreload.make seed_min: carga dimensiones básicas.make smoke: prueba endpoints (/healthz,/api/<ver>/health,/api/<ver>/hello).Pipeline ENUSC
ENUSC_YEARS=2022,2023 ENUSC_LOAD_DB=0 PYTHONPATH=. python -c "from etl.pipelines.enusc.pipeline import ingest_enusc; ingest_enusc()"- Variables clave:
ENUSC_LOAD_DB:1para escribir en Postgres (requiere credenciales configuradas);0deja solo parquet/CSV.ENUSC_DB_APPEND_ONLY: fuerza modo append en tablas bronze/silver/gold.ENUSC_ONLY_MODULES,ENUSC_SKIP_MODULES: controlan la exportación bronze vs. modulares.
- Artefactos se depositan en
data/bronze/enusc/,data/silver/enusc/,data/gold/enusc/y reportesdata/silver/enusc/reportes/(manifest de módulos, resumen personas/hogares). - CLI auxiliar:
python -m etl.pipelines.enusc.cli ingest --years 2022 2023(interpreta flags y exporta usando las clases nuevas).python -m etl.pipelines.enusc.cli preview-columns --limit 1entrega conteo de columnas por módulo sin ejecutar el pipeline completo.python -m etl.pipelines.enusc.cli compare-manifests data/silver/enusc/reportes/modulos_manifest.json backups/enusc/modulos_manifest.jsonavisa de módulos/archivos añadidos o faltantes entre corridas.
- Variables clave:
Backups
Ejecutar
scripts/backup_environment.pypara cada entorno:.venv/bin/python scripts/backup_environment.py --env production .venv/bin/python scripts/backup_environment.py --env development .venv/bin/python scripts/backup_environment.py --env testLos artefactos se guardan en
backups/<entorno>/<timestamp>/(ej. producción:backups/production/20251020-180032/).Cada carpeta contiene
database.dump(formatopg_dump -F c),metadata.tar.gzconconfig/,data/meta/,data/schema/,docs/y una copia del.env.Programar un
cronosystemd timerpendiente para automatizar la ejecución diaria y sincronizar los dumps a almacenamiento externo.Para
testprimero crear el rol y la base desdepostgres:sudo -u postgres createuser -P ep_app_test sudo -u postgres createdb epdatos_test -O ep_app_testServicios por entorno
Desarrollo (
APP_PORT=8211):systemctl --user restart illanes00-ep@developmentTest (
APP_PORT=8210):systemctl --user restart illanes00-ep@testHabilitar arranque automático:
systemctl --user enable illanes00-ep@development,systemctl --user enable illanes00-ep@testAsegura
loginctl enable-linger illanes00para que las unidades de usuario persistan tras logout.Producción seguirá en
sudo systemctl restart illanes00-ephasta migrar aillanes00-ep@production.
Logs
- Producción (legacy):
sudo journalctl -u illanes00-ep -n 200 --no-pager - Nuevas unidades de usuario:
journalctl --user -u illanes00-ep@development -n 200,journalctl --user -u illanes00-ep@test -n 200
Observabilidad
- Sentry se inicializa automáticamente cuando
SENTRY_DSNestá definido en.env. - El backend reporta errores y tiempos vía
SentryAsgiMiddleware; el entorno se etiqueta conENVIRONMENTy la versión conVERSION+ commit. - Ajusta
SENTRY_TRACES_SAMPLE_RATE/SENTRY_PROFILES_SAMPLE_RATEpara habilitar trazas y perfiles (0.0 por defecto). - Recomiendo crear reglas de alerta (correo/Slack) directamente en Sentry para caídas frecuentes o spikes de 5xx.
Roles y permisos
- Usuario
illanes00posee sudo con NOPASSWD parasystemctl status|restart illanes00-ep. - Base de datos
epdatospertenece al rolillanes00-ep.