Версия: 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₽ │
└────────────────────────────────────────────────────────────┘
Локация: Рига, Латвия
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!
Роль: 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
}
}
Локация: Москва, Россия
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
Локация: Москва, Россия
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
Роль: Зеркало 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)/
Роль: 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";
}
}
Роль: Инфраструктурные бэкапы
Структура:
/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
Что считается кодом:
✓ architect/ (методология)
✓ system/ (Platform код)
✓ library/ (библиотеки)
✓ projects/*/app/ (код приложений)
✓ infra/ (скрипты инфры)
✓ *.py, *.js, *.md, *.yaml (исходники)
Где хранится:
- Master: Git (GitHub/GitLab)
- Рабочие копии: RU-DEV, RU-PROD
- Зеркало: S3 beget-workspace
Что считается данными:
✓ Файлы проектов (inbox/, prices/, images/)
✓ Базы данных (PostgreSQL)
✓ Загруженные файлы (uploads/)
✓ Логи
✓ Бэкапы
Где хранится:
- S3 beget-s3: файлы проектов
- S3 beget-media: CDN
- S3 beget-infra: бэкапы
- PostgreSQL (RU-DEV, RU-PROD): БД
152-ФЗ: ВСЕ данные ТОЛЬКО в России!
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
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 только локально
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
НЕ коммитить в 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%)
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
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. Удалить 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%)
# 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
# Аналогично RU-DEV, но:
# - docker-compose.prod.yml
# - Только stable образы
# - Домены: tester/architect/platform-dev.0kt.ru
# На 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"
# 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