diff --git a/server/README.md b/server/README.md index f78f84b..53cf4be 100644 --- a/server/README.md +++ b/server/README.md @@ -43,6 +43,7 @@ Pour régénérer le monde (ex. changer de `level-type`), stoppe le serveur et s | `server.properties` | Config plug-and-play (survie, normal, 20 joueurs) | | `eula.txt` | Passer à `eula=true` avant de lancer | | `start.sh` / `start.bat` | Scripts de lancement (4 Go RAM, `nogui`) | +| `ecosystem.config.cjs` | Config PM2 (démarre le serveur dans le nix-shell, Java 25) | ## Mods @@ -62,3 +63,30 @@ Pour régénérer le monde (ex. changer de `level-type`), stoppe le serveur et s - `server-ip=10.7.0.2` : le serveur n'écoute **que** sur l'interface portant cette IP (VPN). Laisser vide = écouter sur toutes les interfaces (`0.0.0.0`). - Ouvre le port 25565/TCP (box/pare-feu) et pointe `mcpv.ihorizon.org` vers l'IP publique. + +## PM2 (daemon) + +`ecosystem.config.cjs` lance le serveur **dans le nix-shell du repo** (`shell.nix` → `jdk25`), +sans dépendre du Java du système. Les chemins sont résolus depuis le fichier (`__dirname`) : +`server/` et la racine du repo. + +```bash +cd /srv/mc/server +pm2 start ecosystem.config.cjs +pm2 logs surviepote-mc +pm2 restart surviepote-mc +pm2 stop surviepote-mc + +pm2 save # mémorise la liste des process +sudo pm2 startup systemd -u anais --hp /home/anais # relance au boot +``` + +Équivalent manuel de la commande lancée par PM2 : + +```bash +cd /srv/mc/server +nix-shell /srv/mc --run "bash /srv/mc/server/start.sh" +``` + +> PM2 ne relaie pas la console interactive : utilise `pm2 logs` pour la sortie et +> `pm2 sendSignal`/`pm2 stop` (SIGINT → sauvegarde propre via le shutdown hook Java). diff --git a/server/ecosystem.config.cjs b/server/ecosystem.config.cjs new file mode 100644 index 0000000..61209ff --- /dev/null +++ b/server/ecosystem.config.cjs @@ -0,0 +1,56 @@ +/** + * PM2 — SurviePote serveur Minecraft (MC 26.3 / Fabric 0.20.0 / Java 25). + * + * Démarre le serveur DANS le shell Nix du repo (shell.nix => jdk25), sans + * dépendre du Java du système. + * + * cd /srv/mc/server + * pm2 start ecosystem.config.cjs + * pm2 logs surviepote-mc + * pm2 restart surviepote-mc + * pm2 stop surviepote-mc + * pm2 save + * + * Les chemins sont résolus depuis ce fichier (__dirname) : + * SERVER_DIR = /srv/mc/server + * ROOT_DIR = /srv/mc + * donc le fichier marche quel que soit l'endroit d'où pm2 est lancé. + */ +const path = require('path') + +const SERVER_DIR = __dirname +const ROOT_DIR = path.resolve(__dirname, '..') +const START_SCRIPT = path.join(SERVER_DIR, 'start.sh') + +// cd /srv/mc/server && nix-shell /srv/mc --run "bash /srv/mc/server/start.sh" +const command = [ + `cd ${JSON.stringify(SERVER_DIR)}`, + `exec nix-shell ${JSON.stringify(ROOT_DIR)} --run ${JSON.stringify(`bash ${START_SCRIPT}`)}` +].join(' && ') + +module.exports = { + apps: [ + { + name: 'surviepote-mc', + cwd: SERVER_DIR, + + // On exécute `bash -lc ""` directement (pas un script Node). + script: 'bash', + args: ['-lc', command], + interpreter: 'none', + + autorestart: true, + max_restarts: 10, + restart_delay: 5000, + min_uptime: '60s', + kill_timeout: 30000, + treekill: true, // SIGINT/SIGKILL propagés jusqu'à java (arrêt propre) + watch: false, + + env: { + // On est déjà dans nix-shell : empêche start.sh de s'y relancer. + SURVIEPOTE_NIX: '1' + } + } + ] +}