От хлама на полке до боевого сервера: почему мы помешаны на self-hosting на Raspberry Pi
Сервер в ящике стола, который работает на ура
Запустить полноценный сайт с железа дешевле, чем кофе-машина из премиум-сегмента, — это чистый кайф. Облака вроде Vercel берут на себя рутину для большинства задач, но иногда self-hosting на Raspberry Pi выходит выгоднее. И не только из-за любви к ретро.
Представьте: у вас Node.js-фреймворк вроде Astro, Svelte Kit или React с зависимостями, которые serverless не жалуют. Старая библиотека i18n работает идеально, но не пакуется в статику. Или нужен точный контроль над runtime. 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-запись в DNS:
A Record: yoursite.com → your.public.ip.address
Роутер сам перенаправит трафик на Pi. Готово.
Шаг 3: Собираем раз — запускаем навсегда
Стандартная сборка:
npm run build
Получите папку dist с готовым приложением и входной точкой вроде entry.cjs или entry.mjs.
Здесь на сцену выходит PM2 — менеджер процессов для Node.js, который держит всё в работе без остановок:
npm install -g pm2
cd dist/
pm2 start entry.mjs
Сайт онлайн. Не зависит от терминала или консоли.
Шаг 4: Деплои на автопилоте через GitHub Actions
Self-hosting без автоматизации — мучение с 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
В secrets репозитория — IP и учётку Pi. Плюс скрипт деплоя:
#!/usr/bin/env bash
set -euo pipefail
BASE_DIR="$HOME/projects"
PORTS=(4321 4322)
PORT_INDEX=0
echo "Pulling latest code..."
for dir in "$BASE_DIR"/*/ ; do
if [[ -d "$dir/.git" ]]; then
(cd "$dir" && git pull)
fi
done
echo "Building projects..."
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) % PORT_COUNT ))
fi
done
echo "Restarting services..."
pm2 restart all
Теперь каждый git push — и Pi сам тянет код, собирает, перезапускает. Без рук.
Честный расчёт
Pi не для всех. Нет резерва, глобального CDN, трафик ограничен. Интернет упал — сайт offline. Но если вы готовы обменять удобство на контроль, копейки и владение стеком целиком — вариант рабочий.
Ещё и учит: разберётесь в DNS, reverse proxy, PM2 и CI/CD глубже, чем кнопки в облаке. Ваш Raspberry Pi — не игрушка, а настоящий сервер. Доказательство, что production не всегда требует корпоративных гигантов.