infra/INFRASTRUCTURE.md

INFRASTRUCTURE - Enterprise архитектура платформы

Версия: 1.0.0
Дата: 2026-01-22
Статус: Approved


ОБЩАЯ СХЕМА

┌────────────────────────────────────────────────────────────┐
│ EUROPE-PROXY (Рига, Латвия)                                │
│ ──────────────────────────────────────────────────────────│
│ ОСНОВНОЙ:          РЕЗЕРВНЫЙ (failover):                   │
│ 91.218.142.168     backup-proxy                            │
│ Claude Code        Claude Code (standby)                   │
│ SSH → RU-DEV ONLY  VPN → RU-DEV ONLY                       │
│                                                             │
│ ⚠️ НЕТ ДОСТУПА К RU-PROD                                   │
│                                                             │
│ 2GB / ~500₽        2GB / ~500₽                             │
└────────────────────────────────────────────────────────────┘
                │
                │ SSH/VPN → ТОЛЬКО DEV
                ↓
┌────────────────────────────────────────────────────────────┐
│ RU-DEV (Москва, Россия)                                    │
│ ──────────────────────────────────────────────────────────│
│ ВСЯ РАЗРАБОТКА:                                            │
│                                                             │
│ Platform DEV + TEST:                                       │
│ ├── dev.architect.0kt.ru                                   │
│ ├── test.architect.0kt.ru                                  │
│ └── Docker: platform-ui:dev, platform-ui:test              │
│                                                             │
│ Projects DEV:                                              │
│ ├── dev.pirotehnika.ru (Docker)                            │
│ ├── dev.lideravto.ru (Docker)                              │
│ └── PostgreSQL: test данные                                │
│                                                             │
│ 8GB RAM / 160GB disk / ~1600₽                              │
└────────────────────────────────────────────────────────────┘
                │
                │ ЗЕРКАЛИРОВАНИЕ
                ↓
┌────────────────────────────────────────────────────────────┐
│ S3 beget-workspace (РФ)                                    │
│ ──────────────────────────────────────────────────────────│
│ 100% зеркало /opt/claude-workspace/                        │
│ + Git (автосинк каждый commit)                             │
│ + Backups (ежечасно)                                       │
└────────────────────────────────────────────────────────────┘
                │
                │ deploy stable →
                ↓
┌────────────────────────────────────────────────────────────┐
│ RU-PROD (Москва, Россия)                                   │
│ ──────────────────────────────────────────────────────────│
│ ТОЛЬКО СТАБИЛЬНЫЕ ВЕРСИИ:                                  │
│                                                             │
│ ⚠️ БЕЗ ПРЯМОГО ДОСТУПА AI                                  │
│ Всё делает Platform автономно                              │
│                                                             │
│ Platform PROD:                                             │
│ ├── tester.0kt.ru                                          │
│ ├── architect.0kt.ru                                       │
│ ├── platform-dev.0kt.ru                                    │
│ ├── Docker: platform-ui:stable                             │
│ └── AI интегрирован в Platform (не прямой доступ)          │
│                                                             │
│ Projects PROD:                                             │
│ ├── pirotehnika.ru (Docker)                                │
│ ├── lideravto.ru (Docker)                                  │
│ └── PostgreSQL: production данные                          │
│                                                             │
│ Deploy: ТОЛЬКО через CI/CD (не ручной)                     │
│                                                             │
│ 8GB RAM / 160GB disk / ~1600₽                              │
└────────────────────────────────────────────────────────────┘

СЕРВЕРЫ

1. EUROPE-PROXY (основной)

Локация: Рига, Латвия
IP: 91.218.142.168
Provider: Hetzner / текущий
Характеристики: 2GB RAM / 40GB disk

Роль: Claude API прокси

Что крутится:

├── Claude Code CLI (~500MB)
├── SSH ключи
├── Git client (минимум)
└── Python (для скриптов управления)

Что НЕ хранится:
- ❌ Docker
- ❌ Workspace полностью
- ❌ Данные проектов
- ❌ PostgreSQL

Управление:

# ТОЛЬКО DEV доступен
ssh ru-dev "команда"

# PROD НЕ доступен напрямую
# ru-prod управляется через:
# - CI/CD pipeline
# - Platform встроенные функции
# - Автоматические deploy

Важно: Claude НЕ имеет SSH доступа к PROD!


2. EUROPE-PROXY-BACKUP (резервный)

Роль: Failover при падении основного

Сценарий:
1. Основной proxy падает
2. Автопереключение на backup
3. Claude продолжает работать

Настройка:

# Keepalived config
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    virtual_ipaddress {
        91.218.142.169
    }
}

3. RU-DEV (Москва)

Локация: Москва, Россия
Provider: Beget / Selectel
Характеристики: 8GB RAM / 160GB disk

Роль: ВСЯ РАЗРАБОТКА (Platform + Projects)

Структура диска:

/opt/claude-workspace/          10GB
├── architect/                  (методология)
├── system/                     (Platform код)
├── library/                    (библиотеки)
└── projects/                   (Projects код)

/var/lib/docker/                30GB
├── platform-ui:dev
├── platform-ui:test
├── pirotehnika-api:dev
└── lideravto-api:dev

/var/lib/postgresql/            10GB
├── platform_ui_dev
├── pirotehnika_dev
└── lideravto_dev

/var/log/                       5GB

Домены:

dev.architect.0kt.ru       → Platform UI dev
test.architect.0kt.ru      → Platform UI test
dev.pirotehnika.ru         → Pirotehnika dev
dev.lideravto.ru           → Lideravto dev

Docker Compose:

# /opt/claude-workspace/docker-compose.dev.yml
services:
  platform-ui-dev:
    image: platform-ui:dev
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=development

  platform-ui-test:
    image: platform-ui:test
    ports:
      - "3001:3000"
    environment:
      - NODE_ENV=test

  pirotehnika-dev:
    image: pirotehnika-api:dev
    ports:
      - "4000:4000"
    volumes:
      - /mnt/beget-s3/projects/pirotehnika:/data

4. RU-PROD (Москва)

Локация: Москва, Россия
Provider: Beget / Selectel
Характеристики: 8GB RAM / 160GB disk

Роль: PRODUCTION (только стабильные версии)

Структура диска:

/opt/claude-workspace/          10GB
├── architect/                  (read-only)
├── system/                     (stable)
├── library/                    (stable)
└── projects/                   (stable)

/var/lib/docker/                40GB
├── platform-ui:stable
├── pirotehnika-api:stable
└── lideravto-api:stable

/var/lib/postgresql/            30GB
├── platform_ui_prod
├── pirotehnika_prod
└── lideravto_prod

/var/log/                       10GB

Домены:

tester.0kt.ru              → Platform UI (Tester panel)
architect.0kt.ru           → Platform UI (Architect panel)
platform-dev.0kt.ru        → Platform UI (Platform Dev panel)
pirotehnika.ru             → Pirotehnika prod
lideravto.ru               → Lideravto prod

Docker Compose:

# /opt/claude-workspace/docker-compose.prod.yml
services:
  platform-ui:
    image: platform-ui:stable
    restart: always
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production

  pirotehnika-api:
    image: pirotehnika-api:stable
    restart: always
    ports:
      - "4000:4000"
    volumes:
      - /mnt/beget-s3/projects/pirotehnika:/data:ro

S3 ХРАНИЛИЩА

1. beget-workspace (РФ)

Роль: Зеркало workspace + версионирование

Структура:

/workspace/
├── architect/              (100% копия)
├── system/                 (100% копия)
├── library/                (100% копия)
└── projects/               (100% копия кода)

/backups/hourly/
├── 2026-01-22-14-00/
├── 2026-01-22-15-00/
└── ... (retention: 7 дней)

Синхронизация:

# На RU-DEV (автоматически)
# При каждом git commit
git push origin main
rsync -avz /opt/claude-workspace/ /mnt/beget-s3/workspace/

# Ежечасный бэкап
0 * * * * rsync -avz /opt/claude-workspace/ /mnt/beget-s3/backups/hourly/$(date +\%Y-\%m-\%d-\%H-\%M)/

2. beget-media (РФ)

Роль: CDN для медиа файлов

Структура:

/images/
├── products/               (картинки товаров)
├── uploads/                (пользовательские загрузки)
└── static/                 (статика сайтов)

/documents/
└── files/                  (PDF, DOCX, etc)

Доступ:

https://cdn.0kt.ru/images/products/12345.jpg
https://cdn.0kt.ru/documents/price.pdf

Nginx config:

server {
    server_name cdn.0kt.ru;
    root /mnt/beget-media;

    location /images/ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

3. beget-infra (РФ)

Роль: Инфраструктурные бэкапы

Структура:

/backups/databases/
├── platform_ui/
│   ├── 2026-01-22.sql.gz
│   ├── 2026-01-21.sql.gz
│   └── ... (retention: 30 дней)
├── pirotehnika/
└── lideravto/

/backups/configs/
├── nginx/
├── systemd/
└── docker/

/backups/workspace-snapshots/
└── weekly/
    ├── 2026-01-20/
    └── 2026-01-13/

Автобэкапы:

# На RU-PROD
# Ежедневно в 04:00
0 4 * * * /opt/scripts/backup-databases.sh
0 5 * * * /opt/scripts/backup-configs.sh

# Еженедельно в воскресенье
0 3 * * 0 /opt/scripts/backup-workspace.sh

РАЗДЕЛЕНИЕ КОД / ДАННЫЕ

КОД (Git + Workspace)

Что считается кодом:

 architect/                (методология)
 system/                   (Platform код)
 library/                  (библиотеки)
 projects/*/app/           (код приложений)
 infra/                    (скрипты инфры)
 *.py, *.js, *.md, *.yaml  (исходники)

Где хранится:
- Master: Git (GitHub/GitLab)
- Рабочие копии: RU-DEV, RU-PROD
- Зеркало: S3 beget-workspace


ДАННЫЕ (S3 + PostgreSQL)

Что считается данными:

 Файлы проектов (inbox/, prices/, images/)
 Базы данных (PostgreSQL)
 Загруженные файлы (uploads/)
 Логи
 Бэкапы

Где хранится:
- S3 beget-s3: файлы проектов
- S3 beget-media: CDN
- S3 beget-infra: бэкапы
- PostgreSQL (RU-DEV, RU-PROD): БД

152-ФЗ: ВСЕ данные ТОЛЬКО в России!


WORKFLOW

1. Разработка Platform

EUROPE-PROXY (Claude):
Пишет код system/services/platform-ui/

         git push

GITHUB/GITLAB:
Git repository (master, tags)

         git pull

RU-DEV:
git pull origin main
docker build -t platform-ui:dev
docker-compose up -d

         тестирование

dev.architect.0kt.ru работает

         если тесты 

git tag v1.2.3-stable
git push --tags
docker build -t platform-ui:stable
docker push registry/platform-ui:stable

         АВТОМАТИЧЕСКИ

RU-PROD:
Platform UI  Deploy раздел:
├── Проверяет новые теги
├── Скачивает stable образ
├── Запускает новую версию
└── Откат если ошибки

        

architect.0kt.ru обновлён

Важно:
- ❌ Claude НЕ деплоит на PROD напрямую
- ✅ PROD сам скачивает новые версии (pull-based)
- ✅ Deploy автоматический (через Platform UI)

---

### 2. Разработка Project

EUROPE-PROXY:
Claude пишет код projects/pirotehnika/app/

RU-DEV:
git pull
docker build -t pirotehnika-api:dev
docker-compose up -d

    ↓ тестирование

dev.pirotehnika.ru работает

    ↓ если OK

git tag pirotehnika-v2.1.0
docker build -t pirotehnika-api:stable

RU-PROD:
docker pull pirotehnika-api:stable
docker-compose up -d

pirotehnika.ru обновлён

---

### 3. Работа с данными

Загрузка файла:
upload.0kt.ru → /mnt/beget-s3/projects/pirotehnika/inbox/

RU-PROD:
Python script обрабатывает файл
Данные → PostgreSQL

EUROPE-PROXY:
Claude анализирует через SSH:
ssh ru-prod "psql -c 'SELECT ...'"

---

## ДВА ВАРИАНТА ИСПОЛЬЗОВАНИЯ

### ВАРИАНТ 1: ОБЛАКО (SaaS)

**Схема:**

Клиент работает через наши серверы:

RU-DEV: RU-PROD:
├── Platform DEV ├── Platform PROD
└── Projects DEV ───────────▶└── Projects PROD

Домены:
- architect.0kt.ru (клиент работает здесь)
- pirotehnika.ru (его проект работает здесь)

**Для кого:**
- Малый бизнес
- Стартапы
- MVP проекты

**Стоимость:**
- Включено в Platform (бесплатно или по тарифу)

---

### ВАРИАНТ 2: ENTERPRISE (On-Premise)

**Схема:**

Мы даём: Клиент разворачивает:
├── library/ (ядро) ├── КЛИЕНТ-DEV
├── Claude API доступ ├── КЛИЕНТ-PROD
└── Поддержка ├── PostgreSQL свой
└── S3 свой

Клиент получает полную копию Platform
Разворачивает У СЕБЯ (сервер клиента)

**Для кого:**
- Крупный бизнес
- Банки
- Госсектор
- Требования к безопасности

**Стоимость:**
- Лицензия Enterprise (~300k₽/год)
- Внедрение (~500k₽ один раз)
- Поддержка (~100k₽/год)

---

## МАСШТАБИРОВАНИЕ

### Когда выделять отдельный сервер под проект

**Критерии:**

Нагрузка: >1000 RPS
Данные: >100GB
Команда: >5 человек
SLA: >99.9%
Изоляция: критична (банк, госсектор)

**Новая схема:**

БЫЛО (на RU-PROD): СТАЛО:
pirotehnika.ru (Docker) → RU-PIROTEHNIKA-DEV (4GB)
RU-PIROTEHNIKA-PROD (8GB)
S3-PIROTEHNIKA (свой)
PostgreSQL отдельная

**Стоимость:**

Базовая инфра: 4500₽
+ PROJECT-DEV: 800₽
+ PROJECT-PROD: 1600₽
+ S3-PROJECT: 200₽
──────────────────────────
ИТОГО на проект: 7100₽/мес

---

## СТОИМОСТЬ

### Базовая конфигурация (Platform)

EU-PROXY (основной): 500₽
EU-PROXY-BACKUP: 500₽
RU-DEV (8GB): 1600₽
RU-PROD (8GB): 1600₽
S3 (beget-workspace): 100₽
S3 (beget-media): 100₽
S3 (beget-infra): 100₽
──────────────────────────────
ИТОГО: 4500₽/мес = 54 000₽/год

### С выделенным сервером под проект

Базовая: 4500₽
PROJECT-DEV (4GB): 800₽
PROJECT-PROD (8GB): 1600₽
S3-PROJECT: 200₽
──────────────────────────────
ИТОГО: 7100₽/мес = 85 200₽/год

### Enterprise (клиентская инфра)

Лицензия: 300 000₽/год
Внедрение: 500 000₽ (один раз)
Поддержка: 100 000₽/год
──────────────────────────────────
Первый год: 900 000₽
Следующие годы: 400 000₽/год

---

## ПРАВА ДОСТУПА

### По окружениям

**EUROPE-PROXY (Claude Code):**

Доступ:
├── RU-DEV: SSH ✓ (полный доступ)
└── RU-PROD: SSH ✗ (НЕТ доступа)

На этапе отладки:
├── RU-PROD: SSH ✓ (временный)
└── После запуска: SSH ✗ (закрыт)

**Разработчики:**

Доступ:
├── RU-DEV: SSH ✓ (для разработки)
└── RU-PROD: SSH ✗ (НЕТ доступа)

На этапе отладки:
├── RU-PROD: SSH ✓ (временный)
└── После запуска: SSH ✗ (закрыт)

**Platform Owner:**

Доступ:
├── RU-DEV: SSH ✓
├── RU-PROD: SSH ✓ (emergency only)
└── Deploy через Platform UI ✓

---

### Deploy на PROD

**Механизм (pull-based):**

Platform UI → Deploy раздел:

┌──────────────────────────────────────┐
│ Deploy Panel (architect.0kt.ru) │
├──────────────────────────────────────┤
│ Available versions: │
│ ● v1.2.3-stable (current) │
│ ○ v1.2.4-stable (new) │
│ │
│ [Deploy v1.2.4] [Rollback] │
└──────────────────────────────────────┘

**Процесс:**
```python
# На RU-PROD автоматически (каждые 5 минут)
def check_new_versions():
    # 1. Проверить Git теги
    tags = git.ls_remote('--tags', 'origin')
    latest = parse_latest_stable(tags)

    # 2. Сравнить с текущим
    if latest > current_version:
        # Показать в Deploy Panel
        notify_platform_ui(latest)

    # 3. Owner кликает Deploy
    # или автодеплой если настроен

def deploy_version(version):
    # 1. Скачать образ
    docker.pull(f'platform-ui:{version}')

    # 2. Остановить старый
    docker.stop('platform-ui')

    # 3. Запустить новый
    docker.run('platform-ui', version)

    # 4. Проверить здоровье
    if not health_check():
        # Автооткат
        rollback_to_previous()

Автодеплой (опционально):

# platform-ui config
deploy:
  auto: true              # автоматический deploy
  strategy: blue-green    # стратегия
  health_check:
    url: /api/health
    timeout: 30s
  rollback_on_error: true

БЕЗОПАСНОСТЬ

Firewall

EUROPE-PROXY:

# Открыто
22 (SSH)      - только RU-DEV, RU-PROD, личный IP
80/443        - публично (docs)

# Закрыто всё остальное
ufw default deny incoming
ufw allow from RU_DEV_IP to any port 22
ufw allow from RU_PROD_IP to any port 22
ufw allow from PERSONAL_IP to any port 22
ufw allow 80/tcp
ufw allow 443/tcp

RU-DEV:

# Открыто
22            - только EU-PROXY
80/443        - публично (dev домены)
3000-3010     - только EU-PROXY (dev порты)

ufw allow from EU_PROXY_IP to any port 22
ufw allow 80/tcp
ufw allow 443/tcp

RU-PROD:

# Открыто
22            - только EU-PROXY
80/443        - публично
5432          - только localhost (PostgreSQL)

ufw allow from EU_PROXY_IP to any port 22
ufw allow 80/tcp
ufw allow 443/tcp
ufw deny 5432  # PostgreSQL только локально

SSL Сертификаты

Let's Encrypt (автообновление):

# На RU-DEV и RU-PROD
certbot --nginx \
  -d architect.0kt.ru \
  -d tester.0kt.ru \
  -d platform-dev.0kt.ru \
  -d pirotehnika.ru \
  -d lideravto.ru

# Автообновление каждый месяц
0 0 1 * * certbot renew --quiet

Secrets

НЕ коммитить в Git:

.env
credentials.md
*.key
*.pem
database.yml (с паролями)

Хранение:

EUROPE-PROXY:  /opt/secrets/
RU-DEV:        /opt/secrets/
RU-PROD:       /opt/secrets/

Синхронизация:
scp /opt/secrets/.env ru-dev:/opt/secrets/
scp /opt/secrets/.env ru-prod:/opt/secrets/

Backup secrets:

S3 beget-infra:/secrets/ (encrypted)

МОНИТОРИНГ

Что мониторим

На всех серверах:

- Disk usage (алерт при >80%)
- Memory usage (алерт при >90%)
- CPU load (алерт при >80% 5 min avg)
- Service health (systemd units)
- Network latency

Специфичные метрики:

RU-DEV:
- Docker containers up/down
- PostgreSQL connections
- Git sync status

RU-PROD:
- HTTP response time (target <200ms)
- Database query time
- API latency
- Error rate (target <0.1%)

Alerting

Telegram бот:

# system/monitor/config.yaml
alerts:
  telegram:
    token: ${TELEGRAM_BOT_TOKEN}
    chat_id: ${ADMIN_CHAT_ID}

  rules:
    - name: disk_usage
      level: warning
      threshold: 80%

    - name: disk_usage
      level: critical
      threshold: 90%

    - name: service_down
      level: critical
      services:
        - platform-ui
        - postgresql
        - nginx

DISASTER RECOVERY

Сценарии

1. RU-PROD упал:

1. Алерт в Telegram
2. Переключение на RU-DEV (temporary)
3. Восстановление RU-PROD из S3 backup
4. Переключение обратно

2. PostgreSQL corruption:

1. Остановить запись
2. Восстановить из последнего backup
   rclone copy beget-infra:backups/databases/platform_ui/latest.sql.gz /tmp/
   gunzip /tmp/latest.sql.gz
   psql -U postgres < /tmp/latest.sql
3. Проверить целостность
4. Вернуть в работу

3. S3 недоступен:

1. Работа продолжается (PostgreSQL локально)
2. Файлы временно на локальный диск
3. Когда S3 вернётся  rsync обратно

4. EUROPE-PROXY упал:

1. Автопереключение на BACKUP-PROXY
2. Claude продолжает работать
3. Чинить основной proxy

ПЛАН ВНЕДРЕНИЯ

Этап 1: Очистка EUROPE-DEV (текущий)

# 1. Удалить Docker (освободит 11GB)
docker system prune -af
apt remove docker docker-engine docker.io containerd runc

# 2. Удалить старые snap (освободит 5GB)
snap list --all | awk '/disabled/{print $1, $3}' | \
  while read name rev; do snap remove "$name" --revision="$rev"; done

# 3. Очистить логи (освободит 2GB)
journalctl --vacuum-time=7d
find /var/log -name "*.gz" -delete

# 4. Переместить workspace данные на S3
mv /opt/claude-workspace/projects/*/data/* /mnt/beget-s3/projects/

# Результат: 26GB → 8GB (28%)

Этап 2: Создать RU-DEV

# 1. Заказать VPS (Beget/Selectel)
# 8GB RAM / 160GB Disk / Москва

# 2. Базовая настройка
apt update && apt upgrade -y
apt install nginx postgresql-16 docker.io docker-compose git python3-pip -y

# 3. Подключить S3
apt install rclone
rclone config  # настроить beget-s3, beget-media, beget-infra
systemctl enable rclone@beget-s3
systemctl enable rclone@beget-media
systemctl enable rclone@beget-infra

# 4. Клонировать workspace
git clone <repo> /opt/claude-workspace

# 5. Deploy dev окружение
cd /opt/claude-workspace
docker-compose -f docker-compose.dev.yml up -d

# 6. Настроить домены
certbot --nginx -d dev.architect.0kt.ru

Этап 3: Создать RU-PROD

# Аналогично RU-DEV, но:
# - docker-compose.prod.yml
# - Только stable образы
# - Домены: tester/architect/platform-dev.0kt.ru

Этап 4: Настроить синхронизацию

# На EUROPE-PROXY
ssh-keygen -t ed25519 -C "europe-to-ru"
ssh-copy-id ru-dev
ssh-copy-id ru-prod

# Тест
ssh ru-dev "hostname && uptime"
ssh ru-prod "hostname && uptime"

Этап 5: Backup & Failover

# 1. Настроить автобэкапы
crontab -e на RU-PROD:
0 4 * * * /opt/scripts/backup-databases.sh
0 5 * * * /opt/scripts/backup-configs.sh

# 2. Создать EU-PROXY-BACKUP
# Клонировать конфиг основного
# Настроить keepalived

# 3. Тестирование failover
systemctl stop networking  # на основном
# Backup должен подхватить

ССЫЛКИ


Версия: 1.0.0
Последнее обновление: 2026-01-22