Настроить Nginx + docker-mailserver + certbot —nginx для безопасной работы с SAN-сертификатами
🎯 Цель
-
Один сервер (один IP)
-
docker-mailserver
обрабатывает почту -
Nginx
на хосте обслуживает порт 80 и 443 -
Certbot использует
--nginx
для выдачи и продления SAN-сертификатов -
Сертификаты монтируются в
docker-mailserver
📦 Архитектура
Шаги настройки
1. ✅ Установи Nginx на хост
Проверь, что он слушает 80 и 443:
sudo ss -tuln | grep ‘:80\|:443’
2. ⚙️ Настрой nginx
для почтовых доменов
Создай файл /etc/nginx/sites-available/mail
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
server { listen 80; server_name mail.oldtimer.top mail.mecesta.mpmsystem.top; root /var/www/html; location /.well-known/acme-challenge/ { allow all; } location / { return 404; } } |
1 2 3 4 |
sudo ln -s /etc/nginx/sites-available/mail /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx |
certbot --nginx
1 2 3 4 5 |
sudo certbot --nginx \ -d mail.oldtimer.top \ -d mail.mecesta.mpmsystem.top \ --agree-tos --no-eff-email --email you@example.com |
После этого сертификаты появятся здесь:
1 2 3 4 |
/etc/letsencrypt/live/mail.oldtimer.top/ ├── fullchain.pem └── privkey.pem |
И они содержат оба SAN-домена.
Проверь:
1 2 |
openssl x509 -in /etc/letsencrypt/live/mail.oldtimer.top/fullchain.pem -text | grep DNS: |
4. 📂 Пробрось сертификаты в docker-mailserver
Обнови docker-compose.yml
:
1 2 3 4 |
volumes: - /etc/letsencrypt/live/mail.oldtimer.top/fullchain.pem:/tmp/docker-mailserver/ssl/fullchain.pem:ro - /etc/letsencrypt/live/mail.oldtimer.top/privkey.pem:/tmp/docker-mailserver/ssl/privkey.pem:ro |
.env
(mailserver.env
):
1 2 3 4 |
SSL_TYPE=manual SSL_CERT_PATH=/tmp/docker-mailserver/ssl/fullchain.pem SSL_KEY_PATH=/tmp/docker-mailserver/ssl/privkey.pem |
docker-mailserver
1 2 3 |
docker-compose down docker-compose up -d |
6. 🔁 Настрой автообновление сертификатов
Certbot создаёт cron
или systemd
таймер автоматически при установке. Убедись:
1 2 |
sudo systemctl list-timers | grep certbot |
Сертификаты будут обновляться сами, без остановки docker-mailserver, потому что nginx
обслуживает 80/443.
7. 🔁 (опционально) Добавь deploy-hook
на перезапуск контейнера
Чтобы docker-mailserver подхватил обновлённые сертификаты, добавь хук:
1 2 |
sudo nano /etc/letsencrypt/renewal-hooks/deploy/restart-mailserver.sh |
1 2 3 |
#!/bin/bash docker restart mailserver |
1 2 |
chmod +x /etc/letsencrypt/renewal-hooks/deploy/restart-mailserver.sh |
Теперь docker-mailserver
будет перезапущен автоматически после обновления сертификатов.
✅ Всё готово!
Теперь у тебя:
-
✅ Автоматическое обновление SAN-сертификата через certbot
-
✅ Поддержка нескольких почтовых доменов
-
✅ Без остановки сервисов
-
✅ Без ручных renew
Recommended Posts
Что такое docker:dind и как он работает?
22.03.2023