Введение
В статье описывается, как:
- Выпускать и автоматически продлевать сертификаты Let’s Encrypt в Docker‑контейнере certbot с DNS‑подтверждением через Cloudflare на Synology (Container Manager).
- Привязать эти сертификаты к DSM через symlink, чтобы веб‑интерфейс и встроенный nginx всегда использовали актуальные ключи.
- Перезагружать nginx по расписанию, автоматически подхватывая обновлённые сертификаты.
1. Подготовка домена и Cloudflare
- В панели Cloudflare:
- Добавь домен (например,
example.org) в Cloudflare.
- Создай API‑токен для DNS‑подтверждения:
- Cloudflare → My Profile → API Tokens → Create Token.
- Шаблон: Edit zone DNS.
- Zone Resources: Include → Specific zone → выбери нужный домен.
- Сохрани сгенерированный токен.
2. Подготовка каталогов на Synology
- Через SSH на NAS:
sudo mkdir -p /volume1/docker/certbot/certs
sudo mkdir -p /volume1/docker/certbot/var
- Приведи владельца/права (если не заморачиваешься с отдельным пользователем, оставляешь root: root):
sudo chown -R root:root /volume1/docker/certbot
sudo find /volume1/docker/certbot -type d -exec chmod 755 {} \;
Так certbot внутри контейнера сможет свободно писать в том, а DSM не будет конфликтовать с системным
/etc/letsencrypt.
3. docker-compose для certbot + Cloudflare (DNS‑01)
Создай docker-compose.yml в, например, /volume1/docker/certbot/docker-compose.yml:
version: "3.8"
services:
certbot:
image: serversideup/certbot-dns-cloudflare:latest
container_name: certbot
restart: unless-stopped
environment:
CERTBOT_EMAIL: "you@example.org" # e-mail для Let’s Encrypt
CERTBOT_DOMAINS: "example.org,*.example.org" # список доменов, можно wildcard
CERTBOT_KEY_TYPE: "ecdsa" # или "rsa"
CLOUDFLARE_API_TOKEN: "YOUR_CF_API_TOKEN" # токен из Cloudflare
CERTBOT_RENEW_INTERVAL: "21600" # интервал проверки renew в секундах (6 часов)
volumes:
- /volume1/docker/certbot/certs:/etc/letsencrypt
- /volume1/docker/certbot/var:/var/lib/letsencrypt
Образ serversideup/certbot-dns-cloudflare:
- создаёт аккаунт в Let’s Encrypt;
- выпускает сертификаты для всех доменов из
CERTBOT_DOMAINSчерез DNS‑01 в Cloudflare; - дальше в фоновом цикле регулярно запускает
certbot renew.
4. Первый запуск и проверка сертификатов
- Запуск контейнера:
cd /volume1/docker/certbot
docker compose up -d certbot
- После успешного первого цикла проверь наличие сертификатов:
ls -l /volume1/docker/certbot/certs/live/example.org
В каталоге должны быть:
fullchain.pemprivkey.pemи другие файлы certbot.
5. Связка certbot ↔ DSM через _archive
- Разовый импорт через DSM (удобнее сначала “зарегистрировать” сертификат):
- Панель управления → Security → вкладка Certificate.
- Add → Add a new certificate → Import certificate.
- Укажи временные файлы (можно скопировать
fullchain.pemиprivkey.pemво временную папку). - Назови сертификат, например
LetsEncrypt-susano. - Привяжи его к DSM/Web Station/Reverse Proxy через кнопку Settings.
- Узнай ID архива сертификатов:
sudo cat /usr/syno/etc/certificate/_archive/DEFAULT
# выведет ID, например BuUdf3
- Свяжи DSM с файлами certbot через symlink:
ID=BuUdf3
CERTBOT_PATH="/volume1/docker/certbot/certs/live/example.org"
# удалить старые файлы DSM
sudo rm /usr/syno/etc/certificate/_archive/$ID/cert.pem
sudo rm /usr/syno/etc/certificate/_archive/$ID/fullchain.pem
sudo rm /usr/syno/etc/certificate/_archive/$ID/privkey.pem
# создать symlink'и на certbot
sudo ln -s "$CERTBOT_PATH/fullchain.pem" \
/usr/syno/etc/certificate/_archive/$ID/cert.pem
sudo ln -s "$CERTBOT_PATH/fullchain.pem" \
/usr/syno/etc/certificate/_archive/$ID/fullchain.pem
sudo ln -s "$CERTBOT_PATH/privkey.pem" \
/usr/syno/etc/certificate/_archive/$ID/privkey.pem
Теперь DSM и nginx используют ровно те же файлы, которые обновляет certbot в контейнере.
6. Перезагрузка nginx для применения новых сертификатов
После каждого успешного certbot renew достаточно перезагрузить nginx или перезагрузить конфиг nginx,
чтобы он подхватил новые файлы.
Команда через SSH
sudo synosystemctl reload nginx || sudo synosystemctl restart nginx
7. Автоматизация перезагрузки nginx через Task Scheduler DSM
- DSM → Control Panel → Task Scheduler.
- Create → Scheduled Task → User-defined script.
General:
- Name:
Reload nginx certs. - User:
root.
Schedule:
- Например, каждый день в 03:30 или раз в 6 часов — чуть позже, чем период проверки
CERTBOT_RENEW_INTERVAL.
Task Settings → User-defined script:
synosystemctl reload nginx || synosystemctl restart nginx
Сохрани задачу и один раз запусти её вручную через Run, чтобы убедиться, что ошибок нет.