Cómo exponer contenedores Docker a internet usando subdominios en Cloudflare

September 17, 2024

Exponer aplicaciones que corren en contenedores Docker dentro de tu homelab o servidor casero puede parecer complicado, especialmente si quieres que estas aplicaciones sean accesibles desde internet de manera segura. Pero no te preocupes, ¡es más fácil de lo que parece! En esta guía te mostraré cómo usar subdominios y Cloudflare para exponer contenedores Docker utilizando Nginx Proxy Manager como proxy inverso. Además, como ejemplo, configuraremos Immich, una alternativa a Google Fotos o iCloud, para sincronizar automáticamente tus fotos y videos desde tu móvil.

¿Qué es un DNS?

Para empezar, es importante entender lo básico: ¿qué es un DNS?

Internet es una red de computadores conectados entre sí, y cada uno tiene una dirección IP, que es como su "número de casa" en la red. Sin embargo, los humanos somos pésimos recordando números, por eso usamos nombres de dominio como www.google.com en lugar de 172.217.16.195. Aquí es donde entra el DNS (Domain Name System): es como un directorio telefónico que convierte los nombres de dominio en direcciones IP.

Ejemplo ultra sencillo de cómo funciona un DNS

Configuración en Cloudflare

El siguiente paso es configurar nuestro dominio en Cloudflare, el servicio que usaremos para gestionar nuestro DNS. Cloudflare no solo es confiable, sino que también ofrece características como protección DDoS y certificados SSL gratuitos.

Pasos para agregar un dominio a Cloudflare:

  1. Crea una cuenta en Cloudflare.
  2. Agrega tu dominio: Dentro del panel de control, selecciona "Add a Site" y sigue los pasos para agregar tu dominio.
  3. Configura los servidores DNS: Cloudflare te proporcionará los servidores DNS que debes configurar en el servicio donde compraste tu dominio.
  4. Verifica la configuración: Una vez hecho esto, verifica que todo esté funcionando correctamente.

Agregar una entrada DNS personalizada

Una vez que el dominio esté configurado, agrega una entrada A para apuntar tu dominio a la IP de tu servidor, y una entrada CNAME para el subdominio de Immich.

Configuraciones de DNS en Cloudflare

Configuración Nginx Proxy Manager

Nginx Proxy Manager (NPM) es una herramienta muy práctica que permite manejar múltiples servicios detrás de un proxy inverso, gestionar certificados SSL y hacer redirecciones de puertos de manera sencilla.

Instalación de Nginx Proxy Manager con Docker Compose

A continuación, te dejo un ejemplo básico de cómo puedes configurar NPM usando Docker Compose:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: 'db'
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: 'npm'
      DB_MYSQL_PASSWORD: 'npm'
      DB_MYSQL_NAME: 'npm'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

  db:
    image: 'mysql:5.7'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

Agregar redirección en el Router

Antes de configurar Immich en Nginx Proxy Manager, debes asegurarte de que los puertos estén correctamente redirigidos a través de tu router para que el tráfico de internet pueda acceder a tu servidor.

Pasos para configurar la redirección en un router Unifi:

  1. Accede al panel de control de tu router Unifi.
  2. Ve a "Configuración".
  3. Selecciona "Seguridad".
  4. Selecciona "Port Forwarding".
  5. Crea dos nuevas reglas:
    • Regla 1: Redirige el puerto externo 80 al puerto 80 de la IP interna de tu homelab.
    • Regla 2: Redirige el puerto externo 443 al puerto 443 de la IP interna.

Ejemplo de configuración para router Unifi

Agregar Immich a Nginx Proxy Manager

Ahora que NPM está funcionando y está expuesto a través de nuestro router, vamos a agregar Immich como un servicio para que pueda ser accesible desde un subdominio.

  1. En el panel de Nginx Proxy Manager, selecciona "Hosts" y luego "Proxy Hosts".

  2. Completa los siguientes campos:

    • Domain Names: El subdominio que usaremos (por ejemplo, immich.tudominio.com).
    • Scheme: Selecciona http o https.
    • Forward Hostname/IP: La IP de tu servidor (o localhost si está en la misma máquina).
    • Forward Port: El puerto donde corre Immich (por ejemplo, 3000).

    Configuración de host en NPM

  3. Habilita SSL: Selecciona la opción de solicitar un nuevo certificado SSL usando Let’s Encrypt para asegurar tus conexiones.

Configuración de SSL en NPM

Bonus: Configuración de DDNS

Si no tienes una IP estática, puedes usar DDNS para mantener tu dominio actualizado con tu IP dinámica. Recomiendo usar Cloudflare DDNS para automatizar este proceso.

Con todos estos pasos, ¡tu servicio Immich ya debería estar accesible desde internet, de manera segura y rápida!