Título: Como hacer público un servidor web express sobre node en arch linux termux android sin root. Publicado por: @XSStringManolo en 31 Marzo 2021, 01:51 am Como hacer público un servidor web express sobre node en arch linux termux android sin root.
1 - Instalar termux. Puedes instalar termux directamente desde la PlayStore https://play.google.com/store/apps/details?id=com.termux Si tu dipositivo no tiene PlayStore puedes descargar Termux en el siguiente enlace https://apps.evozi.com/apk-downloader/?id=com.termux 2 - Configurar Termux Abre la app, escribe el comando termux-setup-storage y dale enter. Te recomiendo también instalar los siguientes paquetes que utilizo para facilitar la instalación: Código: pkg install vim pkg install quickjs pkg install g++ pkg install nodejs pkg install git pkg install make Y también instalar el repo pointless donde se da soporte a paquetes como mongodb que no están disponibles directamente en los repos de Termux. Código: curl https://raw.githubusercontent.com/its-pointless/its-pointless.github.io/master/setup-pointless-repo.sh -o ~/../usr/spr.sh && cd ~/../usr/ && chmod +775 spr.sh && ./spr.sh && rm spr.sh 3 - Instalar Arch Linux usando proot Proot emula las carpetas y utiliza algunos trucos para poder instalar una distribución de Linux sin necesidad de rootear. Escribe el siguiente comando y dale enter. Código: pkg install proot && pkg install proot-distro && proot-distro install archlinux && proot-distro login archlinux Aquí tienes más información si tienes curiosidad. https://wiki.termux.com/wiki/PRoot4 - Añadir extensión a la Shell Nota: Este paso es totalmente prescindible. Es un programa que hice yo para manejar de forma más cómoda la shell y diferenciarla de otras. Vete al punto 5 si no te interesa. Veras que cambia el mensaje de consola indicando que ya estás en Arch Linux [root@localhost]. El siguiente paso que voy a realizar es descargar una extensión para bash que trae atajos y otras utilidades. Este paso es opcional. Para instalar la extensión corre el comando: Código: curl https://raw.githubusercontent.com/StringManolo/SMBSE/main/.bashrc -o .bashrc && source .bashrc Como utilizo este programa en distintos sistemas, incluyendo el propio termux, voy a modificar el archivo para que me muestre el nombre del sistema actual para el usuario root.Corre el comando Código: v .bashrc && source .bashrc Para que se abra el archivo a editarSi ahora escribes /PS1 y presionas enter, se te movera el archivo a la parte del documento donde hay un código tal que: Código: PS1='\n\n${underlinedarkgray}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${gree n}$(pwd)${endc}\n> '; Ahí voy a sustituir ${underlinegray} por ${darkblue}Arch Linux ${endc} Si no sabes usar vim puedes borrar esa linea y pegar esto: Código: PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> '; Para borrar la linea con vim posiciona el cursor encima del primer PS1=... y presiona dos veces la tecla d Después manten pulsado el botón en el centro de la pantalla para que salga la opción de pegar. El resultado tiene que quedar tal que: Código: # Custom Console SMBSE_LOGME 'Setting PS1 and PS2 terminal indicators' PS1='\n\n${darkblue}Arch Linux ${endc}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blue}%4N)${darkgray}) ${green}$(pwd)${endc}\n> '; #PS1='\n\n[${blue}$(date +%H${endc}:${blue}%M${endc}:${blue}%S${endc}:${blue}%4N)${endc}] ${green}$(pwd)${endc}\n${blue}>${endc} ' PS2='${blue}.${endc} '; Una vez está así escribe :x Y presiona enter para guardar los cambios. Te quedará el mensaje de consola tal que: Código: Arch Linux (17:41:26:1553) /root > 5 - Crear servidor con express y node. Crea una carpeta para el servidor. Código: mkdir /srv/http/myNodeServer && cd /srv/http/myNodeServer Crea el proyecto del servidor con el comando npm initRellena los datos que quieras. Yo solo he puesto archnode y presionado enter repetidamente. Añade express al proyecto con el comando Código: npm install express Modifica el código del servidor remplazando stringmanoloarch.tk por tu dominio en el siguiente comando (si es un comando) antes de correrlo: Código: echo 'const fs = require("fs"); const http = require("http"); const https = require("https"); const privateKey = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem", "utf-8"); const certificate = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem", "utf-8"); const ca = fs.readFileSync("const ca = fs.readFileSync("/etc/letsencrypt/live/stringmanoloarch.tk/chain.pem", "utf8"); const credentials = {key: privateKey, cert: certificate, ca: ca}; const express = require("express"); const app = express(); const cli = {}; for (let i in process.argv) { switch(process.argv[i]) { case "-p": case "--port-http": cli.port = process.argv[1 + +i]; break; case "-p2": case "--port-https": cli.portHttps = process.argv[1 + +i]; break; case "--host": cli.host = process.argv[1 + +i]; break; } } if (!cli.port) cli.port = 8080; if (!cli.portHttps) cli.portHttps = 8443; if (!cli.host) cli.host = "127.0.0.1"; app.use(express.static("public")); const httpServer = http.createServer(app); const httpsServer = https.createServer(credentials, app); httpServer.listen(cli.port); httpsServer.listen(cli.portHttps);' > index.js Crea también la carpeta desde la cual se serviran los archivos con el comando mkdir public y mete dentro una web de ejemplo tal que: Código: mkdir public && echo 'Hello!' > public/index.html 6 - Crea un dominio con freenom. Ve a la web https://my.freenom.com/clientarea.php?action=domains registrate y crea un nuevo dominio. Una vez loggeado dentro vete al apartado dominios https://my.freenom.com/domains.php e introduce ahí el nombre de dominio que quieras. Por ejemplo yo usaré stringmanoloarch.tk muchos nombres ya están siendo utilizados o no se pueden registrar gratuitamente, pero si poner tu nombre y una palabra por ejemplo, seguro que está disponible. Dale a chekout para confirmar la adquisición del nuevo dominio y en el menu desplegable donde dice 3 Months free cámbialo a 12 Months free. Marca la casilla para aceptar condiciones y términos y dale a Complete Order. Ahora si vas al apartado https://my.freenom.com/clientarea.php?action=domains ahí tienes tu nuevo dominio para gestionarlo. 7 - Crear certificado. Actualiza el sistema y los paquetes con el comando Código: pacman -Syu Di que sí a las opciones de remplazo que te pregunte escribiendo yInstala certbot Código: pacman -S certbot Acepta la instalación escribiendo yGenera un certificado manualmente con el comando Código: certbot certonly --manual --preferred-challenges dns Te pedira el dominio, pon el que registrate en freenom.Es posible que te pida el correo, introduce tu correo. Escribe y para aceptar los terminos de uso Escribe n para no compartir tu email publicamente Entonces te saldrá un mensaje diciendo que demuestres que tienes control sobre el dominio de freenom con un registro TXT. Para ello haces lo siguiente: Ve a https://my.freenom.com/clientarea.php?action=domain Pincha en manage freenom dns. Pincha en edit nameservers. Selecciona use default nameservers y pulsa en change nameservers. Vuelve otra vez a darle en manage nameservers y ahora podrás agregar registros DNS a los servidores de freenom. En el primer apartado pon el nombre del registro que indica certbot. En mi caso es _acme-challenge.stringmanoloarch.t En el segundo apartado selecciona TXT como tipo de registro. El tercer apartado (3600) no hace falta que lo cambies. En el cuarto y último, debes añadir la cadena de caracteres que indica el certbot, en mi caso algo tal que 0V8MBE1iGEcgljH3PIox8Od_XaI-7FvjJi-BkM3beJY Dale a save changes. Antes de darle a enter al certbot, espera unos segundos para que se haga el registro público. Tras dar enter recibirás un mensaje tal que: Código: Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/stringmanoloarch.tk/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/stringmanoloarch.tk/privkey.pem Your certificate will expire on 2021-05-23. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: 8 - Usando freenom como ddns. Haz clone y make del siguiente script que renueva dominios y actualiza la ip dinámica Código: git clone https://github.com/mkorthof/freenom-script.git && cd freenom-script Edita el archivo freenom.conf y añade tu email y contraseña de la cuente de freenom Código: v freenom.conf Una vez finalices corre el siguiente comando con tu dominio, en mi caso es: Código: ./freenom.sh -c freenom.conf -u stringmanoloarch.tk Si vas a los registros de freenom podras comprobar que se generó un registro A para tu dominio. Pon live tu servidor volviendo a la carpeta anterior con cd ../ y corriendo el comando: Código: node index.js Por defecto usa el puerto 8080 para http y 8443 para https. Puedes pasar los puertos como argumentos del commando, por ejemplo. Código: node index.js -p 8081 -p2 8444 Si tienes los puertos abiertos podrás ver la web en el puerto correspondiente y tu dominio, si usas https verás el candadito verde. En mi caso: https://stringmanoloarch.tk:8443/ Si los configuraste y no puedes ver la web, utiliza el comando nmap para comprabar si están abiertos o no: Código: nmap tuIp -p80,443 9 - Apertura de puertos. La forma de abrir puertos difiere entre routers o tipos de redes. Por lo cual no te puedo decir exactamente como debes hacerlo tu. Si usas wifi: La forma usual de hacerlo es revisando la parte inferior del router donde vienen el usuario, contraseña y la dirección del panel de administración del router. Suelen ser http://192.168.0.1 o http://192.168.1.1 Una vez consigas acceder, dentro tendrás que buscar el apartado que te permita abrir los puertos. El apartado suele tener varias opciones. Puerto externo, Puerto interno, protocolo del puerto, dirección ip local... El puerto externo es el puerto que deben poner los usuarios que quieran ver tu web. El navegador omite los puertos 80 y 443 para http y https en las urls, asique son esos los que probablemente te interese abrir. En el protocolo del puerto selecciona TCP si tienes la opción. En dirección ip te pide la dirección ip local del computador. Esta opción es para que el router sepa a que dispositivo de tu red enviar la conexión. Puedes buscarlo en el propio panel del router o usar el comando ipconfig para ver la dirección. Suele empezar por 192... Ponla, guarda los cambios y debería estar todo listo. En caso de que uses datos móviles tienes 2 opciones. Preguntar a tu operador o buscar por internet si es posible (en tu compañía) abrir puertos con datos. O utilizar el programa ngrok. Sigue los pasos de configuración del programa en su web, crea cuenta y añade el identificador que te dan en la web al ngrok. Depués solo tienes que correr el servidor web (dejarlo abierto) y correr el comando Código: ngrok http 80 Título: Re: Como hacer público un servidor web express sobre node en arch linux termux android sin root. Publicado por: Danielㅤ en 31 Marzo 2021, 02:05 am Hola estimado StringManolo, que gran aporte, que pedazo de explicación!!
Gracias por compartir tu aporte!! ;-) ;-) ;-) Saludos |