{ "app": "websensor", "label": "WebSensor — Detect What Changed. Know Why It Matters.", "domain": "www.websensor.io", "port": 8260, "health_path": "/api/ready", "dir": "~/apps/websensor", "extra_paths": [], "sync_excludes": [ "node_modules/", ".next/", ".git/", ".env", ".env.*", "!.env.example", "*.tsbuildinfo", ".turbo/", "logs/", "tmp/", "data/", ".DS_Store", ".claude/", "qa/", "apps/web/.next/", "apps/web/next-env.d.ts", "deploy/*.mld.json", "/coverage/", "apps/*/coverage/", "packages/*/coverage/" ], "requires": { "runtimes": [ "pm2", "node", "pnpm", "postgresql@17", "redis" ], "ram_gb": 8, "ports": [ 8260, 8261, 8262 ] }, "ram_mb_observed": 1500, "size_mb": 40, "placement": { "pin": "M4M64b", "prefer": null, "avoid": [ "M3U96b", "M1M32" ], "reason": "PostgreSQL 17 + Redis + pnpm présents ; 64 Go RAM ; M3U96a déjà chargé (25 processus PM2)" }, "processes": [ { "name": "websensor-engine", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": [ "node_modules/tsx/dist/cli.mjs", "apps/engine/src/index.ts" ], "interpreter": null, "cwd": "{{HOME}}/apps/websensor", "env": { "NODE_ENV": "production", "DATABASE_URL": "postgres://localhost:5432/websensor", "REDIS_URL": "redis://127.0.0.1:6379", "BLOB_STORE_DIR": "{{HOME}}/websensor-data/blobs", "WS_SOURCES_FILE": "./config/sources.yaml", "WS_FETCH_CONCURRENCY": "48", "WS_PER_HOST_CONCURRENCY": "2", "ENGINE_METRICS_PORT": "8262", "WS_USER_AGENT": "WebSensorBot/0.3 (+https://www.websensor.io/bot; contact@websensor.io)", "ANTHROPIC_API_KEY": "", "WS_LLM_MODEL_FAST": "claude-haiku-4-5", "WS_LLM_MODEL_DEEP": "claude-opus-5", "WS_LLM_DAILY_CALL_BUDGET": "600", "WS_LLM_MIN_IMPORTANCE": "35", "WS_LLM_DEEP_MIN_IMPORTANCE": "78", "SCRAPFLY_API_KEY": "", "WS_SCRAPFLY_DAILY_BUDGET": "300", "LOG_LEVEL": "info", "WS_RETENTION_RAW_DAYS": "21", "WS_RETENTION_CHANGED_RAW_DAYS": "60", "WS_SILENT_MIN_IMPORTANCE": "45" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "2G" }, { "name": "websensor-factory", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": [ "node_modules/tsx/dist/cli.mjs", "apps/engine/src/factory-main.ts" ], "interpreter": null, "cwd": "{{HOME}}/apps/websensor", "env": { "NODE_ENV": "production", "DATABASE_URL": "postgres://localhost:5432/websensor", "REDIS_URL": "redis://127.0.0.1:6379", "BLOB_STORE_DIR": "{{HOME}}/websensor-data/blobs", "WS_SOURCES_FILE": "./config/sources.yaml", "WS_USER_AGENT": "WebSensorBot/0.3 (+https://www.websensor.io/bot; contact@websensor.io)", "LOG_LEVEL": "info", "WS_FACTORY": "1", "WS_FACTORY_CONCURRENCY": "10", "WS_FACTORY_BUDGET": "90", "WS_FACTORY_MIN_SCORE": "0.35", "WS_FACTORY_SHADOW_MIN_CHECKS": "5", "WS_FACTORY_SHADOW_MIN_HOURS": "24", "WS_FACTORY_SHADOW_MAX_HOURS": "120", "WS_FACTORY_TICK_SECONDS": "20", "WS_COVERAGE_DIR": "./config/coverage", "WS_EDGAR_USER_AGENT": "WebSensor (contact@websensor.io)", "WS_APP_NAME": "websensor-factory", "WS_FACTORY_DEADLINE_MS": "120000" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "1500M" }, { "name": "websensor-api", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": [ "node_modules/tsx/dist/cli.mjs", "apps/api/src/server.ts" ], "interpreter": null, "cwd": "{{HOME}}/apps/websensor", "env": { "NODE_ENV": "production", "DATABASE_URL": "postgres://localhost:5432/websensor", "REDIS_URL": "redis://127.0.0.1:6379", "BLOB_STORE_DIR": "{{HOME}}/websensor-data/blobs", "API_PORT": "8260", "API_HOST": "0.0.0.0", "WEB_URL": "http://127.0.0.1:8261", "PUBLIC_BASE_URL": "https://www.websensor.io", "CANONICAL_HOST": "www.websensor.io", "LOG_LEVEL": "info", "WS_ADMIN_TOKEN": "", "WS_MONITORS_PER_OWNER": "5" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "1G" }, { "name": "websensor-web", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": [ "node_modules/next/dist/bin/next", "start", "-p", "8261", "-H", "127.0.0.1" ], "interpreter": null, "cwd": "{{HOME}}/apps/websensor/apps/web", "env": { "NODE_ENV": "production", "API_URL": "http://127.0.0.1:8260", "NEXT_PUBLIC_SITE_URL": "https://www.websensor.io", "NEXT_TELEMETRY_DISABLED": "1" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "1G" } ], "ngrok": null, "launchd": [], "env_overrides": {}, "hooks": { "post_sync": [ "export PATH=\"/opt/homebrew/bin:$PATH\"; pnpm install --frozen-lockfile --silent && echo ' deps ok'", "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; psql -d postgres -Atc \"select 1 from pg_database where datname='websensor'\" | grep -q 1 || createdb websensor; DATABASE_URL=postgres://localhost:5432/websensor pnpm db:migrate 2>&1 | tail -1 && echo ' db ok'", "export PATH=\"/opt/homebrew/bin:$PATH\"; mkdir -p $HOME/websensor-data/blobs && DATABASE_URL=postgres://localhost:5432/websensor node node_modules/tsx/dist/cli.mjs apps/engine/src/cli.ts sync 2>&1 | tail -1 && echo ' registry ok'", "export PATH=\"/opt/homebrew/bin:$PATH\"; DATABASE_URL=postgres://localhost:5432/websensor node node_modules/tsx/dist/cli.mjs apps/engine/src/cli.ts factory seed --mode=hinted 2>&1 | tail -1 && echo ' factory seeds ok'", "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; export API_URL=http://127.0.0.1:8260 NEXT_PUBLIC_SITE_URL=https://www.websensor.io NEXT_TELEMETRY_DISABLED=1; pnpm --filter @websensor/web build 2>&1 | tail -3 && echo ' web build ok'" ], "post_start": [] }, "notes": "v0.1.0 (2026-09-08) : gateway Fastify :8260 (REST + WS /api/v1/live + proxy → Next :8261), engine (scheduler/pipeline, métriques :8262), 200 sources / ~290 capteurs (config/sources.yaml), Postgres 17 + Redis locaux, blobs zstd dans ~/websensor-data/blobs. Secrets uniquement dans ce manifeste (M1M32).", "tunnel": { "domain": "www.websensor.io", "gateway": "BHS64", "note": "MacLustr Tunnel depuis 2026-09-10 ; ngrok retiré" } }