Вообще, про настройку сервера 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. Скачиваю образ с оф.сайта:
Перехожу к установке. На первом шаге выбираю язык:
На следующем шаге предлагается обозначить разные параметры и источники:
Начну по порядку. Меню «Клавиатура» не трогаю, там всё и так нормально. «Источник установки» тоже не трогаю. Захожу в меню «Место установки», там указываю диск, на который будет ставиться система и выбираю собственное разбиение, затем жму «Готово»:
Мне открывается следующее окно. Там, я удаляю все имеющиеся разделы, если таковые есть. Просто выделяю раздел и жму на кнопку с минусом:
Затем выбираю «Стандартный раздел» и жму «создать автоматически»:
И установщик по умолчанию предлагает разбиение диска вот такое:
Меня так не устраивает. Отдельный раздел под /home мне не нужен, удаляю его. Потом увеличиваю размер корневого раздела. В итоге имею такие разделы:
Жму «Готово», затем «Применить изменения».
Вообще, если по уму, то PostgreSQL надо ставить отдельный диск (либо дисковый массив). А также, у 1С есть такая штука, как журнал регистрации, который, по умолчанию, находится в домашней директории системного пользователя 1С (в Линуксе это usr1cv8). Так вот под журнал регистрации желательно тоже выделить отдельный диск. Я обычно под весь домашний каталог пользователя usr1cv8 выделяю. Но сейчас сервер тестовый, поэтому всё будет на одном диске находиться.
После разметки диска, установщик меня возвращает в основное меню. Там «Языковую поддержку» я не трогаю. Перехожу в «Выбор программ». Там выбираю Minimal Install и ставлю крыж Standard, затем жму «Готово»:
После чего меня снова возвращает в основное меню. На очереди у меня KDUMP — его отключаю. Для диагностики и анализа причин сбоев ядра разработчиками компании RedHat был разработан специализированный инструмент — kdump. Можно и не отключать конечно. Но я отключу.
Следующим будет «Дата и время» — там всё понятно. «Имя сети и узла» — там прописываю сетевое имя сервера и статический IP-адрес:
И
DNS-сервером указал контроллер домена Active Directory. После применения всех настроек снова возвращаюсь в основное меню. «Securuty Profile» не трогаю. Осталось только задать «Пароль root». Там ставлю галку, чтобы можно было рутом заходить по SSH:
Вообще, доступ по SSH для рута не рекомендуется открывать. Рекомендуется по SSH заходить обычным бесправным пользователем, а уже потом повышать его до рута командой «su». Но для тестовой настройки можно и так.
После задания всех параметров, станет активной кнопка «Начать установку». Жму её.
Когда установка закончится, установщик попросит перезагрузить сервер.
Подключаюсь к серверу через 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С скачиваю вот этот архив с патчем:
Загружаю этот файл на сервер через Webmin:
В этом архиве меня интересует файл 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С. Перехожу на портал и скачиваю свежую платформу:
У меня скачался файл 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.
Помимо этого, не забываю, что на CentOS включен фаервол под названием Firewalld. Для начала открываю порт 10000, чтобы к CentOS можно было подключиться через Webmin:
firewall-cmd --add-port=10000/tcp
Затем уже через Webmin захожу и прописываю в Firewalld все необходимые порты, которые надо открыть:
Далее, нахожу файл /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
Теперь пробую с какой-нибудь клиентской машины подключиться через консоль:
Ввожу имя сервера 1С «1c-serv.local.typical-admin.ru»:
Всё, подключиться получилось:
Теперь пробую создать базу:
Обращаю внимание, что вместо адреса сервера PostgreSQL я ввёл путь к каталогу с сокетом PostgreSQL, поскольку сервер приложений 1С и PostgreSQL находятся на одной машине. Жму ОК, и тут получаю ошибку: «Ошибка соединения с рабочим процессом. Ошибка загрузки компоненты: moxel». Эта проблема решается установкой пакета lcms2:
dnf -y install lcms2
После этого база успешно создастся.
Этап 3. Установка HASP, решение проблем, настройка вэб-доступа.
Пробую зайти в созданную базу и получаю предупреждение об отсутствии лицензии.
Значит надо поставить 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-ключ. Также, нужно помнить про фаервол:
Пробую зайти в созданную базу и получаю предупреждение:
«На сервере отсутствуют шрифты из состава 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:
Затем, стартую апач:
service httpd start
А потом пробую зайти по адресу:
http://1c-serv.local.typical-admin.ru/mytest
Где, в моём случае, 1c-serv.local.typical-admin.ru — это адрес сервера 1C предприятие, а mytest — это вышеописанный алиас в апаче. Доступ есть, всё хорошо:
Однако, это не совсем правильный доступ. Правильный доступ будет через 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-файла и путь, куда его положить.
Командную строку, при этом, надо запустить с повышенными привилегиями администратора. Так у меня выглядит отработка команды:
Итак, после выполнения этой команды появится файл 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
Собственно, на этом всё. Осталось проверить, работает ли прозрачная авторизация на практике. Важным моментом является то, что в её свойствах аутентификации надо выставить крыж «выбирать автоматически»:
Далее, в свойствах пользователя 1С, надо сопоставить его с пользователем AD. Прописываться он должен вот в таком формате:
Этап 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
BTC:
bc1qzw9vam8mv6derwscxl0vrnd6m9t2rpjg273mna
ETH / BNB BSC / Polygon MATIC:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F
Tron:
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV
USDT/USDC в сетях ETH/BSC/Polygon:
0x5cc07FF76490350ac6112fbFdA1B545Bc794602F
USDT в сети TRX (Tron):
TJUz8sJr9XYMjVqzmFNnCzzRWfPa57X2RV
LTC:
LRMZaFCSyCT6FUF62WEX1BokWV7v2dh2zo
Doge:
DTEnGLZRps9XaWNtAhchJWSeD4uTNDRxg7
XMR:
4A6uP1WxEc7HktToZFyiJuK6YmjdL8bSn2aY653qPwABhT4Y56iFuedgHcmpvLwWE55u8qkjGc715ZJs761FqedA8gkgznr
TON:
UQB6qMQyrrREZlpCMGDcHNOeV2GD6P2u0bBnQVFD0C6Rz_bI