architect/arh/concept/platform-concept.md

type: concept
title: "Концепция платформы"
version: 1.0.0
date: 2026-04-02
status: approved


Концепция платформы


1. ПРИНЦИП

Платформа — это набор Docker-контейнеров на одном или нескольких серверах.

Хост-сервер предоставляет только:

OS · SSH · UFW · fail2ban · Docker Engine · WireGuard · cron

Всё остальное — в контейнерах. Платформа одинаково работает на 1 сервере (старт) и на N серверах (масштаб) — меняется только распределение контейнеров по машинам.


2. СЕМЬЯ — РОЛИ СЕРВЕРОВ

Каждый сервер в кластере играет одну из ролей:

┌──────────────────────────────────────────────────────────────┐
│  МАТЬ                                                        │
│  Главный сервер. Один в кластере.                            │
│  Содержит CORE — без него платформа не работает.             │
├──────────────────────────────────────────────────────────────┤
│  ДОЧКА                                                       │
│  Дополнительный сервер. Таких может быть сколько угодно.     │
│  = Мать без CORE.                                            │
│  Несёт СЫН и/или ИСПОЛНИТЕЛЬ — в зависимости от задачи.    │
└──────────────────────────────────────────────────────────────┘

Компоненты (стеки), которые живут на серверах:

Компонент Где Описание
BASE на каждом сервере portainer-agent + wireguard
CORE только Мать postgres + gitea + authelia + nginx
OPS только Мать portainer + uptime-kuma + vaultwarden
MONITOR только Мать telegram-bot алерты
BACKUP только Мать restic сервер
ОТЕЦ Мать (или отдельно) creator-claude — архитектор
СЫН Мать или Дочка proj-claude — проектор
ИСПОЛНИТЕЛЬ Мать или Дочка postgres + redis + nginx + проекты

3. КОМПОНЕНТЫ ПОДРОБНО

BASE — на каждом сервере, ставится первым

Контейнер Образ Роль
base-portainer-agent portainer/agent → Portainer на Матери по VPN :9001
wireguard хост (не контейнер) VPN: хаб на Матери, клиент на Дочках

CORE — только на Матери, критичный

Контейнер Образ Роль
core-postgres postgres:16-alpine БД для Gitea и Authelia
core-gitea gitea/gitea git, источник истины, OAuth провайдер
core-authelia authelia/authelia SSO forward-auth для всех UI
core-nginx nginx:alpine единая точка входа :80/:443, SSL

Если CORE упал — управление стоит, но сайты проектов продолжают работать.


OPS — управление платформой

Контейнер Образ Роль
ops-portainer portainer/portainer-ce центральный UI для всех контейнеров кластера
ops-kuma louislam/uptime-kuma мониторинг всех сервисов
ops-vaultwarden vaultwarden/server хранение секретов команды

MONITOR + BACKUP

Контейнер Образ Роль
mon-telegram python:alpine бот алертов → Telegram
backup-restic restic/rest-server принимает бэкапы от Дочек по VPN

Cron на хосте Матери:

04:00  pg_dump всех БД  /var/backups/
04:30  restic backup /opt/  Beget S3
05:00  restic forget (ротация снапшотов)
08:00  Gitea push mirror  GitHub

ОТЕЦ (CREATOR) — архитектор-создатель

Контейнер Образ Роль
creator-claude claude-code интерактивный терминал
Воркспейс (rw):
  architect/    стандарты, концепции, паттерны, ADR
  library/      компонентная библиотека
  system/       агенты, планировщик
  infra/        описание инфраструктуры

Изолирован:  volume creator-claude-auth:/root/.claude/
Прокси:      HTTPS_PROXY=socks5://{eu-proxy}:1080

Отец видит архитектуру и инфраструктуру. Не имеет прямого SSH и Portainer доступа — только пишет конфиги и коммитит в git.


СЫН (PROJECTOR) — менеджер проектов

Контейнер Образ Роль
proj-claude claude-code интерактивный терминал
Воркспейс:
  projects/     проекты клиентов (rw)
  architect/    стандарты (ro)
  library/      библиотека (ro)

Изолирован:  volume proj-claude-auth:/root/.claude/
Прокси:      HTTPS_PROXY=socks5://{eu-proxy}:1080

Каждый Сын изолирован: видит только свои проекты. На Матери и на каждой Дочке может быть свой Сын.


ИСПОЛНИТЕЛЬ (EXECUTOR) — рантайм проектов

Контейнер Образ Роль
exec-postgres postgres:16-alpine БД проектов (отдельная БД на каждый проект)
exec-redis redis:7-alpine кэш, очереди
exec-nginx nginx:alpine домены проектов, SSL
project-{name} кастомный стек конкретного проекта

4. ДОЧКА — ВАРИАНТЫ КОНФИГУРАЦИИ

Дочка — это дополнительный сервер с BASE. Что на неё ставить — зависит от задачи:

Вариант Стеки Когда использовать
Проектор BASE + СЫН отдельный проектор для команды / клиента
Исполнитель BASE + ИСПОЛНИТЕЛЬ только рантайм проектов
Полная BASE + СЫН + ИСПОЛНИТЕЛЬ проектор + его проекты на одном сервере

5. СЕТЬ

Топология WireGuard

                         ИНТЕРНЕТ
                             │
          ┌──────────────────┼──────────────────┐
          ▼                  ▼                  ▼
      :80/:443           :80/:443           :1080 SOCKS5
          │                  │                  │
    ┌─────┴──────┐     ┌─────┴──────┐     ┌─────┴──────┐
    │   МАТЬ     │     │   ДОЧКА    │     │  EU PROXY  │
    │ 10.10.0.1  │◄VPN►│ 10.10.0.x  │     │            │
    │  WG HUB    │     │  WG CLIENT │     │            │
    └────────────┘     └────────────┘     └────────────┘
          ▲                                     ▲
          └──── Claude Code HTTPS_PROXY ────────┘

Что через VPN (закрыто снаружи)

Portainer Agent   Portainer Server   :9001
Restic Agent      Restic Server      :8000
Uptime Kuma       healthcheck сервисов
git pull/push     Gitea              :3000

Что напрямую (открыто снаружи)

Пользователи  → ИСПОЛНИТЕЛЬ    :80/:443
Claude Code   → EU Proxy       :1080 → Anthropic API
SSH           → все серверы    :22
Let's Encrypt → ACME           :80

Docker-сети на каждом сервере

proxy-net    Nginx видит все сервисы (внешняя, межстековая)
core-net     внутри CORE стека
ops-net      внутри OPS стека
exec-net     внутри ИСПОЛНИТЕЛЯ

6. РОЛИ И ДОСТУП

Три роли

Роль Инструменты Что видит
Сисадмин SSH, Portainer, Gitea admin всё
Архитектор Claude Code (creator) architect/ library/ infra/ + вниз
Проектор Claude Code (proj) только свои projects/

Контекст передаётся только сверху вниз:

Сисадмин → Архитектор → Проектор

Обратно идёт только результат (готово / ошибка), не контекст.

Разделение Сисадмин / Архитектор

Архитектор пишет конфиги (docker-compose, nginx, .env.example) и коммитит в git.
Сисадмин применяет — git pull → docker compose up → nginx reload.

Это предотвращает случайное применение изменений Архитектором напрямую.

На старте один человек совмещает обе роли, переключаясь осознанно.

SSO через Authelia

Браузер → Nginx → Authelia forward-auth → сервис
UI Группа доступа
portainer.{domain} sysadmin
git.{domain} sysadmin, architect, projector
status.{domain} sysadmin, architect
vault.{domain} sysadmin, architect
docs.{domain} sysadmin, architect, projector

7. GIT-РЕПОЗИТОРИИ

Gitea на Матери — единственный источник истины.

Зеркала (страховка):

Gitea → Beget S3     (restic бэкап репозиториев, ежедневно)
Gitea → ПК оператора (git clone --mirror, по требованию или cron)

⏳ TODO: политика бэкапа — полное зеркало Gitea (все репозитории) на Beget S3.

Репо Содержимое Архитектор Проектор
arch-core architect/ library/ rw ro
arch-infra infra/ system/ rw
proj-shared шаблоны проектов rw ro
project-{name} код проекта rw (только свой)

8. РОЛИ И ПРАВА ДОСТУПА

Три роли людей

Сисадмин ──────────────────────────────────────── полный доступ
    │
    ▼
Архитектор ─────────────────────────── arch + infra + вниз
    │
    ▼
Проектор ───────────────────── только свои projects/

Контекст передаётся только сверху вниз. Обратно — только результат.

Права по системам

Система Сисадмин Архитектор Проектор
SSH серверы ✅ все
Portainer UI ✅ все стеки
Gitea admin
Gitea: arch-core rw ro
Gitea: arch-infra rw
Gitea: proj-shared rw ro
Gitea: project-{name} rw (свой)
Uptime Kuma ✅ admin ro
Vaultwarden ✅ admin свои секреты
Authelia UI
Claude Code creator через Сисадмина
Claude Code proj через Сисадмина ✅ (свой)

Доступ к UI через Authelia

UI sysadmin architect projector-N
portainer.{domain}
git.{domain}
status.{domain}
vault.{domain}
docs.{domain}
auth.{domain}

Разделение Сисадмин / Архитектор

Архитектор пишет конфиги → коммитит в git.
Сисадмин применяет → git pull → docker compose up.

Это исключает случайное применение изменений напрямую.
На старте один человек совмещает обе роли, переключаясь осознанно.


9. СЕКРЕТЫ

НА СЕРВЕРЕ (не в git):
  /opt/{stack}/.env     ← реальные значения

В GIT:
  /opt/{stack}/.env.example  ← шаблон без значений

БЭКАП:
  restic шифрует .env файлы → Beget S3
  Ключ шифрования — офлайн у Сисадмина (флешка / личный менеджер паролей)

При росте команды — Vaultwarden (уже в OPS стеке): командный доступ с ролями.


10. ЭТАПЫ МАСШТАБИРОВАНИЯ

Этап 0 — Один сервер (старт)

┌─────────────────────────────┐
│  1 VPS                      │
│  МАТЬ + ОТЕЦ + СЫН          │
│  + ИСПОЛНИТЕЛЬ              │
│                             │
│  Всё вместе.                │
│  Риск: SPOF полный.         │
│  Для: старт, 1-2 проекта.   │
└─────────────────────────────┘

Этап 1 — Два сервера

┌────────────────┐    ┌────────────────┐
│  МАТЬ          │    │  ДОЧКА         │
│  BASE + CORE   │VPN │  BASE          │
│  OPS + BACKUP  │◄──►│  СЫН           │
│  ОТЕЦ + СЫН   │    │  ИСПОЛНИТЕЛЬ   │
│  ИСПОЛНИТЕЛЬ   │    │                │
└────────────────┘    └────────────────┘

Нагрузка проектов не мешает ядру. Изоляция рантайма.

Этап 2 — Три сервера

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│  МАТЬ        │  │  ДОЧКА-А     │  │  ДОЧКА-Б     │
│  BASE + CORE │  │  BASE + СЫН  │  │  BASE        │
│  OPS + BACKUP│  │              │  │  ИСПОЛНИТЕЛЬ │
│  ОТЕЦ        │  │              │  │              │
└──────────────┘  └──────────────┘  └──────────────┘

Этап N — горизонтальный рост

+1 VPS = +1 ДОЧКА = +N проектов

Каждая Дочка подключается к WireGuard хабу Матери и регистрируется в Portainer.


11. ВОССТАНОВЛЕНИЕ

Что упало Последствия Время
exec-nginx сайты 502 restart → 30 сек
exec-postgres сайты с БД down restart → 30 сек
core-postgres нет деплоев, сайты живут restore → 30 мин
core-gitea нет git операций restore → 30 мин
WireGuard нет VPN, сайты живут restart → 10 сек
Вся Мать нет управления, сайты живут новый VPS + restore → 45 мин
Вся Дочка проекты этой Дочки down новый VPS + restore → 45-60 мин
Anthropic API Claude Code не работает OpenRouter как fallback

Стратегия бэкапа:

Данные Метод Частота
PostgreSQL (Gitea, Authelia) pg_dump → Beget S3 каждые 6ч
PostgreSQL (проекты) pg_dump → Beget S3 каждые 6ч
Gitea репозитории push mirror → GitHub каждые 8ч
Docker compose + конфиги в git при изменении
.env файлы restic encrypt → S3 ежедневно
Медиа и данные restic → S3 ежедневно