Jak hostować aplikację Node.js na Raspberry Pi z DietPi i PM2
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

Podsumowanie
Całe wdrożenie zajmuje może 20 minut. Po kolei:
- Wgrywasz DietPi na kartę SD i konfigurujesz podstawowe ustawienia
- Przez
dietpi-softwareinstalujesz Node.js jednym wyborem z menu - Kopiujesz aplikację przez
git pulllubrsync - 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