Docs Deployment
1. Summary
Goal: Автоматическая сборка и деплой документации без нагрузки на VPS. Вся тяжёлая webpack-компиляция происходит в GitHub Actions.
User Value: Push в main → через 2-7 минут изменения на docs.goloot.online. Никаких ручных действий, никакого OOM на сервере.
2. How It Works
Deployment Paths
- Docs Content (~2 min)
- Backend API (~7 min)
- Manual Trigger
Триггер: Изменение .md/.mdx файлов в docs-site/docs/
Что происходит:
- GitHub Actions запускается
- Сборка статики (
pnpm docusaurus build) - Коммит
docs-site/build/в репозиторий - Webhook триггерит Dokploy
- Dokploy деплоит nginx с готовыми файлами
Пропускается: Ожидание backend, генерация OpenAPI
Триггер: Изменение schemas/, routes/, server.ts
Что происходит:
- Ожидание 5 минут (Dokploy деплоит backend)
- Polling health check до готовности API
- Fetch OpenAPI spec с production
- Генерация MDX из OpenAPI
- Сборка статики
- Коммит и деплой
Зачем ждать: Backend должен быть задеплоен до получения актуальной спецификации
Триггер: GitHub Actions → Run workflow
Опции:
Skip deployment wait— пропустить 5 минут ожидания (если backend уже задеплоен)
Всегда делает: Полную регенерацию OpenAPI docs (независимо от последнего коммита)
Use case: Предыдущий запуск упал, нужен ре-деплой, или изменения вне git
Trigger Paths
| Паттерн | Тип сборки | Время |
|---|---|---|
backend/src/**/schemas/** | Full (OpenAPI) | ~7 min |
backend/src/**/routes/** | Full (OpenAPI) | ~7 min |
backend/src/server.ts | Full (OpenAPI) | ~7 min |
docs-site/docs/**/*.md | Quick | ~2 min |
docs-site/docs/**/*.mdx | Quick | ~2 min |
docs-site/plugins/** | Quick | ~2 min |
docs-site/docusaurus.config.ts | Quick | ~2 min |
docs-site/sidebars-*.ts | Quick | ~2 min |
docusaurus-plugin-visibility.ts собирает visibility: owner frontmatter при сборке. Новые owner-only файлы появятся в sidebar только после пересборки.
What Gets Committed
| Артефакт | Когда коммитится | Куда | Описание |
|---|---|---|---|
docs-site/build/ | Всегда | docs-build branch | Готовая статика для nginx |
docs-site/api-docs/ | При изменении backend | docs-build branch | Сгенерированные MDX |
docs-site/specs/openapi.json | При изменении backend | docs-build branch | Снапшот спецификации |
Сгенерированные файлы пушатся в ветку docs-build, а не в main. Это предотвращает конфликты при push от разработчиков — main остаётся чистым.
Локально: Все разработчики и агенты работают только в main. Переключаться на docs-build не нужно.
docs-build ветка:
- Существует только на remote (GitHub)
- Создаётся и обновляется только GitHub Actions
- Используется только Dokploy для деплоя
Это исключает конфликты при параллельной работе нескольких агентов/разработчиков.
3. ADR (Architectural Decisions)
Почему Pre-built Assets?
Проблема: Сборка Docusaurus требует ~4GB RAM и много CPU. VPS может иметь ограниченные ресурсы.
Решение: Билдим в GitHub Actions (7GB RAM, fast CPU), коммитим готовую статику.
Альтернативы (отклонены):
- Сборка на VPS — риск OOM, медленно
- Docker multi-stage build — всё равно нужен RAM на сборку
Последствия:
- Репозиторий содержит
build/папку (~50MB) - Dockerfile просто копирует файлы в nginx
- Нет зависимости от ресурсов VPS
Почему 5 минут ожидания?
Проблема: GitHub Actions триггерится одновременно с Dokploy. Нужно дождаться деплоя backend.
Решение: Фиксированная задержка 5 минут + polling health check.
Альтернативы (отклонены):
- Webhook от Dokploy → GitHub — сложная настройка
- Только polling без задержки — много лишних запросов
Последствия: Надёжно, но увеличивает время full-цикла на 5 минут.
Почему не Dokploy webhook?
Dokploy может отправлять webhook при завершении деплоя, но:
- Требует настройки GitHub App или Personal Access Token
- Сложнее дебажить
- GitHub Actions нельзя триггерить через обычный HTTP webhook
Простая задержка + polling работает надёжно.
Почему Webhook для Docs деплоя?
Проблема: Dokploy Autodeploy триггерится на ЛЮБОЙ push, но нам нужен деплой только после сборки.
Решение: Autodeploy выключен для docs-site. GitHub Actions вызывает webhook после успешной сборки.
Последствия: Контролируемый деплой, но требует настройки секрета DOKPLOY_DOCS_WEBHOOK.
4. Architecture
Backend API Change Flow
Docs Content Change Flow
Infrastructure Components
| Компонент | Роль | URL |
|---|---|---|
| GitHub Actions | Сборка, генерация | .github/workflows/generate-docs.yml |
| Dokploy (backend) | Autodeploy backend | api.goloot.online |
| Dokploy (docs) | Deploy по webhook | docs.goloot.online |
| nginx | Раздача статики | Внутри docs container |
5. Configuration
GitHub Secrets
| Secret | Назначение | Как получить |
|---|---|---|
DOKPLOY_DOCS_WEBHOOK | Триггер деплоя docs | Dokploy → Docs Service → Deployments → Webhook URL |
SWAGGER_API_KEY | Доступ к /docs/json | Переменная SWAGGER_API_KEY в backend |
Dokploy: Backend Service
| Параметр | Значение |
|---|---|
| Repository | github.com/gosystems25/goLoot |
| Branch | main |
| Dockerfile Path | backend/Dockerfile |
| Autodeploy | ON |
Dokploy: Docs Service
| Параметр | Значение |
|---|---|
| Repository | github.com/gosystems25/goLoot |
| Branch | docs-build ⚠️ |
| Dockerfile Path | docs-site/Dockerfile |
| Build Context | / (корень репозитория) |
| Autodeploy | OFF (через webhook) |
Dokploy должен деплоить из ветки docs-build, а не main. В этой ветке находятся pre-built артефакты.
Domain Configuration
| Поле | Значение |
|---|---|
| Host | docs.goloot.online |
| Port | 80 |
| HTTPS | Let's Encrypt |
6. Operations
Manual Regeneration
- GitHub → Actions → Build Docs Site
- Click "Run workflow"
- Check "Skip deployment wait" if backend already deployed
- Click "Run workflow"
Force Redeploy
Dokploy → Docs Service → Deploy
Troubleshooting
- 502 Bad Gateway
- Commit Failed
- Push 403 Error
- OOM при сборке
- OpenAPI Fetch Failed
Причина: Container не запущен или неправильный порт
Решение:
- Dokploy → Logs — проверить ошибки
- Domains → убедиться Port =
80 - Terminal →
ls -la /usr/share/nginx/html/
Причина: .gitignore блокирует build/
Решение: Использовать git add -f docs-site/build (force флаг)
Причина: Недостаточно прав GitHub Actions
Решение:
- Проверить
permissions: contents: writeв workflow - Repository Settings → Actions → General → Workflow permissions
Причина: Недостаточно памяти для webpack
Решение: Увеличить NODE_OPTIONS: '--max-old-space-size=4096' в workflow
Сборка происходит в GitHub Actions (7GB RAM), не на VPS. OOM маловероятен.
Причина: Backend не задеплоен или недоступен
Решение:
- Проверить
https://api.goloot.online/health - Проверить
https://api.goloot.online/docs/json - Убедиться, что
SWAGGER_API_KEYsecret актуален
Workflow File Location
.github/workflows/generate-docs.yml
Ключевые шаги:
Check if backend API changed— определяет тип сборкиWait for Dokploy deployment— 5 мин ожидание (условно)Fetch OpenAPI spec— получение спецификации (условно)Build static site— всегдаTrigger Dokploy docs deployment— webhook
7. File Structure
docs-site/
├── Dockerfile # Простой nginx, раздающий готовые файлы
├── build/ # Собранная статика (коммитится GitHub Actions)
├── api-docs/ # Сгенерированные MDX из OpenAPI
├── specs/
│ └── openapi.json # Снапшот OpenAPI спецификации
├── docs/
│ └── knowledge-base/ # Ручная документация
├── plugins/
│ └── docusaurus-plugin-visibility.ts
└── docusaurus.config.ts
8. Related
- Docs Access System — система контроля доступа к документации
- Architecture Overview — общая архитектура проекта