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

Как самостоятельно хостить Ghost на Linux

8 min read Самохостинг Обновлено 23 Nov 2025
Как самостоятельно хостить Ghost на Linux
Как самостоятельно хостить Ghost на Linux

Оглавление

  • Почему стоит самостоятельно хостить Ghost
  • Установка Ghost на сервер
  • Настройка SMTP через Gmail
  • Сборка Docker-контейнера Ghost
  • Настройка обратного прокси (Nginx)
  • Включение SSL (certbot)
  • Запуск Ghost локально и доступ через Tailscale
  • Первичная настройка Ghost и первые действия
  • Советы по безопасности и эксплуатации
  • Чек-листы для ролей
  • План восстановления и отладки
  • Часто задаваемые вопросы
  • Ключевые выводы

Почему стоит самостоятельно хостить Ghost

Ghost — это открытая CMS, ориентированная на блогинг и рассылки. Самохостинг даёт контроль над данными, гибкость в настройке и возможность интеграции с любыми внешними сервисами. Преимущества:

  • Полный контроль над содержимым и метаданными.
  • Возможность использовать собственную инфраструктуру и бэкапы.
  • Гибкость в интеграциях (SMTP, аналитика, CDN).

Важно: самохостинг требует ответственности за аптайм, безопасность и резервные копии.

Панель управления Ghost с метриками и публикациями.

Требования и подготовка

Коротко о требованиях:

  • Linux-сервер (Ubuntu/Debian похожие), доступ по SSH.
  • Доменное имя для публичного доступа (опционально для локальной работы).
  • Права sudo на сервере.
  • Docker и Docker Compose (плагин) или Docker Engine.
  • Учетная запись Gmail с включёнными Application Passwords, если планируете использовать Gmail SMTP.

Совет: если не хотите управлять сервером, рассмотрите Ghost(Pro) как альтернативу.

Установка Ghost на сервер

Ниже — проверенные команды для установки Docker и подготовки окружения на Ubuntu/Debian. Исполняйте их по очереди от пользователя с sudo.

  1. Установите каталог для ключей APT и добавьте ключ Docker:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
  1. Создайте файл репозитория Docker:
sudo nano /etc/apt/sources.list.d/docker.list

Вставьте строку (пример для Ubuntu Jammy):

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu jammy stable
  1. Обновите списки пакетов и обновите систему:
sudo apt update && sudo apt upgrade -y
  1. Установите Docker и необходимые плагины:
sudo apt install -y wget docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-buildx-plugin
  1. Добавьте текущего пользователя в группу docker (чтобы запускать docker без sudo):
sudo usermod -aG docker $USER

Примечание: выйдите из сеанса и войдите снова, чтобы изменение группы вступило в силу.

  1. Включите автозапуск Docker и перезагрузите сервер:
sudo systemctl enable docker.service
sudo reboot

После перезагрузки продолжайте далее.

Настройка Gmail для SMTP доставки

Ghost не включает почтовый агент, поэтому нужно подключить внешний SMTP. Ниже — инструкция для Gmail с использованием App Passwords.

  1. Войдите в Gmail, перейдите в «Управление аккаунтом Google», вкладка «Безопасность».
  2. Включите «Двухэтапную проверку» (2-Step Verification) и подтвердите номер телефона.

Процесс включения двухэтапной проверки в Google Account.

  1. В разделе безопасности откройте «Пароли приложений» (App passwords).
  2. Выберите «Почта» и «Другое», введите название (например, “Gmail for Ghost”) и нажмите «Создать».

Окно с созданным паролем приложения для Gmail.

  1. Сохраните сгенерированный пароль — он будет показан один раз. Вы будете использовать его как MAIL_PASSWORD.

Важно: можно использовать и другие SMTP-провайдеры (SendGrid, Mailgun, Amazon SES) — они часто лучше подходят для массовых рассылок.

Сборка Docker-контейнера Ghost

  1. Создайте директорию для проекта и перейдите в неё:
mkdir -p ~/ghost
cd ~/ghost
  1. Создайте docker-compose.yml:
sudo nano ./docker-compose.yml

Вставьте следующий пример конфигурации. Он запускает Ghost и MariaDB/MySQL в отдельных контейнерах, пробрасывает порт 2368 внутрь контейнера на 8080 хоста и подключает внешние переменные окружения через .env:

---
version: "3"
services:
  ghost:
    image: ghost:latest
    restart: always
    ports:
      - "8080:2368"
    environment:
      database__client: mysql
      database__connection__host: db
      database__connection__database: ghost
      database__connection__user: ghost
      database__connection__password: ghost
      url: ${GHOST_URL}
      mail__transport: ${MAIL_TRANSPORT}
      mail__options__host: ${MAIL_HOST}
      mail__options__port: ${MAIL_PORT}
      mail__options__secureConnection: ${MAIL_SECURE_CONNECTION}
      mail__options__auth__user: ${MAIL_USER}
      mail__options__auth__pass: ${MAIL_PASSWORD}
    volumes:
      - ghost-data:/var/lib/ghost/content
    depends_on:
      - db
  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ghost
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost
    cap_add:
      - SYS_NICE
    volumes:
      - ghost-db:/var/lib/mysql
volumes:
  ghost-data: {}
  ghost-db: {}

Пояснения: переменные ${GHOSTURL}, ${MAIL*} и ${MYSQL_ROOT_PASSWORD} будут подставлены из файла .env.

  1. Создайте файл .env рядом с docker-compose.yml:
sudo nano ./.env

Вставьте пример и отредактируйте значения:

# URL
GHOST_URL="https://your-domain.example"
# Database
MYSQL_ROOT_PASSWORD="REPLACE_WITH_STRONG_PASSWORD"
# SMTP variables
MAIL_SERVICE="Gmail"
MAIL_TRANSPORT="SMTP"
MAIL_USER="your@gmail.com"
MAIL_PASSWORD="YOUR_APP_PASSWORD"
MAIL_HOST="smtp.gmail.com"
MAIL_PORT="465"
MAIL_SECURE_CONNECTION="true"

Замените GHOST_URL на ваш домен (включая https://, если планируете SSL), установите надежный MYSQL_ROOT_PASSWORD и укажите MAIL_USER / MAIL_PASSWORD.

  1. Запустите контейнеры в фоне:
sudo docker compose up -d

Проверка: docker ps покажет контейнеры ghost и db.

Терминал с отображением URL удалённого экземпляра Ghost.

Настройка обратного прокси (Nginx)

Для публичного доступа настроим Nginx как обратный прокси, который принимает запросы на 80/443 и перенаправляет их на Ghost (порт 8080).

  1. Установите Nginx:
sudo apt install -y nginx
  1. Создайте файл конфигурации сайта:
sudo nano /etc/nginx/sites-available/ghost

Пример конфигурации (замените server_name на ваш домен):

server {
    listen 80;
    listen [::]:80;

    server_name ghost.myvpsserver.top;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8080;
        proxy_buffering off;
    }
}
  1. Включите конфигурацию и перезапустите Nginx:
sudo ln -s /etc/nginx/sites-available/ghost /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl enable --now nginx.service

Проверьте nginx -t на отсутствие ошибок.

Включение SSL через certbot

Используем certbot (snap) для получения Let’s Encrypt сертификатов и автоматической настройки Nginx.

  1. Установите snap core и certbot:
sudo snap install core
sudo snap install certbot --classic
  1. Зарегистрируйте email для certbot и примите условия:
sudo certbot register --agree-tos --email you@example.com
  1. Получите и установите сертификат для вашего домена:
sudo certbot --nginx -d ghost.myvpsserver.top
  1. Тест: откройте https://ghost.myvpsserver.top — сайт должен быть доступен по HTTPS.

Рабочий экземпляр Ghost с включённым HTTPS.

Совет: настроьте автоматическое обновление сертификатов (snap certbot обычно добавляет cron/job автоматически).

Запуск Ghost на локальной машине и доступ через Tailscale

Если вы хотите запустить Ghost локально и иметь удалённый доступ без публикации в интернете, примените Tailscale Funnel.

  1. Установите Tailscale и войдите в ваш tailnet.
  2. Перейдите в админ-консоль Tailscale и в разделе DNS установите имя вашего tailnet.

DNS-вкладка в Tailscale Admin Console.

  1. Поменяйте hostname машины:
sudo hostnamectl set-hostname ghost.your-tailnet.ts.net
  1. Включите Tailscale Funnel в консоли (Enable HTTPS…) и добавьте правило в Access control.

Опция HTTPS для хостов Tailscale.

  1. На машине создайте проксирование между Tailscale и локальным портом:
sudo tailscale serve https / http://127.0.0.1:8080
sudo tailscale funnel 443 on
  1. Откройте браузер по адресу вашего tailnet-host — сайт Ghost будет доступен через Tailscale.

Рабочая установка Ghost через Tailscale.

Ограничения: Tailscale Funnel поддерживает только TCP-порты 443, 8443 и 10000 и не подходит для UDP/реального времени.

Первичная настройка Ghost и первые публикации

  1. Откройте браузер и перейдите по адресу вашего домена/адреса с добавлением /ghost (например, https://example.com/ghost).
  2. Заполните форму создания блога и администратора: имя блога, email администратора и пароль.

Кнопка «Создать аккаунт и начать публикацию» в Ghost.

Создание первой записи

  1. Нажмите «Write your first post» на странице онбординга.
  2. Напишите тестовый пост и нажмите «Publish».
  3. Проверьте главную страницу блога — пост должен быть виден.

Начальная страница редактора Ghost.

Добавление пользователя/подписчика

  1. В админ-панели перейдите в «Members»
  2. Нажмите «New Member», заполните данные и сохраните — пользователь появится в списке рассылки.

Список участников (Members) в Ghost.

Рекомендации по безопасности и эксплуатации

  1. Регулярно обновляйте Docker-образы: периодически выполняйте docker compose pull && docker compose up -d.
  2. Делайте автоматические бэкапы папки контента и базы данных. Пример: дамп MySQL и tar контента.
  3. Настройте файрволл (ufw): разрешите 22 (SSH), 80 и 443, блокируйте всё прочее.
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
sudo ufw enable
  1. Используйте сложные пароли и храните их в менеджере паролей. Для MYSQL_ROOT_PASSWORD используйте минимум 32 символа.
  2. Ограничьте доступ по SSH (ключи, запрет пароля, сменный порт по желанию).
  3. Включите автоматические обновления безопасности на ОС и мониторинг дискового пространства.

Краткий чек: резервные копии + обновления + файрволл + мониторинг.

Чек-листы по ролям

Администратор (DevOps):

  • Установить Docker и Docker Compose
  • Настроить системные бэкапы (контент и БД)
  • Настроить Nginx и HTTPS
  • Настроить мониторинг и алерты

Контент-менеджер / Журналист:

  • Создать аккаунт администратора
  • Настроить профиль и внешний вид сайта
  • Создать и опубликовать тестовый пост
  • Настроить подписки (Members)

Инженер безопасности:

  • Провести аудит доступов по SSH
  • Настроить UFW и fail2ban
  • Регулярно проверять логи и обновления безопасности

План восстановления и отладки (инцидент-ранбук)

Сценарий: сайт недоступен по HTTPS.

  1. Проверить статус Docker-контейнеров: docker ps
  2. Проверить логи Ghost: docker compose logs ghost –tail 200
  3. Проверить статус Nginx: sudo systemctl status nginx && sudo nginx -t
  4. Проверить сертификаты certbot: sudo certbot certificates
  5. Если база данных не отвечает: проверить контейнер db и логи, попытаться выполнить docker compose restart db
  6. Если проблема с диском: df -h, очистить логи или расширить диск
  7. Восстановление из бэкапа: восстановить дамп MySQL и контент из архива, затем запустить контейнеры

Критерии успешного восстановления:

  • Сайт доступен по HTTPS
  • Базы и контент восстановлены и консистентны
  • Нет ошибок в логах при старте сервисов

Альтернативы и когда не стоит использовать самохостинг

Когда лучше выбрать Ghost(Pro) или другой SaaS:

  • Если вам не хочется заниматься управлением сервера и обновлениями.
  • Если вам нужна SLA и поддержка на уровне платформы.
  • Если ожидается большое количество писем/рассылок — лучше интегрировать профессиональный SMTP.

Альтернативные CMS:

  • WordPress (широкая экосистема, но более тяжёлый в обслуживании)
  • Hugo/Jekyll (статические генераторы — безопаснее и проще масштабируются через CDN)
  • Medium (платформа без управления сервером)

Дополнительные инструменты и советы по оптимизации

  • CDN (Cloudflare) для снижения нагрузки и защиты от DDoS.
  • Off-site бэкапы (S3, Backblaze) для долгосрочного хранения.
  • Настройка логирования и централизованного мониторинга (Prometheus/Grafana или готовые SaaS).

Ментальные модели и эвристики

  • «Разделяй ответственность»: контейнеризируй сервисы (CMS отдельно от БД).
  • «Минимальный рабочий стек»: Ghost + MySQL + Nginx + certbot + backup.
  • «Безопасность по умолчанию»: минимум открытых портов, SSH-ключи, регулярные обновления.

Мини-словарь (1 строка термина)

  • Docker — система контейнеризации приложений.
  • Nginx — веб-сервер и обратный прокси.
  • Certbot — клиент Let’s Encrypt для выдачи SSL-сертификатов.
  • Tailscale — приватная VPN-сеть на базе WireGuard для доступа к устройствам.

Диаграмма принятия решения (Mermaid)

flowchart TD
  A[Нужен публичный блог?] -->|Да| B[Есть сервер?]
  A -->|Нет| C[Локальный тест / Tailscale]
  B -->|Да| D[Самохостинг Ghost]
  B -->|Нет| E[Рассмотреть Ghost'Pro' или VPS]
  D --> F[Настроить Docker + Nginx + certbot]
  F --> G[Настройка SMTP и бэкапов]

Часто задаваемые вопросы

Ограничивает ли Tailscale Funnel порты?

Да. По умолчанию Tailscale Funnel позволяет открывать трафик только на портах 443, 8443 и 10000 и только по TCP. Это значит, что службы, требующие UDP или реального времени (VoIP, игры), работать не будут.

Можно ли персонализировать доменное имя Tailscale?

Нет. Адреса Tailscale привязаны к вашему аккаунту и tailnet, поэтому полная персонализация домена невозможна. Вы можете настроить удобные hostname внутри tailnet.

Будет ли блог работать, если компьютер выключен?

Нет. Если Ghost запущен локально на вашей машине, доступность сайта зависит от состояния хоста. Для высокой доступности используйте VPS или облачный сервер.

Ключевые выводы

  • Самохостинг Ghost даёт контроль и гибкость, но требует управления инфраструктурой.
  • Docker + Nginx + certbot — это рабочая и воспроизводимая архитектура для Ghost.
  • Используйте App Passwords для Gmail или профессиональные SMTP-провайдеры для рассылок.
  • Настройте автоматические бэкапы, мониторинг и регулярные обновления.

Источник изображений: WORKING OFFICE COMMUNICATION PEOPLE USING COMPUTER BLOG CONCEPT и традиционное печенье-призрак на тему Хэллоуина, фото via 123RF.

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

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

Доступ к Android с разбитым экраном
Android.

Доступ к Android с разбитым экраном

Сброс Samsung при заблокированном телефоне
Мобильные устройства

Сброс Samsung при заблокированном телефоне

Как разогнать монитор через NVIDIA Control Panel
Гайды

Как разогнать монитор через NVIDIA Control Panel

APC_INDEX_MISMATCH: как исправить BSOD в Windows
Инструкции

APC_INDEX_MISMATCH: как исправить BSOD в Windows

Как исправить ошибку Blink 1011
Техническая поддержка

Как исправить ошибку Blink 1011

Восстановление удалённых SMS на Samsung
Мобильные

Восстановление удалённых SMS на Samsung