Napi
Monorepo
Un monorepo orchestré par PM2. Quatre applications — server, client, tracker, socketer — articulées autour d'une infrastructure commune : env partagés, types auto-générés, CLI de développement.
- Server · 19061
- Client · 19062
- Tracker · 19063
- Socketer · 19065
Architecture monorepo
Chaque application est un projet autonome avec son propre package.json et son propre runtime (Next.js côté server, Nuxt côté client, Bun natif pour le tracker). PM2 les orchestre depuis la racine.
Structure racine
napi-5/
├── server/ # Payload CMS + Next.js (port 19061)
├── client/ # Nuxt 4 + Vue 3 (port 19062)
├── tracker/ # Bun + Elysia + MongoDB (port 19063/19064 UDP)
├── socketer/ # Bun + Elysia + Redis Pub/Sub — WebSocket pub/sub (port 19065)
├── .cli/ # CLI TUI blessed — développement local
├── .claude/ # Agents, skills, commands Claude Code
│ ├── agents/ # Agents spécialisés par domaine
│ ├── skills/ # Workflows réutilisables
│ ├── commands/ # Slash commands /name
│ └── docs/ # Documentation projet
├── .envs/ # Variables d'environnement par mode
│ ├── dev.js # Mode développement (gitignored)
│ ├── network.js # Mode réseau + tunnels (gitignored)
│ ├── prod.js # Production (gitignored)
│ ├── ex.dev.js # Exemple dev (versionné)
│ └── ex.network.js # Exemple network (versionné)
├── pm2-dev.config.js # Orchestration dev
├── pm2-prod.config.js # Orchestration prod
├── pm2-caddy.config.js # Reverse proxy Caddy
└── pm2-cloudflared.config.js # Tunnels CloudflaredPM2 — orchestration
Chaque config PM2 importe les variables depuis le fichier .envs/ correspondant et les injecte dans process.env de chaque application.
pm2-dev.config.js
const server = require('./.envs/dev.js').server;
const client = require('./.envs/dev.js').client;
const tracker = require('./.envs/dev.js').tracker;
module.exports = {
apps: [
{
name: 'server',
cwd: './server',
script: 'bun',
args: 'run dev --turbopack',
env: server.variables,
},
{
name: 'client',
cwd: './client',
script: 'bun',
args: 'run dev',
env: client.variables,
},
{
name: 'tracker',
cwd: './tracker',
script: 'bun',
args: 'run dev',
env: tracker.variables,
},
],
};Variables d'environnement
Les fichiers ex.*.js sont versionnés comme référence. Copier en dev.js / network.js pour usage réel. Les fichiers actifs sont dans .gitignore.
.envs/ex.dev.js
module.exports = {
server: {
variables: {
// ── Core ───────────────────────────────────────────
DATABASE_URL: 'postgres://napi:napi@127.0.0.1/napi',
SERVER_URL: 'http://127.0.0.1:19061',
CLIENT_URL: 'http://127.0.0.1:19062',
// ── Admin auto-login (dev only) ─────────────────────
ADMIN_AUTO_LOGIN: true,
ADMIN_AUTO_LOGIN_EMAIL: 'napi@lunapi.co',
ADMIN_AUTO_LOGIN_PASSWORD: 'napi',
// ── 📨 MESSAGER SES ─────────────────────────────────
SES_ACCESS_KEY_ID: '',
SES_SECRET_ACCESS_KEY: '',
SES_REGION: 'eu-west-3',
SES_SEND_DELAY_MS: 75,
SES_BULK_EMAIL_BATCH_SIZE: 10,
JOBS_CRON: '*/30 * * * * *',
JOBS_RUN_LIMIT: 1,
},
},
client: {
variables: {
NUXT_PUBLIC_API_URL: 'http://127.0.0.1:19061',
NUXT_PUBLIC_I18N_LANGS: 'fr',
NUXT_PUBLIC_TRACKER_URL: 'http://127.0.0.1:19063',
},
},
tracker: {
variables: {
MONGODB_URL: 'mongodb://127.0.0.1:27017/napi-tracker',
TRACKER_SECRET: '',
PORT: 19063,
UDP_PORT: 19064,
},
},
};