От хлама на полке до боевого сервера: почему мы помешаны на self-hosting на Raspberry Pi

От хлама на полке до боевого сервера: почему мы помешаны на self-hosting на Raspberry Pi

Май 07, 2026 self-hosting raspberry-pi node.js devops dns github-actions astro web-infrastructure

Сервер в ящике стола, который работает на ура

Запустить полноценный сайт с железа дешевле, чем кофе-машина из премиум-сегмента, — это чистый кайф. Облака вроде 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 не всегда требует корпоративных гигантов.

Read in other languages:

BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR ES DE DA ZH-HANS EN