1{2 "app": "qc26",3 "label": "QC26 — L'élection québécoise 2026, en données",4 "domain": "www.qc26.ca",5 "port": 8200,6 "health_path": "/healthz",7 "dir": "~/apps/qc26",8 "extra_paths": [],9 "sync_excludes": [10 "engine/.venv/",11 "__pycache__/",12 ".pytest_cache/",13 ".ruff_cache/",14 "*.egg-info/",15 ".git/",16 "web/node_modules/",17 "web/.next/",18 "engine/logs/",19 "logs/",20 ".DS_Store",21 "engine/data/qc26.db",22 "engine/data/qc26.db-shm",23 "engine/data/qc26.db-wal",24 "engine/data/archive/",25 "engine/data/cache/"26 ],27 "requires": {28 "runtimes": [29 "pm2",30 "ngrok",31 "node",32 "pnpm",33 "uv",34 "uv-python@3.12"35 ],36 "ram_gb": 4,37 "ports": [38 8200,39 820140 ]41 },42 "ram_mb_observed": 1200,43 "size_mb": 120,44 "placement": {45 "pin": null,46 "prefer": "M3U96a",47 "avoid": [48 "M3U96b",49 "M1M32"50 ],51 "reason": "Monte Carlo numpy + build Next.js : cœurs et RAM ; uv-py3.12 + pnpm présents ; M3U96b réservé hfmarketdata"52 },53 "processes": [54 {55 "name": "qc26-engine",56 "manager": "pm2",57 "script": "{{HOME}}/apps/qc26/engine/.venv/bin/python",58 "args": [59 "-m",60 "uvicorn",61 "qc26.main:app",62 "--host",63 "127.0.0.1",64 "--port",65 "8201",66 "--no-access-log"67 ],68 "interpreter": null,69 "cwd": "{{HOME}}/apps/qc26/engine",70 "env": {71 "QC26_ENVIRONMENT": "production",72 "QC26_PORT": "8201",73 "QC26_PUBLIC_URL": "https://www.qc26.ca",74 "QC26_ADMIN_TOKEN": "qc26-admin-2026-Kp8vT3nQ7zLw",75 "QC26_FIRECRAWL_API_KEY": "fc-8cc44cb683044aee82e8cbad6505a01a",76 "QC26_ANTHROPIC_API_KEY": "__SET_AT_DEPLOY__",77 "QC26_LLM_MODEL": "claude-opus-5",78 "QC26_N_SIMULATIONS": "20000",79 "PYTHONUNBUFFERED": "1"80 },81 "cron_restart": null,82 "autorestart": true,83 "max_memory_restart": "3G"84 },85 {86 "name": "qc26-web",87 "manager": "pm2",88 "script": "/opt/homebrew/bin/node",89 "args": [90 "node_modules/next/dist/bin/next",91 "start",92 "-p",93 "8200",94 "-H",95 "0.0.0.0"96 ],97 "interpreter": null,98 "cwd": "{{HOME}}/apps/qc26/web",99 "env": {100 "NODE_ENV": "production",101 "QC26_ENGINE_URL": "http://127.0.0.1:8201",102 "NEXT_PUBLIC_SITE_URL": "https://www.qc26.ca",103 "NEXT_TELEMETRY_DISABLED": "1"104 },105 "cron_restart": null,106 "autorestart": true,107 "max_memory_restart": "1500M"108 }109 ],110 "ngrok": {111 "name": "qc26-ngrok",112 "url": "www.qc26.ca",113 "port": 8200114 },115 "launchd": [],116 "env_overrides": {},117 "hooks": {118 "post_sync": [119 "export PATH=\"$HOME/.local/bin:/opt/homebrew/bin:$PATH\"; cd engine && (test -x .venv/bin/python || uv venv --python 3.12 .venv) && uv pip install -q --python .venv/bin/python -e . && echo ' engine deps ok'",120 "export PATH=\"/opt/homebrew/bin:$PATH\"; cd web && pnpm install --frozen-lockfile --silent && echo ' web deps ok'",121 "export PATH=\"/opt/homebrew/bin:$PATH\"; cd web && QC26_ENGINE_URL=http://127.0.0.1:8201 NEXT_PUBLIC_SITE_URL=https://www.qc26.ca NEXT_TELEMETRY_DISABLED=1 pnpm build 2>&1 | tail -3 && echo ' web build ok'",122 "mkdir -p engine/data/archive/polls engine/data/archive/documents engine/data/archive/live engine/data/cache engine/logs && echo ' data ok'"123 ],124 "post_start": []125 },126 "notes": "Après le premier déploiement (2026-09-06), la base et les archives du nœud sont la source de vérité : exclues des syncs suivants."127}