spb/company-atlas
Public
Python 66.3%
TypeScript 22.7%
JavaScript 8.6%
HTML 1.4%
CSS 0.7%
1{2 "app": "company-atlas",3 "label": "Company Atlas — the live atlas of global companies",4 "domain": "www.company-atlas.co",5 "port": 8360,6 "health_path": "/api/v1/health",7 "dir": "~/apps/company-atlas",8 "extra_paths": [],9 "sync_excludes": [10 ".venv/",11 "__pycache__/",12 ".pytest_cache/",13 ".ruff_cache/",14 "*.egg-info/",15 ".git/",16 ".env",17 ".env.*",18 "!.env.example",19 "node_modules/",20 "apps/web/.next/",21 "apps/web/.next-*/",22 "apps/web/next-env.d.ts",23 "*.tsbuildinfo",24 "apps/web/qa/screens/",25 "/data/",26 "/tmp/",27 "logs/",28 ".DS_Store",29 ".claude/",30 "deploy/.admin-token",31 "deploy/.llm-key",32 "deploy/rendered/",33 "fixtures/live/"34 ],35 "requires": {36 "runtimes": [37 "pm2",38 "node",39 "pnpm",40 "uv",41 "uv-python@3.12"42 ],43 "ram_gb": 12,44 "ports": [45 8360,46 836147 ]48 },49 "ram_mb_observed": 4000,50 "size_mb": 80,51 "placement": {52 "pin": "M2U64",53 "prefer": null,54 "avoid": [55 "M3U96b",56 "M1M32"57 ],58 "reason": "Mac Studio M2 Ultra 24 c / 64 Go, 53 Go libres, Postgres 17 Homebrew déjà présent (base companyatlas créée le 2026-09-12), wg1 10.67.0.12 ; crawler continu (25 000+ capteurs) + Postgres = nœud le plus généreux hors M3U96a/b"59 },60 "processes": [61 {62 "name": "company-atlas-api",63 "manager": "pm2",64 "script": "{{HOME}}/apps/company-atlas/.venv/bin/python",65 "args": [66 "-m",67 "uvicorn",68 "companyatlas.api.main:app",69 "--host",70 "127.0.0.1",71 "--port",72 "8361",73 "--no-access-log",74 "--proxy-headers",75 "--timeout-keep-alive",76 "75",77 "--workers",78 "2"79 ],80 "interpreter": null,81 "cwd": "{{HOME}}/apps/company-atlas",82 "env": {83 "APP_ENV": "production",84 "CA_SITE_URL": "https://www.company-atlas.co",85 "DATABASE_URL": "postgresql+asyncpg://companyatlas:companyatlas@127.0.0.1:5432/companyatlas",86 "CA_DATA_DIR": "{{HOME}}/company-atlas-data",87 "CA_API_HOST": "127.0.0.1",88 "CA_API_PORT": "8361",89 "CA_ADMIN_TOKEN": "{{ADMIN_TOKEN}}",90 "CA_LLM_BASE_URL": "https://www.llm-api.io/v1",91 "CA_LLM_API_KEY": "{{LLM_KEY}}",92 "CA_DB_POOL_SIZE": "6",93 "CA_LOG_JSON": "1",94 "PYTHONUNBUFFERED": "1"95 },96 "cron_restart": null,97 "autorestart": true,98 "max_memory_restart": "2G"99 },100 {101 "name": "company-atlas-scheduler",102 "manager": "pm2",103 "script": "{{HOME}}/apps/company-atlas/.venv/bin/catlas",104 "args": [105 "schedule"106 ],107 "interpreter": null,108 "cwd": "{{HOME}}/apps/company-atlas",109 "env": {110 "APP_ENV": "production",111 "CA_SITE_URL": "https://www.company-atlas.co",112 "DATABASE_URL": "postgresql+asyncpg://companyatlas:companyatlas@127.0.0.1:5432/companyatlas",113 "CA_DATA_DIR": "{{HOME}}/company-atlas-data",114 "CA_ADMIN_TOKEN": "{{ADMIN_TOKEN}}",115 "CA_LLM_BASE_URL": "https://www.llm-api.io/v1",116 "CA_LLM_API_KEY": "{{LLM_KEY}}",117 "CA_FETCH_CONCURRENCY": "48",118 "CA_SCHEDULER_CLAIM_BATCH": "400",119 "CA_ONBOARDING_CONCURRENCY": "12",120 "CA_DB_POOL_SIZE": "12",121 "CA_DB_MAX_OVERFLOW": "12",122 "CA_WORKER_CONCURRENCY": "1",123 "CA_LOG_JSON": "1",124 "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin",125 "PYTHONUNBUFFERED": "1"126 },127 "cron_restart": null,128 "autorestart": true,129 "max_memory_restart": "6G"130 },131 {132 "name": "company-atlas-web",133 "manager": "pm2",134 "script": "/opt/homebrew/bin/node",135 "args": [136 "node_modules/next/dist/bin/next",137 "start",138 "-p",139 "8360",140 "-H",141 "0.0.0.0"142 ],143 "interpreter": null,144 "cwd": "{{HOME}}/apps/company-atlas/apps/web",145 "env": {146 "NODE_ENV": "production",147 "API_URL": "http://127.0.0.1:8361",148 "NEXT_PUBLIC_SITE_URL": "https://www.company-atlas.co",149 "NEXT_TELEMETRY_DISABLED": "1"150 },151 "cron_restart": null,152 "autorestart": true,153 "max_memory_restart": "2G"154 }155 ],156 "ngrok": null,157 "launchd": [],158 "env_overrides": {},159 "hooks": {160 "post_sync": [161 "set -o pipefail; mkdir -p $HOME/company-atlas-data/{objects,logs,backups,cache,seed} && echo ' data dirs ok'",162 "set -o pipefail; export PATH=\"$HOME/.local/bin:/opt/homebrew/bin:$PATH\"; (test -x .venv/bin/python || uv venv --python 3.12 .venv) && uv pip install -q --python .venv/bin/python -e . && echo ' python deps ok'",163 "set -o pipefail; export PATH=\"/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:$PATH\"; export DATABASE_URL=postgresql+asyncpg://companyatlas:companyatlas@127.0.0.1:5432/companyatlas CA_DATA_DIR=$HOME/company-atlas-data CA_LOG_JSON=0; .venv/bin/catlas migrate 2>&1 | tail -1 && .venv/bin/catlas seed 2>&1 | tail -2 && echo ' migrate + seed ok'",164 "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; pnpm install --frozen-lockfile --silent && echo ' web deps ok'",165 "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; cd apps/web && API_URL=http://127.0.0.1:8361 NEXT_PUBLIC_SITE_URL=https://www.company-atlas.co NEXT_TELEMETRY_DISABLED=1 pnpm build 2>&1 | tail -3 && echo ' web build ok'"166 ],167 "post_start": []168 },169 "notes": "v0.1.0 (2026-09-12) : Next 16 :8360 (rewrites /api/v1/* → FastAPI 127.0.0.1:8361, 2 workers uvicorn), scheduler `catlas schedule` (capteurs dus + onboarding/discovery + tâches périodiques : events, enrichissement LLM via llm-api.io, métriques horaires, agrégats quotidiens, signaux, tendances, alertes, réparation, rétention, backup pg_dump). Postgres 17 Homebrew local (base companyatlas, rôle companyatlas) ; pas de Redis. Données hors repo ~/company-atlas-data (objets zstd content-addressed, logs, backups). Secrets : CA_ADMIN_TOKEN (laptop deploy/.admin-token) et CA_LLM_API_KEY (laptop deploy/.llm-key, clé llm-api.io « company-atlas »). Après le premier deploy : `bash deploy/first-run.sh` sur le nœud (onboarding de masse). DNS : www.company-atlas.co A → 51.161.112.61 (OK) ; apex company-atlas.co sans A ; company-atlas.com a ses NS chez Vercel — à repointer avant d'ajouter la route/redirection .com.",170 "tunnel": {171 "domain": "www.company-atlas.co",172 "gateway": "BHS64",173 "redirects": [],174 "note": "Ajouter company-atlas.co (apex) et www.company-atlas.com / company-atlas.com dans redirects dès que leurs A pointent vers 51.161.112.61."175 }176}177