Установка Peertube с обратным прокси сервером Apache2. PeerTube — это мощная, децентрализованная платформа для видеохостинга с открытым исходным кодом, позволяющая создать свой собственный видеопортал и стриминговый сервис.

Домен для Peertube

У регистратора доменных имен создать желаемый домен, для примера video.wildserver.ru

Получить сертификат Let’s Encrypt

Проверочный прогон:

sudo certbot certonly --dry-run -d video.wildserver.ru -d www.video.wildserver.ru

Получить сертификат:

sudo certbot certonly -d video.wildserver.ru -d www.video.wildserver.ru

Установка Docker compose

Docker compose

Установка Peertube

Создать каталог:

mkdir /home/sklad/peertube

Перейти в каталог

cd /home/sklad/peertube

Настройка docker-compose.yml Peertube

Скачать последнюю версию файла docker-compose.yml:

curl https://raw.githubusercontent.com/chocobozzz/PeerTube/master/support/docker/production/docker-compose.yml > docker-compose.yml

nano docker-compose.yml

Этот конфиг отредактирован с учетом того, как будет реализован сервер Peertube: Сервис certbot закомментирован поскольку сертификат будет получен для прокси сервера Apache2. Сервис webserver весь закомментирован поскольку будет работать веб сервер Apache2. Почтовые сообщения будут рассылаться через сервер SMTP, настройки которого будут указаны в файле .env. Так же можно сделать используя свой почтовый сервер, этот вариант рассматривать не буду. Выключить все что касается ipv6 ибо не поддерживается у меня.

services:

  # You can comment this webserver section if you want to use another webserver/proxy or test PeerTube in local
#  webserver:
#    image: chocobozzz/peertube-webserver:latest
    # If you don't want to use the official image and build one from sources:
    # build:
    #   context: .
    #   dockerfile: Dockerfile.nginx
#    env_file:
#      - .env
#    ports:
#     - "8080:80"
#     - "443:443"
#    volumes:
#      - type: bind
        # Switch sources if you downloaded the whole repository
        #source: ../../nginx/peertube
#        source: ./docker-volume/nginx/peertube
#        target: /etc/nginx/conf.d/peertube.template
#      - assets:/var/www/peertube/peertube-latest/client/dist:ro
#      - ./docker-volume/data:/var/www/peertube/storage
#      - certbot-www:/var/www/certbot
#      - ./docker-volume/certbot/conf:/etc/letsencrypt
#    depends_on:
#      - peertube
#    restart: "always"

  # You can comment this certbot section if you want to use another webserver/proxy or test PeerTube in local
#  certbot:
#    container_name: certbot
#    image: certbot/certbot
#    volumes:
#      - ./docker-volume/certbot/conf:/etc/letsencrypt
#      - certbot-www:/var/www/certbot
#    restart: unless-stopped
#    entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 12h & wait $${!}; done;"
#    depends_on:
#      - webserver

  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

services:

Эта секция определяет все службы, которые будут запущены в рамках этого docker-compose проекта.

Сервисы

webserver

  webserver:
    image: chocobozzz/peertube-webserver:latest
  • webserver: Название сервиса, который будет обрабатывать HTTP(S) запросы.
  • image: Указывает, что будет использоваться последний образ chocobozzz/peertube-webserver для создания контейнера.
    # If you don't want to use the official image and build one from sources:
    # build:
    #   context: .
    #   dockerfile: Dockerfile.nginx
  • build: Закомментированная секция, которая позволяет строить образ из исходников, если вы хотите внести изменения.
    • context: Путь к директории, содержащей Dockerfile.
    • dockerfile: Указывает, какой Dockerfile использовать для сборки образа.
    env_file:
      - .env
  • env_file: Указывает файл .env, из которого будут загружены переменные окружения для этого сервиса.
    ports:
     - "80:80"
     - "443:443"
  • ports: Указывает, какие порты будут проброшены на хост-машину.
    • "80:80": Пробрасывает порт 80 (HTTP) из контейнера на хост.
    • "443:443": Пробрасывает порт 443 (HTTPS) из контейнера на хост.
    volumes:
      - type: bind
      # Switch sources if you downloaded the whole repository
      #source: ../../nginx/peertube
      source: ./docker-volume/nginx/peertube
      target: /etc/nginx/conf.d/peertube.template
  • volumes: Указывает, какие каталоги будут примонтированы в контейнере.
    • type: bind: Указывает, что используется связывание.
    • source: Путь на хосте, откуда будет взят конфигурационный файл для Nginx.
    • target: Путь внутри контейнера, куда будет примонтирован файл.
      - assets:/var/www/peertube/peertube-latest/client/dist:ro
      - ./docker-volume/data:/var/www/peertube/storage
      - certbot-www:/var/www/certbot
      - ./docker-volume/certbot/conf:/etc/letsencrypt
  • Здесь указаны дополнительные тома:
    • assets: Примонтирует статические файлы клиента PeerTube.
    • ./docker-volume/data: Примонтирует папку для хранения данных PeerTube.
    • certbot-www: Примонтирует каталог, используемый для работы Certbot.
    • ./docker-volume/certbot/conf: Примонтирует каталог конфигурации для Let’s Encrypt.
    depends_on:
      - peertube
  • depends_on: Указывает зависимости. Этот сервис не будет запущен, пока не будет запущен сервис peertube.
    restart: "always"
  • restart: Указывает политику перезапуска контейнера. В данном случае контейнер будет перезапускаться всегда, если он завершит работу.

certbot

  certbot:
    container_name: certbot
    image: certbot/certbot
  • certbot: Название сервиса для управления сертификатами Let’s Encrypt.
  • container_name: Указывает имя контейнера.
  • image: Использует образ Certbot для управления сертификатами.
    volumes:
      - ./docker-volume/certbot/conf:/etc/letsencrypt
      - certbot-www:/var/www/certbot
  • volumes: Указывает тома, которые будут примонтированы:
    • ./docker-volume/certbot/conf: Конфигурация Let’s Encrypt.
    • certbot-www: Папка, в которой Certbot будет хранить временные файлы.
    restart: unless-stopped
  • restart: Политика перезапуска. В этом случае контейнер будет перезапускаться, если он завершит работу, но не будет перезапускаться, если он был остановлен вручную.
    entrypoint: /bin/sh -c "trap exit TERM; while :; do certbot renew --webroot -w /var/www/certbot; sleep 12h & wait $${!}; done;"
  • entrypoint: Указывает команду, которая будет выполнена при запуске контейнера. Здесь это скрипт для автоматического обновления сертификатов каждые 12 часов.
    depends_on:
      - webserver
  • depends_on: Этот сервис зависит от webserver, что означает, что он не будет запущен, пока не будет запущен сервис webserver.

peertube

  peertube:
    image: chocobozzz/peertube:production-bookworm
  • peertube: Название сервиса, который запускает саму PeerTube.
  • image: Использует образ PeerTube в версии production-bookworm.
    networks:
      default:
        ipv4_address: 172.18.0.42
        ipv6_address: 2001:db8:2::42
  • networks: Определяет, в какой сети будет находиться контейнер.
    • ipv4_address и ipv6_address: Указывают статические IP-адреса для контейнера.
    env_file:
      - .env
  • Указывает файл .env, содержащий переменные окружения для PeerTube.
    ports:
     - "1935:1935" # Comment if you don't want to use the live feature
  • ports: Пробрасывает порт 1935, используемый для трансляции в реальном времени. Закомментированная строка указывает, что этот порт можно закомментировать, если функция трансляции не требуется.
    #  - "9000:9000" # Uncomment if you use another webserver/proxy or test PeerTube in local, otherwise not suitable for production
  • Эта строка закомментирована, но если вы используете другой веб-сервер или тестируете PeerTube локально, можно раскомментировать её, чтобы пробросить порт 9000.
    volumes:
      - assets:/app/client/dist
      - ./docker-volume/data:/data
      - ./docker-volume/config:/config
  • Указывает тома для PeerTube:
    • assets: Примонтирует статические файлы клиента.
    • ./docker-volume/data: Папка для хранения данных.
    • ./docker-volume/config: Папка для конфигурации PeerTube.
    depends_on:
      - postgres
      - redis
      - postfix
  • depends_on: Указывает, что этот сервис зависит от других сервисов: postgres (база данных), redis (кэш) и postfix (почтовый сервис).
    restart: "always"
  • Политика перезапуска контейнера: всегда перезапускать, если он завершит работу.

postgres

  postgres:
    image: postgres:13-alpine
  • postgres: Название сервиса для PostgreSQL.
  • image: Использует образ PostgreSQL версии 13 на базе Alpine.
    env_file:
      - .env
  • Указывает, что этот сервис также использует файл .env для переменных окружения.
    volumes:
      - ./docker-volume/db:/var/lib/postgresql/data
  • Примонтирует папку для хранения данных PostgreSQL, чтобы данные сохранялись между перезапусками контейнера.
    restart: "always"
  • Политика перезапуска контейнера: всегда перезапускать.

redis

  redis:
    image: redis:6-alpine
  • redis: Название сервиса для Redis.
  • image: Использует образ Redis версии 6 на базе Alpine.
    volumes:
      - ./docker-volume/redis:/data
  • Примонтирует папку для хранения данных Redis.
    restart: "always"
  • Политика перезапуска контейнера: всегда перезапускать.

postfix

  postfix:
    image: mwader/postfix-relay
  • postfix: Название сервиса для почтового сервера Postfix.
  • image: Использует образ Postfix.
    env_file:
      - .env
  • Использует файл .env для переменных окружения.
    volumes:
      - ./docker-volume/opendkim/keys:/etc/opendkim/keys
  • Примонтирует папку для ключей DKIM, чтобы Postfix мог использовать их для подписи исходящих писем.
    restart: "always"
  • Политика перезапуска контейнера: всегда перезапускать.

Секции

networks

networks:
  default:
    enable_ipv6: true
    ipam:
      driver: default
      config:
      - subnet: 172.18.0.0/16
      - subnet: 2001:db8:2::/64
  • networks: Определяет сети, в которых будут работать контейнеры.
    • default: Имя сети по умолчанию.
    • enable_ipv6: Включает поддержку IPv6.
    • ipam: Указывает настройки управления IP-адресами, включая подсети для IPv4 и IPv6.

volumes

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

Настройка .env Peertube

Скачать последнюю версию env_file:

curl https://raw.githubusercontent.com/Chocobozzz/PeerTube/master/support/docker/production/.env > .env

Отредактировать с учетом настроек в docker-compose и своих данных: Сгенерировать ключ openssl rand -hex 32 вставить в строку PEERTUBE_SECRET

nano .env

# Database / Postgres service configuration
POSTGRES_USER=<ИМЯ ПОЛЗОВАТЕЛЯ БАЗЫ ДАННЫХ>
POSTGRES_PASSWORD=<ПАРОЛЬ БАЗЫ ДАННЫХ>
# 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=<ДОМЕННОЕ ИМЯ СЕРВЕРА>
# 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", "loopback", "172.18.0.0/16"]

# Generate one using `openssl rand -hex 32`
PEERTUBE_SECRET=<СГЕНЕРИРОВАННЫЙ СЕКРЕТНЫЙ КЛЮЧ>

# E-mail configuration
# If you use a Custom SMTP server
PEERTUBE_SMTP_USERNAME=ИМЯ ПОЛЬЗОВАТЕЛЯ E-MAIL
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=<АДРЕС ПОЧТОВОГО СЕРВЕРА>
PEERTUBE_SMTP_PORT=587
PEERTUBE_SMTP_FROM=noreply@<MY DOMAIN>
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_ADMIN_EMAIL=<ПОЧТОВЫЙ АДРЕС АДМИНА СЕРВЕРА>

# Postfix service configuration
#POSTFIX_myhostname=<MY DOMAIN>
# If you need to generate a list of sub/DOMAIN keys
# pass them as a whitespace separated string <DOMAIN>=<selector>
#OPENDKIM_DOMAINS=<MY DOMAIN>=peertube
# see https://github.com/wader/postfix-relay/pull/18
#OPENDKIM_RequireSafeKeys=no

#PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC="public-read"
#PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE="private"

#PEERTUBE_LOG_LEVEL=info

# /!\ Prefer to use the PeerTube admin interface to set the following configurations /!\
#PEERTUBE_SIGNUP_ENABLED=true
#PEERTUBE_TRANSCODING_ENABLED=true
#PEERTUBE_CONTACT_FORM_ENABLED=true

Сохранить файл Ctrl+O Enter, закрыть Ctrl+X

Конфигурация базы данных / Сервис Postgres

POSTGRES_USER=<MY POSTGRES USERNAME>
POSTGRES_PASSWORD=<MY POSTGRES PASSWORD>
POSTGRES_DB=peertube
PEERTUBE_DB_USERNAME=$POSTGRES_USER
PEERTUBE_DB_PASSWORD=$POSTGRES_PASSWORD
PEERTUBE_DB_SSL=false
PEERTUBE_DB_HOSTNAME=postgres
  1. POSTGRES_USER — имя пользователя для подключения к базе данных PostgreSQL. Этот пользователь создается при старте контейнера PostgreSQL.
  2. POSTGRES_PASSWORD — пароль для указанного пользователя PostgreSQL. Это важно для защиты доступа к базе данных.
  3. POSTGRES_DB — имя базы данных, которое используется для PeerTube. По умолчанию это peertube, но можно изменить.
  4. PEERTUBE_DB_USERNAME и PEERTUBE_DB_PASSWORD — пользователь и пароль, которые использует PeerTube для подключения к базе данных. Эти значения копируются из настроек PostgreSQL, чтобы они совпадали.
  5. PEERTUBE_DB_SSL — отключает SSL для подключения к базе данных. Установлено в false, так как это внутренняя сеть Docker.
  6. PEERTUBE_DB_HOSTNAME — хост базы данных, в данном случае это имя сервиса Postgres в Docker Compose, которое указано как postgres.

Альтернативные настройки базы данных:

#PEERTUBE_DB_NAME=<MY POSTGRES DB NAME>
#PEERTUBE_DB_SUFFIX=_prod
  • PEERTUBE_DB_NAME — альтернативное имя базы данных. Если не указано, используется значение по умолчанию: peertube + PEERTUBE_DB_SUFFIX.
  • PEERTUBE_DB_SUFFIX — добавляется к имени базы данных по умолчанию. Например, если указано _prod, база данных будет называться peertube_prod.

Конфигурация веб-сервера PeerTube

PEERTUBE_WEBSERVER_HOSTNAME=<MY DOMAIN>
PEERTUBE_TRUST_PROXY=["127.0.0.1", "loopback", "172.18.0.0/16"]
PEERTUBE_SECRET=<MY PEERTUBE SECRET>
  1. PEERTUBE_WEBSERVER_HOSTNAME — домен, на котором доступен PeerTube. Например, peertube.example.com.
  2. PEERTUBE_TRUST_PROXY — список доверенных прокси, которые могут передавать запросы. Это необходимо для корректной работы реверс-прокси (например, Nginx).
  3. PEERTUBE_SECRET — секретный ключ, который используется PeerTube для шифрования данных (например, сессий). Генерируется командой openssl rand -hex 32.

Альтернативные настройки:

#PEERTUBE_WEBSERVER_PORT=9000
#PEERTUBE_WEBSERVER_HTTPS=false
  • PEERTUBE_WEBSERVER_PORT — порт, который будет использоваться для локального тестирования PeerTube. По умолчанию не используется, так как сервис работает через Nginx.
  • PEERTUBE_WEBSERVER_HTTPS — включает или отключает HTTPS для локального тестирования. Обычно не используется в продакшене, так как Nginx управляет SSL-сертификатами.

Настройки Email

PEERTUBE_SMTP_HOSTNAME=postfix
PEERTUBE_SMTP_PORT=25
PEERTUBE_SMTP_FROM=noreply@<MY DOMAIN>
PEERTUBE_SMTP_TLS=false
PEERTUBE_SMTP_DISABLE_STARTTLS=false
PEERTUBE_ADMIN_EMAIL=<MY EMAIL ADDRESS>
  1. PEERTUBE_SMTP_HOSTNAME — имя SMTP-сервера, используемого для отправки почты. В этом случае используется встроенный контейнер Postfix, имя которого postfix.
  2. PEERTUBE_SMTP_PORT — порт для SMTP-сервера (обычно 25).
  3. PEERTUBE_SMTP_FROM — адрес отправителя для исходящих писем, например, noreply@yourdomain.com.
  4. PEERTUBE_SMTP_TLS — отключает использование TLS для SMTP. Установлено в false, так как это локальный сервер почты.
  5. PEERTUBE_SMTP_DISABLE_STARTTLS — отключает команду STARTTLS. Обычно false, если ваш сервер поддерживает STARTTLS.
  6. PEERTUBE_ADMIN_EMAIL — email администратора, который будет использоваться для уведомлений и связи.

Альтернативные настройки:

#PEERTUBE_SMTP_USERNAME=
#PEERTUBE_SMTP_PASSWORD=
  • PEERTUBE_SMTP_USERNAME и PEERTUBE_SMTP_PASSWORD — учетные данные для подключения к внешнему SMTP-серверу (если не используется Postfix).

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

POSTFIX_myhostname=<MY DOMAIN>
OPENDKIM_DOMAINS=<MY DOMAIN>=peertube
OPENDKIM_RequireSafeKeys=no
  1. POSTFIX_myhostname — доменное имя сервера, которое Postfix использует как хост. Обычно совпадает с вашим основным доменом.
  2. OPENDKIM_DOMAINS — список доменов для OpenDKIM (технология подписи исходящих писем). Указывается домен и селектор, например, peertube.example.com=peertube.
  3. OPENDKIM_RequireSafeKeys — отключает требование безопасных ключей для OpenDKIM. Полезно для упрощенной конфигурации.

Объектное хранилище

PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC="public-read"
PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE="private"
  1. PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PUBLIC — если вы используете объектное хранилище (например, Amazon S3), эта настройка определяет права доступа к загруженным объектам. public-read делает объекты публично доступными.
  2. PEERTUBE_OBJECT_STORAGE_UPLOAD_ACL_PRIVATE — аналогично, private делает объекты приватными.

Прочие настройки

#PEERTUBE_LOG_LEVEL=info
#PEERTUBE_SIGNUP_ENABLED=true
#PEERTUBE_TRANSCODING_ENABLED=true
#PEERTUBE_CONTACT_FORM_ENABLED=true
  1. PEERTUBE_LOG_LEVEL — уровень логирования. Может быть info, debug, warn и т.д. По умолчанию info.
  2. PEERTUBE_SIGNUP_ENABLED — включение регистрации новых пользователей. Можно отключить, чтобы принимать пользователей только по приглашению.
  3. PEERTUBE_TRANSCODING_ENABLED — включает или отключает транс-кодирование видео.
  4. PEERTUBE_CONTACT_FORM_ENABLED — включает или отключает форму обратной связи на сайте.

Настройка Apache2 для Peertube

Для работы необходимы следующие модули:

core_module
proxy_module
proxy_http2_module
proxy_wstunnel_module
proxy_http_module
headers_module
remoteip_module
ssl_module
filter_module
reqtimeout_module

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

sudo apachectl -M

Установить не достающие из списка, у меня не хватало proxy_http2_module и remoteip_module:

sudo a2enmod proxy_http2 remoteip

sudo systemctl restart apache2

Скачать конфиг виртуального хоста и поменять на свои данные, есть два варианта:

https://gist.github.com/ROBERT-MCDOWELL/7a55548d51a82080270b3184cd27ed36 - версия 6 Peertube

https://gist.github.com/rigelk/07a0b8963fa4fc1ad756374c28479bc7

Мой вариант выглядит пока скромно без каких либо наворотов, но будет дополнятся по мере необходимости во время эксплуатации сервиса Peertube

sudo nano /etc/apache2/sites-available/video.wildserver.ru-le-ssl.conf

<VirtualHost *:80>
	ServerAdmin admin@wildserver.ru
    ServerName video.wildserver.ru
    ServerAlias www.video.wildserver.ru
    CustomLog ${APACHE_LOG_DIR}/video.wildserver.ru.access.log combined
    ErrorLog ${APACHE_LOG_DIR}/video.wildserver.ru.error.log

RewriteEngine on
RewriteCond %{SERVER_NAME} =www.video.wildserver.ru [OR]
RewriteCond %{SERVER_NAME} =video.wildserver.ru
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
  ServerAdmin admin@wildserver.ru
  ServerName video.wildserver.ru
  ServerAlias www.video.wildserver.ru
    CustomLog ${APACHE_LOG_DIR}/video.wildserver.ru.access.log combined
    ErrorLog ${APACHE_LOG_DIR}/video.wildserver.ru.error.log  

    # SSL настройки
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/video.wildserver.ru/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/video.wildserver.ru/privkey.pem

    # Заголовки безопасности

    # Защита от понижения протокола с HTTPS на HTTP
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
    # Запрещаем встраивание страницы в iframe на других сайтах
    Header always set X-Frame-Options SAMEORIGIN
    # Защита от интерпретации MIME-типа
    Header always set X-Content-Type-Options nosniff
    # Политика реферера: не отправлять информацию на менее защищенные сайты
    Header always set Referrer-Policy no-referrer-when-downgrade
    # Политика безопасности содержимого
    Header always set Content-Security-Policy "default-src https: data: 'unsafe-inline' 'unsafe-eval'"
    # Защита от XSS-атак
    Header always set X-XSS-Protection "1; mode=block"
    # Ограничение использования определенных API
    Header always set Feature-Policy "vibrate 'none'; usermedia 'none'"

    # Обратный прокси
    ProxyPreserveHost On    
    ProxyPass / http://localhost:9000/
    ProxyPassReverse / http://localhost:9000/
    ProxyPassReverse /api/ http://localhost:9000/api/

    # WebSocket прокси
    ProxyPass /socket ws://localhost:9000/socket
    ProxyPassReverse /socket ws://localhost:9000/socket

    # Поддержка больших файлов без ограничений размера
    LimitRequestBody 0

    # Разрешить доступ к PeerTube 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>
</VirtualHost>
</IfModule>

Сохранить файл Ctrl+O Enter, закрыть Ctrl+X

Проверить конфигурацию запустив:

sudo apachectl configtest

Активировать виртуальный хост

sudo a2ensite video.wildserver.ru-le-ssl.conf

Перезапустить Apache2:

sudo systemctl restart apache2

Открыть порт для стрима в Peertube

Я почти уверен, что также понадобится правило в файерволе UFW, открывающее порт 1935 наружу, чтобы разрешить прямую трансляцию (стрим).

sudo ufw allow 1935/tcp

Первый запуск Peertube

Настал момент для запуска Peertube, для надежности поменяем каталог, если каким то образом находимся не в нем cd /home/sklad/peertube

Первый запуск:

docker compose up

В терминале будет выводится логи сервера. Из которых можно будет увидеть информацию о первом пользователе он же администратор сервера. Логин: **root ** и сгенерированный пароль, в этих строчках:

peertube-1  | [video.wildserver.ru:443] 2024-03-27 22:11:27.967 info: Username: root
peertube-1  | [video.wildserver.ru:443] 2024-03-27 22:11:27.967 info: User password: mevevomipewebeki

Логирование ведется в файл /home/sklad/peertube/docker-volume/data/logs/peertube.log

Запустив другой терминал выполнив команду, так же можно узнать логин и пароль главного администратора:

docker compose logs peertube | grep -A1 root

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

docker compose logs peertube | grep warn - предупреждения, не критично но чтоб по фенхую исправлял.

docker compose logs peertube | grep error - ошибки, хошь не хошь, а пути исправления надо искать, что были исправил, все было связано с конфигурацией.

А вот некоторые предупреждения запомнил и вот решения:

redis-1 WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Это предупреждение от Redis, указывающее на то, что настройки управления памятью в системе не позволяют Redis работать оптимально.

sudo sysctl vm.overcommit_memory=1

redis-1 WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

Это предупреждение от Redis указывает на то, что значение TCP backlog, установленное в конфигурации Redis (511), не может быть применено, потому что системное ограничение на максимальное количество подключений в очереди (параметр somaxconn) установлено на более низкое значение (128) в вашей системе.

Изменить значение somaxconn:

sudo sysctl -w net.core.somaxconn=511

Чтобы сделать изменения постоянными для обоих случаев добавить строки в sudo nano /etc/sysctl.conf:

vm.overcommit_memory = 1
net.core.somaxconn=511

Применить настройки sudo sysctl -p

peertube-1  | [video.wildserver.ru:443] warn: It seems PeerTube was started (and created some data) with another domain name. This means you will not be able to federate! Please use NODE_CONFIG_DIR=/app/config:/app/support/docker/production/config:/config NODE_ENV=production npm run update-host to fix this.

Это предупреждение указывает на то, что PeerTube был запущен с другим доменным именем, и поэтому он не сможет федеративно взаимодействовать с другими инстансами Peertube. Необъодимо выполнить то что написано. Для этого:

Узнать, как называется контейнер peertube

docker ps выведет все имена контейнеров, в моем случае он назван peertube-peertube-1

docker exec -it peertube-peertube-1 /bin/bash открыть терминал в контейнере и выполнить указанную команду

NODE_CONFIG_DIR=/app/config:/app/support/docker/production/config:/config NODE_ENV=production npm run update-host

docker restart peertube-peertube-1 перезапустить контейнер

Обновление докера Peertube

Перейти в каталог с Peertube:

cd /home/sklad/peertube

Загрузить последние изображения:

docker compose pull

Остановить, удалить контейнеры и внутренние тома:

docker compose down -v

Запустить Peertube

docker compose up -d

Бэкап и востановление базы данных

Чтобы сделать бэкап базы данных Peertube, запущенной в Docker, выполнить команду pg_dump внутри контейнера PostgreSQL для создания дампа базы данных:

Найти имя контейнера PostgreSQL

Сначала узнать имя контейнера PostgreSQL:

docker ps

Найти строку с контейнером, использующим образ postgres:13-alpine или подобный.

Выполнить бэкап базы данных

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

docker exec -t <имя_контейнера_postgres> pg_dump -U <пользователь_postgres> peertube -F c > /path/to/backup/peertube_backup.sql

  • Заменить <имя_контейнера_postgres> на фактическое имя контейнера PostgreSQL (например, peertube-postgres).
  • Заменить <пользователь_postgres> на имя пользователя PostgreSQL (по умолчанию это может быть postgres).
  • /path/to/backup/peertube_backup.sql — путь на сервере, куда сохранить бэкап базы данных.

Пример команды:

docker exec -t peertube-postgres-1 pg_dump -U postgres peertube -F c > /home/sklad/backup/peertube/date +’%d%m%Y’-peertube_backup.sql

Восстановление базы данных

Чтобы восстановить базу данных из этого бэкапа команда pg_restore:

docker exec -i <имя_контейнера_postgres> pg_restore -U <пользователь_postgres> -d peertube < /path/to/backup/peertube_backup.sql