Архив рубрики: Системы

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

Заключение

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

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:Предприятие — самый лучший вариант.

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

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

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

Континент АП — контроль целостности не пройден

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

Введение

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

Решил рассказать о работе с такой замечательной программой как Континент АП. Программа предназначена для создания канала VPN по сертификату.

Работала эта программа без нареканий, но после того проходило обновление Windows программа стала выдавать ошибку.

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

Когда ошибка стала появляться часто и пользователи стали сильно нервничать задавая вопрос: «Почему раньше работал а теперь постоянные сбои?» решил вникнуть и разобраться в сути проблемы.

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

На одном из компьютеров установлена Windows 10 Домашняя и в одной из контор, прочитав рекомендации на сайте, сказали что проблема в версии Windows.

В свое время я сильно озадачился версиями Windows и пришел к выводу что отличия версий только в доменом управлении, некоторыми функциями и элементами внешнего вида. В организации где не планируется и не будет использован Windows Server покупать профессиональные версии нет смысла. За название «Домашняя» отдельное спасибо маркетологам Windows, так как народ действительно думает что использовать такую версию можно только дома 🙂

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

Отключение антивируса

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

Временное решение проблемы

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

Исправление программы Континент АП

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

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

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

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

Решение проблемы

Решение оказалось немного не обычным и не логичным. Главное что это работает и как мне показалось единственное верное на данный момент решение.

Суть контроля целостности Континент АП

При установке программа в специальном файле запоминает все параметры своих файлов и файлов что использует в системе Windows. При запуске происходит сравнение параметров с этого файла и реальными файлами в системе. В случае отличия выдает грозное предупреждение «Тест контроля целостности не пройден».

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

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

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

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

Выключение функции проверки

Для того что бы не видеть больше ошибки «Тест контроля целостности не пройден» и не отключать обновление Windows в версии Континент АП 3.7 необходимо изменить файл integrity.xml. Именно в этом файле занесена информация о файлах при установке.

Необходимо сделать следующее:

  1. Перейдите на диск С в папку Program Files -> Security Code -> Terminal Station;
  2. Скопировать файл integrity.xml на рабочий стол;
  3. Открыть данный файл в текстовым редакторе «Блокнот»;
  4. Привести файл к такому виду:
    <?xml version="1.0″ encoding="UTF-8″ standalone="yes"?>
    <integrity><catalog name="common"></catalog></integrity>
    

    или убрать все разделы кроме первого —> catalog name="common";

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

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

Заключение

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

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

Интересно увидеть ваши комментарии по этому поводу.

GLPI установка на CentOS

Расскажу про установку системы GLPI на операционную систему CentOS. Удобней системы для ведения ИТ-инфраструктуры я не встречал. Кроме ведения заявок можно контролировать рабочие станции, вести справочную документацию и много чего ещё делать.

Введение

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

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

  • Удобное ведение поступивших заявок —  заявки поступившие в систему не забываются и не надо вести дополнительных блокнотов;
  • Хронология каждой заявки — в процессе решения собирается вся необходимая информация в одном месте;
  • История заявок — в случае проблем с заказчиком всегда можно посмотреть все события по заявке и освежить в памяти события которые со временем забываются.

Требования к системе предъявлялись следующие:

  • Свободная система работающая на свободных операционных системах;
  • Система должна активно развиваться и иметь возможность простого обновления;
  • Система должна работать на популярном языке программирования;
  • Возможность удобной подачи заявки и последующего ведения;
  • Ведение в одной системе разных организаций;
  • Гибкое администрирование уровня доступа пользователей;
  • Создание базы знаний для пользователей;
  • Использование доменных пользователей;
  • Личный планировщик заданий.

Перепробовал большое количество разных систем, но остановился на GLPI, так как эта система максимально удовлетворяет всем моим требованиям и позиционирует себя как свободный менеджер ИТ-инфраструктуры.

Основное что меня порадовало в системе GLPI это:

  • Систему GLPI можно установить на простой хостинг как обычный сайт так как он написан на PHP (при условии что можно сделать некоторые специфические настройки);
  • Настроек очень много и это позволяет реализовать практические любые пожелания;
  • Простота и продуманность обновления;
  • Информативность по выполняемым действиям очень радует, так как можно посмотреть подробную историю как действий пользователей так и автоматических заданий;
  • Расширение возможностей с помощью большого количества дополнений;
  • Почти во всех настройках есть история изменений где можно посмотреть кто и что делал;
  • Делать резервные копии базы данных перед серьезными настройками в системе GLPI.

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

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

В статье вы узнаете полную версию установки на операционную систему CentOS c нуля.

Подготовка сервера

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

Скачивание последней версии GLPI

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

mkdir -p /var/www/support.sevo44.ru/log

-p -- создаст все отстутствующие папки в пути

Идем на сайт GLPI и смотрим последнюю версию версию.

В нашем случаем последняя стабильная версия GLPI version 9.4.4.

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

cd /var/www/support.sevo44.ru
wget https://github.com/glpi-project/glpi/releases/download/9.4.4/glpi-9.4.4.tgz

Устанавливаем архиватор tar, если его нет:

dnf install tar

Распаковываем архив:

tar zxvf glpi-9.4.4.tgz

Переименовываем папку glpi в www:

mv glpi www

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

Настройка доступа по SFTP

Настроим удобный и безопасный доступ к файлам сайта.

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

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

В нашем случае мы настраиваем доступ к сайту support.sevo44.ru. Добавим пользователя с нужными параметрами и создадим ему пароль:

useradd -s /sbin/nologin support.sevo44.ru
passwd support.sevo44.ru

Добавляем пользователя nginx в группу support.sevo44.ru:

usermod -aG support.sevo44.ru nginx

Открываем конфигурационный файл ssh находящийся по пути /etc/ssh/sshd_config. Комментируем один параметр и добавим необходимый код:

vim /etc/ssh/sshd_config
= необходимые изменения и добавления =
# Закоментируем параметр
#Subsystem sftp /usr/lib64/misc/sftp-server

# Для работы sftp
Subsystem sftp internal-sftp
# Для support.sevo44.ru
Match User support.sevo44.ru
X11Forwarding no
AllowTcpForwarding no
AllowAgentForwarding no
PermitTunnel no
ForceCommand internal-sftp
ChrootDirectory /var/www/support.sevo44.ru
# /support.sevo44.ru

Перезапускаем службу sshd:

systemctl restart sshd

Назначаем владельцем содержимого сайта пользователя которого мы создали выше:

chown -R support.sevo44.ru:support.sevo44.ru /var/www/support.sevo44.ru/

Возвращаем обратно рута владельцем корня сайта:

chown root. /var/www/support.sevo44.ru/
chown root. /var/www/support.sevo44.ru/log/

Все папки в пути /var/www/support.sevo44.ru/ должны быть пользователя root!

Только в таком варианте все будет корректно работать!

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

Редактирование будет возможно только в папке WWW где находятся все файлы сайта!

Даем необходимые права на папки и файлы

Найдём в папке /var/www/support.sevo44.ru/www все файлы (f) и выставим им права 644 а для всех папок (d) выставим права 755:

find /var/www/support.sevo44.ru/www -type f -exec chmod 644 {} \;
find /var/www/support.sevo44.ru/www -type d -exec chmod 755 {} \;

Подключаемся по sftp и если подключились продолжаем настройку дальше.

Установка PHP

Устанавливать версию PHP будем с репозитория Remi Collet. Более подробно как работать c репозиторием можно из статьи PHP от Remi для CentOS.

Подключаем репозиторий и активируем версию php 7.2:

dnf install dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php
dnf module enable php:remi-7.2

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

yum-config-manager --disable remi-safe
yum-config-manager --enable remi

С репозитория Remi можно установить GLPI, но настроен он будет для работы с Apache.

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

dnf install php php-psr-container php-symfony-common php-jsonlint php-mysqlnd php-composer-semver php-psr-simple-cache php-bcmath php-htmLawed php-intl php-sabre-xml2 php-zendframework-zend-stdlib php-symfony-config php-Monolog php-phpmailer6 php-symfony-browser-kit php-zendframework-zend-serializer php-symfony-event-dispatcher php-symfony3-debug php-pecl-imagick php-json php-fedora-autoloader php-process php-pdo php-container-interop php-symfony-class-loader php-symfony-process php-symfony-finder php-cli php-fpm php-symfony-css-selector php-symfony-expression-language php-composer-ca-bundle php-composer-spdx-licenses php-psr-cache php-sabre-uri2 php-seld-phar-utils php-ldap php-pecl-selinux php-iamcal-lib-autolink php-symfony-polyfill php-pecl-zip php-tidy php-imap php-xmlrpc php-mbstring php-zendframework-zend-servicemanager php-symfony-yaml php-symfony-dependency-injection php-simplepie php-elvanto-litemoji php-paragonie-random-compat php-sabre-vobject4 php-symfony-dom-crawler php-symfony-http-foundation php-zendframework-zend-json php-zendframework-zend-cache php-symfony-console php-symfony-http-kernel php-symfony3-common php-symfony3-console php-tcpdf php-common php-PsrLog php-pecl-apcu php-symfony-filesystem php-symfony-debug php-composer-xdebug-handler php-markdown php-sebastian-diff3 php-opcache php-xml php-zendframework-zend-eventmanager php-IDNA_Convert php-justinrainbow-json-schema5 php-scssphp php-true-punycode php-zendframework-zend-i18n php-gd php-symfony-var-dumper php-pear-CAS

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

Внесем необходимые изменения в файл настроек php.ini:

vim /etc/php.ini
= необходимые изменения =
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

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

systemctl enable --now php-fpm

Запускать 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 = /run/php-fpm/www.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

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

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

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

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

Создадим отдельный пул для php-fpm, который будет обслуживать сайт support.sevo44.ru на котором и будет работать GLPI. Удобно когда для каждого сайта используется независимый пул в котором можно выставить необходимые значения.

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

cd /etc/php-fpm.d/
cp www.conf support.sevo44.ru.conf
vim /etc/php-fpm.d/support.sevo44.ru.conf
= необходимые параметры =
[support.sevo44.ru]
user = support.sevo44.ru
group = support.sevo44.ru

listen = /run/php-fpm/support.sevo44.ru.sock
listen.mode = 0660
listen.owner = support.sevo44.ru
listen.group = support.sevo44.ru

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

Перезапускаем:

systemctl restart php-fpm

Проверяем работу пула:

ll /run/php-fpm/support.sevo44.ru.sock
= вывод команды =
srw-rw---- 1 support.sevo44.ru support.sevo44.ru 0 ноя 10 16:34 /run/php-fpm/support.sevo44.ru.sock

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

Установка NGINX

Более подробно как работать c 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

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

systemctl enable --now nginx

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

curl http://localhost
= вывод команды =
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>

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

vim /usr/share/nginx/html/index.html
= необходимый код =
<!DOCTYPE html>
<html>
<head>
<title>Welcome!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working.</p>
<p><em>lemp.sevo44.loc</em></p>
</body>
</html>

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

mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf_orig
vim /etc/nginx/nginx.conf
= необходимый код c пояснениями=
# Пользователь и группа, от имени которых будет запущен процесс
user nginx nginx;
# Число воркеров в новых версиях рекомендовано устанавливать параметр 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 12m;
# Подключение дополнительных конфигов
include /etc/nginx/conf.d/*.conf;
}

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

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

Всё хорошо. Выполняем обновление правил без перезагрузки Nginx:

nginx -s reload

Конфигурационный файл Nginx для GLPI

Создаем фал Nginx для работы GLPI:

vim /etc/nginx/conf.d/support.sevo44.ru.conf
= необходимый код =
### support.sevo44.ru
server {
listen 80;
server_name support.sevo44.ru www.support.sevo44.ru;
root /var/www/support.sevo44.ru/www/;
index index.php index.html index.htm;

access_log /var/www/support.sevo44.ru/log/support.sevo44.ru-access.log;
error_log /var/www/support.sevo44.ru/log/support.sevo44.ru-error.log;

# Для записи в log реальных ip при использовании прокси nginx
set_real_ip_from 10.10.0.1;
real_ip_header X-Real-IP;

# Без него не грузит файлы больше 1 метра
client_max_body_size 10m;

keepalive_timeout 60;
add_header Strict-Transport-Security 'max-age=604800';

	location / {
	try_files $uri $uri/ =404;
	autoindex on;
	}

	location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {
	access_log off;
	expires max;
	}

	location /api {
	rewrite ^/api/(.*)$ /apirest.php/$1 last;
	}

	location ~ \.php$ {
	try_files $uri = 404;
	fastcgi_index index.php;
	fastcgi_pass unix:/run/php-fpm/support.sevo44.ru.sock;
	include fastcgi_params;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	fastcgi_param SERVER_NAME $host;
	fastcgi_param HTTPS on;
	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;
	fastcgi_param PHP_VALUE "
		memory_limit = 64M
		file_uploads = on
		max_execution_time = 600
		session.auto_start = off
		session.use_trans_sid = 0
        	";  
	}

	location = /favicon.ico {
	log_not_found off;
	access_log off;
	}

	location = /robots.txt {
	#allow all;
	deny all;
	log_not_found off;
	access_log off;
	}

	location ~ /\.ht {
	deny all;
	}
}

В моем варианте сигнал проксируется с помощью Nginx прокси. Сертификат получаем на проксирующем сервере.

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

Проверяем и перезапускаем в случае успеха:

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

nginx -s reload

Установка MariaDB

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

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

vim /etc/yum.repos.d/mariadb.repo
= необходимый код =
# MariaDB 10.4 CentOS repository list - created 2019-10-24 18:16 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos8-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

Установим MariaDB:

dnf install boost-program-options
dnf install MariaDB-server MariaDB-client --disablerepo=AppStream

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

systemctl enable --now mariadb

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

/usr/bin/mysql_secure_installation

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

Установка и начальная настройка GLPI

Сам процесс установки и начальной настройке прост и понятен. Все дальнейшие «сюрпризы» и нюансы будут при настройке системы для работы.

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

Главное делайте бэкап базы данных средствами самой GLPI и тогда сможете сэкономить много своего времени.

Установка GLPI

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

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

Запускаем установку введя в браузере адрес сайта.

Выбираем язык:

Соглашаемся с лицензией:

Выбираем  вариант установить:

Смотрим результат проверок:

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

Вводим данные от базы данных:

Выбираем созданную ранее базу данных:

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

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

Если посмотрите по ссылке какие данные отправятся то увидите что ничего секретного там нет.

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

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

Вот таким видом нас встретит страница авторизации GLPI:

Вот так выглядит главная страница при авторизации GLPI:

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

Настройка CRON для GLPI

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

Добавим файл с необходимым кодом:

vim /etc/cron.d/glpi
= необходимый код =
# GLPI core

# Run cron to execute task even when no user connected

*/5 * * * * root /usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php

Где указаны следующие параметры:

  • */5 * * * * — задание выполняется каждые 5 минут;
  • support.sevo44.ru — пользователь которому принадлежит файл;
  • /usr/bin/php — с помощью чего обрабатывать файл;
  • /var/www/support.sevo44.ru/www/front/cron.php — путь до необходимого файла.

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

cat /var/log/cron
= часть вывода кода =
Nov 10 21:57:01 support.sevo44.loc CROND[527]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)
Nov 10 21:58:01 support.sevo44.loc CROND[540]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)
Nov 10 21:59:01 support.sevo44.loc CROND[556]: (root) CMD (/usr/bin/php /var/www/support.sevo44.ru/www/front/cron.php)

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

Ротация логов

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

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

Создадим необходимый файл:

vim /etc/logrotate.d/sites
= необходимый код =
/var/www/support.sevo44.ru/log/*.log
{
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 644 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}

Согласно кода ротация будет проводится раз в день, и хранить архивы будет 52 дня. Файлы будут сжиматься и иметь права 644.

Backup сайта GLPI

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

Изменения в файлах GLPI

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

Произведем изменении графики:

  • pics/favicon.ico — иконка сайта;
  • pics/fd_logo.png — логотип справа после авторизации;
  • pics/login_logo_glpi.png — логотип при авторизации.

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

Изменим заголовок сайта до авторизации:

index.php
=== примерно 76 строка ===
echo '<head><title>'.__('CЭВО:Техподдержка - Аутентификация').'</title>'."\n";

Изменим заголовок сайта после авторизации:

inc/html.class.php
=== примерно 1203 строка ===
echo "<!DOCTYPE html>\n";
echo "<html lang=\"{$CFG_GLPI["languages"][$_SESSION['glpilanguage']][3]}\">";
echo "<head><title>CЭВО:Техподдержка - ".$title."</title>";
echo "<meta charset=\"utf-8\">";

Замена в теме письма GPLI на Ticket:

inc/notificationtargetticket.class.php
=== примерно 63 строка ===
    if (empty($perso_tag)) {
       $perso_tag = 'Ticket';
     }
     return sprintf("[$perso_tag #%07d] ", $this->obj->getField('id'));
   }
   return parent::getSubjectPrefix();
}

Убираем внизу сообщений информацию Automatically generated by GLPI:

inc/notificationtemplate.class.php
=== По поиску в 2 местах меняем ===
Automatically generated by GLPI ---> Сгенерировано автоматически

Обновление GLPI

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

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

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

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

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

О том как сделать доступ к сайту по паролю средствами Nginx Вы можете посмотреть тут.

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

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

cd /var/www/support.sevo44.ru 
wget https://github.com/glpi-project/glpi/releases/download/9.5.3/glpi-9.5.3.tgz
tar zxvf glpi-9.5.3.tgz

В результате у вас появиться папка glpi.

В папке www удаляем всё кроме нескольких папок:

  • files — все файлы что загружали;
  • plugins — все плагины;
  • config — настройки db.

Теперь всё что есть в папке glpi переносим в папку www. Например, я для подобных целей использую MC.

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

chown -R support.sevo44.ru:support.sevo44.ru /var/www/support.sevo44.ru/www/
find /var/www/support.sevo44.ru/www -type f -exec chmod 644 {} \; 
find /var/www/support.sevo44.ru/www -type d -exec chmod 755 {} \;

Переходим на сайт и видим информацию об обновлении.

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

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

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -p -u root mysql
Enter password: пароль пользователя root mariadb

Дадим необходимые права на чтение:

mysql -u root -p
Enter password: пароль пользователя root mariadb
GRANT SELECT (`Name`) ON `mysql`.`time_zone_name` TO 'support.sevo44.ru'@'%'; 
Query OK, 0 rows affected (0.082 sec)
FLUSH PRIVILEGES;
\q

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

systemctl restart mariadb

Больше ошибок нет и переходим к обновлению базы данных.

Нажимаем кнопку «Обновление» и получим примерно такую картину:

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

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

Произведем необходимые действия:

cd /var/www/support.sevo44.ru/www/bin
php console glpi:migration:timestamps
=== вывод команды ===
Found 185 table(s) requiring migration.
Do you want to continue ? [Yes/no]y
185/185 [============================] 100%
Migration done.

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

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

Не забываем произвести изменения в файлах GLPI если это делалось ранее.

Заключение

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

PHP от Remi для CentOS

Версии PHP от Remi являются самыми популярными и стабильными при использовании на Web серверах. Расскажу основные моменты работы с репозиторием. Рассмотрим как сменить версию PHP. Один из самых популярных репозиториев для CentOS.

Введение

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

В статье будет рассказано про использование репозитория на системах CentOS 7 и 8.

Les RPM de Remi repository поддерживает последние версии MySQL и PHP (бэкпорты федоровских rpm). Пакеты этого репозитория необходимо использовать с осторожностью, так как они заменяют базовые пакеты.

В другой статье вы можете узнать как использовать репозиторий WebtaticEL для CentOS 7. В нем так же используются последние версии PHP, но к сожалению там нет многих удобств которые есть у Remi. Например, используя репозиторий Remi можно всегда иметь последнюю версию phpMyAdmin.

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

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

Установка Epel в CetnOS 7 производится командой:

yum install epel-release

Установка Epel в CetnOS 8 производится командой:

dnf install epel-release

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

для CentOS 7

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

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

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

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.corbina.net
 * epel: mirror.logol.ru
 * extras: mirror.reconn.ru
 * remi-safe: mirror.reconn.ru
 * updates: mirror.corbina.net   
remi-safe    Safe Remi's RPM repository for Enterprise Linux 7 - x86_64     3 144

По умолчанию установлен репозиторий remi-safe который имеет только дополнительные пакеты для базового хранилища и коллекций программного обеспечения. Например, при попытке установить phpMyAdmin будет установлена старая версии. Для установки последних версий надо активировать репозиторий remi.

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

ls /etc/yum.repos.d/ -l
итого 92
-rw-r--r-- 1 root root 1664 ноя 23 16:16 CentOS-Base.repo
-rw-r--r-- 1 root root 1309 ноя 23 16:16 CentOS-CR.repo
-rw-r--r-- 1 root root 649 ноя 23 16:16 CentOS-Debuginfo.repo
-rw-r--r-- 1 root root 314 ноя 23 16:16 CentOS-fasttrack.repo
-rw-r--r-- 1 root root 630 ноя 23 16:16 CentOS-Media.repo
-rw-r--r-- 1 root root 1331 ноя 23 16:16 CentOS-Sources.repo
-rw-r--r-- 1 root root 5701 ноя 23 16:16 CentOS-Vault.repo
-rw-r--r-- 1 root root 951 окт 2 2017 epel.repo
-rw-r--r-- 1 root root 1050 окт 2 2017 epel-testing.repo
-rw-r--r-- 1 root root 261 фев 8 15:23 mariadb.repo
-rw-r--r-- 1 root root 113 июл 15 2014 nginx.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi91.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi92.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi93.repo
-rw-r--r-- 1 root root 446 дек 21 20:50 remi-glpi94.repo
-rw-r--r-- 1 root root 456 дек 21 20:50 remi-php54.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php70.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php71.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php72.repo
-rw-r--r-- 1 root root 1314 дек 21 20:50 remi-php73.repo
-rw-r--r-- 1 root root 2605 дек 21 20:50 remi.repo
-rw-r--r-- 1 root root 750 дек 21 20:50 remi-safe.repo

Надеюсь, вы заметили что есть репозитории glpi.

GLPI — это программный инструмент ITSM, который помогает вам легко планировать и управлять изменениями в ИТ структуре предприятия, эффективно решать возникающие проблемы используя систему заявок, так же позволяет вам получить контроль над ИТ-бюджетом и расходами вашей компании. В будущем я расскажу как работать с этим замечательным проектом. Кроме того, то что Remi Collet поддерживает репозиторий меня очень радует.

Перед работой с репозиториями Remi необходимо установите пакет yum-utils, что бы не получать ошибку «bash: yum-config-manager: command not found».  Установим yum-utils выполнив необходимую команду:

yum install yum-utils

Сейчас у нас активирован remi-safe. Для активации remi надо вначале отключить remi-safe а потом активировать remi выполнив команды:

yum-config-manager --disable remi-safe
yum-config-manager --enable remi

Перед тем как определится какую версию PHP использовать я всегда смотрю на сайте Supported Versions PHP.

В списке имеющихся репозиториев нет версии php5.6, так как он входит в состав remi.repo. Для установки достаточно в команде указать remi-php56.

для CentOS 8

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

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

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

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

dnf module list php
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:41:10 назад, Пн 28 окт 2019 08:05:09.
CentOS-8 - AppStream
Name Stream Profiles Summary 
php 7.2 [d] 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

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Из вывода выше видно что по умолчанию стоит базовая версия CentOS 7.2 и имена она будет установлена.

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

для CentOS 7

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

# yum-config-manager --enable remi-php72

Устанавливаем php7.2 выполнив команду:

yum install php72

Лучше указывать php72 и тогда пакеты будут установлены только из репозитория remi. Например, я всегда внимательно смотрю какая версия php будет установлена в списке устанавливаемых пакетов.

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

yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap

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

php -v
= вывод команды =
PHP 7.2.16 (cli) (built: Mar 5 2019 14:45:10) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.16, Copyright (c) 1999-2018, by Zend Technologies

для CentOS 8

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

dnf module reset php
dnf module enable php:remi-7.2
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:53:36 назад, Пн 28 окт 2019 08:05:09.
Зависимости разрешены.
====================================================================================================
 Пакет                  Архитектура           Версия                   Репозиторий            Размер
====================================================================================================
Enabling module streams:
 httpd                                        2.4                                                  
 php                                          remi-7.2                                             

Результат транзакции
====================================================================================================

Продолжить? [д/Н]: д
Выполнено!

Switching module streams does not alter installed packages (see 'module enable' in dnf(8) for details)

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

dnf module list php
= вывод команды =
Последняя проверка окончания срока действия метаданных: 1:55:03 назад, Пн 28 окт 2019 08:05:09.
CentOS-8 - AppStream
Name Stream Profiles Summary 
php 7.2 [d] 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 [e] 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

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

Всё правильно.

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

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

Файл конфигурации php.ini

Внесем необходимые изменения в файл настроек php.ini:

vim /etc/php.ini
= необходимые изменения = 
# Запрет на исполнение произвольного кода на сервере с правами php процесса при загрузке файла.
cgi.fix_pathinfo=0
# Необходимая временная зона
date.timezone = "Europe/Moscow"

Настройка Php-fpm для Nginx

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

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

systemctl start php-fpm
systemctl enable php-fpm

=== Для CentOS 8 можно выполнить одну команду ===
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 Mon 2019-10-28 10:09:25 MSK; 1min 1s ago
 Main PID: 463 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
    Tasks: 6 (limit: 11524)
   Memory: 25.7M
   CGroup: /system.slice/php-fpm.service
           ├─463 php-fpm: master process (/etc/php-fpm.conf)
           ├─464 php-fpm: pool www
           ├─465 php-fpm: pool www
           ├─466 php-fpm: pool www
           ├─467 php-fpm: pool www
           └─468 php-fpm: pool www

окт 28 10:09:24 wp-lxc_pro-php7_sevo44_loc systemd[1]: Starting The PHP FastCGI Process Manager...
окт 28 10:09:25 wp-lxc_pro-php7_sevo44_loc systemd[1]: Started The PHP FastCGI Process Manager.

Все в порядке, сервис работает и находится в автозагрузке.

Использовать порт или сокет решать вам, но говорят что сокет использовать лучше. Запустим 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 настройка для веб хостинга.

Назначим каталогу /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 от Remi

Схема обновления универсальна и подойдет как для всех версий CentOS. В примере ниже расмотрен вариант обновления для версии 7.

Обновление состоит из нескольких действий:

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

Выполним обновление PHP до версии 7.3 в системе CentOS 7.

Останавливаем php-fpm командой:

systemctl stop php-fpm

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

rpm -qa | grep php
= вывод команды =
php-json-7.2.16-1.el7.remi.x86_64
php-process-7.2.16-1.el7.remi.x86_64
php-odbc-7.2.16-1.el7.remi.x86_64
php-soap-7.2.16-1.el7.remi.x86_64
php-fpm-7.2.16-1.el7.remi.x86_64
php-xml-7.2.16-1.el7.remi.x86_64
php-xmlrpc-7.2.16-1.el7.remi.x86_64
php-pecl-memcache-3.0.9-0.9.20170802.e702b5f.el7.remi.7.2.x86_64
php-gd-7.2.16-1.el7.remi.x86_64
php-mbstring-7.2.16-1.el7.remi.x86_64
php-pdo-7.2.16-1.el7.remi.x86_64
php-pear-1.10.8-1.el7.remi.noarch
php-snmp-7.2.16-1.el7.remi.x86_64
php-opcache-7.2.16-1.el7.remi.x86_64
php-ldap-7.2.16-1.el7.remi.x86_64
php-common-7.2.16-1.el7.remi.x86_64
php-cli-7.2.16-1.el7.remi.x86_64
php-7.2.16-1.el7.remi.x86_64
php-fedora-autoloader-1.0.0-1.el7.remi.noarch
php-mysqlnd-7.2.16-1.el7.remi.x86_64
php-pecl-zip-1.15.4-1.el7.remi.7.2.x86_64
php-imap-7.2.16-1.el7.remi.x86_6

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

yum remove php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

Внимательно смотрим вывод команды при удалении! В выводе вы должны увидеть примерно такие строки:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave

предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

Удалим старый репозиторий php7.2 и установим новый php7.3 выполнив команды:

yum-config-manager --disable remi-php72
yum-config-manager --enable remi-php73

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

yum repolist
= вывод части команды =
Загружены модули: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.sale-dedic.com
* epel: mirrors.colocall.net
* extras: mirror.sale-dedic.com
* remi: mirror.23media.de
* remi-php73: mirror.23media.de
* updates: centos-mirror.rbc.ru
remi-php73 Remi's PHP 7.2 RPM repository for Enterprise Linux 7 - x86_64   362

Устанавливаем пакеты аналогичные удаленным:

yum install php-json php-process php-odbc php-soap php-fpm php-xml php-xmlrpc php-pecl-memcache php-gd php-mbstring php-pdo php-pear php-snmp php-opcache php-ldap php-common php-cli php php-fedora-autoloader php-mysqlnd php-pecl-zip php-imap

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

Осталось проверить файлы что выдала команда при удалении старой версии php:

предупреждение: /etc/php-fpm.d/www.conf сохранен как /etc/php-fpm.d/www.conf.rpmsave
предупреждение: /etc/php.ini сохранен как /etc/php.ini.rpmsave

В заключение, запустим сервис php-fpm и проверим статус:

systemctl start php-fpm
systemctl status php-fpm
 php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
Active: active (running) since Ср 2019-03-13 21:16:12 MSK; 7s ago
Main PID: 1392 (php-fpm)
Status: "Ready to handle connections"
CGroup: /lxc/php7-lxc/system.slice/php-fpm.service
├─1392 php-fpm: master process (/etc/php-fpm.conf)
├─1393 php-fpm: pool www
├─1394 php-fpm: pool www
├─1395 php-fpm: pool www
├─1396 php-fpm: pool www
└─1397 php-fpm: pool www

мар 13 21:16:11 php7-lxc-lemp.sevo44.loc systemd[1]: Starting The PHP FastCGI Process Manager...
мар 13 21:16:12 php7-lxc-lemp.sevo44.loc systemd[1]: Started The PHP FastCGI Process Manager.

Из вывода видно что сервис не стартует при загрузке. Добавим сервис в автозагрузку выполнив команду:

systemctl enable php-fpm

Вывод

В статье рассказано про основные моменты работы с репозиторием Remi Collet. Репозиторий активно обновляется и мой выбор остановился на использовании именно его при работе с PHP.