type: concept
title: "Концепция платформы"
version: 1.0.0
date: 2026-04-02
status: approved
Платформа — это набор Docker-контейнеров на одном или нескольких серверах.
Хост-сервер предоставляет только:
OS · SSH · UFW · fail2ban · Docker Engine · WireGuard · cron
Всё остальное — в контейнерах. Платформа одинаково работает на 1 сервере (старт) и на N серверах (масштаб) — меняется только распределение контейнеров по машинам.
Каждый сервер в кластере играет одну из ролей:
┌──────────────────────────────────────────────────────────────┐
│ МАТЬ │
│ Главный сервер. Один в кластере. │
│ Содержит 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 + проекты |
| Контейнер | Образ | Роль |
|---|---|---|
| base-portainer-agent | portainer/agent | → Portainer на Матери по VPN :9001 |
| wireguard | хост (не контейнер) | VPN: хаб на Матери, клиент на Дочках |
| Контейнер | Образ | Роль |
|---|---|---|
| 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-portainer | portainer/portainer-ce | центральный UI для всех контейнеров кластера |
| ops-kuma | louislam/uptime-kuma | мониторинг всех сервисов |
| ops-vaultwarden | vaultwarden/server | хранение секретов команды |
| Контейнер | Образ | Роль |
|---|---|---|
| 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-claude | claude-code | интерактивный терминал |
Воркспейс (rw):
architect/ — стандарты, концепции, паттерны, ADR
library/ — компонентная библиотека
system/ — агенты, планировщик
infra/ — описание инфраструктуры
Изолирован: volume creator-claude-auth:/root/.claude/
Прокси: HTTPS_PROXY=socks5://{eu-proxy}:1080
Отец видит архитектуру и инфраструктуру. Не имеет прямого SSH и Portainer доступа — только пишет конфиги и коммитит в git.
| Контейнер | Образ | Роль |
|---|---|---|
| proj-claude | claude-code | интерактивный терминал |
Воркспейс:
projects/ — проекты клиентов (rw)
architect/ — стандарты (ro)
library/ — библиотека (ro)
Изолирован: volume proj-claude-auth:/root/.claude/
Прокси: HTTPS_PROXY=socks5://{eu-proxy}:1080
Каждый Сын изолирован: видит только свои проекты. На Матери и на каждой Дочке может быть свой Сын.
| Контейнер | Образ | Роль |
|---|---|---|
| exec-postgres | postgres:16-alpine | БД проектов (отдельная БД на каждый проект) |
| exec-redis | redis:7-alpine | кэш, очереди |
| exec-nginx | nginx:alpine | домены проектов, SSL |
| project-{name} | кастомный | стек конкретного проекта |
Дочка — это дополнительный сервер с BASE. Что на неё ставить — зависит от задачи:
| Вариант | Стеки | Когда использовать |
|---|---|---|
| Проектор | BASE + СЫН | отдельный проектор для команды / клиента |
| Исполнитель | BASE + ИСПОЛНИТЕЛЬ | только рантайм проектов |
| Полная | BASE + СЫН + ИСПОЛНИТЕЛЬ | проектор + его проекты на одном сервере |
ИНТЕРНЕТ
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
: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 ────────┘
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
proxy-net — Nginx видит все сервисы (внешняя, межстековая)
core-net — внутри CORE стека
ops-net — внутри OPS стека
exec-net — внутри ИСПОЛНИТЕЛЯ
| Роль | Инструменты | Что видит |
|---|---|---|
| Сисадмин | 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.
Это предотвращает случайное применение изменений Архитектором напрямую.
На старте один человек совмещает обе роли, переключаясь осознанно.
Браузер → 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 |
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 (только свой) |
Сисадмин ──────────────────────────────────────── полный доступ
│
▼
Архитектор ─────────────────────────── 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 | sysadmin | architect | projector-N |
|---|---|---|---|
| portainer.{domain} | ✅ | ❌ | ❌ |
| git.{domain} | ✅ | ✅ | ✅ |
| status.{domain} | ✅ | ✅ | ❌ |
| vault.{domain} | ✅ | ✅ | ❌ |
| docs.{domain} | ✅ | ✅ | ✅ |
| auth.{domain} | ✅ | ❌ | ❌ |
Архитектор пишет конфиги → коммитит в git.
Сисадмин применяет → git pull → docker compose up.
Это исключает случайное применение изменений напрямую.
На старте один человек совмещает обе роли, переключаясь осознанно.
НА СЕРВЕРЕ (не в git):
/opt/{stack}/.env ← реальные значения
В GIT:
/opt/{stack}/.env.example ← шаблон без значений
БЭКАП:
restic шифрует .env файлы → Beget S3
Ключ шифрования — офлайн у Сисадмина (флешка / личный менеджер паролей)
При росте команды — Vaultwarden (уже в OPS стеке): командный доступ с ролями.
┌─────────────────────────────┐
│ 1 VPS │
│ МАТЬ + ОТЕЦ + СЫН │
│ + ИСПОЛНИТЕЛЬ │
│ │
│ Всё вместе. │
│ Риск: SPOF полный. │
│ Для: старт, 1-2 проекта. │
└─────────────────────────────┘
┌────────────────┐ ┌────────────────┐
│ МАТЬ │ │ ДОЧКА │
│ BASE + CORE │VPN │ BASE │
│ OPS + BACKUP │◄──►│ СЫН │
│ ОТЕЦ + СЫН │ │ ИСПОЛНИТЕЛЬ │
│ ИСПОЛНИТЕЛЬ │ │ │
└────────────────┘ └────────────────┘
Нагрузка проектов не мешает ядру. Изоляция рантайма.
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ МАТЬ │ │ ДОЧКА-А │ │ ДОЧКА-Б │
│ BASE + CORE │ │ BASE + СЫН │ │ BASE │
│ OPS + BACKUP│ │ │ │ ИСПОЛНИТЕЛЬ │
│ ОТЕЦ │ │ │ │ │
└──────────────┘ └──────────────┘ └──────────────┘
+1 VPS = +1 ДОЧКА = +N проектов
Каждая Дочка подключается к WireGuard хабу Матери и регистрируется в Portainer.
| Что упало | Последствия | Время |
|---|---|---|
| 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 | ежедневно |