| 50 | { |
50 | { |
| 51 | "name": "findata-api", |
51 | "name": "findata-api", |
| 52 | "manager": "pm2", |
52 | "manager": "pm2", |
| 53 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
53 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 54 | "args": [ |
54 | "args": [ |
| |
55 | + "{{HOME}}/apps/findata", |
| |
56 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 55 | "-m", |
57 | "-m", |
| 56 | "uvicorn", |
58 | "uvicorn", |
| 57 | "findata_api.main:app", |
59 | "findata_api.main:app", |
| 70 | }, |
72 | }, |
| 71 | "cron_restart": null, |
73 | "cron_restart": null, |
| 72 | "autorestart": true, |
74 | "autorestart": true, |
| 73 | − "max_memory_restart": "6G" |
75 | + "max_memory_restart": "6G", |
| |
76 | + "kill_timeout": 30000 |
| 74 | }, |
77 | }, |
| 75 | { |
78 | { |
| 76 | "name": "findata-worker", |
79 | "name": "findata-worker", |
| 77 | "manager": "pm2", |
80 | "manager": "pm2", |
| 78 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
81 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 79 | "args": [ |
82 | "args": [ |
| |
83 | + "{{HOME}}/apps/findata", |
| |
84 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 80 | "-m", |
85 | "-m", |
| 81 | "findata_ingest.cli", |
86 | "findata_ingest.cli", |
| 82 | "worker" |
87 | "worker" |
| 89 | }, |
94 | }, |
| 90 | "cron_restart": null, |
95 | "cron_restart": null, |
| 91 | "autorestart": true, |
96 | "autorestart": true, |
| 92 | − "max_memory_restart": "24G" |
97 | + "max_memory_restart": "24G", |
| |
98 | + "kill_timeout": 3600000 |
| 93 | }, |
99 | }, |
| 94 | { |
100 | { |
| 95 | "name": "findata-bulk-1", |
101 | "name": "findata-bulk-1", |
| 96 | "manager": "pm2", |
102 | "manager": "pm2", |
| 97 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
103 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 98 | "args": [ |
104 | "args": [ |
| |
105 | + "{{HOME}}/apps/findata", |
| |
106 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 99 | "-m", |
107 | "-m", |
| 100 | "findata_ingest.cli", |
108 | "findata_ingest.cli", |
| 101 | "worker", |
109 | "worker", |
| 110 | }, |
118 | }, |
| 111 | "cron_restart": null, |
119 | "cron_restart": null, |
| 112 | "autorestart": true, |
120 | "autorestart": true, |
| 113 | − "max_memory_restart": "12G" |
121 | + "max_memory_restart": "12G", |
| |
122 | + "kill_timeout": 3600000 |
| 114 | }, |
123 | }, |
| 115 | { |
124 | { |
| 116 | "name": "findata-bulk-2", |
125 | "name": "findata-bulk-2", |
| 117 | "manager": "pm2", |
126 | "manager": "pm2", |
| 118 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
127 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 119 | "args": [ |
128 | "args": [ |
| |
129 | + "{{HOME}}/apps/findata", |
| |
130 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 120 | "-m", |
131 | "-m", |
| 121 | "findata_ingest.cli", |
132 | "findata_ingest.cli", |
| 122 | "worker", |
133 | "worker", |
| 131 | }, |
142 | }, |
| 132 | "cron_restart": null, |
143 | "cron_restart": null, |
| 133 | "autorestart": true, |
144 | "autorestart": true, |
| 134 | − "max_memory_restart": "12G" |
145 | + "max_memory_restart": "12G", |
| |
146 | + "kill_timeout": 3600000 |
| 135 | }, |
147 | }, |
| 136 | { |
148 | { |
| 137 | "name": "findata-bulk-3", |
149 | "name": "findata-bulk-3", |
| 138 | "manager": "pm2", |
150 | "manager": "pm2", |
| 139 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
151 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 140 | "args": [ |
152 | "args": [ |
| |
153 | + "{{HOME}}/apps/findata", |
| |
154 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 141 | "-m", |
155 | "-m", |
| 142 | "findata_ingest.cli", |
156 | "findata_ingest.cli", |
| 143 | "worker", |
157 | "worker", |
| 152 | }, |
166 | }, |
| 153 | "cron_restart": null, |
167 | "cron_restart": null, |
| 154 | "autorestart": true, |
168 | "autorestart": true, |
| 155 | − "max_memory_restart": "12G" |
169 | + "max_memory_restart": "12G", |
| |
170 | + "kill_timeout": 3600000 |
| 156 | }, |
171 | }, |
| 157 | { |
172 | { |
| 158 | "name": "findata-bulk-4", |
173 | "name": "findata-bulk-4", |
| 159 | "manager": "pm2", |
174 | "manager": "pm2", |
| 160 | − "script": "{{HOME}}/apps/findata/.venv/bin/python", |
175 | + "script": "{{HOME}}/apps/findata/infra/scripts/run-under-sshd.sh", |
| 161 | "args": [ |
176 | "args": [ |
| |
177 | + "{{HOME}}/apps/findata", |
| |
178 | + "{{HOME}}/apps/findata/.venv/bin/python", |
| 162 | "-m", |
179 | "-m", |
| 163 | "findata_ingest.cli", |
180 | "findata_ingest.cli", |
| 164 | "worker", |
181 | "worker", |
| 173 | }, |
190 | }, |
| 174 | "cron_restart": null, |
191 | "cron_restart": null, |
| 175 | "autorestart": true, |
192 | "autorestart": true, |
| 176 | − "max_memory_restart": "12G" |
193 | + "max_memory_restart": "12G", |
| |
194 | + "kill_timeout": 3600000 |
| 177 | } |
195 | } |
| 178 | ], |
196 | ], |
| 179 | "ngrok": null, |
197 | "ngrok": null, |
| 195 | "gateway": "BHS64", |
213 | "gateway": "BHS64", |
| 196 | "note": "DNS GoDaddy A findata.spboucher.ai → 51.161.112.61 vérifié le 2026-11-01 avant déploiement ; route Caddy posée par mld deploy ; findata-api écoute 0.0.0.0:8600 avec garde de provenance (loopback, wg1 10.67.0.0/16, LAN) ; Caddy → wg1 10.67.0.10:8600" |
214 | "note": "DNS GoDaddy A findata.spboucher.ai → 51.161.112.61 vérifié le 2026-11-01 avant déploiement ; route Caddy posée par mld deploy ; findata-api écoute 0.0.0.0:8600 avec garde de provenance (loopback, wg1 10.67.0.0/16, LAN) ; Caddy → wg1 10.67.0.10:8600" |
| 197 | }, |
215 | }, |
| 198 | − "notes": "Monorepo uv (Python 3.13) : services/api (FastAPI :8600, sert aussi la console Next.js statique apps/web/out), services/ingest (worker unique = verrou d'écriture du lac + ordonnanceur), lac Parquet ~/findata-lake, Postgres 17 local (DB findata, rôle findata). Secrets uniquement dans ~/apps/findata/.env (600) ; copie ~/Desktop/Cluster/secrets/findata/.env. Sauvegarde quotidienne 04:00 ET → M4M64a:~/backups/findata (rsync + pg_dump zstd). CLI : .venv/bin/findata status|discover|ingest … | 2026-11-01 soir : lac froid FINDATA_LAKE_COLD=/Volumes/ssd/findata (SSD externe 4 To, marqueur .findata-cold-root) pour les archives brutes et les datasets non « hot » ; 4 workers bulk (findata-bulk-1..4) pour backfill/options/fundamentals en parallèle ; téléchargement complet FirstRate lancé via `findata ingest backfill-all`." |
216 | + "notes": "Monorepo uv (Python 3.13) : services/api (FastAPI :8600, sert aussi la console Next.js statique apps/web/out), services/ingest (worker unique = verrou d'écriture du lac + ordonnanceur), lac Parquet ~/findata-lake, Postgres 17 local (DB findata, rôle findata). Secrets uniquement dans ~/apps/findata/.env (600) ; copie ~/Desktop/Cluster/secrets/findata/.env. Sauvegarde quotidienne 04:00 ET → M4M64a:~/backups/findata (rsync + pg_dump zstd). CLI : .venv/bin/findata status|discover|ingest … | 2026-11-01 soir : lac froid FINDATA_LAKE_COLD=/Volumes/ssd/findata (SSD externe 4 To, marqueur .findata-cold-root) pour les archives brutes et les datasets non « hot » ; 4 workers bulk (findata-bulk-1..4) pour backfill/options/fundamentals en parallèle ; téléchargement complet FirstRate lancé via `findata ingest backfill-all`. | TCC macOS : PM2/launchd n'ont pas l'Accès complet au disque → tous les processus passent par infra/scripts/run-under-sshd.sh (ré-exécution via sshd localhost, clé id_ed25519_maclustr) pour accéder au SSD externe. Alternative propre : accorder FDA à node + python dans Réglages → Confidentialité (GUI)." |
| 199 | } |
217 | } |