Памятка по установке 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