type: concept
title: "Архитектура компонентов платформы"
version: 1.0.0
date: 2026-04-02
status: approved
Платформа строится из контейнеров. Хост-сервер предоставляет только:
OS · SSH · UFW · fail2ban · Docker Engine · WireGuard модуль · cron
Всё остальное — в контейнерах. Платформа работает на 1 сервере (старт) или N серверов (масштаб).
┌─────────────────────────────────────────────────────────┐
│ МАТЬ (BASE + CORE) — управление, ядро │
│ один сервер, центральный │
├─────────────────────────────────────────────────────────┤
│ ОТЕЦ (CREATOR) — архитектор-создатель │
│ на Матери или отдельно │
├─────────────────────────────────────────────────────────┤
│ СЫН (PROJECTOR) — управление проектами │
│ на Матери или на Дочке │
├─────────────────────────────────────────────────────────┤
│ ДОЧКА — дополнительный сервер │
│ = Мать без CORE │
│ может нести: СЫН, ИСПОЛНИТЕЛЬ или оба │
└─────────────────────────────────────────────────────────┘
Дочка — это дополнительный сервер с BASE (portainer-agent + wireguard).
На неё ставится то что нужно:
- только СЫН (proj-claude) — если нужен отдельный Проектор
- только ИСПОЛНИТЕЛЬ (postgres + redis + nginx) — если нужен рантайм
- СЫН + ИСПОЛНИТЕЛЬ — чаще всего
Контекст передаётся только сверху вниз: Мать → Отец → Сын → Дочка.
BASE — на каждом сервере, ставится первым:
| Контейнер | Образ | Роль |
|---|---|---|
| base-portainer-agent | portainer/agent | → Portainer Server по VPN |
| (WireGuard) | хост | VPN клиент или сервер |
CORE — только на Матери, критичный:
| Контейнер | Образ | Роль |
|---|---|---|
| core-postgres | postgres:16-alpine | БД для Gitea + Authelia |
| core-gitea | gitea/gitea | git, источник истины, OAuth |
| core-authelia | authelia/authelia | SSO forward-auth |
| core-nginx | nginx:alpine | вход :80/:443, SSL |
OPS — управление платформой:
| Контейнер | Образ | Роль |
|---|---|---|
| ops-portainer | portainer/portainer-ce | центральный UI контейнеров |
| ops-kuma | louislam/uptime-kuma | мониторинг |
| ops-vaultwarden | vaultwarden/server | секреты команды |
MONITOR — алерты:
| Контейнер | Образ | Роль |
|---|---|---|
| mon-telegram | python:alpine | бот → Telegram |
BACKUP — резервирование:
| Контейнер | Образ | Роль |
|---|---|---|
| backup-restic | restic/rest-server | принимает бэкапы по VPN |
Scheduler (cron на хосте):
04:00 pg_dump → /var/backups/
04:30 restic backup → Beget S3
05:00 restic forget (ротация)
08:00 Gitea mirror → GitHub
| Контейнер | Образ | Роль |
|---|---|---|
| creator-claude | claude-code | интерактивный терминал |
Воркспейс (rw):
architect/ — стандарты, концепции, паттерны
library/ — компонентная библиотека
system/ — агенты, планировщик
infra/ — описание инфраструктуры
Прокси: HTTPS_PROXY=socks5://{eu-proxy}:1080
Auth: volume creator-claude-auth:/root/.claude/
| Контейнер | Образ | Роль |
|---|---|---|
| proj-claude | claude-code | интерактивный терминал |
Воркспейс:
projects/ — проекты клиентов (rw)
architect/ — стандарты (ro)
library/ — библиотека (ro)
Прокси: HTTPS_PROXY=socks5://{eu-proxy}:1080
Auth: volume proj-claude-auth:/root/.claude/
Каждый Проектор изолирован: видит только свои проекты.
| Контейнер | Образ | Роль |
|---|---|---|
| exec-postgres | postgres:16-alpine | БД проектов |
| exec-redis | redis:7-alpine | кэш, очереди |
| exec-nginx | nginx:alpine | домены + SSL |
| project-* | кастомный | стеки проектов клиентов |
Каждый проект:
- своя БД в exec-postgres
- свой конфиг домена в exec-nginx
- свой стек контейнеров project-{name}
ИНТЕРНЕТ
│
┌──────────────┼──────────────┐
▼ ▼ ▼
:80/:443 :80/:443 :1080 (SOCKS5)
│ │ │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
│ МАТЬ │ │ ДОЧКА │ │ EU │
│ 10.10.0.1│ │10.10.0.x│ │ PROXY │
│ VPN HUB│◄──►│VPN CLT │ │ │
└─────────┘ └─────────┘ └─────────┘
ЧЕРЕЗ VPN (закрыто снаружи):
Portainer Agent → Portainer Server :9001
Backup Agent → Restic Server :8000
Uptime Kuma → healthcheck :*
НАПРЯМУЮ:
Пользователи → Дочка :80/:443
Claude Code → EU Proxy :1080 → Anthropic API
SSH → все серверы :22
proxy-net — Nginx видит все сервисы (межстековая)
core-net — внутренняя для CORE стека
ops-net — внутренняя для OPS стека
exec-net — внутренняя для EXECUTOR
| Роль | Видит | Инструменты |
|---|---|---|
| Сисадмин | всё | SSH, Portainer, Gitea admin |
| Архитектор | architect/ library/ infra/ + вниз | Claude Code (creator) |
| Проектор | свои projects/ | Claude Code (proj) |
Каскад только сверху вниз: Сисадмин → Архитектор → Проектор.
Браузер → Nginx → Authelia (проверка) → сервис
| Сервис | Группа доступа |
|---|---|
| portainer.{domain} | sysadmin |
| git.{domain} | sysadmin, architect, projector |
| status.{domain} | sysadmin, architect |
| vault.{domain} | sysadmin, architect |
| Репо | Содержимое | Кто пишет |
|---|---|---|
arch-core |
architect/ library/ | Архитектор |
arch-infra |
infra/ system/ | Архитектор + Сисадмин |
proj-shared |
шаблоны проектов | Архитектор |
project-{name} |
код конкретного проекта | Проектор |
Gitea = единственный источник истины. GitHub = зеркало (страховка).
.env файлы на сервере (НЕ в git)
│
▼
restic backup /opt/**/.env (зашифровано)
│
▼
Beget S3 (ключ шифрования офлайн у Сисадмина)
.env.example (без значений) — в git как шаблон.
1 VPS: МАТЬ + ОТЕЦ + СЫН + ДОЧКА
Риск: SPOF. Для старта / POC.
Сервер А: МАТЬ + ОТЕЦ + СЫН + ДОЧКА #1
Сервер Б: ДОЧКА #2
Сервер А: МАТЬ + ОТЕЦ + СЫН
Сервер Б: ДОЧКА #1
Сервер В: ДОЧКА #2
+1 VPS = +1 ДОЧКА = +N проектов
| Что упало | Последствия | Время |
|---|---|---|
| exec-nginx | сайты 502 | restart 30 сек |
| exec-postgres | сайты с БД down | restart 30 сек |
| core-postgres | нет деплоев, сайты живут | restore 30 мин |
| core-gitea | нет git push/pull | restore 30 мин |
| Вся МАТЬ | нет управления, сайты живут | новый VPS + restore 45 мин |
| Вся ДОЧКА | проекты down | новый VPS + restore 45-60 мин |