Как быстро развернуть личный сайт на Docker с Nginx Proxy Manager и Ghost

Кратко: за пару контейнеров Docker — DDNS для обновления A-записи, Nginx Proxy Manager для маршрутизации и SSL, и Ghost как движок блога — вы получите живой личный сайт, хранящийся на домашнем сервере. Ниже — пошаговый план, проверки, сценарии отказа и готовые чек-листы.
Что это и зачем
Этот материал описывает практический путь запуска личного сайта (блога) на инфраструктуре из домашних ресурсов. Основная идея: использовать Docker-контейнеры для всех компонентов, DDNS для синхронизации вашего публичного IP с доменом, Nginx Proxy Manager как обратный прокси и Let’s Encrypt для автоматических SSL-сертификатов, и Ghost как простую платформу для публикаций.
Определения в одну строку:
- DDNS — служба, которая обновляет DNS-запись домена при изменении вашего публичного IP.
- Обратный прокси — компонент, который принимает внешние запросы и перенаправляет их на нужный внутренний сервис.
- Ghost — простая платформа для блогов, ориентированная на Markdown и рассылки.
Важно: этот подход подходит, если вы контролируете домашний роутер и понимаете базовые сетевые настройки.
Почему именно такой стек
Преимущества такого набора:
- Экономия: отсутствие платной хостинг-подписки. Вы платите только за электроэнергию и интернет.
- Контроль: весь контент и настройки у вас дома.
- Модульность: можно добавлять сервисы через Nginx Proxy Manager без изменения сети.
Ограничения и риски:
- Домашний интернет может давать меняющийся IP (решается DDNS).
- Нагрузка сервера и доступность зависят от вашей железки и провайдера.
- Безопасность: требуется базовая настройка брандмауэра и резервного копирования.
Необходимое оборудование и ПО
- Домашний сервер: Raspberry Pi (4+), NUC, старый ноутбук или десктоп. Должен запускать современную ОС (рекомендуется Linux).
- Домен с поддержкой управления DNS через API (Cloudflare рекомендуем, но подойдут и другие).
- Роутер с возможностью проброса портов 80 и 443 на ваш сервер.
- Docker и Docker Compose (или веб‑GUI вроде Portainer).
- Пакет Docker-контейнеров: DDNS-клиент для выбранного DNS-провайдера, Nginx Proxy Manager, Ghost и БД (если Ghost использует MySQL/MariaDB).
Совет: бережно выбирайте хранилище для данных Ghost (volume), чтобы не потерять посты при обновлениях.
Шаг 1 — подготовка домена и DDNS
- Купите домен у регистратора с удобной панелью (и предпочтительно с API). Cloudflare — частый выбор, потому что поддерживает API для обновления записей.
- Зарегистрируйте субдомен, например blog.example.com.
- Разверните Docker-контейнер DDNS, который будет периодически обновлять A-запись вашего субдомена на текущий публичный IP.
Требуемые параметры для контейнера DDNS:
- API-ключ провайдера с правами редактирования DNS для нужного домена.
- Сам домен и список субдоменов для обновления.
- Интервал проверок (по умолчанию 5–15 минут).
Если вы хотите ускорить первый запуск, найдите текущий публичный IP на сервисе вроде WhatIsMyIP и временно прописывайте его в A-записи вручную.
Важно
Не храните API-ключи в общедоступных репозиториях. Используйте .env или секреты Docker/Portainer.
Шаг 2 — разворачиваем Nginx Proxy Manager
Nginx Proxy Manager (NPM) — это удобный веб-интерфейс для настройки обратного прокси на базе Nginx. Он упрощает маршрутизацию и автоматизирует выпуск сертификатов Let’s Encrypt.
Основные действия:
- Запустите контейнер Nginx Proxy Manager и пробросьте порты 80 и 443 на ваш сервер.
- В веб‑интерфейсе создайте Proxy Host для каждого сервиса (например, blog.example.com → 192.168.1.6:2368).
- На вкладке SSL запросите новый сертификат Let’s Encrypt, укажите email, и NPM автоматически настроит HTTPS.
Настройки в интерфейсе, которые обычно включаю:
- Cache Assets — кеширование статических ресурсов.
- Block Common Exploits — базовая защита от известных эксплойтов.
- Websockets Support — если приложение использует WebSocket (Ghost использует realtime-подписки для админки).
Сетевые требования
- На маршрутизаторе настройте переадресацию портов 80 и 443 на IP сервера, где запущен NPM.
- Если ваш провайдер блокирует порт 80/443, рассмотрите варианты: 1) использовать туннелирование (Cloudflare Tunnel), 2) менять поставщика интернета.
Когда это может не сработать
- Если провайдер применяет CGNAT (Carrier-Grade NAT), у вас может не быть публичного IPv4, и прямой проброс портов станет невозможен. В этом случае используйте обратные туннели (ngrok, Cloudflare Tunnel) или платный VPS как «прыжковый хост».
Шаг 3 — разворачиваем Ghost в Docker
Ghost — это Node.js-приложение, часто разворачивается с использованием Docker Compose. Ghost обычно слушает порт 2368.
Общий план:
- Подготовьте Docker Compose с сервисами: ghost, база данных (MySQL/MariaDB или SQLite для тестов), и тома для персистентности.
- В Nginx Proxy Manager создайте Proxy Host: домен blog.example.com, схема HTTP, IP Docker-хоста, порт 2368. На вкладке SSL запросите сертификат.
- Запустите контейнеры и проверьте, что Ghost доступен по локальному адресу.
Пример шаблона переменных, которые стоит заменить:
- domain — ваш домен.
- MYSQL_PASSWORD — сложный пароль для базы.
- Том для контента Ghost (/var/lib/ghost/content).
Резервные варианты
- Если не хотите использовать MySQL, Ghost поддерживает SQLite в небольших установках, но она менее устойчива при сбоях.
- Для масштабирования можно использовать внешнюю базу данных на VPS или управляемую БД.
Практические советы по безопасности и надежности
- Регулярно делайте бэкапы папки content Ghost — там хранятся посты, изображения и настройки.
- Ограничьте доступ к Portainer/NPM админке через firewall или VPN.
- Настройте мониторинг дискового пространства и состояния контейнеров (Prometheus + Grafana или простые скрипты).
- Используйте сложные пароли и 2FA для учетных записей, где это возможно.
Факторы надежности
- Электропитание: если сервер важен, подумайте о UPS.
- Интернет: если у вас периодически пропадает связь — сайт будет недоступен.
Детальная пошаговая методология развертывания (минимальный SOP)
- Подготовка сервера: установите Linux, Docker и Docker Compose.
- Зарегистрируйте домен и настройте базовую A-запись на текущий IP.
- Запустите контейнер DDNS и проверьте, что запись обновляется автоматически.
- Разверните Nginx Proxy Manager и проброс портов на роутере.
- Подготовьте Docker Compose для Ghost + БД и запустите его.
- Создайте прокси-хост в NPM и запросите SSL.
- Проверьте внешнюю доступность: открывайте blog.example.com из внешней сети.
- Настройте бэкап и мониторинг.
Критерии приёмки
- Домен возвращает корректный HTTPS и указывает на ваш сайт.
- Ghost доступен извне через указанный домен.
- Автоматические обновления DDNS работают (A-запись обновляется при смене IP).
- Резервная копия контента успешно создается по расписанию.
Чек-листы по ролям
Владелец сайта (non‑tech):
- Зарегистрировать домен.
- Сохранить доступ к панели DNS и API-ключ.
- Прописать базовый контент и протестировать публикацию.
Инженер/DevOps:
- Настроить Docker и Docker Compose.
- Развернуть DDNS, Nginx Proxy Manager и Ghost.
- Настроить проброс портов и брандмауэр.
- Настроить бэкап и мониторинг.
Сетевой администратор:
- Проверить, не использует ли провайдер CGNAT.
- Настроить NAT/PAT на роутере (ports 80, 443).
- Включить логирование попыток доступа.
Сценарии отказа и способы отката
Сценарий: сертификат Let’s Encrypt не получается получить
- Проверьте, что порт 80 открыт и проксирование работает.
- Убедитесь, что DNS для домена указывает на ваш публичный IP.
- Решение отката: временно отключите HTTPS в NPM и проверьте доступ по HTTP.
Сценарий: провайдер использует CGNAT
- Решение: использовать внешний VPS как точку пересылки или настроить Cloudflare Tunnel / ngrok.
Сценарий: потеря контейнера Ghost после обновления
- Откат: восстановить том content из бэкапа и пересоздать контейнер с теми же переменными среды.
Альтернативные подходы
- Статический сайт (Hugo, Jekyll) + GitHub Pages или Netlify — очень дешево и быстро, но без динамических рассылок.
- WordPress в контейнере — больше функций и плагинов, но выше сложность и обслуживание.
- Хостинг на VPS — если вы не хотите держать железо дома.
- Использовать managed Ghost(Pro) — платно, но избавляет от администрирования.
Когда стоит выбрать альтернативу
- Если вам нужен минимум администрирования — выбирайте managed-услугу.
- Если вы не хотите пробрасывать порты — выбирайте статический сайт или CDN-сервис с проксированием.
Минимальный список тестов и критериев приёмки
- HTTP -> HTTPS редирект работает.
- Сертификат действителен и выдан Let’s Encrypt.
- Ghost админка доступна и позволяет публиковать посты.
- Бэкап контента можно восстановить локально.
- При смене публичного IP A-запись обновляется в течение интервала DDNS.
Примеры команд и шаблонов
Docker Compose — пример (схема):
version: '3.7'
services:
ghost:
image: ghost:5
restart: unless-stopped
ports:
- "2368:2368"
environment:
url: https://blog.example.com
volumes:
- ./ghost-content:/var/lib/ghost/content
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: example-root-pass
MYSQL_DATABASE: ghost
MYSQL_USER: ghost
MYSQL_PASSWORD: example-pass
volumes:
- ./mysql-data:/var/lib/mysqlЗамените значения на свои и храните секреты вне репозитория.
Примеры ошибок и отладка
Проблема: Nginx Proxy Manager выдаёт 502 Bad Gateway
- Проверьте, что целевой контейнер работает и слушает ожидаемый порт.
- Убедитесь, что IP и порт в конфигурации прокси совпадают с настройками контейнера.
Проблема: сайт доступен локально, но не извне
- Проверьте проброс портов на роутере.
- Убедитесь, что DDNS показывает текущий публичный IP вашего роутера.
Ментальные модели и эвристики
- Разделяй ответственность: каждый контейнер выполняет одну роль (DDNS, прокси, приложение).
- Малые итерации: сначала работоспособность по HTTP, затем включайте HTTPS.
- Автоматизируй рутинные задачи: бэкапы, обновления, мониторинг.
Мини-факты по ключевым числам
- Стандартный порт Ghost: 2368.
- Порты для внешнего доступа: 80 (HTTP) и 443 (HTTPS).
- Рекомендуемый интервал обновления DDNS: 5–15 минут.
Потенциальные улучшения и путь развития
- Добавить автоматические обновления контейнеров (watchtower).
- Перенести статику на CDN и уменьшить нагрузку на домашний сервер.
- Добавить CI/CD для контента и шаблонов.
Mermaid: решение выбора (туннель vs проброс портов)
flowchart TD
A[Есть публичный IPv4?] -->|Да| B[Проброс портов 80/443]
A -->|Нет или CGNAT| C[Cloudflare Tunnel / ngrok / VPS]
B --> D[Запуск Nginx Proxy Manager и получение Let's Encrypt]
C --> E[Подключение Tunnel, настройка проксирования]
E --> DFAQ
Нужно ли использовать MySQL с Ghost?
Нет. Ghost может работать и на SQLite для небольших личных сайтов, но MySQL/MariaDB более надёжны для постоянной работы и резервного копирования.
Что если провайдер блокирует 80 и 443?
Варианты: используйте туннели (Cloudflare Tunnel, ngrok) или размещайте прокси на VPS.
Как часто нужно бэкапить контент?
Рекомендуется бэкапить контент ежедневно или при каждом новом посте — в зависимости от объёма публикаций.
Заключение
Развернуть личный блог на Docker с Nginx Proxy Manager и Ghost — это практичный путь получить полный контроль над сайтом без постоянных платежей за хостинг. Потребуются базовые навыки сетевого администрирования и понимание Docker. Преимущества: гибкость, модульность и простота обслуживания. Ограничения: зависимость от домашнего интернета и необходимость заботиться о безопасности.
Важно
Поддерживайте регулярные бэкапы и следите за обновлениями контейнеров. Если ваш сайт важен для бизнеса, рассмотрите гибридное решение с внешним VPS или managed-услугами.
Краткая сводка
- Разверните DDNS → Nginx Proxy Manager → Ghost.
- Настройте проброс портов и SSL через Let’s Encrypt в NPM.
- Обеспечьте бэкапы и мониторинг.
Если вам нужна адаптированная инструкция под конкретную железку (Raspberry Pi, NUC или VPS), или готовый Docker Compose, который можно скопировать и запустить — напишите, какие у вас требования и я подготовлю файл под ваши параметры.

Авторские изображения и скриншоты показывают примеры интерфейсов Nginx Proxy Manager и Ghost.



Краткие рекомендации по следующему шагу
- Протестируйте запуск Ghost локально с SQLite.
- Настройте DDNS и Nginx Proxy Manager.
- Переместите базу на MySQL, если будете активно писать.
- Настройте ежедневные бэкапы тома content и экспортируйте их вне локальной сети.
Микроблог вместо блога
Если вы не хотите запускать полноценный блог, подумайте о микроблоге в социальных сетях. Он проще в настройке и часто бесплатен: никаких DDNS, обратных прокси или баз данных.
Похожие материалы
RDP: полный гид по настройке и безопасности
Android как клавиатура и трекпад для Windows
Советы и приёмы для работы с PDF
Calibration в Lightroom Classic: как и когда использовать
Отключить Siri Suggestions на iPhone