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.
This commit is contained in:
2026-08-11 15:24:30 +02:00
parent 09600118a5
commit ecdfc95ff3
3 changed files with 19 additions and 3 deletions
+4 -2
View File
@@ -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 dev` | Serveur de développement Next.js |
| `npm run build` | Build de production | | `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 test` | Tests Jest |
| `npm run worker` | Worker de téléchargement (boucle de polling, exécution directe/dev) | | `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 | | `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) 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" ecosystem.config.cjs # Config pm2 du process "ombrora-worker"
prisma/ 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`. - **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). - **`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. - **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 <fichier>` — 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 ### Étapes de déploiement
1. Uploader les sources (hors `node_modules`, `.env`, `storage/`). 1. Uploader les sources (hors `node_modules`, `.env`, `storage/`).
2. Déposer `yt-dlp` et `ffmpeg` dans `BIN_DIR`. 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). 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) : 5. En SSH, dans l'environnement Node fourni par cPanel (celui activé par le lien "Enter to the virtual environment" de cPanel) :
```bash ```bash
npm run deploy npm run deploy
+1 -1
View File
@@ -9,7 +9,7 @@
"scripts": { "scripts": {
"dev": "next dev", "dev": "next dev",
"build": "next build", "build": "next build",
"start": "next start", "start": "node server.js",
"test": "jest", "test": "jest",
"worker": "tsx worker/index.ts", "worker": "tsx worker/index.ts",
"worker:cleanup": "tsx worker/cron-cleanup.ts", "worker:cleanup": "tsx worker/cron-cleanup.ts",
+14
View File
@@ -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}`)
})
})