You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
	
		
			6.5 KiB
		
	
	
	
			
		
		
	
	
			6.5 KiB
		
	
	
	
Plan mínimo de CI/CD, healthcheck y backups (pendiente de decisiones)
Este documento describe un plan pragmático y de bajo mantenimiento para asegurar despliegues seguros y copias de seguridad consistentes, sin introducir infra innecesaria. No aplicar todavía: sirve como guía de implementación para la siguiente iteración.
Contexto actual (resumen)
- Despliegue: push a main en Forgejo → webhook a CapRover → build/deploy con Dockerfile.
- Imagen: basada en oven/bun con utilidades de depuración (curl, netcat, sqlite3). Útil para inspección.
- Healthcheck en Dockerfile “permisivo”: permite éxito aunque /health falle (usa || exit 0).
- Script de arranque con sleep 10(resto histórico).
- No hay guardarraíl que bloquee despliegue si fallan tests.
Objetivos
- Evitar desplegar una versión rota a producción (guardarraíl mínimo).
- Mejorar detección temprana de fallos (healthcheck real).
- Asegurar backups diarios consistentes sin parar el servicio y con verificación de integridad.
- Mantener la simplicidad operativa.
Decisiones pendientes (elegir antes de implementar)
- Disparo de despliegue (elige 1):
- A) Desplegar solo con tags (vX.Y.Z). Flujo: tests locales → tag → push → CapRover deploy.
- B) Hook server-side en Forgejo (pre-receive/update) que corre bun testy rechaza el push si falla.
- C) “Webhook gate” mínimo: un endpoint propio que ejecuta tests y reenvía a CapRover solo si pasan.
 
- Herramientas en imagen:
- Mantener sqlite3 por ahora (útil en prod).
- Retirar curl y netcat tras piloto (no crítico).
 
- Monitor externo muy ligero:
- Usar Uptime-Kuma (o similar) para /health cada 1 min.
- No usar monitor externo (conformarse con CapRover).
 
- Almacenamiento de backups:
- Mismo disco (operacional; conservar varias generaciones).
- Segundo disco/NAS/otro servidor (preferible si posible).
 
- “Smoke” post-deploy:
- Enviar DM a BOT_OWNER (si configurado) de “deploy OK”.
- Solo registrar métrica (app_started_atymigrations_ok).
 
Cambios planificados (sin aplicar todavía)
1) Arranque y healthcheck
- startup.sh: eliminar sleep 10y arrancar directamentebun run index.ts.
- Dockerfile: endurecer HEALTHCHECK para que falle si /health no responde 200 (eliminar || exit 0). Mantener endpoint básico (sinfull=1).
- EXPOSE: mantener lectura de PORT por env; sin cambios funcionales.
2) Guardarraíl de despliegue (elige 1 opción)
- Opción A — Deploy por tags:
- Convención de versiones semánticas (vX.Y.Z).
- Procedimiento: correr bun testlocal → crear tag → push tag → CapRover deploy.
- Pros: cero infra extra; fácil de revertir en hábitos.
 
- Opción B — Hook server-side en Forgejo:
- Añadir hook pre-receive(oupdate) que:- Chequea que el push es a refs/heads/main.
- Ejecuta bun testen un checkout temporal del commit/refs recibido.
- Si falla, exit ≠ 0 y Forgejo rechaza el push.
 
- Chequea que el push es a 
- Pros: no requiere runners ni servicios; bloquea pushes rotos.
 
- Añadir hook 
- Opción C — Webhook gate mínimo:
- Service pequeño (script) que recibe el webhook de Forgejo, ejecuta bun testy solo si pasa reenvía el webhook a CapRover.
- Pros: aísla validación del despliegue; Contras: un servicio más que mantener.
 
- Service pequeño (script) que recibe el webhook de Forgejo, ejecuta 
3) Imagen Docker
- Mantener sqlite3 para inspección en producción.
- Plan (post‑piloto): retirar curl/netcat si no se usan.
- Añadir .dockerignorepara reducir contexto (node_modules, tests si no son necesarios en build, etc.) — opcional a corto plazo.
4) Backups de SQLite (prioridad alta)
- Método recomendado: backup “online” con sqlite3 (sin detener el servicio).
- Procedimiento diario (cron en host o contenedor programador):
- Ruta base: /app/data/tasks.db.
- Crear directorio de backups: /app/data/backups/.
- Generar nombre con timestamp: tasks-YYYYMMDD-HHmm.sqlite3.
- Ejecutar backup online:
- sqlite3 /app/data/tasks.db ".backup '/app/data/backups/tasks-YYYYMMDD-HHmm.sqlite3'".
- Alternativa: VACUUM INTOa un archivo temporal y luego renombrar.
 
- Verificar integridad en la copia:
- sqlite3 /app/data/backups/tasks-... "PRAGMA integrity_check;"debe devolver- ok.
- Registrar resultado en un log de backups (/app/data/backups/backup.log).
 
- Comprimir (opcional): gzip -9.
- Retención: mantener p. ej. 7 diarias + 4 semanales; purgar el resto.
 
- Ruta base: 
- Notas:
- Con WAL activado, .backupmaneja consistencia; evita copiar a pelo sin incluir-wal/-shm.
- Si se dispone de otro disco/servidor, replicar las copias (scp/rsync) al menos semanalmente.
 
- Con WAL activado, 
- Ensayo mensual de restauración:
- En un contenedor aislado: montar una copia del backup como tasks.dby arrancar la app; comprobar/healthy que migraciones aplican.
 
- En un contenedor aislado: montar una copia del backup como 
5) Detección temprana de fallos
- Healthcheck real (Dockerfile): CapRover marcará “unhealthy” si /health no está OK.
- Smoke post‑deploy:
- Si se elige DM: encolar un mensaje “deploy OK” a BOT_OWNER tras el arranque (idempotente).
- Alternativa sin DM: exponer métricas app_started_at(epoch ms) ymigrations_ok(0/1).
 
6) Runbook operativo (resumen)
- Desplegar:
- Opción A (tags): bun testlocal →git tag vX.Y.Z→git push --tags.
- Opción B/C: git pusha main (tests bloquean si fallan).
 
- Opción A (tags): 
- Verificación:
- CapRover: health verde.
- /healthOK;- /metricsvisible.
- Logs sin errores de migraciones/cola.
 
- Rollback:
- CapRover: revertir a la versión previa (history).
 
- Backup manual (ad hoc):
- Ejecutar el mismo comando .backupy verificar integridad.
 
- Ejecutar el mismo comando 
- Restore:
- Parar app (si procede), sustituir data/tasks.dbpor la copia, arrancar, verificar/health.
 
- Parar app (si procede), sustituir 
Checklist de implementación
- Decidir estrategia de trigger de despliegue (A/B/C).
- Endurecer HEALTHCHECK en Dockerfile (sin || exit 0).
- Eliminar sleepen startup.sh.
- (Opcional) Añadir .dockerignore.
- Implementar guardarraíl elegido:
- A) Convención de tags y documentación de flujo.
- B) Hook en Forgejo con bun test.
- C) Webhook gate que ejecuta tests y reenvía a CapRover.
 
- Programar backup diario con verificación de integridad y retención.
- Documentar y ensayar restore.
- (Opcional) Monitor externo para /health.
- (Opcional) Smoke post‑deploy (DM o métricas).
Impacto esperado
- Riesgo de “romper prod” se reduce significativamente con coste operativo mínimo.
- Backups confiables y verificables sin actividad manual diaria.
- Cambios reversibles y sin bloqueo del desarrollo.