Памятка по установке Peertube без лишней воды подробности можно посмотреть в ранее опубликованном посте Установка Peertube. Но в связи с переосмыслением и некоторых эксперементов сделал новую версию мануала, чтоб без путанницы и лишней информации. Да, многое будет не написано особенно про ошибки. В конце добавлю некоторую инфу про проблемы с которыми столкнулся при настройке и их решения. Короче это что то вроде копи-паста. Пост писал по мере установки на рабочий сервер, так что все пути будут сугубо под мой сервер. В конфигах некоторые строки будут заменены такие как ключи и пароли.
Я бы не сказал, что это какая то стандартная установка. Все подогнано под то что имеется на данный момент. Итак вводные данные:
Недавно накрылся старенький сервак выполняющий роль медиа-сервера, взял не менне старенькое железо под новый, так сказать из двух собрал один. Впринципе под такие домашние задачи, как раздача видео и стриминг на небольшую аудиторию, вполне я бы сказал потянет.
Локальный адрес сервера 192.168.30.33 на который накачу Peertube, так же помимо него в сети еще живут почтовый сервер и веб-сервер совмещающий в себе еще облачное хранение фото и видео с телефонов Immich. Это я к чему, веб сервер является основным и на нем не nginx , а apache2 ну вот так много лет назад было сделано. И он уже занял 80 и 443 порт, поэтому нужен будет обратный прокси apache2, а в большинстве мануалов все юзают nginx. Переделывать то что работает лень и некогда, вокруг столько еще много интересного и не поюзанного 😆
На серввере 192.168.30.33 уже все настроено крутятся Plex и Transmission пришлось заново все поднимать, благо записи, как это делать имеются. Соответственно все накатил на новую Debian 13.
Поскольку уже ранее поднимал сервак с Peertube. Доменное имя уже есть video.wildserver.ru. Виртуальный сервер Апача уже настроен, там только некоторые изменения и дополнения в конфиг внес, это все здесь будет. Сертификат SSL обновляется, короче есть.
Порты в маршрутизаторе на стрим проброшены, только поменял адрес сервака.
Установка Docker и Docker Compose
Скачать и запустить срипт установки:
curl -fsSL https://get.docker.com | sudo sh
Включить автозагрузку:
sudo systemctl enable --now docker
Добавить пользователя в группу docker:
sudo usermod -aG docker ИмяПользователя
Перелогинится или newgrp docker
Проверяем установку и работу
docker version
Client: Docker Engine - Community
Version: 28.4.0
API version: 1.51
Go version: go1.24.7
Git commit: d8eb465
Built: Wed Sep 3 20:57:38 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 28.4.0
API version: 1.51 (minimum version 1.24)
Go version: go1.24.7
Git commit: 249d679
Built: Wed Sep 3 20:57:38 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.27
GitCommit: 05044ec0a9a75232cad458027ca83437aae3f4da
runc:
Version: 1.2.5
GitCommit: v1.2.5-0-g59923ef
docker-init:
Version: 0.19.0
GitCommit: de40ad0
docker compose version
Docker Compose version v2.39.4
sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-09-22 19:32:34 MSK; 17min ago
Invocation: c1b8c60255cb48f09ae8a05c1e424a87
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 653911 (dockerd)
Tasks: 10
Memory: 23.5M (peak: 27.2M)
CPU: 684ms
CGroup: /system.slice/docker.service
└─653911 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Рабочая директория Peertube
mkdir /home/media/peertube
Создать файлы конфигурации Peertube
cd /home/media/peertube
docker-compose.yml
nano docker-compose.yml
services:
peertube:
# If you don't want to use the official image and build one from sources:
# build:
# context: .
# dockerfile: ./support/docker/production/Dockerfile.bookworm
image: chocobozzz/peertube:production-bookworm
# Use a static IP for this container because nginx does not handle proxy host change without reload
# This container could be restarted on crash or until the postgresql database is ready for connection
networks:
default:
ipv4_address: 172.18.0.42
# ipv6_address: 2001:db8:2::42
env_file:
- .env
environment:
- TZ=Europe/Moscow
ports:
- "1935:1935" # Comment if you don't want to use the live feature
- "9000:9000" # Uncomment if you use another webserver/proxy or test PeerTube in local, otherwise not suitable for production
volumes:
# Remove the following line if you want to use another webserver/proxy or test PeerTube in local
- assets:/app/client/dist
- ./docker-volume/data:/data
- ./docker-volume/config:/config
depends_on:
- postgres
- redis
- postfix
restart: "always"
postgres:
image: postgres:13-alpine
env_file:
- .env
environment:
- TZ=Europe/Moscow
volumes:
- ./docker-volume/db:/var/lib/postgresql/data
restart: "always"
redis:
image: redis:6-alpine
environment:
- TZ=Europe/Moscow
volumes:
- ./docker-volume/redis:/data
restart: "always"
postfix:
image: mwader/postfix-relay
env_file:
- .env
environment:
- TZ=Europe/Moscow
volumes:
- ./docker-volume/opendkim/keys:/etc/opendkim/keys
restart: "always"
networks:
default:
# enable_ipv6: false
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
# - subnet: 2001:db8:2::/64
volumes:
assets:
certbot-www:
Сохранить файл Ctrl+O Enter, закрыть Ctrl+X
.env
nano .env
# Database / Postgres service configuration
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
# Postgres database name "peertube"
POSTGRES_DB=peertube
# The database name used by PeerTube will be PEERTUBE_DB_NAME (only if set) *OR* 'peertube'+PEERTUBE_DB_SUFFIX
#PEERTUBE_DB_NAME=<MY POSTGRES DB NAME>
#PEERTUBE_DB_SUFFIX=_prod
# Database username and password used by PeerTube must match Postgres', so they are copied:
PEERTUBE_DB_USERNAME=$POSTGRES_USER
PEERTUBE_DB_PASSWORD=$POSTGRES_PASSWORD
PEERTUBE_DB_SSL=false
# Default to Postgres service name "postgres" in docker-compose.yml
PEERTUBE_DB_HOSTNAME=postgres
# PeerTube server configuration
# If you test PeerTube in local: use "peertube.localhost" and add this domain to your host file resolving on 127.0.0.1
PEERTUBE_WEBSERVER_HOSTNAME=video.wildserver.ru
# If you just want to test PeerTube on local
PEERTUBE_WEBSERVER_PORT=443
PEERTUBE_WEBSERVER_HTTPS=true
# If you need more than one IP as trust_proxy
# pass them as a comma separated array:
PEERTUBE_TRUST_PROXY=["127.0.0.1", "192.168.30.0/24"]
# Generate one using `openssl rand -hex 32`
PEERTUBE_SECRET=Вставить_сгенерированный_код
# E-mail configuration
# If you use a Custom SMTP server
PEERTUBE_SMTP_USERNAME=noreply@wildserver.ru
PEERTUBE_SMTP_PASSWORD=Пароль_от_аккаунта_почты
# Default to Postfix service name "postfix" in docker-compose.yml
# May be the hostname of your Custom SMTP server
PEERTUBE_SMTP_HOSTNAME=mail.sudakova.net
PEERTUBE_SMTP_PORT=25
PEERTUBE_SMTP_FROM=noreply@wildserver.ru
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_ADMIN_EMAIL=admin@wildserver.ru
Сохранить файл Ctrl+O Enter, закрыть Ctrl+X
Конфиг прокси сервера Апач
Подключился к основному серверу по SSH окрыл файл конфига sudo nano /etc/apache2/sites-available/video.wildserver.ru-le-ssl.conf
вставил следующее:
<VirtualHost *:80>
ServerName video.wildserver.ru
ServerAlias www.video.wildserver.ru
ServerAdmin admin@wildserver.ru
ErrorLog ${APACHE_LOG_DIR}/video.wildserver.ru.error.log
CustomLog ${APACHE_LOG_DIR}/video.wildserver.ru.access.log combined
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName video.wildserver.ru
ServerAlias www.video.wildserver.ru
ServerAdmin admin@wildserver.ru
ErrorLog ${APACHE_LOG_DIR}/video.wildserver.ru.error.log
CustomLog ${APACHE_LOG_DIR}/video.wildserver.ru.access.log combined
Protocols h2 h2c http/1.1
Include /etc/letsencrypt/options-ssl-apache.conf
SSLProxyEngine on
SSLCertificateFile /etc/letsencrypt/live/video.wildserver.ru/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/video.wildserver.ru/privkey.pem
# Современные SSL-шифры
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder on
SSLSessionTickets off
SSLUseStapling on
# Безопасность
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options SAMEORIGIN
Header always set X-Content-Type-Options nosniff
Header always set Referrer-Policy no-referrer-when-downgrade
Header always set X-XSS-Protection "1; mode=block"
Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
ProxyPreserveHost On
ProxyRequests Off
RequestHeader set X-Forwarded-Proto "https"
ProxyTimeout 900
KeepAliveTimeout 10
ProxyReceiveBufferSize 0
# PeerTube backend
ProxyPass "/" "http://192.168.30.33:9000/" enablereuse=on flushpackets=on keepalive=on upgrade=websocket
ProxyPassReverse "/" "http://192.168.30.33:9000/"
# Ограничение размера запросов
<LocationMatch "^/api/v1/videos/(upload|([^/]+/studio/edit))$">
Require all granted
<LimitExcept POST HEAD>
Require all denied
</LimitExcept>
LimitRequestBody 12884901888
Header set X-File-Maximum-Size 8G
</LocationMatch>
# API доступ
<Location /api/v1/users/me>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Authorization, Content-Type"
</Location>
# Раздача статики напрямую
DocumentRoot /home/media/peertube
Alias /client /home/media/peertube/peertube-latest/client/dist
<Directory "/home/media/peertube/peertube-latest/client/dist">
Header set Cache-Control "public, max-age=31536000, immutable"
</Directory>
</VirtualHost>
</IfModule>
Сохранить файл Ctrl+O Enter, закрыть Ctrl+X
Проверить конфиг sudo apachectl configtest
Перезапустить sudo systemctl restart apache2
или перезагрузить конфиги sudo systemctl reload apache2
Открыть порт для стрима в Peertube
sudo ufw allow 1935/tcp
Запуск Peertube
Запуск необходимо проводить из каталога с конфигами cd /home/media/peertube
docker compose up
Пойдут логи запущенного сервера, можно на них любовацо, но просто закрыть терминал и сделать новое подключение по SSH
Пароль от админки пользователя root Peertube
Посмотреть имена контейнеров docker ps
в моем случае контейнер с Peertube называется peertube-peertube-1
смотрим его логи, что бы узнать пароль пользователя root для входа и редактирования настроек уже на сайте через браузер.
docker compose logs peertube | grep -A1 root
Если что то пошло не так то так - grep -A1 root /home/media/peertube/docker-volume/data/logs/peertube.log
{"message":"Username: root","level":"info","label":"video.wildserver.ru:443","timestamp":"2025-09-22T15:28:25.337Z"}
{"message":"User password: venupucugotawuba","level":"info","label":"video.wildserver.ru:443","timestamp":"2025-09-22T15:28:25.338Z"}
Данные для входа есть, идем video.wildserver.ru Сразу меняем пароль и отображаемое имя root и включаем двухфакторную авторизацию.
Дополнительные улучшения сервера Peertube
sudo nano /etc/sysctl.conf
Добавить или исправить строки
vm.overcommit_memory = 1
net.core.somaxconn=511
Сохранить файл Ctrl+O Enter, закрыть Ctrl+X
sudo sysctl -p
vm.overcommit_memory = 1
→ чтобы Redis и Peertube не падали на нехватке памяти.net.core.somaxconn=511
→ чтобы больше TCP-соединений не отваливалось.sysctl -p
→ чтобы настройки заработали сразу.
Отключение двухфакторной авторизации Peertube
Доигрался с приложением двухфакторной авторизации на телефоне, что оно взбрыкнуло и мне было не попасть в админку. Ну и на тот случай если, что то , как всегда, пойдет не так 😆
Зайти в контейнер базы - docker exec -it peertube-postgres-1 psql -U postgres -d peertube
выполнить:
UPDATE "user"
SET "otpSecret" = NULL
WHERE username = 'root';
\q
Комментарии