Problema
En entornos self‑hosted es frecuente que varios servicios – bases de datos relacionales, NoSQL y contenedores que manejan volúmenes persistentes – dependan de la misma infraestructura física. Cuando una instancia falla, la pérdida de datos puede afectar a toda la aplicación. La necesidad de una solución única que permita programar copias de seguridad, aplicar políticas de retención (por ejemplo, GFS) y restaurar datos de forma granular es recurrente. Además, los equipos suelen preferir herramientas open‑source que se integren con Docker, Podman o Kubernetes sin requerir licencias adicionales.
Causa
Los fallos de backup suelen rastrearse a tres grupos de causas:
- Configuración aislada – Cada motor de base de datos o volumen se gestiona con scripts propios. La falta de un punto central provoca olvidos de horarios, versiones incompatibles y políticas de retención inconsistentes.
- Credenciales y permisos – Los contenedores que ejecutan los jobs de backup a menudo carecen de acceso a los secretos necesarios (usuario, contraseña, tokens S3). El resultado son errores silenciosos que sólo aparecen cuando se necesita restaurar.
- Almacenamiento fragmentado – Guardar copias en diferentes destinos (FS local, S3, Azure Blob) sin una capa de abstracción genera duplicación de lógica y dificulta la auditoría de los archivos generados.
Solución
Portabase ofrece un punto único de orquestación para backups de bases de datos y volúmenes Docker. La estrategia general consiste en:
- Desplegar Portabase como contenedor – Utilizar Docker Compose o Helm para garantizar reproducibilidad. La imagen oficial incluye todas las dependencias y permite habilitar OAuth2/OIDC si se requiere aislamiento de usuarios.
- Definir “projects” – Cada proyecto agrupa los recursos que deben respaldarse (p.ej., una base PostgreSQL y el volumen
/var/lib/app). Dentro del proyecto se crean “jobs” con la frecuencia deseada (cron‑like) y la política de retención (número de copias, GFS, expiración automática). - Seleccionar backend de almacenamiento – Portabase soporta FS local, S3‑compatible, Azure Blob y GCS. Configurar un único backend evita la dispersión de archivos y simplifica la restauración.
- Activar notificaciones – Conectar Discord, Slack o Telegram permite detectar fallos de backup en tiempo real, reduciendo la ventana de exposición.
- Probar restauraciones – Programar pruebas periódicas de restore en entornos de staging. La restauración se ejecuta mediante la UI o la API, especificando el punto de recuperación deseado.
Alternativas prácticas
- Uso de variables de entorno para credenciales:
POSTBASE_DB_URL,POSTBASE_S3_KEY,POSTBASE_S3_SECRET. Evita hardcodear datos en archivos YAML. - Montaje de sockets de Docker (
/var/run/docker.sock) dentro del contenedor Portabase para que pueda crear snapshots de volúmenes sin depender de Docker‑CLI externo. - Plantillas de Helm para despliegues en Kubernetes: permiten parametrizar el número de réplicas y el backend de almacenamiento mediante
values.yaml.
Cuándo aplicar esta solución
Aplica cuando:
- Tienes al menos dos bases de datos distintas (relacionales o NoSQL) y/o volúmenes Docker que requieren copias de seguridad regulares.
- Necesitas políticas de retención avanzadas (GFS, expiración automática) sin escribir scripts personalizados.
- Quieres centralizar notificaciones y auditoría de backups en una única UI.
- El entorno está basado en Docker/Podman o en Kubernetes y prefieres una solución que funcione en ambos.
No es adecuada si:
- Solo necesitas una copia puntual de un único contenedor y prefieres usar
docker cpopg_dumpmanualmente. - La infraestructura está totalmente gestionada por un proveedor de cloud que ya ofrece snapshots automáticos y no deseas mantener otro servicio.
Código
# docker-compose.yml básico para Portabase
version: "3.8"
services:
portabase:
image: ghcr.io/portabase/portabase:1.27
container_name: portabase
restart: unless-stopped
ports:
- "8080:8080"
environment:
- PORTABASE_ADMIN_EMAIL=[email protected]
- PORTABASE_ADMIN_PASSWORD=SuperSecret123
- PORTABASE_S3_ENDPOINT=https://s3.amazonaws.com
- PORTABASE_S3_ACCESS_KEY=${S3_KEY}
- PORTABASE_S3_SECRET_KEY=${S3_SECRET}
volumes:
- portabase_data:/app/data
- /var/run/docker.sock:/var/run/docker.sock # acceso a Docker daemon
volumes:
portabase_data:
Para agregar un proyecto que respalde una base PostgreSQL y un volumen:
# Crear proyecto vía API (requiere token de admin)
curl -X POST http://localhost:8080/api/projects \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "myapp",
"description": "Backups de PostgreSQL y volúmenes",
"resources": [
{
"type": "postgres",
"host": "postgres.local",
"port": 5432,
"database": "mydb",
"username": "backup_user",
"password": "pwd123"
},
{
"type": "docker_volume",
"name": "myapp_data"
}
],
"schedule": "0 2 * * *", # todos los días a 02:00
"retention": {
"type": "gfs",
"daily": 7,
"weekly": 4,
"monthly": 12
}
}'
Verificación
- Revisar logs –
docker logs -f portabasedebe mostrarBackup job succeededtras la primera ejecución programada. - Comprobar el backend – Listar objetos en el bucket S3 y verificar que el nombre incluya el timestamp y el ID del proyecto.
- Ejecutar restore de prueba – Desde la UI, seleccionar la última copia y restaurar en una base de datos de staging. Verificar integridad con
pg_dump --schema-onlyomongodump --dryRun. - Validar notificaciones – Confirmar que el canal de Slack recibe un mensaje con el estado del backup.
Notas adicionales
- Rotación de credenciales: Cambia las claves de acceso S3 cada 90 días y actualiza las variables de entorno sin recrear el contenedor (
docker compose up -dreaplica los cambios). - Límites de tamaño: Algunas plataformas S3 imponen un máximo de 5 GB por objeto. Configura la compresión (
gzip) y el chunking en Portabase para evitar fallos. - Compatibilidad con Podman: Si usas Podman, reemplaza
dockerporpodmanen los comandos y montapodman.socken lugar dedocker.sock. La API de Portabase no necesita cambios. - Auditoría: Habilita el registro de auditoría en la configuración (
PORTABASE_AUDIT_LOG=true). Los logs se guardan en/app/data/audit.logy pueden ser enviados a un SIEM mediante syslog. - Escalado: En entornos con alta carga de backup, considera ejecutar Portabase en modo HA con una base de datos externa (PostgreSQL) y un storage compartido (NFS o S3). La UI permite añadir réplicas mediante la variable
PORTABASE_REPLICAS.