Come creare un server Raspberry Pi per lo sviluppo

Pubblicato: 2022-03-11

Il Raspberry Pi è un piccolo computer che puoi acquistare a partire da $ 5 USD e sul quale puoi eseguire molti tipi diversi di software e costruire molti progetti diversi.

In questo articolo, ti guiderò attraverso il processo di configurazione come server di sviluppo domestico e distribuzione di un'applicazione JavaScript full-stack a cui puoi accedere dall'esterno della tua rete. Questo è ottimo per configurare il tuo spazio di lavoro digitale remoto o semplicemente per avere il controllo sull'hardware che usi per lo sviluppo.

Di cosa hai bisogno per questo server domestico Raspberry Pi?

Anche se questo è ora un tutorial di Raspberry Pi 3 in particolare, dovrebbe comunque funzionare con i modelli che risalgono alla prima generazione: se hai un modello precedente o un Raspberry Pi Zero, facci sapere la tua esperienza nei commenti qui sotto.

Oltre alla scheda Raspberry Pi stessa, avrai bisogno di:

  • Un caricatore Micro USB
  • Un cavo Ethernet
  • Una scheda microSD (minimo 8 GB e schede fino a 32 GB sembrano funzionare bene)

Questi saranno utili anche durante la configurazione iniziale:

  • Una tastiera USB
  • Un cavo HDMI e un monitor

Il sistema operativo Raspberry Pi: Raspbian

Installare un sistema operativo su un Raspberry Pi è semplice. Innanzitutto, utilizzando il computer, installa l'immagine di avvio su una scheda microSD. Quindi inserisci semplicemente la scheda nel Raspberry Pi e avvia da lì.

Raspbian è una distribuzione Linux portata da Debian 7.0 ( Wheezy ) ed è il sistema operativo ufficiale per Raspberry Pi ottimizzato per l'architettura del dispositivo. Sebbene ci siano altre opzioni per eseguire il tuo sistema operativo preferito sul Pi, useremo Raspbian per la sua semplicità.

Questo tutorial è stato aggiornato per funzionare con questa versione (o successiva) di Raspbian:

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

Per installare Raspbian, vai alla pagina di download ufficiale e scarica il file zip con l'ultima versione di Raspbian.

Quindi, inserisci la scheda microSD nello slot per schede SD o nell'adattatore del tuo computer. A seconda del sistema operativo del tuo computer, segui le istruzioni fornite sul sito Web di Raspberry per Linux, Mac OS o Windows.

Al termine del processo, espelli la scheda SD dal computer e inseriscila nel Raspberry Pi. Collega il Raspberry Pi al router utilizzando il cavo Ethernet e collega il caricatore Micro USB, che avvierà l'avvio del Raspberry Pi.

Per la configurazione iniziale sono disponibili due opzioni:

  • Se hai una tastiera USB e un monitor HDMI, puoi collegarli al Raspberry Pi per la configurazione iniziale.
    • Il tuo Pi dovrebbe riconoscere questi dispositivi non appena vengono collegati.
    • La prima volta che il Pi si avvia, verrà eseguito automaticamente raspi-config . Dopo il primo avvio, dovrai eseguire tu stesso sudo raspi-config per configurare il dispositivo.
  • Se non li hai, puoi connetterti al tuo Raspberry Pi mentre è acceso usando SSH:
    • Innanzitutto, devi trovare l'indirizzo IP del tuo Raspberry Pi nella tua rete locale. Questo può essere fatto collegandosi alla pagina di amministrazione del router o utilizzando uno strumento di rete come nmap .
    • Una volta che hai l'indirizzo IP del dispositivo, connettiti ad esso usando SSH dal tuo terminale (o tramite Putty se stai usando Windows). L'utente predefinito è pi e la password predefinita è raspberry . Quindi, ad esempio, se l'indirizzo IP è 192.168.1.16, esegui ssh [email protected] e inserisci la password quando richiesto.
    • Quando sei connesso, esegui sudo raspi-config .

raspi-config ti guiderà attraverso la configurazione finale. Puoi configurare tutte le opzioni ma le più importanti sono le prime due: espandere il filesystem, assicurandoti che tutta la memoria della scheda SD sia disponibile per il sistema operativo e modificare la password per l'utente Pi predefinito, in modo che il tuo server sia protetto dagli intrusi.

Raspi-config

Installa un server Web (Nginx) sul tuo Raspberry Pi

Successivamente, installerai il server web. Preferisco Nginx perché ha un footprint di memoria ridotto e perché funziona bene con Node.js (che configurerai in seguito). Anche altri server web, come Apache o lighttpd, funzionerebbero, ma useremo Nginx per questa dimostrazione.

Prima di iniziare a installare qualsiasi cosa, devi assicurarti che tutto sia aggiornato eseguendo questi comandi sul Pi:

 sudo apt-get update sudo apt-get upgrade

Quindi puoi installare Nginx usando apt-get :

 sudo apt-get install nginx

Una volta completata l'installazione, avviare il server eseguendo:

 sudo service nginx start

Se non dovevi capire l'IP locale del tuo Raspberry Pi nel passaggio precedente, è ora di scoprirlo eseguendo ifconfig . L'output per la scheda ethernet sarà inferiore a eth0 e con il relativo indirizzo IP locale etichettato inet addr .

Una volta che conosci l'indirizzo IP, puoi puntare su di esso il browser del tuo computer, dove dovresti vedere il messaggio predefinito "Benvenuto in Nginx".

Aperto al Web: Port Forwarding

Puoi saltare questo passaggio se non hai intenzione di accedere al tuo Raspberry Pi dall'esterno della tua rete locale. Ma per coloro che desiderano accedere al proprio server da altre posizioni, assicuriamoci che sia possibile.

In una tipica rete domestica, i dispositivi collegati al router sono invisibili al mondo esterno. Solo il tuo router può essere raggiunto dall'esterno, utilizzando l'indirizzo IP esterno della tua rete. Il tuo router è responsabile di determinare quale traffico in entrata è consentito nella rete e a quale dispositivo deve essere inviato.

Quando un dispositivo sulla rete locale avvia una connessione (ad esempio, quando si apre un sito Web sul browser), il router riconosce il traffico di risposta in entrata come parte di questa connessione e lo consente. Tuttavia, se il router riceve traffico in entrata che non fa parte di una connessione aperta (ad esempio, quando un dispositivo esterno tenta di avviare una connessione con un dispositivo interno), impedirà al traffico in entrata di attraversare la rete. Questa è un'importante funzione di sicurezza per proteggere la rete!

Quindi, come puoi connetterti al tuo Pi dall'esterno? La risposta è il port forwarding. Il router deve essere configurato per consentire il passaggio delle connessioni in entrata su porte specifiche e l'invio al dispositivo corretto. Per impostazione predefinita, il protocollo HTTP utilizza la porta 80 e SSH utilizza la porta 22, quindi queste sono le due porte che devi aprire sul tuo router per accedere alla tua applicazione web e consentire connessioni sicure per la gestione del tuo server.

Port forwarding.

I passaggi per configurare il tuo router per aprire e inoltrare le porte possono variare a seconda del tuo provider Internet e della marca del tuo router, ma in ogni caso dovresti essere in grado di farlo attraverso le opzioni di configurazione avanzate della pagina di amministrazione del tuo router. Cerca un'opzione con un nome come "Inoltro", "Inoltro porta" o "Traduzione dell'indirizzo di rete".

Devi aprire una porta per le connessioni HTTP e un'altra per SSH. L'idea di base consiste nell'inoltrare i dati indirizzati a queste due porte esterne al tuo Raspberry Pi, con il traffico web che va alla porta 80 dove Nginx è in ascolto e il traffico SSH che va alla porta 22, dove il server SSH accetta connessioni da computer esterni. Ecco un esempio di come potrebbe apparire nella pagina di configurazione del router:

Tabella di configurazione del port forwarding.

Configurazione del port forwarding se l'indirizzo IP interno del tuo Raspberry Pi è 192.168.1.16 . Tutto il traffico in entrata legato alle porte 80 o 22 viene inoltrato a questo indirizzo interno.

Puoi determinare l'indirizzo IP esterno del tuo router semplicemente digitando "qual è il mio indirizzo IP" in Google. Se poi esci dalla rete del router, puoi verificare che il port forwarding funzioni aprendo una connessione SSH con ssh pi@{external IP address} . Allo stesso modo, il port forwarding HTTP può essere testato inserendo l'indirizzo IP esterno nella barra degli indirizzi del browser. Tieni presente che il port forwarding consente a chiunque dall'esterno di accedere al dispositivo su queste porte se conosce l'IP esterno del router.

Se non disponi di un IP statico, puoi configurare il DNS dinamico. È un passaggio molto semplice e facile. Puoi configurare il DNS dinamico dal tuo router o puoi configurare il tuo Raspberry Pi per questo. Non tratterò come configurare DDNS qui, ma BitPi.co ha un buon tutorial sull'argomento, se necessario.

Installa il Framework: JavaScript full-stack

Puoi eseguire la maggior parte dei framework Web su Nginx, ma vediamo come eseguire lo stack completo con JavaScript. Per fare ciò, è necessario installare Node.js e MongoDB.

Al giorno d'oggi, Node.js può essere facilmente installato su un Raspberry Pi con:

 sudo apt-get install nodejs

Al termine dell'installazione, puoi verificare se funziona eseguendo node -v .

Ora puoi installare MongoDB semplicemente digitando:

 sudo apt-get install mongodb

Tieni presente che se hai bisogno di spegnere il Raspberry Pi, devi prima chiudere il servizio per evitare il danneggiamento del database:

 sudo service mongodb stop

Distribuisci la tua app

Puoi sviluppare sul tuo computer locale e quindi inviare le modifiche a un repository Git su BitBucket. Poiché Raspbian viene fornito con Git preinstallato, puoi quindi estrarre il codice dell'applicazione più recente sul dispositivo ed eseguirlo.

Impalcatura il progetto

Per prima cosa, impostiamo del codice dell'applicazione e inseriamolo in un repository Git. Esistono molti modi per avviare un'applicazione, ma uno dei miei preferiti è generator-angular-fullstack, che supporta sia il codice del server che del client.

Installa generator-angular-fullstack sul tuo computer:

 npm install -g generator-angular-fullstack

Crea una nuova directory per la tua applicazione:

 mkdir my-app cd my-app

E impalca l'applicazione:

 yo angular-fullstack my-app

Crea il repository e invia il codice

Ora crea un repository in BitBucket, come descritto qui. Quindi imposta la tua directory locale:

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

Quindi puoi eseguire il commit e il push del codice:

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

Il generatore viene fornito con il plug-in grunt-build-control, che ti consente di eseguire il commit del codice di compilazione in un ramo specifico nel tuo repository. Basta aggiungere la configurazione per BitBucket a Gruntfile.js nella directory principale dell'applicazione:

 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' } } }, // ...

Ora esegui:

 grunt build

…per creare la cartella di distribuzione, seguita da questo:

 grunt buildcontrol:bitbucket

...per eseguire il commit e inviare il codice al ramo build nel tuo repository.

Genera la chiave SSH

Ora hai il tuo codice ospitato. Prima di poterlo distribuire sul tuo Raspberry Pi, devi generare una chiave SSH per il Raspberry Pi e aggiungerla al tuo account BitBucket. Eseguiremo rapidamente questo passaggio, ma in caso di problemi, segui la guida di BitBucket. Quindi, accedi nuovamente al tuo terminale Raspberry Pi e genera la coppia di chiavi pubblica/privata:

 ssh-keygen

Quindi, avvia l'agente:

 ssh-agent /bin/bash

E aggiungi la chiave all'agente:

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

Ora devi solo produrre il contenuto della chiave pubblica:

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

... così puoi copiarlo e incollarlo in BitBucket.

In BitBucket, fai clic sulla tua immagine del profilo e vai su Gestisci account . In SICUREZZA , trova le chiavi SSH e fai clic sul pulsante Aggiungi chiave .

Clona il repository

Non esiste una convenzione su dove posizionare il codice delle tue app, ma puoi creare una directory /var/www e inserire tutti i tuoi progetti lì.

 cd /var sudo mkdir www

Per evitare l'uso di sudo quando vuoi inserire file nella webroot, puoi cambiare il proprietario nel tuo utente Pi e il gruppo in www-data , che viene utilizzato da Nginx:

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

Ora puoi clonare il ramo build del tuo repository e installare le dipendenze:

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

Al termine, puoi avviare la tua app, impostando l'ambiente in produzione:

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

Ora, punta il browser del tuo computer sull'indirizzo IP del dispositivo per verificare se funziona.

Vorresti avere un server di sviluppo da poter chiamare tuo? Puoi, con un #RaspberryPi.
Twitta

Configura proxy inverso Nginx

Rimane ancora un passaggio per rendere la tua applicazione accessibile dall'esterno. Sebbene Nginx sia in ascolto sulla porta 80, dove riceverà richieste HTTP per il tuo Pi, l'applicazione Node stessa è in ascolto su una porta diversa (ad esempio, la porta 8080). Pertanto, è necessario configurare Nginx in modo che funga da proxy inverso, riconoscendo le richieste destinate alla propria applicazione e passandole a Node.

Nginx conserva il file di configurazione per ogni applicazione che serve nella cartella dei sites-available :

 cd /etc/nginx/sites-available/

Qui puoi copiare il file di configurazione default e modificarlo a tuo piacimento:

 sudo cp default my-app sudo nano my-app

Il file di configurazione finale dovrebbe assomigliare a questo, con Nginx che funge da proxy per il server 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 } }

Per abilitare questa configurazione, è necessario creare un collegamento simbolico nella cartella sites-enabled , dove Nginx cerca le configurazioni attive durante il runtime:

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

E ricarica il servizio per attivare queste modifiche:

 sudo service nginx reload

A questo punto la tua applicazione è pronta per ricevere il traffico HTTP destinato al dominio my-app.dev (grazie alla direttiva server_name my-app.dev che hai configurato in precedenza). L'ultimo problema che devi risolvere è come fare in modo che il traffico che invii dall'esterno corrisponda a questo nome di dominio. Sebbene tu possa acquistare un nome di dominio e puntarlo al tuo IP, il file hosts viene in soccorso e lo rende superfluo.

Sulla workstation da cui accederai al sito, aggiungi semplicemente l'indirizzo IP esterno del tuo router e abbinalo al nome host my-app.dev . Qualsiasi traffico HTTP che generi per my-app.dev verrà quindi inviato direttamente al tuo router, con il nome host corretto nell'intestazione HTTP Host .

Su Windows, con i privilegi di amministratore, puoi modificare il file che si trova in c:\windows\system32\drivers\etc\hosts con il blocco note. Su Linux e Mac puoi usare il terminale rispettivamente con sudo nano /etc/hosts e sudo nano /private/etc/hosts .

 ## # 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

Qual è il prossimo?

Ora che tutto è impostato, puoi distribuire tutte le applicazioni che desideri sul tuo Raspberry Pi e installare per sempre o pm2 per mantenere in vita i tuoi server Node.js.

E ricorda solo che se qualcosa va storto, puoi semplicemente cancellare la scheda SD e ricominciare da capo!

Server di sviluppo Raspberry Pi in azione.

Correlati: controlla il tuo clima con questo tutorial sul termostato Raspberry Pi