MAATRIX / Блог / PeerTube в Docker Compose: готовый файл

PeerTube в Docker Compose: готовый файл

MAATRIX

YouTube банит каналы за формальности, Twitch режет донаты из России, а хостить видео на своём сайте через обычный веб-сервер неудобно — нет ни плееров, ни подписок, ни транскодирования под разные разрешения. PeerTube решает это по-другому: это открытый видеохостинг, который поднимается на вашем сервере и через протокол ActivityPub федерируется с тысячами других таких же инстансов — по сути получается собственный YouTube, который при этом виден и находим через всю сеть Fediverse. Ниже — рабочий docker-compose.yml, требования к железу и всё, что нужно для запуска с нуля.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Сколько ресурсов нужно серверу для PeerTube

PeerTube — это не статика, это Node.js-приложение с PostgreSQL, Redis и фоновыми задачами транскодирования видео через ffmpeg. Именно транскодирование — главный потребитель ресурсов, и от него зависит выбор конфигурации.

Ориентировочные требования (это именно ориентир — у вас будет зависеть от числа одновременных загрузок и выбранных разрешений):

  • CPU — от 2 vCPU для инстанса без активной загрузки видео, но если хотите транскодировать несколько роликов параллельно в 1080p/720p/480p — закладывайте 4-8 vCPU. Транскодирование одного видео в несколько разрешений — это несколько параллельных процессов ffmpeg, каждый нагружает ядро почти на 100%.
  • RAM — 4 ГБ хватает для старта (Postgres + Redis + сама нода), но при активном транскодировании и большом числе одновременных стримов лучше иметь 8 ГБ и больше.
  • Диск — здесь ключевой момент: PeerTube хранит оригиналы и все транскодированные версии каждого видео, если не подключить внешнее хранилище. Час видео в 1080p легко занимает несколько гигабайт, а с учётом версий в 720p/480p/360p — умножайте на 2-3. Планируйте SSD/NVMe: медленный диск — это долгая перекодировка и лаги при отдаче стрима. Про то, как правильно считать место с запасом, у нас есть отдельный разбор.
  • Сеть — исходящий трафик растёт линейно с числом зрителей, у видеохостинга это часто узкое место раньше, чем CPU или диск.

Если заранее непонятно, сколько видео будет заливаться, разумно стартовать с диска среднего размера и вынести хранилище на S3-совместимое object storage (об этом ниже) — тогда апгрейд диска сервера вообще не понадобится.

Готовый docker-compose.yml

Ниже — рабочая связка: PostgreSQL, Redis и сам PeerTube. Сохраните как docker-compose.yml в отдельной директории, например /opt/peertube/:

version: "3.8"

services:
  postgres:
    image: postgres:16-alpine
    container_name: peertube-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: peertube
      POSTGRES_PASSWORD: ${PEERTUBE_DB_PASSWORD}
      POSTGRES_DB: peertube
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - peertube

  redis:
    image: redis:7-alpine
    container_name: peertube-redis
    restart: unless-stopped
    volumes:
      - ./data/redis:/data
    networks:
      - peertube

  peertube:
    image: chocobozzz/peertube:production-bookworm
    container_name: peertube
    restart: unless-stopped
    depends_on:
      - postgres
      - redis
    ports:
      - "127.0.0.1:9000:9000"
    env_file:
      - .env
    volumes:
      - ./data/peertube:/app/data
      - ./config:/app/config
    networks:
      - peertube

networks:
  peertube:
    driver: bridge

Обратите внимание: порт PeerTube (9000) пробрасывается только на localhost. Наружу приложение смотрит через reverse-proxy с SSL — так делает и официальная документация проекта, и это правильно с точки зрения безопасности: сам PeerTube не должен торчать в интернет напрямую.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Настройка .env и первый запуск

Рядом с docker-compose.yml создайте файл .env. Набор переменных у PeerTube довольно большой, но для старта хватает базового блока — сверяйтесь с актуальным .env.example из репозитория проекта на случай, если что-то переименовали в новых релизах:

# База данных
PEERTUBE_DB_USERNAME=peertube
PEERTUBE_DB_PASSWORD=замените_на_сложный_пароль
PEERTUBE_DB_HOSTNAME=postgres

# Redis
PEERTUBE_REDIS_HOSTNAME=redis
PEERTUBE_REDIS_PORT=6379

# Веб-сервер
PEERTUBE_WEBSERVER_HOSTNAME=video.ваш-домен.ru
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
PEERTUBE_TRUST_PROXY=127.0.0.1,::1

# Администратор
PEERTUBE_ADMIN_EMAIL=admin@ваш-домен.ru

# SMTP (для писем — регистрация, уведомления)
PEERTUBE_SMTP_HOSTNAME=smtp.ваш-провайдер.ru
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_USERNAME=noreply@ваш-домен.ru
PEERTUBE_SMTP_PASSWORD=пароль_от_почты
PEERTUBE_SMTP_FROM=noreply@ваш-домен.ru
PEERTUBE_SMTP_TLS=true

Перед первым запуском заранее поднимите DNS-запись на домен video.ваш-домен.ru, указывающую на IP сервера — PeerTube жёстко привязан к hostname из PEERTUBE_WEBSERVER_HOSTNAME, поменять его после старта без миграции нельзя.

Запуск:

docker compose up -d
docker compose logs -f peertube

Первый старт займёт пару минут — приложение прогоняет миграции базы. После этого учётные данные администратора (логин root и сгенерированный пароль) появятся в логах:

docker compose logs peertube | grep -A1 "Username"

Пароль root можно сбросить в любой момент:

docker compose exec peertube npm run reset-password -- -u root

Reverse-proxy с авто-SSL: Caddy перед PeerTube

Раз сам контейнер PeerTube слушает только localhost:9000, нужен reverse-proxy с TLS-терминацией. Caddy для этого удобнее nginx — сертификат Let's Encrypt получает и продлевает сам, конфиг короче:

video.ваш-домен.ru {
    reverse_proxy 127.0.0.1:9000 {
        header_up X-Forwarded-Proto https
        header_up X-Real-IP {remote_host}
    }

    request_body {
        max_size 12GB
    }
}

Лимит max_size важен отдельно: по умолчанию у большинства прокси стоит ограничение в районе 1-100 МБ на тело запроса, а видеофайлы этот лимит легко превышают — без явного увеличения загрузка будет обрываться на больших роликах. Подробный разбор установки и автопродления сертификатов — в статье про Caddy с авто-SSL.

Если предпочитаете nginx — логика та же: proxy_pass на 127.0.0.1:9000, client_max_body_size выставлен щедро (тоже в районе десятка гигабайт под большие исходники), и заголовки X-Forwarded-For/X-Forwarded-Proto прокинуты, иначе PeerTube не увидит реальный IP и схему.

Хранилище и транскодирование видео

По умолчанию PeerTube хранит всё — оригиналы, HLS-фрагменты, превью — на локальном диске в volume ./data/peertube. Это просто, но диск быстро заполняется, если канал растёт.

Транскодирование включается в config/production.yaml (или через админку — Administration → Configuration → Transcoding):

transcoding:
  enabled: true
  allow_additional_extensions: true
  resolutions:
    "240p": false
    "360p": true
    "480p": true
    "720p": true
    "1080p": true
    "1440p": false
    "2160p": false
  hls:
    enabled: true
  web_videos:
    enabled: true

Чем больше разрешений включено, тем дольше идёт обработка каждой загрузки и тем больше места она занимает — отключайте лишние ступени (240p и 4K чаще всего избыточны), если аудитория смотрит с типичных экранов.

Для разгрузки диска сервера PeerTube из коробки поддерживает S3-совместимое object storage под видео и превью:

object_storage:
  enabled: true
  endpoint: 'https://s3.ваш-эндпоинт.ru'
  region: 'ru-1'
  credentials:
    access_key_id: 'ваш_access_key'
    secret_access_key: 'ваш_secret_key'
  streaming_playlists:
    bucket_name: 'peertube-streaming'
  web_videos:
    bucket_name: 'peertube-videos'

Здесь подойдёт и внешний S3-провайдер, и собственный MinIO на соседнем сервере — если поднимаете его сами, у нас есть пошаговая инструкция по установке и настройке MinIO. Такой вариант удобен, когда видеоконтента много: диск основного сервера остаётся под систему и базы, а видео растёт отдельно и без риска забить корневой раздел.

Федерация: подключаемся к другим инстансам

Главное отличие PeerTube от закрытого видеохостинга — федерация через ActivityPub. Ваш инстанс может «подписаться» на другие PeerTube-серверы, и тогда видео с них появляются в вашей общей ленте, а ваши зрители могут комментировать и лайкать ролики с чужих инстансов прямо из вашего интерфейса.

Подключение делается из админки: Administration → Federation → Following, туда вводится handle инстанса вида https://другой-инстанс.tld. Подписка асинхронна — после подтверждения оба сервера начинают обмениваться активностями (новые видео, комментарии, лайки) через ActivityPub.

Важный нюанс для владельца сервера: чем больше инстансов вы фолловите, тем больше фоновых задач обрабатывает очередь в Redis и тем активнее идёт обмен метаданными — это относительно небольшая, но постоянная фоновая нагрузка, которую стоит учитывать при расчёте CPU отдельно от транскодирования.

Также можно закрыть регистрацию (signup.enabled: false в конфиге) и держать инстанс приватным, но при этом всё равно быть видимым в федерации для избранных серверов — это частый выбор для небольших сообществ или корпоративного видеохостинга, которому не нужна публичная регистрация, но нужна интеграция с внешним контентом.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли обойтись без Redis?

Нет, Redis обязателен — через него работает очередь фоновых задач (транскодирование, федерация, уведомления). Без него PeerTube не запустится.

Что будет, если не хватит места на диске во время транскодирования?

Задача транскодирования упадёт с ошибкой, а исходный файл может остаться в промежуточном состоянии. Мониторьте свободное место заранее — резкого автоматического отказа с понятным сообщением пользователю может и не быть.

Нужен ли отдельный SMTP-сервер?

Для регистрации пользователей и уведомлений — да, PeerTube отправляет письма через настроенный SMTP. Если инстанс приватный и пользователь один (вы), можно временно оставить SMTP не настроенным, но тогда часть функций (сброс пароля через письмо) будет недоступна.

Как обновить PeerTube в этой связке?

Обновление образа: docker compose pull peertube && docker compose up -d peertube. Перед мажорным обновлением обязательно сделайте бэкап volume с базой и данными — миграции между версиями иногда необратимы.

Подходит ли PeerTube для замены Twitch (живые стримы)?

Да, live-стриминг через RTMP встроен и включается в конфиге (live.enabled: true), но он требует дополнительных ресурсов CPU на транскодирование потока в реальном времени — для стабильного лайва закладывайте запас по ядрам отдельно от обычной загрузки видео.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →