Установка Сервера взаимодействия с Minio и SSL wildcard

Чистая установка сервера centos7
отключаем файрволл и Selinux на время установки.
#systemctl stop firewalld && systemctl disable firewalld && sed -i #’s/^SELINUX=enforcing/SELINUX=disabled/’ /etc/sysconfig/selinux && sed -i #’s/^SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config

Отключаем ipv6 как рекомендует фирма 1С

# mcedit /etc/sysctl.conf

добавляем эти строчки
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

Устанавливаем пакеты которые нам нужны

#yum install tcl bzip2 net-tools mc wget epel-release unzip zip bind-utils centos-release-scl-rh fontconfig-devel libXtst libXrender -y

Делаем каталоги где все будет находиться при развертывании.
Нам нужно
1С Сервер взаимодействия берем 25 релиз
Java11
PostgresSQL12
minio до лета 23 года
сертификаты от домена выпущенного АЦ.

#mkdir -p /1C/distr/java && mkdir -p /1C/distr/Postgressql && mkdir -p /1C/distr/cs && mkdir -p /1C/distr/SSL && mkdir -p /1C/distr/minio && mkdir -p /1C/scripts
закидываем дистрибутивы в эти каталоги, что нет скачиваем.

#cd /1C/distr/minio && wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2023-05-04T21-44-30Z

Далее что бы не отвлекаться создаем структуру каталогов
#mkdir -p /home/1C/cs/cs_instance && mkdir -p /home/1C/cs/hc_instance && mkdir -p /home/1C/cs/elastic_instance && mkdir /home/pgsql

Установка PostgresSQL 12 от 1С. очень кратко в нескольких командах

#sed -i ‘s/rhgb quiet/zswap.enabled=1 zswap.max_pool_percent=30 elevator=noop transparent_hugepage=never/’ /etc/default/grub && grub2-mkconfig -o /boot/grub2/grub.cfg

#cd /1C/distr/Postgressql && tar -xvf postgresql_12.18_3.1C_x86_64_rpm.tar.bz2 && tar -xvf postgresql_12.18_3.1C_x86_64_addon_rpm.tar.bz2 && cd /1C/distr/Postgressql/postgresql-12.18-3.1C_x86_64_rpm && yum localinstall -y *.rpm && cd /1C/distr/Postgressql/postgresql-12.18-3.1C_x86_64_addon_rpm/ && yum localinstall -y *.rpm && chown -R postgres:postgres /home/pgsql

mcedit /usr/lib/systemd/system/postgresql-12.service
находим в файле
Environment=PGDATA=/var/lib/pgsql/12/data/

и меняем на свое значение
Environment=PGDATA=/home/pgsql/

Чтобы изменения применились, перезапускаем systemctl
systemctl daemon-reload

su — postgres -c «/usr/pgsql-12/bin/initdb -D /home/pgsql/»

Перед тем как задать пароль нужно заменить тип пароля
mcedit /home/pgsql/pg_hba.conf

Находим строчку или дописываем

host all all 0.0.0.0/0 password
в этой строчке меняем, после перезагрузки ставим trust

#systemctl start postgresql-12 && systemctl enable postgresql-12 && systemctl status postgresql-12

Подключение в базе
#sudo -u postgres /usr/pgsql-12/bin/psql
psql (12)
Type «help» for help.

Отлично!

Устанавливаем пароль пользователя postgres
postgres=# ALTER USER postgres WITH PASSWORD ‘ToRi3TB0’;
ALTER ROLE
postgres=# \q

* если не можем подключиться к скулю то находим конфигурационный файл su — postgres -c «psql -c ‘SHOW config_file;'» Команда выдаст, примерно, следующее:

/db/pgsql/postgresql.conf
(1 row)

Заходим и меняем значение local на *

#mcedit /home/pgsql/postgresql.conf

listen_addresses = ‘*’

создаем базу и пользователя для сервера взаимодействия

su — postgres
Подключаемся к сервису:
-bash-4.2$ psql
Создаём пользователя (cs_user) для Сервера взаимодействия

CREATE USER db_user WITH PASSWORD ‘ToRi3TB0’;
и создаём базу (cs_db) для Сервера взаимодействия, делаем ранее созданного пользователя её владельцем

CREATE DATABASE cs_db OWNER db_user;
Подключаемся к созданной базе

\c cs_db
Подключаем расширение uuid-ossp

CREATE EXTENSION IF NOT EXISTS «uuid-ossp»;
Выходим из оболочки psql и отключаемся от системы пользователем postgres:

\q
exit

shutdown -r now

Устанавливаем новую java11
Полный список установленных версий Java можно получить
командой
alternatives —list
#cd /1C/distr/java && sudo rpm -ivh axiomjdk-jdk-pro11.0.22+12-linux-amd64-full.rpm && java -version && reboot

прописываем Java_Home

export JAVA_HOME=/usr/lib/jvm/axiomjdk-java11-pro-full.x86_64 это разовая команда до перезагрузки и под пользователем root

echo $JAVA_HOME

/usr/lib/jvm/axiomjdk-java11-pro-full.x86_64

#mcedit /etc/environment прописываем постоянно
export JAVA_HOME=echo $JAVA_HOME

Установка 1с сервера взаимодействия ничего нового как и раньше установка почти не изменилась.

#cd /1C/distr/cs && tar -xvf 1c_cs_25.0.22_linux_x86_64.tar.gz && sudo ./1ce-installer-cli install —ignore-signature-warnings && reboot

#ring

Доступные модули:

cs@24.0.36:x86_64 — 1С:Предприятие — Сервер взаимодействия.
elasticsearch@5.6.12:x86_64 — Elasticsearch для 1С:Сервера взаимодействия.
hazelcast@3.9.4:x86_64 — Hazelcast для 1С:Сервера взаимодействия.

Разворачиваем cs
#useradd -r cs_user -s /sbin/nologin && chown cs_user:cs_user /home/1C/cs/cs_instance && ring cs instance create —dir /home/1C/cs/cs_instance —owner cs_user && ring cs —instance cs_instance service create —username cs_user —java-home $JAVA_HOME —stopped && cp /etc/systemd/system/1ce-cs_instance.service /1C/scripts && ring cs —instance cs_instance service delete && systemctl link /1C/scripts/1ce-cs_instance.service && systemctl enable 1ce-cs_instance

Разворачиваем hc
#useradd -r hc_user -s /sbin/nologin && chown hc_user:hc_user /home/1C/cs/hc_instance && ring hazelcast instance create —dir /home/1C/cs/hc_instance —owner hc_user && ring hazelcast —instance hc_instance service create —username hc_user —java-home $JAVA_HOME —stopped && cp /etc/systemd/system/1ce-hc_instance.service /1C/scripts && ring hazelcast —instance hc_instance service delete && systemctl link /1C/scripts/1ce-hc_instance.service && systemctl enable 1ce-hc_instance

Разворачиваем Elasticsearch
#useradd -r elastic_user -s /sbin/nologin && chown elastic_user:elastic_user /home/1C/cs/elastic_instance && ring elasticsearch instance create —dir /home/1C/cs/elastic_instance —owner elastic_user && ring elasticsearch —instance elastic_instance service create —username elastic_user —java-home $JAVA_HOME —stopped && cp /etc/systemd/system/1ce-elastic_instance.service /1C/scripts && ring elasticsearch —instance elastic_instance service delete && systemctl link /1C/scripts/1ce-elastic_instance.service && systemctl enable 1ce-elastic_instance

Запуск работы с базой
#ring cs —instance cs_instance jdbc pools —name common set-params —url jdbc:postgresql://localhost:5432/cs_db?currentSchema=public && ring cs —instance cs_instance jdbc pools —name common set-params —username db_user && ring cs —instance cs_instance jdbc pools —name common set-params —password «Свой пароль» && ring cs —instance cs_instance jdbc pools —name privileged set-params —url jdbc:postgresql://localhost:5432/cs_db?currentSchema=public && ring cs —instance cs_instance jdbc pools —name privileged set-params —username db_user && ring cs —instance cs_instance jdbc pools —name privileged set-params —password «свой пароль»

Прописывание внешних параметров
#ring cs —instance cs_instance websocket set-params —hostname cs.kompromiss.ru && ring cs —instance cs_instance websocket set-params —port 8081

Запуск служб и проверка
#ring hazelcast —instance hc_instance service start && ring elasticsearch —instance elastic_instance service start && ring cs —instance cs_instance service start && ring hazelcast —instance hc_instance service status && ring elasticsearch —instance elastic_instance service status && ring cs —instance cs_instance service status

проверяем все ли поднялось как минимум 3 минуты
#netstat -tpln
#curl http://localhost:8087/rs/health
если все хорошо идем дальше

Инициализация базы данных сервера
#curl -Sf -X POST -H «Content-Type: application/json» -d «{ \»url\» : \»jdbc:postgresql://localhost:5432/cs_db\», \»username\» : \»db_user\», \»password\» : \»Свой пароль»\», \»enabled\» : true }» -u admin:admin http://localhost:8087/admin/bucket_server

Установка web-сервера Nginx

Выходим из пользователя root и добавляем ключ репозитория
#yum install nginx -y

Настройка 1С:Сервера взаимодействия для работы по https
В данном примере я использую готовый ssl-сертификат.

#mv /1C/distr/SSL/__kompromiss_ru.crt /1C/distr/SSL/server.crt && mv /1C/distr/SSL/8861187.key /1C/distr/SSL/server.key

#mkdir -p /home/1C/cs/cs_instance/data/security && cd /home/1C/cs/cs_instance/data/security && cp /1C/distr/SSL/server.crt /home/1C/cs/cs_instance/data/security/server.crt && cp /1C/distr/SSL/server.key /home/1C/cs/cs_instance/data/security/server.key

Импортируем сертификат и ключ в хранилище JKS. Для этого объединим их в единый файл PKCS12

#openssl pkcs12 -export -in server.crt -inkey server.key -out /home/1C/cs/cs_instance/data/security/pkcs.p12 -name wildcard

Enter Export Password: pkcspass
Verifying — Enter Export Password: pkcspass
Сгенерируем хранилище ключей JKS с импортированным файлом pkcs.p12

#keytool -importkeystore -destkeystore /home/1C/cs/cs_instance/data/security/websocket-keystore.jks -srckeystore /home/1C/cs/cs_instance/data/security/pkcs.p12 -srcstoretype PKCS12 -alias wildcard

Enter destination keystore password: jkspass
Re-enter new password: jkspass
Enter source keystore password: pkcspass
Включим режим защищённого подключения wss

#ring cs —instance cs_instance websocket set-params —wss true && ring cs —instance cs_instance websocket set-params —keystore-path /home/1C/cs/cs_instance/data/security/websocket-keystore.jks && ring cs —instance cs_instance websocket set-params —keystore-password jkspass && ring cs —instance cs_instance websocket set-params —keystore-format JKS && ring cs —instance cs_instance websocket list-params

Настройка https в Nginx
Создаем каталог для сертификатов

#mkdir -p /etc/nginx/ssl/ && mv server.* /etc/nginx/ssl/

Генерируем dhparam.pem (процедура идет достаточно долго). dhparam – это простое число, используемое в алгоритме Диффи-Хеллмана для обмена сессионными ключами с клиентом

#openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096 && mcedit /etc/nginx/conf.d/1c-interaction.conf

Создаем конфиг Nginx

#mcedit /etc/nginx/conf.d/1c-interaction.conf

server {
listen 80;
listen 443 ssl;
server_name cs.kompromiss.ru;
charset utf-8;
​ ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:5m;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ‘ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS’;
ssl_prefer_server_ciphers on;
if ($scheme != «https») {
return 301 https://$host$request_uri;
}
server_tokens off;
root /opt/1C/1CE/components/1c-cs-site-0.2.51-x86_64/;
index index.html index.htm;
access_log /var/log/nginx/1c-interaction_access.log;
error_log /var/log/nginx/1c-interaction_error.log;
}

Проверяем конфиг Nginx на валидность и перезапускаем web-сервер

#nginx -t

#systemctl enable nginx && systemctl start nginx && systemctl status nginx

Отредактируем файл config.json

#mcedit /opt/1C/1CE/components/1c-cs-site-0.2.51-x86_64/config.json

{
«serverURL»: «wss://cs.kompromiss.ru:8081»,
«VAPIDPublicKey»: «BEYY_t98CbgoqySRFVyTl36Fq2mV44nhw0g27TZMVNyEZAToazA87Hy9s9PK-9XeYN1DrAh8msQuDp_5YvJ5mPM»
}
Параметр VAPIDPublicKey уже был в файле

Вносим изменения в параметр public-url сервера взаимодействия

#ring cs —instance cs_instance site set-params —public-url https://cs.kompromiss.ru

Вносим изменения в настройки WebSocket

#ring cs —instance cs_instance websocket set-params —hostname cs.kompromiss.ru

Проверяем

#ring cs —instance cs_instance websocket list-params

{hostname=’cs.kompromiss.ru’, port=8081, keystorePath=’/home/1C/cs/cs_instance/data/security/websocket-keystore.jks’, keystoreFormat=’JKS’, keystorePassword=’jkspass’, wss=true, maxHttpContentLength=128 KB, maxFramePayloadLength=128 KB, pingTimeout=60000, pingInterval=25000, bossThreads=0, workerThreads=0}
По очереди выключаем/включим сервисы сервера взаимодействия 1С

#ring cs —instance cs_instance service stop && ring hazelcast —instance hc_instance service stop && ring elasticsearch —instance elastic_instance service stop && ring elasticsearch —instance elastic_instance service start && ring hazelcast —instance hc_instance service start && ring cs —instance cs_instance service start && ring cs —instance cs_instance websocket list-params && reboot

Сервер хранилища Minio
Установка собственного хранилища Minio

Скачиваем дистрибутив Minio, делаем его исполняемым,

#cd /1C/distr/minio/ && wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2023-05-04T21-44-30Z

переименовываем
#cp /1C/distr/minio/minio.RELEASE.2023-05-04T21-44-30Z /home/minio/minio

#useradd minio-user && usermod -s /sbin/nologin minio-user

#mkdir -p /opt/minio && mkdir -p /home/minio-user/.minio/certs
cp /1C/distr/minio/minio.RELEASE.2023-05-04T21-44-30Z /home/minio/minio /usr/local/bin/minio

#chown -R minio-user:minio-user /home/minio && chown -R minio-user:minio-user /opt/minio && chmod +x /home/minio/minio

Создадим каталог, в котором Minio будет хранить файлы, меняем владельца каталога /opt/minio

Создаем конфиг Minio

# mcedit /etc/default/minio
MINIO_VOLUMES=/opt/minio
MINIO_ACCESS_KEY=minio
MINIO_SECRET_KEY=ToRi3TB0
MINIO_ROOT_USER=minio
MINIO_ROOT_PASSWORD=ToRi3TB0
MINIO_SERVER_URL=https://cs.kompromiss.ru:9000

Скачиваем файл для создания sustemd unid для Minio, редактируем его

#mcedit /1C/scripts/minio.service

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target
AssertFileIsExecutable=/home/minio/minio

[Service]
WorkingDirectory=/opt/minio/
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStartPre=/bin/bash -c «if [ -z \»${MINIO_VOLUMES}\» ]; then echo \»Variable MINIO_VOLUMES not set in /etc/default/minio\»; exit 1; fi»
ExecStart=/home/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

Либо скачиваем готовый $ curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service

делаем ссылку на службу
#systemctl link /1C/scripts/minio.service

Добавляем сертификаты

Перезагрузим все юниты systemd
#systemctl daemon-reload
Запускаем Minio, добавляем сервис в автозагрузку и проверяем статус
#systemctl enable minio && systemctl status minio

Настройка Minio для работы по https и его подключение к серверу взаимодействия 1С
Копируем наш ssl-сертификат и ключ
#cp /etc/nginx/ssl/server.crt /home/minio-user/.minio/certs/public.crt && cp /etc/nginx/ssl/server.key /home/minio-user/.minio/certs/private.key

Меняем владельца
#chown minio-user:minio-user /home/minio-user/.minio/certs/public.crt && chown minio-user:minio-user /home/minio-user/.minio/certs/private.key

Перезапускаем сервис
#systemctl restart minio

Открываем адрес нашего Minio в браузере

https://cs.kompromiss.ru:9000

Создаем контейнер cs-bucket
Bucket > Create Bucket > Bucket Name: cs-bucket
Access Policy: public
Добавляем параметры подключения к хранилищу Minio в 1С:Сервис взаимодействия
#mcedit /1C/scripts/create_bucket.sql
Текст файла:
Копировать в буфер обмена

INSERT INTO public.storage_server(id, type, base_url, container_url, container_name, region, access_key_id, secret_key, signature_version, is_deleted, upload_limit, download_limit, file_size_limit, created_at, updated_at, cdn_url, cdn_key_id, cdn_secret_key, state, cdn_enabled, path_style_access_enabled, bytes_to_keep, days_to_keep, pricing_url, api_type, storage_type, files_to_keep)
VALUES(
uuid_generate_v4(), ‘AMAZON’, ‘https://cs.kompromiss.ru:9000′,’https://cs.kompromiss.ru:9000/${container_name}’,
‘cs-bucket’,
»,
‘minio’,
‘ToRi3TB0’,
‘V4’, false, 1073741824, 1073741824, 104857600, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, NULL, NULL, NULL, ‘ACTIVE’, false, true, 0, 0, NULL, ‘AMAZON’, ‘DEFAULT’,31);

Выполнить запрос:
#su -l postgres -c «psql -p 5432 -d cs_db -f /1C/scripts/create_bucket.sql»

ответ
INSERT 0 1

Включаем защиту

#systemctl status firewalld && systemctl enable firewalld && systemctl start firewalld && systemctl enable firewalld
#firewall-cmd —permanent —zone=public —add-port=9000/tcp
#firewall-cmd —permanent —zone=public —add-port=8181/tcp
#firewall-cmd —permanent —zone=public —add-service=http —add-service=https
#firewall-cmd —reload
#firewall-cmd —list-services —zone=public
#firewall-cmd —list-port —zone=public
#netstat -tpln
#reboot