Repository Public
1{2 "app": "sp-calendar",3 "label": "SP Calendar — prise de rendez-vous self-hosted (calendar.spboucher.ai)",4 "domain": "calendar.spboucher.ai",5 "port": 8660,6 "health_path": "/api/health",7 "dir": "~/apps/sp-calendar",8 "extra_paths": [],9 "sync_excludes": [10 ".git/",11 ".DS_Store",12 "node_modules/",13 ".next/",14 ".env",15 ".env.*",16 "data/",17 "backups/",18 "test-results/",19 "playwright-report/",20 "tsconfig.tsbuildinfo",21 "next-env.d.ts",22 "_*.mjs"23 ],24 "requires": {25 "runtimes": [26 "node",27 "pnpm",28 "pm2",29 "postgresql@17"30 ],31 "ram_gb": 2,32 "ports": [33 866034 ]35 },36 "ram_mb_observed": 400,37 "size_mb": 3,38 "placement": {39 "pin": "M4M64c",40 "prefer": "M4M64c",41 "avoid": [42 "M1M32"43 ],44 "reason": "Choisi par mld pick le 2026-11-11 (score 0.558, premier). PostgreSQL 17 local : base sp_calendar, rôle spcal_app créés ce jour-là ; sauvegardes ~/backups/sp-calendar ; les clés d'accès sont liées au domaine, pas au nœud, mais la base ne suit pas un mld move sans dump/restore."45 },46 "processes": [47 {48 "name": "sp-calendar-web",49 "manager": "pm2",50 "script": "/opt/homebrew/bin/node",51 "args": [52 "node_modules/next/dist/bin/next",53 "start",54 "-p",55 "8660",56 "-H",57 "0.0.0.0"58 ],59 "interpreter": null,60 "cwd": "{{HOME}}/apps/sp-calendar",61 "env": {62 "NODE_ENV": "production",63 "PORT": "8660",64 "NEXT_TELEMETRY_DISABLED": "1",65 "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"66 },67 "cron_restart": null,68 "autorestart": true,69 "max_memory_restart": "1G",70 "kill_timeout": 800071 },72 {73 "name": "sp-calendar-worker",74 "manager": "pm2",75 "script": "/opt/homebrew/bin/node",76 "args": [77 "node_modules/tsx/dist/cli.mjs",78 "src/worker/index.ts"79 ],80 "interpreter": null,81 "cwd": "{{HOME}}/apps/sp-calendar",82 "env": {83 "NODE_ENV": "production",84 "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"85 },86 "cron_restart": null,87 "autorestart": true,88 "max_memory_restart": "600M",89 "kill_timeout": 1500090 },91 {92 "name": "sp-calendar-backup",93 "manager": "pm2",94 "script": "/bin/bash",95 "args": [96 "scripts/backup.sh"97 ],98 "interpreter": null,99 "cwd": "{{HOME}}/apps/sp-calendar",100 "env": {101 "PATH": "/opt/homebrew/opt/postgresql@17/bin:/opt/homebrew/bin:/usr/bin:/bin:/usr/sbin:/sbin"102 },103 "cron_restart": "35 3 * * *",104 "autorestart": false,105 "max_memory_restart": null106 }107 ],108 "ngrok": null,109 "launchd": [],110 "env_overrides": {},111 "hooks": {112 "post_sync": [113 "set -o pipefail; test -f .env || { echo 'ERREUR: .env absent (secrets) — voir docs/OPERATIONS.md'; exit 1; }; chmod 600 .env; mkdir -p ~/data/sp-calendar ~/backups/sp-calendar && chmod 700 ~/data/sp-calendar ~/backups/sp-calendar && test -s ~/.config/sp-calendar/backup-passphrase && echo ' secrets + storage ok'",114 "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/postgres && echo ' deps ok'",115 "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/bootstrap.ts && echo ' db ok'",116 "set -o pipefail; export PATH=\"/opt/homebrew/bin:$PATH\"; rm -rf .next; NEXT_TELEMETRY_DISABLED=1 node_modules/.bin/next build 2>&1 | tail -3 && test -f .next/BUILD_ID && echo ' build ok'"117 ],118 "post_start": []119 },120 "ka_repo": false,121 "tunnel": {122 "domain": "calendar.spboucher.ai",123 "gateway": "BHS64",124 "note": "DNS A calendar.spboucher.ai → 51.161.112.61 vérifié le 2026-11-11 (posé par le propriétaire) ; route Caddy posée par mld deploy"125 },126 "notes": "Next.js 16 (sp-calendar-web :8660) + worker tsx (sp-calendar-worker : file de courriels PostgreSQL, expiration des demandes, abonnements ICS, rétention) + sauvegarde chiffrée quotidienne 03:35 (sp-calendar-backup → ~/backups/sp-calendar, 30 jours). PostgreSQL 17 local (db sp_calendar, rôle spcal_app). Secrets uniquement dans ~/apps/sp-calendar/.env (600) et ~/.config/sp-calendar/backup-passphrase ; copie laptop ~/Desktop/Cluster/secrets/sp-calendar/. Connexion admin par clé d'accès ; lien d'enrôlement initial : ~/data/sp-calendar/setup-url.txt ; récupération : node_modules/.bin/tsx scripts/setup-token.ts --recovery."127}