Por defecto HestiaCP no incluye soporte para publicar aplicaciones desarrolladas bajo NodeJS, pero con unos sencillos pasos tendremos listo nuestro servidor. A continuación, os mostramos detalladamente los pasos a seguir para publicar con HestiaCP una aplicación bajo app.sock o escuchando al puerto 3000.
Instalación de NodeJS
Por defecto en la imagen preinstalada de HestiaCP llega con Node instalado pero aún así deberemos instalar "npm" para instalar nuestras aplicaciones de NodeJS.
Para ello ejecutamos el siguiente comando:
# apt install npm
Creación de plantillas para Nginx usando el puerto 3000
Para publicar aplicaciones NodeJS utilizaremos a Nginx cómo proxy para redireccionar las peticiones que lleguen al puerto 80 al puerto 3000 de Node.
Para ello creamos los siguientes ficheros y establecemos los permisos adecuados:
# touch /usr/local/hestia/data/templates/web/nginx/nodejs3000.sh
# touch /usr/local/hestia/data/templates/web/nginx/nodejs3000.tpl
# touch /usr/local/hestia/data/templates/web/nginx/nodejs3000.stpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejs3000.sh
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejs3000.tpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejs3000.stpl
Añadimos el siguiente código en el fichero nodejs3000.sh:
#!/bin/bash
user=$1
domain=$2
ip=$3
home=$4
docroot=$5
mkdir "$home/$user/web/$domain/nodeapp"
chown -R $user:$user "$home/$user/web/$domain/nodeapp"
rm "$home/$user/web/$domain/nodeapp/app.sock"
runuser -l $user -c "pm2 start $home/$user/web/$domain/nodeapp/app.js"
sleep 5
chmod 777 "$home/$user/web/$domain/nodeapp/app.sock"
Añadimos el siguiente código en el fichero nodejs3000.tpl:
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /error/ {
alias %home%/%user%/web/%domain%/document_errors/;
}
location @fallback {
proxy_pass http://127.0.0.1:3000:/$1;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/nginx.%domain%.conf*;
}
Añadimos el siguiente código en el fichero nodejs3000.stpl:
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
return 301 https://%domain_idn%$request_uri;
}
server {
listen %ip%:%proxy_ssl_port% http2 ssl;
server_name %domain_idn% %alias_idn%;
ssl_certificate %ssl_pem%;
ssl_certificate_key %ssl_key%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types image/svg+xml svg svgz text/plain application/x-javascript text/xml text/css;
gzip_vary on;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /error/ {
alias %home%/%user%/web/%domain%/document_errors/;
}
location @fallback {
proxy_pass https://127.0.0.1:3000:/$1;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}
Creación de plantillas para Nginx usando el socket app.sock
En este caso redireccionaremos las peticiones que lleguen al puerto 80 a Node utilizando el socket creado en app.sock.
Para ello creamos los siguientes ficheros y establecemos los permisos adecuados:
# touch /usr/local/hestia/data/templates/web/nginx/nodejssock.sh
# touch /usr/local/hestia/data/templates/web/nginx/nodejssock.tpl
# touch /usr/local/hestia/data/templates/web/nginx/nodejssock.stpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejssock.sh
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejssock.tpl
# chmod 755 /usr/local/hestia/data/templates/web/nginx/nodejssock.stpl
Añadimos el siguiente código en el fichero nodejssock.sh:
#!/bin/bash
user=$1
domain=$2
ip=$3
home=$4
docroot=$5
mkdir "$home/$user/web/$domain/nodeapp"
chown -R $user:$user "$home/$user/web/$domain/nodeapp"
rm "$home/$user/web/$domain/nodeapp/app.sock"
runuser -l $user -c "pm2 start $home/$user/web/$domain/nodeapp/app.js"
sleep 5
chmod 777 "$home/$user/web/$domain/nodeapp/app.sock"
Añadimos el siguiente código en el fichero nodejssock.tpl:
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
location / {
proxy_pass http://unix:%home%/%user%/web/%domain%/nodeapp/app.sock:$request_uri;
location ~* ^.+\.(%proxy_extentions%)$ {
root %docroot%;
access_log /var/log/%web_system%/domains/%domain%.log combined;
access_log /var/log/%web_system%/domains/%domain%.bytes bytes;
expires max;
try_files $uri @fallback;
}
location /error/ {
alias %home%/%user%/web/%domain%/document_errors/;
}
location @fallback {
proxy_pass http://unix:%home%/%user%/web/%domain%/nodeapp/app.sock:/$1;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/nginx.%domain%.conf*;
}
Añadimos el siguiente código en el fichero nodejssock.stpl:
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
return 301 https://%domain_idn%$request_uri;
}
server {
listen %ip%:%proxy_ssl_port% http2 ssl;
server_name %domain_idn% %alias_idn%;
ssl_certificate %ssl_pem%;
ssl_certificate_key %ssl_key%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 32k;
gzip_types image/svg+xml svg svgz text/plain application/x-javascript text/xml text/css;
gzip_vary on;
location / {
proxy_pass http://unix:%home%/%user%/web/%domain%/nodeapp/app.sock:$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-NginX-Proxy true;
location ~* ^.+\.(%proxy_extentions%)$ {
root %sdocroot%;
access_log /var/log/%web_system%/domains/%domain%.log combined;
access_log /var/log/%web_system%/domains/%domain%.bytes bytes;
expires max;
try_files $uri @fallback;
add_header Pragma public;
add_header Cache-Control "public";
}
location /error/ {
alias %home%/%user%/web/%domain%/document_errors/;
}
location @fallback {
proxy_pass http://unix:%home%/%user%/web/%domain%/nodeapp/app.sock:/$1;
}
location ~ /\.ht {return 404;}
location ~ /\.svn/ {return 404;}
location ~ /\.git/ {return 404;}
location ~ /\.hg/ {return 404;}
location ~ /\.bzr/ {return 404;}
include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}
Utilizar plantillas creadas en el panel de HestiaCP
Para conectarnos a nuestro panel accederemos a https://nombre_host:8083 con el usuario "admin" y la contraseña que podemos ver en el panel de cliente.
Dentro del panel de Hestia iremos a "WEB" y hacemos clic encima del dominio que queramos utilizar la plantilla de NodeJS.
En el apartado "Soporte Proxy NGINX" haremos clic en el desplegable que por defecto muestra "default" y seleccionaremos "nodejs3000" o "nodejssock" dependiendo de los requisitos de nuestro proyecto.
Ejemplo iniciar proyecto NodeJS en HestiaCP
Para el ejemplo utilizaremos un proyecto de ejemplo de "contentful.com" que podemos encontrar en github.
En el panel de HestiaCP editamos nuestro dominio web y seleccionamos la plantilla nodejs3000 y guardamos la configuración. Automáticamente establecerá la configuración para Nginx y creará el directorio "/home/admin/web/nombre_dominio/nodeapp"
Para poner en marcha el proyecto de ejemplo ejecutaremos los siguientes comandos:
git clone https://github.com/contentful/the-example-app.nodejs.git /tmp/the-example-app.nodejs
mv -f /tmp/the-example-app.nodejs/* /home/admin/web/nombre_dominio/nodeapp
chown -R admin.admin /home/admin/web/nombre_dominio/nodeapp
find /home/admin/web/nombre_dominio/nodeapp -type f -exec chmod 644 {} ";"
find /home/admin/web/nombre_dominio/nodeapp -type d -exec chmod 755 {} ";"
cd /home/admin/web/nombre_dominio/nodeapp
npm install
npm run start:dev
Ahora ya tenemos la aplicación corriendo por el puerto 3000 y si accedemos al dominio que hemos configurado veremos el siguiente resultado: