Despliegue de Servidores Propios con Node.js y systemd
1. Creando el servidor #
La idea será crear un servidor web que, cuando alguien acceda, muestre:
- 📅 Fecha actual
- ⏰ Hora actual
- 🌅 Momento del día: mañana, tarde o noche
Voy a hacerlo con Node.js + Express, que encaja genial con lo que ya sueles trabajar.
2. Idea general (qué vamos a construir) #
Arquitectura mental sencilla:
Navegador ──► Servidor Node.js ──► Calcula fecha y hora ──► Respuesta HTML/JSON
El servidor:
- obtiene la hora del sistema
- decide si es mañana / tarde / noche
- responde al navegador con esa info
3. Requisitos previos #
En tu máquina (Linux Mint, Windows o VM):
1node -v 2npm -v
Si no están:
1sudo apt install nodejs npm # en Linux
4. Crear el proyecto #
1mkdir servidor-fecha-hora 2cd servidor-fecha-hora 3npm init -y 4npm install express
Estructura mínima:
servidor-fecha-hora/
├── index.js
├── package.json
5. Código del servidor básico #
📄 index.js
1import express from "express"; 2 3const app = express(); 4const PORT = 3000; 5 6app.get("/", (req, res) => { 7 const now = new Date(); 8 9 const fecha = now.toLocaleDateString("es-ES"); 10 const hora = now.toLocaleTimeString("es-ES"); 11 12 const horas = now.getHours(); 13 let momento; 14 15 if (horas >= 6 && horas < 14) { 16 momento = "☀️ Mañana"; 17 } else if (horas >= 14 && horas < 20) { 18 momento = "🌇 Tarde"; 19 } else { 20 momento = "🌙 Noche"; 21 } 22 23 res.send(` 24 <h1>Servidor de Fecha y Hora</h1> 25 <p><strong>Fecha:</strong> ${fecha}</p> 26 <p><strong>Hora:</strong> ${hora}</p> 27 <p><strong>Momento del día:</strong> ${momento}</p> 28 `); 29}); 30 31app.listen(PORT, () => { 32 console.log(`Servidor funcionando en http://localhost:${PORT}`); 33});
⚠️ Si usas "type": "module" en package.json (como prefieres), este código es correcto.
Si no, dime y lo adaptamos a require.
6. Arrancar el servidor #
1node index.js
Abre el navegador:
http://localhost:3000
🎉 ¡Ya tienes tu servidor funcionando!
7. Creando el servicio de sistema #
Ahora vamos a hacer que este servidor se ejecute como un servicio de sistema en Linux, para que: * Se inicie automáticamente al arrancar el ordenador * Se ejecute en segundo plano * Permita acceso desde otras máquinas de la red (Windows)
- Ajustar el servidor para escuchar en red
- Crear un servicio systemd
- Hacer que se inicie al arrancar el ordenador
- Permitir acceso desde Windows
- Probar y depurar
8. Ajuste previo del servidor (MUY IMPORTANTE) #
Por defecto Express escucha solo en localhost.
Para acceder desde otra máquina hay que escuchar en todas las interfaces.
📄 index.js (cambio clave 👇)
1app.listen(PORT, "0.0.0.0", () => { 2 console.log(`Servidor funcionando en http://0.0.0.0:${PORT}`); 3});
🔹 0.0.0.0 = acepta conexiones desde cualquier IP de la red
9. Decide dónde vivirá el servidor (buena práctica) #
Vamos a moverlo a /opt, típico para servicios propios.
1sudo mkdir /opt/servidor-fecha-hora 2sudo cp -r servidor-fecha-hora/* /opt/servidor-fecha-hora 3sudo chown -R $USER:$USER /opt/servidor-fecha-hora
Instala dependencias ahí:
1cd /opt/servidor-fecha-hora 2npm install
10. Crear el servicio systemd #
📄 /etc/systemd/system/fecha-hora.service
1sudo nano /etc/systemd/system/fecha-hora.service
Contenido completo:
1[Unit] 2Description=Servidor Fecha y Hora Node.js 3After=network.target 4 5[Service] 6ExecStart=/usr/bin/node index.js 7WorkingDirectory=/opt/servidor-fecha-hora 8Restart=always 9User=angel 10Environment=NODE_ENV=production 11 12[Install] 13WantedBy=multi-user.target
⚠️ Cambia User=angel si tu usuario es otro.
11. Activar el servicio #
1sudo systemctl daemon-reload 2sudo systemctl enable fecha-hora 3sudo systemctl start fecha-hora
Comprueba estado:
1systemctl status fecha-hora
✔️ Debe aparecer como active (running)
12. Ver logs (fundamental para depurar) #
1journalctl -u fecha-hora -f
Esto es oro cuando algo falla 👌
13. Permitir acceso desde la red #
Averigua la IP del Linux #
1ip a
Ejemplo:
192.168.1.50
Firewall (si está activo) #
Comprueba:
1sudo ufw status
Si está activo, permite el puerto:
1sudo ufw allow 3000 2sudo ufw reload
14. Acceder desde Windows #
Desde el navegador de Windows:
http://IP_DEL_LINUX:3000
Ejemplo:
http://192.168.1.50:3000
🎉 Si ves la fecha y hora → misión cumplida
15. Comprobación final (muy didáctica) #
🔁 Reinicia el Linux:
1sudo reboot
Cuando arranque:
- NO ejecutes nada
- Desde Windows accede de nuevo
👉 Si funciona, el servicio está bien hecho ✅
Resumen del tema
Conceptos clave #
- Desarrollo de Microservicios con Express: creación de un servidor HTTP en Node.js configurado para escuchar en
0.0.0.0:3000para admitir tráfico de red. - Ubicación de Aplicaciones de Sistema: despliegue del proyecto en
/opt/con permisos de usuario adecuados. - Unidades de Servicio Systemd (
.service): creación del archivo en/etc/systemd/system/nombre.servicecon directivas[Unit],[Service](ExecStart,WorkingDirectory,Restart=always,User), e[Install](WantedBy=multi-user.target). - Ciclo de Control del Demonio:
sudo systemctl daemon-reload,enable(arranque automático),startystatus. - Depuración y Logs en Vivo: inspección de la salida estándar y errores mediante
journalctl -u nombre-servicio -f.
Qué debes recordar #
Convertir una aplicación Node.js en un servicio gestionado por systemd garantiza su ejecución en segundo plano, recuperación automática tras fallos y arranque con el sistema.