Получение и управление сертификатами Let's Encrypt на Synology DiskStation Manager (DSM) с помощью certbot


Введение

В статье описывается, как:

  • Выпускать и автоматически продлевать сертификаты Let’s Encrypt в Docker‑контейнере certbot с DNS‑подтверждением через Cloudflare на Synology (Container Manager).
  • Привязать эти сертификаты к DSM через symlink, чтобы веб‑интерфейс и встроенный nginx всегда использовали актуальные ключи.
  • Перезагружать nginx по расписанию, автоматически подхватывая обновлённые сертификаты.

1. Подготовка домена и Cloudflare

  1. В панели Cloudflare:
  • Добавь домен (например, example.org) в Cloudflare.
  1. Создай API‑токен для DNS‑подтверждения:
  • Cloudflare → My Profile → API Tokens → Create Token.
  • Шаблон: Edit zone DNS.
  • Zone Resources: IncludeSpecific zone → выбери нужный домен.
  • Сохрани сгенерированный токен.

2. Подготовка каталогов на Synology

  1. Через SSH на NAS:
sudo mkdir -p /volume1/docker/certbot/certs
sudo mkdir -p /volume1/docker/certbot/var
  1. Приведи владельца/права (если не заморачиваешься с отдельным пользователем, оставляешь 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. Первый запуск и проверка сертификатов

  1. Запуск контейнера:
cd /volume1/docker/certbot
docker compose up -d certbot
  1. После успешного первого цикла проверь наличие сертификатов:
ls -l /volume1/docker/certbot/certs/live/example.org

В каталоге должны быть:

  • fullchain.pem
  • privkey.pem и другие файлы certbot.

5. Связка certbot ↔ DSM через _archive

  1. Разовый импорт через DSM (удобнее сначала “зарегистрировать” сертификат):
  • Панель управления → Security → вкладка Certificate.
  • AddAdd a new certificateImport certificate.
  • Укажи временные файлы (можно скопировать fullchain.pem и privkey.pem во временную папку).
  • Назови сертификат, например LetsEncrypt-susano.
  • Привяжи его к DSM/Web Station/Reverse Proxy через кнопку Settings.
  1. Узнай ID архива сертификатов:
sudo cat /usr/syno/etc/certificate/_archive/DEFAULT
# выведет ID, например BuUdf3
  1. Свяжи 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

  1. DSM → Control PanelTask Scheduler.
  2. CreateScheduled TaskUser-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, чтобы убедиться, что ошибок нет.