Refactor README, architecture, and backup documentation to emphasize the use of Vaultwarden for credential management across various services. Update scripts for Nextcloud, Gitea, Paperless, and others to reference Vaultwarden for sensitive information. Remove outdated references to previous backup strategies and ensure clarity on credential retrieval processes. This improves security practices and streamlines backup operations.
6.2 KiB
Инструкция: выпуск сертификата Let's Encrypt (DNS-01)
Универсальная инструкция для использования как промпт в следующих проектах. Подходит, когда HTTP-01 недоступен (порт 80 закрыт, блокировки, инстанс за NAT).
Когда использовать DNS-01
- HTTP-01 не срабатывает: таймаут, «Connection refused», порт 80 недоступен с интернета, провайдер или регион блокирует запросы от Let's Encrypt.
- DNS-01: проверка владения доменом по TXT-записи
_acme-challenge.<домен>. До сервера стучаться не нужно — важен только DNS.
Общий алгоритм
- Выбрать DNS-провайдера домена и проверить, есть ли у него API или плагин для certbot/acme.sh.
- Установить certbot и плагин для этого DNS (или использовать acme.sh с DNS API).
- Создать файл учётных данных (логин/API-токен провайдера), права 600.
- Запросить сертификат:
certbot certonly --authenticator dns-<провайдер> ... -d example.com. - Подложить полученные
fullchain.pemиprivkey.pemв reverse proxy (Nginx Proxy Manager, nginx, Caddy и т.д.). - Настроить автообновление (systemd timer certbot + deploy-hook при продлении).
Пример: Beget.com (certbot-dns-beget-api)
Условия: домен на Beget, доступ к API (логин + пароль или отдельный API-пароль).
-
Установка (Debian/Ubuntu):
apt install certbot pip3 install certbot-dns-beget-api # или: python3 -m pip install certbot-dns-beget-api --break-system-packages -
Файл учётных данных (например
/root/.secrets/certbot/beget.ini):dns_beget_api_username = ВАШ_ЛОГИН_BEGET dns_beget_api_password = ВАШ_ПАРОЛЬ_ИЛИ_API_ПАРОЛЬchmod 600 /root/.secrets/certbot/beget.iniHomelab (Vaultwarden): креды хранятся в Vaultwarden (объект beget). Деплой с хоста Proxmox:
/root/scripts/deploy-beget-credentials.shСкрипт генерирует
beget.iniиз Vaultwarden, атомарно пушит в CT 100, ставит права 600 и pre-hook проверки. Ротация: сменил пароль в Vaultwarden → запустилdeploy-beget-credentials.sh→ готово. -
Запрос сертификата:
certbot certonly \ --authenticator dns-beget-api \ --dns-beget-api-credentials /root/.secrets/certbot/beget.ini \ --dns-beget-api-propagation-seconds 120 \ -d example.com \ --non-interactive \ --agree-tos \ --email your@email.com -
Где лежат файлы после выпуска:
- Сертификат:
/etc/letsencrypt/live/<домен>/fullchain.pem - Ключ:
/etc/letsencrypt/live/<домен>/privkey.pem
- Сертификат:
-
Интеграция с Nginx Proxy Manager (NPM):
- Либо вручную скопировать в каталог custom_ssl (например
custom_ssl/npm-<id>/fullchain.pemиprivkey.pem) и перезагрузить nginx в контейнере NPM. - Либо добавить запись в БД NPM (таблица
certificate, providerother) и положить те же файлы в каталог, на который ссылается конфиг nginx (напримерcustom_ssl/npm-<certificate_id>/).
- Либо вручную скопировать в каталог custom_ssl (например
-
Продление и deploy-hook (чтобы после
certbot renewсертификат автоматически подхватывался NPM):# /etc/letsencrypt/renewal-hooks/deploy/copy-to-npm.sh # RENEWED_LINEAGE = путь к обновлённому сертификату, например /etc/letsencrypt/live/example.com if [ "$RENEWED_LINEAGE" = "/etc/letsencrypt/live/EXAMPLE_DOMAIN" ]; then cp "$RENEWED_LINEAGE/fullchain.pem" /path/to/npm/custom_ssl/npm-ID/ cp "$RENEWED_LINEAGE/privkey.pem" /path/to/npm/custom_ssl/npm-ID/ chmod 644 /path/to/npm/custom_ssl/npm-ID/fullchain.pem chmod 600 /path/to/npm/custom_ssl/npm-ID/privkey.pem docker exec CONTAINER_NPM nginx -s reload fiСделать скрипт исполняемым:
chmod +x ... -
Проверка автообновления: таймер certbot обычно уже включён:
systemctl list-timers | grep certbot
Другие DNS-провайдеры (идеи для промпта)
- Cloudflare:
certbot-dns-cloudflare, переменныеdns_cloudflare_api_tokenилиdns_cloudflare_email+dns_cloudflare_api_key. - Reg.ru: плагин
certbot-dns-regru, свои переменные в credentials-файле. - NIC.ru:
certbot-dns-nicru. - Без API:
certbot certonly --manual --preferred-challenges dns -d example.com— выводит TXT-значение, пользователь вручную добавляет запись в DNS, затем продолжает по Enter.
Краткий чеклист для нового домена/проекта
- Домен и DNS у одного провайдера; выяснить, есть ли API/плагин для ACME DNS-01.
- Установить certbot и нужный DNS-плагин.
- Создать credentials-файл (chmod 600), не коммитить в git.
- Выпустить сертификат:
certbot certonly --authenticator dns-... -d domain. - Подложить fullchain.pem и privkey.pem в reverse proxy.
- Добавить deploy-hook для продления и перезагрузки nginx/прокси.
- Убедиться, что certbot.timer включён для автоматического renew.