Jak zbudować serwer Raspberry Pi do rozwoju?

Opublikowany: 2022-03-11

Raspberry Pi to mały komputer, który można kupić już za 5 USD i na którym można uruchamiać wiele różnych typów oprogramowania i budować wiele różnych projektów.

W tym artykule przeprowadzę Cię przez proces konfigurowania go jako domowego serwera programistycznego i wdrażania pełnej aplikacji JavaScript, do której można uzyskać dostęp spoza sieci. Jest to świetne rozwiązanie do konfigurowania własnej zdalnej cyfrowej przestrzeni roboczej lub po prostu do kontrolowania sprzętu używanego do programowania.

Czego potrzebujesz do tego serwera domowego Raspberry Pi?

Chociaż jest to teraz w szczególności samouczek dotyczący Raspberry Pi 3, powinien nadal działać z modelami pochodzącymi z pierwszej generacji - jeśli masz starszy model lub Raspberry Pi Zero, daj nam znać o swoich doświadczeniach w komentarzach poniżej.

Oprócz samej płyty Raspberry Pi będziesz potrzebować:

  • Ładowarka Micro USB
  • Kabel Ethernet
  • Karta microSD (minimum 8 GB, a karty do 32 GB wydają się działać dobrze)

Przydadzą się one również podczas początkowej konfiguracji:

  • Klawiatura USB
  • Kabel HDMI i monitor

System operacyjny Raspberry Pi: Raspbian

Instalacja systemu operacyjnego na Raspberry Pi jest prosta. Najpierw za pomocą komputera zainstaluj obraz rozruchowy na karcie microSD. Następnie po prostu włóż kartę do Raspberry Pi i uruchom stamtąd.

Raspbian to dystrybucja Linuksa przeniesiona z Debiana 7.0 ( Wheezy ) i jest oficjalnym systemem operacyjnym dla Raspberry Pi zoptymalizowanym pod kątem architektury urządzenia. Chociaż istnieją inne opcje uruchamiania ulubionego systemu operacyjnego na Pi, użyjemy Raspbian ze względu na jego prostotę.

Ten samouczek został zaktualizowany, aby działał z tą wersją (lub nowszą) Raspbian:

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

Aby zainstalować Raspbian, przejdź na oficjalną stronę pobierania i pobierz plik zip z najnowszą wersją Raspbian.

Następnie włóż kartę microSD do gniazda karty SD lub adaptera komputera. W zależności od systemu operacyjnego komputera postępuj zgodnie z instrukcjami podanymi na stronie internetowej Raspberry dla systemu Linux, Mac OS lub Windows.

Po zakończeniu procesu wyjmij kartę SD z komputera i włóż ją do Raspberry Pi. Podłącz Raspberry Pi do routera za pomocą kabla Ethernet i podłącz ładowarkę Micro USB, która rozpocznie rozruch Raspberry Pi.

W początkowej konfiguracji istnieją dwie opcje:

  • Jeśli masz klawiaturę USB i monitor HDMI, możesz podłączyć je do Raspberry Pi w celu wstępnej konfiguracji.
    • Twoje Pi powinno rozpoznać te urządzenia, gdy tylko zostaną podłączone.
    • Przy pierwszym uruchomieniu Pi, automatycznie uruchomi się raspi-config . Po pierwszym uruchomieniu będziesz musiał samodzielnie uruchomić sudo raspi-config , aby skonfigurować urządzenie.
  • Jeśli ich nie masz, możesz połączyć się z Raspberry Pi, gdy jest włączony, używając SSH:
    • Najpierw musisz znaleźć adres IP swojego Raspberry Pi w sieci lokalnej. Można to zrobić, łącząc się ze stroną administratora routera lub używając narzędzia sieciowego, takiego jak nmap .
    • Po uzyskaniu adresu IP urządzenia połącz się z nim za pomocą SSH z terminala (lub za pośrednictwem Putty, jeśli używasz systemu Windows). Domyślnym użytkownikiem jest pi , a domyślnym hasłem jest raspberry . Na przykład, jeśli adres IP to 192.168.1.16, uruchom ssh [email protected] i wprowadź hasło, gdy zostaniesz o to poproszony.
    • Po połączeniu uruchom sudo raspi-config .

raspi-config przeprowadzi Cię przez ostateczną konfigurację. Możesz skonfigurować wszystkie opcje, ale najważniejsze to dwie pierwsze: rozszerzenie systemu plików, upewnienie się, że cała pamięć karty SD jest dostępna dla systemu operacyjnego, oraz zmiana hasła dla domyślnego użytkownika Pi, aby Twój serwer był chronione przed intruzami.

Konfiguracja raspi

Zainstaluj serwer WWW (Nginx) na swoim Raspberry Pi

Następnie zainstalujesz serwer WWW. Wolę Nginx, ponieważ zajmuje mało pamięci i dobrze współpracuje z Node.js (który skonfigurujesz później). Inne serwery internetowe, takie jak Apache lub lighttpd, również by działały, ale w tej demonstracji użyjemy Nginx.

Zanim zaczniesz instalować cokolwiek, musisz się upewnić, że wszystko jest aktualne, uruchamiając te polecenia na Pi:

 sudo apt-get update sudo apt-get upgrade

Następnie możesz zainstalować Nginx za pomocą apt-get :

 sudo apt-get install nginx

Po zakończeniu instalacji uruchom serwer, uruchamiając:

 sudo service nginx start

Jeśli w poprzednim kroku nie musiałeś ustalać lokalnego adresu IP swojego Raspberry Pi, czas to sprawdzić, uruchamiając ifconfig . Dane wyjściowe Twojej karty sieciowej będą znajdować się pod adresem eth0 , a jej lokalny adres IP będzie oznaczony jako inet addr .

Gdy znasz adres IP, możesz skierować na niego przeglądarkę komputera, gdzie powinien pojawić się domyślny komunikat „Witamy w Nginx”.

Otwórz w sieci: przekierowanie portów

Możesz pominąć ten krok, jeśli nie planujesz uzyskać dostępu do swojego Raspberry Pi spoza sieci lokalnej. Ale dla tych, którzy chcą uzyskać dostęp do swojego serwera z innych lokalizacji, upewnijmy się, że jest to możliwe.

W typowej sieci domowej urządzenia podłączone do routera są niewidoczne dla świata zewnętrznego. Z zewnątrz można uzyskać dostęp tylko do routera, korzystając z zewnętrznego adresu IP sieci. Twój router odpowiada za określenie, jaki ruch przychodzący jest dozwolony w sieci i do którego urządzenia powinien być wysyłany.

Gdy urządzenie w sieci lokalnej inicjuje połączenie (na przykład podczas otwierania strony internetowej w przeglądarce), router rozpoznaje przychodzący ruch odpowiedzi jako część tego połączenia i zezwala na jego przejście. Jeśli jednak router odbiera ruch przychodzący, który nie jest częścią otwartego połączenia (na przykład, gdy urządzenie zewnętrzne próbuje zainicjować połączenie z urządzeniem wewnętrznym), zablokuje ruch przychodzący przed przejściem do sieci. Jest to ważna funkcja bezpieczeństwa, która chroni sieć!

Jak więc połączyć się ze swoim Pi z zewnątrz? Odpowiedzią jest przekierowanie portów. Router musi być skonfigurowany tak, aby zezwalał na przechodzenie połączeń przychodzących na określonych portach i wysyłanie ich do właściwego urządzenia. Domyślnie protokół HTTP używa portu 80, a SSH używa portu 22, więc są to dwa porty, które musisz otworzyć na routerze, aby uzyskać dostęp do aplikacji internetowej i umożliwić bezpieczne połączenia w celu zarządzania serwerem.

Przekierowanie portów.

Kroki konfiguracji routera do otwierania i przekazywania portów mogą się różnić w zależności od dostawcy Internetu i marki routera, ale w każdym przypadku powinieneś być w stanie to zrobić za pomocą zaawansowanych opcji konfiguracji na stronie administratora routera. Po prostu poszukaj opcji o nazwie takiej jak „Przekazywanie”, „Przekazywanie portów” lub „Tłumaczenie adresów sieciowych”.

Musisz otworzyć port dla połączeń HTTP, a drugi dla SSH. Podstawowa idea polega na przekazywaniu danych adresowanych do tych dwóch portów zewnętrznych do Twojego Raspberry Pi, przy czym ruch sieciowy trafia do portu 80, na którym nasłuchuje Nginx, a ruch SSH do portu 22, gdzie serwer SSH akceptuje połączenia z komputerów zewnętrznych. Oto przykład, jak to może wyglądać na stronie konfiguracji routera:

Tabela konfiguracji przekierowania portów.

Konfiguracja przekierowania portów, jeśli wewnętrzny adres IP twojego Raspberry Pi to 192.168.1.16 . Cały ruch przychodzący związany z portami 80 lub 22 jest przekazywany na ten adres wewnętrzny.

Możesz określić zewnętrzny adres IP routera, wpisując w Google „jaki jest mój adres IP”. Jeśli następnie wyjdziesz poza sieć routera, możesz sprawdzić, czy przekierowanie portów działa, otwierając połączenie SSH z ssh pi@{external IP address} . Podobnie przekierowanie portów HTTP można przetestować, wprowadzając zewnętrzny adres IP w pasku adresu przeglądarki. Pamiętaj tylko, że przekierowanie portów umożliwia każdemu z zewnątrz dostęp do urządzenia na tych portach, jeśli zna zewnętrzny adres IP routera.

Jeśli nie masz statycznego adresu IP, możesz skonfigurować dynamiczny DNS. To bardzo prosty i łatwy krok. Możesz skonfigurować dynamiczny DNS z routera lub skonfigurować dla niego Raspberry Pi. Nie będę omawiał tutaj konfiguracji DDNS, ale BitPi.co ma dobry samouczek na ten temat, jeśli to konieczne.

Zainstaluj framework: JavaScript z pełnym stosem

Na Nginx można uruchomić większość frameworków internetowych, ale zobaczmy, jak korzystać z pełnego stosu JavaScript. Aby to zrobić, musisz zainstalować Node.js i MongoDB.

Obecnie Node.js można łatwo zainstalować na Raspberry Pi za pomocą:

 sudo apt-get install nodejs

Po zakończeniu instalacji możesz sprawdzić, czy działa, uruchamiając node -v .

Teraz możesz zainstalować MongoDB, wpisując:

 sudo apt-get install mongodb

Pamiętaj tylko, że jeśli kiedykolwiek będziesz musiał wyłączyć Raspberry Pi, musisz najpierw wyłączyć usługę, aby uniknąć uszkodzenia bazy danych:

 sudo service mongodb stop

Wdróż swoją aplikację

Możesz programować na swoim lokalnym komputerze, a następnie przesyłać swoje zmiany do repozytorium Git na BitBucket. Ponieważ Raspbian jest dostarczany z preinstalowanym Git, możesz pobrać najnowszy kod aplikacji na urządzenie i uruchomić go.

Rusztowanie projektu

Najpierw skonfigurujmy kod aplikacji i wypchnijmy go do repozytorium Git. Istnieje wiele sposobów uruchamiania aplikacji, ale jednym z moich ulubionych jest generator-angular-fullstack, który tworzy szkielety zarówno dla kodu serwera, jak i klienta.

Zainstaluj generator-angular-fullstack na swoim komputerze:

 npm install -g generator-angular-fullstack

Utwórz nowy katalog dla swojej aplikacji:

 mkdir my-app cd my-app

I zbuduj aplikację:

 yo angular-fullstack my-app

Utwórz repozytorium i wypchnij kod

Teraz utwórz repozytorium w BitBucket, jak opisano tutaj. Następnie skonfiguruj swój katalog lokalny:

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

Możesz więc zatwierdzić i wcisnąć kod:

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

Generator jest dostarczany z wtyczką grunt-build-control, która umożliwia zatwierdzenie kodu kompilacji do określonej gałęzi w repozytorium. Wystarczy dodać konfigurację BitBucket do Gruntfile.js w katalogu głównym aplikacji:

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

Teraz uruchom:

 grunt build

…aby utworzyć folder dystrybucyjny, a następnie:

 grunt buildcontrol:bitbucket

…aby zatwierdzić i przesłać kod do gałęzi build w twoim repozytorium.

Wygeneruj klucz SSH

Masz teraz hostowany kod. Zanim wdrożysz go na swoim Raspberry Pi, musisz wygenerować klucz SSH dla Raspberry Pi i dodać go do swojego konta BitBucket. Szybko przejdziemy przez ten krok, ale jeśli masz jakiekolwiek problemy, postępuj zgodnie z przewodnikiem BitBucket. Zaloguj się ponownie do terminala Raspberry Pi i wygeneruj parę kluczy publiczny/prywatny:

 ssh-keygen

Następnie uruchom agenta:

 ssh-agent /bin/bash

I dodaj klucz do agenta:

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

Teraz wystarczy wyprowadzić zawartość klucza publicznego:

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

…więc możesz go skopiować i wkleić do BitBucket.

W BitBucket kliknij swoje zdjęcie profilowe i przejdź do Zarządzaj kontem . W sekcji BEZPIECZEŃSTWO znajdź klucze SSH i kliknij przycisk Dodaj klucz .

Sklonuj repozytorium

Nie ma konwencji, gdzie umieścić kod swoich aplikacji, ale możesz utworzyć katalog /var/www i umieścić tam wszystkie swoje projekty.

 cd /var sudo mkdir www

Aby uniknąć używania sudo , gdy chcesz umieścić pliki w webroot, możesz zmienić właściciela na swojego użytkownika Pi, a grupę na www-data , z której korzysta Nginx:

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

Teraz możesz sklonować gałąź build swojego repozytorium i zainstalować zależności:

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

Po zakończeniu możesz uruchomić swoją aplikację, ustawiając środowisko na produkcyjne:

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

Teraz skieruj przeglądarkę komputera na adres IP urządzenia, aby sprawdzić, czy działa.

Czy chciałbyś mieć serwer deweloperski, który mógłbyś nazwać własnym? Możesz, z #RaspberryPi.
Ćwierkać

Skonfiguruj Nginx Reverse Proxy

Pozostał jeszcze jeden krok, aby Twoja aplikacja była dostępna z zewnątrz. Chociaż Nginx nasłuchuje na porcie 80, gdzie będzie odbierać żądania HTTP dla twojego Pi, sama aplikacja Node nasłuchuje na innym porcie (na przykład porcie 8080). Dlatego musisz skonfigurować Nginx, aby działał jako zwrotny serwer proxy, rozpoznając żądania przeznaczone dla Twojej aplikacji i przekazując je do Node.

Nginx przechowuje plik konfiguracyjny dla każdej obsługiwanej aplikacji w folderze sites-available :

 cd /etc/nginx/sites-available/

Tutaj możesz skopiować default plik konfiguracyjny i edytować w dogodnym dla siebie miejscu:

 sudo cp default my-app sudo nano my-app

Ostateczny plik konfiguracyjny powinien wyglądać tak, z Nginx działającym jako proxy dla serwera 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 } }

Aby włączyć tę konfigurację, musisz utworzyć dowiązanie symboliczne w folderze sites-enabled , w którym Nginx szuka aktywnych konfiguracji w czasie wykonywania:

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

I ponownie załaduj usługę, aby aktywować te zmiany:

 sudo service nginx reload

W tym momencie Twoja aplikacja jest gotowa do odbierania ruchu HTTP przeznaczonego dla domeny my-app.dev (dzięki dyrektywie server_name my-app.dev skonfigurowanej powyżej). Ostatnim problemem, który musisz rozwiązać, jest to, jak sprawić, by ruch wysyłany z zewnątrz pasował do tej nazwy domeny. Chociaż możesz kupić nazwę domeny i wskazać ją na swój adres IP, plik hosts przychodzi na ratunek i sprawia, że ​​jest to niepotrzebne.

Na stacji roboczej, z której uzyskasz dostęp do witryny, po prostu dodaj zewnętrzny adres IP routera i dopasuj go do nazwy hosta my-app.dev . Wszelki ruch HTTP, który wygenerujesz dla my-app.dev , zostanie następnie wysłany bezpośrednio do routera, z poprawną nazwą Host .

W systemie Windows, z uprawnieniami administratora, możesz edytować plik znajdujący się w c:\windows\system32\drivers\etc\hosts za pomocą notatnika. W systemach Linux i Mac możesz używać terminala odpowiednio z sudo nano /etc/hosts i 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

Co dalej?

Teraz, gdy wszystko jest skonfigurowane, możesz wdrożyć dowolną liczbę aplikacji na swoim Raspberry Pi i zainstalować na zawsze lub pm2, aby utrzymać serwery Node.js przy życiu.

I pamiętaj tylko, że jeśli coś pójdzie nie tak, możesz po prostu wyczyścić kartę SD i zacząć od nowa!

Serwer programistyczny Raspberry Pi w akcji.

Powiązane: Kontroluj swój klimat za pomocą tego samouczka dotyczącego termostatu Raspberry Pi