В общем, сам спросил, сам и отвечаю, при помощи GPT и какой-то матери:
- Поднял менеджер секретов. После изучения решил остановиться на OpenBao - не очень дружественный, но зато очень функциональный и легкий + форк hashicorp vault, а это значит, что совместим с промышленным эталоном (Кстати, это единственный менеджер секретов, который умеет OIDC в бесплатной версии)
- В kv хранилище волта добавил ключ для cloudflare, чтобы проходить acme проверку по DNS (требуется для wildcard сертификатов)
- Поднял vault-agent, который из волта получает
cloudflare_api_tokenскладывает его в /secrets/cloudlare_token - Собрал контейнер с openbao и lego, написал немного скриптов на баше, которые
4.1. Получают wildcard сертификаты letsencrypt и загружают их в волт в kv хранилище по путиkv/certs/<domain>(в openbao есть pki хранилище, но, насколько я понял, оно не очень походит для LE)
4.2. Запускают крон, который раз в сутки проверяет дату действия сертификатов и обновляет при необходимости
4.3. При обновлении сертификатов вызывает webhook в semaphore UI - Поскольку openbao требует тоже сертификаты (в production режиме), то собрал отдельный контейнер
openbao-docker
5.1. На основе openbao + docker-cli + пользователь и права для доступа к docker.sock
5.2. Рядом с openbao поднял vault-agent, который подписывается на сертификаты в openbao и стягивает их в файлы, если сертификат обновлен, то вызываетdocker exec openbao kill -HUP 1что приводит к перечитыванию сертификатов самими openbao - В нужных сервисах поднимаю
vault-agentдля получения сертификатов и прописывания их в нужные места - Завел репу
ansible_cert_deployи прописал ее в Semaphore UI, завел таску и триггер ее из пункта 4.3. - Пока еще не начал писать плейбуки, но идея в том, чтобы через ansible деплоить сертификаты туда, где не поддерживается
vault-agent, напримерMikrotik(но в последних версиях, насколько я знаю, уже есть полноценная поддержка certbot)
В итоге вместо кучи tls сертификатов с ограничением по количеству вызовов API LetsEncrypt в неделю у меня один сервис получает сертификаты для домена и всех его поддоменов и все остальные сервисы могут получить доступ к нему + автоатически подтягивать новый сервтификат при перевыпуске, тот же traefik вместо выпуска сертификата для каждого сервиса использует один из предварительно подготовленых, а поскольку у меня 4 инстанса с traefik, то они используют общий сертификат из волта, а не выпускают каждый для себя.
Ну и немного скринов:
Как выглядит сертификат в openbao
docker-compose сервиса, который получает и загружает сертификаты в openbao
Кусок конфига, который сохраняет файлы сертификата и обновляет openbao при изменении сертификата
“суперсложный” скрипт, который получает или обновляет сертификаты
Самое сложное тут было завернуть все в docker-entrypoint.sh так, чтобы
- Переменные окружения со списком доменов были доступны во всех скриптах
- Все работало в рамках одного основного процесса
- Крон выводил stdout скрипта в консоль докера, а не пытался отправить sendmail



