Гид по технологиям

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

9 min read Личный сайт Обновлено 27 Dec 2025
Личный сайт на Docker: Ghost + Nginx Proxy Manager
Личный сайт на Docker: Ghost + Nginx Proxy Manager

Изометрическая иллюстрация ноутбука рядом с сервером и иконками, связанными с интернетом.

Кратко: за пару контейнеров 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

  1. Купите домен у регистратора с удобной панелью (и предпочтительно с API). Cloudflare — частый выбор, потому что поддерживает API для обновления записей.
  2. Зарегистрируйте субдомен, например blog.example.com.
  3. Разверните 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.

Основные действия:

  1. Запустите контейнер Nginx Proxy Manager и пробросьте порты 80 и 443 на ваш сервер.
  2. В веб‑интерфейсе создайте Proxy Host для каждого сервиса (например, blog.example.com → 192.168.1.6:2368).
  3. На вкладке 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.

Общий план:

  1. Подготовьте Docker Compose с сервисами: ghost, база данных (MySQL/MariaDB или SQLite для тестов), и тома для персистентности.
  2. В Nginx Proxy Manager создайте Proxy Host: домен blog.example.com, схема HTTP, IP Docker-хоста, порт 2368. На вкладке SSL запросите сертификат.
  3. Запустите контейнеры и проверьте, что Ghost доступен по локальному адресу.

Пример шаблона переменных, которые стоит заменить:

  • domain — ваш домен.
  • MYSQL_PASSWORD — сложный пароль для базы.
  • Том для контента Ghost (/var/lib/ghost/content).

Резервные варианты

  • Если не хотите использовать MySQL, Ghost поддерживает SQLite в небольших установках, но она менее устойчива при сбоях.
  • Для масштабирования можно использовать внешнюю базу данных на VPS или управляемую БД.

Практические советы по безопасности и надежности

  • Регулярно делайте бэкапы папки content Ghost — там хранятся посты, изображения и настройки.
  • Ограничьте доступ к Portainer/NPM админке через firewall или VPN.
  • Настройте мониторинг дискового пространства и состояния контейнеров (Prometheus + Grafana или простые скрипты).
  • Используйте сложные пароли и 2FA для учетных записей, где это возможно.

Факторы надежности

  • Электропитание: если сервер важен, подумайте о UPS.
  • Интернет: если у вас периодически пропадает связь — сайт будет недоступен.

Детальная пошаговая методология развертывания (минимальный SOP)

  1. Подготовка сервера: установите Linux, Docker и Docker Compose.
  2. Зарегистрируйте домен и настройте базовую A-запись на текущий IP.
  3. Запустите контейнер DDNS и проверьте, что запись обновляется автоматически.
  4. Разверните Nginx Proxy Manager и проброс портов на роутере.
  5. Подготовьте Docker Compose для Ghost + БД и запустите его.
  6. Создайте прокси-хост в NPM и запросите SSL.
  7. Проверьте внешнюю доступность: открывайте blog.example.com из внешней сети.
  8. Настройте бэкап и мониторинг.

Критерии приёмки

  • Домен возвращает корректный 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 из бэкапа и пересоздать контейнер с теми же переменными среды.

Альтернативные подходы

  1. Статический сайт (Hugo, Jekyll) + GitHub Pages или Netlify — очень дешево и быстро, но без динамических рассылок.
  2. WordPress в контейнере — больше функций и плагинов, но выше сложность и обслуживание.
  3. Хостинг на VPS — если вы не хотите держать железо дома.
  4. Использовать managed Ghost(Pro) — платно, но избавляет от администрирования.

Когда стоит выбрать альтернативу

  • Если вам нужен минимум администрирования — выбирайте managed-услугу.
  • Если вы не хотите пробрасывать порты — выбирайте статический сайт или CDN-сервис с проксированием.

Минимальный список тестов и критериев приёмки

  1. HTTP -> HTTPS редирект работает.
  2. Сертификат действителен и выдан Let’s Encrypt.
  3. Ghost админка доступна и позволяет публиковать посты.
  4. Бэкап контента можно восстановить локально.
  5. При смене публичного 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 --> D

FAQ

Нужно ли использовать 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, который можно скопировать и запустить — напишите, какие у вас требования и я подготовлю файл под ваши параметры.

Интерфейс Portainer с настройкой контейнера Cloudflare DDNS.

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

Начальные шаги запуска Nginx Proxy Manager.

Настройка нового хоста в веб-интерфейсе Nginx Proxy Manager.

Админ-панель Ghost для создания и управления публикациями.

Краткие рекомендации по следующему шагу

  1. Протестируйте запуск Ghost локально с SQLite.
  2. Настройте DDNS и Nginx Proxy Manager.
  3. Переместите базу на MySQL, если будете активно писать.
  4. Настройте ежедневные бэкапы тома content и экспортируйте их вне локальной сети.

Микроблог вместо блога

Если вы не хотите запускать полноценный блог, подумайте о микроблоге в социальных сетях. Он проще в настройке и часто бесплатен: никаких DDNS, обратных прокси или баз данных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство