PeerTube
Свой видеопортал для курсов, вебинаров и внутреннего видео компании. Развернули 8.3.0 на Fatmetal Cloud Server, залили лекцию 1080p и замерили то, о чем обычно не пишут: сколько диска съедает час видео и сколько длится транскодирование.
Вердикт
- онлайн-школам и корпоративному обучению: платите за сервер, а не за каждого преподавателя
- внутреннему видео - уровень приватности Internal виден только своим и не уходит в федерацию
- вебинарам с записью повтора и своему плееру без рекламы на своем домене
- переезду канала с YouTube: есть импорт роликов и синхронизация чужого канала
- кому нужен DRM - его нет, защита ограничена приватностью и паролем
- кому нужен контракт поддержки - вендору нечего продавать
- кто не готов планировать диск: час видео в полном профиле стоит 9.8 ГБ
- для одного домашнего архива кино - это Jellyfin, транскодирование тут лишнее
Что это и какую задачу решает
PeerTube - видеохостинг, который ставится на ваш сервер. Пользователи загружают ролики, сервер перекодирует их в несколько разрешений, зрители смотрят в браузере. Своя площадка вместо чужой.
Для компании это значит одно простое отличие от платных сервисов: мест не существует. Vimeo берет деньги за каждого сотрудника, который заливает видео. Здесь вы платите за сервер, и сколько на нем аккаунтов - его не касается.
Проект ведет французская некоммерческая ассоциация Framasoft. Лицензия AGPL-3.0 целиком: закрытых функций нет, enterprise-версии нет, облака вендора тоже нет. Зарабатывать на продукте никто не пытается - в своем FAQ авторы пишут прямо, что не делают на PeerTube денег.
Чем отличается от платных видеохостингов
Три коммерческих аналога считают деньги тремя разными способами, и это само по себе аргумент в пользу своего сервера при непредсказуемом трафике.
| Сервис | За что платите | Порог входа |
|---|---|---|
| PeerTube (self-host) | только сервер | 1100 руб/мес, мест нет |
| Vimeo | за место + потолок полосы | $12 / $25 / $75 за место в месяц, полоса 2 ТБ/мес на любом тарифе |
| Kinescope | подписка + гигабайты | от 10 евро/мес, трафик 0.03-0.01 евро/ГБ |
| Cloudflare Stream | минуты видео | $5/мес за 1000 минут хранения + $1 за 1000 отданных |
Цены сняты с сайтов вендоров 27 сентября 2026. Потолок полосы у Vimeo стоит отдельного внимания: 2 ТБ в месяц - это примерно 700-1000 часов просмотра 1080p, и дальше разговор с отделом продаж.
Чего у PeerTube нет и не будет: DRM, встроенной монетизации просмотров, CDN. Вместо CDN - P2P-раздача через браузеры зрителей и взаимное кэширование между дружественными серверами.
Тех-стек и что из чего состоит
Официальный compose поднимает семь контейнеров: само приложение на Node.js, PostgreSQL 17, Redis, собственный nginx, certbot для продления сертификата, перезагрузчик nginx и postfix для писем.
Вся процессорная нагрузка продукта - это ffmpeg. Ни Node, ни Postgres, ни Redis процессора не просят: вендор сам пишет, что вне транскодирования PeerTube не упирается в CPU.
Отдельная деталь для планирования: nginx в комплекте не декоративный. Он отдает видеофайлы напрямую, минуя приложение, и заменять его своим прокси без нужды не стоит.
Минимальная конфигурация
Вендор публикует требования в FAQ, а не в разделе установки, и разброс там восьмикратный.
| Официальный минимум | 1 vCore, 1.5 ГБ RAM, 20 Мбит/с |
| 1000 одновременных зрителей | 4 vCore, 4 ГБ RAM, 1 Гбит/с |
| Транскодирование на той же машине | 8 vCore, 8 ГБ RAM |
| Диск | «enough storage for videos» - оценки нет |
Разброс в восемь раз создает ровно одна функция - транскодирование. Его можно вынести на отдельную машину через remote runners, и тогда сам портал возвращается к четырем ядрам.
Наш выбор - CPU4-RAM8-DISK100. По памяти хватило бы и CPU2-RAM4-DISK50, но тариф здесь держат диск и процессор. Почему - в разделе с замерами.
В маркетплейсе Fatmetal
Не хотите ставить руками?
Этот стек есть в маркетплейсе Fatmetal - можно не повторять установку из этого разбора вручную. Заказываете сервер, за пару минут получаете рабочий сервис на своем домене, валидный TLS и файл с доступами.
Рекомендуемая конфигурация:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe от 990 ₽/мес
Развертывание на Fatmetal Cloud Server
Ubuntu 24.04, Docker из официального репозитория, compose из репозитория апстрима. Три шага требуют внимания - остальное типовое.
-
Включить IPv6 у демона Docker
Сеть в compose объявлена с
enable_ipv6. На чистом демоне стек просто не поднимется.echo '{"ipv6": true, "fixed-cidr-v6": "fd00:dead:beef::/48"}' \ | sudo tee /etc/docker/daemon.json sudo systemctl restart docker -
Задать домен до первого запуска
В
.envзаполняетсяPEERTUBE_WEBSERVER_HOSTNAME, пароль Postgres иPEERTUBE_SECRET. Имя должно быть окончательным - почему, читайте во врезке ниже. -
Выпустить первый сертификат руками
Контейнер certbot в составе стека занимается только продлением. Стартовый сертификат выпускается до подъема, пока порт 80 свободен.
sudo docker run --rm -p 80:80 \ -v "$PWD/docker-volume/certbot/conf:/etc/letsencrypt" \ certbot/certbot certonly --standalone -n --agree-tos \ -m you@example.com -d video.example.com -
Поднять стек и забрать пароль администратора
Пароль генерируется при первом старте и печатается в журнал.
sudo docker compose up -d sudo docker compose logs peertube | grep -A1 root
Домен фиксируется навсегда
Документация говорит буквально: PeerTube не поддерживает смену имени веб-сервера. Оно уезжает в федеративные идентификаторы и в базу. Поднять на IP и переехать на домен позже нельзя - только переставить с нуля.
Что измерили после запуска
| Стенд | CPU4-RAM8-DISK100, Ubuntu 24.04.4, Docker 29.8.1 |
| Версия | 8.3.0 (по ответу API, не по тегу образа) |
| Скачивание образов | 172 с (4.36 ГБ на семь образов) |
| Подъем стека | 85 с, включая миграции базы |
| От чистой машины до UI | ~6 минут |
| RAM в простое | 571 MiB весь стек, из них 507 MiB приложение |
| RAM под транскодированием | 1.25 ГБ на хосте |
| Ответ главной снаружи | 200 за 90 мс |
Образ PeerTube занимает на диске 3.05 ГБ, хотя Docker Hub показывает 706 МБ. Хаб показывает сжатый размер слоев - распакованный вчетверо больше.
Замеры сняты 27 сентября 2026 на версии 8.3.0. На других версиях и тарифах цифры будут другими.
Сколько на самом деле весит час видео
Главный расход у видеохостинга - не память, а диск. Вендор его не оценивает вовсе, поэтому мы залили реальный ролик и посчитали.
Эталон - лекция 3 минуты, 1080p, 5 Мбит/с, 107 МБ. Синтетику из генератора не брали: она сжимается нереалистично хорошо и занизила бы результат.
Расхожий тезис «PeerTube хранит видео в трех экземплярах» к умолчаниям не относится. Из коробки все дополнительные разрешения выключены, MP4-копий нет, исходник удаляется после обработки.
| Настройки | Диск на ролик | Коэффициент | Часов на DISK100 |
|---|---|---|---|
| Как ставится из коробки | 114 МБ | x1.02 | ~38 часов |
| Только лестница HLS | ~186 МБ | ~x1.65 | ~24 часа |
| Профиль курса: 4 разрешения + MP4 + исходник | 487 МБ | x4.33 | ~9 часов |
Раскладка полного профиля: исходник 113 МБ, лестница MP4 186 МБ, лестница HLS 186 МБ. Лестница считается дважды - отдельно для скачивания и отдельно для потокового просмотра.
Цифра воспроизводится: третья заливка того же файла дала ровно ту же дельту. Продукт, кстати, предупреждает об этом сам - прямо в настройках написано, что включение и HLS, и web-видео удваивает место.
Кончился диск - выносите видео в объектное хранилище. PeerTube умеет складывать в S3 раздельно исходники, MP4, HLS и субтитры.
Транскодирование: сколько ждать и что подкрутить
Та же лекция на трех минутах, четыре ядра 2.4 ГГц, полный профиль курса:
| Настройка | Время | К длительности ролика |
|---|---|---|
| threads = 1 (по умолчанию) | 433 с | x2.41 |
| threads = 4 | 317 с | x1.76 |
Из коробки стоит threads: 1. То есть транскодирование не использует ядра, за которые вы заплатили, и чинится это одним переключателем в админке.
Ускорение вышло всего в 1.37 раза, а не в четыре: задачи все равно идут по одной, и отдача от потоков внутри ffmpeg падает. При четырех потоках контейнер забирает 350% процессора из 400% доступных.
Преподаватель не ждет окончания обработки. Видео становится опубликованным через 35 секунд, как только готово исходное разрешение. Остальные качества досчитываются фоном еще шесть с половиной минут.
Приватность и вход для сотрудников
Регистрация на свежем инстансе закрыта по умолчанию - для корпоративного портала это верное умолчание, отдельно выключать нечего.
У каждого ролика свой уровень доступа. Работают все, мы проверили каждый на стенде:
| Уровень | Кто видит |
|---|---|
| Общедоступное | все, ролик уходит в федерацию |
| Внутреннее (Internal) | только вошедшие пользователи вашего сервера, в федерацию не уходит |
| Защищено паролем | кто знает пароль от конкретного видео |
| По ссылке / приватное | у кого есть ссылка / только автор |
Вход через корпоративный каталог делается плагинами из официального индекса: auth-ldap, auth-openid-connect, auth-saml2. Оговорка обязательная: плагины не вендорские, а community, и версии у них ранние - LDAP 0.2.0, SAML2 0.3.1. Перед внедрением это проверяют, а не принимают на веру.
Курс собирается плейлистом, а статистика по каждому ролику показывает удержание, страны, устройства и операционные системы зрителей.
Где может сломаться
Причина. Сеть в compose апстрима объявлена с IPv6 и внутренней подсетью, а демон Docker по умолчанию IPv6 не умеет.
Решение. Добавить "ipv6": true и fixed-cidr-v6 в /etc/docker/daemon.json и перезапустить демон. Маршрутизируемый IPv6 хосту при этом не нужен.
Ограничение встраивания по доменам заявлено, но у нас не заработало
В release notes 8.1 есть функция «разрешить встраивание только на указанных доменах». На свежем 8.3.0 мы ее не нашли: в интерфейсе правки видео такого поля нет ни на одной вкладке, а через API значение молча не меняется. Если функция для вас решающая - проверьте до внедрения.
P2P раскрывает IP зрителя
Плеер сам предупреждает: при раздаче через браузеры технические данные, включая публичный IP, видны другим участникам. Для внутреннего портала P2P разумно выключить - экономии на полусотне зрителей он все равно не дает.
Почтовый контейнер в комплекте есть, но полагаться на него не стоит
Свой postfix идет в составе стека. Письма с чистого адреса VPS без обратной зоны и согласованных SPF с DKIM уезжают в спам. Мы указали внешний SMTP - письмо о сбросе пароля дошло за секунду.
Безопасность и обновления
Что закрыть перед боевым запуском:
- Пароль администратора. Автоматический пароль лежит в журнале - смените через
npm run reset-password -- -u root. - Секреты. В
.envобязательно своиPOSTGRES_PASSWORDиPEERTUBE_SECRET, а не значения из примера. - Порты. Наружу смотрят 80, 443 и 1935 для приема трансляций. Не нужны эфиры - закройте 1935.
- Бэкап. База PostgreSQL плюс каталог с видео. Второй растет быстрее всего.
Обновление - docker compose pull и пересоздание контейнеров, но сперва читайте release notes. Переход на 8.3 требует ручного запуска скрипта миграции уже после старта, а начиная с этой версии обязателен PostgreSQL 14 или новее.
В 8.3.0 заметная часть работы ушла в безопасность: блокировка аккаунта при переборе пароля с разных адресов, письмо о входе с нового устройства, ограничение частоты запросов на жалобы и комментарии.
Связь с другими стеками
- Owncast - только живой эфир и чат, один бинарь вместо семи контейнеров. Нужны трансляции без загрузки роликов - берите его.
- Jellyfin - раздача вашей готовой медиатеки вам же. Ни транскодирования по загрузке, ни аккаунтов для посторонних.
- Keycloak - если корпоративный вход строится всерьез, провайдер OIDC живет отдельно, а PeerTube подключается плагином.
Когда это НЕ ваш выбор
Нужен DRM
Защита ограничена приватностью, паролем и настройками встраивания. От записи экрана это не спасает. Нужен настоящий DRM - смотрите в сторону Kinescope, у Vimeo и Wistia его тоже нет.
Нужен телефон поддержки
Контракт с SLA купить не у кого: над продуктом работают два штатных разработчика некоммерческой ассоциации, и продавать им нечего.
Видео много, а администратора нет
Это не «поставил и забыл». Диск, транскодирование, обновления и модерация - постоянная работа, пусть и небольшая.
Частые вопросы
Хватит ли CPU2-RAM4-DISK50?
По памяти - с запасом, весь стек в простое занимает 571 MiB. Упретесь в диск: 50 ГБ - это около четырех часов видео в полном профиле.
Можно поставить без Docker?
Да, вендор даже считает установку из релизного архива рекомендованной. Docker воспроизводимее, мы ставили им.
Обязательно ли включать федерацию?
Нет, она выключается целиком. Для внутреннего портала так обычно и делают - тогда PeerTube работает как обычный видеохостинг.
Можно перенести канал с YouTube?
Да, есть импорт роликов по ссылке и синхронизация канала - старый канал при этом закрывать не нужно.
Есть ли автоматические субтитры?
Да, расшифровка речи встроена с версии 6.2, рядом с плеером появляется панель с текстом. На русском мы ее не проверяли.
Что бэкапить?
Базу PostgreSQL и каталог с видеофайлами. Второй и есть основной объем.
Сколько полосы экономит P2P?
Не знаем - нужны десятки одновременных зрителей, мы столько не собирали. Заявление вендора есть, нашей цифры нет.
Итог
PeerTube закрывает корпоративное видео целиком: приватность до уровня «только свои и без федерации», вебинары с записью, субтитры, статистика удержания и плеер без рекламы на своем домене. Платите за сервер, а не за преподавателей. Планировать нужно диск: из коробки час видео стоит примерно 2.3 ГБ, в полном профиле курса - 9.8 ГБ. Домен выбирайте один раз и навсегда, IPv6 демону включите заранее, а threads поднимите до числа ядер.
Рекомендуемая конфигурация для установки:
4 vCPU · 8 ГБ RAM · 100 ГБ NVMe
Не хотите устанавливать вручную?
Запустите PeerTube на этой конфигурации автоматически - от 990 ₽/мес.
Этот стек у нас запущен на тарифе CPU4-RAM8-DISK100. Нашли ошибку в гайде - напишите, поправим в течение дня.