От излишен хардуер до боен сървър: Защо се лудуваме по self-hosting на Raspberry Pi
Серверът в чекмеджуто ти
Има нещо магично да пускаш истински сайт от хардуер, който струва колкото кафе машина. Облакът като Vercel е супер за повечето проекти, но понякога Raspberry Pi е по-добър избор. Не става дума само за носталгия.
Представи си: имаш Node.js проект с Astro, Svelte Kit или React. Някои библиотеки не работят в serverless – например стара i18n, която е перфектна, но не се компилира статично. Или искаш пълен контрол над изпълнението. Тогава Pi-то ти се превръща в евтина алтернатива на скъпия облак.
Стъпка 1: Свързване към интернет чрез рутера
Първо, отвори портове на рутера си. Така трафикът от публичния IP отива до Pi-то на рафта.
Избери Caddy – лесен reverse proxy, много по-прост от старите. Конфигурацията е такава:
yoursite.com {
root * /home/username/projects/yoursite
file_server
reverse_proxy localhost:4321
}
Промени порта според фреймуърка: Astro е 4321, Svelte Kit – 5173, Node.js обикновено 3000. Презареди Caddy и си готов наполовина.
Стъпка 2: Насочване на домейна към Pi
В панела на регистратора (като NameOcean) добави A запис:
A Record: yoursite.com → your.public.ip.address
Рута ти ще пренасочи трафика. Готово.
Стъпка 3: Създай веднъж, работи вечно
Изгради проекта:
npm run build
Получаваш dist папка с готовия код и входен файл като entry.mjs.
Тук помага PM2 – мениджър, който държи аппа жив завинаги:
npm install -g pm2
cd dist/
pm2 start entry.mjs
Сайтът е онлайн. Не му трябва терминал.
Стъпка 4: Автоматични ъпдейти с GitHub Actions
Да не логваш всеки път по SSH. GitHub Actions прави всичко автоматично.
Създай .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
Сложи IP и пароли в secrets на репото. Скриптът deploy.sh е такъв:
#!/usr/bin/env bash
set -euo pipefail
BASE_DIR="$HOME/projects"
PORTS=(4321 4322)
PORT_INDEX=0
echo "Вкарвам последния код..."
for dir in "$BASE_DIR"/*/ ; do
if [[ -d "$dir/.git" ]]; then
(cd "$dir" && git pull)
fi
done
echo "Компилирам проектите..."
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 "Рестартирам услугите..."
pm2 restart all
Сега всеки git push ъпдейтва, компилира и рестартира автоматично.
Реалният разчет
Не е за всеки. Нямаш резервни копия, CDN или безкраен трафик като в облака. Ако интернетът ти падне, сайтът ти също. Но ако искаш контрол, спестяване и пълна независимост – работи перфектно.
Освен това учиш DNS, reverse proxies, PM2 и CI/CD на практика. Нищо подобно не дава облачният дашборд.
Pi-то в чекмеджуто не е играчка. Това е истинска инфраструктура за production. Не винаги ти трябва корпоративен облак.