1{2 "app": "akos",3 "label": "AKOS — API Knowledge Operating System (akos.spboucher.ai)",4 "domain": "akos.spboucher.ai",5 "port": 8520,6 "health_path": "/api/v1/health",7 "dir": "~/apps/akos",8 "extra_paths": [],9 "sync_excludes": [".git/", ".DS_Store", ".venv/", "web/node_modules/", "web/dist/", "data/", "logs/", "backups/", ".env", "__pycache__/", ".pytest_cache/", "tests/e2e/node_modules/"],10 "requires": { "runtimes": ["uv", "node", "pnpm", "pm2", "postgresql@17"], "ram_gb": 3, "ports": [8520, 8521] },11 "ram_mb_observed": 400,12 "size_mb": 15,13 "placement": { "pin": "M4M64c", "prefer": "M4M64c", "avoid": ["M1M32"], "reason": "PostgreSQL 17 + pgvector installés et initialisés sur M4M64c (DB akos + akos_test, rôle akos, localhost) ; sandbox-exec vérifié ; wg1 10.67.0.33 ; nœud peu chargé (chat + note)" },14 "processes": [15 { "name": "akos-web", "manager": "pm2", "script": "{{HOME}}/apps/akos/.venv/bin/python", "args": ["-m", "akos", "web"], "interpreter": null, "cwd": "{{HOME}}/apps/akos", "env": {"AKOS_ROOT": "{{HOME}}/apps/akos"}, "cron_restart": null, "autorestart": true, "max_memory_restart": "1G" },16 { "name": "akos-worker", "manager": "pm2", "script": "{{HOME}}/apps/akos/.venv/bin/python", "args": ["-m", "akos", "worker"], "interpreter": null, "cwd": "{{HOME}}/apps/akos", "env": {"AKOS_ROOT": "{{HOME}}/apps/akos"}, "cron_restart": null, "autorestart": true, "max_memory_restart": "2G" },17 { "name": "akos-proxy", "manager": "pm2", "script": "{{HOME}}/apps/akos/.venv/bin/python", "args": ["-m", "akos", "proxy"], "interpreter": null, "cwd": "{{HOME}}/apps/akos", "env": {"AKOS_ROOT": "{{HOME}}/apps/akos"}, "cron_restart": null, "autorestart": true, "max_memory_restart": "512M" }18 ],19 "ngrok": null,20 "launchd": [],21 "env_overrides": {},22 "hooks": {23 "post_sync": [24 "export PATH=\"/opt/homebrew/bin:$HOME/.local/bin:$PATH\"; test -f .env || { echo 'ERREUR: .env absent (secrets) — copier ~/Desktop/Cluster/secrets/akos/.env'; exit 1; }; chmod 600 .env",25 "export PATH=\"/opt/homebrew/bin:$HOME/.local/bin:$PATH\"; uv sync --frozen 2>&1 | tail -1 && echo ' python deps ok'",26 "export PATH=\"/opt/homebrew/bin:$PATH\"; cd web && pnpm install --frozen-lockfile --silent && pnpm build 2>&1 | tail -2 && echo ' web build ok'",27 "export PATH=\"/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:$PATH\"; .venv/bin/python -m akos migrate && echo ' migrations ok'",28 "mkdir -p data/artifacts logs ~/backups/akos && chmod 700 data && echo ' data ok'"29 ],30 "post_start": []31 },32 "ka_repo": false,33 "tunnel": { "domain": "akos.spboucher.ai", "gateway": "BHS64", "note": "DNS GoDaddy A akos.spboucher.ai → 51.161.112.61 vérifié le 2026-11-01 ; route Caddy posée par mld deploy ; akos-web écoute 127.0.0.1 + wg1 seulement" },34 "notes": "FastAPI (uv venv .venv, Python 3.13) + worker + proxy d'égress (127.0.0.1:8521) + Postgres 17 local (DB akos, rôle akos). Secrets uniquement dans ~/apps/akos/.env (600) ; copie ~/Desktop/Cluster/secrets/akos/.env. Vault = trousseau macOS (service akos). Backups nocturnes (worker 03:40 UTC) → ~/backups/akos + M3U96b:~/backups/akos. Tests : make test (offline) / make test-node (sandbox + backup)."35}36