Sin Docker, sin PaaS, sin magia. Node.js más sistematizado y Nginx es una pila que sobrevive reinicios, accidentes y tráfico, y usted puede leer todo.
apt update && apt install -y curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node --version
Nunca ejecutar una aplicación web como root. Un usuario separado limita el daño si la aplicación está comprometida.
adduser --system --group --home /opt/myapp app
mkdir -p /opt/myapp
chown app:app /opt/myapp
Desde tu portátil, con rsync sobre SSH — ningún servidor Git requerido:
rsync -avz --exclude node_modules ./app/ root@YOUR_SERVER_IP:/opt/myapp/
En el servidor, instalar dependencias y probar una vez en primer plano:
cd /opt/myapp
sudo -u app npm ci --omit=dev
sudo -u app PORT=3000 node server.js
La aplicación debe escuchar 127.0.0.1:3000 - no en la interfaz pública. Nginx se enfrentará a 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? Se reinicia en tres segundos. ¿Reboot? Empieza automáticamente. ¿Deplorar una nueva versión? rsyncEntonces 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
A continuación, señale el registro de su dominio en el servidor y agregue HTTPS — el avance completo está en el Guía Nginx y HTTPS.
journalctl -u myapp -f --no-pager
tail -f /var/log/nginx/error.log
Consola de salida de su aplicación aterriza en la revista automáticamente — sin archivos de registro para configurar.
En realidad no. systemd hace todo lo que PM2 hace para un solo servidor — auto-restart, arranque, registros — sin una dependencia adicional. PM2 tiene sentido principalmente si ejecuta varios procesos de Nodo con agrupación.
Una típica aplicación Express se extiende alrededor de 80–150 MB. Un servidor de 2 GB funciona cómodamente junto a Nginx y PostgreSQL; construir pasos como el paquete web son la parte memoria-hungry, por lo que construir en CI o en su computadora portátil.
rsync el nuevo código, luego reiniciar — la brecha está bajo un segundo, porque sistematizado reinicia el proceso inmediatamente. Para cero-tiempo usted ejecutaría dos puertos y cambiar Nginx río arriba, pero la mayoría de proyectos nunca lo necesitan.
Esta pila encaja cómodamente en Buran-1 en €6.5/mes.