Jak hostować aplikację Node.js na Raspberry Pi z DietPi i PM2

5 kwi 2026 7 min

Raspberry Pi to niezwykły sprzęt. Mała płytka za kilkadziesiąt złotych, pobierająca kilka watów, potrafi obsługiwać aplikacje Node.js przez całą dobę bez przerwy. W tym wpisie pokażę jak ustawić taki serwer od zera — od systemu operacyjnego, przez instalację Node.js, aż po autostart aplikacji po restarcie.

Dlaczego DietPi zamiast Raspberry Pi OS?

Raspberry Pi OS to solidny system, ale zawiera mnóstwo rzeczy których nie potrzebujesz na serwerze: środowisko graficzne, Bluetooth, różne demony działające w tle. DietPi to minimalistyczna dystrybucja oparta na Debianie, zoptymalizowana pod kątem wydajności i zużycia pamięci. Po świeżej instalacji zajmuje nieco ponad 100 MB RAM — z Raspberry Pi OS jest to kilka razy więcej.

Co ważne, DietPi ma własne narzędzie dietpi-software — interaktywne menu, w którym jednym kliknięciem instalujesz popularne serwisy. Nie musisz szukać jak poprawnie zainstalować Node.js na ARMv8, nie musisz ręcznie dodawać repozytoriów. Wybierasz z listy, potwierdzasz i gotowe.

Instalacja DietPi

Pobierz obraz DietPi dla swojego modelu z dietpi.com. Dla Raspberry Pi 4/5 wybierz wersję ARMv8. Wgraj obraz na kartę SD przez Raspberry Pi Imager lub balenaEtcher.

Przed pierwszym uruchomieniem możesz skonfigurować kilka rzeczy edytując pliki na karcie SD z poziomu komputera. W pliku dietpi.txt ustaw strefę czasową, język i — co ważne — dane do WiFi jeśli nie używasz kabla Ethernet.

Po pierwszym uruchomieniu DietPi przeprowadza automatyczną konfigurację, aktualizuje pakiety i restartuje się. Następnie uruchamia się interaktywny kreator gdzie ustawiasz hasło roota i użytkownika.

Instalacja Node.js przez dietpi-software

Po zalogowaniu przez SSH wpisz:

dietpi-software

Zobaczysz menu. Przejdź do sekcji Browse Software, wyszukaj Node.js (numer 9). Zaznacz enter, potwierdź instalację i DietPi zajmuje się resztą — pobiera właściwą wersję, konfiguruje PATH, wszystko.

Po instalacji sprawdź:

node --version
npm --version

Wdrożenie aplikacji

Masz dwie wygodne opcje jak dostać kod na Raspberry Pi.

Opcja A — Git pull

Jeśli trzymasz kod na GitHubie lub GitLabie, to najprostsze podejście. Na Raspberry Pi sklonuj repozytorium:

cd /opt
git clone https://github.com/twoj-username/twoja-aplikacja.git
cd twoja-aplikacja
npm install --production

Przy kolejnych aktualizacjach wystarczy:

cd /opt/twoja-aplikacja
git pull
npm install --production
pm2 restart app

Opcja B — rsync

Przydatne gdy nie chcesz trzymać kodu publicznie albo masz aplikację budowaną lokalnie (np. bundlowane frontendy). Z poziomu swojego komputera:

rsync -avz --exclude node_modules --exclude .git \
  ./moja-aplikacja/ \
  pi@192.168.1.100:/opt/moja-aplikacja/

Po skopiowaniu zaloguj się przez SSH i zainstaluj zależności:

ssh pi@192.168.1.100
cd /opt/moja-aplikacja
npm install --production

Opcja --exclude node_modules jest kluczowa — nie kopiujesz setek megabajtów zależności przez sieć, instalujesz je bezpośrednio na malince.

PM2 — process manager który wszystko ogarnia

Node.js domyślnie kończy działanie gdy zamkniesz terminal, lub gdy proces się wysypie. PM2 rozwiązuje oba problemy: pilnuje że proces ciągle działa i restartuje go po awarii. Zainstaluj globalnie:

npm install -g pm2

Uruchom aplikację przez PM2:

pm2 start /opt/moja-aplikacja/index.js --name "moja-app"

Sprawdź status:

pm2 status

Przydatne komendy:

pm2 logs moja-app        # logi w czasie rzeczywistym
pm2 restart moja-app     # restart
pm2 stop moja-app        # zatrzymanie
pm2 delete moja-app      # usunięcie z PM2

Autostart po restarcie systemu

To jest ta magia która sprawia że możesz po prostu odłączyć zasilanie, podłączyć z powrotem i aplikacja sama wróci. Dwa polecenia:

pm2 save
pm2 startup

Komenda pm2 startup wypisze komendę którą musisz wykonać jako root (zaczyna się od sudo env PATH=...). Skopiuj ją i uruchom. Od tej chwili PM2 startuje razem z systemem i przywraca wszystkie zapisane procesy.

Możesz to sprawdzić robiąc sudo reboot i po chwili wchodząc ponownie przez SSH — aplikacja już działa, bez żadnego ręcznego uruchamiania.

Zmienne środowiskowe

Nie trzymaj sekretów w kodzie. PM2 obsługuje pliki ekosystemu gdzie możesz przekazać zmienne środowiskowe:

// ecosystem.config.js
module.exports = {
  apps: [{
    name: 'moja-app',
    script: 'index.js',
    env: {
      NODE_ENV: 'production',
      PORT: 3000,
      DATABASE_URL: 'postgres://...'
    }
  }]
}

Uruchamiasz wtedy przez:

pm2 start ecosystem.config.js
pm2 save

Zużycie zasobów — dane z Grafany

Cały punkt tego podejścia to to że Raspberry Pi 4 z DietPi radzi sobie z lekkimi aplikacjami Node.js bez żadnego wysiłku. Monitorując system podczas działania aplikacji pomocniczej widzimy:

Kilka liczb z tego dashboardu:

  • CPU: 0.5% — cztery rdzenie praktycznie stoją w miejscu
  • RAM: 18.2% z 3.95 GiB — to nieco ponad 730 MB, z czego spora część to bufor systemu plików, nie sam Node.js
  • Load average: ~0.1 przy pułapie 4 (liczba rdzeni) — marginalny

Panel monitoringu w Grafanie — CPU 0.5%, RAM 18.2%, load average bliski zera na Raspberry Pi 4 z DietPi

Podsumowanie

Całe wdrożenie zajmuje może 20 minut. Po kolei:

  1. Wgrywasz DietPi na kartę SD i konfigurujesz podstawowe ustawienia
  2. Przez dietpi-software instalujesz Node.js jednym wyborem z menu
  3. Kopiujesz aplikację przez git pull lub rsync
  4. Uruchamiasz przez PM2 i zapisujesz stan: pm2 save && pm2 startup

Efekt: aplikacja działa 24/7, startuje automatycznie po restarcie, restartuje się sama po awarii, i robi to zużywając ułamek zasobów które ma do dyspozycji. Raspberry Pi 4 za jakieś 250 zł to całkowicie sensowny serwer produkcyjny dla wewnętrznych narzędzi, integracji i hobbistycznych projektów.

~Admin