EQVPS

Cómo desplegar un stack de Docker Compose en un VPS

Despliega un stack multicontenedor en un VPS con Docker Compose: escribe docker-compose.yml, guarda los secretos en .env, levántalo con reinicio-tras-reboot y publica solo los puertos que realmente quieres. Ejemplo copia-pega con una app web, base de datos y reverse proxy.

Docker Compose describe un stack multicontenedor en un solo archivo y lo corre con un comando. Esta es la guía de despliegue; primero instala Docker si no lo has hecho. Para un stack específico de agentes de IA (agente + base vectorial + Redis), consulta docker-compose para agentes de IA.

1. Un stack: app + base de datos + reverse proxy

# /opt/stack/docker-compose.yml
services:
  app:
    image: your/app:latest
    restart: unless-stopped
    env_file: [.env]
    depends_on: [db]
    # no ports: — reached only through the proxy below

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
    volumes: ["pg:/var/lib/postgresql/data"]   # internal only

  caddy:                                        # HTTPS automatically
    image: caddy:2
    restart: unless-stopped
    ports: ["80:80", "443:443"]                 # the only public entrypoint
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data

volumes: { pg: {}, caddy_data: {} }

Los secretos viven en .env, nunca en el archivo compose:

# /opt/stack/.env  (chmod 600, git-ignored)
DB_PASSWORD=a-long-random-string

Un Caddyfile mínimo hace de proxy de tu dominio a la app y obtiene HTTPS por su cuenta:

app.yourdomain.com {
  reverse_proxy app:8080
}

2. Levántalo

cd /opt/stack
docker compose up -d
docker compose ps
docker compose logs -f app

restart: unless-stopped en cada servicio + Docker habilitado al arranque = el stack vuelve por sí solo tras un reboot.

3. Comandos del día a día

docker compose pull && docker compose up -d   # update images
docker compose down                            # stop the stack
docker compose restart app                     # restart one service

La parte que la gente hace mal: puertos expuestos

Docker publica los puertos a través de iptables, así que un contenedor con ports: ["5432:5432"] es accesible desde internet incluso tras un firewall UFW que creías cerrado. Publica solo el punto de entrada público (el proxy en 80/443); mantén las bases de datos y cachés en la red compose o vinculadas a 127.0.0.1. Todo lo que sirva tráfico web necesita un plan de IP dedicada; combínalo con un firewall UFW.

Para todo un stack tras una IP, consulta autohospedar varios servicios. Root en un minuto aproximadamente, NVMe, sin KYC, pago en cripto.

Preguntas frecuentes

¿Cómo despliego un stack de Docker Compose en un VPS?

Instala Docker con el plugin Compose, escribe un docker-compose.yml que describa cada servicio, guarda los secretos en un .env ignorado por git, luego docker compose up -d. Pon restart: unless-stopped en cada servicio y habilita Docker al arranque para que el stack sobreviva a los reboots. El ejemplo de abajo corre una app web, Postgres y un reverse proxy Caddy.

¿Dónde van los secretos — en el archivo compose?

No. Ponlos en un archivo .env (chmod 600, ignorado por git) y refiérete a ellos como ${VAR} en compose, o usa Docker secrets. Nunca subas contraseñas o claves API a docker-compose.yml — un archivo filtrado con credenciales activas es el error clásico.

¿Volverá el stack tras un reboot?

Solo si se lo dices. Pon restart: unless-stopped (o always) en cada servicio y habilita Docker al arranque (systemctl enable docker). Entonces docker compose up -d sobrevive a los reboots y reinicia contenedores caídos.

¿Qué puertos se exponen?

Solo lo que publiques con ports:. Vincula los servicios internos (bases de datos, cachés) a la red compose o a 127.0.0.1 y publica solo el punto de entrada público — normalmente un reverse proxy en 80/443. Docker publica a través de iptables, así que una línea ports: accidental es accesible desde internet incluso tras UFW.

¿Piden documento de identidad o tarjeta?

No. Un correo para registrarte, pago en USDC o USDT — sin documentos, sin tarjeta. Root en un minuto aproximadamente.

Comentarios

Aún no hay comentarios. Sé el primero.

Deja un comentario

Los comentarios se moderan antes de aparecer.