IONOS VPS vps-i1

Environment ID: vps-i1 Type: production Status: active

Purpose

Primary production VPS for the p24-infra monitoring stack. Hosts Prometheus, Grafana, Thanos, Alertmanager, and all custom exporters. Also runs Traccar for GPS tracking and serves as the host for the AI-Dev-IO1 Claude Code agent runner.

Hardware

FieldValue
ProviderIONOS
IP217.154.82.162
OSAlmaLinux 9.7
vCPU6
RAM8 GB
Disk239 GB
DNS*.vps-i1.infra.zintegrowana.online (wildcard → 217.154.82.162)

Running Containers

ContainerPurposePort
monitoring-caddy-1TLS reverse proxy80, 443
monitoring-grafana-1Dashboards127.0.0.1:3000
monitoring-prometheus-1Metrics collection, 15d local TSDB127.0.0.1:9090
monitoring-alertmanager-1Email alerts via Mailgun EU127.0.0.1:9093
monitoring-thanos-sidecar-1Uploads 2h Prometheus blocks to Wasabi S3
monitoring-thanos-query-1Unified PromQL over local + S3127.0.0.1:10902
node_exporterHost metrics9100
queue-exporterSupabase queue depths9200
pg-stats-exporterSupabase pg_stat_statements slow queries9201
backup-exporterWasabi backup status JSON9220
cost-exporterVercel/Supabase/Wasabi billing9210
vercel-exporterVercel deployment metrics
credential-exporterCredential rotation age tracking
pdf-serviceHTML-to-PDF API (wraps Gotenberg)8100
gotenbergPDF rendering engineinternal
traccarGPS tracking8082 (web), 5027 (GPS/UDP)
traccar-dbMySQL for Traccarinternal

Access

# As root (human developer)
ssh root@217.154.82.162 -i C:\Users\konar\.ssh\id_ed25519
 
# As claude-admin (CI/automated)
ssh claude-admin@217.154.82.162
# Passwordless sudo for: docker, systemctl, mkdir, chown, cp, tee

AI-Dev-IO1 Claude Agent

FieldValue
GitHub userAI-Dev-IO1
Claude versionv2.1.121 (/usr/bin/claude)
AuthOAuth subscription (Claude Max) — not API key
Credentials/home/claude-runner/.claude/.credentials.json
Max parallel agents3
Rolemonitoring-ops
Daily scan window09:00–22:45 UTC (max 3 parallel)
Nightly review window23:00–01:00 UTC (max 5 parallel)
Env sync6-hour cron via Ansible claude-env-sync role

Re-auth procedure

OAuth tokens expire every 8–12 hours and auto-refresh. If auth fails:

  1. Claude attempts Playwright automation first (no human needed)
  2. If that fails twice: Discord alert + GitHub issue with human-action label

Operations

# Check stack status
ssh root@217.154.82.162 "cd /opt/p24-infra/monitoring && docker compose ps"
 
# Hot-reload Prometheus config
ssh root@217.154.82.162 "curl -X POST http://localhost:9090/-/reload"
 
# View grafana logs
ssh root@217.154.82.162 "cd /opt/p24-infra/monitoring && docker compose logs --tail=50 grafana"
 
# Restart a service
ssh root@217.154.82.162 "cd /opt/p24-infra/monitoring && docker compose restart alertmanager"
 
# Pull latest and redeploy
ssh root@217.154.82.162 "cd /opt/p24-infra && git pull && cd monitoring && docker compose up -d"

Monitoring URLs

URLServiceAuth
grafana.vps-i1.infra.zintegrowana.onlineGrafanaGrafana login
prometheus.vps-i1.infra.zintegrowana.onlinePrometheusbasic_auth
alertmanager.vps-i1.infra.zintegrowana.onlineAlertmanagerbasic_auth
traccar.vps-i1.infra.zintegrowana.onlineTraccar GPSTraccar login
status.vps-i1.infra.zintegrowana.onlineUptime KumaKuma login
infra.zintegrowana.onlineGrafana (public alias)Grafana login

Secrets

Primary source: secrets/monitoring.env.sops (SOPS+age) Server fallback: /opt/p24-infra/monitoring/.env

Secrets Access

Secret storeAccess methodCan decrypt SOPS?
secrets/monitoring.env.sopsDirect SOPS decrypt � age key at /home/claude-runner/.age/keys.txtYes � claude-runner has the age key
All other secrets/*.env.sops filesSame age key � can decrypt all SOPS filesYes
On-server plaintext fallback/opt/p24-infra/monitoring/.env (deployed by CI)N/A � already plaintext
GitHub Actions secretsNot accessible from VPS directlyN/A

vps-i1 / AI-Dev-IO1 does hold the SOPS age key at /home/claude-runner/.age/keys.txt (verified 2026-06-24). The monitoring stack secrets can be decrypted directly on the VPS. CI also deploys a plaintext copy to /opt/p24-infra/monitoring/.env on each merge.

Notes

  • Wildcard DNS *.vps-i1.infra.zintegrowana.online covers all services — no DNS change needed for new services, just add a Caddy entry.
  • Monitoring compose file: /opt/p24-infra/monitoring/docker-compose.yml
  • Repo synced to /opt/p24-infra on every push to main or dev