Высокий уровень#

Пользователь → 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, submodule docs/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 не используются.