Передовые виртуальные и выделенные серверы для проектов любой сложности и структуры.
 Подписывайтесь на Telegram канал!

Установим и настроим децентрализованную платформу для организации видеохостинга и видеовещания под названием PeerTube на системe Rocky Linux. Лучший вариант для организации хранения и использования своих видеофайлов. Сети распространения контента на базе P2P-коммуникаций.

Предисловие

В современном мире сделать видеозапись не составляет никакого труда. Все сложности возникают когда надо поделится видео и выбрать место где хранить видеофайлы. Вариант с выгрузкой видео на «бесплатные» ресурсы я исключил сразу. Мне необходима 100% гарантия сохранности данных и удобное использование ресурса без сюрпризов.

Не знаю как вы, но я не могу больше смотреть этот рекламный бред который размещают в видеороликах.

Мои требования для организации базы видеофайлов были следующие:

  • Общий сервер куда пользователи могут загружать и просматривать видеофайлы,
  • Система администрирования как самой системы так и прав пользователей,
  • Удобный поиск нужных видео,
  • Обработка видеофайлов на самом сервере,
  • Загрузка видео по прямой ссылке на видео,
  • Добавление видео используя торрент-файл.

Все эти требования с легкостью осуществляет PeerTube.

Мне не надо теперь сидеть и часами обрабатывать видео для получения нужного качества и размера видеофайла. Например, при загрузке фидеофайла снятого на мобильном телефоне и имеющего общий размер в районе 8 Гиб я получаю на выходе видеофайл размером в районе 1,5 Гиб без потери качества видео.

Система активно развивается и с каждым выпуском возможности только расширяются.

Становитесь пользователями PeerTube и вы никогда об этом не пожалеете.

Системные требования

Почти сразу после публикации статьи сразу в комментариях появился вопрос о системных требованиях данного сервиса.

Почему я сразу не написал про параметры системы не могу сказать, но мысль проскакивала. Коментарии важны так как получаешь обратную связь и это вызывает желание дополнять или редактировать статью в будущем.

Для работы системы в режиме просмотра много ресурсов не надо, но вот когда происходит загрузка видео и идет последующее транскодирование в другие разрешения время обработки сильно зависит от ресурсов железа.

Исходные данные тестирования:

  • Система работает в виртуальной машине под управлением Proxmox c процессором Intel(R) Xeon(R) CPU E5620 @ 2.40GHz, DDR3, обычные HDD;
  • Во время всего тестирования пользователи активно пользовались системой в режиме просмотра ( 3-5 );
  • Для тестирования был выбран видеофайл размером 7.8 Гиб с разрешением 1920х816.

Никаких проблем с работой в системе пользователи не заметили на протяжении всего периода тестов.

Сводная таблица времени транскодирования:

Intel(R) Xeon(R) CPU E5620 @ 2.40GHz, DDR3 Время транскодирования 816p Время транскодирования 480p
2 ядра и 4 Гиб памяти 2 часа 45 минут 1 час
8 ядер и 8 Гиб памяти 1 час 10 минут 30 минут

Вот такие параметры были в системе мониторинга Zabbix:

peertube_sevo44_zabbix

Самое приятное видеть как уменьшился размер видеофайла без потери качества. Вместо 7.8 Гиб стал 1.7 Гиб!

peertube_sevo44_codec

Раньше лежал у меня фильм и занимал места 7.8 Гиб и не важно в каком разрешении и на чем я его смотрел он качался всегда целиком. Теперь у меня два файл которые в сумме дают примерно 2.5 Гиб что почти в три раза меньше чем было. Смотрю на большом экране качается 1.7 Гиб, смотрю на мобильном телефоне качает 950 Миб. Можно транскадировать ещё в другие форматы и это все равно будет меньше чем был оригинал. Чудеса да и только 🙂

Предварительная подготовка

Написание статьи базировалось на официальной документации PeerTube в которой всё хорошо изложено и описано.

Установка Rocky Linux 8

Политика поддержки CentOS 8 поменялась и пока не могу однозначно сказать хорошо это или плохо, но лично у меня с ней стали возникать некоторые сложности. Хорошо что основатель CentOS взялся за разработку Rocky Linux которая будет развиваться в лучших традициях CentOS до момента перехода на Stream.

Подробно про установку и начальную настройку вы можете узнать в моей статье Rocky Linux 8 установка и настройка.

Подключение репозитория Epel

Подключаем и обновляем систему

dnf install epel-release dnf-utils
dnf update

Установка yarn и nodejs

Устанавливаем Nodejs 14 версии

dnf module install -y nodejs:14

Проверка по команде (у нужного должно стоять E)

dnf module list nodejs

Устанавливаем Yarn

Рекомендуется устанавливать Yarn через менеджер пакетов npm, который поставляется в комплекте с Node.js когда вы устанавливаете его в своей системе.

npm install --global yarn
=== вывод команды ===

> yarn@1.22.11 preinstall /usr/local/lib/node_modules/yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

/usr/local/bin/yarn -> /usr/local/lib/node_modules/yarn/bin/yarn.js
/usr/local/bin/yarnpkg -> /usr/local/lib/node_modules/yarn/bin/yarn.js
+ yarn@1.22.11
added 1 package in 2.811s

which yarn
=== вывод команды ===
/usr/local/bin/yarn

Необходимо сделать символическую ссылку на запуск yarn, иначе будет ошибка при установке PeerTube

ln -s /usr/local/bin/yarn /usr/bin/yarn

Проверим установленные версии

yarn --version
=== вывод команды ===
1.22.11

node -v
=== вывод команды ===
v14.17.3
npm --version
=== вывод команды ===
6.14.13

Установка ffmpeg

Подключаем необходимый репозиторий и устанавливаем

dnf --enablerepo=powertools install -y SDL2 SDL2-devel
dnf install -y --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-8.noarch.rpm
dnf install -y ffmpeg
dnf update -y

Проверяем установленную версию

ffmpeg -version
=== вывод команды ===
ffmpeg version 4.2.4 Copyright (c) 2000-2020 the FFmpeg developers
built with gcc 8 (GCC)
и тд. и тп.

Установка Python

Установим необходимую версию

dnf install python3

Проверим версию Python

python3 --version
=== вывод команды ===
Python 3.6.8

Создадим необходимую символическую ссылку для работы youtube-dl

ln -s /usr/bin/python3 /usr/bin/python

Установка PostgreSQL

Установим сервер базы данных с несколькими необходимыми пакетами

dnf install postgresql postgresql-server postgresql-contrib openssl gcc-c++ make wget redis git

Инициализируем базу данных PostgreSQL

sudo PGSETUP_INITDB_OPTIONS='--auth-host=md5' postgresql-setup --initdb --unit postgresql
=== вывод команды ===
* Initializing database in '/var/lib/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Включим в автозагрузку и запустим PostgreSQL и Redis

systemctl enable --now redis
systemctl enable --now postgresql

Создание пользователя PeerTube

Создадим пользователя PeerTube с домашней папкой /var/www/peertube и создадим ему пароль

mkdir /var/www
useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
passwd peertube

Если потребуется удалить пользователя вместе с домашней папкой то выполните команду

userdel -r peertube

Создание базы данных PeerTube

Заходим под пользователем postgres

root@video.sevo44.loc ~ # sudo -i -u postgres
[postgres@video ~]$

Создаём базу данных и пользователя

createuser -P peertube
createdb -O peertube -E UTF8 -T template0 peertube_prod

Включаем расширения, необходимые для работы PeerTube

psql -c "CREATE EXTENSION pg_trgm;" peertube_prod
=== вывод команды ===
CREATE EXTENSION
psql -c "CREATE EXTENSION unaccent;" peertube_prod
=== вывод команды ===
CREATE EXTENSION

Поверяем правильность создания базы данных

psql
postgres=# \l
                                    Список баз данных
      Имя      | Владелец | Кодировка | LC_COLLATE  |  LC_CTYPE   |     Права доступа     
---------------+----------+-----------+-------------+-------------+-----------------------
 peertube_prod | peertube | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 postgres      | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | 
 template0     | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
               |          |           |             |             | postgres=CTc/postgres
 template1     | postgres | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres          +
               |          |           |             |             | postgres=CTc/postgres
(4 строки)

Не спешим выходить из под пользователя postgres. Создадим пароль для главного администратора базы данных иначе в последствии при смене прав доступа к базе система будет просить внести пароль которого у нас нет.

\password

Выходим на пользователя root

postgres=# \q
[postgres@video ~]$ exit
выход
root@video.sevo44.loc ~ #

Проверяем подключение к базе данных из под пользователя root

psql -U peertube -d peertube_prod
=== вывод команды ===
psql: ВАЖНО:  пользователь "peertube" не прошёл проверку подлинности (Peer)

Подключение не прошло. Необходимо настроит права доступа к базам данных.

Выполняем настройку доступа к SQL-серверу, разрешив доступ только с localhost по паролю

vim /var/lib/pgsql/data/pg_hba.conf
=== необходимые изменения ===
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     password
# IPv4 local connections:
host    all             all             127.0.0.1/32            password
# Настройка необходимая для обновления PeerTube используя скрипт обновления
host    all             all             ::1/128                 password
# IPv6 local connections:
#host    all             all             ::1/128                 ident
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     all                                     peer
#host    replication     all             127.0.0.1/32            ident
#host    replication     all             ::1/128                 ident

Перегружаем сервис и проверяем подключение к базе данных

systemctl restart postgresql
psql -U peertube -d peertube_prod
=== вывод команды ===
Пароль пользователя peertube: ПАРОЛЬ
psql (10.14)
Введите "help", чтобы получить справку.

peertube_prod=> \q  ВЫХОДИМ
root@video.sevo44.loc ~ #

Соединение по паролю прошло успешно.

Настройка FirewallD

Откроем необходимые порты для доступа к серверу, удалим ненужные и применим правила

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --permanent --zone=public --add-service=zabbix-agent
firewall-cmd --permanent --zone=public --add-port=1935/tcp
firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
firewall-cmd --permanent --zone=public --remove-service=cockpit
firewall-cmd --reload

Проверим параметры доступа

firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources: 
services: http https ssh zabbix-agent
ports: 1935/tcp
protocols: 
forward: no
masquerade: no
forward-ports: 
source-ports: 
icmp-blocks: 
rich rules:

Более подробно по работе с FirewaalD можно из статьи FirewallD базовая настройка.

Установка Peertube

Посмотрим какая будет установлена версия PeerTube

VERSION=$(curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest | grep tag_name | cut -d '"' -f 4) && echo "Latest Peertube version is $VERSION"
=== Вывод ===
Latest Peertube version is v3.4.0

Откроем домашний каталог пользователя peertube, создадим несколько необходимых каталогов и назначим необходимые права

cd /var/www/peertube
sudo -u peertube mkdir config storage versions
sudo -u peertube chmod 750 config/

Загрузим последнюю версию клиента Peertube, разархивируем ее и удалим архив zip

cd /var/www/peertube/versions
sudo -u peertube wget -q "https://github.com/Chocobozzz/PeerTube/releases/download/${VERSION}/peertube-${VERSION}.zip"
sudo -u peertube unzip peertube-${VERSION}.zip && sudo -u peertube rm peertube-${VERSION}.zip

Установим Peertube

cd /var/www/peertube
sudo -u peertube ln -s versions/peertube-${VERSION} ./peertube-latest
cd ./peertube-latest
sudo -H -u peertube yarn install --production --pure-lockfile
=== вывод команды ===
yarn install v1.22.11
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
[4/5] Linking dependencies...
warning " > @typescript-eslint/eslint-plugin@4.29.3" has unmet peer dependency "@typescript-eslint/parser@^4.0.0".
warning " > marked-man@0.7.0" has incorrect peer dependency "marked@^0.7.0".
warning "swagger-cli > @apidevtools/swagger-cli > @apidevtools/swagger-parser@10.0.3" has unmet peer dependency "openapi-types@>=7".
[5/5] Building fresh packages...
$ test -n "$NOCLIENT" || (cd client && yarn install --pure-lockfile)
yarn install v1.22.11
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
warning " > @ng-bootstrap/ng-bootstrap@10.0.0" has incorrect peer dependency "rxjs@^6.5.5".
warning " > @ngx-i18nsupport/tooling@8.0.3" has incorrect peer dependency "@angular/common@^8.0.0".
warning " > @ngx-i18nsupport/tooling@8.0.3" has incorrect peer dependency "@angular/core@^8.0.0".
warning " > angular2-hotkeys@2.3.2" has incorrect peer dependency "rxjs@^5.5.0 || ^6.0.0".
warning " > angularx-qrcode@11.0.0" has incorrect peer dependency "@angular/core@^11.0.6".
warning " > bootstrap@4.6.0" has unmet peer dependency "jquery@1.9.1 - 3".
warning " > bootstrap@4.6.0" has unmet peer dependency "popper.js@^1.16.1".
warning " > linkifyjs@2.1.9" has unmet peer dependency "jquery@>= 1.11.0".
warning " > linkifyjs@2.1.9" has unmet peer dependency "react@>= 0.14.0".
warning " > linkifyjs@2.1.9" has unmet peer dependency "react-dom@>= 0.14.0".
warning " > ngx-uploadx@4.1.3" has incorrect peer dependency "rxjs@^6.3.0".
warning " > primeng@12.1.0" has incorrect peer dependency "rxjs@^6.0.0".
[4/4] Building fresh packages...
Done in 67.18s.
Done in 169.82s.

В выводе пугают ошибки, но это не критично. Поискав информацию в интернете нашел ответ на данный вопрос на форуме разработчиков программы.

Вот перевод ответа: «Если вы имеете в виду все предупреждения Yarn, вы можете их игнорировать. Насколько я понимаю, это проблема Yarn, и она будет исправлена ​​в следующей версии.»

Конфигурация PeerTube

Создаем файл конфигурации с шаблона

cd /var/www/peertube && sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml

Произведем настройку указав свои параметры

vim /var/www/peertube/config/production.yaml
=== необходимые блоки для настройки ===
# Correspond to your reverse proxy server_name/listen configuration
webserver:
  https: true 
  hostname: 'video.sevo44.ru' # sevo44
  port: 443
 
# Your database name will be database.name OR "peertube"+database.suffix
database:
  hostname: 'localhost'
  port: 5432
  ssl: false
  suffix: '_prod'
  username: 'peertube'
  password: 'password' # sevo44
  pool:
    max: 5
 
# SMTP server to send emails
smtp:
  # smtp or sendmail
  transport: smtp
  # Path to sendmail command. Required if you use sendmail transport
  sendmail: null 
  hostname: smtp.yandex.ru # sevo44
  port: 465 # If you use StartTLS: 587
  username: 'video@sevo44.ru' # sevo44
  password: 'password'      # sevo44
  tls: true # If you use StartTLS: false
  disable_starttls: false
  ca_file: null # Used for self signed certificates
  from_address: 'video@sevo44.ru'  # sevo44

В настройках мы указали доменное имя на котором будет работать ресурс, параметры для работы почты через сторонний smtp.

Остальные параметры можно не править, так как при работе будет создан файл /var/www/peertube/config/local-production.json в котором будут указаны все параметры которые делаются в панели администратора.

Настройка Nginx

Как правило все инструкции пишутся с учетом того что у вас на статическом внешнем ip адресе работает сервер только с этим ресурсом. На практике такое случается крайне редко и на одном IP может работать разное количество ресурсов работающих как веб север.

Приведу пример как производится проксирования сигнала до PeerTube средствами Nginx.

Ни в коем случае не пытайтесь настроить работу PeerTube на http так как будут глюки в работе как в отображении информации так и задержка при просмотре видео. Сервис заточен под работу на https и адаптировать его под работу http нет смысла. Проще добавить сертификат ssl. О том как это сделать узнаете ниже.

Более подробно про то как работать с Nginx вы можете из статьи NGINX установка и настройка.

Установка Nginx

Подключаем официальный стабильный репозиторий разработчиков Nginx и устанавливаем

vim /etc/yum.repos.d/nginx.repo
=== необходимый код ===
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

dnf install nginx

Сделаем копию и изменим главный файл настройки Nginx

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig

vim /etc/nginx/nginx.conf
=== необходимый код ===
# Пользователь и группа, от имени которых будет запущен процесс
user peertube;
 
# Число воркеров в новых версиях рекомендовано устанавливать параметр auto
worker_processes auto;
 
# Уровни лога debug, info, notice, warn, error, crit, alert или emerg
# перечислены в порядке возрастания важности. При установке определённого уровня
# в лог попадают все сообщения указанного уровня и уровней большей важности. 
# Например, при стандартном уровне error в лог попадают сообщения уровней error, crit, alert и emerg. 
# Если параметр не задан, используется error. 
error_log /var/log/nginx/error.log warn;
 
# Файл в котором будет храниться идентификатор основного процесса
pid /var/run/nginx.pid;
 
events {
# Максимальное количество соединений одного воркера
worker_connections 1024;
# Метод выбора соединений (для FreeBSD будет kqueue)
use epoll;
# Принимать максимально возможное количество соединений
multi_accept on;
}
 
http {
# Отключить вывод версии nginx в ответе
server_tokens off;
 
# Указываем файл с mime-типами и указываем тип данных по-умолчанию
include /etc/nginx/mime.types;
default_type application/octet-stream;
 
# Формат для лога доступа и путь к файлу
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
 
# Метод отправки данных sendfile эффективнее чем read+write
sendfile on;
 
# Ограничивает объём данных, который может передан за один вызов sendfile(). 
# Нужно для исключения ситуации когда одно соединение может целиком захватить воркер
sendfile_max_chunk 128k;
 
# Отправлять заголовки и начало файла в одном пакете
tcp_nopush on;
tcp_nodelay on;
 
# Параметр задаёт тайм аут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера
keepalive_timeout 65;
 
# Сбрасывать соединение если клиент перестал читать ответ
reset_timedout_connection on;
 
# Разрывать соединение по истечению тайм аута при получении заголовка и тела запроса
client_header_timeout 3;
client_body_timeout 5;
 
# Разрывать соединение, если клиент не отвечает в течение 3 секунд
send_timeout 3;
 
# Задание буфера для заголовка и тела запроса
client_header_buffer_size 2k;
client_body_buffer_size 256k;
 
# Ограничение на размер тела запроса
client_max_body_size 8G;
 
# Подключение дополнительных конфигов
include /etc/nginx/conf.d/*.conf;
}

Мы специально указали пользователя peertube так как сервер создан для работы одного ресурса.

Добавим в автозагрузку и запустим сервис Nginx

systemctl enable --now nginx

Обязательно назначаем необходимого пользователя, иначе не будет простой загрузки видео

chown -R peertube:root /var/lib/nginx

Для того чтобы не запутаться и не делать лишних телодвижений необходимо следовать такому плану:

  1. Получаем сертификат для сервера PeerTube на проксирующем сервере;
  2. Создаём файл настройки на проксирующем сервере;
  3. Копируем сертификаты на сервер с PeerTube;
  4. Создаем файл Nginx для PeerTube.

В статье всё будет по такому плану.

О том как получать бесплатные сертификаты от Let’s Encrypt можно из статьи SSL бесплатный для сайта Nginx.

Nginx для проксирования PeerTube

На проксирующем сервере создаём необходимый файл

vim video-video.sevo44.ru.conf
=== необходимый код ===
### ssl video.sevo44.ru
server {
listen 80;
server_name video.sevo44.ru;
return 301 https://$server_name$request_uri; # редирект обычных запросов на https
}

server {
#listen 80;
listen 443 ssl http2;
server_name video.sevo44.ru;

### ssl
ssl_certificate /etc/letsencrypt/live/video.sevo44.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/video.sevo44.ru/privkey.pem;

location /.well-known/acme-challenge/ {
root /etc/nginx/cert-renewal/;
}

location / {
proxy_pass https://192.168.0.116:443;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 8G;
client_body_buffer_size 128k;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

Проверяем и обновляем настройки Nginx

nginx -t
nginx -s reload

Nginx для PeerTube

Скопируем шаблон конфигурации

cp /var/www/peertube/peertube-latest/support/nginx/peertube /etc/nginx/conf.d/peertube.conf

Сделаем копию исходного файла и внесем необходимые правки в файл конфигурации

cp /etc/nginx/conf.d/peertube.conf /etc/nginx/conf.d/peertube.conf-orig

vim /etc/nginx/conf.d/peertube.conf
=== необходимый код с пометками ===
server {
  listen 80;
  listen [::]:80;
  server_name video.sevo44.ru; # sevo44

  # Для записи в log реальных ip  
  #192.168.0.101 адрес машины где работает proxy nginx
  set_real_ip_from 192.168.0.101;  
  real_ip_header X-Real-IP;

  access_log /var/log/nginx/video.sevo44.ru-80-access.log; # sevo44 
  error_log /var/log/nginx/video.sevo44.ru-80-error.log; # sevo44

# sevo44 Отключаем настройку для получения сертификата
#  location /.well-known/acme-challenge/ {
#    default_type "text/plain";
#    root /var/www/certbot;
#  }
 
  location / { return 301 https://$host$request_uri; }
}
 
server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name video.sevo44.ru; # sevo44

  # Для записи в log реальных ip
  #192.168.0.101 адрес машины где работает proxy nginx
  set_real_ip_from 192.168.0.101;
  real_ip_header X-Real-IP;

  access_log /var/log/nginx/video.sevo44.ru-443-access.log; # sevo44 
  error_log /var/log/nginx/video.sevo44.ru-443-error.log; # sevo44
 
  # For example with certbot (you need a certificate to run https)
  ssl_certificate      /etc/letsencrypt/live/video.sevo44.ru/fullchain1.pem; # sevo44
  ssl_certificate_key  /etc/letsencrypt/live/video.sevo44.ru/privkey1.pem;  # sevo44
 
  # Security hardening (as of 11/02/2018)
  ssl_protocols TLSv1.2; # TLSv1.3, TLSv1.2 if nginx >= 1.13.0
  ssl_prefer_server_ciphers on;
  # Remove ECDHE-RSA-AES256-SHA if you don't want compatibility with Android 4
  ssl_ciphers '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:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA';
  # ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0, not compatible with import-videos script
  ssl_session_timeout  10m;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off; # Requires nginx >= 1.5.9
  ssl_stapling on; # Requires nginx >= 1.3.7
  ssl_stapling_verify on; # Requires nginx => 1.3.7
  # HSTS (https://hstspreload.org), requires to be copied in 'location' sections that have add_header directives
  #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains";
 
  # Configure with your resolvers
  # resolver $DNS-IP-1 $DNS-IP-2 valid=300s;
  # resolver_timeout 5s;
 
  # Enable compression for JS/CSS/HTML bundle, for improved client load times.
  # It might be nice to compress JSON, but leaving that out to protect against potential
  # compression+encryption information leak attacks like BREACH.
  gzip on;
  gzip_types text/css application/javascript;
  gzip_vary on;
 
  # If you have a small /var/lib partition, it could be interesting to store temp nginx uploads in a different place
  # See https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_temp_path
  # client_body_temp_path /var/www/peertube/storage/nginx/;
 
# sevo44 Отключаем настройку для получения сертификата
#  location ^~ '/.well-known/acme-challenge' {
#    default_type "text/plain";
#    root /var/www/certbot;
#  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/client/(.*\.(js|css|png|svg|woff2|otf|ttf|woff|eot))$ {
    add_header Cache-Control "public, max-age=31536000, immutable";
 
    alias /var/www/peertube/peertube-latest/client/dist/$1;
  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/static/(thumbnails|avatars)/ {
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;
      return 204;
    }
 
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
    # Cache 2 hours
    add_header Cache-Control "public, max-age=7200";
 
    root /var/www/peertube/storage;
 
    rewrite ^/static/(thumbnails|avatars)/(.*)$ /$1/$2 break;
    try_files $uri /;
  }
 
  location / {
    proxy_pass http://127.0.0.1:9000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
    # This is the maximum upload size, which roughly matches the maximum size of a video file
    # you can send via the API or the web interface. By default this is 8GB, but administrators
    # can increase or decrease the limit. Currently there's no way to communicate this limit
    # to users automatically, so you may want to leave a note in your instance 'about' page if
    # you change this.
    #
    # Note that temporary space is needed equal to the total size of all concurrent uploads.
    # This data gets stored in /var/lib/nginx by default, so you may want to put this directory
    # on a dedicated filesystem.
    #
    client_max_body_size 8G;
 
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    send_timeout                600;
  }
 
  # Bypass PeerTube for performance reasons. Could be removed
  location ~ ^/static/(webseed|redundancy|streaming-playlists)/ {
    # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client
    set $peertube_limit_rate 800k;
 
    # Increase rate limit in HLS mode, because we don't have multiple simultaneous connections
    if ($request_uri ~ -fragmented.mp4$) {
      set $peertube_limit_rate 5000k;
    }
 
    # Use this with nginx >= 1.17.0
    # limit_rate $peertube_limit_rate;
    # Or this if your nginx < 1.17.0
    set $limit_rate $peertube_limit_rate;
    limit_rate_after 5000k;
 
    if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain charset=UTF-8';
      add_header 'Content-Length' 0;
      return 204;
    }
 
    if ($request_method = 'GET') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'Range,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
 
      # Don't spam access log file with byte range requests
      access_log off;
    }
 
    root /var/www/peertube/storage;
 
    # Use this in tandem with fuse-mounting i.e. https://docs.joinpeertube.org/#/admin-remote-storage
    # to serve files directly from a public bucket without proxying.
    # Assumes you have buckets named after the storage subdirectories, i.e. 'videos', 'redundancy', etc.
    #set $cdn <your S3-compatiable bucket public url mounted via fuse>;
    #rewrite ^/static/webseed/(.*)$ $cdn/videos/$1 redirect;
    #rewrite ^/static/redundancy/(.*)$ $cdn/redundancy/$1 redirect;
    #rewrite ^/static/streaming-playlists/(.*)$ $cdn/streaming-playlists/$1 redirect;
 
    rewrite ^/static/webseed/(.*)$ /videos/$1 break;
    rewrite ^/static/redundancy/(.*)$ /redundancy/$1 break;
    rewrite ^/static/streaming-playlists/(.*)$ /streaming-playlists/$1 break;
 
    try_files $uri /;
  }
 
  # Websocket tracker
  location /tracker/socket {
    # Peers send a message to the tracker every 15 minutes
    # Don't close the websocket before this time
    proxy_read_timeout 1200s;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:9000;
  }
 
  location /socket.io {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
 
    proxy_pass http://127.0.0.1:9000;
 
    # enable WebSockets
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

Обращаю внимание на указание параметров сертификата ssl. Указан путь /etc/letsencrypt/live/video.sevo44.ru который соответствует пути расположения как на сервере где получаем сертификат.

Копирование сертификата

Настроим копирование сертификата с сервера где получаем сертификаты на сервер с peertube. Настроим подключение к серверу по сертификату, создадим необходимый скрипт который будет выполнять всё что нам необходимо и добавим его в автоматические задания по расписанию на сервере.

Более подробно о том как настраивать механизм подключения по сертификаты можете найти в статье RSA или авторизация SSH по ключу.

Создадим сертификат на сервере где получаем сертификат:

ssh-keygen -t rsa -b 2048
= часть вывода команды =
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:SxosbJySnbLBFmJ8s6HVFzaulNct6Wo0vePLp+5aU/4 root@video.sevo44.loc
The key's randomart image is:
............

Скопируем на сервер с PeerTube открытую часть ключа:

ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 root@192.168.0.116
= вывод команды =
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.0.116's password: ! вводим пароль

Number of key(s) added: 1

Now try logging into the machine, with: "ssh -p '22' 'root@192.168.0.116'"
and check to make sure that only the key(s) you wanted were added.

Создадим скрипт который будет копировать необходимый сертификат и выполнять необходимые действия на удаленном сервере:

vim /root/sert-video.sevo44.ru.sh
= необходимый код =
#!/bin/bash

# создаём необходимые папки
ssh root@192.168.0.116 mkdir -p /etc/letsencrypt/archive/video.sevo44.ru
ssh root@192.168.0.116 mkdir -p /etc/letsencrypt/live/video.sevo44.ru

# копируем необходимые папки
rsync -avz -e 'ssh -p 22' /etc/letsencrypt/archive/video.sevo44.ru/ root@192.168.0.116:/etc/letsencrypt/archive/video.sevo44.ru/
rsync -avz -e 'ssh -p 22' /etc/letsencrypt/live/video.sevo44.ru/ root@192.168.0.116:/etc/letsencrypt/live/video.sevo44.ru/

# обновляем конфигурацию nginx
ssh root@192.168.0.116 nginx -s reload

Делаем скрипт исполнительным:

chmod +x /root/sert-video.sevo44.ru.sh

Добавляем скрипт в crontab для выполнения его автоматически:

# копируем ssl раз в неделю в полночь воскресенья
0 0 * * 0 root /root/sert-video.sevo44.ru.sh >/dev/null 2>&1

TCP/IP тюнинг для PeerTube

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

cp /var/www/peertube/peertube-latest/support/sysctl.d/30-peertube-tcp.conf /etc/sysctl.d/
sysctl -p /etc/sysctl.d/30-peertube-tcp.conf

Запуск PeerTube

Самая большая часть настройки позади и нам осталось настроить Systemd для управления сервисом.

Скопируем шаблон конфигурации Systemd

cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/

Посмотреть с какими настройками создалась служба можно выполнив команду

cat /etc/systemd/system/peertube.service
=== Вывод команды ===
[Unit]
Description=PeerTube daemon
After=network.target postgresql.service redis-server.service

[Service]
Type=simple
Environment=NODE_ENV=production
Environment=NODE_CONFIG_DIR=/var/www/peertube/config
User=peertube
Group=peertube
ExecStart=/usr/bin/npm start
WorkingDirectory=/var/www/peertube/peertube-latest
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=peertube
Restart=always

; Some security directives.
; Mount /usr, /boot, and /etc as read-only for processes invoked by this service.
ProtectSystem=full
; Sets up a new /dev mount for the process and only adds API pseudo devices
; like /dev/null, /dev/zero or /dev/random but not physical devices. Disabled
; by default because it may not work on devices like the Raspberry Pi.
PrivateDevices=false
; Ensures that the service process and all its children can never gain new
; privileges through execve().
NoNewPrivileges=true
; This makes /home, /root, and /run/user inaccessible and empty for processes invoked
; by this unit. Make sure that you do not depend on data inside these folders.
ProtectHome=true
; Drops the sys admin capability from the daemon.
CapabilityBoundingSet=~CAP_SYS_ADMIN

[Install]
WantedBy=multi-user.target

Скажем Systemd перезагрузить его конфигурацию

systemctl daemon-reload

Добавим в автозагрузку и запустим

systemctl enable --now peertube

Смотрим что происходит

journalctl -feu peertube
=== вывод команды ===

Вывод должен быть примерно такой

systemd[1]: Started PeerTube daemon.
 peertube[8873]: > peertube@3.4.0 start /var/www/peertube/versions/peertube-v3.4.0
 peertube[8873]: > node dist/server
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:10.426 info: Database peertube_prod is ready.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.405 info: Creating application account.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.418 info: Creating a default OAuth Client.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.424 info: Creating the administrator.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.471 info: Client id: mt3lxarek0no3oq36b7udsegwhv10gc4
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.471 info: Client secret: 14zuSP6aeMjhJ8AnLLfStkTeJD4l6mlD
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.520 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.670 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:22.671 info: Generating a RSA key...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.261 info: Username: root
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.261 info: User password: xelurocikokuyave
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.264 info: Using smtp.yandex.ru:465 as SMTP server.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.268 info: Testing SMTP server...
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.478 info: Secure connection established to 77.88.21.158:465 {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "network",
 peertube[8873]:   "localAddress": "192.168.0.116",
 peertube[8873]:   "localPort": 42528,
 peertube[8873]:   "remoteAddress": "77.88.21.158",
 peertube[8873]:   "remotePort": 465
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.602 info: User "video@sevo44.ru" authenticated {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "smtp",
 peertube[8873]:   "username": "video@sevo44.ru",
 peertube[8873]:   "action": "authenticated",
 peertube[8873]:   "method": "PLAIN"
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.603 info: Successfully connected to SMTP server.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.621 info: Cleaning HTML cache.
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.627 info: Connection closed {
 peertube[8873]:   "component": "smtp-connection",
 peertube[8873]:   "sid": "yKg9R1Vvcx0",
 peertube[8873]:   "tnx": "network"
 peertube[8873]: }
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.637 info: Server listening on localhost:9000
 peertube[8873]: [video.sevo44.ru:443] 2020-12-29 01:09:23.638 info: Web server: https://video.sevo44.ru

В выводе кода вы видите пароль от администратора сервиса! User password: xelurocikokuyave и больше его вывод никогда не покажет. Запишите его или потом сможете создать другой.

В выводе всё хорошо расписано и в случае ошибок сможете увидеть подсказки что не так настроено.

Настройка PeerTube

Настроек множество и описывать все не имеет смысла. Покажу те моменты на которые имеет смысл обратить особое внимание.

Настоятельно рекомендую для безопасности оставить главным администратором только пользователя root. Все главные параметры нет смысла менять часто а для обычного администрирования роли «Модератор» вполне достаточно.

Выбираем варианты как можно загружать видеофайлы.  Импорт с URL-адреса или торрент-файла очень удобен и отключать такую возможность не надо.

peertube_sevo44_01

К настройке транскодирования отнеситесь очень внимательно, так как от этого будет зависеть как скорость работы ресурса так и объем занятого пространства видеофайлами.

peertube_sevo44_02

В моем случае выбраны разрешения для транскодирования 480p и 1080p мне этого хватает. В случае если происходит загрузка видеофайла разрешением менее 480р транскодирования производится не будет и в системе будет только этот видеофайла. При загрузке видеофайла разрешением больше 1080р будет произведено транскодирование в форматы 480p и 1080р.

Чем больше форматов тем системе легче работать, но платить за это приходится размером дисков для видеофалов.

Главный параметр PeerTube

Спустя какое то время я стал замечать что объем хранилища видео стал сильно увеличиваться когда я стал более активно добавлять видео. Как влияет на объём выбор вариантов разрешения все понятно а вот с выбором формата я сразу не разобрался и включал оба параметра.

Теперь мои параметры выглядят так:

peertube_sevo44_webtorrent

При выводе информации понятно почему этот вариант гораздо предпочтительней.

Более подробно про параметры формата вывода можно прочитать в документации разработчика.

Расскажу что происходит на сервере когда включено оба параметра:

  1. После обработки видеофайл попадает в папку /var/www/peertube/storage/videos и имеет столько вариантов сколько вариантов разрешения вы выбрали;
  2. Потом видеофайлы попадают в папку /var/www/peertube/storage/streaming-playlists/hls и для каждого видео создаётся своя папка в которой помимо самих видеофайлов присутствуют технические файлы для работы с этой технологией.

Вот откуда идет двойное увеличение хранилища. В случае когда параметр «WebTorrent» выключен файлы всё равно во время транскодирования попадают в папку videos, но лишь временно на момент обработки файла. После окончания обработки файлы в папке videos удаляются.

Если после отключения параметра «WebTorrent» зайти и просто удалить файлы в папке videos то вы не сможете скачать видео которое было загружено с включением обоих параметров.

Обзор PeerTube

Особо расписывать нет смысла как работать в системе по причине понятного и дружественного интерфейса. Добавляйте пользователей создавайте каналы, закачивайте видео, подписывайтесь и получайте удовольствие от того что все ваше видео теперь находится в одном месте.

На фотках ниже вы увидите как система выглядит у меня.

Обновление PeerTube

В случае проблем в работе с некоторыми функциями PeerTube обновляйте если вышла новая версия.

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

Для обновления достаточно запустить скрипт который всё сделает автоматически.

Останавливаем сервис, переходим в нужное место и запускаем скрипт обновления

systemctl stop peertube
cd /var/www/peertube/peertube-latest/scripts
sudo -H -u peertube ./upgrade.sh

В конце выдаст информацию об изменениях сделанных в файле конфигурации по отношению к базовому.

В папке /var/www/peertube/config находится 3 файла:

  • default.yaml — базовая конфигурация. Обновляется после каждого обновления и имеет все настройки для новой версии;
  • local-production.json — настройки которые делаются в панели администратора и не меняются при обновлении версии;
  • production.yaml — настройки действующей версии.

Создадим копию файла из настроек что действуют на данный момент:

cp /var/www/peertube/config/production.yaml /var/www/peertube/config/production.yaml_old

Обновим из базовой новой конфигурации файл с настройками:

cp /var/www/peertube/config/default.yaml /var/www/peertube/config/production.yaml
= при вопросе пишем yes =

Обычно надо внести необходимые правки в следующих блоках:

# Correspond to your reverse proxy server_name/listen configuration (i.e., your public PeerTube instance URL)
webserver:
https: true
hostname: 'video.sevo44.ru'
port: 443

# Your database name will be database.name OR 'peertube'+database.suffix
database:
hostname: 'localhost'
port: 5432
ssl: false
suffix: '_prod'
username: 'peertube'
password: 'Sdthdfhdfhhf' 
pool:
max: 5

# SMTP server to send emails
smtp: 
# smtp or sendmail
transport: smtp
# Path to sendmail command. Required if you use sendmail transport
sendmail: null
hostname: smtp.yandex.ru
port: 465 # If you use StartTLS: 587
username: 'video@sevo44.ru'
password: 'tzZqAeu656ddsdfg2s6'
tls: true # If you use StartTLS: false
disable_starttls: false
ca_file: null # Used for self signed certificates
from_address: 'video@sevo44.ru'

# From the project root directory
storage:
tmp: '/var/www/peertube/storage/tmp/' # Use to download data (imports etc), store uploaded files before and during processing...
bin: '/var/www/peertube/storage/bin/'
avatars: '/var/www/peertube/storage/avatars/'
videos: '/var/www/peertube/storage/videos/'
streaming_playlists: '/var/www/peertube/storage/streaming-playlists/'
redundancy: '/var/www/peertube/storage/redundancy/'
logs: '/var/www/peertube/storage/logs/'
previews: '/var/www/peertube/storage/previews/'
thumbnails: '/var/www/peertube/storage/thumbnails/'
torrents: '/var/www/peertube/storage/torrents/'
captions: '/var/www/peertube/storage/captions/'
cache: '/var/www/peertube/storage/cache/'
plugins: '/var/www/peertube/storage/plugins/'
# Overridable client files in client/dist/assets/images:
# - logo.svg
# - favicon.png
# - default-playlist.jpg
# - default-avatar-account.png
# - default-avatar-video-channel.png
# - and icons/*.png (PWA)
# Could contain for example assets/images/favicon.png
# If the file exists, peertube will serve it
# If not, peertube will fallback to the default file
client_overrides: '/var/www/peertube/storage/client-overrides/'

Запускаем и смотрим информацию о сервисе

systemctl start peertube
journalctl -feu peertube

Без проблем прошли обновления 2.4.0 -> 3.0.0 -> 3.1.0 -> 3.2.1 -> 3.3.0 -> 3.4.0 -> 4.0.0 -> 4.1.0 -> 4.1.1

Переезд PeerTube

На новом сервере устанавливаем последнюю версию и переносим необходимые данные.

Обновлять версию на сервере с которого переезжаем нет необходимости. После переезда запускается скрипт обновления и всё обновится до необходимой версии.

При переносе на другой сервер нам необходимо перенести следующие данные:

  • Каталог /var/www/peertube/storage, в котором содержатся видео, миниатюры, предварительные просмотры и так далее,
  • Файл /var/www/peertube/config, содержащий конфигурацию,
  • База данных PostgreSQL (с использованием pg_dump).

Перед переездом останавливаем сервис на новом ресурсе

systemctl stop peertube

Копирование storage/ файлов

На сервере с которого переезжаем необходимо выполнить команду

# 1 вариант
sudo -u peertube rsync -avz /var/www/peertube/storage/ peertube@192.168.0.114:~/storage/

# 2 вариант
sudo -u peertube rsync -avz -e 'ssh -p 2222' /var/www/peertube/storage/ peertube@192.168.0.114:~/storage/

Вам нужно будет повторно запустить эту команду, если какие-либо файлы на старом сервере изменятся. Вот почему лучше использовать rsync.

Копирование конфигурации

Можно перенести файл а можно сделать необходимые правки на основе действующей конфигурации на старом сервере находящиеся в файле

cat /var/www/peertube/config/production.yaml

Копирование базы данных

На старом сервере делаем резервную копию базы данных и передаем на новый сервер

# 1 вариант
sudo -u peertube pg_dump -Fc peertube_prod > /tmp/peertube_prod-dump.db

# 2 вариант
sudo -i -u postgres
postgres@video:~$ pg_dump -Fc peertube_prod > /tmp/peertube_prod-dump.db
postgres@video:~$ exit
scp -P 2222 /tmp/peertube_prod-dump.db root@192.168.0.114:/tmp

На новом сервере разворачиваем базу данных

sudo -u postgres pg_restore -c -C -d postgres /tmp/peertube_prod-dump.db

Запуск после переноса PeerTube

Переходим в нужное место и запускаем скрипт обновления

cd /var/www/peertube/peertube-latest/scripts
sudo -H -u peertube ./upgrade.sh

После выполнения команды запускаем сервис и смотрим что происходит

systemctl start peertube
journalctl -feu peertube

При переносе для того чтобы не потерять данные которые появились во время переноса так же необходимо остановить сервис PeerTube.

Именинно поэтому я рекомендую вначале сделать тестовый переезд. Если все прошло хорошо останавливаем сервис с которого переезжаем, синхронизируем папку с данными, переносим заново базу данных и запускаем сервис после выполнения скрипта обновления.

Смена доменного имени PeerTube

При желании можно сменить доменное имя. После того как внесете правки в файл настройки PeerTube и поправите настройки Nginx необходимо выполнить следующие команды

cd /var/www/peertube/peertube-latest && su peertube 

[peertube@video peertube-latest]$ NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run update-host
=== вывод команды ===
> peertube@2.4.0 update-host /var/www/peertube/versions/peertube-v2.4.0
> node ./dist/scripts/update-host.js
 
Updating actors.
Updating actor http://video.sevo44.ru/video-channels/root_channel
Updating actor http://video.sevo44.ru/video-channels/sevo44_all
Updating actor http://video.sevo44.ru/accounts/root
Updating actor http://video.sevo44.ru/accounts/sevo44
Updating actor http://video.sevo44.ru/accounts/peertube
Updating video shares.
Updating video share http://video.sevo44.ru/videos/watch/9c178338-fa10-47b0-b2d1-f41af08179cc/announces/5
Updating video share http://video.sevo44.ru/videos/watch/9c178338-fa10-47b0-b2d1-f41af08179cc/announces/1
Updating video share http://video.sevo44.ru/videos/watch/c8dfa17f-ad7a-478a-83d0-6c53767f778a/announces/5
Updating video share http://video.sevo44.ru/videos/watch/c8dfa17f-ad7a-478a-83d0-6c53767f778a/announces/1
Updating video share http://video.sevo44.ru/videos/watch/2ef17574-dbc8-4111-936c-773c755141db/announces/5
Updating video share http://video.sevo44.ru/videos/watch/2ef17574-dbc8-4111-936c-773c755141db/announces/1
Updating video share http://video.sevo44.ru/videos/watch/753df8df-5bae-4bef-8d3c-5bb688a8c0fb/announces/5
Updating video share http://video.sevo44.ru/videos/watch/753df8df-5bae-4bef-8d3c-5bb688a8c0fb/announces/1
Updating video comments.
Updating video and torrent files.
Updating video 9c178338-fa10-47b0-b2d1-f41af08179cc
Updating torrent file 720 of video 9c178338-fa10-47b0-b2d1-f41af08179cc.
[video.sevo44.ru:443] 2020-12-28 00:35:39.659 info: Creating torrent /var/www/peertube/storage/torrents/9c178338-fa10-47b0-b2d1-f41af08179cc-720.torrent.
Updating video c8dfa17f-ad7a-478a-83d0-6c53767f778a
Updating torrent file 720 of video c8dfa17f-ad7a-478a-83d0-6c53767f778a.
[video.sevo44.ru:443] 2020-12-28 00:35:42.519 info: Creating torrent /var/www/peertube/storage/torrents/c8dfa17f-ad7a-478a-83d0-6c53767f778a-720.torrent.
Updating video 2ef17574-dbc8-4111-936c-773c755141db
Updating torrent file 720 of video 2ef17574-dbc8-4111-936c-773c755141db.
[video.sevo44.ru:443] 2020-12-28 00:35:45.303 info: Creating torrent /var/www/peertube/storage/torrents/2ef17574-dbc8-4111-936c-773c755141db-720.torrent.
Updating video 753df8df-5bae-4bef-8d3c-5bb688a8c0fb
Updating torrent file 304 of video 753df8df-5bae-4bef-8d3c-5bb688a8c0fb.
[video.sevo44.ru:443] 2020-12-28 00:35:51.759 info: Creating torrent /var/www/peertube/storage/torrents/753df8df-5bae-4bef-8d3c-5bb688a8c0fb-304.torrent.
[peertube@video peertube-latest]$

После успешного выполнения перезагрузите Nginx и PeerTube

nginx -s reload
systemctl start peertube

Смена пароля администратора PeerTube

Пароль администратора генерируется автоматически, его можно найти в журналах. Вы можете установить другой пароль с помощью следующей команды

cd /var/www/peertube/peertube-latest && NODE_CONFIG_DIR=/var/www/peertube/config NODE_ENV=production npm run reset-password -- -u root

Заключение

Долго лежала эта статья в черновиках и только после того как я все проверил и произвел несколько обновлений совесть позволила мне опубликовать статью.

Однозначно делайте резервную копию системы перед обновлением и тогда вам не страшны любые сюрпризы при обновлениях.

К сожалению обновление системы необходимо если вы хотите пользоваться всеми прелестями системы. В случае если вы планируйте производить простой вариант загрузки файлов и не использовать сеть P2P систему можно не обновлять.

За время использования много раз слышал спасибо от родни за то что теперь они могут без проблем смотреть семейное видео и делится им.

Больше всего ушло на то чтобы вытащить со всех щелей семейное видео и загрузит в одно место.

Понравилась статья? Поделитесь ей с друзьями!
Пожалуйста, оставляйте свои комментарии

Читая их я получаю информацию которая позволяет мне улучшить качество написания статей. Кроме того, оставляя комментарии вы помогаете сайту получить более высокий рейтинг у поисковых систем. Давайте общаться.

Один комментарий для статьи “PeerTube установка на Rocky Linux

  1. На этапе установки peertube

    sudo -H -u peertube yarn install --production --pure-lockfile

    выходит сообщение

    sudo: yarn: command not found
    1. Скорей всего пропустили в статье вот это:

      Необходимо сделать символическую ссылку на запуск yarn, иначе будет ошибка при установке PeerTube

      ln -s /usr/local/bin/yarn /usr/bin/yarn
  2. Ошибка запуска

    мар 22 20:46:17 localhost.localdomain peertube[70454]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=1/FAILURE
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
    мар 22 20:46:17 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Start request repeated too quickly.
    мар 22 20:46:17 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
    мар 22 20:46:17 localhost.localdomain systemd[1]: Failed to start PeerTube daemon.

    Что делать?

      1. [root@localhost ~]# journalctl -feu peertube
        -- Logs begin at Wed 2022-03-23 09:00:24 +07. --
        мар 23 09:01:03 localhost.localdomain systemd[1]: Started PeerTube daemon.
        мар 23 09:01:15 localhost.localdomain peertube[1439]: /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:182
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     throw new Error('Configuration property "' + property + '" is not defined');
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     ^
        мар 23 09:01:15 localhost.localdomain peertube[1439]: Error: Configuration property "smtp.hostname" is not defined
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Config.get (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:182:11)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/dist/server/initializers/config.js:39:26)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Module.load (internal/modules/cjs/loader.js:950:32)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Module.require (internal/modules/cjs/loader.js:974:19)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at require (internal/modules/cjs/helpers.js:93:18)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/dist/server/helpers/logger.js:10:18)
        мар 23 09:01:15 localhost.localdomain peertube[1439]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
        мар 23 09:01:15 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=1/FAILURE
        мар 23 09:01:15 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 1.
        мар 23 09:01:16 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
        мар 23 09:01:16 localhost.localdomain systemd[1]: Started PeerTube daemon.
        мар 23 09:01:16 localhost.localdomain peertube[4915]: /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:182
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     throw new Error('Configuration property "' + property + '" is not defined');
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     ^
        мар 23 09:01:16 localhost.localdomain peertube[4915]: Error: Configuration property "smtp.hostname" is not defined
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Config.get (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:182:11)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/dist/server/initializers/config.js:39:26)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Module.load (internal/modules/cjs/loader.js:950:32)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Module.require (internal/modules/cjs/loader.js:974:19)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at require (internal/modules/cjs/helpers.js:93:18)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/dist/server/helpers/logger.js:10:18)
        мар 23 09:01:16 localhost.localdomain peertube[4915]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=1/FAILURE
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 23 09:01:16 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 2.
        мар 23 09:01:16 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
        и дальше по кругу....
        
        1. Проверяйте файлы конфигурации. Вначале надо убрать вот эту ошибку.

          Error: Configuration property "smtp.hostname" is not defined
          1. Started PeerTube daemon.
            мар 23 17:02:25 localhost.localdomain peertube[2159]: /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:844
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     throw new Error("Cannot parse config file: '" + fullFilename + "': " + e3);
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     ^
            мар 23 17:02:25 localhost.localdomain peertube[2159]: Error: Cannot parse config file: '/var/www/peertube/config/production.yaml': YAMLException: bad indentation of a mapping entry (1:17)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:  1 | listen: hostname: 'localhost' port: 9000
            мар 23 17:02:25 localhost.localdomain peertube[2159]: ---------------------^
            мар 23 17:02:25 localhost.localdomain peertube[2159]:  2 |
            мар 23 17:02:25 localhost.localdomain peertube[2159]:  3 | # Correspond to your reverse proxy server_name/l ...
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Config.util.parseFile (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:844:11)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:644:26
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Array.forEach ()
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Config.util.loadFileConfigs (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:643:16)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at new Config (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:116:27)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:1492:31)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Module.load (internal/modules/cjs/loader.js:950:32)
            мар 23 17:02:25 localhost.localdomain peertube[2159]:     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=1/FAILURE
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
            мар 23 17:02:25 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Start request repeated too quickly.
            мар 23 17:02:25 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 17:02:25 localhost.localdomain systemd[1]: Failed to start PeerTube daemon.
            

            Одну убрал, теперь не могу понять, что он ругается на разметку ямл, первая строчка в конфиг файле у меня такая:
            listen: hostname: ‘localhost’ port: 9000
            Ругается на двоеточие или на пробел?

          2.  мар 23 17:16:36 localhost.localdomain systemd[1]: Started PeerTube daemon.
            мар 23 17:16:36 localhost.localdomain peertube[2621]: /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:844
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     throw new Error("Cannot parse config file: '" + fullFilename + "': " + e3);
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     ^
            мар 23 17:16:36 localhost.localdomain peertube[2621]: Error: Cannot parse config file: '/var/www/peertube/config/production.yaml': YAMLException: bad indentation of a mapping entry (3:7)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:  1 | listen:
            мар 23 17:16:36 localhost.localdomain peertube[2621]:  2 |   hostname 'localhost'
            мар 23 17:16:36 localhost.localdomain peertube[2621]:  3 |   port: 9000
            мар 23 17:16:36 localhost.localdomain peertube[2621]: -----------^
            мар 23 17:16:36 localhost.localdomain peertube[2621]:  4 |
            мар 23 17:16:36 localhost.localdomain peertube[2621]:  5 | # Correspond to your reverse proxy ser ...
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Config.util.parseFile (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:844:11)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at /var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:644:26
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Array.forEach ()
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Config.util.loadFileConfigs (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:643:16)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at new Config (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:116:27)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Object. (/var/www/peertube/versions/peertube-v4.1.1/node_modules/config/lib/config.js:1492:31)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Module._compile (internal/modules/cjs/loader.js:1085:14)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Module.load (internal/modules/cjs/loader.js:950:32)
            мар 23 17:16:36 localhost.localdomain peertube[2621]:     at Function.Module._load (internal/modules/cjs/loader.js:790:12)
            мар 23 17:16:36 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=1/FAILURE
            мар 23 17:16:36 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 17:16:37 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
            мар 23 17:16:37 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
            мар 23 17:16:37 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
            мар 23 17:16:37 localhost.localdomain systemd[1]: peertube.service: Start request repeated too quickly.
            мар 23 17:16:37 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 17:16:37 localhost.localdomain systemd[1]: Failed to start PeerTube daemon.
            

            На порт ругается?

          3. Заново создал файл конфигурации, запустился СПАСИБО

          4. А теперь следующие, nginx белая страница, проксирующего nginx нет. просмотрен настройки, вроде нигде не накосячил

            502 Bad Gateway

          5. попробовал сделать с 0

            мар 23 21:24:53 localhost.localdomain systemd[1]: Started PeerTube daemon.
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
            мар 23 21:24:53 localhost.localdomain systemd[1]: Stopped PeerTube daemon.
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Start request repeated too quickly.
            мар 23 21:24:53 localhost.localdomain systemd[1]: peertube.service: Failed with result 'exit-code'.
            мар 23 21:24:53 localhost.localdomain systemd[1]: Failed to start PeerTube daemon.
      2. c самого начала начал делать по инструкции,
        ошибка запуска

        мар 24 20:16:48 video systemd[1]: Started PeerTube daemon.
        мар 24 20:16:48 video systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
        мар 24 20:16:48 video systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 24 20:16:48 video systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 24 20:16:48 video systemd[1]: peertube.service: Scheduled restart job, restart counter is at 2.
        мар 24 20:16:48 video systemd[1]: Stopped PeerTube daemon.
        мар 24 20:16:48 video systemd[1]: Started PeerTube daemon.
        мар 24 20:16:48 video systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
        мар 24 20:16:48 video systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 24 20:16:48 video systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 24 20:16:48 video systemd[1]: peertube.service: Scheduled restart job, restart counter is at 3.
        мар 24 20:16:48 video systemd[1]: Stopped PeerTube daemon.
        мар 24 20:16:48 video systemd[1]: Started PeerTube daemon.
        мар 24 20:16:48 video systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
        мар 24 20:16:48 video systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 24 20:16:49 video systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 24 20:16:49 video systemd[1]: peertube.service: Scheduled restart job, restart counter is at 4.
        мар 24 20:16:49 video systemd[1]: Stopped PeerTube daemon.
        мар 24 20:16:49 video systemd[1]: Started PeerTube daemon.
        мар 24 20:16:49 video systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
        мар 24 20:16:49 video systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 24 20:16:49 video systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
        мар 24 20:16:49 video systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
        мар 24 20:16:49 video systemd[1]: Stopped PeerTube daemon.
        мар 24 20:16:49 video systemd[1]: peertube.service: Start request repeated too quickly.
        мар 24 20:16:49 video systemd[1]: peertube.service: Failed with result 'exit-code'.
        мар 24 20:16:49 video systemd[1]: Failed to start PeerTube daemon.

        Файл логов nginx пустой

        1. [root@video ~]# systemctl status peertube.service
          ● peertube.service - PeerTube daemon
             Loaded: loaded (/etc/systemd/system/peertube.service; enabled; vendor preset: disabled)
             Active: failed (Result: exit-code) since Thu 2022-03-24 20:16:49 +07; 40min ago
            Process: 69343 ExecStart=/usr/bin/node dist/server (code=exited, status=200/CHDIR)
           Main PID: 69343 (code=exited, status=200/CHDIR)
          
          мар 24 20:16:49 video systemd[1]: peertube.service: Main process exited, code=exited, status=200/CHDIR
          мар 24 20:16:49 video systemd[1]: peertube.service: Failed with result 'exit-code'.
          мар 24 20:16:49 video systemd[1]: peertube.service: Service RestartSec=100ms expired, scheduling restart.
          мар 24 20:16:49 video systemd[1]: peertube.service: Scheduled restart job, restart counter is at 5.
          мар 24 20:16:49 video systemd[1]: Stopped PeerTube daemon.
          мар 24 20:16:49 video systemd[1]: peertube.service: Start request repeated too quickly.
          мар 24 20:16:49 video systemd[1]: peertube.service: Failed with result 'exit-code'.
          мар 24 20:16:49 video systemd[1]: Failed to start PeerTube daemon.

          ругается на node, как быть?

          1. Или на другую систему ставите или не полностью выполняете всё что в статье написано.

          2. СПАСИБО за инструкцию!

            проблема была не nginx, проблема в selinux

  3. Вообщем тестили сервер под прямой эфир, было 350 одновременных зрителей, ширина канала 400мб/с был забит на все 100%. По статистике в плеере, примерно 20%трафика идет с сервера, 80% от пиров, есть возможность как то увеличить трафик от пиров, чтоб было до 100%.
    И еще вопрос, vps больше 400мб/с не дает, но есть возможность добавлять дополнительны ip адреса с такой же пропускной способностью. Например будет 3 ip c суммарным каналом 1.2 Гб/с. Как будет вести себя peertube если DNS будет давать пользователям рандомный ip из этих трех. Нагрузка разделится? Наша цель 3500 зрителей, как правильно реализовать. (пушим по RTMP 720p 4000kbps, без транскодирования на другие расширения)

    1. Не думаю что можно всю нагрузку передать на пиры, но 80% уже здорово. Попробуйте задать вопрос на их портале думаю они скажут возможно такое или нет.
      По моей статье настраивали?

    2. Здравствуйте Сергей, как дела сейчас обстоят, можно подробности этого теста, именно по железу, смогли вы настроить балансировщик нагрузки?
      Вы имели ввиду скорость 400мбайт или мбит?
      Latency ставили на 60 секунд?
      Лаги начались после 350 одновременных просмотров?
      Сам хочу запустить лайв но не решаюсь, так как не знаю пропорции.

      1. Канала в 1 Gбит хватает на 5-6 тысяч подключений (1080p). Мощность в районе 6 ядер по 2.5 G и памяти 18 DDR-3.
        При стриме ресурсы жрет только конвертация которая выставляется в админке.

        1. Спасибо, конвертация не важна, задумка поставить стрим на дефолтный 720р, единственное, что, так это в конце нужна запись стрима, по выданным вами данными, это огромная экономия, по таким характеристикам VPS можно брать на день(110₽), после стрима сохранить бэкап системы, чтобы в следующий раз не морочиться с настройкой системы.
          А в вашем случае была включена конвертация в другие разрешения, и ресурсы использовались взахлеб?

          1. Я пробовал без конвертации (в старой версии) и там была разница в форматах записанных стримов. С записью в новых версиях тоже все улучшили. Можно создать одну ссылку на постоянный стрим. Например, у меня одна ссылка на стрим её я редактирую меняя описание, картинку и тд. Когда стрим заканчивается у меня появляется запись с другой ссылкой.
            У меня включена конвертация в 720p 360p 144p я не скажу что система работала в захлёб…. Там какой-то хитрый механизм и система не падает от перегрузки…
            Система очень хорошо обновляется и в новых версиях все лучше и лучше всё.

          2. Понятно, по-вашему, приблизительно, какие характеристики железа нужны, скажем, для 10 тысяч подключений?
            Знаю, вопросов много было, но это последний по этой тематике.

          3. Нужен канал 10 Гигабит. К сожалению на одном из серверов такой канал подключили, но проверить под нагрузкой не вышло по причине того что проект помер. 5-7 тысяч держало на старой версии. В новой версии сделали настройки для трансляций и возможно с одной из настроек будет держать и больше 10 тысяч.

      1. по вашей инструкции
        https://sevo44.ru/ssl-besplatnyj-dlja-sajta-nginx/
        вот в этот конфиг
        ————————————————————————————-
        vim /var/www/peertube/config/production.yaml
        === необходимые блоки для настройки ===
        # Correspond to your reverse proxy server_name/listen configuration
        webserver:
        https: true
        hostname: ‘video.sevo44.ru’ # sevo44 —- сюда добавлял хост с www
        port: 443

        1. Через прокси сервер или напрямую? В конфиге что показали прописывается так а все что с сертификатом надо в другое место писать. Необходимо в файле конфигурации nginx добавлять сертификат.

  4. Если я зохочу установить внешний накопитель, то как указать чтоб все видео файлы сохранялись там?

    1. Монтируйте накопитель по пути /var/www/peertube/storage/. Пере тем как монтировать останавливайте сервис и временно все что есть в этой папке копируйте во временное место После того как смонтируйте возвращаете их назад. Не забываем смотреть права и разрешения на папки перед перестроением.

  5. Вам спасибо за опыт, статью и обратную связь! Я знал, что подобные сервисы ресурсы любят, особенно cpu и озу, поэтому когда прочитал статью и не увидел системных требований — посчитал статью не полной. Теперь всё отлично — с графиками даже больше информации, чем я ожидал 🙂

  6. Здравствуйте.
    Есть вопрос по системным требованиям для VPS/VDS под данный сервис. С HDD понятно, что чем больше, тем лучше. А остальное? Что скажите в общих чертах — про кол-во ядер, память и т.д. Лучше ставить на голое железо или подойдёт VM?
    Спасибо!

    1. В моем случае работает на VM с процессором 8 ядер Intel(R) Xeon(R) CPU E5620 @ 2.40GHz и 8 G оперативки DDR3. Количество ядер напрямую влияют на скорость транскодирования. Вначале выделял 2 ядра и 4G памяти система нормально работала в режиме просмотра, но вот транскадирование происходило долго. Причем я не могу сказать что при транскодировании были тормоза в режиме просмотра. Сейчас специально попробую загрузить файл с разными параметрами и скажу что вышло по времени.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *