Pas de Docker, pas de PaaS, pas de magie. Node.js plus systemd et Nginx est une pile qui survit aux reboots, aux accidents et au trafic — et vous pouvez tout lire.
apt update && apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version
N'exécutez jamais une application web comme root. Un utilisateur séparé limite les dommages si l'application est compromise.
adduser --system --group --home /opt/myapp app
mkdir -p /opt/myapp
chown app:app /opt/myapp
Depuis votre ordinateur portable, avec rsync sur SSH — aucun serveur Git requis:
rsync -avz --exclude node_modules ./app/ root@YOUR_SERVER_IP:/opt/myapp/
Sur le serveur, installer les dépendances et tester une fois au premier plan :
cd /opt/myapp
sudo -u app npm ci --omit=dev
sudo -u app PORT=3000 node server.js
L'application doit écouter 127.0.0.1:3000 — pas sur l'interface publique. Nginx affrontera Internet.
cat > /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My Node.js app
After=network-online.target
[Service]
User=app
WorkingDirectory=/opt/myapp
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp
Crash ? Il redémarre dans trois secondes. Redémarrer ? Ça commence automatiquement. Déployer une nouvelle version ? rsync, alors systemctl restart myapp.
apt install -y nginx
cat > /etc/nginx/sites-available/myapp <<'EOF'
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
EOF
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp
nginx -t && systemctl reload nginx
Ensuite, pointez l'enregistrement A de votre domaine sur le serveur et ajoutez HTTPS — la passerelle complète est dans le Guide Nginx et HTTPS.
journalctl -u myapp -f --no-pager
tail -f /var/log/nginx/error.log
Console sortie de votre application atterrit dans journald automatiquement — aucun fichier journal à configurer.
Pas vraiment. systemd fait tout ce que PM2 fait pour un seul serveur — démarrage automatique, démarrage, logs — sans dépendance supplémentaire. PM2 a un sens principalement si vous exécutez plusieurs processus Node avec regroupement.
Une application Express typique ralentit entre 80 et 150 Mo. Un serveur de 2 Go l'exécute confortablement à côté de Nginx et PostgreSQLTM; construire des étapes comme webpack sont la partie mémoire-faible, donc construire en CI ou sur votre ordinateur portable.
rsync le nouveau code, puis redémarrer — l'écart est sous une seconde, parce que systemd redémarre le processus immédiatement. Pour le temps zéro arrêt, vous exécuteriez deux ports et commuter Nginx en amont, mais la plupart des projets n'en ont jamais besoin.
Cette pile s'adapte confortablement dans Buran-1 à €6.5/mois.