Найти тему
Типичный Админ

Настройка сервера 1С 8.3.20 на CentOS 9

Оглавление

Вообще, про настройку сервера 1С на Линуксе я уже писал:

https://typical-admin.ru/obshaya/linux-fedora/1c-linux

Но та статья уже весьма устарела. Та ещё про версию 8.2. А здесь я хочу попробовать настроить сервер 1С на свежей платформе 8.3.20.1674, установленной на свежую CentOS 9. На момент написания статьи это самые свежие версии ОС и 1С. PostgreSQL будет версии 13.4-6.1C — это тоже самая свежая версия, доступная на портале 1С на момент написания статьи.

Этап 1. Установка ОС и общая подготовка.

Начну с установки CentOS. Скачиваю образ с оф.сайта:

https://centos.org/download/

Перехожу к установке. На первом шаге выбираю язык:

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

-2

Начну по порядку. Меню «Клавиатура» не трогаю, там всё и так нормально. «Источник установки» тоже не трогаю. Захожу в меню «Место установки», там указываю диск, на который будет ставиться система и выбираю собственное разбиение, затем жму «Готово»:

-3

Мне открывается следующее окно. Там, я удаляю все имеющиеся разделы, если таковые есть. Просто выделяю раздел и жму на кнопку с минусом:

-4

Затем выбираю «Стандартный раздел» и жму «создать автоматически»:

-5

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

-6

Меня так не устраивает. Отдельный раздел под /home мне не нужен, удаляю его. Потом увеличиваю размер корневого раздела. В итоге имею такие разделы:

-7

Жму «Готово», затем «Применить изменения».

Вообще, если по уму, то PostgreSQL надо ставить отдельный диск (либо дисковый массив). А также, у 1С есть такая штука, как журнал регистрации, который, по умолчанию, находится в домашней директории системного пользователя 1С (в Линуксе это usr1cv8). Так вот под журнал регистрации желательно тоже выделить отдельный диск. Я обычно под весь домашний каталог пользователя usr1cv8 выделяю. Но сейчас сервер тестовый, поэтому всё будет на одном диске находиться.

После разметки диска, установщик меня возвращает в основное меню. Там «Языковую поддержку» я не трогаю. Перехожу в «Выбор программ». Там выбираю Minimal Install и ставлю крыж Standard, затем жму «Готово»:

-8

После чего меня снова возвращает в основное меню. На очереди у меня KDUMP — его отключаю. Для диагностики и анализа причин сбоев ядра разработчиками компании RedHat был разработан специализированный инструмент — kdump. Можно и не отключать конечно. Но я отключу.

Следующим будет «Дата и время» — там всё понятно. «Имя сети и узла» — там прописываю сетевое имя сервера и статический IP-адрес:

-9

И

-10

DNS-сервером указал контроллер домена Active Directory. После применения всех настроек снова возвращаюсь в основное меню. «Securuty Profile» не трогаю. Осталось только задать «Пароль root». Там ставлю галку, чтобы можно было рутом заходить по SSH:

-11

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

После задания всех параметров, станет активной кнопка «Начать установку». Жму её.

-12

Когда установка закончится, установщик попросит перезагрузить сервер.

Подключаюсь к серверу через SSH по заданному IP-адресу при установке. Сразу ставлю компоненты для комфортной работы:

dnf -y install mc nano ntsysv chkconfig

Не забываю про webmin:

wget https://prdownloads.sourceforge.net/webadmin/webmin-1.984-1.noarch.rpm
dnf -y install perl-Encode-Detect perl-File-Basename perl-lib perl-Authen-OATH perl
rpm -ivh webmin-1.984-1.noarch.rpm

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

После этого, нужно обновить систему:

dnf -y update

Когда обновление завершится, то перезагружать систему не спешу. Сразу же надо отключить SELinux. Нахожу файл /etc/selinux/config и в нём заменяю строчку:

SELINUX=enforcing

на:

SELINUX=disabled

Также, выполняю команду:

grubby --update-kernel ALL --args selinux=0

И вот после этого перезагружаю систему.

Этап 2. Сборка PostgreSQL и установка 1C.

Начну с PostgreSQL. На портале 1С выложены уже готовые rpm-пакеты для установки. Насколько я понимаю, эти пакеты собраны универсально под все rpm-дистрибутивы Линукса. Можно попробовать поставить их. Но, как и в статье про настройку сервера 1С 8.2, я пойду путём сборки пакетов из src.rpm. На портале 1С скачиваю вот этот архив с патчем:

-13

Загружаю этот файл на сервер через Webmin:

-14

В этом архиве меня интересует файл postgresql13-1c-13.4-6.el7.src.rpm. Извлекаю его куда-нибудь, например в каталог /home/distrib. Затем устанавливаю все (почти все) необходимые пакеты для сборки:

dnf -y install bison clang-devel e2fsprogs-devel flex krb5-devel libicu-devel libselinux-devel libuuid-devel libxml2-devel libxslt-devel llvm-devel openldap-devel openssl-devel pam-devel perl-generators python3-devel readline-devel systemd-devel tcl-devel zlib-devel rpm-build

Для сборки ещё не хватает пакета pgdg-srpm-macros. Но проблема в том, что его нет в репозитории. Его я скачаю и установлю со стороннего ресурса:

wget https://download.postgresql.org/pub/repos/yum/common/redhat/rhel-9-x86_64/pgdg-srpm-macros-1.0.22-1.rhel9.noarch.rpm
rpm -ivh pgdg-srpm-macros-1.0.22-1.rhel9.noarch.rpm

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

rpmbuild --rebuild postgresql13-1c-13.4-6.el7.src.rpm

Оговорюсь, что данную команду выполнял, находясь в каталоге с файлом postgresql13-1c-13.4-6.el7.src.rpm. На моё удивление, сборка прошла с первого раза. Помню, сколько ошибок словил при сборке postgresql-9.0.3-3.1C под Fedora 16, когда настраивал сервер 1С 8.2.

Итак, в каталоге /root/rpmbuild/RPMS/x86_64 наблюдаю следующий список файлов:

postgresql13-1c-13.4-6.el9.x86_64.rpm
postgresql13-1c-contrib-13.4-6.el9.x86_64.rpm
postgresql13-1c-contrib-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-debugsource-13.4-6.el9.x86_64.rpm
postgresql13-1c-devel-13.4-6.el9.x86_64.rpm
postgresql13-1c-devel-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-docs-13.4-6.el9.x86_64.rpm
postgresql13-1c-libs-13.4-6.el9.x86_64.rpm
postgresql13-1c-libs-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-llvmjit-13.4-6.el9.x86_64.rpm
postgresql13-1c-llvmjit-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-plperl-13.4-6.el9.x86_64.rpm
postgresql13-1c-plperl-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-plpython3-13.4-6.el9.x86_64.rpm
postgresql13-1c-plpython3-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-pltcl-13.4-6.el9.x86_64.rpm
postgresql13-1c-pltcl-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-server-13.4-6.el9.x86_64.rpm
postgresql13-1c-server-debuginfo-13.4-6.el9.x86_64.rpm
postgresql13-1c-test-13.4-6.el9.x86_64.rpm
postgresql13-1c-test-debuginfo-13.4-6.el9.x86_64.rpm

Копирую их куда-нибудь в отдельное место. И, находясь в этом месте, даю команду:

rpm -ivh postgresql13-1c-13.4-6.el9.x86_64.rpm postgresql13-1c-contrib-13.4-6.el9.x86_64.rpm postgresql13-1c-docs-13.4-6.el9.x86_64.rpm postgresql13-1c-libs-13.4-6.el9.x86_64.rpm postgresql13-1c-llvmjit-13.4-6.el9.x86_64.rpm postgresql13-1c-plperl-13.4-6.el9.x86_64.rpm postgresql13-1c-plpython3-13.4-6.el9.x86_64.rpm postgresql13-1c-pltcl-13.4-6.el9.x86_64.rpm postgresql13-1c-server-13.4-6.el9.x86_64.rpm postgresql13-1c-test-13.4-6.el9.x86_64.rpm postgresql13-1c-devel-13.4-6.el9.x86_64.rpm

PostgreSQL установил. Теперь мне надо сделать так, чтобы база PostgreSQL создалась в нужном мне каталоге. Пусть это будет /postgresql. Создам его и назначу права:

mkdir /postgresql
chown postgres:postgres /postgresql

По уму, к этому каталогу должен быть примонтирован отдельный диск. Далее нахожу файл /usr/lib/systemd/system/postgresql-13.service. В нём меня интересует строка:

Environment=PGDATA=/var/lib/pgsql/13/data/

Её надо заменить на:

Environment=PGDATA=/postgresql/

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

/usr/pgsql-13/bin/postgresql-13-setup initdb

Должно выйти сообщение:

Initializing database ... OK

А в каталоге /postgresql появятся файлы базы данных:

ls -l
итого 52
drwx------ 5 postgres postgres 41 янв 30 03:03 base
drwx------ 2 postgres postgres 4096 янв 30 03:03 global
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_commit_ts
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_dynshmem
-rw------- 1 postgres postgres 4548 янв 30 03:03 pg_hba.conf
-rw------- 1 postgres postgres 1636 янв 30 03:03 pg_ident.conf
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_log
drwx------ 4 postgres postgres 68 янв 30 03:03 pg_logical
drwx------ 4 postgres postgres 36 янв 30 03:03 pg_multixact
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_notify
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_replslot
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_serial
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_snapshots
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_stat
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_stat_tmp
drwx------ 2 postgres postgres 18 янв 30 03:03 pg_subtrans
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_tblspc
drwx------ 2 postgres postgres 6 янв 30 03:03 pg_twophase
-rw------- 1 postgres postgres 3 янв 30 03:03 PG_VERSION
drwx------ 3 postgres postgres 60 янв 30 03:03 pg_wal
drwx------ 2 postgres postgres 18 янв 30 03:03 pg_xact
-rw------- 1 postgres postgres 88 янв 30 03:03 postgresql.auto.conf
-rw------- 1 postgres postgres 28134 янв 30 03:03 postgresql.conf

Теперь мне надо оптимизировать PostgreSQL под свой сервер. В моём случае, это AMD FX 8350 с 16gb ОЗУ и SSD диском. Использую рекомендации, написанные в ИТС:

https://its.1c.ru/db/metod8dev/content/5866/hdoc

Надо заметить, в этой статье, судя по всему, подразумевается, что PostgreSQL стоит на выделенном сервере. У меня же на одной машине и PostgreSQL и 1С. Поэтому я буду немного отклоняться от значений, описанных по ссылке выше, в сторону меньших, чтобы для 1С тоже оставались ресурсы. Нахожу файл /postgresql/postgresql.conf. Ниже приведу только те параметры, которые я изменил:

# Количество одновременных соединений. 1C рекомендует не меньше 500.
max_connections = 500

# Количество памяти, выделенной PostgreSQL для совместного кеша страниц.
# Эта память разделяется между всеми процессами PostgreSQL.
# Задаётся из расчёта: RAM/4. Беру значение в два раза меньше от этого.
shared_buffers = 2GB

# Максимальное количество страниц для временных таблиц —
# верхний лимит размера временных таблиц в каждой сессии.
# Рекомендуется 256мб. Задаю в два раза меньше.
temp_buffers = 128MB

# Лимит памяти для обработки одного запроса.
# Эта память индивидуальна для каждой сессии.
# Рассчитывается: RAM/32..64 или 32MB..128MB — слишком размытая формула.
# При ОЗУ 1–4Gb рекомендуется устанавливать 32–128MB
# Значит при 16GB ОЗУ будет:
work_mem = 512MB

# Лимит памяти для обслуживающих задач, например вакуум, автовакуума или создания индексов.
# Рассчитывается RAM/16..32 или work_mem * 4 или 256MB..4GB
# Воспользуюсь вариантом work_mem * 4
maintenance_work_mem = 2GB

# Параметры процесса фоновой записи,
# который отвечает за синхронизацию страниц в shared_buffers с диском.
bgwriter_delay = 20ms
bgwriter_lru_maxpages = 400
bgwriter_lru_multiplier = 4.0

# Данный параметр отвечает за сброс данных из кэша на диск при завершении
# транзакций. Если установить его значение fsync=off, то данные не будут
# записываться на дисковые накопители сразу после завершения операций.
# Это может существенно повысить скорость операций insert и update, но
# есть риск повредить базу, если произойдет сбой (неожиданное отключение
# питания, сбой ОС, сбой дисковой подсистемы). Использовать эту возможность
# следует, только если имеются надежные ИБП и программное обеспечение,
# завершающее работу системы при низком заряде батарей.
fsync = off

# Выключение синхронной записи в WAL момент коммита транзакции.
# Создает риск потери последних нескольких транзакций (в течении 0.5-1" секунды),
# но гарантирует целостность базы данных. Может значительно увеличить производительность.
synchronous_commit = off

# Данный параметр ставится в off, если fsync=off
full_page_writes = off

# Минимальное и максимальный объем WAL файлов.
# Для их расчёта я воспользовался онлайн калькулятором:
#
https://pgtune.leopard.in.ua/
max_wal_size = 16GB
min_wal_size = 4GB

# Стоимость чтения рандомной страницы. Практическое значение параметра
# должно зависеть от «seek time» дисковой системы: чем он меньше, тем
# меньше должно быть значение random_page_cost (но не менее 1.0) .
# Излишне большое значение параметра увеличивает склонность PostgreSQL
# к выбору планов со сканированием всей таблицы (PostgreSQL считает, что
# дешевле последовательно читать всю таблицу, чем рандомно индекс).
random_page_cost = 1.0

# Оценка планировщика запроса о размере дискового кеша, доступного для одного запроса.
# Это представление влияет на оценку стоимости использования индекса.
# Чем выше это значение, тем больше вероятность, что оптимизатором
# будет выбираться сканирование по индексу (Index Scan), чем ниже, тем
# более вероятно, что будет выбрано последовательное сканирование (Seq Scan).
# Рассчитывается RAM - shared_buffers. У меня это получается 8 - 2.
effective_cache_size = 6GB

# Задаёт максимальное число элементов в списке FROM, до которого
# планировщик будет объединять вложенные запросы с внешним запросом.
# При меньших значениях сокращается время планирования, но план запроса
# может стать менее эффективным.
from_collapse_limit = 20

# Задаёт максимальное количество элементов в списке FROM, до достижения которого
# планировщик будет сносить в него явные конструкции JOIN (за исключением FULL JOIN).
# При меньших значениях сокращается время планирования, но план
# запроса может стать менее эффективным.
join_collapse_limit = 20

# указываю писать логи в системный лог
log_destination = 'syslog'

# Включить автовакуум.
# его отключение приведет к росту размеров базы и серьезной деградации производительности.
autovacuum = on

# Количество процессов автовакуума. Чем больше запросов на
# запись выполняется в системе, тем больше процессов.
# Рассчитывается CPU cores/4..2 но не меньше 4.
autovacuum_max_workers = 4

# Время сна процесса автовакуума. Слишком большая величина будет приводить к тому,
# что таблицы не будут успевать «чиститься», что приведет у роста размера и снижению
# производительности работы. Малая величина приведет к бесполезной нагрузке.
autovacuum_naptime = 20s

# Не выдавать предупреждение об использовании символа \ для экранирования.
escape_string_warning = off

# Разрешить использовать символ \ для экранирования.
standard_conforming_strings = off

Закончив редактировать конфиг пробую запустить демона PostgreSQL:

systemctl start postgresql-13.service

И смотрю, что там в логе /var/log/messages:

Jan 31 00:59:37 1c-serv systemd[1]: Starting PostgreSQL 13 database server…
Jan 31 00:59:37 1c-serv postgres[2035]: [1-1] 2022-01-31 00:59:37.218 +05 [2035] СООБЩЕНИЕ: завершение вывода в stderr
Jan 31 00:59:37 1c-serv postmaster[2035]: 2022-01-31 00:59:37.218 +05 [2035] СООБЩЕНИЕ: завершение вывода в stderr
Jan 31 00:59:37 1c-serv postmaster[2035]: 2022-01-31 00:59:37.218 +05 [2035] ПОДСКАЗКА: В дальнейшем протокол будет выводиться в "syslog".
Jan 31 00:59:37 1c-serv postgres[2035]: [1-2] 2022-01-31 00:59:37.218 +05 [2035] ПОДСКАЗКА: В дальнейшем протокол будет выводиться в "syslog".
Jan 31 00:59:37 1c-serv postgres[2035]: [2-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: запускается PostgreSQL 13.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 11.2.1 20211203 (Red Hat 11.2.1-7), 64-bit
Jan 31 00:59:37 1c-serv postgres[2035]: [3-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений по адресу IPv6 "::1" открыт порт 5432
Jan 31 00:59:37 1c-serv postgres[2035]: [4-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений по адресу IPv4 "127.0.0.1" открыт порт 5432
Jan 31 00:59:37 1c-serv postgres[2035]: [5-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений открыт Unix-сокет "/var/run/postgresql/.s.PGSQL.5432"
Jan 31 00:59:37 1c-serv postgres[2035]: [6-1] 2022-01-31 00:59:37.219 +05 [2035] СООБЩЕНИЕ: для приёма подключений открыт Unix-сокет "/tmp/.s.PGSQL.5432"
Jan 31 00:59:37 1c-serv postgres[2036]: [7-1] 2022-01-31 00:59:37.221 +05 [2036] СООБЩЕНИЕ: система БД была выключена: 2022-01-30 03:03:35 +05
Jan 31 00:59:37 1c-serv postgres[2035]: [7-1] 2022-01-31 00:59:37.227 +05 [2035] СООБЩЕНИЕ: система БД готова принимать подключения
Jan 31 00:59:37 1c-serv systemd[1]: Started PostgreSQL 13 database server.

Всё в порядке, PostgreSQL запустился.

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

su -l postgres
psql
alter user postgres with password 'тут мой пароль';
\q
exit

Что ж, теперь надо установить 1С. Перехожу на портал и скачиваю свежую платформу:

-15

У меня скачался файл server64_8_3_20_1674.tar.gz. Переношу его на сервер и распаковываю его содержимое в какой-нибудь каталог. Среди распакованных есть исполняемый файл setup-full-8.3.20.1674-x86_64.run. Пробую его запустить. Предлагается выбрать язык:

Пожалуйста, выберите язык установки
[1] Arabic – العربية
[2] Azerbaijani — Azərbaycan
[3] Bulgarian - български език
[4] German — Deutsch
[5] Greek — Ελληνικά
[6] English — English
[7] Spanish — Español
[8] French — Français
[9] Hungarian — Magyar
[10] Italian — Italiano
[11] Kazakh - қазақ тілі
[12] Lithuanian - lietuvių kalba
[13] Latvian — Latvijas
[14] Polish — Polski
[15] Romanian — Română
[16] Russian — Русский
[17] Turkmen — Türkmençe
[18] Turkish — Türkçe
[19] Ukrainian — українська
[20] Vietnamese - Tiếng Việt
[21] Simplified Chinese – 简体中文
Пожалуйста, выберите опцию [16] : 16

Мой язык 16-ый из этого списка. Далее мне предлагается выбрать компоненты. Мне нужен только сервер и модуль расширения web-сервера:

Выберите компоненты

1С:Предприятие [Y/n] :n
1С:Предприятие - Тонкий клиент [y/N] : n
1С:Предприятие - Тонкий клиент, файловый вариант [y/N] : n
Сервер 1С:Предприятия 8 [y/N] : y
Модули расширения веб-сервера [y/N] : y
Администрирование сервера 1С:Предприятия [y/N] : n
Интерфейсы на различных языках : Y (Cannot be edited)
Интерфейсы на различных языках - Азербайджанский [y/N] : n
Интерфейсы на различных языках - Английский : Y (Cannot be edited)
Интерфейсы на различных языках - Арабский [y/N] : n
Интерфейсы на различных языках - Армянский [y/N] : n
Интерфейсы на различных языках - Болгарский [y/N] : n
Интерфейсы на различных языках - Венгерский [y/N] : n
Интерфейсы на различных языках - Греческий [y/N] : n
Интерфейсы на различных языках - Вьетнамский [y/N] : n
Интерфейсы на различных языках - Грузинский [y/N] : n
Интерфейсы на различных языках - Казахский [y/N] : n
Интерфейсы на различных языках - Китайский [y/N] : n
Интерфейсы на различных языках - Итальянский [y/N] : n
Интерфейсы на различных языках - Испанский [y/N] : n
Интерфейсы на различных языках - Латышский [y/N] : n
Интерфейсы на различных языках - Литовский [y/N] : n
Интерфейсы на различных языках - Немецкий [y/N] : n
Интерфейсы на различных языках - Польский [y/N] : n
Интерфейсы на различных языках - Румынский [y/N] : n
Интерфейсы на различных языках - Русский [Y/n] :y
Интерфейсы на различных языках - Турецкий [y/N] : n
Интерфейсы на различных языках - Туркменский [y/N] : n
Интерфейсы на различных языках - Французский [y/N] : n
Интерфейсы на различных языках - Украинский [y/N] : n
Сервер хранилища конфигураций 1С:Предприятия [y/N] : n
Дополнительные функции администрирования [y/N] : n
Дополнительно : Y (Cannot be edited)
Дополнительно - Liberica JRE [y/N] : n
Дополнительно - Контроль целостности [y/N] : n

Верно ли выбранное выше? [Y/n]: y

Ну и дожидаюсь окончания установки:

----------------------------------------------------------------------------
Программа готова к установке 1С:Предприятие на ваш компьютер.

Вы хотите продолжить? [Y/n]: y

----------------------------------------------------------------------------
Пожалуйста, подождите пока программа установит 1С:Предприятие на ваш компьютер.

Установка
0% ______________ 50% ______________ 100%
# # # # # # # # # # # # # # # # # # # # # # # # # #

----------------------------------------------------------------------------
Завершена установка 1С:Предприятие на ваш компьютер.

Установилась 1С в каталог /opt/1cv8. Также наблюдаю каталог системного пользователя 1С /home/usr1cv8. По уму, к этому каталогу должен быть примонтирован отдельный диск, т.к. внутри будет журнал регистрации 1С. В каталоге /opt/1cv8/x86_64/8.3.20.1674 нахожу скрипт srv1cv83. Его надо скопировать в каталог /etc/rc.d/init.d. Затем пробую стартануть демона:

service srv1cv83 start

И получаю ошибку:

Starting 1C:Enterprise 8.3 server: Error: service failed to start!
FAILED

При этом 1С-овские процессы запустились, в системном мониторе отображается множество процессов /opt/1cv8/x86_64/8.3.20.1674/rmngr. Хорошо, пробую остановить демона:

service srv1cv83 stop

Получаю вот такой ответ:

Stopping 1C:Enterprise 8.3 server: Warning: server not running!
OK

И процессы /opt/1cv8/x86_64/8.3.20.1674/rmngr никуда, при этом, не деваются. А решение данной проблемы очень простое: в файл /etc/hosts надо добавить запись:

192.168.0.210 1c-serv.local.typical-admin.ru 1c-serv

И перезагрузить сервер. После этого демон srv1cv83 будет стартовать и останавливаться нормально.

Ещё, в каталоге /opt/1cv8/x86_64/8.3.20.1674 есть файл srv1cv83.conf. Его надо скопировать в каталог /etc/sysconfig, переименовав в просто «srv1cv83». Вобщем, надо чтобы имена файлов совпадали — скрипта /etc/rc.d/init.d/ srv1cv83 и конфига /etc/sysconfig/srv1cv83.

Перед тем, как подключиться к серверу 1С откуда-либо, надо для него создать DNS-запись. Напомню, что у меня в сети есть контроллер домен AD.

-16

Помимо этого, не забываю, что на CentOS включен фаервол под названием Firewalld. Для начала открываю порт 10000, чтобы к CentOS можно было подключиться через Webmin:

firewall-cmd --add-port=10000/tcp

Затем уже через Webmin захожу и прописываю в Firewalld все необходимые порты, которые надо открыть:

-17

Далее, нахожу файл /postgresql/pg_hba.conf. В нём нахожу строчку:

local all all peer

И меняю её на:

local all all trust

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

service postgresql-13 restart

И не забываю PostgreSQL и 1С поставить в автозапуск:

systemctl enable postgresql-13.service
chkconfig srv1cv83 on

Теперь пробую с какой-нибудь клиентской машины подключиться через консоль:

-18

Ввожу имя сервера 1С «1c-serv.local.typical-admin.ru»:

-19

Всё, подключиться получилось:

-20

Теперь пробую создать базу:

-21

Обращаю внимание, что вместо адреса сервера PostgreSQL я ввёл путь к каталогу с сокетом PostgreSQL, поскольку сервер приложений 1С и PostgreSQL находятся на одной машине. Жму ОК, и тут получаю ошибку: «Ошибка соединения с рабочим процессом. Ошибка загрузки компоненты: moxel». Эта проблема решается установкой пакета lcms2:

dnf -y install lcms2

После этого база успешно создастся.

Этап 3. Установка HASP, решение проблем, настройка вэб-доступа.

Пробую зайти в созданную базу и получаю предупреждение об отсутствии лицензии.

-22

Значит надо поставить HASP-драйвер и вставить ключи. Скачиваю пакеты с сайта https://download.etersoft.ru/:

wget https://download.etersoft.ru/pub/Etersoft/HASP/7.90/x86_64/CentOS/7/haspd-7.90-eter2centos.x86_64.rpm
wget https://download.etersoft.ru/pub/Etersoft/HASP/7.90/x86_64/CentOS/7/haspd-modules-7.90-eter2centos.x86_64.rpm

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

dnf install glibc.i686

И уже потом ставлю скачанные два пакета HASP-драйверов:

rpm -ivh haspd-7.90-eter2centos.x86_64.rpm haspd-modules-7.90-eter2centos.x86_64.rpm

Получаю вот такой лог об успешной установке:

Verifying... # # # # # # # # # # # # # # # # # # # # # # # # # [100%]
Подготовка...
# # # # # # # # # # # # # # # # # # # # # # # # # [100%]
Обновление / установка…
1:haspd-7.90-eter2centos
# # # # # # # # # # # # # # # # # # # [ 50%]
Loading HASP LPT kernel module... (/dev/lp0 device has not found) [PASSED]
Check kernel for CONFIG_USB_DEVICEFS... [PASSED]
Enable workaround for /proc/bus/usb (bind from /dev/bus/usb) [ DONE ]
[ DONE ]
Running aksusbd... [ DONE ]
Running winehasp... [ DONE ]
Running hasplm... [ DONE ]
Running hasplmd... [ DONE ]
2:haspd-modules-7.90-eter2centos
# # # # # # # # # # # # # # # # [100%]
Stopping hasplmd... . [ DONE ]
Stopping hasplm... [ DONE ]
Stopping winehasp... [ DONE ]
Stopping aksusbd... [ DONE ]
Stopping skeyd... [PASSED]
Stopping usbsentinel... [PASSED]
Stopping SntlKeysSrvrlnx... [PASSED]
Stopping workaround for /proc/bus/usb [ DONE ]
Unloading HASP LPT kernel module... [PASSED]
Loading HASP LPT kernel module... (/dev/lp0 device has not found [PASSED]
Check kernel for CONFIG_USB_DEVICEFS... [PASSED]
Enable workaround for /proc/bus/usb (bind from /dev/bus/usb) [ DONE ]
[ DONE ]
Running aksusbd... [ DONE ]
Running winehasp... [ DONE ]
Running hasplm... [ DONE ]
Running hasplmd... [ DONE ]

Чтобы система корректно увидела ключ, надо перезагрузить сервер, но пока не буду это делать. Сразу же подправлю конфиг /etc/haspd/hasplm.conf. Добавлю в него строчку:

NHS_IP_LIMIT = 192.168.0.0/24

Именно в этой строчке перечисляются сети и хосты, которые смогут видеть HASP-ключ. Также, нужно помнить про фаервол:

-23

Пробую зайти в созданную базу и получаю предупреждение:

-24

«На сервере отсутствуют шрифты из состава Microsoft Core»

И вроде как решение тут:

http://mscorefonts2.sourceforge.net/

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

dnf install curl cabextract xorg-x11-font-utils fontconfig
Последняя проверка окончания срока действия метаданных: 2:02:43 назад, Пн 31 янв 2022 05:15:49.
Пакет curl-7.76.1-14.el9.x86_64 уже установлен.
Нет соответствия аргументу: xorg-x11-font-utils

В репозиториях CentOS 9 (да и в CentOS 8) пакета xorg-x11-font-utils нет. Да и вообще, его нет для этих систем. Я не нашёл. Пришлось выкручиваться путём пересборки этого пакета из src.rpm от CentOS 7. А тот, в свою очередь, для сборки потребовал ещё несколько пакетов, среди которых опять был один отсутствующий в CentOS — его уже пришлось пересобирать из src.rpm от Федоры. Все эти процессы сборки я описывать не буду, а просто выложу готовые недостающие пакеты для CentOS 9:

https://disk.yandex.ru/d/h4UTNe4BNxJnRA

Туда же положил и сам пакет msttcore-fonts-installer-2.6-1.noarch.rpm, чтобы всё в одном месте было. Итого, потребуется скачать файлы: libXfont-1.5.4-10.el9.x86_64.rpm, xorg-x11-font-utils-7.5-21.el9.x86_64.rpm и msttcore-fonts-installer-2.6-1.noarch.rpm. Ставлю сначала зависимости, имеющиеся в репозиториях:

dnf -y install curl cabextract fontconfig libfontenc

Затем устанавливаю три скачанных файла:

rpm -ivh libXfont-1.5.4-10.el9.x86_64.rpm xorg-x11-font-utils-7.5-21.el9.x86_64.rpm msttcore-fonts-installer-2.6-1.noarch.rpm

Пакет msttcore-fonts-installer-2.6-1.noarch.rpm, на самом деле, просто подгружает шрифты со стороннего ресурса и кладёт их в каталог /usr/share/fonts/msttcore. Т.е. теоретически, их можно было и вручную откуда-нибудь скачать и положить в этот каталог. Предупреждение о шрифтах после этого не выходит.

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

https://its.1c.ru/db/v8319doc#bookmark:usr:TI000000019

Там вижу, что требуется: ImageMagick, Fontconfig, FreeType, Libgsf, Glib, UnixOdbc и Kerberos.

Что касается ImageMagick, то по его установке на CentOS 9 у меня есть отдельная заметка:

https://typical-admin.ru/moi-zametki/ustanovka-imagemagick-na-centos-9

Устанавливаю ImageMagick по своей же инструкции. С остальными пакетами проще, они есть в репозиториях. Причём некоторые уже наверняка стоят. Но если что-то отсутствует, то эта команда исправит:

dnf -y install fontconfig libgsf glib2 unixODBC krb5-libs krb5-workstation

Ну и после этого, пожалуй, стоит перезагрузить сервер.

Теперь надо попробовать дать вэб-доступ какой-нибудь базе 1с. Для начала, ставлю apache:

dnf -y install httpd

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

systemctl enable httpd.service

Далее, надо определиться, где будет располагаться файл веб-интерфейса. Для каждой базы надо делать свой такой каталог. Файл вэб-интерфайса к моей базе будет располагаться вот тут:

mkdir /var/www/testbase

Затем перехожу в каталог /opt/1cv8/x86_64/8.3.20.1674 и, находясь в нём, выполняю команду:

./webinst -apache24 -wsdir mytest -dir '/var/www/testbase/' -connStr 'Srvr=1c-serv.local.typical-admin.ru;Ref=testbase1' -confPath /etc/httpd/conf/httpd.conf

Где:

-wsdir – имя алиаса, используемого на веб-сервере для соединения с базой. В последствии будет обращение к ней в браузере http://адрес.сервера/mytest
-dir
– директория где будет располагаться файл web-интерфейса 1с (файл default.vrd)
-connStr – строка соединения с базой 1С предприятия, в которой Srvr – адрес сервера 1С предприятия, а Ref – имя базы.
-confPath – расположение конфигурационного файла web-сервера apache

Не забыть исправить права доступа к файлу default.vrd:

chown -R apache:apache /var/www/testbase

и открыть 80-ый порт на Firewalld:

-25

Затем, стартую апач:

service httpd start

А потом пробую зайти по адресу:

http://1c-serv.local.typical-admin.ru/mytest

Где, в моём случае, 1c-serv.local.typical-admin.ru — это адрес сервера 1C предприятие, а mytest — это вышеописанный алиас в апаче. Доступ есть, всё хорошо:

-26

Однако, это не совсем правильный доступ. Правильный доступ будет через SSL-сертификат. Но про настройку вэб-доступа через доверенный сертификат я хочу написать в отдельной статье или заметке, потому что там гораздо больше информации о получении самого сертификата. Частично я эту тему уже затрагивал в статье по настройке Zimbra 9:

https://typical-admin.ru/item/86-zimbra-9-0-0

Этап 4. Настройка прозрачной авторизации пользователей через kerberos.

Внимание! Я думал, что на этом этапе у меня где-то ошибка, потому что kerberos авторизация работать никак не хотела.
Путём продолжительного общения с оф.поддержкой выяснилось, что 1С официально не поддерживает CentOS 9, поэтому ничем помочь не могут.
Официально 1С поддерживает лишь CentOS 7, на которой kerberos авторизация работать должна. У меня на CentOS 7 работает один сервер 1С в продакшене. Но платформа на нём стоит 8.3.16.1814. На нём я решил проверить, работает ли kerberos-авторизация.
Оказалось, что да, работает. Поэтому данный этап проверен на CentOS 7 с 1C 8.3.16.1814. Позже, я пробовал поставить 1С 8.3.16.1814 на CentOS 9 и настроить всё точно также, как на CentOS 7. Но на CentOS 9 всё равно не заработало.

Поскольку у меня есть Active Directory, то почему бы не настроить авторизацию пользователей 1C через неё? Тем более, что 1C это поддерживает. В линуксе это делается через kerberos.

Сперва-наперво, на контроллере домена надо создать keytab-файл и пользователя, с которым он будет ассоциироваться. Пользователь – это самый обычный пользователь без каких-либо особых привилегий. Называться он будет usr1cv83, и пароль у него будет pas1cv83.

Напомню, что у меня контроллер домена на Windows server 2019. После того как создал пользователя, открываю виндовую командную строчку и делаю вот такую команду:

ktpass /crypto ALL /princ usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU /mapuser usr1cv83 /pass pas1cv83 /out C:\distrib\usr1cv8.keytab

где параметр /crypto ALL позволяет использовать любой тип шифрования
параметр
/princ usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU – это имя службы, с которой будет ассоциирован виндовый пользователь usr1cv83.
параметр
/out C:\distrib\usr1cv8.keytab – название keytab-файла и путь, куда его положить.

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

-27

Итак, после выполнения этой команды появится файл C:\distrib\usr1cv8.keytab, который надо скопировать на линуховый сервер 1С в каталог /opt/1C/v8.3/x86_64. В этом каталоге 1С ищет его по умолчанию. И важно: файл должен называться usr1cv8.keytab, а никак иначе.

Если требуется, чтобы файл лежал в другом каталоге, то надо в конфиге /etc/sysconfig/srv1cv83 подправить параметр:

SRV1CV8_KEYTAB=/opt/1cv8/x86_64

Где /opt/1cv8/x86_64 - это место расположения файла usr1cv8.keytab. И не забыть перезапустить демон srv1cv83 после этого.

Затем, если этого ещё не сделано, необходимо на сервере 1С установить пакет krb5-workstation:

dnf -y install krb5-workstation

Потом надо отредактировать конфиг /etc/krb5.conf. Приведу лишь те строчки, которые редактировал и добавлял:

[libdefaults]
default_realm = LOCAL.TYPICAL-ADMIN.RU

[realms]
LOCAL.TYPICAL-ADMIN.RU = {
kdc = 192.168.0.200
admin_server = 192.168.0.200
}

[domain_realm]
.local.typical-admin.ru = LOCAL.TYPICAL-ADMIN.RU
local.typical-admin.ru = LOCAL.TYPICAL-ADMIN.RU

Далее, надо поправить доступ к файлу usr1cv8.keytab:

chown usr1cv8:grp1cv8 /opt/1C/v8.3/x86_64/usr1cv83.keytab
chmod 600 /opt/1C/v8.3/x86_64/usr1cv83.keytab

Следующий шаг, который не указан в документации 1С, но который оказался очень важным. Требуется, чтобы имя сервера 1С было полным FQDN-именем, под которым он записан в домене Active Directory. И если это не так, то надо переименовать сервер. В моём случае оно было так, но вот команда, если что:

hostnamectl set-hostname 1c-serv.local.typical-admin.ru

Затем надо обратить внимание на файл /etc/hosts. У меня там есть запись:

192.168.0.210 1c-serv 1c-serv.local.typical-admin.ru

Из-за которой керберос авторизация работать не будет. Эту запись надо исправить, убрав из неё короткое имя:

192.168.0.210 1c-serv.local.typical-admin.ru

Вот теперь тестирую корректность keytab-файла:

klist -e -k -t /opt/1C/v8.3/x86_64/usr1cv8.keytab

Вывод должен быть такой:

Keytab name: FILE:/opt/1C/v8.3/x86_64/usr1cv8.keytab
KVNO Timestamp Principal
---- ------------------- ------------------------------------------------------
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:des-cbc-crc)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:des-cbc-md5)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (DEPRECATED:arcfour-hmac)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (aes256-cts-hmac-sha1-96)
3 01.01.1970 05:00:00 usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU (aes128-cts-hmac-sha1-96)

Теперь указываю керберосу, что надо использовать данный keytab-файл:

kinit -k -t /opt/1C/v8.3/x86_64/usr1cv8.keytab usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU

команда должна отработать без вывода каких-либо сообщений – это означает, что всё хорошо. Затем смотрю полученный билет:

klist

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

Ticket cache: KCM:0
Default principal: usr1cv8/1c-serv.local.typical-admin.ru@LOCAL.TYPICAL-ADMIN.RU

Valid starting Expires Service principal
01.02.2022 20:59:50 02.02.2022 06:59:50 krbtgt/LOCAL.TYPICAL-ADMIN.RU@LOCAL.TYPICAL-ADMIN.RU
renew until 08.02.2022 20:59:50

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

-28

Далее, в свойствах пользователя 1С, надо сопоставить его с пользователем AD. Прописываться он должен вот в таком формате:

-29

Этап 5. Настройка резервного копирования баз.

Резервное копирование я буду проводить средствами PostgreSQL. Для этого создам файлик:

nano /home/distrib/back-psql

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

#!/bin/bash

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# остановка демона 1С
/etc/init.d/srv1cv83 stop

# выгрузка дампа testbase1 в локальный каталог
pg_dump -Upostgres -w -Ft -b -EUTF8 -v -f "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql" "testbase1"

# сжатие дампа testbase1 в локальном каталоге
bzip2 "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql"

# выгрузка дампа testbase2 в локальный каталог
pg_dump -Upostgres -w -Ft -b -EUTF8 -v -f "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql" "testbase2"

# сжатие дампа testbase2 в локальном каталоге
bzip2 "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql"

# запуск демона 1С
/etc/init.d/srv1cv83 start

# копирование сжатых дампов в каталог с примонтированным сетевым диском
cp "/home/dumps/testbase1_`date '+%d.%m.%y'`.psql.bz2" "/home/backup/"
cp "/home/dumps/testbase2_`date '+%d.%m.%y'`.psql.bz2" "/home/backup/"

# удаление дампов из локального каталога
rm -f "/home/dumps/testbase1_`/bin/date '+%d.%m.%y'`.psql.bz2"
rm -f "/home/dumps/testbase2_`/bin/date '+%d.%m.%y'`.psql.bz2"

Где:

/home/dumps — это локальный каталог на сервер для выгрузки дампов баз.
/home/backup — это каталог с примонтированным сетевым диском, на который и будут складываться ежедневные ночные бэкапы баз.

Сохраняю и делаю файл исполняемым:

chmod +x /home/distrib/back-psql

Затем в файл /etc/crontab добавляю строчку:

0 2 * * * root /home/distrib/back-psql

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

Если же мне потом понадобится восстановить базу из бэкапа, то действия мои будут следующие:

- Для начала, копирую бэкап в какой-нибудь локальный каталог на сервер 1С. Пусть это будет файл testbase1_04.02.22.psql.bz2.

- Затем я распаковываю этот файл командой:

bunzip2 testbase1_04.02.22.psql.bz2

И получаю тем самым файл testbase1_04.02.22.psql — это дамп базы.

- Далее, я становлюсь пользователем postgres:

su postgres

И выполняю команду:

psql

чтобы начать работать с базами через консольный клиент PostgreSQL.

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

DROP DATABASE "testbase1";

- Потом заново создаю пустую базу с таким же именем:

CREATE DATABASE "testbase1";

- Далее выхожу из консольного клиента:

\q

и выхожу из пользователя postgres:

exit

- И теперь мне надо залить дамп testbase1_04.02.22.psql в базу testbase1. Делается это вот такой командой:

pg_restore -Upostgres -d "testbase1" -w -v "testbase1_04.02.22.psql"

Всё.

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

Yoomoney:
4100118091867315

Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077

Карта Альфа-Банк:
2200 1539 1357 2013

#1C #8.3 #centos #linux #PostgreSQL #kerberos #настройка #установка

-30