# Централизованный выпуск SSL сертификатов для смохостинга

**URL:** <https://forum.samohosting.ru/t/czentralizovannyj-vypusk-ssl-sertifikatov-dlya-smohostinga/546>\
**Category:** Утилиты самохостинга\
**Created:** [12.Июль.2025 14:43:18 UTC](https://forum.samohosting.ru/t/czentralizovannyj-vypusk-ssl-sertifikatov-dlya-smohostinga/546 "2025-07-12T14:43:18Z")\
**Posts on this page:** 1\
**Showing post:** 2

<div class="post-metadata">

**Author:** ![KRom](https://forum.samohosting.ru/user_avatar/forum.samohosting.ru/krom/32/362_2.png) [@KRom](https://forum.samohosting.ru/u/KRom)\
**Post date:** [19.Июль.2025 10:11:31 UTC](https://forum.samohosting.ru/t/czentralizovannyj-vypusk-ssl-sertifikatov-dlya-smohostinga/546/2 "2025-07-19T10:11:31Z")

</div>

В общем, сам спросил, сам и отвечаю, при помощи GPT и какой-то матери:

1. Поднял менеджер секретов. После изучения решил остановиться на [OpenBao](https://openbao.org/) - не очень дружественный, но зато очень функциональный и легкий + форк hashicorp vault, а это значит, что совместим с промышленным эталоном (Кстати, это единственный менеджер секретов, который умеет OIDC в бесплатной версии)
2. В kv хранилище волта добавил ключ для cloudflare, чтобы проходить acme проверку по DNS (требуется для wildcard сертификатов)
3. Поднял [vault-agent](https://openbao.org/docs/agent-and-proxy/agent/), который из волта получает `cloudflare_api_token` складывает его в /secrets/cloudlare\_token
4. Собрал контейнер с openbao и lego, написал немного скриптов на баше, которые  
4.1. Получают wildcard сертификаты letsencrypt и загружают их в волт в kv хранилище по пути `kv/certs/<domain>` (в openbao есть pki хранилище, но, насколько я понял, оно не очень походит для LE)  
4.2. Запускают крон, который раз в сутки проверяет дату действия сертификатов и обновляет при необходимости  
4.3. При обновлении сертификатов вызывает webhook в [semaphore UI](https://semaphoreui.com/)
5. Поскольку openbao требует тоже сертификаты (в production режиме), то собрал отдельный контейнер `openbao-docker`  
5.1. На основе openbao + docker-cli + пользователь и права для доступа к docker.sock  
5.2. Рядом с openbao поднял vault-agent, который подписывается на сертификаты в openbao и стягивает их в файлы, если сертификат обновлен, то вызывает `docker exec openbao kill -HUP 1` что приводит к перечитыванию сертификатов самими openbao
6. В нужных сервисах поднимаю `vault-agent` для получения сертификатов и прописывания их в нужные места
7. Завел репу `ansible_cert_deploy` и прописал ее в [Semaphore UI](https://semaphoreui.com/), завел таску и триггер ее из пункта 4.3.
8. Пока еще не начал писать плейбуки, но идея в том, чтобы через ansible деплоить сертификаты туда, где не поддерживается `vault-agent`, например `Mikrotik` (но в последних версиях, насколько я знаю, уже есть полноценная поддержка certbot)

В итоге вместо кучи tls сертификатов с ограничением по количеству вызовов API LetsEncrypt в неделю у меня один сервис получает сертификаты для домена и всех его поддоменов и все остальные сервисы могут получить доступ к нему + автоатически подтягивать новый сервтификат при перевыпуске, тот же [traefik](https://traefik.io/traefik) вместо выпуска сертификата для каждого сервиса использует один из предварительно подготовленых, а поскольку у меня 4 инстанса с traefik, то они используют общий сертификат из волта, а не выпускают каждый для себя.

**Ну и немного скринов:**  
Как выглядит сертификат в openbao

 ![image](https://forum.samohosting.ru/uploads/default/original/1X/177ac71be990c390db5a38aa29bbff42535efd1e.png)

docker-compose сервиса, который получает и загружает сертификаты в openbao

 ![image](https://forum.samohosting.ru/uploads/default/original/1X/ff17dab710dbf41892f3a2857b3dcc94c2c0dbb0.png)

Кусок конфига, который сохраняет файлы сертификата и обновляет openbao при изменении сертификата

 ![image](https://forum.samohosting.ru/uploads/default/original/1X/fccec0fab2de4b7e484ae48015e05663482859d8.png)

“суперсложный” скрипт, который получает или обновляет сертификаты

 ![image](https://forum.samohosting.ru/uploads/default/original/1X/78726f0158dde442ade51717d625a232da5df04b.jpeg)

Самое сложное тут было завернуть все в `docker-entrypoint.sh` так, чтобы

1. Переменные окружения со списком доменов были доступны во всех скриптах
2. Все работало в рамках одного основного процесса
3. Крон выводил stdout скрипта в консоль докера, а не пытался отправить sendmail

---

_[View the full topic](https://forum.samohosting.ru/t/czentralizovannyj-vypusk-ssl-sertifikatov-dlya-smohostinga/546)._
