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:
@@ -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
@@ -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",
|
||||||
|
|||||||
@@ -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}`)
|
||||||
|
})
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user