HTTPS para tu aplicación Docker en VPS

HTTPS para tu aplicación Docker en VPS

/* ---- --- */
Alejandro Robles
Alejandro Robles
Por: Alejandro Robles
Publicado el:

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
Nota: Recuerda remplazar 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
Nota: Recuerda remplazar 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.

Estamos viviendo una nueva revolución en tecnología 🌎 La automatización de procesos, la IA y el desarrollo de software son parte de nuestro día a día 🤖. Consigamos juntos a implementar soluciones épicas en tu trabajo, clientes o negocio. 🚀

Sígueme en mis redes sociales: