#!/bin/bash # Synchronise le certificat Let's Encrypt de mail.sans.pub (renouvelé par CapRover) # vers poste.io, qui ne sait pas le renouveler lui-même derrière le nginx de CapRover. # Installé dans /root/mail-cert-sync.sh, lancé chaque jour par /etc/cron.d/mail-cert-sync # cron ne fournit que /usr/bin:/bin export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin set -euo pipefail LIVE=/captain/data/letencrypt/etc/live/mail.sans.pub SSL=/var/lib/docker/volumes/captain--mail-data/_data/ssl LOG=/var/log/mail-cert-sync.log exec >> "$LOG" 2>&1 # Déjà à jour ? if cmp -s "$LIVE/cert.pem" "$SSL/server.crt"; then exit 0 fi openssl x509 -in "$LIVE/cert.pem" -noout -checkend 86400 \ || { echo "$(date -Is) certificat CapRover expiré ou invalide, rien fait"; exit 1; } echo "$(date -Is) nouveau certificat : $(openssl x509 -in "$LIVE/cert.pem" -noout -enddate)" stamp=$(date +%Y%m%d%H%M%S) for f in server.crt server.key ca.crt; do [ -f "$SSL/$f" ] && cp -p "$SSL/$f" "$SSL/$f.bak-$stamp" done install -m 644 -o mail -g mail "$LIVE/cert.pem" "$SSL/server.crt" install -m 644 -o mail -g mail "$LIVE/chain.pem" "$SSL/ca.crt" install -m 600 -o mail -g mail "$LIVE/privkey.pem" "$SSL/server.key" # Garder seulement les 3 dernières sauvegardes de chaque fichier for f in server.crt server.key ca.crt; do ls -1t "$SSL/$f".bak-* 2>/dev/null | tail -n +4 | xargs -r rm -f done # Distribution dans le conteneur (script d'init de poste.io) puis rechargement des services TLS M=$(docker ps -q -f name=srv-captain--mail) docker exec "$M" bash /etc/cont-init.d/21-certificate.sh docker exec "$M" s6-svc -h /var/run/s6/services/dovecot # IMAP/POP : relecture à chaud docker exec "$M" s6-svc -t /var/run/s6/services/haraka-smtp # SMTP 25/465 : redémarrage (quelques s) docker exec "$M" s6-svc -t /var/run/s6/services/haraka-submission # SMTP 587 echo "$(date -Is) certificat installé et services rechargés"