====== Container Nginx-Proxy et Letsencrypt-Compagnon ======
Container servant de proxy web à tous les autres containers nécessitant une interface web accessible.
===== Forcer la demande d'un certificat =====
* Lorsque le site web d'un container persiste a ne pas s'afficher en HTTPS
* Se connecter au container nginx-proxy-letsencryp : ''docker exec -it nginx-proxy-letsencrypt /bin/bash''
* Dans le dossier ''/app/'' lancer la commande suivante en adaptant votre domaine :
* Ex. : ''%% ./letsencrypt_service example.silene.eu,www.example.silene.eu %%''
* Note : plusieurs domaines ou sous-domaines peuvent être indiqué en les séparant par une virgule. Le premier sera le principal.
* ATTENTION : les domaines avec wildcard "*" ne sont pas encore supporté.
===== Partager les logs Nginx avec l'hôte =====
Une amélioration possible serait de créer un utilisateur ''nginx'' ou ''www-data'' sur l'hôte puis d'utiliser les identifiant de cet utilisateur dans le container nginx-proxy. Cela permettrait d'avoir des droits cohérents entre le container et l'hôte pour les fichiers de logs.
* Pourquoi ?
* Afin de pouvoir faire fonctionner correctement le service Fail2ban de l'hôte qui se base sur les logs Nginx
* Problèmes :
* transférer les IP des clients dans le container Nginx et éviter de voir dans les logs Nginx l'IP de la Gateway du réseau Docker
* activer correctement Logrotate pour que Nginx présent dans le container gère correctement la création de nouveaux fichiers de log : propriété correcte et écriture des logs dans le nouveau fichier.
* Sur l'hôte :
* Créer un dossier ''/var/log/nginx/'' avec : mkdir /var/log/nginx/
* Donner les bons droits : chown root:adm /var/log/nginx/ ; chmod 640 /var/log/nginx/
* Créer les fichiers par défaut avec : touch /var/log/nginx/access.log /var/log/nginx/error.log
* Donner les bons droits aux fichiers de base. C'est important car nous utilisons ''copytruncate'' dans la conf Logrotate:
* Se connecter au service nginx-proxy : docker exec -it nginx-proxy bash
* Regarder l'id de l'utilisateur Nginx avec la commande ''id''.
* Puis modifier la propriété des fichiers de log : chown 101:adm *.log
* Ajouter le paquet ''logrotate'' avec : apt install logrotate
* Créer un nouveau fichier de conf logrotate : touch /etc/logrotate.d/nginx
* Y placer le contenu suivant (vérifier les chemins utilisés !) :
/var/log/nginx/*.log {
daily
missingok
rotate 400
compress
delaycompress
notifempty
su root adm
# User "nginx" in container has an id of 101
#create 0640 101 adm
# To avoid permission issues with directory and files shared between host and container: see copytruncate
copytruncate
dateext
dateyesterday
dateformat .%Y-%m-%d
sharedscripts
postrotate
cd /home/admin/docker/proxy/ \
&& /usr/bin/docker compose kill -s USR1 nginx-proxy
endscript
}
* Modifier le fichier ''docker-compose.yml'' de la stack ''proxy'' dans ''/home/admin/docker/'' en tant qu'utilisateur ''admin'' :
* le service ''nginx-proxy'' doit contenir :network_mode: "host"
* Le mode "hôte" permet d'obtenir les IP réelles des clients dans les logs Nginx avec la variable ''$remote_addr''
* commenter la section ''ports:'' sinon l'erreur ''! nginx-proxy Published ports are discarded when using host network mode'' apparaîtra.
* Ajouter dans la section ''volumes:'' l'entrée suivante :
volumes:
- /var/log/nginx/:/var/log/nginx/
* Modifier le fichier ''nginx.conf'' avec :
http {
# Enabling request time
log_format enhanced-fmt '$remote_addr $host $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt="$request_time" uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time" '
'gzr="$gzip_ratio" ';
access_log /var/log/nginx/access.log enhanced-fmt;
error_log /var/log/nginx/error.log;
}
* Relancer la stack ''proxy'' avec : docker compose down && docker compose up -d
* Vérifier que les logs sont écris dans le fichier ''/var/log/nginx/access.log''
* Tester la config Logrotate avec : logrotate -f /etc/logrotate.d/nginx