Cómo exponer tu aplicación Docker en un subdominio HTTPS con Apache 2 y Let’s Encrypt en tu VPS
Aprende paso a paso a exponer tu aplicación Docker en un subdominio con Apache2 y asegurarla con HTTPS gratis con Let’s Encrypt: instalación, configuración DNS, VirtualHost, Certbot y renovación automática.
1. Requisitos previos
- Docker Engine y Docker Compose Plugin instalados.
- Contenedor Docker en ejecución en un puerto interno.
- Dominio (ej.
midominio.com
) con acceso a zona DNS. - Puertos 80 y 443 abiertos en tu VPS.
- Acceso
sudo
por terminal en servidor Ubuntu/Debian.
2. Instalar Apache2
Comienza actualizando los paquetes a la última versión disponible utilizando el siguiente comando:
sudo apt update
2.1 Instalar Apache 2
Apache 2 es el servicio que actúa de puerta de entrada a tu aplicación. Se encarga de recibir las peticiones HTTP/HTTPS de los clientes y, gracias a los módulos de proxy, las reenvía al contenedor Docker donde corre tu app. Además gestiona la configuración de VirtualHosts (subdominios), las redirecciones de HTTP a HTTPS y la carga de los certificados TLS.
sudo apt install -y apache2
Una vez que Apache esté instalado, se inicia automáticamente y ya está en funcionamiento. Cada proceso en Apache se gestiona con el comando systemctl
. Verifica el estado de Apache con el siguiente comando:
sudo systemctl status apache2
Deberías ver una salida similar a esta:
Output
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Tue 2020-01-06 03:59:34 UTC; 5min ago
Main PID: 10617 (apache2)
Tasks: 55 (limit: 667)
CGroup: /system.slice/apache2.service
├─10617 /usr/sbin/apache2 -k start
├─10619 /usr/sbin/apache2 -k start
└─10620 /usr/sbin/apache2 -k start
Jan 06 03:59:34 apache systemd[1]: Starting The Apache HTTP Server…
Jan 06 03:59:34 apache systemd[1]: Started The Apache HTTP Server.
Ahora tenemos Apache instalado.
2.2 Habilita sus módulos clave
- proxy & proxy_http: hacen de reverse‑proxy.
- rewrite: redirige URLs (p. ej. forzar HTTPS).
- ssl: habilita cifrado TLS.
- headers: añade o modifica cabeceras HTTP.
sudo a2enmod proxy proxy_http rewrite ssl headers
3. Lista los servicios Docker en ejecución
Ejecuta el siguiente comando para ver tus contenedores activos:
docker ps
3.1 Identifica la aplicación / servicio
Ahora, identifica el puerto de la aplicación que deseas configurar para apuntarlo a tu subdominio. En este caso, usaremos como ejemplo a n8n que se está ejecutando en el puerto 5678
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f3c2b1d5a6e n8nio/n8n "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:5678->5678/tcp n8n
9a8b7c6d5e4f postgres:14 "docker-entrypoint.s…" 3 hours ago Up 3 hours 0.0.0.0:5432->5432/tcp postgres_db
a1b2c3d4e5f6 redis:7 "docker-entrypoint.s…" 30 minutes ago Up 30 minutes 0.0.0.0:6379->6379/tcp redis_cache
0f1e2d3c4b5a mongo:5.0 "docker-entrypoint.s…" 5 hours ago Up 5 hours 0.0.0.0:27017->27017/tcp mongodb
e3b6d8e6c317 atendai/evolution-api:latest "/bin/bash -c '. ./D…" 28 seconds ago Up 26 seconds 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp evolution_api
4. Configura los DNS de tu dominio
Ese paso se encarga de decirle al mundo “dónde” está alojada tu aplicación. Al crear el registro A en el DNS estás vinculando el nombre legible (app.midominio.com
) con la dirección IP de tu servidor. Gracias a eso, cuando un usuario escribe esa URL en su navegador, el sistema de nombres traduce el subdominio a la IP correcta y sus peticiones llegan efectivamente al servidor donde corre tu contenedor Docker.
4.1 Crea un registro A para tu subdominio
Indica en tu panel de DNS que el subdominio (por ejemplo, app.midominio.com
) apunte a la IP de tu servidor, para que las solicitudes lleguen correctamente a tu aplicación.
Subdominio | Tipo | IP |
---|---|---|
app.midominio.com |
A | IP_SERVIDOR |
5. Configuración de Apache2 en VPS
Regresamos a la terminal en la que tenemos acceso a nuestro VPS para montar configurar nuestro VirtualHost.
5.1 Alta y configuración del VirtualHost
Vamos a crear nuestro archivo de configuración mediante el siguiente comando:
sudo nano /etc/apache2/sites-available/app.midominio.com.conf
Dentro del nuevo archivo agrega esta configuración y guarda los cambios:
<VirtualHost *:80>
ServerName app.midominio.com
# Proxy inverso hacia el contenedor Docker
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:5678/
ProxyPassReverse / http://127.0.0.1:5678/
# Headers para WebSocket
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) ws://127.0.0.1:5678/$1 [P,L]
ProxyPassReverse / ws://127.0.0.1:5678/
</VirtualHost>
Habilita la nueva configuración del sitio.
sudo a2ensite app.midominio.com.conf
Reinicia el servicio de Apache 2 con el siguiente comando:
sudo service apache2 restart
app.midominio.com
por tu dirección original.
6. Instalar Let’s Encrypt SSL
HTTPS es un protocolo para la comunicación segura entre un servidor (instancia) y un cliente (navegador web). Debido a la introducción de Let’s Encrypt, que proporciona certificados SSL gratuitos, HTTPS ha sido adoptado por todos y también brinda confianza a tu audiencia.
sudo apt install python3-certbot-apache
Ahora que hemos instalado Certbot de Let’s Encrypt ejecuta este comando para obtener los certificados para tu sitio.
sudo certbot --apache --agree-tos --redirect -m tuemail@mail.com -d app.midominio.com -d app.midominio.com
app.midominio.com
y también tuemail@mail.com
por tu dirección original.
Presiona Enter
este comando instalará SSL gratuito, configurará la redirección a HTTPS y reiniciará el servidor Apache.
6.1 Verifica el funcionamiento del sitio
Ahora ingresa a la dirección: https://app.midominio.com
en tu navegador y debería mostrar tu servicio corriendo sin problemas.
7. Renovación del Certificado SSL
Los certificados proporcionados por Let’s Encrypt son válidos solo por 90 días, por lo que necesitas renovarlos con frecuencia. Entonces, probemos la función de renovación utilizando el siguiente comando:
sudo certbot renew --dry-run
Este comando probará el vencimiento del certificado y configurará la función de renovación automática.