Bhe.. dopo aver avuto il server come mi posso collegare e cosa posso farci?
L’appetito vien mangiando, si dice, ed allora mi sono messo alla ricerca di un fornitore di “domain registration service” e la scelta è caduta su GiDiNet, aziendqa italiano.
L’idea di base era installare solo wordpress e piwigo per le foto, ma poi ho esagerato:
Internet
|
v
[ NGINX ] <-- unico che espone 80/443 |
+--> wordpress1
+--> wordpress2
+--> wordpress3
+--> piwigo
+--> webmail
+--> certbot
ma per fare questo non potevo pensare a “distribuzioni” dei pacchetti .deb, ma mi sono affidato ai container e di seguito il docker-compose.yml finale.
services:
# -------------------
# MariaDB centralizzata
# -------------------
db:
image: mariadb:10.6
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: password
TZ: Europe/Rome
command:
- --innodb-buffer-pool-size=512M
- --max-connections=100
volumes:
- ./db:/var/lib/mysql
# -------------------
# Piwigo
# -------------------
piwigo:
image: linuxserver/piwigo
container_name: piwigo
restart: unless-stopped
depends_on:
- db
environment:
PUID: 1000
PGID: 1000
volumes:
- ./piwigo/config:/config
- ./piwigo/gallery:/gallery
ports:
- "127.0.0.1:8081:80" # esposto solo internamente
# -------------------
# WordPress 1
# -------------------
wordpress1:
image: wordpress:php8.2-apache
container_name: wordpress1
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp1
WORDPRESS_DB_USER: wp1
WORDPRESS_DB_PASSWORD: password
PHP_MEMORY_LIMIT: 256M
PHP_MAX_EXECUTION_TIME: 300
PHP_MAX_INPUT_TIME: 300
TZ: Europe/Rome
volumes:
- ./wp1/html:/var/www/html
- ./php/wp1/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
ports:
- "127.0.0.1:8082:80"
# -------------------
# WordPress 2
# -------------------
wordpress2:
image: wordpress:php8.2-apache
container_name: wordpress2
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp2
WORDPRESS_DB_USER: wp2
WORDPRESS_DB_PASSWORD: password
PHP_MEMORY_LIMIT: 256M
PHP_MAX_EXECUTION_TIME: 120
TZ: Europe/Rome
volumes:
- ./wp2/html:/var/www/html
ports:
- "127.0.0.1:8083:80"
# -------------------
# WordPress 3
# -------------------
wordpress3:
image: wordpress:php8.2-apache
container_name: wordpress3
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wp3
WORDPRESS_DB_USER: wp3
WORDPRESS_DB_PASSWORD: password
PHP_MEMORY_LIMIT: 256M
PHP_UPLOAD_MAX_FILESIZE: 512M
PHP_POST_MAX_SIZE: 256M
PHP_MAX_EXECUTION_TIME: 300
PHP_MAX_INPUT_TIME: 300
TZ: Europe/Rome
volumes:
- ./wp3/html:/var/www/html
ports:
- "127.0.0.1:8084:80"
# -------------------
# Nginx reverse proxy
# -------------------
nginx:
image: nginx:stable
container_name: nginx
restart: unless-stopped
depends_on:
- piwigo
- wordpress1
- wordpress2
- wordpress3
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./certbot/www:/var/www/certbot
- ./certbot/certificates:/etc/letsencrypt
- ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
environment:
TZ: Europe/Rome
ports:
- "80:80"
- "443:443"
# -------------------
# mailServer
# -------------------
mailserver:
image: mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail
domainname: miodominio.it
env_file: mailserver.env
environment:
TZ: Europe/Rome
ports:
- "25:25"
- "465:465"
- "587:587"
- "993:993"
volumes:
- ./maildata:/var/mail
- ./mailstate:/var/mail-state
- ./config:/tmp/docker-mailserver
- ./certbot/certificates:/etc/letsencrypt
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- ./logs:/var/log/mail
cap_add:
- NET_ADMIN
- SYS_PTRACE
# -------------------
# Webmail
# -------------------
snappymail:
image: djmaze/snappymail
container_name: snappymail
restart: unless-stopped
volumes:
- ./snappymail/data:/snappymail/data
L’idea era quella di utilizzare nginx come reverse proxy come unico “oggetto” esposto su internet ed utilizzare let’s encript come fornitore dei certificati oper l’https.
Peocediamo con ordine.Sulla pagine di gestione di GiDiNet ho impostato (per iniziare) tre FQDN:
www.miodominio.it
photo.midominio.it
miodominio.it
e poi la vera configurazione del reverse proxy
## ================================================
## HTTP redirect + ACME challenge
## ================================================
server {
listen 80;
server_name photo.miodominio.it ;
# ACME challenge per Certbot
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
# Redirect tutto il resto su HTTPS
location / {
return 301 https://$host$request_uri;
}
}
## ================================================
## Piwigo HTTPS
## ================================================
server {
listen 443 ssl;
server_name photo.miodominio.it;
ssl_certificate /etc/letsencrypt/live/photo.miodominio.it/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/photo.miodominio.it/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://piwigo:80;
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-Proto https;
}
}
Per la generazione del certificato PRIMA di passare alla 443, bisogna esporre il sito sulla porta 80 in modo che let’s encript possa generare correttamente il certificato: in definitiva bisogna commentare le quattro righe dei certificati ed abilitare la porta 80, modificando la porta 443 ssl in 80 nella sezione del server.
Per la generazione del certificato bisogna lanciare questo comando
docker run --rm -v /opt/docker/certbot/www:/var/www/certbot -v /opt/docker/certbot/certificates:/etc/letsencrypt certbot/certbot certonly \
--webroot -w /var/www/certbot -d photo.miodominio.it \
--email admin@miodominio.it --agree-tos --no-eff-email
per evitare errori, bisogna creare a mano un file tramite
mkdir -p /opt/docker/certbot/certificates
openssl dhparam -out /opt/docker/certbot/certificates/ssl-dhparams.pem 2048
come parametro possiamo dare anche la chiava a 4096 bit: ci vorrà solo un tempo maggiore per la generazione, ma la sicurezza aumenta.
Contabo non aggiunge lo swap alla macchina: non fa male..
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
Finora tutto a posto: ora lanciamo piwigi per vedere la configurazione, ma prima dobbiamo creare il database e l’utente per accedere al db.
docker exec -it mariadb mysql -u root -p
Inserisci la MYSQL_ROOT_PASSWORD, poi:
CREATE DATABASE piwigo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'piwigo'@'%' IDENTIFIED BY 'piwigo_strong_password';
GRANT ALL PRIVILEGES ON piwigo.* TO 'piwigo'@'%';
FLUSH PRIVILEGES;
EXIT;
A questo punto inserire i dati dopo aver lanciato dal tuo browser il fatidico
https://photo.miodominio.it
bisogna solo inserire le credenziali passate durante la creazione del db.
Vale la pena ricordare che il container di piwigo è nella lan degli altri conainer, quindi il nome della macchina che espone il db è quello della configurazione del docker: db (poca fantasia)
