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:

  1. 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.
  2. 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.
  3. 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:

  1. 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.
  2. 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).
  3. 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.
  4. Activar notificaciones – Conectar Discord, Slack o Telegram permite detectar fallos de backup en tiempo real, reduciendo la ventana de exposición.
  5. 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 cp o pg_dump manualmente.
  • 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

  1. Revisar logsdocker logs -f portabase debe mostrar Backup job succeeded tras la primera ejecución programada.
  2. Comprobar el backend – Listar objetos en el bucket S3 y verificar que el nombre incluya el timestamp y el ID del proyecto.
  3. 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-only o mongodump --dryRun.
  4. 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 -d reaplica 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 docker por podman en los comandos y monta podman.sock en lugar de docker.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.log y 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.