es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

HTTPS para contenedores de Docker

Estoy desarrollando un servicio de flujo de trabajo como proyecto de entrenamiento. Abstrayéndonos de los detalles, todo lo que necesitas saber para esta pregunta está en la imagen aquí. Para implementarlo, alquilé un servidor y ejecuté docker-compose en él. Todo funciona bien, pero lo que me preocupa es que los puertos 8000 y 5432 están abiertos.

La primera pregunta es, ¿merece la pena preocuparse? Y si es así, ¿cómo puedo solucionarlo?
A continuación se muestra el contenido del archivo docker-compose:

version: "3"

services:
  db:
    container_name: 'emkk-db'
    image: postgres
    volumes:
      - ./backend/data:/var/lib/postgresql/data
    env_file:
      - ./backend/db.env
    ports:
    - "5432:5432"

  backend:
    container_name: 'emkk-backend'
    image: emkk_backend
    build: ./backend
    volumes:
      - ./backend:/emkk/backend
    env_file:
      - ./backend/.env
    ports:
      - "8000:8000"
    depends_on:
      - db

  frontend:
    container_name: 'emkk-frontend'
    image: emkk_frontend
    build: ./frontend
    command: npm run start
    env_file:
      - ./frontend/.env
    volumes:
      - /emkk/frontend/node_modules
      - ./frontend:/emkk/frontend
    ports:
      - "80:80"
    depends_on:
      - backend

También quiero configurar el protocolo HTTPS. Intenté instalar nginx y ponerle un certificado usando Certbot, y luego redirigir las solicitudes a los contenedores. Me senté con esto durante varias horas y aún no logré conseguir algo mejor que una página de inicio de HTTPS para nginx.

Tal vez estoy haciendo cosas completamente equivocadas, pero soy nuevo en esto, nunca antes había tenido que lidiar con implementaciones. Agradecería sus respuestas, que contengan una idea o un ejemplo de cómo se puede hacer esto.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puertos Abiertos

    Generalmente, es recomendable cerrar todos los puertos abiertos innecesarios. Los puertos abiertos pueden ser un problema de seguridad importante, ya que exponen posibles vulnerabilidades a los atacantes. En este caso, tener abiertos los puertos 8000 y 5432 podría dejar su servidor vulnerable a ataques. Por lo tanto, vale la pena preocuparse al respecto.

    Para cerrar los puertos, simplemente puede eliminar la sección ports del archivo docker-compose.yml para cada servicio. Esto evitará que los puertos estén expuestos al mundo exterior a través de la red de contenedores.

    Configuración de HTTPS

    Configurar HTTPS con Nginx y un certificado de certbot es un buen enfoque. Sin embargo, hay algunos pasos que debes seguir para asegurarte de que todo funcione como se espera.

    Primero, debes asegurarte de que tu configuración de Nginx sea correcta. Debes tener un bloque de servidor que escuche en el puerto 443 y tenga un certificado SSL válido. Puedes usar el comando certbot para obtener un certificado SSL gratuito de Let’s Encrypt:

    sudo certbot --nginx -d tu_domino.com
    

    Reemplaza tu_domino.com con el nombre de tu dominio real. Sigue las instrucciones para obtener el certificado y configurar Nginx.

    A continuación, tendrás que configurar Nginx para que canalice las solicitudes a los contenedores de Docker. Puedes hacer esto usando la directiva proxy_pass en la configuración de Nginx. Aquí tienes un ejemplo de bloque de configuración:

    server {
        listen 443 ssl;
        server_name tu_domino.com;
    
        ssl_certificate /ruta/a/tu/cert.pem;
        ssl_certificate_key /ruta/a/tu/privkey.pem;
    
        location /backend {
            proxy_pass http://backend:8000;
            proxy_set_header Host $host;
        }
    
        location / {
            proxy_pass http://frontend:80;
            proxy_set_header Host $host;
        }
    }
    

    En este ejemplo, tenemos dos contenedores de Docker: backend y frontend. La directiva proxy_pass le indica a Nginx que envíe las solicitudes al contenedor correspondiente. También configuramos el encabezado Host para asegurarnos de que los contenedores reciban el nombre de dominio correcto.

    Por último, tendrás que actualizar tu archivo docker-compose.yml para incluir un bloque de red. Esto garantizará que el contenedor de Nginx pueda comunicarse con los demás contenedores en la misma red. Agrega el siguiente bloque de red al archivo docker-compose.yml:

    networks:
      default:
        external:
          name: nombre_de_tu_red
    

    Reemplaza nombre_de_tu_red con el nombre de tu red de Docker.

    Con estos cambios, deberías poder acceder a tu sitio web a través de HTTPS.

Comments are closed.