Guía

Un stack de producción con Docker Compose en un VPS

Intermedio25 min de lecturaActualizado 27 de junio de 2026
Respuesta corta

Un stack de producción viable es Caddy para TLS automático, tu aplicación, PostgreSQL y Redis, definido en un archivo Compose con volúmenes nombrados y health checks. Con 8 GB de RAM y NVMe, esto maneja tráfico sustancial, y una instantánea antes de cada despliegue hace que la reversión sea una operación de dos minutos.

01 Instala Docker desde el repositorio oficial

Distribution packages lag significantly. The convenience script is fine on a fresh instance.

curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

02 Escribe el archivo Compose

Caddy obtains and renews certificates automatically, which removes the single most common source of production breakage.

services:
  caddy:
    image: caddy:2-alpine
    restart: unless-stopped
    ports: ["80:80", "443:443", "443:443/udp"]
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
  app:
    build: .
    restart: unless-stopped
    depends_on: { db: { condition: service_healthy } }
    environment:
      DATABASE_URL: postgres://app:${DB_PASS}@db:5432/app
  db:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASS}
    volumes: [pgdata:/var/lib/postgresql/data]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
volumes: { caddy_data: {}, pgdata: {} }

03 Configura Caddy

Three lines is a complete TLS-terminating reverse proxy with automatic certificate renewal.

app.example.com {
  encode zstd gzip
  reverse_proxy app:8000
}

04 Haz copia de seguridad de la base de datos, no del contenedor

A file copy of a running Postgres data directory produces a corrupt backup that appears to succeed. Dump it properly.

docker compose exec -T db pg_dump -U app app | zstd > /backups/app-$(date +%F).sql.zst

05 Instantánea antes de cada despliegue

Free, instant, and it converts a failed deployment from an incident into a rollback.

Preguntas frecuentes

¿Cuánta RAM necesita esto?

Suma los límites de memoria de los contenedores y añade unos 1 GB para el host. Este stack es cómodo en 8 GB.

¿Debería usar Docker Swarm o Kubernetes en su lugar?

No para un solo servidor. Compose es la herramienta correcta hasta que realmente tengas más de un nodo.