Архив метки: PostgreSQL

PeerTube установка на Rocky Linux

Установим и настроим децентрализованную платформу для организации видеохостинга и видеовещания под названием 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:

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

Раньше лежал у меня фильм и занимал места 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-адреса или торрент-файла очень удобен и отключать такую возможность не надо.

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

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

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

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

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

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

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

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

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

  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 систему можно не обновлять.

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

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

Cоllabora и настройка NextCloud

Рассмотрим некоторые моменты настройки NextCloud работающем на Calculate Linux. Установим Collabora Office и другие полезные приложения. Расскажу про основные моменты работы и настройки этого свободного облачного хранилища. Большой диапазон возможностей в использовании.

Введение

За основу была взята настройка свободного облачного хранилища из статьи NextCloud установка на Nginx.

Создание облачного хранилища для работы с файлами удобная и практичная технология. Облачное хранилище на базе NextCloud даёт воистину восхитительные возможности. В одном месте вы сможете настроить совместную работу с документами, безопасность, и общение. Облако позволит сократить количество стороннего программного обеспечения используемого пользователями. Разве не сказка использовать для работы практически любой браузер, смотреть видео, редактировать документы, делать видео звонки, общаться в чате, и много что ещё. Далеко не все рассказал в статье, так как это просто не возможно. Для работы со всеми форматами офисных документов рекомендую использовать Collabora Office, так как только он даст вам спокойно работать с любыми форматами офисных документов без конвертирования в формат docx, как это делает OnlyOffice. Устанавливайте, настраивайте и почувствуйте сами все прелести использования своего подконтрольного вам облачного хранилища.

Долго использовал работу NextCloud на дистрибутиве CentOS c базой данных MariaDB. При тестирования работы на Calculate Linux был приятно удавлен, что при одинаковых настройках производительность была лучше а после перехода на базу данных PosgreSQL расход памяти стал просто смешной.

Дизайн NextCloud

Разработчики предусмотрели желание пользователей произвести изменения внешнего вида. К сожалению не все можно поменять с панели управления. Некоторые изменения дизайна произведём в ручном режиме.

Темы оформления

Настройка дизайна производится на странице Администрирование — Темы оформления.

Вот так выглядит моя страница настройки:

В итоге я получил такую страницу приветствия:

Значок веб-сайта

Заменяем файл favicon.ico в папке согласно пути от корневой папки сайта ../core/img.

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

После замены незабываем дать права на файл:

chown nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon.ico

Картинка для Telegram

Картинка ссылки что будет в чате Телеграм находится по пути ../core/img и называется favicon-fb.png.

После замены на свой файл с аналогичными параметрами не забываем дать необходимые права:

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/img/favicon-fb.png

При обновлении NextCloud файлы с папки ../core/img будут заменены на стандартные!

Документы по умолчанию для пользователя

Папка где лежат файлы которые по умолчанию увидит новый созданный пользователь находится по пути ../core/skeleton. Создайте в папке все необходимые файлы и папки. Не забудьте дать необходимые права на все файлы и папки:

chown -R nginx:nginx /var/www/nextcloud/htdocs/core/skeleton

Основные моменты работы с NextCloud

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

Настройка почтового сервера NextCloud

Первым делом необходимо настроить почтовый сервер.

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

Настройки сервера SMTP находится по пути Администрирование — Дополнительные настройки — Почтовый сервер. В моем случае настройки выглядят следующим образом:

Фоновые задания

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

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

cat /etc/cron.d/nextcloud_cron
= необходимый код =
# Global variables
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/

#Nextcloud
*/15 * * * * nginx php -f /var/www/nextcloud/htdocs/cron.php

Размер загружаемых файлов

В файле настроек Nginx для Nextcloud мы указали что размер загружаемого файла не может превышать 10 Gb. Добавим этот параметр на странице Администрирование — Дополнительные настройки — Управление файлами.

Подключение к базе пользователей LDAP

Используя дополнение LDAP user and group backend можно подключать как LDAP каталог так и AD от Windows. На практике подключал оба варианта. Проблема возникла только с аватарами пользователей.

Настройка очистки удалённых файлов

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

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

Доступные значения:

  • auto— настройки по умолчанию. Хранит файлы и папки в мусорном ведре в течение 30 дней и автоматически удаляет в любое время после этого, если требуется пространство (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • D, auto—  хранит файлы и папки в мусорном ящике для дней D +, удаляет в любое время в случае необходимости (обратите внимание: файлы не могут быть удалены, если пространство не требуется)
  • auto, D — удалите все файлы в мусорном ящике, которые старше D дней автоматически, удаляют другие файлы в любое время, если необходимо пространство
  • D1, D2 — хранить файлы и папки в мусорном ведре не менее D1 дней и удалять, когда превышает D2 дней
  • disabled — корзина мусора автоматически очищена, файлы и папки будут сохранены навсегда

В моем случае я использую параметр:

vim /var/calculate/www/nextcloud/htdocs/config/config.php
= необходимое дополнение =
 'trashbin_retention_obligation' => '7, auto', 
); 

Разграничение прав пользователей

Вот основные параметры:

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

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

Возможности доступа к данным

К данным размешенным на облачном хранилище NextCloud вы можете получить доступ разными способами:

  • Через любой веб браузер;
  • Используя клиент синхронизации, который есть под операционные системы Windows, Linux, Android, и тд…;
  • Подключится используя протокол WebDAV.

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

Создание графиков и схем

Приложение Draw.io позволяет создавать разные схемы, графики и позволяет как импортировать так и экспортировать во все популярные форматы. Удобней и понятней программы для создания схем я не встречал.

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

Просмотр видео

К сожалению просматривать можно только формат mp4. Существует множество конвертеров по преобразованию файлов в нужный формат и даже онлайн сервисы. Будем надеяться что разработчики расширят количество форматов.

Для конвертации я использую программу HandBrake. Программа удобна тем что можно загрузить список файлов для конвертация.

В Calculate Linux программа устанавливается командой:

emerge --ask media-video/handbrake

Видео звонки между пользователями

Приложение Talk позволяет добавить на ваше облачное хранилище возможность совершать видео звонки пользователям. Создание группового звонка увеличивает привлекательность приложения в разы. Вся связь осуществляется по технологии WebRTC. Проект WebRTC имеет открытый исходный код и активно продвигается компанией Google. Суть проекта это возможность использовать для организации видеоконференций веб браузер без использования сторонних программ и технологий.

Чат или Xmpp Client

Приложение JavaScript XMPP Chat позволяет добавить простой чат для общения пользователей с сохранением истории сообщений.

Существует три варианта использования:

  1. Internal — ограниченная функциональность: нет клиентов, кроме JSXC в Nextcloud, без многопользовательского чата, без серверных федераций,
  2. External —  подключится к собственному серверу XMPP,
  3. Managed (Beta service) — получить ваш собственный полнофункциональный XMPP-сервер, непосредственно размещенный основной командой JSXC.

Какой вариант использовать решать вам.

Календари

С приложением Calendar все просто и понятно. Можно создавать и давать доступ на созданный календарь. Вносить события с разными параметрами. Очень удобна возможность подключать сторонние календари по технологии iCal.

Подключение внешних хранилищ

Приложение External storage support пожалуй одно из моих самых любимых. Благодаря ему можно в своё хранилище подключить почти все имеющиеся варианты доступа к данным и настроить совместную работу.

При работе с подключённым Yandex.Disk есть один нюанс. При удалении файлов большого размера происходит ошибка и связана она с тем что файл вначале должен попасть в вашу корзину а уже затем удалится. Можно конечно увеличить время ожидание, но это не разумно. Отключать корзину тоже не целесообразно. Вероятно проблема будет решена в ближайших обновлениях приложения.

Перечень протоколов и сервисов которые можно использовать для подключения:

Подключать внешние хранилища можно со страницы Администрирование — Внешние хранилища, там же производится настройка приложения.

В моем случае я не использую подключение к шарам на Windows, поэтому получаю предупреждение сверху страницы. При необходимости надо установить samba на сервере и сообщение пропадёт.

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

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

Мониторинг работы NextCloud

На странице по ссылке Администрирование — Мониторинг вы найдёте все реальны параметры работы облачного хранилища.

Параметры отображаемые на странице Мониторинг:

  • Загрузка процессора,
  • Использование памяти,
  • Активные пользователи,
  • Ресурсы общего доступа,
  • Хранилище (количество пользователей и файлов),
  • Параметры PHP,
  • База данных.

Журналирование работы NextCloud

Посмотреть логи вы можете зайдя по ссылке Администрирование — Журналирование. Присутствует возможность отсортировать по виду сообщений.

Collabora Office установка на Docker

К сожалению после установки NextCloud вы сможете просматривать и работать только с документами формата txt. Для того чтобы работать со всеми видами офисных документов необходимо установить приложение для работы с этими форматами. В моем случае используется свободная версия Collabora Office. Можно установить и ONLYOFFICE но он имеет ограничение на количество пользователей в свободной версии ( 20 пользователей ) и не поддерживается официально разработчиками NextCloud.

После установки и тестирования OnlyOffice выяснилось что в этом приложении можно работать только с некоторыми форматами документов: DOCX, XLSX, PPTX, TXT, CSV. В том что OnlyOffice может открывать и другие типы файлов полное вранье! Для того чтобы открыть ODT, ODS, ODP, DOC, XLS, PPT, PPS, EPUB, RTF, HTML, HTM разработчики предусмотрели вариант конвертирование их в «лучший» формат и уже с этим файлом в последствии работать. Вот такое отношение к свободным форматам файлов у разработчиков OnlyOffice и присутствует явное навязывание форматов от всем нам известной компании. В Collabora вы сможете открыть и работать с любыми форматам и это даёт вам полую свободу и удобство в работе.

Отсутствие проверки Русского языка

Не увидев наличия родного языка для проверки орфографии я не долго думая написал письмо разработчикам и в течении часа получил ответ (приведу часть ответа сделанного переводчиком):

» Привет Алекс,

Спасибо за Ваше сообщение и за ваш интерес к организации совместной работы в Интернете.

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

Что касается ваших вопросов, проверка орфографии-это новая функция, которую мы добавили в наш код версии несколько месяцев назад. Теперь, мы работаем на других языках и, конечно, русский для нашего следующего выпуска кода. Мы выпустим наш следующий код версии в конце этого года 2017.»

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

Приятная новость! Как и обещали разработчики в конце года вышла новая версия в которой работает проверка орфографии для русского языка. Посмотреть информацию о версиях можно на странице https://www.collaboraoffice.com/news-releases/.

Установка и настройка Docker

Установка Docker на Calculate Linux или Gentoo:

emerge --ask app-emulation/docker

Добавление в автозагрузку:

rc-update add docker default
= вывод команды =
* service docker added to runlevel default

Запуск Dockera:

/etc/init.d/docker start
docker | * Caching service dependencies ...            [ ok ]
docker | * /var/log/docker.log: creating file
docker | * /var/log/docker.log: correcting mode
docker | * /var/log/docker.log: correcting owner
docker | * Starting docker...                          [ ok ]

Установка Collabira Office в Docker

Скачиваем контейнер командой:

docker pull collabora/code
= вывод команды =
===
Using default tag: latest
Trying to pull repository docker.io/collabora/code ... 
latest: Pulling from docker.io/collabora/code
bd97b43c27e3: Pull complete 
6960dc1aba18: Pull complete 
2b61829b0db5: Pull complete 
1f88dc826b14: Pull complete 
73b3859b1e43: Pull complete 
2cb7a8fe8de9: Pull complete 
2458b914d686: Pull complete 
7470c2907839: Pull complete 
Digest: sha256:a89941eb0aa140b82e658f34f840ba3c35f47c3f3eec79694fc460ae9fced79d

Запустим контейнер докера заменив cloud\\.sevo44\\.ru на ваш домен сервера Nextcloud (с сохранением обратного слэша).

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Необязательные параметры»username=admin» и»password=pass*» включают функцию консоли администратора Сollabora. Доступ к консоли администратора осуществляется по адресу https://<CODE-domain>/loleaflet/dist/admin/admin.html

Проверка работы контейнера Docker в системе

Посмотрим результат проделанных операций:

netstat -lnpt
= часть вывода =
tcp  0  0   127.0.0.1:9980    0.0.0.0:*   LISTEN   4582/docker-proxy 

Согласно вывода мы видим что контейнер работает на порту 9980 и ждёт к себе обращений для выполнения поставленных задач. Нам необходимо средствами Nginx настроить связь нашего облачного хранилища и контейнера Docker с Collabora Office.

Посмотрим состояние контейнеров Docker в сисетме:

docker ps -a
= часть вывода команды =
9558da76e647 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 42 hours 127.0.0.1:9980->9980/tcp relaxed_lovelace

Обновление Collabora Office в Docker

Скачиваем новое изображение докера:

docker pull collabora/code

Выводим список докеров в системе:

docker ps
= вывод команды =
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37359809d296 collabora/code "/bin/sh -c 'bash ..." 2 weeks ago Up 4 minutes 127.0.0.1:9980->9980/tcp dreamy_hamilton

Останавливаем и удаляем изображение Докера Collabora Online:

docker stop 37359809d296
docker rm 37359809d296

Заново установим выполнив команду:

docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=cloud\\.sevo44\\.ru' -e "username=admin" -e "password=pass*" --restart always --cap-add MKNOD collabora/code

Новая версия установлена!

Внимание! Перед проверкой новой версии удалите кэш и куки интернет браузера.

Nginx для Collabora Office

При настройке я не стал устанавливать самоподписные сертификаты SSL, а сразу получил свободные от Let’s Еncrypt. Если кто пробовал настраивать с само подписными напишите пожалуйста в комментариях.

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

mkdir -p /var/www/office
chown nginx:nginx /var/www/office

Файл настройки Collabora для Nginx

Параметры для первого получения SSL сертификата:

vi /etc/nginx/conf.d/office.conf
= необходимый код =
server {
 listen 80;
 server_name office.sevo44.ru;
root /var/www/office;
}

Проверяем и перезапускаем Nginx:

nginx -t
= вывод команды = 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload
= вывод команды =
nginx | * Checking nginx' configuration ...                [ ok ]
nginx | * Refreshing nginx' configuration ...              [ ok ]

Получение SSL для Collabora online Office

Более детально получение SSL описано в материале «Установка Let`s Encrypt для Calculate и Gentoo«. На его основе было произведено получение сертификата для домена office.sevo44.ru.

Файл настройки для работы с SSL сертификатом от Let’s Еncrypt в моем случае получил такой вид:

vim /etc/nginx/conf.d/office.conf 
= необходимые изменения с пояснениями =
# office.sevo44.ru
server { 
 listen 80; 
 server_name office.sevo44.ru; 
 rewrite ^ https://$server_name$request_uri? permanent; 
}

server {
 listen 443 ssl;
 server_name office.sevo44.ru;
 root /var/www/office;

ssl_protocols TLSv1.1 TLSv1.2;
 ssl_certificate /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/office.sevo44.ru/privkey.pem;

# static files
 location ^~ /loleaflet {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# WOPI discovery URL
 location ^~ /hosting/discovery {
 proxy_pass https://localhost:9980;
 proxy_set_header Host $http_host;
 }

# websockets, download, presentation and image upload
 location ^~ /lool {
 proxy_pass https://localhost:9980;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "Upgrade";
 proxy_set_header Host $http_host;
 }
}

Не забываем проверить и перезагрузить Nginx!

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

Вывод

Облачное хранилище NextCloud это просто бездна возможностей. Каждый раз откладывал публикацию статьи так как находил всё новые и новые полезности. Скорей всего ещё не раз буду добавлять новое в эту статью. Буду признателен если в комментариях будут какие то нюансы в работе или рекомендации по приложениям. Последнее что мне не удаётся настроить это приложение PhoneTrack которое позволяет с устройств имеющих GPS получать данные о местоположении в реальном времени и видеть маршруты передвижения. Если кто настраивал поделитесь информацией.

NextCloud установка на Nginx

Создадим своё облачное хранилище NextCloud под управление Nginx на базе дистрибутива CSS от Calculate Linux. Принцип установки и настройки подойдет для любого другого дистрибутива Linux. Совместная работа с файлами с любого браузера.

Введение

Ранее я описывал как настраивать NGINX на web сервер CentOS 7 и LEMP сервер на Calculate Linux на основе последнего материала произведу настройку NextCloud. Обновление облачного хранилища производится средствами самого ресурса и поэтому выполним установку из исходных файлов с сайта разработчика. NextCloud будет работать в локальной сети. Для удобства работы откроем доступ с сети интернет и подключим свободный сертификат SSL от компании Let`s Encrypt. В качестве базы данных будем использовать PostgreSQL.

Ошибка при установке на MariaBD

При попытке установки на базу данных MariaDB вы получите ошибку:

«General error: 1665 Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED»

Для избавления от этой ошибки необходимо отредактировать конфигурационный файл /etc/mysql/my.cnf отвечающий за настройки базы.

/etc/mysql/my.cnf
= необходимые параметры =
[mysqld]
binlog-format=MIXED
innodb_large_prefix=on
innodb_file_format=barracuda
innodb_file_per_table=true

После перезагрузки MariaDB установка пройдёт без ошибок.

Установка и настройка PostgreSQL

В будущем я напишу более детальную статью о том как работать с PostgreSQL. Ниже я лишь опишу основные моменты которые необходимы для работы NextCloud с этой базой данных.

Установим базу данных PostgreSQL командой:

emerge --ask dev-db/postgresql

Настроим базу выполнив команду:

emerge --config =dev-db/postgresql-9.6.6
= вывод команды =

Configuring pkg...

* You can modify the paths and options passed to initdb by editing:
 * /etc/conf.d/postgresql-9.6
 * 
 * Information on options that can be passed to initdb are found at:
 * http://www.postgresql.org/docs/9.6/static/creating-cluster.html
 * http://www.postgresql.org/docs/9.6/static/app-initdb.html
 * 
 * PG_INITDB_OPTS is currently set to:
 * --encoding=UTF8
 * 
 * Configuration files will be installed to:
 * /etc/postgresql-9.6/
 * 
 * The database cluster will be created in:
 * /var/lib/postgresql/9.6/data
 * 
 * Continuing initialization in 5 seconds (Control-C to cancel) ... [ ok ]
 * Creating the data directory ...
 * Initializing the database ...
Файлы, относящиеся к этой СУБД, будут принадлежать пользователю "postgres".
От его имени также будет запускаться процесс сервера.

Кластер баз данных будет инициализирован со следующими параметрами локали:
 COLLATE: ru_RU.utf8
 CTYPE: ru_RU.utf8
 MESSAGES: ru_RU.utf8
 MONETARY: ru_RU.utf8
 NUMERIC: C
 TIME: ru_RU.utf8
Выбрана конфигурация текстового поиска по умолчанию "russian".

Контроль целостности страниц данных отключён.

исправление прав для существующего каталога /var/lib/postgresql/9.6/data... ок
создание подкаталогов... ок
выбирается значение max_connections... 100
выбирается значение shared_buffers... 128MB
выбор реализации динамической разделяемой памяти ... posix
создание конфигурационных файлов... ок
выполняется подготовительный скрипт ... ок
выполняется заключительная инициализация ... ок
сохранение данных на диске... ок

ПРЕДУПРЕЖДЕНИЕ: используется проверка подлинности "trust" для локальных подключений.
Другой метод можно выбрать, отредактировав pg_hba.conf или используя ключи -A,
--auth-local или --auth-host при следующем выполнении initdb.

Готово. Теперь вы можете запустить сервер баз данных:

/usr/lib64/postgresql-9.6/bin/pg_ctl -D /var/lib/postgresql/9.6/data -l logfile start

* The autovacuum function, which was in contrib, has been moved to the main
 * PostgreSQL functions starting with 8.1, and starting with 8.4 is now enabled
 * by default. You can disable it in the cluster's:
 * /etc/postgresql-9.6/postgresql.conf
 * 
 * The PostgreSQL server, by default, will log events to:
 * /var/lib/postgresql/9.6/data/postmaster.log
 * 
 * You should use the '/etc/init.d/postgresql-9.6' script to run PostgreSQL
 * instead of 'pg_ctl'.

В выводе указана вся основная информация.

Запустим сервис PostgreSQL:

/etc/init.d/postgresql-9.6 start
= вывод команды =
postgresql-9.6 | * /run/postgresql: creating directory
postgresql-9.6 | * /run/postgresql: correcting owner
postgresql-9.6 | * Starting PostgreSQL 9.6 ...

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

rc-update add postgresql-9.6 default
= вывод команды =
 * service postgresql-9.6 added to runlevel default

Создадим пароль для пользователя posgres:

psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.

postgres=# \password
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
postgres=# \q

Настройка доступа к базам PostgreSQL

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

За доступ отвечают параметры в файле /etc/postgresql-9.6/pg_hba.conf. В моем случае мне необходимо чтобы доступ был разрешен только с моего компьютера в локальной сети. Произведем корректировку файла:

vim /etc/postgresql-9.6/pg_hba.conf
= часть вывода команды с необходимым дополнением =
# IPv4 local connections: 
host    all             all             127.0.0.1/32            trust 
host    all             all             192.168.0.3/24          trust

Помимо того что надо добавить доступ в iptables для 5432 необходимо внести изменения в файл /etc/hosts. Добавим нужные данные с учетом что ip адрес сервера 192.168.0.141:

vim /etc/hosts
= часть вывода команды с необходимым добавлением =
127.0.0.1 lempcss.sevo44.loc lempcss localhost
192.168.0.141 lempcss.sevo44.loc lempcss localhost

Перезагрузим сервис баз данных:

/etc/init.d/postgresql-9.6 restart 
postgresql-9.6    | * Stopping PostgreSQL 9.6 (this can take up to 92 seconds) ...  [ ok ] 
postgresql-9.6    | * /run/postgresql: correcting mode 
postgresql-9.6    | * Starting PostgreSQL 9.6 ...                     [ ok ]

Проверим какие порты работают:

netstat -an 
= часть вывода команды =
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      
tcp        0      0 192.168.0.141:5432      0.0.0.0:*               LISTEN      
tcp        0      0 127.0.0.1:5432          0.0.0.0:*               LISTEN

Достаточно указать в pgAdmin4 сервер 192.168.0.141, порт 5432, данные пользователя posgres для подключения и удобно работать с базами данных.

Добавление базы PosgreSQL

Добавим базу и пользователя для облачного ресурса NextCloud:

Перейдем под пользователя posgres
su - postgres
Создадим базу nextcloud
postgres@lempcss ~ $ createdb nextcloud
Подключимся к консоли Postgres
psql -U postgres
psql (9.6.6)
Введите "help", чтобы получить справку.
Выведем список всех баз
postgres=# \l 
Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | 
 postgres  | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 |  
 template0 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
 template1 | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | =c/postgres          + 
           |          |           |            |            | postgres=CTc/postgres 
(4 строки)
Добавим роль (пользователя) nextcloud с правами на вход
postgres=# CREATE ROLE nextcloud WITH LOGIN;
CREATE ROLE
Посмотрим список ролей (пользователей)
postgres=# \du 
                                           Список ролей 
 Имя роли  |                                Атрибуты                                 | Член ролей  
-----------+-------------------------------------------------------------------------+------------ 
 nextcloud |                                                                         | {} 
 oc_admin  | Создаёт БД                                                              | {} 
 postgres  | Суперпользователь, Создаёт роли, Создаёт БД, Репликация, Пропускать RLS | {}
Добавим пароль пользователю nextcloud
postgres=# \password nextcloud
Введите новый пароль: вводим пароль
Повторите его: повторяем пароль
Назначим полные права на базу nextcloud пользователю ntxtcloud
postgres=# grant connect, create on database nextcloud to nextcloud;
GRANT
Выведем информацию о базе nextcloud
postgres=# \l nextcloud 
                                 Список баз данных 
    Имя    | Владелец | Кодировка | LC_COLLATE |  LC_CTYPE  |     Права доступа      
-----------+----------+-----------+------------+------------+----------------------- 
 nextcloud | postgres | UTF8      | ru_RU.utf8 | ru_RU.utf8 | postgres=CTc/postgres+ 
           |          |           |            |            | nextcloud=Cc/postgres 
(1 строка)
Выйдем из консоли PostgresQL
postgres=# \q

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

psql -U nextcloud -d nextcloud -h 127.0.0.1 -W
= вывод команды =
Пароль пользователя nextcloud: 
psql (9.6.6)
Введите "help", чтобы получить справку.


nextcloud-> \q

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

Установка NextCloud

Установка с исходных кодов с сайта разработчика производится в три этапа:

  1. Создание необходимых путей и загрузка файлов,
  2. Создание фала конфигурации Nginx для работы облачного ресурса,
  3. Внесение необходимых поправок в конфигурацию сервисов  для корректной работы NextCloud.

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

Создадим необходимые папки:

mkdir -p /var/www/nextcloud/{logs,upload,save}

Перейдем в папку и скачаем последнюю версию NextCloud:

cd /var/www/nextcloud
wget https://download.nextcloud.com/server/releases/nextcloud-12.0.3.zip

Распакуем:

unzip /var/www/nextcloud/nextcloud-12.0.3.zip -d /var/www/nextcloud

Переименуем:

mv /var/www/nextcloud/nextcloud /var/www/nextcloud/htdocs

Назначим необходимые права:

chown -R nginx:nginx /var/www/nextcloud

Настройка Nginx для Nextcloud

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

В моем случае название ресурса будет cloud.sevo44.ru

vim /etc/nginx/conf.d/nextcloud.conf  
= необходимый код с пояснениями =
# nc.sevo44.ru 
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    gzip on; 
    gzip_vary on; 
    gzip_comp_level 4; 
    gzip_min_length 256; 
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; 
    gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json applicati
on/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json applic
ation/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vca
rd text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
   
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { 
        deny all; 
    } 
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { 
        deny all; 
    } 
 
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|updater/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    #fastcgi_param HTTPS on; 
    #Avoid sending the security headers twice 
    fastcgi_param modHeadersAvailable true; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Запрос getenv(«PATH») для NextCloud

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

Определим пути в системе:

printenv PATH
= вывод команды =
/usr/x86_64-pc-linux-gnu/gcc-bin/5.4.0:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin

Отредактируем файл www.conf:

vim /etc/php/fpm-php7.0/fpm.d/www.conf
= необходимое изменение =
; При значении 5 на небольшой нагрузке можно получить ошибку 504
; в моем случае ошибка появлялась при просмотре фильмов
pm.max_children = 20
= необходимое дополнение =
;PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
;/PHP был установлен неверно. Запрос getenv("PATH") возвращает пустые результаты.

Параметры PHP OPcache для Nextcloud

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

Внесем изменения в файл php.ini:

vim /etc/php/fpm-php7.0/php.ini
= необходимые дополнения =
[opcache] 
! В моём случае все параметры этого блока были отключены!
opcache.enable=1 
opcache.enable_cli=1 
opcache.interned_strings_buffer=8 
opcache.max_accelerated_files=10000 
opcache.memory_consumption=128 
opcache.save_comments=1 
opcache.revalidate_freq=1

После всех настроек перед непосредственном запуском установки NextCloud необходимо проверить, перезапустить Nginx и Php-fpm:

nginx -t
= вывод команды = 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok 
nginx: configuration file /etc/nginx/nginx.conf test is successful 

/etc/init.d/nginx reload
= вывод команды =
nginx | * Checking nginx' configuration ...                [ ok ]
nginx | * Refreshing nginx' configuration ...              [ ok ]

/etc/init.d/php-fpm restart  
= вывод команды =
php-fpm | * Stopping PHP FastCGI Process Manager ...       [ ok ]
php-fpm | * Testing PHP FastCGI Process Manager config ... [ ok ]
php-fpm | * Starting PHP FastCGI Process Manager ...       [ ok ]

Запуск установки NextCloud

Перед запуском установки необходимо прописать имя ресурса cloud.sevo44.ru работающего на ip адресе 192.168.0.141 в DNS сервер локальной сети или внести необходимые изменения в необходимый файл локальной машины для доступа к ресурсу. Для систем Linux дополнение вносятся в файл /etc/hosts:

vim /etc/hosts
= необходимое дополнение =
192.168.0.141 cloud.sevo44.ru

Получение SSL от Let`s Encrypt

Ранее я описывал более подробно про получение и продление бесплатный трехмесячных сертификатов SSL. Ниже я лишь опишу получение и продление сертификатов со спецификой для дистрибутивов на базе Gentoo.

Установка Let`s Encrypt для Calculate и Gentoo

Установим сам certbot обеспечивающий работу с сертификатами от Let`s Encrypt:

emerge --ask app-crypt/certbot

Установим расширения для получения сертификатов средствами nginx:

emerge --ask app-crypt/certbot-nginx

После успешной установки получим сертификат для нашего домена cloud.sevo44.ru:

Внимание! В моем варианте облачное хранилище уже настроено так чтобы доступ к ресурсу был как с локальной сети так и с интернета!Первый раз раз можно получить сертификат, используя временный веб сервер самого certbot (пункт 2), но после начала работы сайта придется повторить действие по получению сертификата для перенастройки файла отвечающего за автоматическое продление сертификата!

certbot certonly 
= вывод команды с пояснениями =
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
-------------------------------------------------------------------------------
1: Nginx Web Server plugin - Alpha (nginx)
2: Spin up a temporary webserver (standalone)
3: Place files in webroot directory (webroot)
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Select the appropriate number [1-3] then [enter] (press 'c' to cancel): 3
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): info@sevo44.ru

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: Y
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): cloud.sevo44.ru --- доменное имя на которое получаем
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for cloud.sevo44.ru

Select the webroot for cloud.sevo44.ru:
-------------------------------------------------------------------------------
1: Enter a new webroot
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel): 1
Input the webroot for cloud.sevo44.ru: (Enter 'c' to cancel): /var/www/nextcloud/htdocs/ --- путь до корневой папки ресурса
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem
 Your key file has been saved at:
 /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem
 Your cert will expire on 2018-02-19. To obtain a new or tweaked
 version of this certificate in the future, simply run certbot
 again. To non-interactively renew *all* of your certificates, run
 "certbot renew"
 - If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
 Donating to EFF: https://eff.org/donate-le

Обязательно указывайте правильный и рабочий почтовый ящик чтобы в последствии в случае неудачного продления сертификата получать такое письмо с предупреждением:

Hello,

Your certificate (or certificates) for the names listed below will expire in
19 days (on 15 Dec 17 11:21 +0000). Please make sure to renew
your certificate before then, or visitors to your website will encounter errors.

webinar.sevo44.ru

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

Расположение файлов для работы SSL от Let’s Encrypt

Перейдем в папку с сервисом и выведем информацию о тот что находится в папке:

cd /etc/letsencrypt/ 
ls 
= вывод команды =
accounts  csr   live   renewal ssl-dhparams.pem 
archive  keys  options-ssl-nginx.conf  renewal-hooks

Назначение папок и файлов:

  • live — в этой папке находятся все необходимые файлы для работы ssl разбитые папками на каждый ресурс для которого получались ключи,
  • renewal — параметры которые будут использованы при продлении сертификата,
  • options-ssl-nginx.conf — необходимые параметры которые необходимо указать в файле настройки nginx,
  • ssl-dhparams.pem файл параметров Диффи-Хеллмана необходимый для лучшей безопасности при работе сайта с SSL.

Внимание! В случае если вам необходимо сменить тип получения сертификата необходимо запустить заново команду «certbot certonly» и указать необходимые параметры для нужного домена и файл отвечающий за параметры продления сертификата будет обновлен в папке renewal!

Автоматическое продление сертификатов Let’s Encrypt

Ручное обновление всех сертификатов сводится к вводу в командной строке команды:

certbot renew

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

certbot renew --dry-run

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

vim /etc/cron.d/cartboot
= вывод команды с необходимыми изменениями = 
# Получение сертификатов
30 4 * * 1 root /usr/bin/certbot renew >> /var/log/cron-renew.log
35 4 * * 1 root /etc/init.d/nginx reload

Согласно этого кода в 4.30 каждый понедельник будет производится получение новых ssl сертификатов взамен старым, если их пора обновлять, с записью лога в файл и последующая перезагрузка сервиса Nginx.

Файл лога будет выглядеть:

cat /var/log/cron-renew.log
= часть вывода команды =
--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/cloud.sevo44.ru.conf
--------------------------------------------------------------------

--------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/office.sevo44.ru.conf
--------------------------------------------------------------------

--------------------------------------------------------------------

The following certs are not due for renewal yet:
 /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem (skipped)
 /etc/letsencrypt/live/office.sevo44.ru/fullchain.pem (skipped)
No renewals were attempted.

В моем случае была попытка обновить 2 сертификата, но они актуальны и замена не производилась.

Файл настройки NextCloud для работы с SSL Nginx

Исходя из всего сказанного выше мой файл настройки получил такой вид:

vim /etc/nginx/conf.d/nextcloud.conf
= вывод команды c пояснениями =
# cloud.sevo44.ru 443 http2
    upstream php-handler { 
    #server 127.0.0.1:9000; 
    server unix:/run/php-fpm.socket; 
} 

server { 
    listen 80; 
    server_name cloud.sevo44.ru; 
    rewrite ^ https://$server_name$request_uri? permanent; 
} 
 
server { 
    # Работа сайта на ssl c включением протокола http2
    listen 443 ssl http2; 
    server_name cloud.sevo44.ru; 
    # Path to the root of your installation 
    root /var/www/nextcloud/htdocs/; 
    #Logs 
    access_log /var/www/nextcloud/logs/access.log main; 
    error_log /var/www/nextcloud/logs/error.log; 
 
    #Max upload size 
    client_max_body_size 10G; 
    fastcgi_buffers 64 4K; 
 
    # Enable gzip but do not remove ETag headers 
    gzip on; 
    gzip_vary on; 
    gzip_comp_level 4; 
    gzip_min_length 256; 
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth
; 
    gzip_types application/atom+xml application/javascript application/json appl
ication/ld+json application/manifest+json application/rss+xml application/vnd.ge
o+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-ap
p-manifest+json application/xhtml+xml application/xml font/opentype image/bmp im
age/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text
/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
     
    #Если самоподписной ssl 
    #ssl_certificate /etc/ssl/nginx/cloud.sevo44.loc.crt; 
    #ssl_certificate_key /etc/ssl/nginx/cloud.sevo44.loc.key; 
     
    #Для ssl 
    ssl_certificate /etc/letsencrypt/live/cloud.sevo44.ru/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/cloud.sevo44.ru/privkey.pem; 
    ssl_session_cache shared:le_nginx_SSL:1m; 
    ssl_session_timeout 1440m; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
    ssl_prefer_server_ciphers on; 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE
-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA3
84:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA3
84:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDH
E-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-A
ES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-
AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA
:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-S
HA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; 
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
     
    # Add headers to serve security related headers 
    # Before enabling Strict-Transport-Security headers please read into this 
    # topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    # includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains"; 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
     
    location = /robots.txt { 
        allow all; 
        log_not_found off; 
        access_log off; 
    } 
 
    #Для получения сертификата ssl 
    location ~ /.well-known { 
               allow all; 
    } 
 
    # The following 2 rules are only needed for the user_webfinger app. 
    # Uncomment it if you're planning to use this app. 
    #rewrite ^/.well-known/host-meta /public.php?service=host-meta last; 
    #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json 
    # last; 
 
    location = /.well-known/carddav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
    location = /.well-known/caldav { 
      return 301 $scheme://$host/remote.php/dav; 
    } 
 
    # Uncomment if your server is build with the ngx_pagespeed module 
    # This module is currently not supported. 
    #pagespeed off; 
 
    location / { 
        rewrite ^ /index.php$uri; 
    } 
 
    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)/ { 
        deny all; 
    } 
    location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { 
        deny all; 
    } 
 
    location ~ ^/(?:index|remote|public|cron|core/ajax/update|status|ocs/v[12]|u
pdater/.+|ocs-provider/.+)\.php(?:$|/) { 
    fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    #fastcgi_param HTTPS on; 
    #Avoid sending the security headers twice 
    fastcgi_param modHeadersAvailable true; 
    fastcgi_param front_controller_active true; 
    fastcgi_pass php-handler; 
    fastcgi_intercept_errors on; 
    fastcgi_request_buffering off; 
    } 
 
    location ~ ^/(?:updater|ocs-provider)(?:$|/) { 
    try_files $uri/ =404; 
    index index.php; 
    } 
 
    # Adding the cache control header for js and css files 
    # Make sure it is BELOW the PHP block 
    location ~ \.(?:css|js|woff|svg|gif)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    add_header Cache-Control "public, max-age=15778463"; 
    # Add headers to serve security related headers (It is intended to 
    # have those duplicated to the ones above) 
    # Before enabling Strict-Transport-Security headers please read into 
    # this topic first. 
    # add_header Strict-Transport-Security "max-age=15768000; 
    #  includeSubDomains; preload;"; 
    # 
    # WARNING: Only add the preload option once you read about 
    # the consequences in https://hstspreload.org/. This option 
    # will add the domain to a hardcoded list that is shipped 
    # in all major browsers and getting removed from this list 
    # could take several months. 
    add_header X-Content-Type-Options nosniff; 
    add_header X-XSS-Protection "1; mode=block"; 
    add_header X-Robots-Tag none; 
    add_header X-Download-Options noopen; 
    add_header X-Permitted-Cross-Domain-Policies none; 
    # Optional: Don't log access to assets 
    access_log off; 
    } 
 
    location ~ \.(?:png|html|ttf|ico|jpg|jpeg)$ { 
    try_files $uri /index.php$uri$is_args$args; 
    # Optional: Don't log access to other assets 
    access_log off; 
    } 
}

Ресурсы проверки SSL и Http2 сайта

Проверим сторонними ресурсами как установился наш SSL-сертификат.

  • SSLChecker — cервис проверки настройки SSL,
  • SSLReport — сервис проверки SSL но более детальный.

Проверим работу http2 протокола:

  • HTTP/2 Test — сервис показывающий проверяющий работу http2.

Ротация логов сайта Nginx

Так как логи сайта выведены из стандартного места хранения логов и файл отвечающего за легирование сайтов уже нестроен, согласно предыдущей статьи LEMP сервер на Calculate Linux, то нам достаточно добавить одну строчку:

vim /etc/logrotate.d/sites 
= вывод команды с пояснениями =
# Указываем в каждой строчке необходимый сайт 
/var/www/pma/logs/*log 
/var/www/nextcloud/logs/*log 
{ 
create 0644 nginx nginx 
daily 
rotate 60 
missingok 
notifempty 
compress 
sharedscripts 
postrotate 
test -r /run/nginx.pid && kill -USR1 `cat /run/nginx.pid` 
        endscript 
}

Результат

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