From ecdfc95ff3d8aaf3550d8e32f41d334da37fee39 Mon Sep 17 00:00:00 2001 From: Anthony GAEREMYNCK <1@anthony.sh> Date: Tue, 11 Aug 2026 15:24:30 +0200 Subject: [PATCH] feat: add Passenger-compatible server.js startup file for o2switch Passenger runs a literal JS entry file, not the next start CLI or an npm script, so a custom server was needed for cPanel's Node.js App startup file field. --- README.md | 6 ++++-- package.json | 2 +- server.js | 14 ++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 server.js diff --git a/README.md b/README.md index 8f27fec..c65b60c 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ L'interface est accessible sur [http://localhost:3000](http://localhost:3000). |--------|-------------| | `npm run dev` | Serveur de développement Next.js | | `npm run build` | Build de production | -| `npm start` | Serveur de production | +| `npm start` | Serveur de production (`server.js`, requis par Passenger sur o2switch — `next start` seul n'est pas utilisable comme fichier de démarrage) | | `npm test` | Tests Jest | | `npm run worker` | Worker de téléchargement (boucle de polling, exécution directe/dev) | | `npm run worker:pm2:start` | Démarre le worker sous pm2 (`ecosystem.config.cjs`), avec auto-restart | @@ -155,6 +155,7 @@ worker/ messages/ # Traductions (en.json, fr.json, es.json, it.json) +server.js # Serveur HTTP custom (fichier de démarrage Passenger sur o2switch) ecosystem.config.cjs # Config pm2 du process "ombrora-worker" prisma/ @@ -168,13 +169,14 @@ prisma/ - **Pas de compilation sur le serveur** : `yt-dlp`, `ffmpeg` et `ffprobe` doivent être des binaires précompilés pour la plateforme cible, placés dans `BIN_DIR`. - **`node_modules` unique** : Passenger ne crée qu'un seul `node_modules` à la racine. Le projet n'a qu'un seul `package.json` (pas de sous-dossier frontend séparé à synchroniser). - **Worker** : Passenger ne supervise que l'app Next.js. Le worker est un process à part, maintenu vivant par **pm2** (auto-restart en cas de crash), à la manière de Passenger pour l'app web. +- **Fichier de démarrage (Passenger)** : Passenger exécute directement `node ` — il ne peut pas lancer une commande CLI (`next start`) ni un script npm. Le dépôt fournit donc `server.js` à la racine (serveur HTTP custom minimal, cf. [doc Next.js](https://nextjs.org/docs/app/guides/custom-server)), qui appelle l'API programmatique de Next.js et écoute sur `process.env.PORT` (port fourni par Passenger). ### Étapes de déploiement 1. Uploader les sources (hors `node_modules`, `.env`, `storage/`). 2. Déposer `yt-dlp` et `ffmpeg` dans `BIN_DIR`. 3. Remplir `.env.prod` avec les valeurs de production (non versionné, à créer/mettre à jour manuellement sur le serveur). -4. Via cPanel > "Setup Node.js App" : créer l'app Node une première fois pour que Passenger et le nodevenv soient configurés (pointer sur le dépôt). +4. Via cPanel > "Setup Node.js App" : créer l'app Node une première fois pour que Passenger et le nodevenv soient configurés (pointer sur le dépôt). Dans le champ **"Application startup file"**, indiquer `server.js`. 5. En SSH, dans l'environnement Node fourni par cPanel (celui activé par le lien "Enter to the virtual environment" de cPanel) : ```bash npm run deploy diff --git a/package.json b/package.json index f24d220..3fb3721 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start", + "start": "node server.js", "test": "jest", "worker": "tsx worker/index.ts", "worker:cleanup": "tsx worker/cron-cleanup.ts", diff --git a/server.js b/server.js new file mode 100644 index 0000000..18c904b --- /dev/null +++ b/server.js @@ -0,0 +1,14 @@ +const { createServer } = require('http') +const next = require('next') + +const port = parseInt(process.env.PORT || '3000', 10) +const app = next({ dev: false }) +const handle = app.getRequestHandler() + +app.prepare().then(() => { + createServer((req, res) => { + handle(req, res) + }).listen(port, () => { + console.log(`> Ready on port ${port}`) + }) +})