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 через autossh

3. 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.77

Task в 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.target

systemctl 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 админа)

Ссылки