Node: levantar varios servicios en local
Node hace fáciles los dos primeros servicios: npm start dos veces y
estás trabajando. El lío llega con la cuarta terminal, con el segundo servicio que
también quiere el puerto 3000 y con el paquete que estás tocando a la vez que el
servicio que lo consume.
Qué se rompe primero
- Las terminales. Una por servicio, cada una con su entorno, y sin memoria de qué combinación funcionaba ayer.
- Los puertos. Todo trae 3000 por defecto. Acabas con un
.envpor desarrollador que no se comitea nunca y no se documenta nunca. - Las URLs entre servicios. Cada
fetcha otro servicio lee una variable, y apuntar tres al entorno compartido significa editar ficheros que no debes comitear. - El paquete local.
npm linkfunciona hasta que deja de hacerlo: dependencias duplicadas, una copia hoisteada que gana y una resolución que se comporta distinto de la publicada. - Nadie espera a nadie. Tu servicio arranca, llama al que aún no ha terminado de levantar, y el error parece un fallo de tu código.
Qué hace Aseptic
Aseptic detecta un servicio Node —o un front de Angular— por su
package.json, lo arranca como proceso nativo con tu propio script y le
pasa la configuración como variables de entorno al arrancar. Las URLs entre
servicios se reescriben ahí, así que ningún .env de tu repositorio
tiene que cambiar y no hay nada que olvidarse de revertir.
Un escenario es el conjunto de servicios de un flujo, arrancados en orden de dependencia y esperando a la salud, no al proceso. Los puertos que chocan se remapean y el valor remapeado es el que reciben quienes llaman. Si el flujo necesita Kafka, Redis o PostgreSQL, Aseptic los levanta en Docker y los gestiona — tus servicios se quedan fuera de Docker salvo que los quieras en contenedor.
Cada dependencia se resuelve donde tú elijas: un servicio local que tengas abierto, el entorno compartido de la nube o un mock. Por dependencia, y se puede cambiar a media tarde.
Paquetes locales, sin las sorpresas de npm link
Si estás tocando a la vez un paquete tuyo y el servicio que lo consume, Aseptic
construye el paquete y lo enlaza en el node_modules del consumidor, que
es donde Node lo resuelve de verdad, y puede reconstruirlo y reenlazarlo según
guardas. No edita el package.json del consumidor, y desenlazar deshace
solo lo que puso. El mismo mecanismo cubre Maven, Gradle y Python para los equipos
cuyos sistemas no son todos JavaScript.
Lo que no hace
No sustituye a tus scripts, ni a tu bundler, ni a tu runner de tests: los llama. No ejecuta un clúster de Kubernetes, así que todo lo que necesites verificar a ese nivel es de otra herramienta. Necesita Docker instalado para la infraestructura común.
Está en beta pública, se publica para Windows, macOS y Linux, y es gratis para uso personal.
Al lado de las alternativas
Si tus servicios ya son imágenes y los despliegas con manifiestos que mantienes, Tilt o Skaffold mantienen el bucle local con la forma de producción, al precio de una build en cada cambio. La página de alternativas a Docker Compose cubre el campo entero.
Hay equivalentes de esta página para Spring Boot y para Quarkus.
Preguntas frecuentes
¿Por qué dejan de servir los scripts de npm con varios servicios?
Porque no escalan al cuarto: hay que abrir una terminal por servicio, recordar el orden de arranque, y las URLs entre ellos acaban en variables de entorno copiadas a mano en cada máquina.
¿Necesito imágenes Docker de mis servicios Node?
No. Aseptic los arranca como procesos con su propio comando; Docker se usa para la infraestructura común.
¿Cómo enlazo un paquete local sin publicarlo en npm?
Aseptic lo construye y lo enlaza en el node_modules del que lo consume, y puede reconstruir y reenlazar al vuelo cuando cambia. Es reversible: desenlazar deshace solo lo que puso.