Imagen con Nginx y Certbot para la implementación en contenedores. Certificados auto gestionables.
9.6K
Referencia Rápida
Mantenido Por: PINDU
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.
Si encuentras útil este proyecto y deseas contribuir a su mantenimiento, considera hacer una donación. Tu apoyo es muy apreciado.
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.
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"]
Content type
Image
Digest
sha256:01297d374…
Size
49.4 MB
Last updated
2 months ago
docker pull pindu/nginx:test