Обзор развертывания Mastodon на сервере¶
Предварительные требования и основные условия¶
Для развертывания Mastodon требуются следующие спецификации окружения и права доступа:
-
Операционная система: Ubuntu (согласно конфигурации задач)
-
Права доступа: Доступ root или права sudo для установки Docker, управления сервисами и настройки межсетевого экрана
-
Docker Engine: Должен быть установлен и запущен
-
Docker Compose: Требуется наличие команды
docker-composeи плагинаdocker-compose-plugin -
Домен: Для FQDN необходим действительный домен или поддомен в зоне
hostkey.in -
Порты: Должны быть доступны порты
3000(веб),4000(стриминг),80(HTTP-перенаправление) и443(HTTPS) -
Пользователь: Сервис выполняется от имени выделенного пользователя
mastodonс домашней директорией/opt/mastodon
FQDN финальной панели управления¶
Приложение доступно по следующему формату полнодоменного имени (FQDN):
-
Формат:
<prefix><ID сервера>.hostkey.in:<port> -
Основной домен:
mastodon<ID сервера>.hostkey.in -
Веб-интерфейс: Порт
443(HTTPS) -
API стриминга: Порт
443(HTTPS, проксированный на внутренний порт4000)
Примечание: Конкретный <ID сервера> определяется переменными конфигурации сервера и добавляется непосредственно к префиксу mastodon в имени домена.
Структура файлов и директорий¶
Файлы приложения, конфигурация и данные организованы в следующем иерархическом порядке директорий под /opt/mastodon:
-
/opt/mastodon/(Основная директория приложения) -
/opt/mastodon/.env.production(Конфигурация производственного окружения) -
/opt/mastodon/.env.db(Конфигурация окружения базы данных) -
/opt/mastodon/docker-compose.yml(Файл оркестрации Docker Compose) -
/opt/mastodon/data/postgres(Хранилище данных PostgreSQL) -
/opt/mastodon/data/redis(Хранилище данных Redis) -
/opt/mastodon/data/public/system(Хранилище общедоступных медиафайлов) -
/data/nginx/user_conf.d/mastodon<ID сервера>.hostkey.in.conf(Конфигурация прокси Nginx) -
/data/nginx/nginx-certbot.env(Конфигурация SSL-сертификатов для Let's Encrypt)
Процесс установки приложения¶
Процесс установки включает развертывание Mastodon версии v4.3.1 с использованием Docker-контейнеров. Система выполняет следующие шаги для подготовки и запуска приложения:
-
Настройка Docker: Проверка установки Docker и Docker Compose.
-
Создание пользователя: Создание системного пользователя
mastodonс домашней директорией/opt/mastodon. -
Инициализация директорий: Создание необходимых директорий для PostgreSQL, Redis и общедоступных файлов с установлением прав владения пользователем
mastodon. -
Конфигурация окружения:
-
Генерация файла
.env.dbс учетными данными PostgreSQL. -
Генерация файла
.env.productionс секретами приложения. -
Динамическая генерация криптографических секретов (
SECRET_KEY_BASE,OTP_SECRET, ключиVAPIDи ключи шифрования Active Record) с помощью командrailsи их внедрение в файл.env.production.
-
-
Запуск сервисов: Запуск Docker-контейнеров, определенных в
docker-compose.yml. -
Миграция базы данных: Выполнение миграций базы данных (
rails db:migrate) для инициализации схемы. -
Начальные данные: Запуск команды
rails db:seedдля создания начального пользователя администратора и данных по умолчанию. -
Финальная перезагрузка: Перезапуск сервисов для гарантии применения всех конфигураций.
Docker-контейнеры и их развертывание¶
Развертывание использует Docker Compose для оркестрации следующих сервисов. Все сервисы настроены с параметром restart: always или restart: unless-stopped.
| Сервис | Образ контейнера | Описание |
|---|---|---|
nginx | jonasal/nginx-certbot:latest | Обрабатывает завершение SSL (SSL termination), управление сертификатами Let's Encrypt и обратное проксирование. Использует режим сети host. |
db | postgres:14-alpine | Сервис базы данных PostgreSQL 14. |
redis | redis:7-alpine | Сервис кеширования и очереди Redis 7. |
web | ghcr.io/mastodon/mastodon:v4.3.1 | Основное веб-приложение Mastodon (сервер Puma). Открывает порт 3000. |
streaming | ghcr.io/mastodon/mastodon-streaming:v4.3.1 | Сервер WebSocket-стриминга. Открывает порт 4000. |
sidekiq | ghcr.io/mastodon/mastodon:v4.3.1 | Обработчик фоновых задач (Sidekiq). |
Контейнер nginx монтирует /etc/letsencrypt для сертификатов и /data/nginx/user_conf.d для пользовательских конфигураций сервера. Контейнеры web и sidekiq монтируют локальную директорию public/system в /mastodon/public/system для хранения медиа.
Прокси-серверы¶
Nginx действует как обратный прокси и точка завершения SSL (SSL termination) для экземпляра Mastodon.
-
Расположение конфигурации:
/data/nginx/user_conf.d/mastodon<ID сервера>.hostkey.in.conf -
SSL/TLS: Обработка осуществляется через Let's Encrypt (
certbot) с помощью контейнераjonasal/nginx-certbot. -
Домены: Прокси выслушивает домен
mastodon<ID сервера>.hostkey.in. -
Маршрутизация:
-
Все стандартные запросы (
/) проксируются в контейнерwebнаmastodon<ID сервера>.hostkey.in:3000. -
Запросы стриминга (
/api/v1/streaming) проксируются в контейнерstreamingнаmastodon<ID сервера>.hostkey.in:4000.
-
-
Заголовки: Конфигурация прокси устанавливает стандартные заголовки, включая
X-Forwarded-Proto,X-Forwarded-Ssl,Host,X-Real-IPиX-Forwarded-For, чтобы гарантировать корректную идентификацию клиентских соединений приложением. -
Перенаправления: HTTP-трафик на порту
80автоматически перенаправляется на HTTPS на порт443.
Базы данных¶
Приложение использует внешние сервисы для хранения данных и кеширования, настроенные следующим образом:
-
PostgreSQL:
-
Сервис:
db(PostgreSQL 14 Alpine) -
Хост:
db(внутренняя сеть Docker) -
Порт:
5432 -
Пользователь:
postgres -
Имя базы данных:
postgres -
Пароль: Устанавливается через переменную
ansible_ssh_passв.env.db -
Хранилище данных: Сохраняется в
/opt/mastodon/postgres14(отображено из./postgres14в compose.yml) -
Метод аутентификации: Trust (внутри сети Docker)
-
-
Redis:
-
Сервис:
redis(Redis 7 Alpine) -
Хост:
redis(внутренняя сеть Docker) -
Порт:
6379 -
Хранилище данных: Сохраняется в
/opt/mastodon/redis(отображено из./redisв compose.yml)
-
-
Elasticsearch:
- Конфигурация включает закомментированные блоки для Elasticsearch, что указывает на то, что он не разворачивается в данной установке.
Права доступа и безопасность¶
Безопасность обеспечивается за счет разделения пользователей, прав на файлы и сетевой изоляции:
-
Системный пользователь: Директория приложения и файлы данных принадлежат пользователю
mastodon. -
Права на файлы:
-
Файлы конфигурации (
.env.production,.env.db) имеют режим доступа0600(чтение/запись только для владельца). -
Директории приложения имеют режим доступа
0755. -
Файл
docker-compose.ymlдоступен для чтения владельцу и группе (0644).
-
-
Сетевая изоляция:
-
Для связи между
db,redis,web,streamingиsidekiqиспользуется сетьinternal_network, что предотвращает прямой внешний доступ к этим сервисам. -
Контейнер
nginxиспользуетnetwork_mode: hostдля прямого привязки к сетевым интерфейсам сервера для публичного доступа.
-
-
Секреты: Чувствительные ключи (
SECRET_KEY_BASE,OTP_SECRET, ключи шифрования, ключи VAPID) генерируются динамически и хранятся в.env.productionс ограниченным доступом.
Настройки разрешений¶
Права доступа к файлам и директориям устанавливаются в процессе развертывания:
-
Владелец: Все файлы и директории под
/opt/mastodonпринадлежат пользователю и группеmastodon. -
Конфиги, принадлежащие root: Файлы конфигурации Nginx, расположенные в
/data/nginx/user_conf.d/, принадлежатroot:root. -
Исполняемые права: Никаких специальных исполняемых битов для скриптов в контексте финального состояния не устанавливается; управление сервисами осуществляется через Docker Compose.
-
Директории данных:
-
/opt/mastodon/data/postgres:755 -
/opt/mastodon/data/redis:755 -
/opt/mastodon/data/public/system:755
-
Расположение файлов конфигурации и данных¶
-
Корневая директория приложения:
/opt/mastodon -
Окружение производства:
/opt/mastodon/.env.production -
Окружение базы данных:
/opt/mastodon/.env.db -
Оркестрация Docker:
/opt/mastodon/docker-compose.yml -
Конфигурация прокси Nginx:
/data/nginx/user_conf.d/mastodon<ID сервера>.hostkey.in.conf -
Данные PostgreSQL:
/opt/mastodon/postgres14(том Docker) -
Данные Redis:
/opt/mastodon/redis(том Docker) -
Общедоступные медиафайлы:
/opt/mastodon/data/public/system
Доступные порты для подключения¶
Следующие порты открыты и используются развертыванием:
| Порт | Протокол | Сервис | Описание |
|---|---|---|---|
80 | TCP | Nginx | HTTP-трафик (перенаправляется на HTTPS) |
443 | TCP | Nginx | HTTPS-трафик (основной веб и API стриминга) |
3000 | TCP | Mastodon Web | Внутренний порт веб-приложения (проксируется Nginx) |
4000 | TCP | Mastodon Streaming | Внутренний порт WebSocket-стриминга (проксируется Nginx) |
Прямой доступ к портам 3000 и 4000 ограничен внутренней сетью Docker; внешние пользователи должны получать доступ к приложению через Nginx на порту 443.
Запуск, остановка и обновление¶
Управление сервисами выполняется с помощью команд Docker Compose, запускаемых из директории /opt/mastodon.
-
Запуск сервисов:
-
Остановка сервисов:
-
Перезапуск сервисов:
-
Обновление миграций базы данных:
-
Проверка статуса базы данных: