MySQL 5.7 на Rocky Linux

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

Вступление

С установкой старой версии PHP 5.6 всё гораздо проще и об этом рассказано в статье Нескольких версий PHP на сервере Linux.

Установку будем делать из бинарного дистрибутива. Перечень возможных бинарных дистрибутивов вы можете посмотреть по ссылке MySQL Community Downloads. Так же, можете ознакомиться с инструкцией по установке версии 5.7.

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

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

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

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

Установим необходимые пакеты которые нам могут потребоваться:

dnf install libaio  libaio-devel libncurses* tar wget

Создаём необходимую группу и пользователя:

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

Скачиваем исходник MySQL 5.7

Скачиваем необходимую версию:

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Распаковываем архив без вывода информации о процессе:

tar -zxf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Или с выводом информации:

tar zxvf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

Устанавливаем MySQL 5.7

Переименовываем и переносим папку в необходимое место:

mv mysql-5.7.37-linux-glibc2.12-x86_64 /opt/mysql-5.7

Создаём необходимые ссылки:

ln -s /opt/mysql-5.7/bin/mysql /usr/local/bin/mysql-5.7
ln -s /opt/mysql-5.7/bin/mysqldump /usr/local/bin/mysqldump-5.7

Переходим в папку и создаем папку под данные с назначением необходимых прав:

cd /opt/mysql-5.7
mkdir ./data
chown mysql:mysql ./data
chmod 755 ./data

Произведем начальную настройку сервера MySQL:

/opt/mysql-5.7 # ./bin/mysqld --initialize --user=mysql --basedir=./ --character-set-server=utf8
= вывод команды =
2022-02-02T06:37:58.431193Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp 
server option (see documentation for more details).
2022-02-02T06:38:00.706137Z 0 [Warning] InnoDB: New log files created, LSN=45790
2022-02-02T06:38:01.541332Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2022-02-02T06:38:01.967699Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: ab3a127b-83f2-11ec-a16b-0e4799458f07.
2022-02-02T06:38:02.022913Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2022-02-02T06:38:03.275737Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.275828Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2022-02-02T06:38:03.276874Z 0 [Warning] CA certificate ca.pem is self signed.
2022-02-02T06:38:03.592321Z 1 [Note] A temporary password is generated for root@localhost: zRD?OXe,5NsfvfgTI

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

Копируем в необходимое место:

cp support-files/mysql.server /etc/init.d/mysql-5.7

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

vim /etc/init.d/mysql-5.7
Необходимый код файла /etc/init.d/mysql-5.7
#!/bin/sh
# Copyright Abandoned 1996 TCX DataKonsult AB & Monty Program KB & Detron HB
# This file is public domain and comes with NO WARRANTY of any kind
 
# MySQL daemon start/stop script.
 
# Usually this is put in /etc/init.d (at least on machines SYSV R4 based
# systems) and linked to /etc/rc3.d/S99mysql and /etc/rc0.d/K01mysql.
# When this is done the mysql server will be started when the machine is
# started and shut down when the systems goes down.
 
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.
 
# Comments to support LSB init script conventions
### BEGIN INIT INFO
# Provides: mysql-5.7
# Required-Start: $local_fs $network $remote_fs
# Should-Start: ypbind nscd ldap ntpd xntpd
# Required-Stop: $local_fs $network $remote_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop MySQL
# Description: MySQL is a very fast and reliable SQL database engine.
### END INIT INFO
 
# If you install MySQL on some other places than /usr/local/mysql, then you
# have to do one of the following things for this script to work:
#
# - Run this script from within the MySQL installation directory
# - Create a /etc/my.cnf file with the following information:
#   [mysqld]
#   basedir=<path-to-mysql-installation-directory>
# - Add the above to any other configuration file (for example ~/.my.ini)
#   and copy my_print_defaults to /usr/bin
# - Add the path to the mysql-installation-directory to the basedir variable
#   below.
#
# If you want to affect other MySQL variables, you should make your changes
# in the /etc/my.cnf, ~/.my.cnf or other MySQL configuration files.
 
# If you change base dir, you must also change datadir. These may get
# overwritten by settings in the MySQL configuration files.
 
basedir=/opt/mysql-5.7
datadir=
mycnf=/etc/mysql/5.7/my.cnf
 
# Default value, in seconds, afterwhich the script should timeout waiting
# for server start. 
# Value here is overriden by value in my.cnf. 
# 0 means don't wait at all
# Negative numbers mean to wait indefinitely
service_startup_timeout=900
 
# Lock directory for RedHat / SuSE.
lockdir='/var/lock/subsys'
lock_file_path="$lockdir/mysql"
 
# The following variables are only set for letting mysql.server find things.
 
# Set some defaults
mysqld_pid_file_path=
if test -z "$basedir"
then
  basedir=/usr/local/mysql
  bindir=/usr/local/mysql/bin
  if test -z "$datadir"
  then
    datadir=/usr/local/mysql/data
  fi
  sbindir=/usr/local/mysql/bin
  libexecdir=/usr/local/mysql/bin
else
  bindir="$basedir/bin"
  if test -z "$datadir"
  then
    datadir="$basedir/data"
  fi
  sbindir="$basedir/sbin"
  libexecdir="$basedir/libexec"
fi
 
# datadir_set is used to determine if datadir was set (and so should be
# *not* set inside of the --basedir= handler.)
datadir_set=
 
#
# Use LSB init script functions for printing messages, if possible
#
lsb_functions="/lib/lsb/init-functions"
if test -f $lsb_functions ; then
  . $lsb_functions
else
  log_success_msg()
  {
    echo " SUCCESS! $@"
  }
  log_failure_msg()
  {
    echo " ERROR! $@"
  }
fi
 
PATH="/sbin:/usr/sbin:/bin:/usr/bin:$basedir/bin"
export PATH
 
mode=$1    # start or stop
 
[ $# -ge 1 ] && shift
 
 
other_args="$*"   # uncommon, but needed when called from an RPM upgrade action
           # Expected: "--skip-networking --skip-grant-tables"
           # They are not checked here, intentionally, as it is the resposibility
           # of the "spec" file author to give correct arguments only.
 
case `echo "testing\c"`,`echo -n testing` in
    *c*,-n*) echo_n=   echo_c=     ;;
    *c*,*)   echo_n=-n echo_c=     ;;
    *)       echo_n=   echo_c='\c' ;;
esac
 
parse_server_arguments() {
  for arg do
    case "$arg" in
      --basedir=*)  basedir=`echo "$arg" | sed -e 's/^[^=]*=//'`
                    bindir="$basedir/bin"
		    if test -z "$datadir_set"; then
		      datadir="$basedir/data"
		    fi
		    sbindir="$basedir/sbin"
		    libexecdir="$basedir/libexec"
        ;;
      --datadir=*)  datadir=`echo "$arg" | sed -e 's/^[^=]*=//'`
		    datadir_set=1
	;;
      --pid-file=*) mysqld_pid_file_path=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
      --service-startup-timeout=*) service_startup_timeout=`echo "$arg" | sed -e 's/^[^=]*=//'` ;;
    esac
  done
}
 
wait_for_pid () {
  verb="$1"           # created | removed
  pid="$2"            # process ID of the program operating on the pid-file
  pid_file_path="$3" # path to the PID file.
 
  i=0
  avoid_race_condition="by checking again"
 
  while test $i -ne $service_startup_timeout ; do
 
    case "$verb" in
      'created')
        # wait for a PID-file to pop into existence.
        test -s "$pid_file_path" && i='' && break
        ;;
      'removed')
        # wait for this PID-file to disappear
        test ! -s "$pid_file_path" && i='' && break
        ;;
      *)
        echo "wait_for_pid () usage: wait_for_pid created|removed pid pid_file_path"
        exit 1
        ;;
    esac
 
    # if server isn't running, then pid-file will never be updated
    if test -n "$pid"; then
      if kill -0 "$pid" 2>/dev/null; then
        :  # the server still runs
      else
        # The server may have exited between the last pid-file check and now.  
        if test -n "$avoid_race_condition"; then
          avoid_race_condition=""
          continue  # Check again.
        fi
 
        # there's nothing that will affect the file.
        log_failure_msg "The server quit without updating PID file ($pid_file_path)."
        return 1  # not waiting any more.
      fi
    fi
 
    echo $echo_n ".$echo_c"
    i=`expr $i + 1`
    sleep 1
 
  done
 
  if test -z "$i" ; then
    log_success_msg
    return 0
  else
    log_failure_msg
    return 1
  fi
}
 
# Get arguments from the my.cnf file,
# the only group, which is read from now on is [mysqld]
if test -x "$bindir/my_print_defaults";  then
  print_defaults="$bindir/my_print_defaults"
else
  # Try to find basedir in /etc/my.cnf
  conf=/etc/my.cnf
  print_defaults=
  if test -r $conf
  then
    subpat='^[^=]*basedir[^=]*=\(.*\)$'
    dirs=`sed -e "/$subpat/!d" -e 's//\1/' $conf`
    for d in $dirs
    do
      d=`echo $d | sed -e 's/[ 	]//g'`
      if test -x "$d/bin/my_print_defaults"
      then
        print_defaults="$d/bin/my_print_defaults"
        break
      fi
    done
  fi
 
  # Hope it's in the PATH ... but I doubt it
  test -z "$print_defaults" && print_defaults="my_print_defaults"
fi
 
#
# Read defaults file from 'basedir'.   If there is no defaults file there
# check if it's in the old (depricated) place (datadir) and read it from there
#
 
extra_args=""
if test -r "$basedir/my.cnf"
then
  extra_args="-e $basedir/my.cnf"
fi
 
parse_server_arguments `$print_defaults $extra_args mysqld server mysql_server mysql.server`
 
#
# Set pid file if not given
#
if test -z "$mysqld_pid_file_path"
then
  mysqld_pid_file_path=$datadir/`hostname`.pid
else
  case "$mysqld_pid_file_path" in
    /* ) ;;
    * )  mysqld_pid_file_path="$datadir/$mysqld_pid_file_path" ;;
  esac
fi
 
case "$mode" in
  'start')
    # Start daemon
 
    # Safeguard (relative paths, core dumps..)
    cd $basedir
 
    echo $echo_n "Starting MySQL"
    if test -x $bindir/mysqld_safe
    then
      # Give extra arguments to mysqld with the my.cnf file. This script
      # may be overwritten at next upgrade.
      $bindir/mysqld_safe --defaults-file="$mycnf" --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
      wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
 
      # Make lock for RedHat / SuSE
      if test -w "$lockdir"
      then
        touch "$lock_file_path"
      fi
 
      exit $return_value
    else
      log_failure_msg "Couldn't find MySQL server ($bindir/mysqld_safe)"
    fi
    ;;
 
  'stop')
    # Stop daemon. We use a signal here to avoid having to know the
    # root password.
 
    if test -s "$mysqld_pid_file_path"
    then
      # signal mysqld_safe that it needs to stop
      touch "$mysqld_pid_file_path.shutdown"
 
      mysqld_pid=`cat "$mysqld_pid_file_path"`
 
      if (kill -0 $mysqld_pid 2>/dev/null)
      then
        echo $echo_n "Shutting down MySQL"
        kill $mysqld_pid
        # mysqld should remove the pid file when it exits, so wait for it.
        wait_for_pid removed "$mysqld_pid" "$mysqld_pid_file_path"; return_value=$?
      else
        log_failure_msg "MySQL server process #$mysqld_pid is not running!"
        rm "$mysqld_pid_file_path"
      fi
 
      # Delete lock for RedHat / SuSE
      if test -f "$lock_file_path"
      then
        rm -f "$lock_file_path"
      fi
      exit $return_value
    else
      log_failure_msg "MySQL server PID file could not be found!"
    fi
    ;;
 
  'restart')
    # Stop the service and regardless of whether it was
    # running or not, start it again.
    if $0 stop  $other_args; then
      $0 start $other_args
    else
      log_failure_msg "Failed to stop running server, so refusing to try to start."
      exit 1
    fi
    ;;
 
  'reload'|'force-reload')
    if test -s "$mysqld_pid_file_path" ; then
      read mysqld_pid <  "$mysqld_pid_file_path"
      kill -HUP $mysqld_pid && log_success_msg "Reloading service MySQL"
      touch "$mysqld_pid_file_path"
    else
      log_failure_msg "MySQL PID file could not be found!"
      exit 1
    fi
    ;;
  'status')
    # First, check to see if pid file exists
    if test -s "$mysqld_pid_file_path" ; then 
      read mysqld_pid < "$mysqld_pid_file_path"
      if kill -0 $mysqld_pid 2>/dev/null ; then 
        log_success_msg "MySQL running ($mysqld_pid)"
        exit 0
      else
        log_failure_msg "MySQL is not running, but PID file exists"
        exit 1
      fi
    else
      # Try to find appropriate mysqld process
      mysqld_pid=`pidof $libexecdir/mysqld`
 
      # test if multiple pids exist
      pid_count=`echo $mysqld_pid | wc -w`
      if test $pid_count -gt 1 ; then
        log_failure_msg "Multiple MySQL running but PID file could not be found ($mysqld_pid)"
        exit 5
      elif test -z $mysqld_pid ; then 
        if test -f "$lock_file_path" ; then 
          log_failure_msg "MySQL is not running, but lock file ($lock_file_path) exists"
          exit 2
        fi 
        log_failure_msg "MySQL is not running"
        exit 3
      else
        log_failure_msg "MySQL is running but PID file could not be found"
        exit 4
      fi
    fi
    ;;
    *)
      # usage
      basename=`basename "$0"`
      echo "Usage: $basename  {start|stop|restart|reload|force-reload|status}  [ MySQL server options ]"
      exit 1
    ;;
esac
 
exit 0

[свернуть]

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

chmod +x /etc/init.d/mysql-5.7

Создаем папку для конфигурации сервера и создаём файл конфигурации:

mkdir -p /etc/mysql/5.7
vim /etc/mysql/5.7/my.cnf
= необходимый код =
[client]
default-character-set = utf8
port = 3307
socket = /tmp/mysql-5.7.sock
 
[mysqld]
basedir = /opt/mysql-5.7
bind-address = 0.0.0.0
character-set-server = utf8
collation-server = utf8_general_ci
port = 3307
socket = /tmp/mysql-5.7.sock
default-authentication-plugin = mysql_native_password
server-id = 1
 
[mysqldump]
quick
max_allowed_packet = 16M
 
[mysql]
default-character-set = utf8
no-auto-rehash

Обращаю внимание что указывается не стандартный порт для работы сервиса. Можете указать стандартный порт 3306 для работы MySQL.

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

systemctl enable mysql-5.7 
systemctl start mysql-5.7

= или одной командой =
systemctl enable --now mysql-5.7

Авторизуемся, меняем пароль и смотрим статус работы сервера MySQL:

/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: вводим пароль от root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.37
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
= вывод нам говорит что необходимо сменить пароль и мы его меняем =
mysql> SET PASSWORD = PASSWORD('пароль');
Query OK, 0 rows affected, 1 warning (0,00 sec)
= выходим =
mysql> \q
Bye
= авторизуемся с новым паролем =
/opt/mysql-5.7 # mysql-5.7 --defaults-file=/etc/mysql/5.7/my.cnf -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.37 MySQL Community Server (GPL)
 
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
 
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql> STATUS;
= вывод команды =
--------------
mysql-5.7  Ver 14.14 Distrib 5.7.37, for linux-glibc2.12 (x86_64) using  EditLine wrapper
 
Connection id:		3
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.37 MySQL Community Server (GPL)
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8
Db     characterset:	utf8
Client characterset:	utf8
Conn.  characterset:	utf8
UNIX socket:		/tmp/mysql-5.7.sock
Uptime:			2 min 15 sec
 
Threads: 1  Questions: 9  Slow queries: 0  Opens: 109  Flush tables: 1  Open tables: 102  Queries per second avg: 0.066
--------------
 
mysql> \q
Bye

Заключение

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

Lnav просмотр логов в Linux

Lnav представляет собой расширенный просмотрщик файлов журналов (log) для терминала Linux. Открывает архивные логи, отображает содержимое в режиме реального времени, возможно открыть сразу несколько логов и увидеть их наложение на одном экране.

Введение

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

Основные преимущества утилиты:

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

Установка Lnav

Утилита присутствует во всех популярных операционных системах Linux.

Более подробно о программе и работе с ней можно посмотреть на официальном сайте Lnav.

Установка из репозитория:

= Семейство Debian =
apt install lnav

= Семейство RedHat =
dnf install lnav

Работа с Lnav

В сети существует Документация по Lnav на русском языке в котором все хорошо рассказано.

Lnav понимает наиболее популярные форматов логов, таких как access логи веб сервера, syslog, dpkg, strace и другие. Программа автоматически подсвечивает, позволяет быстро делать какие-то выборки. Например, посмотреть все ошибки в нужном логе, показать по ним статистику, вывести информацию по какой-то службе и т.д. и т. п.

В Lnav есть возможность открыть сразу несколько логов и увидеть их наложение на одном экране. Это удобно, когда надо что-то расследовать.

Открываем сразу два лога такой командой:

# В случае если находимся в нужной папке
/var/www/sevo44.ru/log # lnav sevo44.ru-access.log sevo44.ru-error.log

# С указанием полного пути
lnav /var/www/sevo44.ru/log/sevo44.ru-access.log /var/www/sevo44.ru/log/sevo44.ru-error.log

Утилита выстроит строки обоих логов в порядке времени событий.

Заключение

Конечно для более профессионального подхода в изучении логов лучше использовать такое решение как Elastic Stack, но пока его нет или не подключили новый ресурс использование утилиты Lnav лучшее решение.

Кроме того не надо путать мониторинг логов и мониторинг параметров системы это совсем разные вещи. Например я лично для мониторинга разных параметров системы активно и давно использую систему Zabbix.

1С:Предприятие 8.3 на Astra Linux

Установим и настроим 1С:Предприятие 8.3 на OC Astra Linux. Работать программа может на свободном терминальном сервере XRDP для удобного подключения по протоколу RDP.  Из всех вариантов этот вариант меня порадовала больше всего.

Введение

Произведём установку и настройку программы «1С:Предприятие 8.3» c конфигурацией «Бухгалтерия предприятия (базовая)» с программной и аппаратной лицензией. Установка будет производиться на сервер работающий под управлением Astra Linux Common Edition 2.12.44. Сделаем удаленный доступ с помощью XRDP который позволит одновременно сидеть на сервере нескольким пользователям по протоколу RDP.

Требования, которые предъявляет разработчик к системам на которых может работать их продукты, вы можете найти на странице Системные требования «1С:Предприятия 8».

После установки программы, в справке по пути: «1С:Предприятие» — «Работа пользователя» — «Особенности работы в Linux», можно ознакомиться с нюансами работы системы.

Многие компании, занимающиеся 1С, будут советовать вам приобрести для работы в системе именно систему Windows, обосновывая это большей надежностью и удобством. Имейте в виду, что при продаже Windows продавец, согласно политике компании, получает приличное вознаграждение, что вызывает у многих естественное желание продать побольше. В ряде случаев действительно придется использовать систему Windows, но не факт, что она подойдёт именно вам.

Платформа и конфигурация 1С:Предприятие для Linux

В документах, которые вы получили после приобретения программного продукта семейства 1С, вы найдете регистрационные данные которые необходимы для регистрации на портале поддержки 1C:Портал поддержки. После регистрации и активации своего продукта, вы получите доступ для скачивания всего необходимого.

Иногда компании, в которых вы приобретаете продукт, может зарегистрировать продукт за вас. Уточните этот момент перед тем, как зарегистрируетесь сами.

Различие Базовой и Проф конфигурации

К выбору версии надо подходить очень аккуратно и четко понимать, что и в каком виде нужно именно вам. Не стоит идти на уловки компаний — дилеров, не спешить с приобретением ПРОФ версии и подписки ИТС.

Рассмотрим кратко основные отличия:

  • Базовая версия — при этом выборе вы можете вести только одну организацию в одной базе. Таких баз можно вести сколько угодно, но для каждой организации будет своя база. Плюс заключается в том, что вы всегда сможете сами обновляться с официального сайта поддержки, не прибегая к помощи сторонних специалистов. Но есть и минус — работать сможет только один пользователь. Ни о какой совместной работе в базе нескольких человек, не может быть и речи.

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

  • ПРОФ версия — как только вы перешли на эту версию, обновления будут доступны только при подписке ИТС. Появится возможность вносить изменения в конфигурацию, работать нескольким пользователям и вести несколько фирм в одной базе.

Важно иметь в виду, что при переходе на ПРОФ версию, вы полностью будете зависеть от той компании, в которой оформили подписку ИТС. Таких компаний много, важно выбрать хорошую и надёжную. Лучше, если эту компанию вам порекомендуют те, которым вы доверяете.

Вот вопрос-ответ службы поддержки 1С на два моих вопроса.

Версию ПРОФ в отличии от БАЗОВОЙ можно обновлять только при активной подписке на ИТС? — Да.

В моем случае, для тестирования без приобретения подписки ИТС, я не смогу обновлять версию ПРОФ легальными способами? — Да.

В практике мне приходилось сталкиваться с тем, что иногда компания использует старую версию программы (например 8.1) и хочет перейти и обновиться до новой версии 8.3, но продавец у которого они приобретали продукт говорит, что надо купить новую версию. Каково же было их удивление, когда я обновлял им программу до последней версии и показывал, как надо обновляться в дальнейшем.

Программная и аппаратная лицензия 1С:Предприятие

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

В практике встречался случай, когда компания приобрела программную лицензию на 5 пользователей и активировала её не для сервера, а для каждого пользовательского компьютера. Поначалу все было нормально, но когда база увеличилась, начались проблемы со скоростью. Использование скоростного диска SSD и перевода сети на 1 Gbit сильно улучшило ситуацию.

Варианты разворачивания сети 1С:Предприятие

Все хотят работать в программе 1С быстро, как на предприятии, так и дома. Все это возможно оптимально настроить различными способами.

Существует два вида работы базы данных:

  1. Файловая база данных — самый простой вариант и подходит для небольших организаций идеально. Этот вариант мы и рассмотрим в данной статье.
  2. База данных SQL — более сложный вариант и ориентирован на большое количество пользователей. При небольшом количестве пользователей нет смысла использовать такой вариант. Для работы будет нужна серверная лицензия, она стоит около 80 000 рублей.

Внимание!
Сервер 1С:Предприятия 8.3 под Linux может запуститься и без лицензии, при этом он позволяет иметь в кластере только один рабочий процесс, который допускает не более 12 клиентских соединений. Однако такая работа сервера не дает права использования программного обеспечения сервера 1С:Предприятия без покупки продукта «1С:Предприятие 8.3 Лицензия на сервер». Об этом сказано в лицензионном соглашении любой основной поставки 1С:Предприятия.

Оптимальное использование файловой базы данных 1C:Предприятие

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

Существует два варианта улучшения скорости работы в файловой базе данных:

  • Использование локальной сети 1 Gbit и диска SSD для базы данных — на какой-то момент это улучшит положение, но как показывает практика -ненадолго.
  • Использование терминального сервера — при таком варианте приобретается один мощный компьютер, на котором устанавливается программа, а все пользователи удалено подключаются к компьютеру используя свой профиль. Получится, что на одном компьютере будет одновременно несколько пользователей, не видя друг друга. По сети передается только картинка, а вся работа производится на сервере. Можно настроить удаленный доступ из интернета, и тогда избранные пользователи смогут используя медленный интернет спокойно работать в программе с домашнего компьютера.

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

Установка терминального сервера XRDP

Устанавливаем сервер для возможности удаленного доступа к серверу несколькими пользователями:

apt install xrdp xorgxrdp

Проверяем статус:

# systemctl status xrdp
 xrdp.service - xrdp daemon
   Loaded: loaded (/lib/systemd/system/xrdp.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-04-19 20:59:44 MSK; 2min 27s ago
      Docs: man:xrdp(8)
            man:xrdp.ini(5)
 Main PID: 2443 (xrdp)
   CGroup: /system.slice/xrdp.service
           └─2443 /usr/sbin/xrdp --nodaemon

апр 19 20:59:44 1c systemd[1]: Starting xrdp daemon...
апр 19 20:59:44 1c systemd[1]: Started xrdp daemon.
апр 19 20:59:44 1c xrdp[2443]: [INFO ] starting xrdp with pid 2443
апр 19 20:59:44 1c xrdp[2443]: [INFO ] address [0.0.0.0] port [3389] mode 1
апр 19 20:59:44 1c xrdp[2443]: [INFO ] listening to port 3389 on 0.0.0.0
апр 19 20:59:44 1c xrdp[2443]: [INFO ] xrdp_listen_pp done

Всё работает и добавлено на автозагрузку при запуске системы.

Используя протокол RDP подключаемся к серверу и работаем.

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

Установка 1С Предприятие 8.3 на Astra Linux

Пошагово пройдем путь установки программы на систему Astra Linux.

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

Для установки необходимо в консоли зайти под пользователем root:

sevo44@orel-astra:~$ su -
Пароль: 
root@orel-astra:~#

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

passwd root

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

mkdir /root/srv1cv83-install
mkdir /home/base1c

Установим пакеты, которые необходимы для установки и корректной работы программы:

apt install libwebkitgtk-3.0.0 imagemagick unixodbc libgsf-bin t1utils

Установка 1С:Предприятие 8.3

Скачиваем с сайта поддержки 1С  «Технологическая платформа 1С:Предприятия (64-bit) для Linux».

Распаковываем архив в папку srv1cv83-install с помощью консоли:

cd /root/srv1cv83-install 
tar xvzf server64_8_3_20_1789.tar.gz 
ls
= вывод команды =
LibericaJDK-8-9-10-licenses.pdf Liberica-Notice.txt setup-full-8.3.20.1789-x86_64.run server64_8_3_20_1789.tar.gz

Запускаем установку:

./setup-full-8.3.20.1789-x86_64.run

Работа с 1С:Предприятие в системе Linux

Проверим какие процессы запущены:

ps aux|grep 1c
= вывод команды =
root 3391 0.0 0.0 12788 932 pts/0 S+ 01:02 0:00 grep 1c

= вывод команды ! при запущенной программе =
root 3399 15.3 4.6 635036 146160 ? Ssl 01:04 0:01 /opt/1cv8/x86_64/8.3.20.1789/1cv8s
root 3432 0.0 0.0 12788 932 pts/0 S+ 01:04 0:00 grep 1c

Активирование программной лицензии 1С:Предприятие

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

Для активации однопользовательской программной лицензии, необходимо запустить программу 1С:Предприятие под пользователем root, только тогда при активации появится необходимое поле.

Установка HASP для работы с USB ключом

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

Смотрим какая есть последняя версия на сайте и скачиваем последнюю.

Перейдем в папку и скачаем туда пакет:

cd /root/srv1cv83-install
wget http://download.etersoft.ru/pub/Etersoft/HASP/stable/x86_64/AstraLinux/orel/haspd_8.23-eter2astra_amd64.deb

Установим:

dpkg -i haspd_*.deb 
= вывод команды =
Выбор ранее невыбранного пакета haspd.
(Чтение базы данных … на данный момент установлено 217439 файлов и каталогов.)
Подготовка к распаковке haspd_8.23-eter2astra_amd64.deb …
Распаковывается haspd (8.23-eter2astra) …
Настраивается пакет haspd (8.23-eter2astra) …
Обрабатываются триггеры для systemd (232-25+deb9u12astra.ce9) …

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

service haspd start
service haspd status
= вывод команды =
 haspd.service - LSB: Hasp keys support
   Loaded: loaded (/etc/init.d/haspd; generated; vendor preset: enabled)
   Active: active (running) since Tue 2022-04-19 01:12:33 MSK; 9s ago
      Docs: man:systemd-sysv-generator(8)
  Process: 3629 ExecStart=/etc/init.d/haspd start (code=exited, status=0/SUCCESS)
    Tasks: 10 (limit: 4915)
  CGroup: /system.slice/haspd.service
          ├─3634 aksusbd
          └─3645 hasplmd -s

апр 19 01:12:33 orel-astra systemd[1]: Starting LSB: Hasp keys support...
апр 19 01:12:33 orel-astra aksusbd[3634]: loaded, daemon version: 8.23.1.119312, key API (USB) version: 3
апр 19 01:12:33 orel-astra haspd[3629]: Running aksusbd... [ DONE ]
апр 19 01:12:33 orel-astra hasplmd[3645]: HASP LM v25.2.1.119312 loaded
апр 19 01:12:33 orel-astra haspd[3629]: Running hasplmd... [ DONE ]
апр 19 01:12:33 orel-astra systemd[1]: Started LSB: Hasp keys support.

Все хорошо. Осталось подключить USB ключ.

В системе Proxmox проброс нужного порта в виртуальную машину делается очень просто:

Для проверки работы ключа откроем браузер по ссылке http://127.0.0.1:1947 и смотрим появление нашего ключа в списке:

Создание файловой базы данных 1C:Предприятие

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

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

В моем случае, я скопировал папку с базой в нужное место и выдал необходимые права:

chmod -R 777 /home/base1c

Права надо выдавать только после того, как скопируете все необходимые базы 1С!

Запуск 1C:Предприятие

В меню появилась ссылка на запуск программы:

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

Переходим в необходимое место и смотрим информацию которая там указывается.

Проблемы со шрифтами

Не сразу заметил проблему со шрифтами при экспорте в pdf файл. Часть текста обрезалась, и информация была не полной. Можно ставить пакеты со шрифтами, но достаточно иметь шрифты по пути /usr/share/fonts/msttcorefonts.

Скачиваем и распаковываем архив в нужное место под пользователем root:

cd /usr/share/fonts
wget https://sevo44.ru/sevo44/download/msttcorefonts.tar.gz
tar xvzf msttcorefonts.tar.gz

Можно установить специальный пакет, который установит необходимые шрифты:

wget https://download.etersoft.ru/pub/Etersoft/WINE@Etersoft/2.1.4/fonts/x86_64/AstraLinux/orel/fonts-ttf-ms_1.0-eter4astra_all.deb
dpkg -i fonts-ttf-ms_1.0-eter4astra_all.deb

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

Вот так это выглядит, когда мы еще не установили необходимые шрифты:

С установленными шрифтами видно, что шрифт стал другой, но это малозаметно:

Обновление платформы 1С:Предприятие в Linux

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

Обновление базовой конфигурации 1C:Предприятие в Linux

Обновление для ПРОФ — это совсем другая история.

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

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

Резервное копирование

Механизм резервного копирования в самой программе не работает.

Общий план резервного копирования следующий:

  • Останавливаем все запущенные процессы 1С;
  • Делаем резервную копию методом архивирования папки с базой.

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

Смотрим, какие процессы запущены

ps aux|grep 1cv8
= вывод команды =
sevo44 1626 105 45.3 3634576 1825392 ? Sl 10:10 14:38 /opt/1cv8/x86_64/8.3.20.1789/1cv8c ENTERPRISE /IBName"Информационная база" /AppAutoCheckMode
root 1801 0.0 0.0 12788 968 pts/0 S+ 10:23 0:00 grep 1cv8

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

mkdir /root/{bin,backup1c}

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

vim /root/bin/backup1c.sh
= необходимый код =
#!/bin/sh
# Дата в формате 2015-09-29_04-10
date_time=`date +"%Y-%m-%d_%H-%M"`
# Путь сохранения копии
bk_dir='/root/backup1c'

# Вначале смотрим в Диспетчер задач название приложения
# затем смотрим вывод -> ps aux | grep 1cv8c
# Выполняем команду, которая завершит все процессы
# Если не писать никакого сигнала, то команда выполнит
# SIGTERM - немедленно завершает процесс, но обрабатывается программой,
# поэтому позволяет ей завершить дочерние процессы и освободить все ресурсы.
# killall - завершит все имеющиеся процессы с таким именем

# Закрываем 1с
killall 1cv8c

# Создаем файл с датой создания базы
echo `date +"%Y-%m-%d_%H-%M"` > /root/backup1c/timestamp

# Создаем базу через 10 секунд
sleep 10
/bin/tar -cvzf $bk_dir/dolotov1cbase_$date_time.tar.gz /home/base1c/dolotov1cbase/*
# Удаляем копии старше 3-x дней
/usr/bin/find $bk_dir -type f -mtime +1 -exec rm {} \;

После создания скрипта делаем его исполнительным:

chmod +x /root/bin/backup1c.sh

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

sh /root/bin/backup1c.sh
= вывод команды =
/bin/tar: Удаляется начальный `/' из имен объектов
/home/base1c/dolotov1cbase/1CHelpIndex/
/home/base1c/dolotov1cbase/1CHelpIndex/userVocabulary_ru.bin
/home/base1c/dolotov1cbase/1CHelpIndex/userDocs_ru.bin
/home/base1c/dolotov1cbase/1CHelpIndex/userPostings_ru.bin
/home/base1c/dolotov1cbase/1Cv8.1CD
/home/base1c/dolotov1cbase/1Cv8.1CD.cfl
/home/base1c/dolotov1cbase/1Cv8.1CL
/home/base1c/dolotov1cbase/1Cv8.1CL.cfl
/home/base1c/dolotov1cbase/1Cv8.cgr.cfl
/home/base1c/dolotov1cbase/1Cv8FTxt/
/home/base1c/dolotov1cbase/1Cv8FTxt/checkoutReasonProtect.dat
/home/base1c/dolotov1cbase/1Cv8FTxt/checkout.dat
/home/base1c/dolotov1cbase/1Cv8FTxt/checkoutReasonFile.dat
/home/base1c/dolotov1cbase/1Cv8IntegSrvc/
/home/base1c/dolotov1cbase/1Cv8IntegSrvc/exec.lck.cfl
/home/base1c/dolotov1cbase/1Cv8JobScheduler/
/home/base1c/dolotov1cbase/1Cv8JobScheduler/exec.lck.cfl
/home/base1c/dolotov1cbase/1Cv8JobScheduler/jobs.dat
/home/base1c/dolotov1cbase/1Cv8JobScheduler/jobs.dat.cfl
/home/base1c/dolotov1cbase/1Cv8JobScheduler/exec.lck
/home/base1c/dolotov1cbase/1Cv8Log/
/home/base1c/dolotov1cbase/1Cv8Log/1Cv8.lgd
/home/base1c/dolotov1cbase/1Cv8Temp/
/home/base1c/dolotov1cbase/1Cv8tmp.1CD
/home/base1c/dolotov1cbase/1Cv8tmp.1CD.cfl
/home/base1c/dolotov1cbase/1Cv8tmp.1CL
/home/base1c/dolotov1cbase/1Cv8tmp.1CL.cfl
/home/base1c/dolotov1cbase/default.vrd
/home/base1c/dolotov1cbase/logcfg.xml

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

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

vim /etc/crontab
= необходимый код =
### Backup1С
# ежедневно в 3 часа
00 3 * * * root /root/bin/backup1c.sh >/dev/null 2>&1

Согласно команде каждый день в 3:00 будет выполняться скрипт для создания ежедневного бэкапа.

Заключение

Установку и настройку 1С:Предприятие я выполнял на разных системах, но установка на Astra Linux была самая простая. Настройка терминального сервера XRDP для подключения пользователей по протоколу RDP оказалась беспроблемной, так как всё заработало без дополнительного вмешательства в настройку.

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

Считаю, что использование Astra Linux под 1C:Предприятие — самый лучший вариант.

Шифрование данных в Linux

Использовать шифрование данных залог того что ваши данные не попадут в руки кому попало. В этой статье расскажу как производить шифрование диска или раздела в ОС Linux используется модуль ядра dm-crypt LUKS.

Введение

Чтобы выполнить шифрование диска в системе Linux используется модуль ядра dm-crypt. Этот модуль позволяет создавать в каталоге /dev/mapper виртуальное блочное устройство с возможностью его шифрования. Фактически все данные лежат на зашифрованном физическом разделе. Данные на лету шифруются и записываются на диск, при чтении с виртуального устройства, выполняется обратная операция — данные расшифровываются с физического диска и передаются в открытом виде через виртуальный диск пользователю. Обычно для шифрования используется протокол шифрования AES, потому что под него оптимизированы большинство современных процессоров.

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

Для работы с LUKS и модулем dm-crypt используется утилита Cryptsetup.

Создание шифрованного устройства

Общая схема работы с шифрованным устройством следующая:

  • Определяется устройство для шифрования;
  • Создается шифрованный раздел;
  • Производится форматирование раздела в необходимую файловую систему;
  • Монтирование раздела в систему.

Установка CRYPTSETUP

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

apt install cryptsetup

dnf install cryptsetup

Синтаксис запуска команды такой:

$ cryptsetup опции операция параметры_операции

Основные операции, которые можно сделать используя утилиту:

  • luksFormat — создать зашифрованный раздел luks linux;
  • luksOpen — подключить виртуальное устройство (нужен ключ);
  • luksClose — закрыть виртуальное устройство luks linux;
  • luksAddKey — добавить ключ шифрования;
  • luksRemoveKey — удалить ключ шифрования;
  • luksUUID — показать UUID раздела;
  • luksDump — создать резервную копию заголовков LUKS.

Подготовка устройства

Вначале необходимо вывести информацию об имеющихся дисках в системе:

fdisk -l
= вывод команды =
Диск /dev/sdb: 32 GiB, 6442450944 байт, 12582912 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт


Диск /dev/sda: 32 GiB, 34359738368 байт, 67108864 секторов
Единицы: секторов по 1 * 512 = 512 байт
Размер сектора (логический/физический): 512 байт / 512 байт
Размер I/O (минимальный/оптимальный): 512 байт / 512 байт
Тип метки диска: dos
Идентификатор диска: 0xdbf480c5

Устр-во   Загрузочный начало  Конец    Секторы  Размер  Идентификатор  Тип
/dev/sda1 *           2048    2099199  2097152  1G      83             Linux
/dev/sda2             2099200 67108863 65009664 31G     8e             Linux LVM

В нашем случае это диск /dev/sdb. Можно весь диск зашифровать или сделать зашифрованным только какой то раздел.

Для работы с диском я использую утилиту cfdisk.

cfdisk /dev/sdb

= C параметром -z можно создать заново таблицу разделов =
cfdisk -z /dev/sdb

Создание шифрованного раздела

Создадим шифрованный раздел из всего диска sdb:

cryptsetup -y -v luksFormat /dev/sdb
= вывод команды =
ПРЕДУПРЕЖДЕНИЕ: Устройство /dev/sdb уже содержит подпись раздела «dos».
 
WARNING!
========
Данные на /dev/sdb будут перезаписаны без возможности восстановления.
 
Are you sure? (Type uppercase yes): YES - Внимание! Писать только заглавными буквами!
Введите парольную фразу для /dev/sdb: ! пароль
Парольная фраза повторно: ! повтор пароля
Existing 'dos' partition signature on device /dev/sdb will be wiped.
Создан слот ключа 0.
Команда выполнена успешно.

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

Откроем созданный раздел с помощью модуля dm-crypt в /dev/mapper, для этого понадобится ввести пароль, с которым выполнялось создание раздела:

cryptsetup luksOpen /dev/sdb sdb_crypt

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

ls -l /dev/mapper/sdb_crypt
= вывод команды =
lrwxrwxrwx 1 root root 7 дек 27 21:53 /dev/mapper/sdb_crypt -> ../dm-3

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

cryptsetup -v status sdb_crypt
= вывод команды =
/dev/mapper/sdb_crypt is active.
type:    LUKS2
cipher:  aes-xts-plain64
keysize: 512 bits
key location: keyring
device:  /dev/sdb
sector size:  512
offset:  32768 sectors
size:    625109680 sectors
mode:    read/write
Команда выполнена успешно.

Рекомендую сделать резервную копию заголовков LUKS это может помочь при возможных в будущем проблем.

Делается резервная копия заголовка LUKS следующей командой:

cryptsetup luksDump /dev/sdb
= вывод команды =
LUKS header information
Version:       	2
Epoch:         	3
Metadata area: 	16384 [bytes]
Keyslots area: 	16744448 [bytes]
UUID:          	cf501772-dd9b-4554-bccc-7a6739e72142
Label:         	(no label)
Subsystem:     	(no subsystem)
Flags:       	(no flags)
 
Data segments:
  0: crypt
	offset: 16777216 [bytes]
	length: (whole device)
	cipher: aes-xts-plain64
	sector: 512 [bytes]
 
Keyslots:
  0: luks2
	Key:        512 bits
	Priority:   normal
	Cipher:     aes-xts-plain64
	Cipher key: 512 bits
	PBKDF:      argon2i
	Time cost:  4
	Memory:     903656
	Threads:    4
	Salt:       00 54 94 e7 r6 bb 00 ec 42 5a c9 81 7f d2 35 3d 
	            07 06 af 27 ac 15 80 5f 4f 29 37 ee 72 4b ff b8 
	AF stripes: 4000
	AF hash:    sha256
	Area offset:32768 [bytes]
	Area length:258048 [bytes]
	Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
	Hash:       sha256
	Iterations: 89043
	Salt:       ac 7b 53 43 4b b3 82 77 07 64 35 35 0b 2f fb c8 
	            24 e0 ba 58 90 3d da 14 2f df 8e f0 fa a6 6a 76 
	Digest:     3f f1 07 4d 93 1b db ae 88 55 21 fa 9a ad a9 a2 
	            ba 77 48 8b 84 41 aw 3c 0d 9d 5e 33 ae e0 af 44

Форматирование

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

dd if=/dev/zero of=/dev/mapper/sdb_crypt

Работа утилиты может занять несколько часов, чтобы иметь возможность наблюдать за процессом, используйте pv:

pv -tpreb /dev/zero | dd of=/dev/mapper/sdb_crypt bs=128M

В случае отсутствия утилиты pv её необходимо установить. Для систем на базе Debian необходимо выполнить команду # apt install pv

Отформатировать можно в любую необходимую файловую систему. В нашем случае отформатируем в ext4:

mkfs.ext4 /dev/mapper/sdb_crypt

Монтирование

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

mkdir /mnt/sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

= При необходимости можно дать полные права всем =
chmod 777 /mnt/sdb_crypt

Для проверки выполним команду которая покажет подмонтированые устройства в системе:

df -h
= вывод команды =
Файловая система         Размер   Использовано   Дост     Использовано%   Cмонтировано в
devtmpfs                 1,9G     0              1,9G     0%              /dev
tmpfs                    1,9G     0              1,9G     0%              /dev/shm
tmpfs                    1,9G     8,5M           1,9G     1%              /run
tmpfs                    1,9G     0              1,9G     0%              /sys/fs/cgroup
/dev/mapper/rl-root      28G      6,0G           22G      22%             /
/dev/sda1                1014M    334M           681M     33%             /boot
tmpfs                    374M     0              374M     0%              /run/user/0
/dev/mapper/sdb_crypt    32G      24M            32G      0%              /mnt/sdb_crypt

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

umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

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

cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

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

Скрипт для подключения шифрованного устройства:

vim /root/start-sdb_crypt.sh
= необходимый код 
#!/bin/bash
cryptsetup luksOpen /dev/sdb sdb_crypt
mount /dev/mapper/sdb_crypt /mnt/sdb_crypt

Скрипт для отключения шифрованного устройства:

vim /root/stop-sdb_crypt.sh
= необходимый код =
#!/bin/bash
umount /mnt/sdb_crypt
cryptsetup luksClose sdb_crypt

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

chmod +x /root/start-sdb_crypt.sh
chmod +x /root/stop-sdb_crypt.sh

Обслуживание

Проверка файловой системы LUKS

После открытия раздела он воспринимается системой, как и все другие. Для проверки можно использовать утилиту fsck ( при условии что файловая система отмантирована ):

fsck -vy /dev/mapper/sdb_crypt

Изменение парольной фразы LUKS

Парольную фразу можно изменить или создать до восьми разных парольных фраз.

Перед началом обязательно сделайте резервную копию заголовков LUKS:

cryptsetup luksDump /dev/sdb

Команда для создания новой парольной фразы:

cryptsetup luksAddKey /dev/sdb
= вывод команды =
Введите любую существующую парольную фразу: ! вводим существующий пароль
Введите новую парольную фразу для слота ключа: ! вводим новый пароль
Парольная фраза повторно: ! повторяем новый пароль

Команда для удаления существующего пароля:

cryptsetup luksRemoveKey /dev/sdb
= вывод команды =
Введите удаляемую парольную фразу: ! вводим удаляемую парольную фразу

Заключение

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

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

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

Нескольких версий PHP на сервере Linux

Несколько версий PHP на сервере Linux удобно в работе и последующем обслуживании.  В статье пример на базе Rocky Linux , но вы можете использовать его и для других систем использующих репозиторий RHEL.

Введение

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

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

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

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

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

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

Команды которые дают доступ к серверу по 80 и 443 порту в случае использования FirewallD:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Из статьи FirewallD базовая настройка вы можете узнать более подробно как работать с этим сервисом.

Перед началом использования репозитория Remi (на базе которого мы и будем устанавливать разные версии PHP) необходимо подключить репозиторий Epel созданный группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

Установка Epel для дистрибутивов на базе RHEL производится командой:

dnf install epel-release
dnf update

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

При написании статьи учитывается что настройка Nginx была произведена согласно статьи NGINX установка и настройка.

Установка базовой версии PHP

Про актуальность разных версий PHP можно узнать на сайте Supported Versions PHP.

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

# dnf module list php
Последняя проверка окончания срока действия метаданных: 1:27:39 назад, Ср 10 ноя 2021 11:34:45.
Rocky Linux 8 - AppStream
Name   Stream    Profiles                     Summary 
php    7.2 [d]   common [d], devel, minimal   PHP scripting language 
php    7.3       common [d], devel, minimal   PHP scripting language 
php    7.4       common [d], devel, minimal   PHP scripting language

Подсказка: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Видим что в базовой версии по умолчанию находится версия 7.2 её и будем устанавливать.

Установим php и наиболее популярные модули, которые могут пригодится в процессе эксплуатации веб сервера.

dnf install php php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache

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

php -v
= вывод команды =
PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies

Для того чтобы связать nginx и php будем использовать мост php-fpm. Основной файл настройки находится по пути /etc/php-fpm.conf и там должен быть параметр include=/etc/php-fpm.d/*.conf говорящий о том где лежат настройки пулов.

Запускаем php-fpm и добавляем в автозагрузку:

systemctl enable --now php-fpm

Проверяем, запустился ли он.

systemctl status php-fpm
= вывод команды =
 php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-11-10 13:51:24 EST; 16s ago
Main PID: 7567 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 6 (limit: 23681)
Memory: 17.3M
CGroup: /system.slice/php-fpm.service
        ├─7567 php-fpm: master process (/etc/php-fpm.conf)
        ├─7568 php-fpm: pool www
        ├─7569 php-fpm: pool www
        ├─7570 php-fpm: pool www
        ├─7571 php-fpm: pool www
        └─7572 php-fpm: pool www

ноя 10 13:51:24 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
ноя 10 13:51:24 localhost.localdomain systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно сервис успешно работает.

Настройки php находятся по стандартному пути /etc/php.ini а настройки пулов лежат в папке /etc/php-fpm.d/.

Использовать порт или сокет решать вам, но говорят что сокет использовать лучше. Запустим php-fpm через unix сокет. Для этого переименуем конфиг /etc/php-fpm.d/www.conf, создадим новый и приводим к следующему виду:

mv /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf_orig
vim /etc/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx
;listen = 127.0.0.1:9000
listen = /run/php-fpm/www.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx
listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
;pm.process_idle_timeout = 10s;
;pm.max_requests = 500

slowlog = /var/log/php-fpm/www-slow.log

;php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/lib/php/wsdlcache
php_value[opcache.file_cache]  = /var/lib/php/opcache

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

Назначим каталогу /var/lib/php правильное владение:

=== было ===
ls -l /var/lib/php
= вывод команды =
итого 0
drwxrwx--- 2 root apache  6 окт 22 12:08 opcache
drwxr-xr-x 2 root root   59 окт 28 10:05 peclxml
drwxrwx--- 2 root apache  6 окт 22 12:08 session
drwxrwx--- 2 root apache  6 окт 22 12:08 wsdlcache

=== Назначаем правильные права ===
chown -R root:nginx /var/lib/php

Перезапускаем php-fpm командой:

systemctl restart php-fpm

Проверяем, стартовал ли указанный сокет.

ll /run/php-fpm/www.sock 
srw-rw---- 1 nginx nginx 0 фев 13 10:35 /run/php-fpm/www.sock

Всё успешно настроено.

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

Например, прописать код fastcgi_pass unix:/run/php-fpm/www.sock; в секции location ~ \.php$

Настройка базовой версии закончена и приступаем к установке других версий php.

Версии PHP от Remi

Есть замечательный человек Remi Collet, который создал репозиторий пользующийся огромной популярностью у пользователей операционных систем на базе RHEL. Познакомится с новостями репозитория можно на блоге Remi Collet.

Подключаем репозиторий Remi, выполнив следующую команду:

dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

Посмотрим список всех доступных вариантов установки php:

dnf module list php
= вывод команды =
Safe Remi's RPM repository for Enterprise Linux 8 - x86_64 1.6 MB/s | 2.0 MB 00:01 
Rocky Linux 8 - AppStream
Name   Stream    Profiles                     Summary 
php    7.2 [d]   common [d], devel, minimal   PHP scripting language 
php    7.3       common [d], devel, minimal   PHP scripting language 
php    7.4       common [d], devel, minimal   PHP scripting language

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name   Stream    Profiles                     Summary 
php    remi-7.2  common [d], devel, minimal   PHP scripting language 
php    remi-7.3  common [d], devel, minimal   PHP scripting language 
php    remi-7.4  common [d], devel, minimal   PHP scripting language 
php    remi-8.0  common [d], devel, minimal   PHP scripting language 
php    remi-8.1  common [d], devel, minimal   PHP scripting language

Подсказка: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Из вывода выше видно что появилась возможность установить версии от 7.2 до 8.1 из реппозитрия Remi.

В выводе нет информации о возможности установить PHP версии 5.6, но сделать это можно по аналогии как мы будем устанавливать версии ниже. Достаточно указать код #dnf install php56 php56-php-fpm

Для чистоты эксперимента и наглядности установим две версии 7.4 и 8.1

В результате мы получим на сервере 3 разных версии php.

Установка версий PHP от Remi

Активируем репу php remi-7.4, для этого выполняем команды:

dnf module reset php
dnf module enable php:remi-7.4

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

dnf module list php

Установим php remi-7.4 и все популярные модули следующей командой:

dnf install php74 php74-php-fpm php74-php-cli php74-php-mysqlnd php74-php-gd php74-php-ldap php74-php-odbc php74-php-pdo php74-php-pear php74-php-xml php74-php-xmlrpc php74-php-mbstring php74-php-snmp php74-php-soap php74-php-zip php74-php-opcache

Обращаю особое внимание на указание именно php74 перед требуемыми пакетами. Только при таком названии пакетов установятся необходимые и не возникнет путаницы.

Сразу установим версию php 8.1 из репозитория Remi и выключим активную версию:

dnf module reset php 
dnf module enable php:remi-8.1
dnf install php81 php81-php-fpm php81-php-cli php81-php-mysqlnd php81-php-gd php81-php-ldap php81-php-odbc php81-php-pdo php81-php-pear php81-php-xml php81-php-xmlrpc php81-php-mbstring php81-php-snmp php81-php-soap php81-php-zip php81-php-opcache
dnf module reset php

После установки обеих версий PHP запустим оба сервиса и включим его в автозагрузку с помощью следующих команд:

systemctl enable --now php74-php-fpm
systemctl enable --now php81-php-fpm

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

# systemctl status php74-php-fpm
 php74-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-11-10 15:00:54 EST; 24s ago
Main PID: 8787 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 6 (limit: 23681)
Memory: 16.2M
CGroup: /system.slice/php74-php-fpm.service
       ├─8787 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
       ├─8788 php-fpm: pool www
       ├─8789 php-fpm: pool www
       ├─8790 php-fpm: pool www
       ├─8791 php-fpm: pool www
       └─8792 php-fpm: pool www

ноя 10 15:00:54 localhost.localdomain systemd[1]: Starting The PHP FastCGI Process Manager...
ноя 10 15:00:54 localhost.localdomain systemd[1]: Started The PHP FastCGI Process Manager.

Показан вывод версии php74 для версии php81 будет аналогичный.

Покажу дальнейшую настройку только для версии php74, так как настройка для php81 будет аналогичной.

Настройки php74 находятся по пути /etc/opt/remi/php74/php.ini а настройки пулов лежат в папке /etc/opt/remi/php74/php-fpm.d/.

Запустим php74-php-fpm через unix сокет. Для этого скопируем конфиг /etc/opt/remi/php74/php-fpm.d/www.conf и приведем оригинал к следующему виду:

cp /etc/opt/remi/php74/php-fpm.d/www.conf /etc/opt/remi/php74/php-fpm.d/www.conf-orig
vim /etc/opt/remi/php74/php-fpm.d/www.conf
= необходимый код =
[www]
user = nginx
group = nginx

listen = /var/opt/remi/php74/run/php-fpm/www.sock

;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

listen.acl_users = nginx
listen.acl_groups = nginx

listen.allowed_clients = 127.0.0.1

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

slowlog = /var/opt/remi/php74/log/php-fpm/www-slow.log

php_admin_value[error_log] = /var/opt/remi/php74/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
;php_admin_value[memory_limit] = 128M

php_value[session.save_handler] = files
php_value[session.save_path] = /var/opt/remi/php74/lib/php/session
php_value[soap.wsdl_cache_dir] = /var/opt/remi/php74/lib/php/wsdlcache
;php_value[opcache.file_cache] = /var/opt/remi/php74/lib/php/opcache

Назначим каталогу /var/opt/remi/php74/lib/php правильное владение:

=== было ===
ls -l /var/opt/remi/php74/lib/php
= вывод команды =
итого 0
drwxrwx--- 2 root apache 6 окт 20 02:01 opcache
drwxr-xr-x 2 root root 36 ноя 10 14:49 peclxml
drwxrwx--- 2 root apache 6 окт 20 02:01 session
drwxrwx--- 2 root apache 6 окт 20 02:01 wsdlcache
=== Назначаем правильные права ===
chown -R root:nginx /var/opt/remi/php74/lib/php

Перезапускаем php-fpm командой:

systemctl restart php74-php-fpm

Проверяем, стартовал ли указанный сокет.

ll /var/opt/remi/php74/run/php-fpm/www.sock
srw-rw----+ 1 root root 0 ноя 10 15:46 /var/opt/remi/php74/run/php-fpm/www.sock

Всё успешно настроено.

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

Например, прописать код fastcgi_pass unix:/var/opt/remi/php74/run/php-fpm/www.sock; в секции location ~ \.php$

Создание структуры каталогов для сайтов

Создадим корневые каталоги для сайтов.  Каждый сайт будет использовать свою версию php:

mkdir /var/www/php72 
mkdir /var/www/php74
mkdir /var/www/php81

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

chown -R nginx:nginx /var/www/php72
chown -R nginx:nginx /var/www/php74
chown -R nginx:nginx /var/www/php81
chmod -R 755 /var/www/php72
chmod -R 755 /var/www/php74
chmod -R 755 /var/www/php81

Команда chown передает права на каталоги сайтов пользователю nginx и группе nginx. Команда chmod изменяет права доступа этого пользователя и группы.

В каждом корневом каталоге мы создадим файл info.php. Позже он поможет нам отобразить информацию о версии PHP каждого веб-сайта:

echo "<?php phpinfo(); ?>" > /var/www/php72/info.php
echo "<?php phpinfo(); ?>" > /var/www/php74/info.php
echo "<?php phpinfo(); ?>" > /var/www/php81/info.php

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

<?php
// Показывать всю информацию, по умолчанию INFO_ALL
//phpinfo();
// Показывать информацию только о загруженных модулях.
phpinfo(INFO_MODULES);
?>

Конфигурации NGIN для сайтов

Создадим для для каждого сайта свои конфигурационные файлы:

vim /etc/nginx/conf.d/php72.loc.conf
= необходимый код =
# php72.loc
server {
listen 80;
server_name php72.loc;

#access_log /var/www/php72/access_log main;
#error_log /var/www/php72/error_log info;
root /var/www/php72/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    #fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}
vim /etc/nginx/conf.d/php74.loc.conf
= необходимый код =
# php74.loc
server {
listen 80;
server_name php74.loc;

#access_log /var/www/php74/access_log main;
#error_log /var/www/php74/error_log info;

root /var/www/php74/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/var/opt/remi/php74/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}
vim /etc/nginx/conf.d/php81.loc.conf
= необходимый код =
# php81.loc
server {
listen 80;
server_name php81.loc;

#access_log /var/www/php81/access_log main;
#error_log /var/www/php81/error_log info;

root /var/www/php81/;
index index.php;

    location ~ \.php$ {
    fastcgi_pass unix:/var/opt/remi/php81/run/php-fpm/www.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    #fastcgi_param HTTPS on;
    
    # Свои параметры PHP  
    fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0";
    fastcgi_param PHP_VALUE "max_execution_time = 300"; 
    fastcgi_param PHP_VALUE "short_open_tag = On";
    fastcgi_param PHP_VALUE "post_max_size = 12M";
    fastcgi_param PHP_VALUE "upload_max_filesize = 12M";
    fastcgi_param PHP_VALUE "max_input_time = 300";
    fastcgi_param PHP_VALUE "date.timezone = Europe/Minsk";

    fastcgi_param DOCUMENT_ROOT $document_root;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
}

Во всех файлах выделены строчки в которых делались изменения.

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

# Свои параметры PHP 
fastcgi_param PHP_VALUE "cgi.fix_pathinfo = 0"; 
fastcgi_param PHP_VALUE "max_execution_time = 300"; 
fastcgi_param PHP_VALUE "short_open_tag = On"; 
fastcgi_param PHP_VALUE "post_max_size = 12M"; 
fastcgi_param PHP_VALUE "upload_max_filesize = 12M"; 
fastcgi_param PHP_VALUE "max_input_time = 300"; 
fastcgi_param PHP_VALUE "date.timezone = Europe/Moscow";

Используя этот код можно использовать различные ресурсы с разными параметрами php использующими одну версию php.

Проверка работы

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

vim /etc/hosts
= необходимые добавления =
192.168.0.206 php72.loc
192.168.0.206 php74.loc
192.168.0.206 php81.loc

Для проверки необходимо в строке браузера вписать путь http://ДОМЕН/info.php.

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

 

 

Обновление версий PHP

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

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

dnf update

nginx -s reload

systemctl restart php-fpm
systemctl restart php74-php-fpm
systemctl restart php81-php-fpm

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

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

  • Остановка php-fpm,
  • Вывод и удаление всех имеющихся пакетов php,
  • Удаление старого и активирование нового репозитория требуемой версии php,
  • Установка новой версии,
  • Проверка настрое из старой версии,
  • Запуск php-fpm и проверка сервиса.

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

Заключение

Данный вариант работы с разными версиями меня вполне устраивает и не вызывает проблем. В статье я специально сделал установку версии как с базовых репозиториев так и с репозитория Remi. На практике использовать базовый репозиторий не удобно, так как не удобно просматривать какие именно пакеты установлены в базовой версии. Запрос   # rpm -qa | grep php выведет все имеющиеся версии.

Рекомендую использовать версии PHP от Remi это удобно и вызывает меньше путаницы.

Гораздо удобней смотреть вывод такой команды:

# rpm -qa | grep php81
php81-php-fpm-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pecl-zip-1.20.0-1.el8.remi.x86_64
php81-php-soap-8.1.0~rc6-1.el8.remi.x86_64
php81-runtime-8.1-2.el8.remi.x86_64
php81-php-process-8.1.0~rc6-1.el8.remi.x86_64
php81-php-mysqlnd-8.1.0~rc6-1.el8.remi.x86_64
php81-php-xml-8.1.0~rc6-1.el8.remi.x86_64
php81-php-opcache-8.1.0~rc6-1.el8.remi.x86_64
php81-php-sodium-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pecl-xmlrpc-1.0.0~rc2-3.el8.remi.x86_64
php81-php-ldap-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pdo-8.1.0~rc6-1.el8.remi.x86_64
php81-php-mbstring-8.1.0~rc6-1.el8.remi.x86_64
php81-php-pear-1.10.13-1.el8.remi.noarch
php81-php-gd-8.1.0~rc6-1.el8.remi.x86_64
php81-php-common-8.1.0~rc6-1.el8.remi.x86_64
php81-libzip-1.8.0-1.el8.remi.x86_64
php81-php-odbc-8.1.0~rc6-1.el8.remi.x86_64
php81-php-cli-8.1.0~rc6-1.el8.remi.x86_64
php81-8.1-2.el8.remi.x86_64
php81-php-snmp-8.1.0~rc6-1.el8.remi.x86_64

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

Rocky Linux 8 установка и настройка

Рассмотрим установку Rocky Linux 8 и последующую настройку исходя из практики использования этой операционной системы. Данная система для меня является основной для использования на серверах. Стабильность работы гарантированна. Поддержка до 2029 года.

Введение

В данной статье собраны все основные моменты базовой настройки сервера Rocky Linux 8 которые я использую на практике. Rocky Linux это полностью бинарно совместимый дистрибутив с RHEL.

Собирается дистрибутив силами сообщества и Rocky Enterprise Software Foundation. Развитием системы занимается Gregory Kurtzer, являющийся автором Centos. Лично я отдаю предпочтение именно Rocky Linux, потому что организация вокруг него строится только для развития самой системы.

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

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

Создания USB носителя для установки

Существует множество программ для записи iso образа на устройство. Например, у меня два варианта для создания носителя для установки:

  1. Rufus — использую эту программа для создание загрузочных USB-дисков в системе Windows;
  2. ROSA ImageWriter — использую эту программу для любой системы Linux.

Варианты установки

Рассмотрим два самых популярных варианта установки Rocky Linux 8.

Образы iso Rocky Linux 8

Образы можно скачать c официального сайта по ссылке Download Rocky Linux. Существует три варианта:

  1. Rocky-8.4-x86_64-boot.iso — загрузочный образ 755M;
  2. Rocky-8.4-x86_64-minimal.iso — минимальный образ 2G;
  3. Rocky-8.4-x86_64-dvd1.iso  — полный образ 9.9G.

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

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

Указывать надо путь к той папке, где лежит каталог repodata http://download.rockylinux.org/pub/rocky/8/BaseOS/x86_64/os/

Yandex зеркало, mirror.yandex.ru/rockylinux/8/BaseOS/x86_64/os/

В выборе программ выбираем базовое окружение «Минимальная установка» а в дополнительных параметрах «Гостевые агенты» и «Стандарт».

Шаблоны

Шаблоны используются как правило для установки на VDS и предоставляются компаниями предоставляющие такие услуги. Удобно, но тем не менее я пару раз попадал в дурацкие ситуации.

Вот моменты почему я советую использовать установку на VDS систем с iso образа:

  • Разбивка диска порой не учитывает конфигурацию тарифа или требований вашей системы — например, на одном хостинге при 2 G оперативной памяти был создал SWAP раздел в 512 М в результате пришлось переустанавливать систему дабы не терять место на и так небольшом диске;
  • Локализация как правило Английская — мне приятней работать на своем родном языке хотя и на английском если надо всё настрою;
  • Присутствие в шаблоне каких-то изменений отличающихся от стандартных минимальных параметров установки — порой не понимаешь откуда взялись какие то настройки которых раньше не видел. Кроме того, можно потратить кучу времени не понимая почему не работает то что всегда работало как часы. В итоге выясняется что в шаблоне установки нет пакета который всегда ставился в стандартном минимальном образе.

Все компании предоставляющие услуги VDS могут предоставить возможность установки системы с ISO образа системы. При установке надо правильно указать сетевые параметры исходя из предоставленных сетевых параметров настроек выбранного тарифа!

Разбивка диска для установки

Вариантов разбивки диска для Rocky Linux 8 может быть множество исходя из пожеланий и предпочтений. Например, мне нравиться придерживаться таких параметров:

  • Размер диска под систему Linux 50 G — этого мне хватает с запасом;
  • Создаю раздел boot размером 1 G — так я гарантирую что при заполнении диска система загрузится однозначно;
  • Создаю SWAP — согласно требованиям системы.

Можно выносить логи и кэш в отдельные разделы, но это лишняя трата времени. Лучше всегда выполнять мониторинг размера диска и в случае проблем оперативно принять необходимые меры. Прежде всего, так пропадёт головная боль о том какой размер указывать разделам ( вариант с перераспределением очень сюрпризная тема).

SWAP

Тема организации SWAP на сервере очень важная и поэтому я описал все основные моменты использования в статье SWAP для Linux

Настройка Rocky Linux 8

Пакетный менеджер DNF

Используется новый менеджер пакетов который поддерживает модульный формат пакетов.

По прежнему можно вносить команды yum вместо dnf и всё будет работать. Для yum сделан алиас для запуска dnf.

Для вывода всей информации о том какие команды можно использовать достаточно внести в консоли команду dnf и увидеть полный список возможностей.

dnf
= вывод части команды =
usage: dnf [options] COMMAND

Список основных команд:
alias                     List or create command aliases
autoremove                удалить все ненужные пакеты, первоначально установленные по зависимостям
check                     поиск проблем в packagedb
check-update              проверить доступные обновления для пакетов
clean                     удалить кэшированные данные
deplist                   Показывать список зависимостей пакета и какие пакеты их предоставляют
distro-sync               обновить установленные пакеты до последних имеющихся версий
downgrade                 Откат к предыдущей версии пакета
group                     показать или использовать информацию о группах
help                      отобразить подсказку по использованию
history                   отобразить (или использовать) историю транзакций
info                      отобразить информацию о пакете или группе пакетов
install                   установка пакета(ов) в систему
list                      вывести список пакетов или групп пакетов
makecache                 создание кэша метаданных
mark                      отметить или снять отметку пользовательской установки с установленных пакетов.
module                    Взаимодействие с репозиторием Modules.
provides                  найти пакет по заданному значению
reinstall                 переустановка пакета
remove                    удалить пакет или пакеты из системы
repolist                  отобразить настроенные репозитории ПО
repoquery                 поиск пакетов по ключевому слову
repository-packages       выполнить команды над всеми пакетами заданного репозитория
search                    поиск информации о пакете по заданной строке
shell                     запустить интерактивную оболочку DNF
swap                      запустить интерактивный вариант dnf для удаления и установки одной спецификации
updateinfo                показать рекомендации к пакетам
upgrade                   обновить пакет или пакеты в системе
upgrade-minimal           обновление, но только «новейших» пакетов, которые исправляют проблему в вашей системе

Информация об установленной системе

Узнать какая система установлена на сервере можно следующими командами:

uname -a
= вывод команды = 
Linux localhost.localdomain 4.18.0-305.19.1.el8_4.x86_64 #1 SMP Wed Sep 15 19:12:32 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/redhat-release
= вывод команды =
Rocky Linux release 8.4 (Green Obsidian)

Этой информации достаточно для понимания с какой системой предстоит работать.

Отключение SELinux

Отключаем SELinux. Его использование и настройка в системе Rocky Linux 8 отдельный разговор.

vi /etc/sysconfig/selinux
= меняем значение =
SELINUX=disabled

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

sestatus
= вывод команды =
SELinux status: disabled

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

Добавление репозиториев

Для инсталляции различного софта необходимо подключить репозитории в Rocky Linux 8. Со временем пришло понимание того что относится к добавляемым репозиториям надо очень внимательно, чтобы в последствии не возникало проблем при обслуживании.

Всегда подключаю самый популярный репозиторий Epel (Extra Packages for Enterprise Linux). Epel хранилище пакетов, созданное группой специалистов операционной системы Fedora. Пакеты из Epel репозитория никогда не конфликтуют и не переустанавливают базовые пакеты RHEL.

dnf -y install epel-release

Старюсь подключать репозитории которые поддерживают сами разработчики программ. Например, такие как Nginx, Zabbix, MariaDB.

Обновление Rocky Linux 8

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

Прежде всего, всегда перед обновлениями делайте резервные копии!

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

dnf update

Автоматическое обновление системы

Для безопасности сервера его необходимо своевременно обновлять. Вариантов обновления Rocky Linux 8 несколько и это тема отдельного длинного разговора.

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

При моих пожеланиях мне подойдёт утилита dnf-automatic. Ставится она из базового репозитория командой:

dnf install dnf-automatic

Управлением запуском по расписанию занимается systemd со своим встроенным планировщиком. Посмотреть таймеры автоматического запуска можно командой:

systemctl list-timers *dnf-*
= вывод команды =
NEXT                        LEFT      LAST PASSED UNIT          ACTIVATES
Thu 2021-10-24 14:36:56 MSK 5min left n/a  n/a    dnf-makecache.timer dnf-makecache.service

Посмотрим настройки этого таймера выполнив команду:

cat /etc/systemd/system/multi-user.target.wants/dnf-makecache.timer
= вывод команды =
[Unit]
Description=dnf makecache --timer
ConditionKernelCommandLine=!rd.live.image
# See comment in dnf-makecache.service
ConditionPathExists=!/run/ostree-booted
Wants=network-online.target

[Timer]
OnBootSec=10min
OnUnitInactiveSec=1h
Unit=dnf-makecache.service

[Install]
WantedBy=multi-user.target

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

systemctl enable --now dnf-automatic.timer

Настройка этого таймера будет по пути — /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer.

Настройка системы автоматического обновления находится по пути  /etc/dnf/automatic.conf. По-умолчанию он только скачивает обновления, и отправляет сообщение на почту root.

Самый важный параметр это update_type — которой будет говорить системе какие выполнять обновления. Доступно несколько вариантов:

  • default — полное обновление;
  • security — только обновление безопасности.

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

vim /etc/dnf/automatic.conf
= часть вывода с пояснениями
[commands]
# What kind of upgrade to perform:
# default = all available upgrades
# security = only the security upgrades
upgrade_type = security
random_sleep = 0

# To just receive updates use dnf-automatic-notifyonly.timer

# Whether updates should be downloaded when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
download_updates = yes

# Whether updates should be applied when they are available, by
# dnf-automatic.timer. notifyonly.timer, download.timer and
# install.timer override this setting.
apply_updates = no

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

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

Популярные и полезные утилиты

Установим в начале основные популярные утилиты которые обычно требуются в работе.

dnf -y install net-tools bind-utils htop atop iftop lsof wget bzip2 traceroute gdisk yum-utils vim mc tmux
  • net-tools bind-utils — сетевые утилиты после установки которых будут работать команды # ifconfig и # nslookup,
  • htop atop — два интересных диспетчера задач,
  • iftop — показывает в режиме реального времени загрузку сетевого интерфейса,
  • lsof — вывода информации о том, какие файлы используются теми или иными процессами,
  • wget — неинтерактивная консольная программа для загрузки файлов по сети,
  • bzip2 — утилита командной строки с открытым исходным кодом для сжатия данных,
  • traceroute — утилита предназначенная для определения маршрутов следования данных в сетях TCP/IP,
  • gdisk — умеет работать с GPT-дисками разработано по подобию fdisk,
  • yum-utils — это набор утилит для управления репозиторием, установки и отладки пакетов, поиска пакетов и много другого.

Про vim, mc и tmux расскажу ниже.

Настройка времени

Определим текущее время на сервере:

date
= вывод команды =
Ср ноя 14 12:17:34 CET 2021

Как видим временная зона не настроена.

Выполним необходимую настройку временной зоны Europe — Moscow:

= Сделать резервную копию текущей timezone =
mv /etc/localtime /etc/localtime.bak

= В папке /usr/share/zoneinfo/ ищем что надо и делаем ссылку =
ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

В итоге получим:

date
= вывод команды =
Сб окт 13 02:59:46 MSK 2021

Можно использовать одну команду зная точно что эта временная зона присутствует в настройках:

timedatectl set-timezone Europe/Moscow

Синхронизация времени

В Rocky Linux 8 по-умолчанию используется утилита для синхронизации времени chrony. Если у вас её нет, то устанавливайте:

dnf install chrony

Запускаем chrony и добавляем в автозагрузку:

systemctl enable --now chronyd

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

systemctl status chronyd
= вывод команды =
 chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Ср 2021-10-03 21:55:18 MSK; 27min ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 631 (chronyd)
CGroup: /system.slice/chronyd.service
└─631 /usr/sbin/chronyd

окт 03 21:55:17 lemp.sevo44.loc systemd[1]: Starting NTP client/server...
окт 03 21:55:17 lemp.sevo44.loc chronyd[631]: chronyd version 3.2 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SECHASH +SIGND +ASYNCDNS +IPV6 +DEBUG)
окт 03 21:55:17 lemp.sevo44.loc chronyd[631]: Frequency 1.141 +/- 1.440 ppm read from /var/lib/chrony/drift
окт 03 21:55:18 lemp.sevo44.loc systemd[1]: Started NTP client/server.
окт 03 21:55:35 lemp.sevo44.loc chronyd[631]: Selected source 89.109.251.23
окт 03 21:55:35 lemp.sevo44.loc chronyd[631]: System clock wrong by 1.035954 seconds, adjustment started
окт 03 21:55:36 lemp.sevo44.loc chronyd[631]: System clock was stepped by 1.035954 seconds

Сетевые параметры

При установке Rocky Linux 8 уделяю особое внимание настройки сетевых параметров. Кроме того, на странице настройки сетевых параметров указывается название хоста.

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

Для управления сетевыми настройками в Rocky Linux 8 после установки можно воспользоваться графической утилитой nmtui:

nmtui
= вывод команды =
-bash: nmtui: команда не найдена
= команда установки необходимого пакета для работы nmtui =
yum install NetworkManager-tui

В Rocky Linux 8, сеть управляется только через Network Manager. Сетевые настройки лучше выполнять с помощью утилиты nmtui.

Руками вся настройка сводится к редактированию файлов в паке /etc/sysconfig/network-scripts/. Для определения интерфейсов необходимо предварительно выполнить команду ip addr которая покажет название всех имеющихся интерфейсов.

Например, мой файл настройки сетевого интерфейса ens18:

vim /etc/sysconfig/network-scripts/ifcfg-ens18
= вывод команды =
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="no"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens18"
UUID="2f1479ad-8a41-4886-acf4-64f0c5eff5c2"
DEVICE="ens18"
ONBOOT="yes"
IPADDR="192.168.0.23"
PREFIX="24"
GATEWAY="192.168.0.1"
DNS1="192.168.0.1"
ZONE=public

Для применения изменений необходимо перезагрузить Network Manager выполнив команду:

= или командой =
systemctl restart NetworkManager

= предварительно поняв название необходимого сервиса =
systemctl list-units | grep -i network

Смена пароля root

Смена пароля производится командой:

passwd
= вывод команды =
Изменяется пароль пользователя root.
Новый пароль : 
Повторите ввод нового пароля : 
passwd: все данные аутентификации успешно обновлены.

Брандмауэр FirewallD

По умолчанию в системе Rocky Linux 8 используется брандмауэр FirewallD.

О том как работать я описывал в статье FirewallD базовая настройка.

Ниже я выполню необходимые действия не описывая всё подробно.

Вывод информации об активных зонах:

firewall-cmd --get-active-zones
= вывод команды =
public
  interfaces: ens18

Выведем информацию о конкретной зоне:

firewall-cmd --list-all --zone=public
= вывод команды =
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: cockpit ssh dhcpv6-client
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

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

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

firewall-cmd --permanent --zone=public --add-port=35555/tcp
= вывод команды = 
success

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

firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client
= вывод команды =
success

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

firewall-cmd --reload
= вывод команды =
success

firewall-cmd --list-all --zone=public
= вывод команды =
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens18
  sources: 
  services: cockpit ssh 
  ports: 35555/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Только после настройки ssh для работы по новому порту удаляйте сервис ssh из FirewallD! Иначе в случае ошибки настройки можете потерять доступ к серверу.

Смена порта SSH

Укажем порт в настройках ssh открыв конфигурационный файл командой:

vi /etc/ssh/sshd_config
= необходимые изменения =
Раскоментируем строку Port 22 и заменим на наш 35555

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

systemctl restart sshd

Проверяем какой порт слушает sshd (для работы нужен установленный пакет net-tools):

netstat -tulpn | grep sshd
tcp 0 0 0.0.0.0:35555 0.0.0.0:* LISTEN 453/sshd 
tcp6 0 0 :::35555 :::* LISTEN 453/sshd

Подключение к SSH по нестандартному порту

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

ssh -p 35555 root@193.124.180.195

Авторизация SSH по ключу

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

После настройки можно отключить в параметрах ssh авторизацию по паролю, но иногда подключение по паролю просто необходимо. Обычно я создаю 16 злачный пароль и меняю его если давал временный доступ специалистам любого уровня и моего доверия. Безопасность лишней не бывает!

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

Добавляем на сервер необходимый ключ командой:

ssh-copy-id -i /home/local/.ssh/sevo44_rsa.pub -p 35555 root@243.21.12.24

Установка Midnight Commander

Установим самый популярный файловых менеджеров с текстовым интерфейсом командой если не установили ранее:

dnf -y install mc

Включаем подсветку синтаксиса всех файлов, которые не обозначены явно в файле /usr/share/mc/syntax/Syntax. Этот универсальный синтаксис подходит для конфигурационных файлов, с которыми чаще всего приходится работать на сервере. Именно этот шаблон будет применяться к .conf и .cf файлам, так как к ним явно не привязано никакого синтаксиса. Перезаписываем файл unknown.syntax:

cp /usr/share/mc/syntax/sh.syntax /usr/share/mc/syntax/unknown.syntax
= вывод команды =
cp: переписать «/usr/share/mc/syntax/unknown.syntax»? y

В случае отказа от использования встроенного редактора MC необходимо в настройках «Настройки — Конфигурация» снять галки у параметров «Встроенный редактор» и «Встроенный просмотр»

Установка редактора Vim

По умолчанию в системе работает редактор vim и это вполне оправдано.

Обоснование использования редактора VIM и как с ним работать можно в статье Vim текстовый редактор

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

dnf -y install vim

Отображение приглашения в консоли bash

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

Стандартный вариант отображения приветствия после установки Rocky Linux 8:

[root@vds-micro ~]#

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

Выведем имеющиеся параметры:

echo $PS1
= вывод команды =
[\u@\h \W]\$

Изменим для текущей сессии:

export PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '
= в результате =
root@vds-micro.sevo44.ru ~ # 

Для постоянного применения настроек необходимо в папке пользователя в файл .bashrc добавить необходимый код:

vim .bashrc
= необходимые дополнения =
# bash
PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '

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

vim /etc/profile.d/bash_completion.sh
= необходимое дополнение =
# bash
PS1='\[\033[01;32m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '

В итоге я получил следующее:

root@vds-micro.sevo44.ru /etc #  = права root
root@vds-micro.sevo44.ru /etc #  = простой пользователь

Более подробно можно почитать в статье Изменение приглашения терминала в bash.

Настройка хранения истории bash

Список последних выполненных команд хранится в домашней директории пользователя в файле .bash_history (в начале точка). Его можно открыть любым редактором и посмотреть.

По умолчанию вывод команды history в консоли нам покажет:

history
= вывод команды =
1 yum update
2 reboot
3 htop
4 df -h

Как видим вывод не информативный. Кроме того, покажет только последние 1000 команд.

Быстро найти конкретную команду, можно с помощью фильтрации только нужных строк, например вот так:

history | grep yum

Изменим эту ситуацию добавив в файл .bashrc находящийся в папке пользователя необходимые параметры:

vim .bashrc 
= необходимые дополнения =
# history
export HISTSIZE=50000
export HISTTIMEFORMAT="%h %d %H:%M:%S "
PROMPT_COMMAND='history -a'
export HISTIGNORE="ls:ll:history:w"

Расшифруем параметры:

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

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

source ~/.bashrc

В итоге мы получим:

history
= вывод команды =
1  янв 22 18:33:08 yum update
2  янв 22 18:33:08 reboot
3  янв 22 18:33:08 htop
4  янв 22 18:33:08 df -h

Можно применить эту настройку для всех пользователей указав параметр в файле /etc/profile.d/bash_completion.sh.

В таком варианте получаем гораздо большую информативность.

Установка Tmux

Установим пожалуй один из самых необходимых и удобных программ для удаленной работы с сервером. Tmux терминальный оконный менеджер при использовании дает возможность при обрыве связи с сервером по ssh не терять информацию о выполняемых действиях.

Установка выполняется командой:

dnf install tmux

Более подробная информация по настройке и работе с программой Tmux можно в статье Tmux терминальный оконный менеджер

Cockpit: Веб-интерфейс управления сервером Rocky Linux 8

Возможность видеть наглядно все основные параметры системы и иметь возможность ими управлять пожалуй самая приятна новость которая меня порадовала в выпуске Rocky Linux 8.

При авторизации по ssh вы увидите следующее сообщение:

Activate the web console with: systemctl enable --now cockpit.socket

Достаточно выполнить команду в консоли systemctl enable —now cockpit.socket и при следующей авторизации вы увидите следующее сообщение:

Web console: https://localhost:9090/ or https://192.168.0.23:9090/

Порт 9090 должен быть открыт. Работающий по умолчанию сервис cockpit в FirewallD открывает этот порт.

При вводе в браузере https://192.168.0.23:9090 увидите приглашение ввести данные авторизации.

После входа вы увидите главную страницу с выводом графиков нагрузки основных параметров сервера.

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

Единственное что я делаю это то что не держу её включенной. Убираю из автозагрузки в самой панели управления или командой:

systemctl disable cockpit.socket

В случае необходимости мне не сложно включить при необходимости и отключить после использования следующими командами:

systemctl start cockpit.socket
systemctl stop cockpit.socket

Заключение

В этой статье я свёл в одно место все основные моменты которые я на практике использую при базовой настройке сервера Rocky Linux 8.

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

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

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

Удаленное управление компьютером

Удаленное управление компьютером без ограничений по времени и скорости сеанса. Бесплатная версия как для физических, так и для юридических лиц. Программа LiteManager это идеальное решение для удаленного управления компьютерами на разных ОС.

Введение

Удаленное управление в повседневных буднях системного администратора обыденная вещь. О том как я добился простоты и удобства в этом вопросе я расскажу в этой статье.

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

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

  • Ограничение сеанса минутами;
  • Ограничение скорости сеанса;
  • Легальность использования в организациях;
  • Необходимость одинаковых версий на компьютерах.

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

На сайте разработчика вы найдете всю необходимую информацию.

Главные для меня моменты благодаря которым я выбрал этот продукт:

  • Работает на всех операционных системах, Windows, Linux, Mac OS, Android;
  •  Подключатся по ID через свой сервер NoIP;
  • Легальное использование в организациях;
  • Программа не требует установки на компьютер.

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

Режимы работы LiteManager

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

Основные режимы которые мной используются:

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

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

Посмотрите различие версий и возможно вы выберите платную версию. Например, мне хватает версии Free.

Вот так выглядит LiteManager Viewer:

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

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

Удаленное управление для сотрудников

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

Вот перечень необходимых действий:

  • Добавить на компьютере пользователя профиль для подключения с необходимыми параметрами;
  • Экспортировать нужное подключение;
  • Передать работнику LiteManager Viewer портативную версию (работает без установки) и сказать как импортировать подключение.

Вот таким простым способом можно настроить работнику удаленную работу с его компьютером на работе.

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

При варианте когда разрешение монитора на компьютере к которому подключаетесь больше достаточно на нем снизить разрешение до такого как на том с которого подключаетесь и работать станет комфортно.

Варианты доступа к компьютерам

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

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

Доступ без разрешения

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

Доступ с разрешением

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

Вариант когда человек просто запускает файл и передает вам параметры для подключения (желательно только цифры) самый удобный и оптимальный. Для такой простоты необходимо развернуть свой NoIP сервер и создать свою версию программы с нужными параметрами. О том как это сделать вы узнаете читая статью дальше.

Настройка личного NoIP

Вы можете почитать статью Крик души — «взлом» инфраструктуры LiteManager в которой рассказывается про уязвимость.

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

Мало кто любит читать комментарии к статьям, хотя там бывает весьма любопытная информация.

Например, вот ответ автора программы:

3 мая 2017 в 09:25

+2 Программа обновлена до версии 4.8.3 в процесс авторизации внесены изменения, с учетом данного вида угроз.

Спасибо Всем, извините за неудобства

Сервис работает под управлением операционной системы Windows, но думаю что разработчик сделает версию и под Linux. Кстати, использую Wine можно запускать и на Linux, но стабильность работы я не проверял.

Скачиваем с сайта разработчика последнюю версию LiteManager Windows. В полной версии будет папка NOIP (ID router) где находится то что нам надо.

После запуска вы увидите станицу на которой показан статус и варианты запуска программы. В моем случае я запускаю её вручную:

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

Переходим на страницу «Дополнительно» в которой необходимо выбрать параметр который обеспечит совмещенный режим работы для разных лицензий:

Переходим на стартовую страницу и запускаем сервис. В результате должно быть так:

Обязательно переходим на страницу «Информация» и убеждаемся что тип лицензии сервера бесплатный:

После того как будет подключен по ID вы увидите на странице статистики информацию:

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

Настройка подключения по ID

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

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

Можно использовать и общедоступные NoIP но работают они медленно и нестабильно.

При создании есть несколько нюансов о которых я расскажу.

Запустить конструктор необходимо вот так:

Базовая информация

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

После нажатия «Сохранить QuickSupport пакет» создастся необходимый файл.

Свой логотип и информация

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

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

В моем варианте клиент видит такое окно:

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

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

Пример подключения по ID

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

Клиент запускает программу для доступа. Вначале выйдет сообщение с 5 секундным таймером про лицензию:

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

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

Запускаем соединение по ID:

Нажимаем «Настройки» и указываем необходимый NoIP сервер:

Вводим ID и после подключения видим окно в которое необходимо указать пароль:

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

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

На картинке указано изображение в режиме масштабирования.

Заключение

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

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

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

Обслуживание компьютеров, ремонт, лечение вирусов, модернизация. Системы на ОС Linux. Создание и продвижение Интернет проектов. Бесплатные консультации. Офисные АТС. Видеонаблюдение.

Exit mobile version