Как разместить сайт на Raspberry Pi

К чему готовиться
- Минимальные требования: Raspberry Pi (любая модель кроме Zero подходит для небольшого сайта). Для лучшей производительности — Pi 4.
- ОС: Raspberry Pi OS (32‑bit или 64‑bit, в зависимости от образа Docker/контейнеров).
- Сеть: стабильный интернет и доступ к настройкам роутера (перенаправление портов).
- Домен: регистратор с поддержкой API или динамического DNS (например, Cloudflare).
Обзор архитектуры (что куда идёт)
- Docker на Raspberry Pi — контейнеры запускают все сервисы.
- Nginx Proxy Manager — публичный прокси и менеджер SSL (порт 80/443 снаружи перенаправляются на него).
- ddclient — обновляет DNS-запись домена при смене внешнего IP.
- Ghost — CMS/блог на Node.js; использует базу данных MySQL/MariaDB.
- Резервное копирование и мониторинг — рекомендовано Uptime‑Kuma и регулярные бекапы БД и файлов.
Почему не нужен самый новый Pi
Вы можете начать с Pi 3B или Pi 4. Pi 3B вполне запустит Ghost и MySQL для небольшой аудитории; Pi 4 ускорит старт контейнеров и поднимет отклик при нагрузке. Если ожидаете тысячи одновременных пользователей — стоит рассмотреть более мощный сервер или виртуальную машину в дата‑центре.
Важно: Raspberry Pi Zero лучше не использовать для публичного сайта, он ограничен по сети и памяти.

Шаг 1 — Подготовьте Raspberry Pi и ОС
- Скачайте и установите Raspberry Pi OS (рекомендую 64‑bit, если планируете работать с современными контейнерами).
- Обновите систему:
sudo apt update && sudo apt upgrade -y
sudo reboot- Настройте статический локальный IP для Pi в настройках роутера или через
dhcpcd.conf— это упростит маршрутизацию и управление портами.
Шаг 2 — Установка Docker и Docker Compose
Docker — основа вашей платформы. Установите официальным способом для Debian/Raspberry Pi OS.
# Установка Docker (официальный скрипт)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# Добавьте пользователя в группу docker
sudo usermod -aG docker $USER
# Выйдите и войдите снова или перезагрузитеУстановите docker-compose-plugin или docker-compose v2 (в новых системах docker compose как плагин доступен):
sudo apt install -y docker-compose-plugin
# Или если нужен бинарный docker-compose v1:
# sudo apt install -y docker-composeСовет: включите таймзону и синхронизацию времени (ntp), это важно для SSL и логов.
Шаг 3 — Рекомендуемое ПО для управления контейнерами
- Portainer — удобный веб‑интерфейс для управления Docker. Полезно при отладке.
- Альтернатива: чистый
docker composeиз командной строки.
Пример быстрого запуска Portainer:
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latestШаг 4 — Регистрация домена и Dynamic DNS
Выберите регистратор, поддерживающий API. Я использую Cloudflare из‑за их гибкой зоны DNS и бесплатного функционала.
- Зарегистрируйте домен или используйте существующий.
- Настройте учетные данные API: в Cloudflare — создайте API token с правами редактирования DNS для нужной зоны.
- Для автоматизации DNS используйте
ddclient(есть контейнер) или другое решение, поддерживаемое вашим регистратором.
Пример минимальной конфигурации ddclient.conf (адаптируйте под ваш провайдер и токен):
protocol=cloudflare
ssl=yes
zone=example.com
ttl=1
use=web, web=checkip.dyndns.com/
server=api.cloudflare.com
login=your-email@example.com
password='API_TOKEN'
example.com
@, www, blogzone— ваш домен.password— API Token.- Укажите записи, которые хотите обновлять (
@— корень,www,blogи т.д.).
В Docker Compose вы добавите контейнер ddclient с монтированием файла ddclient.conf.
Шаг 5 — Docker Compose: шаблон для стека
Ниже — упрощённый пример docker-compose.yml, который разворачивает Nginx Proxy Manager, ddclient, Ghost и MySQL. Перед запуском замените пароли, переменные окружения и пути.
version: '3.7'
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
restart: unless-stopped
ports:
- 8080:80 # web UI
- 4443:443 # SSL
environment:
DB_MYSQL_HOST: db
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: npm
DB_MYSQL_PASSWORD: npm_password
volumes:
- ./nginx/data:/data
- ./nginx/letsencrypt:/etc/letsencrypt
ddclient:
image: linuxserver/ddclient
restart: unless-stopped
volumes:
- ./ddclient/ddclient.conf:/config/ddclient.conf
ghost-db:
image: mariadb:10.6
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost_db_password
volumes:
- ./mysql:/var/lib/mysql
ghost-server:
image: ghost:latest
restart: unless-stopped
environment:
url: https://yourdomain.com
database__client: mysql
database__connection__host: ghost-db
database__connection__user: ghost
database__connection__password: ghost_db_password
database__connection__database: ghost
volumes:
- ./ghost/content:/var/lib/ghost/content
depends_on:
- ghost-db
networks:
default:
driver: bridgeКлючевые шаги перед запуском:
- Замените
yourdomain.comвghost-server.environment.url. - Выберите и сгенерируйте устойчивые пароли для MySQL и NPM.
- Подумайте о размещении томов на отдельном диске или USB‑накопителе для долговечности.
Шаг 6 — Настройка Nginx Proxy Manager
- Откройте веб‑интерфейс Nginx Proxy Manager (по умолчанию порт 8080 на хосте).
- Создайте Proxy Host для домена:
- Domain Names: yourdomain.com
- Scheme: http
- Forward Hostname / IP: локальный IP вашего Pi
- Forward Port: 2368 (по умолчанию Ghost)
- На вкладке SSL запросите сертификат Let’s Encrypt (введите email).
- Включите опции HSTS и редирект HTTP→HTTPS по необходимости.
Шаг 7 — Порт‑форвардинг на роутере
Чтобы сайт был доступен из интернета, настройте проброс портов на роутере:
- Внешний порт 80 → внутренний порт 8080 (IP Raspberry Pi).
- Внешний порт 443 → внутренний порт 4443 (IP Raspberry Pi).
Если ваш провайдер блокирует порт 80/443 — обсудите с ним варианты, используйте Cloudflare Spectrum (платно) или альтернативные порты + прокси.
Совет: вместо проброса 80/443 можно использовать Cloudflare в «reverse proxy» режиме и скрыть реальный IP сервера — это повышает безопасность.
Шаг 8 — Запуск и проверка
- Запустите стек:
docker compose up -d- Проверьте логи:
docker compose logs -f nginx-proxy-manager
docker compose logs -f ghost-server
docker compose logs -f ghost-db- Подождите: первые запуски MySQL и Ghost могут занять 10–20 минут на слабом Pi.
- Проверяйте доступность сайта локально и извне.
Отладка: типичные проблемы и решения
- Ghost не запускается: проверьте логи контейнера и убедитесь, что БД доступна и пароли совпадают.
- SSL не выдаётся: убедитесь в корректном пробросе портов 80/443 и что Cloudflare (если включён) не скрывает нужных заголовков.
- DDNS не обновляет запись: проверьте
ddclient.conf, токен Cloudflare и логи контейнера ddclient.
Безопасность и надёжность
- Обновления: регулярно обновляйте ОС и контейнеры.
- Резервное копирование: делайте бекапы папки
ghost/contentи дампа базы данных (mysqldump). - Фаервол: настройте
ufwили iptables, откройте только нужные порты. - Защита доступа: смените дефолтные порты интерфейсов управления и установите сложные пароли.
Пример базовой настройки ufw:
sudo apt install ufw
sudo ufw allow from 192.168.0.0/24 to any port 22 proto tcp
sudo ufw allow 8080/tcp
sudo ufw allow 4443/tcp
sudo ufw enableРезервные копии: простая методика
- Дамп базы данных раз в день:
docker exec -t ghost-db mysqldump -u root -p'your_root_password' ghost > ghost_db_backup_$(date +%F).sql- Архив контента Ghost:
tar -czvf ghost_content_backup_$(date +%F).tar.gz ./ghost/content- Переносите архивы на удалённое хранилище (S3, rsync на другой сервер или внешний диск).
Мониторинг
- Uptime‑Kuma: лёгкий мониторинг статуса сайта, уведомления (Telegram/Email).
- Локальные логи: храните и анализируйте логи Docker/NGINX при помощи ротации логов.
Альтернативные подходы
- Статический сайт + SSG (Hugo, Jekyll) с Caddy: если у вас блог без динамики, статический сайт проще и легче по ресурсам.
- WordPress: если нужен каталог плагинов и e‑commerce, но WordPress требует больше ресурсов и обслуживания.
- Хостинг у провайдера: если требуется высокая доступность и масштабируемость, иногда VPS или managed‑хостинг дешевле по времени и надежнее.
Когда это не сработает (ограничения и риски)
- Если у вас нестабильный или часто меняющийся внешний IP и регистратор не поддерживает DDNS.
- Если трафик большой, Pi может не справиться — потребуется миграция на VPS/облачную платформу.
- Если провайдер блокирует порты или запрещает публичные серверы — потребуется обходное решение или аренда VPS.
Миграция с общего хостинга на Pi: советы
- Экспортируйте контент (экспорт Ghost) и базу данных.
- Проверьте версии Ghost и MariaDB (совместимость).
- Тестируйте локально на Pi перед перенаправлением DNS.
Критерии приёмки
- Сайт доступен по HTTPS извне.
- Let’s Encrypt выдал валидный сертификат.
- Ghost подключён к рабочей базе данных, контент отображается корректно.
- Автообновление DNS работает при смене IP (ddclient лог показывает успешное обновление).
- Резервные копии БД и контента выполняются и проверены.
Контрольный список перед запуском
- Зарегистрирован домен и создан API token.
- Raspberry Pi настроен с статическим локальным IP.
- Docker и docker compose установлены.
- Docker Compose файл настроен (пароли/URL).
- Nginx Proxy Manager настроен, SSL получен.
- Порт‑форвардинг настроен на роутере.
- Настроены бекапы и мониторинг.
Короткая проверка при проблемах (runbook)
- Проверить статус контейнеров:
docker compose ps. - Посмотреть логи проблемного контейнера:
docker compose logs -f - Проверить доступность порта:
curl -I http://localhost:2368 - Проверить DNS:
dig yourdomain.com +shortи сравнить с внешним IP. - Проверить ddclient: логи и конфигурацию.
Примеры конфигураций для безопасности
- Отключите root SSH‑вход и используйте ключи SSH.
- Используйте fail2ban для защиты интерфейсов админки.
Короткая галерея крайних случаев
- При частых сбоях SD-карты — используйте SSD по USB3 (для Pi 4) или регулярную замену и резервные копии.
- Если провайдер не даёт публичный IPv4 — используйте IPv6 или туннелирование (например, cloudflare туннель).

Полезные команды и сниппеты (cheat sheet)
- Запуск стека:
docker compose up -d - Остановка:
docker compose down - Просмотр логов:
docker compose logs -f - Дамп БД:
docker exec -t ghost-db mysqldump -u root -p'password' ghost > backup.sql
Заключение
Размещение сайта на Raspberry Pi — отличный способ сохранить контроль над инфраструктурой, научиться управлять сервисами и сэкономить на хостинге. Для небольших проектов такая платформа даёт гибкость и достаточную производительность. Следуйте шагам: подготовьте Pi и Docker, настройте DDNS, разверните Nginx Proxy Manager и Ghost, обеспечьте безопасность и резервы.
Итоговые рекомендации:
- Начните с небольшой нагрузки и тестовой аудитории;
- Автоматизируйте бэкапы с первого дня;
- Планируйте масштабирование на VPS, если трафик вырастет.
Дополнительно: рассмотрите установку Uptime‑Kuma для мониторинга доступности и оповещений.
Сводка: если вы выполнили все шаги этой инструкции, ваш сайт на Ghost должен быть доступен по HTTPS, DNS автоматически обновляться, а сервисы — управляться через Docker. Удачи в запуске!
Похожие материалы
Как компилировать и устанавливать пакеты из исходников
Установка QEMU/KVM на Ubuntu
Восстановление удалённых файлов в Teams
Как отформатировать USB в exFAT для Windows и Mac
Как пользоваться Hide My Email на iPhone и iPad