Skip to main content

#Infraestructura Reverse Proxy + Docker

Modelo Nexus42 (Producción)


1. Filosofía de arquitectura

  • Nginx = Portero principal del servidor
  • Traefik = Reverse proxy interno para contenedores
  • Docker = Ejecuta servicios aislados
  • Una sola red Docker fija
  • Ningún servicio expone puertos al exterior
  • Un único punto de entrada

2. Flujo de tráfico

Cliente Internet

Nginx (bare metal)

Traefik (docker)

Servicio docker (n8n, bookstack, odoo...)


3. Nginx (host)

Rol

  • Escucha en 80/443
  • Si existe vhost específico → lo gestiona
  • Si NO existe vhost → proxy a Traefik

Default vhost (conceptual)

server {
    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Traefik escucha en:

127.0.0.1:8081


4. Docker Network (Base del sistema)

Red única fija

Nombre:

traefik-net

Subnet:

172.19.0.0/16

Creación (si fuera necesario en DR)

docker network create   --driver bridge   --subnet 172.19.0.0/16   traefik-net

Todos los contenedores accesibles públicamente se conectan a esta red.


5. Postgres (host) y pg_hba.conf

Permitir acceso solo a la red docker:

host    all    all    172.19.0.0/16    scram-sha-256

Después:

systemctl reload postgresql

6. Traefik (Docker)

Ubicación

/opt/traefik

Red

traefik-net (external)

Puertos publicados

127.0.0.1:8081 -> 8080 (dashboard)

No publica 80 ni 443 directamente.

Providers

  • Docker
  • File (para dashboard auth)

Función

  • Detecta contenedores vía labels
  • Rutea por Host()

7. Patrón obligatorio para cada servicio Docker

Estructura

/opt/servicio/
 docker-compose.yml
 .env

Reglas obligatorias

  • name: fijo
  • container_name: fijo
  • networks: traefik-net
  • SIN sección ports:
  • labels traefik correctamente definidas
  • volumen nombrado explícitamente

8. Plantilla Base de Servicio

name: servicio

services:
  servicio:
    image: imagen:latest
    container_name: servicio
    restart: unless-stopped

    env_file:
      - .env

    volumes:
      - servicio_data:/ruta

    networks:
      - traefik-net

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.servicio.rule=Host(`dominio.tld`)"
      - "traefik.http.routers.servicio.entrypoints=web"
      - "traefik.http.services.servicio.loadbalancer.server.port=PUERTO_INTERNO"

volumes:
  servicio_data:
    name: servicio_data

networks:
  traefik-net:
    external: true

9. Regla crítica

Ningún servicio:

  • publica puerto al host
  • crea red automática default
  • usa IPs dinámicas fuera de traefik-net

10. Procedimiento Disaster Recovery

Orden de restauración:

  1. Instalar Docker
  2. Crear red traefik-net
  3. Restaurar Nginx
  4. Restaurar Traefik
  5. Restaurar Postgres + hba
  6. Restaurar contenedores por carpetas /opt/...
  7. Verificar DNS

11. Comprobaciones rápidas

Ver red:

docker network inspect traefik-net

Ver contenedor en red:

docker inspect servicio | grep Networks -A 5

Ver routers en Traefik:

docker logs traefik

12. Estado actual del Nexus

Servicios dockerizados detrás de Traefik:

  • n8n
  • bookstack
  • odoo

Acceso unificado vía Nginx → Traefik.


Resumen conceptual

  • Nginx = puerta
  • Traefik = recepcionista
  • Docker = oficinas internas
  • Red fija = pasillo común
  • Postgres = bóveda

Sin doble proxy.
Sin puertos abiertos.
Sin redes aleatorias.