Cómo construir un servidor Raspberry Pi para desarrollo

Publicado: 2022-03-11

La Raspberry Pi es una pequeña computadora que puede obtener por tan solo USD $ 5 y en la que puede ejecutar muchos tipos diferentes de software y construir muchos proyectos diferentes.

En este artículo, lo guiaré a través del proceso de configurarlo como un servidor de desarrollo doméstico e implementar una aplicación de JavaScript de pila completa a la que puede acceder desde fuera de su red. Esto es excelente para configurar su propio espacio de trabajo digital remoto, o simplemente para tener control sobre el hardware que usa para el desarrollo.

¿Qué necesita para este servidor doméstico Raspberry Pi?

Si bien este es ahora un tutorial de Raspberry Pi 3 en particular, aún debería funcionar con modelos que se remontan a la primera generación; si tiene un modelo anterior o un Raspberry Pi Zero, háganos saber su experiencia en los comentarios a continuación.

Además de la propia placa Raspberry Pi, necesitará:

  • Un cargador Micro USB
  • un cable ethernet
  • Una tarjeta microSD (mínimo 8 GB y las tarjetas de hasta 32 GB parecen funcionar bien)

Estos también serán útiles durante la configuración inicial:

  • Un teclado USB
  • Un cable HDMI y un monitor

El sistema operativo Raspberry Pi: Raspbian

Instalar un sistema operativo en una Raspberry Pi es simple. Primero, usando su computadora, instale la imagen de arranque en una tarjeta microSD. Luego, simplemente inserte la tarjeta en la Raspberry Pi y arranque desde allí.

Raspbian es una distribución de Linux portada de Debian 7.0 ( Wheezy ) y es el sistema operativo oficial para Raspberry Pi optimizado para la arquitectura del dispositivo. Si bien existen otras opciones para ejecutar su sistema operativo favorito en la Pi, usaremos Raspbian por su simplicidad.

Este tutorial se ha actualizado para que funcione con esta versión (o posterior) de Raspbian:

 Kernel version : #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) Kernel release : 4.9.0-8-amd64

Para instalar Raspbian, diríjase a la página de descarga oficial y descargue el archivo zip con la última versión de Raspbian.

Luego, inserte la tarjeta microSD en la ranura o adaptador para tarjetas SD de su computadora. Según el sistema operativo de su computadora, siga las instrucciones provistas en el sitio web de Raspberry para Linux, Mac OS o Windows.

Una vez que finalice el proceso, expulse la tarjeta SD de su computadora e insértela en la Raspberry Pi. Conecte la Raspberry Pi a su enrutador con el cable Ethernet y conecte el cargador Micro USB, que iniciará el arranque de la Raspberry Pi.

Para la configuración inicial, hay dos opciones:

  • Si tiene un teclado USB y un monitor HDMI, puede conectarlos a la Raspberry Pi para la configuración inicial.
    • Su Pi debería reconocer estos dispositivos tan pronto como se conecten.
    • La primera vez que se inicia la Pi, se ejecutará automáticamente raspi-config . Después del primer arranque, deberá ejecutar sudo raspi-config usted mismo para configurar el dispositivo.
  • Si no los tiene, puede conectarse a su Raspberry Pi mientras está usando SSH:
    • Primero, debe encontrar la dirección IP de su Raspberry Pi en su red local. Esto se puede hacer conectándose a la página de administración de su enrutador o usando una herramienta de red como nmap .
    • Una vez que tenga la dirección IP del dispositivo, conéctese a él usando SSH desde su terminal (o a través de Putty si está usando Windows). El usuario predeterminado es pi y la contraseña predeterminada es raspberry . Entonces, por ejemplo, si la dirección IP es 192.168.1.16, ejecute ssh [email protected] e ingrese la contraseña cuando se le solicite.
    • Cuando esté conectado, ejecute sudo raspi-config .

raspi-config lo guiará a través de la configuración final. Puede configurar todas las opciones, pero las más importantes son las dos primeras: expandir el sistema de archivos, asegurándose de que todo el almacenamiento de la tarjeta SD esté disponible para el sistema operativo, y cambiar la contraseña para el usuario predeterminado de Pi, para que su servidor sea protegido de los intrusos.

Raspi-config

Instale un servidor web (Nginx) en su Raspberry Pi

A continuación, instalará el servidor web. Prefiero Nginx porque ocupa poco espacio en la memoria y porque funciona bien con Node.js (que configurará más adelante). Otros servidores web, como Apache o lighttpd, también funcionarían, pero usaremos Nginx para esta demostración.

Antes de comenzar a instalar cualquier cosa, debe asegurarse de que todo esté actualizado ejecutando estos comandos en el Pi:

 sudo apt-get update sudo apt-get upgrade

Luego puede instalar Nginx usando apt-get :

 sudo apt-get install nginx

Una vez completada la instalación, inicie el servidor ejecutando:

 sudo service nginx start

Si no tuvo que averiguar la IP local de su Raspberry Pi en el paso anterior, es hora de averiguarlo ejecutando ifconfig . La salida para su adaptador ethernet estará bajo eth0 , y con su dirección IP local etiquetada como inet addr .

Una vez que conozca la dirección IP, puede apuntar el navegador de su computadora hacia ella, donde debería ver el mensaje predeterminado "Bienvenido a Nginx".

Abierto a la web: reenvío de puertos

Puede omitir este paso si no planea acceder a su Raspberry Pi desde fuera de su red local. Pero para aquellos que quieran acceder a su servidor desde otras ubicaciones, asegurémonos de que sea posible.

En una red doméstica típica, los dispositivos conectados al enrutador son invisibles para el mundo exterior. Solo se puede acceder a su enrutador desde el exterior, utilizando la dirección IP externa de su red. Su enrutador es responsable de determinar qué tráfico entrante está permitido en la red y a qué dispositivo debe enviarse.

Cuando un dispositivo en la red local inicia una conexión (por ejemplo, cuando abre un sitio web en su navegador), el enrutador reconoce el tráfico de respuesta entrante como parte de esta conexión y lo permite. Sin embargo, si el enrutador recibe tráfico entrante que no es parte de una conexión abierta (por ejemplo, cuando un dispositivo externo intenta iniciar una conexión con un dispositivo interno), bloqueará el tráfico entrante para que no cruce la red. ¡Esta es una función de seguridad importante para proteger la red!

Entonces, ¿cómo puedes conectarte a tu Pi desde el exterior? La respuesta es el reenvío de puertos. El enrutador debe configurarse para permitir que las conexiones entrantes en puertos específicos pasen y se envíen al dispositivo correcto. De manera predeterminada, el protocolo HTTP usa el puerto 80 y SSH usa el puerto 22, por lo que estos son los dos puertos que necesita abrir en su enrutador para acceder a su aplicación web y permitir conexiones seguras para administrar su servidor.

Reenvío de puertos.

Los pasos para configurar su enrutador para abrir y reenviar los puertos pueden variar según su proveedor de Internet y la marca de su enrutador, pero en cualquier caso, debería poder lograrlo a través de las opciones de configuración avanzada de la página de administración de su enrutador. Simplemente busque una opción con un nombre como "Reenvío", "Reenvío de puertos" o "Traducción de direcciones de red".

Debe abrir un puerto para conexiones HTTP y otro para SSH. La idea básica consiste en reenviar datos dirigidos a estos dos puertos externos a su Raspberry Pi, con el tráfico web yendo al puerto 80 donde Nginx está escuchando y el tráfico SSH yendo al puerto 22, donde el servidor SSH acepta conexiones de computadoras externas. Aquí hay un ejemplo de cómo podría verse esto en la página de configuración de su enrutador:

Tabla de configuración de reenvío de puertos.

Configuración de reenvío de puertos si la dirección IP interna de su Raspberry Pi es 192.168.1.16 . Todo el tráfico entrante con destino a los puertos 80 o 22 se reenvía a esta dirección interna.

Puede determinar la dirección IP externa de su enrutador simplemente escribiendo "cuál es mi dirección IP" en Google. Si luego se muda fuera de la red de su enrutador, puede probar que el reenvío de puertos funciona abriendo una conexión SSH con ssh pi@{external IP address} . Del mismo modo, el reenvío de puertos HTTP se puede probar ingresando la dirección IP externa en la barra de direcciones de su navegador. Solo tenga en cuenta que el reenvío de puertos permite que cualquier persona externa acceda al dispositivo en estos puertos si conocen la IP externa de su enrutador.

Si no tiene una IP estática, puede configurar un DNS dinámico. Es un paso muy sencillo y fácil. Puede configurar DNS dinámico desde su enrutador o puede configurar su Raspberry Pi para ello. No voy a cubrir cómo configurar DDNS aquí, pero BitPi.co tiene un buen tutorial sobre el tema si es necesario.

Instale el marco: JavaScript de pila completa

Puede ejecutar la mayoría de los marcos web sobre Nginx, pero veamos cómo hacer una pila completa con JavaScript. Para hacer esto, debe instalar Node.js y MongoDB.

Hoy en día, Node.js se instala fácilmente en una Raspberry Pi con:

 sudo apt-get install nodejs

Una vez que termine de instalarse, puede comprobar si funciona ejecutando node -v .

Ahora puede instalar MongoDB simplemente escribiendo:

 sudo apt-get install mongodb

Solo tenga en cuenta que si alguna vez necesita apagar la Raspberry Pi, primero debe cerrar el servicio para evitar la corrupción de la base de datos:

 sudo service mongodb stop

Implemente su aplicación

Puede desarrollar en su máquina local y luego enviar sus cambios a un repositorio de Git en BitBucket. Dado que Raspbian viene con Git preinstalado, puede extraer el código de su aplicación más reciente en el dispositivo y ejecutarlo.

Andamiar el proyecto

Primero, configuremos un código de aplicación y páselo a un repositorio de Git. Hay muchas formas de iniciar una aplicación, pero una de mis favoritas es generator-angular-fullstack, que construye tanto el código del servidor como el del cliente.

Instale generator-angular-fullstack en su computadora:

 npm install -g generator-angular-fullstack

Cree un nuevo directorio para su aplicación:

 mkdir my-app cd my-app

Y andamio la aplicación:

 yo angular-fullstack my-app

Crear el repositorio y enviar el código

Ahora cree un repositorio en BitBucket, como se describe aquí. Luego configure su directorio local:

 git init git remote add origin [email protected]:USER/REPO.git

Entonces puedes confirmar y enviar el código:

 git add . git commit -m 'Initial commit' git push -u origin master

El generador viene con el complemento grunt-build-control, que le permite enviar el código de compilación a una rama específica en su repositorio. Simplemente agregue la configuración de BitBucket a Gruntfile.js en el directorio raíz de su aplicación:

 buildcontrol: { options: { dir: 'dist', commit: true, push: true, connectCommits: false, message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' }, bitbucket: { options: { remote: '[email protected]:USER/REPO.git', branch: 'build' } } }, // ...

Ahora ejecuta:

 grunt build

…para crear la carpeta de distribución, seguido de esto:

 grunt buildcontrol:bitbucket

…para confirmar y enviar el código a la rama de compilación en su repositorio.

Generar la Clave SSH

Ahora tiene su código alojado. Antes de poder implementarlo en su Raspberry Pi, debe generar una clave SSH para Raspberry Pi y agregarla a su cuenta de BitBucket. Realizaremos este paso rápidamente, pero si tiene algún problema, siga la guía de BitBucket. Por lo tanto, vuelva a iniciar sesión en su terminal Raspberry Pi y genere el par de claves pública/privada:

 ssh-keygen

Luego, inicie el agente:

 ssh-agent /bin/bash

Y agregue la clave al agente:

 ssh-add /home/pi/.ssh/id_rsa

Ahora solo necesita generar el contenido de la clave pública:

 cat /home/pi/.ssh/id_rsa.pub

… para que pueda copiarlo y pegarlo en BitBucket.

En BitBucket, haz clic en tu foto de perfil y ve a Administrar cuenta . En SEGURIDAD , busque las claves SSH y haga clic en el botón Agregar clave .

Clonar el repositorio

No existe una convención sobre dónde colocar el código de sus aplicaciones, pero puede crear un directorio /var/www y colocar todos sus proyectos allí.

 cd /var sudo mkdir www

Para evitar el uso de sudo cuando desee colocar archivos en la raíz web, puede cambiar el propietario a su usuario Pi y el grupo a www-data , que utiliza Nginx:

 sudo chown -R pi:www-data www cd www

Ahora, puede clonar la rama de compilación de su repositorio e instalar las dependencias:

 git clone [email protected]:USER/REPO.git --branch build --single-branch cd REPO npm install --production

Una vez que haya terminado, puede iniciar su aplicación, configurando el entorno en producción:

 export NODE_ENV=production; node server/app.js &

Ahora, apunte el navegador de su computadora a la dirección IP del dispositivo para verificar si funciona.

¿Te gustaría tener un servidor de desarrollo que pudieras llamar tuyo? Puedes, con una #RaspberryPi.
Pío

Configurar el proxy inverso de Nginx

Queda un paso más para que su aplicación sea accesible desde el exterior. Aunque Nginx está escuchando en el puerto 80, donde recibirá solicitudes HTTP para su Pi, la propia aplicación Node está escuchando en un puerto diferente (por ejemplo, el puerto 8080). Por lo tanto, debe configurar Nginx para que actúe como un proxy inverso, reconociendo las solicitudes destinadas a su aplicación y pasándolas a Node.

Nginx mantiene el archivo de configuración para cada aplicación que sirve en la carpeta sites-available :

 cd /etc/nginx/sites-available/

Aquí puede copiar el archivo de configuración default y editarlo a su conveniencia:

 sudo cp default my-app sudo nano my-app

El archivo de configuración final debería verse así, con Nginx actuando como un proxy para el servidor Node.js:

 server { listen 80; root /var/www/my-app/; # identifies the location of the application you are configuring server_name my-app.dev; # identifies the hostname used by this application's traffic location / { proxy_pass http://localhost:8080/; # configures the back-end destination for this traffic } }

Para habilitar esta configuración, debe crear un enlace simbólico en la carpeta sites-enabled , donde Nginx busca configuraciones activas durante el tiempo de ejecución:

 sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app

Y recargar el servicio para activar estos cambios:

 sudo service nginx reload

En este punto, su aplicación está lista para recibir tráfico HTTP destinado al dominio my-app.dev (gracias a la directiva server_name my-app.dev que configuró anteriormente). El problema final que debe resolver es cómo hacer que el tráfico que envía desde el exterior coincida con este nombre de dominio. Aunque podría comprar un nombre de dominio y apuntarlo a su IP, el archivo de hosts viene al rescate y lo hace innecesario.

En la estación de trabajo desde la que accederá al sitio, simplemente agregue la dirección IP externa de su enrutador y combínela con el nombre de host my-app.dev . Cualquier tráfico HTTP que genere para my-app.dev se enviará directamente a su enrutador, con el nombre de host correcto en el encabezado Host HTTP.

En Windows, con privilegios de administrador, puede editar el archivo ubicado en c:\windows\system32\drivers\etc\hosts con el bloc de notas. En Linux y Mac, puede usar la terminal con sudo nano /etc/hosts y sudo nano /private/etc/hosts respectivamente.

 ## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 212.124.126.242 my-app.dev # add your host name to the list

¿Que sigue?

Ahora que todo está configurado, puede implementar tantas aplicaciones como desee en su Raspberry Pi e instalar forever o pm2 para mantener vivos sus servidores Node.js.

¡Y recuerde que si algo sale mal, puede borrar la tarjeta SD y comenzar de nuevo desde cero!

Servidor de desarrollo Raspberry Pi en acción.

Relacionado: Controle su clima con este tutorial de termostato Raspberry Pi