Instalar módulos de Node.js en servidores offline

Tras haber dormido pocas horas, nada más despertarme he pensado ¿por qué estoy de tan mal humor? Entonces he recordado lo que tuve que hacer ayer por la noche para instalar por npm el módulo forever en un servidor web sin acceso a los repositorios y me acordé. Y como buscando por los issuesStackOverflowses del planeta parece ser que no soy el único que se ha encontrado este problema, dejo aquí escrita esta handy-dandy-guide dirigida a todos los que la presente vieren y entendieren.

npm

Partimos de la base de que parece un poco tonto querer usar node.js en un servidor que no tiene acceso a prácticamente nada. En realidad no, el servidor es una máquina virtual que nos ha proporcionado la Escuela para la realización de la práctica y el único acceso al exterior que tiene es a un mirror de la propia Escuela de los repositorios oficiales de Ubuntu. Por lo demás, el cortafuegos tras el que está  no le deja ni resolver la IP de google.es. ¿Puertos disponibles? El 22 y el 80 (que son redirigidos a otros del servidor de acceso, pero eso ya nos es indiferente). ¿La tarea? Instalar el módulo de node.js forever.

El desarrollo de la aplicación web lo hemos hecho en un Docker Ubuntu proporcionado por c9, pero a la hora de ponerla en producción nos encontramos un problema. La aplicación tiene un bug que no hemos tenido tiempo de rastrear, y, en momentos aleatorios, falla y la aplicación se cae. La solución era muy simple. Iniciarla mediante forever para que cada vez que la aplicación se cayese fuese detectado por el monitor y se relanzase automáticamente. Lo que no era sencillo es instalar forever. Bien, los módulos que son JavaScript puro no tienen ningún problema para ser movidos de una máquina a otra. Subida por SFTP y a correr. express, ejs, passport, mysql, momenttodos funcionaban a la primera.

Sin embargo (y realmente no sé cómo funciona npm, así que esto es intuición mía) otros módulos requieren o bien compilar código o bien configurar otras cosas que los hace dependientes de la máquina en la que son instalados. Así pues, instalar forever en el Docker de c9 y subirlo por SFTP al servidor de la Escuela no era solución. Por suerte encontré otra utilidad instalable por npm que permite crear instalables de módulos, npmbox.

El funcionamiento de npmbox sería muy sencillo, y para mí bastaría con ejecutar…

$ npmbox forever

…en la máquina con conexión a Internet, lo que me crearía un paquete llamado forever.npmbox. Subiría ese paquete al servidor y allí haría

$ npmunbox -g forever.npmbox

…y la historia se habría terminado. Pero claro… en el servidor no tengo npmbox. ¿Cómo puedo instalar npmbox mediante npm en una máquina que no puede acceder a los repositorios de npm? Es la historia de la pescadilla que se muerde la cola. Por suerte, el creador de tan fantástica utilidad pensó en ello.

Primero, hay que crear un box de npmbox:

$ npmbox npmbox

Lo que nos crea un fichero llamado npmbox.npmbox. Ese fichero lo podemos subir al servidor, a una carpeta para él solo. Aparentemente los *.npmbox son ficheros comprimidos en tar gz, así que con la utilidad tar podemos descomprimir su contenido.

$ tar -zxvf npmbox.npmbox

En el directorio en el que estemos, habrá creado una carpeta oculta llamada .npmbox-cache con el contenido del tar. Ahora lo podremos instalar mediante npm con la orden

$ sudo npm install --global --cache ./.npmbox-cache --optional --cache-min 999999 --fetch-retries 0 --fetch-retry-factor 0 --fetch-retry-mintimeout 1 --fetch-retry-maxtimeout 2 npmbox

Y así lo tendríamos listo. ¿El problema (el nuevo problema)? Que la versión de npm que requiere el anterior comando para funcionar es la 1.4.28 o superior, y en el mirror de los repositorios de Ubuntu de la Escuela sólo se encuentra la versión 1.3.10. Además, no se pueden añadir nuevos PPA porque el cortafuegos impide toda conexión, así que la única opción es instalar la última versión de node.js y de npm a manita. Y como soy más de que las cosas se hagan automáticamente, me bajé de su página web el código fuente en vez de los binarios. Tras descomprimirlo, y en el directorio, ejecutar:

$ ./configure

$ make

$ sudo make install

Tras instalar la última versión de npm, podremos instalar npmbox, y entonces podremos instalar al fin no solo forever sino cualquier módulo de nodejs que sea medianamente rebelde.

¡Saludos!

Deja un comentario