Перейти к содержанию

Обзор развертывания 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-контейнеров. Система выполняет следующие шаги для подготовки и запуска приложения:

  1. Настройка Docker: Проверка установки Docker и Docker Compose.

  2. Создание пользователя: Создание системного пользователя mastodon с домашней директорией /opt/mastodon.

  3. Инициализация директорий: Создание необходимых директорий для PostgreSQL, Redis и общедоступных файлов с установлением прав владения пользователем mastodon.

  4. Конфигурация окружения:

    • Генерация файла .env.db с учетными данными PostgreSQL.

    • Генерация файла .env.production с секретами приложения.

    • Динамическая генерация криптографических секретов (SECRET_KEY_BASE, OTP_SECRET, ключи VAPID и ключи шифрования Active Record) с помощью команд rails и их внедрение в файл .env.production.

  5. Запуск сервисов: Запуск Docker-контейнеров, определенных в docker-compose.yml.

  6. Миграция базы данных: Выполнение миграций базы данных (rails db:migrate) для инициализации схемы.

  7. Начальные данные: Запуск команды rails db:seed для создания начального пользователя администратора и данных по умолчанию.

  8. Финальная перезагрузка: Перезапуск сервисов для гарантии применения всех конфигураций.

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.

  • Запуск сервисов:

    cd /opt/mastodon
    docker-compose -f docker-compose.yml up -d
    

  • Остановка сервисов:

    cd /opt/mastodon
    docker-compose -f docker-compose.yml down
    

  • Перезапуск сервисов:

    cd /opt/mastodon
    docker-compose -f docker-compose.yml restart
    

  • Обновление миграций базы данных:

    cd /opt/mastodon
    docker-compose run --rm web bundle exec rails db:migrate
    

  • Проверка статуса базы данных:

    cd /opt/mastodon
    docker-compose -f docker-compose.yml exec -T db pg_isready -U postgres
    

question_mark
Я могу вам чем-то помочь?
question_mark
ИИ Помощник ×