Ir al contenido

Cómo montar tu propia infraestructura web en casa con Docker y Traefik: desde cero hasta HTTPS automático

Introducción
#

Hace unos meses decidí dejar de usar servicios cloud caros y montar mi propia infraestructura en casa. La solución que encontré fue combinar Docker con Traefik. Funciona bien y ahora tengo varios servicios corriendo bajo HTTPS sin tocar manualmente un certificado. Te cuento cómo lo hice.

Qué necesitas
#

Un servidor con Docker instalado (cualquier máquina Linux con 2GB de RAM sobra). Un dominio propio. Un poco de paciencia con DNS. Eso es todo.

El plan
#

Voy a usar Traefik como reverse proxy. Maneja automáticamente los certificados Let’s Encrypt, enruta el tráfico a los contenedores correctos y sirve HTTPS sin que tengas que hacer nada una vez configurado. Es limpio y funciona.

Paso 1: Preparar Docker Compose
#

Crea una carpeta para tu stack:

mkdir -p ~/docker/traefik
cd ~/docker/traefik

Este será tu archivo docker-compose.yml:

version: '3.8'

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.yml:/traefik.yml
      - ./acme.json:/acme.json
    networks:
      - web

networks:
  web:
    driver: bridge

Crea el archivo traefik.yml:

api:
  insecure: true
  dashboard: true

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
  websecure:
    address: ":443"

certificatesResolvers:
  letsencrypt:
    acme:
      email: tu-email@example.com
      storage: acme.json
      httpChallenge:
        entryPoint: web

providers:
  docker:
    endpoint: unix:///var/run/docker.sock
    exposedByDefault: false
  file:
    filename: traefik.yml

Crea el archivo acme.json con permisos restrictivos:

touch acme.json
chmod 600 acme.json

Paso 2: Levanta Traefik
#

docker-compose up -d

Verifica que está corriendo:

docker-compose logs traefik

Paso 3: Configura tu dominio
#

En tu proveedor DNS, apunta tu dominio (y un wildcard) a la IP pública de tu servidor:

example.com     A  TU_IP_PUBLICA
*.example.com   A  TU_IP_PUBLICA

Espera a que se propague (15 minutos típicamente).

Paso 4: Añade tu primer servicio
#

Voy a añadir un ejemplo simple. Modifica el docker-compose.yml:

services:
  traefik:
    # ... config anterior

  whoami:
    image: traefik/whoami
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`whoami.example.com`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
    networks:
      - web

Redeploy:

docker-compose up -d

Espera 30 segundos y entra en https://whoami.example.com. El certificado se genera automáticamente.

Paso 5: Añade más servicios
#

Para cada servicio nuevo, solo añade labels similares a los del whoami. Traefik se encarga del resto. Es así de simple.

Consideraciones prácticas
#

Backup de acme.json: Es tu archivo de certificados. Hazle backup regularmente o perderás los certificados.

Firewall: Abre puertos 80 y 443 en tu router apuntando al servidor.

IP dinámica: Si tu ISP cambia tu IP (común en residencial), usa un servicio DDNS.

Dashboard: Traefik tiene un dashboard en http://localhost:8080 (solo desde la máquina local por seguridad).

Problemas comunes
#

Si los certificados no se generan, revisa los logs: docker-compose logs traefik. Usualmente es un problema de DNS o firewall.

Si un servicio no responde, verifica que el label port coincida con el puerto interno del contenedor.

Conclusión
#

Con esta setup he montado blog, wiki, nextcloud y otros servicios en casa sin gastar en SSL o en reverse proxy comercial. Traefik es una bestia en esto. Vale mucho la pena dedicar una hora a configurarlo bien.