Od złomu w szufladzie do serwera na full gazie: Dlaczego szalejemy na self-hostingu na Raspberry Pi
Raspberry Pi jako serwer pod ręką
Uruchomienie prawdziwej strony WWW na sprzęcie tańszym niż dobra kawiarka? To możliwe i daje frajdę. Chmury jak Vercel ułatwiają życie większości projektów, ale czasem własny hosting na Raspberry Pi wygrywa. Zwłaszcza gdy masz powody, które idą poza sentyment.
Wyobraź sobie: budujesz stronę na Astro, Svelte Kit czy React z Node.js. A tu nagle jakaś stara biblioteka do tłumaczeń blokuje serverless – nie da się jej spakować na statycznie. Albo chcesz pełną kontrolę nad serwerem w locie. Twój Pi z szuflady staje się realną opcją zamiast drogich usług w chmurze.
Krok 1: Routing sieciowy – otwórz drzwi do świata
Najpierw router. Skonfiguruj przekierowanie portów, by publiczny IP łączył się z Pi na półce.
Weź Caddy – prosty reverse proxy, o niebo lepszy od starych narzędzi. Konfiguracja wygląda tak:
yoursite.com {
root * /home/username/projects/yoursite
file_server
reverse_proxy localhost:4321
}
Port dobierz do frameworka: Astro lubi 4321, Svelte Kit 5173, a Node.js często 3000. Odśwież Caddy i masz połowę roboty za sobą.
Krok 2: Podłącz domenę do Pi
W panelu rejestratora jak NameOcean dodaj rekord DNS A:
A Record: yoursite.com → your.public.ip.address
Gotowe. Router zrobi resztę – ruch z domeny poleci prosto na Pi.
Krok 3: Zbuduj raz, uruchom na zawsze
Zrób build projektu:
npm run build
Powstanie folder dist z gotową apką i punktem wejścia, np. entry.mjs.
Tu wkracza PM2 – menedżer procesów, który trzyma Node.js w ruchu non-stop:
npm install -g pm2
cd dist/
pm2 start entry.mjs
Strona działa. Bez wiszącego terminala czy konsoli.
Krok 4: Automatyzacja z GitHub Actions
Bez łatwych aktualizacji self-hosting to mordęga. GitHub Actions zmienia to w bajkę.
Stwórz plik .github/workflows/deploy.yml:
name: Deploy to Raspberry Pi
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy via SSH
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.PI_HOST }}
username: ${{ secrets.PI_USER }}
password: ${{ secrets.PI_PASSWORD }}
script: |
~/bin/deploy.sh
W secrets repo wrzuć IP Pi i dane logowania. Potem skrypt deploy.sh, który ogarnia całość:
#!/usr/bin/env bash
set -euo pipefail
BASE_DIR="$HOME/projects"
PORTS=(4321 4322)
PORT_INDEX=0
echo "Pobieram nowy kod..."
for dir in "$BASE_DIR"/*/ ; do
if [[ -d "$dir/.git" ]]; then
(cd "$dir" && git pull)
fi
done
echo "Buduję projekty..."
for dir in "$BASE_DIR"/*/ ; do
if [[ -f "$dir/package.json" ]]; then
CURRENT_PORT=${PORTS[$PORT_INDEX]}
(
cd "$dir"
npm run build -- --port "$CURRENT_PORT"
)
PORT_INDEX=$(( (PORT_INDEX + 1) % ${#PORTS[@]} ))
fi
done
echo "Restartuję serwisy..."
pm2 restart all
Teraz każdy git push ściąga kod, buduje i restartuje – bez dotykania Pi.
Rachunek zysków i strat
Pi nie jest dla wszystkich. Brak redundancji, globalnego CDN, prądu z netem. Pasmo ograniczone, awaria netu = strona w dół. Ale jeśli cenisz kontrolę, oszczędności i pełną władzę nad stackiem – to działa.
Do tego uczysz się DNS, reverse proxy, PM2 i CI/CD na serio. Nie z paneli chmurowych.
Twój stary Raspberry Pi to nie zabawka. To prawdziwa infrastruktura. Dowód, że produkcja nie zawsze wymaga korpo-gigantów.