Высокий уровень#
Пользователь → Caddy (TLS, Basic Auth) → файлы в /srv/docs
├── / → data/portal/public/
└── /docs/* → data/<продукт>/...
CI → publish-api (:9032, тот же контейнер) → запись в /srv/docs + hugo порталаТом ./data монтируется как /srv/docs с записью (для publish-api). Сертификаты и служебные данные Caddy — в именованных томах caddy_data и caddy_config.
Контейнер#
read_only: true— корневая ФС контейнера неизменяема.tmpfsдля/tmpи/config/caddy— временные файлы и автосохранение конфигурации Caddy не требуют записи в образ.
Портал и продукты#
- Портал — отдельный Hugo-проект в
data/portal/. В продакшене в хаб попадает толькоpublic/послеhugo --minify. - Руководство EasyDocs — Hugo-проект в
docs/, оформление — тема Hugo Book (MIT, submoduledocs/themes/hugo-book, тег v13); сборка требует Hugo Extended ≥ 0.146 (в CI — образpeaceiris/hugo:v0.146.4-full). - Продукты — произвольные статические сайты в
data/<slug>/<тип>/(часто тоже результатhugoили экспорт OpenAPI).
Карточки на главной строятся из data/portal/data/products.yml. В эксплуатации этот файл обновляет сервис publish-api при публикации ZIP из CI (и пересобирает портал Hugo на сервере).
Логи#
Доступ к сайту логируется в JSON на stdout контейнера — удобно подключать сбор логов Docker / SIEM. Файловые логи на read-only root не используются.