Questo tutorial ti guida passo dopo passo nella configurazione di uno stack LEMP con Docker e Docker Compose, integrando la protezione SSL tramite Let’s Encrypt.
Prerequisiti
- Un server Ubuntu con un utente non root abilitato a sudo e un firewall attivo.
- Docker e Docker Compose installati.
- Un dominio registrato con i record DNS configurati (A e www).
Fase 1: Configurazione del Server Web
Crea la directory di configurazione del progetto e il file nginx.conf:
mkdir -p webserver_www/nginx-conf
nano webserver_www/nginx-conf/nginx.conf
Inserisci il seguente blocco di configurazione:
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/html;
location ~ /.well-known/acme-challenge {
allow all;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass php_fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.ht {
deny all;
}
}
Nota: Ricordati di sostituire your_domain con il tuo dominio effettivo.
Fase 2: Definizione delle Variabili Ambientali
Crea un file .env per definire variabili sensibili:
nano webserver_www/.env
Inserisci i seguenti valori:
MYSQL_ROOT_PASSWORD=your_root_password
MYSQL_USER=your_php_fpm_user
MYSQL_PASSWORD=your_php_fpm_password
MYSQL_DATABASE=your_database
Fase 3: Configurazione di Docker Compose
Crea il file docker-compose.yml per definire i servizi:
version: '3'
services:
db:
image: mysql:8.0
env_file: .env
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
php_fpm:
image: php:8.2-fpm
volumes:
- php_fpm:/var/www/html
networks:
- app-network
nginx:
image: nginx:1.21-alpine
ports:
- "80:80"
volumes:
- php_fpm:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
- app-network
certbot:
image: certbot/certbot
volumes:
- certbot-etc:/etc/letsencrypt
- php_fpm:/var/www/html
command: certonly --webroot --webroot-path=/var/www/html --email you@example.com --agree-tos --no-eff-email --staging -d your_domain -d www.your_domain
volumes:
dbdata:
php_fpm:
certbot-etc:
networks:
app-network:
driver: bridge
Fase 4: Configurazione Certificati SSL
Esegui il comando per ottenere i certificati:
docker-compose up -d certbot
Verifica la presenza dei certificati con:
docker-compose exec nginx ls -la /etc/letsencrypt/live
Fase 5: Modifica della Configurazione Nginx
Modifica nginx.conf per abilitare HTTPS:
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
}
Fase 6: Rinnovo Automatico dei Certificati
Crea uno script di rinnovo:
#!/bin/bash
docker-compose run certbot renew && docker-compose kill -s SIGHUP nginx
Configura un cron job:
crontab -e
# Aggiungi la seguente riga
0 12 * * * /path/to/ssl_renew.sh >> /var/log/cron.log 2>&1