OVH Kimsufi bms-4 (ns3101999) — MongoDB Arbiter + n8n Host + AI Runner
Environment ID: bms-4
Type: production
Status: active
Purpose
Triple-role server:
- MongoDB rs0 arbiter — provides quorum vote for failover without holding data
- n8n queue-mode automation host — runs n8n with 3 dedicated workers + Redis
- AI-Dev-BMS4-1 Claude runner — autonomous Claude Code agent host (max 4 parallel)
Hardware
| Field | Value |
|---|---|
| Label | p4-ovh-bms-4-ns3101999 |
| Hostname | ns3101999 |
| Provider | OVH / Kimsufi dedicated |
| IP | 54.36.123.110 |
| OS | Ubuntu 22.04.5 LTS |
| vCPU | 8 |
| RAM | 32 GB |
Running Containers
| Container | Purpose | Port |
|---|---|---|
node_exporter | Host metrics | 9100 |
cadvisor | Container metrics | 8080 |
traefik | TLS reverse proxy for n8n | 80, 443 |
redis | n8n queue backend | 6379 (internal) |
n8n | n8n queue-mode main instance | internal |
n8n-worker-1 | n8n worker 1 | internal |
n8n-worker-2 | n8n worker 2 | internal |
n8n-worker-3 | n8n worker 3 | internal |
mongod-arbiter | MongoDB 7.0 rs0 arbiter | 27017 (internal) |
MongoDB rs0 Role
| Field | Value |
|---|---|
| Replica set | rs0 |
| Role | Arbiter — votes only, holds no data |
| Joined | 2026-06-10 |
| Purpose | Provides quorum vote when bms-2/bms-3 split |
n8n Automation
| Field | Value |
|---|---|
| URL | n8n.bms-4.infra.zintegrowana.online |
| Mode | Queue mode with 3 workers + Redis |
| Auth | n8n login |
| Secrets | secrets/n8n-bms4.env.sops (SOPS+age) |
n8n handles: WhatsApp incident routing, Atrax GPS sync, vehicle data automation, HeyGen video generation, BrandPilot workflows.
AI-Dev-BMS4-1 Claude Agent
| Field | Value |
|---|---|
| GitHub user | AI-Dev-BMS4-1 |
| Auth | OAuth subscription (Claude Max) — not API key |
| Credentials | /home/claude-runner/.claude/.credentials.json |
| Max parallel agents | 4 |
| Role | saas-dev |
| Resource note | Shares 32 GB RAM with n8n + MongoDB arbiter |
Worker scratch hygiene (#7724 / #7813). bms-4 is the shared worker host where the #7724 leak
accumulated (multiple local accounts: claude-runner, claude-runner-2, ubuntu). Every worker is
launched with umask 077 and an owner-only 0700 per-worker TMPDIR
(/tmp/p24-worker-<issue>-XXXXXX, created + reaped by scripts/spawn-worker.sh), so scratch is
owner-only and its filenames are not even listable by other accounts. An hourly root cron
(check-tmp-secret-scratch.sh → p24_tmp_secret_scratch_count → TmpSecretScratchExposed) watches
for a relapse. See docs/playbooks/worker-tmp-secret-hygiene.md
and docs/playbooks/worker-secrets-handling.md.
GitHub Actions Self-Hosted Runners
bms-4 hosts repo-scoped GitHub Actions runners (systemd units
actions.runner.<repo>.<name>.service, run as user claude-runner). Inventory (2026-10-08, #7640):
| Runner name | Repo | OS path | Labels |
|---|---|---|---|
bms4-etop | et-operational-platform | /opt/actions-runner-bms4-etop | self-hosted, Linux, X64, bms4, heavy, playwright |
bms4-p24infra | p24-infra | /opt/actions-runner-bms4-p24 | self-hosted, Linux, X64, bms4, heavy, playwright, secrets-deploy |
bms4-p24infra-extra1/2/3 | p24-infra | /opt/gh-runner, -2, -3 | self-hosted, Linux, X64, bms4, secrets-deploy |
bms4-p24infra-light1/2 | p24-infra | /opt/gh-runner-light-1, -2 | self-hosted, Linux, X64, dispatch-light (no bms4) |
bms4-android | whatsup-android-chat-puller | /home/claude-runner/gh-runner | self-hosted, Linux, X64 |
The *-light* runners are the dispatch-light tier (#7640): a MemoryMax=1G + CPUWeight=200
systemd drop-in (…/actions.runner.radieu-p24-infra.bms4-p24infra-light{1,2}.service.d/resource.conf,
Restart=always), dedicated to tiny queue-trigger workflows so they stop queueing behind the
6-min Self Test jobs on the bms4-labelled runners. Label policy + rationale:
docs/playbooks/gh-runner-assignment-policy.md. Process-liveness metrics (gh_runner_up) come from
/usr/local/bin/gh-runner-metrics.sh (root cron, 1 min → node_exporter textfile).
Access
# As root (human developer)
ssh root@54.36.123.110 -i C:\Users\konar\.ssh\id_ed25519
# As ubuntu
ssh ubuntu@54.36.123.110 -i C:\Users\konar\.ssh\id_ed25519Secrets
- n8n stack:
secrets/n8n-bms4.env.sops(SOPS+age) - MongoDB arbiter:
secrets/bms-servers.env.sops(SOPS+age) - Server fallback:
/opt/p24-infra/bms-4/.env
Secrets Access
| Secret store | Access method | Can decrypt SOPS? |
|---|---|---|
All secrets/*.env.sops files | age key at /home/claude-runner/.age/p24-infra-keys.txt | Yes � claude-runner has the age key (verified 2026-06-24) |
| On-server plaintext fallback | /opt/p24-infra/bms-4/.env (deployed by CI) | N/A � already plaintext |
| GitHub Actions secrets | Not accessible from VPS directly | N/A |
bms-4 / AI-Dev-BMS4-1 does hold the SOPS age key and can decrypt all SOPS files directly.
Resource Budget (32 GB RAM)
| Component | Expected RAM | Notes |
|---|---|---|
MongoDB arbiter (mongod) | ~200 MB | Arbiter holds no data � minimal footprint |
| n8n main instance | ~400 MB | Queue-mode coordinator only |
| n8n worker � 3 | ~800 MB each = ~2.4 GB | Rises to ~1.2 GB/worker under Playwright load |
| Redis | ~100 MB | n8n queue backend |
| Traefik | ~50 MB | TLS proxy |
| node_exporter + cAdvisor | ~100 MB combined | Metrics exporters |
| Claude Code agents � 4 | ~700 MB each = ~2.8 GB | Per-agent process + git worktree I/O |
| OS + buffers | ~2 GB | Ubuntu 22.04 baseline |
| Total (light n8n load) | ~8 GB | Comfortable headroom |
| Total (heavy n8n Playwright load) | ~14�16 GB | Safe, monitor |
| Total (heavy n8n + 4 Claude agents) | ~16�18 GB | Watch � OOM risk if n8n spikes |
OOM risk flag: Running 4 Claude agents simultaneously while n8n executes Playwright-heavy workflows (browser automation) can push total RAM to 18�20 GB. Monitor via node_exporter / Grafana node_memory_MemAvailable_bytes. If available RAM drops below 4 GB, reduce Claude agent concurrency to 2.
Operations
# Check n8n status
ssh root@54.36.123.110 "cd /opt/p24-infra/bms-4 && docker compose ps"
# Check arbiter status in MongoDB rs
ssh root@54.36.123.110 "mongosh --eval 'rs.status()'"Related Docs
docs/servers/p4-ovh-bms-4-ns3101999-operations.md— detailed operational runbookdocs/n8n-operations.md— n8n queue-mode configurationdocs/mongodb-rs0-operations.md— replica set management