pindu/nginx

By pindu

Updated 2 months ago

Imagen con Nginx y Certbot para la implementación en contenedores. Certificados auto gestionables.

Image
Networking
Security
Web servers
1

9.6K

pindu/nginx repository overview

Dockerizado de Nginx con Gestión Automatizada de Cron y Certificados SSL de Let's Encrypt

Docker Nginx Alpine Linux Python

Referencia Rápida

Mantenido Por: PINDU

Descargo de Responsabilidad:

El código proporcionado se ofrece "tal cual", sin garantía de ningún tipo, expresa o implícita. En ningún caso los autores o titulares de derechos de autor serán responsables de cualquier reclamo, daño u otra responsabilidad.

Donaciones:

Si encuentras útil este proyecto y deseas contribuir a su mantenimiento, considera hacer una donación. Tu apoyo es muy apreciado.

Donate

Resumen:

Este artículo presenta una solución basada en Docker para desplegar servidores web Nginx con programación automatizada de tareas cron y gestión de certificados SSL de Let's Encrypt. Se proporciona el Dockerfile y la configuración de Docker Compose que demuestran la instalación de paquetes necesarios, la configuración de tareas cron, y la integración con Let's Encrypt para la provisión automática y renovación de certificados SSL. Las características principales incluyen el uso de Alpine Linux para minimizar el tamaño de la imagen, gestión de volúmenes para la persistencia de registros, y sustitución de variables de entorno para la plantilla de configuración de Nginx. La solución tiene como objetivo simplificar el despliegue y mantenimiento de servidores web Nginx seguros en entornos en la nube.

Palabras clave: Docker, Nginx, Alpine Linux, cron jobs, Let's Encrypt, certificados SSL

Requisitos

  • Docker y Docker Compose instalados en el sistema.
  • Acceso a los puertos 80 y 443 en el host.
  • Un dominio válido apuntando a la IP del servidor.
  • Permisos para crear y modificar archivos en los directorios de configuración y volúmenes.

Para utilizar con un docker-compose.yml Creamos un archivo .env

SERVER_NAME=example.com
BACKEND=backend
PORT=80

Creamos el archivo docker-compose.yml

services:
  nginx:
    image: pindu/nginx:alpine
    restart: unless-stopped
    command: >
      sh -c "
        chmod 0644 /etc/cron.d/crontab && \
        crontab /etc/cron.d/crontab && \
        crond -f -L /var/log/cron.log & \
        tail -f /var/log/cron.log /var/log/script.log /var/log/letsencrypt/letsencrypt.log & \
        envsubst < /etc/nginx/templates/default.conf.template > /etc/nginx/conf.d/default.conf \
        nginx -t && nginx -g 'daemon off;' && \
        certbot certonly --config ./cli.ini 
      "
    ports:
      - 80:80
      - 443:443
    env_file:
      - .env
    volumes:
      - ./conf/:/etc/nginx/conf.d/
      - ./cron.d/crontab:/etc/cron.d/crontab
      - ./templates:/etc/nginx/templates
      - ./letsencrypt/:/etc/letsencrypt/
      - ./cli.ini:/cli.ini

Modificar el archivo según sea necesario ./templates/default.conf.template

upstream backend {
  least_conn;
  server ${BACKEND}:${PORT};
}

server {
    server_name ${SERVER_NAME};
    client_max_body_size 100M;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }
}

Modificar el archivo según sea necesario ./crond.d/crontab

# * * * * *  [UserName] Command_to_execute
# - – – – -
# | | | | |
# | | | | +—– Day of week (0–7) (Sunday=0 or 7) or Sun, Mon, Tue,…
# | | | +———- Month (1–12) or Jan, Feb,…
# | | +————-— Day of month (1–31)
# | +——————– Hour (0–23)
# +————————- Minute (0–59)
# * * * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --post-hook "nginx -s reload" >> /var/log/script.log 2>&1
0 *,12 * * * sleep 2900 && /usr/bin/certbot renew -q # --deploy-hook "systemctl reload nginx" >> /var/log/cron.log 2>&

Modificar el archivo según sea necesario ./cli.ini Solo es necesario el mail y el dominio, para varios dominios solo separarlos por espacios

#####################################################
# Datos a modificar
#####################################################
email = 
domains = example.com
#####################################################
# Dejar por defecto si no se necesita algo específico
#####################################################
agree-tos = True
non-interactive = True
webroot-path = /usr/share/nginx/html
post-hook = nginx -s reload
rsa-key-size = 4096
authenticator = nginx
quiet = False
#####################################################

Dockerfile de la imagen

FROM nginx:alpine AS base
LABEL maintainer="Luciano Parruccia <[email protected]>"
LABEL version="1.0"
LABEL description="Imagen para ejecutar nginx y certbot con renovación automática."

VOLUME [ "/var/log" ]
RUN apk update && apk add --no-cache dcron certbot certbot-nginx 
# Copiar el archivo crontab al contenedor
COPY ./nginx/cron.d/crontab /etc/cron.d/crontab
# Dar permisos a crontab
RUN chmod 0644 /etc/cron.d/crontab
# Crear el archivo de log del script
RUN touch /var/log/cron.log
RUN mkdir -p /var/log/letsencrypt
RUN touch /var/log/letsencrypt/letsencrypt.log
COPY ./nginx/cli.ini .
# Exponer el puerto 80 y 443 para Nginx
EXPOSE 80 443
RUN ln -s /usr/share/zoneinfo/America/Cordoba /etc/localtime
CMD ["sh", "-c", "crond -f -L /var/log/cron.log & tail -f /var/log/cron.log /var/log/letsencrypt/letsencrypt.log"]

Tag summary

Content type

Image

Digest

sha256:01297d374

Size

49.4 MB

Last updated

2 months ago

docker pull pindu/nginx:test