MAATRIX / Блог / Как установить и настроить PeerTube на VPS

Как установить и настроить PeerTube на VPS

MAATRIX

YouTube может заблокировать канал за формальность, а хранить архив видео на чужой платформе — рискованно: правила меняются без предупреждения, а монетизация и охваты зависят от алгоритма, на который вы не влияете. PeerTube решает это по-другому: это открытый видеохостинг, который работает на вашем сервере, а зрители могут смотреть видео и через собственный клиент, и через федерацию из других инстансов PeerTube — без единой точки отказа. Ниже — рабочая установка через Docker, с реверс-прокси, SSL и настройками, которые реально пригодятся после первого запуска.

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

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

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

Что такое PeerTube и зачем он вам

PeerTube — видеохостинг с открытым кодом от Framasoft, построенный на протоколе ActivityPub (том же, что у Mastodon). Инстансы объединяются в федерацию: подписчики с других серверов PeerTube видят ваши видео у себя в ленте, а вы можете подписываться на чужие каналы — без централизованной платформы посередине. Раздача видео частично идёт через WebTorrent/P2P между зрителями, что снижает нагрузку на исходящий канал сервера при популярных роликах.

Практический смысл для вас:

  • полный контроль над контентом и данными — никто не забанит канал по формальной причине;
  • федерация даёт органический охват без алгоритмической ленты;
  • можно держать инстанс закрытым (без федерации) — просто как приватный видеоархив для команды или проекта;
  • лицензия AGPL, исходники открыты, инстанс не привязан к вендору.

Минус тоже стоит понимать сразу: видео — это диск и процессор. Транскодинг в несколько разрешений и HLS съедает CPU при загрузке роликов, а хранилище растёт быстрее, чем кажется на старте. Дальше в статье — как рассчитать сервер под это заранее, а не разбираться постфактум.

Требования к серверу и выбор VPS

PeerTube официально поддерживается на Debian/Ubuntu, для установки через Docker подходит любой дистрибутив с рабочим Docker Engine. Ресурсы зависят от того, сколько видео заливается одновременно и в какие разрешения транскодируется.

СценарийvCPURAMДискКомментарий
Личный/командный архив, редкая заливка24 ГБ60–100 ГБ SSDтранскодинг только в 1–2 разрешения
Небольшой публичный канал48 ГБ200+ ГБ SSD/NVMeнесколько роликов в день, HLS до 1080p
Активный инстанс с федерацией816 ГБS3-хранилище отдельномного одновременных загрузок и подписчиков

Транскодинг — самая тяжёлая операция: один час видео в четыре разрешения (240p–1080p) может занимать процессор на десятки минут. Если заливок много, вынесите очередь транскодинга на отдельный воркер или ограничьте набор разрешений в настройках инстанса — это прямой рычаг по нагрузке.

Диск стоит планировать с запасом: оригинал + HLS-фрагменты в нескольких битрейтах занимают в 2–4 раза больше места, чем исходный файл. Для роста без миграции удобно сразу вынести хранилище видео в S3-совместимый бакет — см. раздел про хранилище ниже; развернуть свой S3 под это можно на соседнем сервере через MinIO.

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

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

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

Установка Docker и подготовка окружения

Дальше — на чистом Ubuntu 24.04 или Debian 12. Docker и docker compose plugin ставятся стандартно (если Docker уже стоит, пропустите этот блок):

curl -fsSL https://get.docker.com | sh
systemctl enable --now docker
docker compose version

Создайте рабочую директорию и структуру данных:

mkdir -p /opt/peertube/{data,config}
cd /opt/peertube

Firewall — открываем только то, что реально нужно снаружи: 80/443 для веба и, если планируете live-стриминг, 1935 для RTMP.

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 1935/tcp   # только если нужен live-стриминг
ufw enable

Подробный разбор правил и типичных ошибок — в статье про настройку firewall UFW. DNS-запись A (и AAAA, если есть IPv6) на ваш домен должна указывать на VPS до первого запуска — PeerTube проверяет hostname при инициализации и без него не сгенерирует корректные ссылки. Если домен ещё не привязан к серверу, порядок действий описан в статье про настройку домена и DNS.

Настройка PeerTube через docker-compose

Создайте .env в /opt/peertube:

PEERTUBE_DB_PASSWORD=сгенерируйте_длинный_пароль
PEERTUBE_WEBSERVER_HOSTNAME=video.example.com
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
PEERTUBE_ADMIN_EMAIL=admin@example.com
PEERTUBE_SIGNUP_ENABLED=false
PEERTUBE_TRANSCODING_ENABLED=true
PEERTUBE_TRANSCODING_RESOLUTIONS_1080P=true
PEERTUBE_TRANSCODING_RESOLUTIONS_720P=true
PEERTUBE_TRANSCODING_RESOLUTIONS_480P=true
PEERTUBE_TRANSCODING_RESOLUTIONS_240P=false

И docker-compose.yml:

services:
  postgres:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: peertube
      POSTGRES_PASSWORD: ${PEERTUBE_DB_PASSWORD}
      POSTGRES_DB: peertube
      POSTGRES_INITDB_ARGS: "--encoding=UTF8"
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U peertube"]
      interval: 10s
      retries: 5

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

  peertube:
    image: chocobozzz/peertube:production-bookworm
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_started
    ports:
      - "127.0.0.1:9000:9000"
    env_file:
      - .env
    environment:
      PEERTUBE_DB_HOSTNAME: postgres
      PEERTUBE_DB_USERNAME: peertube
      PEERTUBE_DB_PASSWORD: ${PEERTUBE_DB_PASSWORD}
      PEERTUBE_REDIS_HOSTNAME: redis
    volumes:
      - ./data/peertube:/data
      - ./config:/config

Точный тег образа стоит свериться с Docker Hub на момент установки (chocobozzz/peertube) — проект активно выпускает релизы, и версия сборки под Debian может отличаться. Порт 9000 намеренно привязан только к 127.0.0.1 — наружу PeerTube отдаётся через реверс-прокси, напрямую наружу этот порт лучше не открывать.

Поднимаем стек:

docker compose up -d
docker compose logs -f peertube

Первый старт создаёт схему базы и генерирует конфиг в /config — дождитесь строки о том, что сервер слушает порт, прежде чем идти дальше.

Обратный прокси, домен и SSL

PeerTube чувствителен к настройкам прокси: загрузка видео идёт большими чанками, а стандартные лимиты nginx на размер тела запроса и буферизацию обрежут крупные файлы на середине. Рабочий блок для nginx:

server {
    listen 443 ssl http2;
    server_name video.example.com;

    client_max_body_size 0;
    proxy_request_buffering off;
    proxy_buffering off;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

proxy_read_timeout/send_timeout подняты специально — при заливке многогигабайтного файла с медленного канала стандартных 60 секунд не хватает, и загрузка обрывается посередине без понятной ошибки.

Если вам ближе Caddy с автоматическим SSL — в статье про установку Caddy с авто-SSL есть базовая настройка; для PeerTube в Caddyfile дополнительно нужно прописать request_body { max_size 0 } в блоке reverse_proxy, иначе крупные загрузки будут обрываться так же, как в nginx без client_max_body_size 0.

Первый запуск, федерация и хранилище видео

Пароль администратора PeerTube генерирует при первом старте и пишет в лог контейнера:

docker compose logs peertube | grep -A2 "root user"

Дальше — через веб-интерфейс, Administration → Настройки:

  • Федерация: включена по умолчанию — инстанс виден другим серверам PeerTube, подписчики извне видят ваши публичные видео. Отключается одной галочкой, если нужен приватный архив без выхода наружу.
  • Регистрация: PEERTUBE_SIGNUP_ENABLED=false в .env уже закрыла самостоятельную регистрацию — добавляйте пользователей вручную через админку, если инстанс не публичный.
  • Транскодинг: набор разрешений и профиль (H.264 или AV1/VP9) настраиваются в Administration → Настройки → Транскодинг. Чем больше разрешений — тем больше диска и CPU на каждую загрузку; для старта достаточно 480p/720p/1080p.
  • Хранилище: для растущего архива видео разумно вынести объекты в S3-совместимый бакет вместо локального диска — это снимает вопрос "куда расширять диск VPS" вообще. Свой S3 можно поднять на соседнем сервере через MinIO и указать его endpoint в конфиге объектного хранилища PeerTube.

Для транзакционных писем (подтверждение регистрации, уведомления модераторам) нужен рабочий SMTP — переменные PEERTUBE_SMTP_* в .env. Свой почтовый сервер описан в статье про Postfix на VPS; для инстанса с закрытой регистрацией без внешних пользователей этот шаг можно пропустить.

Резервное копирование и обновление

PeerTube хранит состояние в двух местах: база PostgreSQL (метаданные, пользователи, комментарии) и файлы видео на диске или в S3. Бэкапить нужно оба, и делать это раздельно от контейнера:

# дамп базы
docker compose exec postgres pg_dump -U peertube peertube | gzip > /backup/peertube-db-$(date +%F).sql.gz

# файлы (если хранилище локальное, не S3)
rsync -a /opt/peertube/data/peertube/ /backup/peertube-data/

Если видео уже в S3-бакете, резервируется бакет отдельно средствами объектного хранилища — сам VPS с PeerTube в этом случае держит только базу и конфиг, что сильно упрощает восстановление после сбоя. Общий подход к бэкапу Docker-томов и частые ошибки разобраны в статье про бэкап Docker volume.

Обновление — смена тега образа и рестарт, миграции базы PeerTube применяет сам при старте:

docker compose pull peertube
docker compose up -d peertube
docker compose logs -f peertube

Перед обновлением на новую мажорную версию всегда делайте свежий дамп базы — миграции необратимы, откатиться можно только восстановлением из бэкапа.

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

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

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

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

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

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

Хватит ли 2 ГБ RAM для PeerTube?

Формально контейнеры стартуют, но при первой же заливке с включённым транскодингом в несколько разрешений сервер будет чувствовать себя тяжело или падать по OOM. 4 ГБ — реалистичный минимум для личного использования.

Можно ли отключить федерацию и P2P-раздачу?

Да, федерация с другими инстансами отключается в настройках одной опцией, а WebTorrent-раздачу между зрителями можно отключить в настройках проигрывателя — тогда PeerTube работает как обычный приватный видеохостинг.

Диск заканчивается быстрее, чем ожидалось — почему?

Транскодинг создаёт несколько копий каждого видео в разных разрешениях и HLS-фрагментах, плюс оригинал. Реальный расход диска в разы больше веса исходных файлов — планируйте это заранее или сразу используйте S3-хранилище.

Нужен ли отдельный email-сервер обязательно?

Нет, если регистрация закрыта и пользователей добавляет только администратор — SMTP нужен в основном для уведомлений и подтверждений при открытой регистрации.

Как перенести PeerTube на другой сервер?

Перенести дамп PostgreSQL, директорию data/peertube (или переключить S3-хранилище на новом сервере без переноса файлов) и .env/config — после разворачивания того же docker-compose набора на новом IP останется только обновить DNS-запись на домен.

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

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

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