Skip to main content

Docs Access System

1. Summary

Goal: Полностью приватная документация. Доступ только через логин в админ-панели (с 2FA).

Как работает: Traefik ForwardAuth проверяет docs_session cookie перед каждым запросом к docs.goloot.online. Без cookie — пустая белая страница (403). С cookie — полный доступ ко всему контенту.

User Value: Никто кроме админа не имеет доступа к документации. Вся информация приватна.


2. Business Logic

Access Model

СостояниеЧто видит пользователь
Не залогинен в админкеПустая белая страница (HTTP 403)
Залогинен в админке (2FA)Весь контент: Knowledge Base + API Reference

Единственный способ получить доступ — логин в админ-панели (admin.goloot.online), который уже защищён 2FA (TOTP). После логина устанавливается docs_session cookie на домен .goloot.online, который даёт доступ к docs.

Как включить/выключить доступ

Доступ контролируется через Traefik конфиг в Dokploy (не через код):

ДействиеЧто сделать
Закрыть доступДобавить middleware docs-forward-auth в websecure роутер
Открыть доступУбрать middleware → middlewares: []

Подробный Traefik конфиг — в Services Deployment → Docs Site.

Неактивная функциональность (сохранена в коде)

В коде сохранена, но не подключена, функциональность многоуровневого доступа:

ФункцияКомпонентыСтатус
Viewer invite-ссылкиDocsVisibilityService, роуты /docs/inviteBackend работает, ForwardAuth игнорирует docs_viewer cookie
Owner 2FA на docsTwoFactorModal, ActivationModal, useVisibility hookКомпоненты не подключены в Root.tsx
Visibility по страницамdocusaurus-plugin-visibility, frontmatter visibility: owneruseCanSee() всегда возвращает true

Как вернуть:

  1. Viewer invite: в ForwardAuth добавить проверку docs_viewer cookie (~3 строки)
  2. Owner 2FA: в Root.tsx вернуть <TwoFactorModal /> и <ActivationModal />
  3. Visibility по страницам: в useCanSee() вернуть проверку уровней

Весь код — в git history, коммит feat(docs): make docs-site fully private.


3. ADR (Architectural Decisions)

Почему Traefik ForwardAuth?

Проблема: Документация на отдельном домене (docs.goloot.online), нужна проверка доступа.

Решение: Traefik вызывает /admin-auth/verify-docs перед каждым запросом.

Альтернативы (отклонены):

  • Client-side проверка — легко обойти
  • Nginx auth_request — менее гибко чем Traefik

Последствия: Каждый запрос к docs проходит через backend проверку.


4. Architecture

Authentication Flow

Key Components

КомпонентПутьОписание
AdminAuthRoutesbackend/src/domains/admin/routes/admin-auth.routes.tsForwardAuth endpoint verify-docs
VisibilityContextdocs-site/src/contexts/VisibilityContext.tsxReact контекст (упрощён — всегда true)

5. Cookies & Storage

CookieИмяDomainMax-AgeHttpOnlySecure
Admin Sessiondocs_session.goloot.online8 часовYesYes

Cookie устанавливается при логине в админ-панель (admin.goloot.online). Работает на всех поддоменах .goloot.online благодаря SameSite=Lax.


6. API Endpoints

МетодЭндпоинтОписаниеAuth
GET/admin-auth/verify-docsForwardAuth endpointCookie

Вызывается Traefik'ом автоматически перед каждым запросом к docs.goloot.online. Возвращает 200 (OK, есть docs_session) или 403 (пустое тело, нет cookie).

Traefik ForwardAuth Setup (Dokploy)

ForwardAuth настраивается в Dokploy → Docs Service → Advanced → Traefik. Это инфраструктурный конфиг reverse proxy, не код приложения.

Два обязательных условия:

  1. Middleware docs-forward-auth определён с forwardAuth.address → URL verify-docs эндпоинта
  2. Middleware подключён к websecure роутеру (НЕ пустой [])
# Dokploy → Docs Service → Advanced → Traefik
http:
routers:
goloot-docssite-XXXXX-router-websecure-N:
rule: Host(`docs.goloot.online`)
service: goloot-docssite-XXXXX-service-N
middlewares:
- docs-forward-auth # ← ОБЯЗАТЕЛЬНО! Без этого — доступ без проверки
entryPoints:
- websecure
tls:
certResolver: letsencrypt
middlewares:
docs-forward-auth:
forwardAuth:
address: https://api.goloot.online/admin-auth/verify-docs
Частые ошибки
  • middlewares: [] — middleware определён, но не подключён → Traefik пропускает всех без проверки
  • Middleware определён, но не указан в секции middlewares роутера → то же самое
  • address указывает на неправильный backend → 403 для всех

7. Security Considerations

Уровни защиты

УровеньМеханизмЧто защищает
Traefik ForwardAuthПроверка docs_session cookieБлокирует все запросы без admin сессии
Admin 2FA (TOTP)Требуется при логине в админкуЗащищает от компрометации пароля
Cookie flagsHttpOnly, Secure, SameSite=LaxXSS, MITM, CSRF

Экстренный kill switch

Смена JWT_SECRET в Dokploy → Backend → Environment → Redeploy мгновенно инвалидирует все docs_session cookies и JWT-токены админки. После смены — просто перелогиниться.


  • Docs Deployment — CI/CD для docs site, visibility plugin
  • User Management — управление пользователями в админке