Repository Public
1{2 "app": "clip-spboucher-ai",3 "label": "CLIP — Autonomous AI Cinema & Intelligent Video Network (clip.spboucher.ai)",4 "domain": "clip.spboucher.ai",5 "port": 8640,6 "health_path": "/api/health",7 "dir": "~/apps/clip-spboucher-ai",8 "extra_paths": [],9 "sync_excludes": [".git/", ".DS_Store", "node_modules/", ".next/", ".env", ".env.*", "data/", "test-results/", "playwright-report/", "tsconfig.tsbuildinfo", "next-env.d.ts", "_shot.mjs", "_studio.mjs"],10 "requires": { "runtimes": ["node", "pnpm", "pm2", "postgresql@17", "redis"], "ram_gb": 4, "ports": [8640] },11 "ram_mb_observed": 900,12 "size_mb": 5,13 "placement": { "pin": "M2M32c", "prefer": "M2M32c", "avoid": ["M1M32"], "reason": "PostgreSQL 17 (db clip, role clip_app), Redis 8 (logical db 5), ffmpeg 9 (brew, 2026-11-10) and the content-addressed asset store ~/data/clip-spboucher-ai live on M2M32c; 409 GB free for masters; only one other app (maclustr-research)" },14 "processes": [15 { "name": "clip-web", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": ["node_modules/next/dist/bin/next", "start", "-p", "8640", "-H", "0.0.0.0"], "interpreter": null, "cwd": "{{HOME}}/apps/clip-spboucher-ai", "env": { "NODE_ENV": "production", "PORT": "8640", "NEXT_TELEMETRY_DISABLED": "1", "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "1500M", "kill_timeout": 8000 },16 { "name": "clip-worker", "manager": "pm2", "script": "/opt/homebrew/bin/node", "args": ["node_modules/tsx/dist/cli.mjs", "src/worker/index.ts"], "interpreter": null, "cwd": "{{HOME}}/apps/clip-spboucher-ai", "env": { "NODE_ENV": "production", "NEXT_TELEMETRY_DISABLED": "1", "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin" }, "cron_restart": null, "autorestart": true, "max_memory_restart": "2G", "kill_timeout": 30000 }17 ],18 "ngrok": null,19 "launchd": [],20 "env_overrides": {},21 "hooks": {22 "post_sync": [23 "set -o pipefail; test -f .env || { echo 'ERREUR: .env absent (secrets) — copier ~/Desktop/Cluster/secrets/clip-spboucher-ai/.env'; exit 1; }; chmod 600 .env; mkdir -p ~/data/clip-spboucher-ai ~/backups/clip-spboucher-ai && chmod 700 ~/data/clip-spboucher-ai ~/backups/clip-spboucher-ai && echo ' secrets + storage ok'",24 "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; pnpm install --frozen-lockfile --silent 2>&1 | grep -v '^\\s*at ' | tail -2; test -d node_modules/next && test -d node_modules/bullmq && echo ' deps ok'",25 "set -o pipefail; export PATH=\"/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:$PATH\"; node_modules/.bin/tsx scripts/migrate.ts && node_modules/.bin/tsx scripts/seed.ts && OWNER_OTP_FILE=$HOME/data/clip-spboucher-ai/owner-one-time-password.txt node_modules/.bin/tsx scripts/bootstrap-owner.ts && echo ' db ok'",26 "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; rm -rf .next; NEXT_TELEMETRY_DISABLED=1 node_modules/.bin/next build 2>&1 | grep -vE 'Warning: Dynamic|turbopackIgnore|^\\s*$' | tail -3 && test -f .next/BUILD_ID && echo ' build ok'"27 ],28 "post_start": []29 },30 "ka_repo": false,31 "tunnel": { "domain": "clip.spboucher.ai", "gateway": "BHS64", "note": "DNS A clip.spboucher.ai → 51.161.112.61 vérifié le 2026-11-10 (préexistant, aucune modification) ; route Caddy posée par mld deploy" },32 "notes": "Next.js 16 (clip-web :8640) + worker tsx (clip-worker : BullMQ sur Redis db 5, pipeline xAI Grok Imagine image/vidéo + TTS, FFmpeg, ordonnanceur, sauvegarde 04:20 → ~/backups/clip-spboucher-ai + rsync M3U96a 192.168.2.80). PostgreSQL 17 local (db clip, rôle clip_app). Médias : ~/data/clip-spboucher-ai (hors dépôt, adressés par SHA-256). Secrets uniquement dans ~/apps/clip-spboucher-ai/.env (600) ; copie ~/Desktop/Cluster/secrets/clip-spboucher-ai/.env. Coupe-circuit dépenses : /studio/settings ou `node_modules/.bin/tsx scripts/kill-switch.ts on`."33}34