Despliegue de tu API
💡 🎯 Al terminar esta lección podrás…
- Explicar qué significa desplegar una aplicación.
- Preparar
package.jsonconstartyengines. - Leer el puerto y la configuración desde variables de entorno.
- Simular una instalación limpia con
npm ci. - Publicar la API siguiendo los pasos genéricos de una plataforma y diagnosticar fallos típicos.
1.Qué significa desplegar
Hasta ahora tu API vive en localhost: solo tú puedes llamarla, y solo mientras tu computadora está encendida. Desplegar es ponerla en un servidor que esté siempre encendido y tenga una dirección pública (por ejemplo https://mi-api.ejemplo.app) para que cualquiera, o cualquier aplicación, pueda usarla.
git pushdespliegueExisten muchas plataformas que ejecutan aplicaciones de Node leyendo tu repositorio (Render, Railway, Fly.io, entre otras). Cambian la interfaz y los planes gratuitos, pero el proceso es el mismo, y esa es la parte que aprenderás: preparar el proyecto para que funcione en cualquier sitio.
📌 Nota · Planes gratuitos
Los planes gratis suelen «dormir» la aplicación tras un rato sin visitas (la primera petición tarda unos segundos) y pueden cambiar sus condiciones. Revisa siempre qué ofrece la plataforma antes de elegirla.
2.Preparar el proyecto
Haz este repaso antes de subir nada. Cada punto evita un error típico de «en mi computadora funcionaba».
1. Un script start
La plataforma arrancará tu app con npm start. Define ese script sin --watch (que es solo para desarrollo):
{
"name": "api-tareas",
"version": "1.0.0",
"type": "module",
"main": "index.js",
"scripts": {
"start": "node index.js",
"dev": "node --watch --env-file=.env index.js"
},
"engines": {
"node": ">=20"
},
"dependencies": {
"express": "^5.1.0",
"cors": "^2.8.5"
}
}
El campo engines indica la versión de Node que necesita tu proyecto; muchas plataformas lo leen para elegir la correcta. Las herramientas que solo usas mientras programas van en devDependencies (npm install -D nombre), no en dependencies.
2. El puerto lo decide la plataforma
En producción no puedes elegir el puerto: la plataforma te lo entrega en la variable PORT. Por eso tu código debe leerlo (lección 6) y no escribirlo a mano:
const PORT = Number(process.env.PORT) || 3000;
app.listen(PORT, () => console.log(`API escuchando en el puerto ${PORT}`));
3. Nada de secretos en el código
Claves, contraseñas y direcciones de otras apps van en variables de entorno. Comprueba que .env y node_modules estén en .gitignore (git status no debe mostrarlos).
4. Una ruta de salud
Muchas plataformas comprueban que tu app responde. Una ruta simple lo facilita, y a ti te sirve para saber si está viva:
const inicio = Date.now();
app.get("/salud", (req, res) => {
res.json({ estado: "ok", uptimeSegundos: Math.floor((Date.now() - inicio) / 1000) });
});
5. Prueba el arranque limpio
La plataforma instalará las dependencias desde cero. Simúlalo tú:
rm -rf node_modules # en PowerShell: Remove-Item -Recurse -Force node_modules
npm ci --omit=dev # instala exactamente lo del package-lock.json, sin devDependencies
NODE_ENV=production npm start
npm ci usa el package-lock.json (¡súbelo a Git!) para instalar versiones idénticas en todas partes y falla si el lock y el package.json no coinciden.
3.Variables de entorno en producción
El archivo .env no viaja a la nube (está en .gitignore). En su lugar, la plataforma tiene un panel donde escribes cada variable con su valor. Debes crear allí las mismas que en tu .env:
| Variable | Valor en producción | Para qué sirve |
|---|---|---|
NODE_ENV | production | Activa optimizaciones y comportamientos de producción (Express oculta detalles de errores) |
PORT | Lo pone la plataforma | Puerto en el que escuchar |
API_KEY | Tu clave real | Secretos de servicios externos |
ORIGENES | https://mi-sitio.com | Sitios autorizados por CORS, separados por comas |
Una función que lea y valide la configuración al arrancar evita sorpresas: si falta algo, el programa avisa de inmediato en lugar de fallar a mitad de una petición.
4.Publicar paso a paso
El recorrido típico, sea cual sea la plataforma:
- Sube tu proyecto a GitHub. Crea un repositorio,
git add .,git commit -m "API lista"ygit push. Verifica en la web que.envno está. - Crea una cuenta en la plataforma elegida y un nuevo «servicio web» a partir de tu repositorio.
- Configura los comandos: instalación
npm ci(onpm install) y arranquenpm start. - Carga las variables de entorno en el panel (
NODE_ENV, claves, orígenes). - Despliega. La plataforma instala, arranca y te da una URL pública con HTTPS.
- Prueba la ruta de salud y el resto con
curl.
curl https://tu-api.ejemplo.app/salud
curl https://tu-api.ejemplo.app/tareas
{"estado":"ok","uptimeSegundos":42}
[]
⚠️ Importante · Los archivos no siempre persisten
En muchas plataformas el disco es efímero: si guardas datos en un archivo JSON, se borran cada vez que la aplicación se reinicia o se vuelve a desplegar. Sirve para aprender, pero una API real necesita una base de datos o un disco persistente. Es el siguiente paso natural después de este curso.
Cada vez que hagas git push a la rama configurada, la mayoría de plataformas vuelven a desplegar solas. Si algo falla, abre los registros (logs) en el panel: ahí aparecerán tus console.log y los errores.
Cuando algo sale mal
| Síntoma | Causa probable |
|---|---|
| Falla al construir: «Cannot find module» | Una dependencia está en devDependencies o falta en package.json. |
| Arranca pero «no responde» | Escuchas en un puerto fijo en vez de process.env.PORT. |
| Funciona pero el navegador muestra error de CORS | El origen de tu página no está en la lista de ORIGENES. |
Error por variable undefined | Olvidaste crear esa variable en el panel. |
| Los datos desaparecen | El disco es efímero; usa una base de datos. |
| La primera petición tarda mucho | El plan gratuito «despertó» la aplicación. |
5.Errores frecuentes
- Dejar el puerto fijo: la plataforma asigna el puerto con
PORT. - Usar
node --watchenstart: ese modo es solo para desarrollo. - Subir
.envonode_modulesal repositorio. - Olvidar subir
package-lock.json: las versiones instaladas pueden cambiar. - Poner en
devDependenciesalgo que se usa en producción: falla al arrancar. - Olvidar crear las variables de entorno en el panel de la plataforma.
- Guardar datos en un archivo en una plataforma con disco efímero y perderlos en cada reinicio.
📒 Apuntes para llevar
- Desplegar = poner tu app en un servidor siempre encendido con una URL pública.
- Necesitas un script
"start": "node index.js"y, conviene,engines.node. - El puerto sale de
process.env.PORT. - Las herramientas de desarrollo van en
devDependencies; las que usa la app en producción, endependencies. - El
.envno se sube: las variables se escriben en el panel de la plataforma. NODE_ENV=productionactiva el modo de producción.- Una ruta
/saludpermite comprobar que la app está viva. - Flujo: GitHub, servicio web,
npm ci,npm start, variables, URL pública; después,git pushredespliega. - Muchos discos son efímeros: para datos persistentes usa una base de datos.
6.Glosario
| Término | Significado |
|---|---|
| Despliegue | Proceso de poner una aplicación en un servidor accesible públicamente. |
| Producción | Entorno real donde la usan los usuarios, frente a desarrollo. |
npm ci | Instala exactamente lo indicado en package-lock.json; pensado para despliegues. |
engines | Campo de package.json que indica versiones compatibles de Node. |
| Variable de entorno | Configuración que se define fuera del código, en el panel de la plataforma. |
| Health check | Ruta que sirve para comprobar si la aplicación responde. |
| Logs | Registros de lo que imprime tu aplicación. |
| Disco efímero | Almacenamiento que se borra al reiniciar o redesplegar. |
🧠 Comprueba lo aprendido
Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.
¿Qué debe usar tu código para saber en qué puerto escuchar en producción?
La plataforma asigna el puerto y lo entrega en la variable PORT.
¿Cuál debe ser el script start?
En producción se ejecuta node index.js sin el modo de vigilancia.
¿Por qué no se sube .env a GitHub?
Tiene claves y contraseñas; en producción se escriben en el panel de la plataforma.
¿Qué hace npm ci?
Garantiza instalaciones idénticas y repetibles, ideal para despliegues.
Guardas tareas en un archivo JSON y tras redesplegar desaparecen. ¿Por qué?
Muchas plataformas reinician desde cero el sistema de archivos; para datos persistentes se usa una base de datos o un disco persistente.
Tu progreso se guarda en este navegador y se refleja en el índice del curso.
💡 🚀 ¡Ahora te toca!
La práctica fija lo aprendido. Pasa al ejercicio de esta lección.