BR 6.3 — Infra
Деплой OpenClaw Agent на test VPS, БД для агента, nginx-маршруты, env-секреты.
LLM Gateway отказан
Самописный
erp-llm-gatewayотказан 2026-05-13 — не оправдал ожиданий. См. ADR-022 rev 2. OpenClaw Agent ходит к LLM-провайдеру напрямую (конкретный провайдер — TBD: Ollama через autossh, OpenClaw framework, либо платный API).
Что нужно
1. PostgreSQL — новая БД
На общем postgres контейнере в VPS:
CREATE DATABASE agent_db;
CREATE USER agent_user WITH PASSWORD '<gen>';
GRANT ALL PRIVILEGES ON DATABASE agent_db TO agent_user;Liquibase OpenClaw Agent сам создаст таблицы при первом запуске.
2. docker-compose добавления
docker-compose.yml:
openclaw-agent:
build:
context: ../erp-openclaw-agent
dockerfile: Dockerfile
image: erp/openclaw-agent:latest
restart: unless-stopped
env_file:
- ./envs/openclaw-agent.env
depends_on:
- postgres
- redis
networks:
- erp-net
ports:
- "127.0.0.1:3031:3031"
extra_hosts:
- "host.docker.internal:host-gateway" # для доступа к Ollama на VPS-host через autossh3. env-файлы
envs/openclaw-agent.env:
PORT=3031
DATABASE_URL=postgres://agent_user:<pwd>@postgres:5432/agent_db
REDIS_URL=redis://redis:6379
# LLM-провайдер (TBD — см. ADR-022 rev 2)
LLM_PROVIDER_URL=<подставить, когда выберем>
LLM_MODEL=qwen2.5:14b-instruct-q5_k_m
LLM_TEMPERATURE=0.2
LLM_MAX_TOKENS=1024
LLM_TIMEOUT_MS=60000
CATALOG_SERVICE_URL=http://catalog-service:3004
ORDER_SERVICE_URL=http://order-service:3005
MAX_TURNS_PER_CONVERSATION=20
MAX_REACT_ITERATIONS=10
MAX_USER_MESSAGE_CHARS=2000
CONVERSATION_TTL_DAYS=30
AUTH_MODE=local
JWT_LOCAL_SECRET=<тот же что в auth-service.env>
AUTH_USERINFO_URL=http://user-service:3002/auth/me
# PII-маскирование на стороне агента (раньше делал llm-gateway)
MASK_FIELDS=pin_hash,password,salt,salary_amount,legal_inn,passport_series,passport_number
4. Nginx route для admin (если SSE требует tuning)
Проверить что /api/v1/admin/* не буферизуется. Если нет — добавить отдельное правило для /api/v1/admin/agent/chat:
location /api/v1/admin/agent/chat {
proxy_pass http://admin-bff:3020;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Authorization $http_authorization;
proxy_buffering off;
proxy_cache off;
proxy_read_timeout 600s;
}5. autossh-туннель — autostart на Windows
Чтобы туннель Windows WSL → VPS жил после reboot Windows:
Вариант A — Windows Task Scheduler:
Сделать .bat:
wsl -d Ubuntu -- /usr/bin/autossh -M 0 -f -N \
-o "ServerAliveInterval=20" -o "ServerAliveCountMax=3" -o "ExitOnForwardFailure=yes" \
-R 11434:localhost:11434 root@185.152.93.77Task в Windows Scheduler: at logon (или at startup, если WSL запускается при загрузке).
Вариант B — внутри WSL systemd:
/etc/systemd/system/llm-tunnel.service:
[Unit]
Description=Reverse SSH tunnel to ERP VPS for LLM
After=network.target
[Service]
ExecStart=/usr/bin/autossh -M 0 -N \
-o "ServerAliveInterval=20" -o "ServerAliveCountMax=3" -o "ExitOnForwardFailure=yes" \
-R 11434:localhost:11434 root@185.152.93.77
Restart=on-failure
RestartSec=10
User=root
[Install]
WantedBy=multi-user.targetsystemctl enable --now llm-tunnel.
Но WSL2 не стартует автоматически при boot Windows — нужно wsl --shutdown → next-time-on-demand or PowerShell wsl -d Ubuntu -e systemctl start llm-tunnel. Самый надёжный путь — Task Scheduler в Windows с wsl.exe -d Ubuntu -e ... at logon.
6. Обновить deploy-all skill
В .claude/skills/deploy-all/SKILL.md добавить новый сервис в маппинг:
| `openclaw-agent` | `erp-openclaw-agent` | 3031 |
И в порядок деплоя — openclaw-agent после user-service + catalog-service + order-service.
7. Обновить push-all skill
.claude/skills/push-all/SKILL.md — Repositories.md уже содержит все репо, push-all из него тащит. Достаточно добавить новые в Repositories.
Готовность
- БД
agent_dbсоздана на postgres VPS -
envs/openclaw-agent.envсоздан из примеров -
docker-compose.ymlобновлён (новый сервисopenclaw-agent) - Nginx-конфиг проверен на SSE-friendly
- autossh-туннель работает после reboot Windows (Task Scheduler настроен)
-
deploy-all openclaw-agentсобирает и поднимает - Healthcheck:
curl https://erp-test.nirbi.ru/api/v1/admin/agent/conversationsотвечает 200 (с JWT админа)