Introducción
En este segundo post se automatiza e instala el certificado SSL utilizando Let’s Encryp con Docker y Docker Compose. Para saber más sobre https y certificados, acceder a la página oficial en el siguiente enlace https://letsencrypt.org/es/getting-started/
- El primer post consistio en el despliegue de WordPress sin certificado SSL (enlace).
- El segundo obtendremos el certificado SSL (el actual).
- El tercero desplegaremos otros WordPress contenerizados que corran en nuestro servidor con otro dominio diferente.
Obtención del certificado
Se utiliza el mismo directorio donde ejecutamos el WordPress del post anterior, se modifican los siguientes archivos:
- WordPress/docker-compose.yml
version: "2.2"
services:
myrootdevwordpress:
container_name: myrootdevwordpress1
image: wordpress:php7.4-apache
restart: always
mem_limit: 196m
stdin_open: true
tty: true
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: $WORDPRESS_DB_USER_1
WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_1
WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_1
volumes:
- ./html/myrootdev:/var/www/html
nginx:
container_name: nginx1
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./html:/var/www/html
- ./certbot/conf:/etc/nginx/ssl
myrootdevcertbot:
container_name: myrootdevcertbot1
image: certbot/certbot:latest
command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/logs:/var/log/letsencrypt
- ./html/myrootdev:/var/www/html
db:
image: mysql:8.0
container_name: mysql811
restart: always
ports:
- '3306:3306'
env_file: .env
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
volumes:
- ./db_data:/var/lib/mysql
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin1
restart: always
ports:
- '7070:80'
environment:
PMA_HOST: db
La diferencia entre este archivo y el del post anterior es la inclusión de:
- La sección “myrootdevcertbot:”. Esta sección es el nuevo cliente de Let’s Encrypt, una herramienta para gestionar de forma automática certificados TLS/SSL y automáticamente configurar el cifrado HTTPS en nuestro servidor web.
- la sección del “nginx:” incluir el volumen siguiente “–./certbot/conf:/etc/nginx/ssl”. Para más información acudir al siguiente enlace https://www.redeszone.net/2016/05/14/certbot-es-el-nuevo-cliente-de-lets-encrypt-que-facilitara-tu-vida-a-la-hora-de-pedir-o-renovar-certificados/
- WordPress/nginx/conf/default.conf
server {
listen [::]:80;
listen 80;
server_name myrootdev.com www.myrootdev.com;
root /var/www/html/myrootdev;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html/myrootdev;
}
location / {
try_files $uri @apache;
}
#location ~ ^/\.user\.ini {
# deny all;
#}
location ~* \.(svg|svgz)$ {
types {}
default_type image/svg+xml;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location @apache {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
location ~[^?]*/$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
location ~ \.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
#location ~/\. {
# deny all;
# access_log off;
# log_not_found off;
#}
}
La diferencia entre este archivo y el del post anterior es:
- Se comenta las dos secciones que aparecen con “#”. Esto se hace momentáneamente para que los certificados se puedan guardar en el sitio que les corresponde.
Ahora ejecutamos los contenedores.
docker-compose up -d
Si todo ha ido bien debería aparecer lo siguiente.
docker-compose ps
docker-compose logs
Los certificados aparecen en la carpeta de consistencia del contenedor de certbot.
Instalación del certificado
Lo primero que se debe hacer es parar todos los contenedores.
docker-compose stop
Para la instalación de los certificados se deberá modificar un poco el archivo de docker-compose y la configuración de nginx.
- docker-compose.yml
version: "2.2"
services:
myrootdevwordpress:
container_name: myrootdevwordpress1
image: wordpress:php7.4-apache
restart: always
mem_limit: 196m
stdin_open: true
tty: true
env_file: .env
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: $WORDPRESS_DB_USER_1
WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD_1
WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME_1
volumes:
- ./html/myrootdev:/var/www/html
nginx:
container_name: nginx1
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./html:/var/www/html
- ./certbot/conf:/etc/nginx/ssl
#myrootdevcertbot:
# container_name: myrootdevcertbot1
# image: certbot/certbot:latest
# command: certonly --webroot --webroot-path=/var/www/html --email camilo.cubillos.osses.90@gmail.com --agree-tos --no-eff-email -d myrootdev.com -d www.myrootdev.com
# volumes:
# - ./certbot/conf:/etc/letsencrypt
# - ./certbot/logs:/var/log/letsencrypt
# - ./html/myrootdev:/var/www/html
db:
image: mysql:8.0
container_name: mysql811
restart: always
ports:
- '3306:3306'
env_file: .env
environment:
MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
volumes:
- ./db_data:/var/lib/mysql
phpmyadmin:
depends_on:
- db
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin1
restart: always
ports:
- '7070:80'
environment:
PMA_HOST: db
La principal diferencia es:
- Se comenta con “#” la sección de “myrootdevcertbot:”, ya que en la sección anterior se han obtenido los certificados. La otra pequeña diferencia es le exposición de nginx por el puerto 443.
- nginx/conf/default.conf
server {
listen [::]:80;
listen 80;
server_name myrootdev.com www.myrootdev.com;
return 301 https://myrootdev.com$request_uri;
}
server {
listen [::]:443 ssl http2;
listen 443 ssl http2;
server_name myrootdev.com www.myrootdev.com;
ssl_certificate /etc/nginx/ssl/live/myrootdev.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/myrootdev.com/privkey.pem;
root /var/www/html/myrootdev;
index index.php;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html/myrootdev;
}
location / {
try_files $uri @apache;
}
location ~ ^/\.user\.ini {
deny all;
}
location ~* \.(svg|svgz)$ {
types {}
default_type image/svg+xml;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location @apache {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
location ~[^?]*/$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
location ~ \.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_pass http://myrootdevwordpress1:80;
}
location ~/\. {
deny all;
access_log off;
log_not_found off;
}
}
Se observan dos principales diferencias:
- El primer servidor (puerto 80) lo redirigimos al puerto 443 donde tenemos el certificado SSL.
- Al segundo servidor (puerto 443) le indicamos las direcciones de los certificados para que sepa donde buscarlos.
Tenemos listos nuestros archivos para reiniciar nuestros contenedores.
docker-compose start
docker-compose ps
Por último se entra a nuestro dominio para comprobar que los certificados han sido instalados correctamente.
El candado y el https indican que nuestros certificados se han instalado correctamente.
Si no se ha creado la base de datos revisar la última sección del primer post donde se explica como crearla.