Пост

Установка 1С:Сервера взаимодействия + Nginx + Minio

Система взаимодействия – это механизм внутри «1С», позволяющий организовать взаимодействие сотрудников прямо в базе. 1С: Сервер взаимодействия — это программное обеспечение реализующее серверную часть системы взаимодействия. В сервер взаимодействия входят следующие компоненты:

  • Сервер системы взаимодействия
  • Распределенное хранилище Hazelcast
  • Поисковый кластер Elasticsearch

Установка СУБД PostgreSQL

Добавим официальный репозиторий и устанавливаем PostgreSQL

1
2
3
4
5
6
$ sudo apt -y install gnupg2
$ sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
$ sudo apt update
$ sudo apt -y install postgresql-15
$ sudo ln -s /usr/lib/postgresql/15/bin/* /usr/sbin/

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

Подключимся к консоли Postgres

1
$ sudo -u postgres psql

Зададим пароль пользователю postgres

1
2
3
=# \password postgres
Enter new password for user "postgres": passwd
Enter it again:

Создадим пользователя

1
=# CREATE USER db_user WITH PASSWORD 'userpass';

Создадим базу cs_db

1
=# CREATE DATABASE cs_db WITH OWNER = db_user;

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

1
2
3
=# \c cs_db
=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
=# \q

Установка Java 11

Устанавливаем софт

1
2
$ sudo apt install -y default-jdk
$ sudo apt install -y default-jre
1
2
3
4
5
$ sudo nano /etc/profile.d/java.sh
export PATH=$PATH:/usr/lib/jvm/java-11-openjdk-amd64/bin/
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

$ source /etc/profile.d/java.sh

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

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

1
2
$ tar -vxf 1c_cs_24.0.29_linux_x86_64.tar.gz 
$ sudo ./1ce-installer-cli install --ignore-signature-warnings

Настраиваем утилиту ring

1
2
3
4
5
6
7
$ find / -name ring
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring
/opt/1C/1CE/components/1c-cs-hazelcast-3.9.4-24-x86_64/lib/ring
/opt/1C/1CE/components/1c-cs-elasticsearch-5.6.12-23-x86_64/lib/ring
/opt/1C/1CE/components/1c-cs-server-small-24.0.29-x86_64/lib/ring
$ sudo nano /etc/profile.d/ring.sh
export PATH=$PATH:/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64

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

1
2
3
$ sudo su
# source /etc/profile.d/java.sh
# source /etc/profile.d/ring.sh

Инициализация сервера взаимодействия 1С

1
2
3
4
5
# useradd cs_user
# mkdir -p /var/cs/cs_instance
# chown cs_user:cs_user /var/cs/cs_instance
# ring cs instance create --dir /var/cs/cs_instance --owner cs_user
# ring cs --instance cs_instance service create --username cs_user --java-home $JAVA_HOME --stopped

Инициализация сервера Hazelcast

1
2
3
4
5
# useradd hc_user
# mkdir -p /var/cs/hc_instance
# chown hc_user:hc_user /var/cs/hc_instance
# ring hazelcast instance create --dir /var/cs/hc_instance --owner hc_user
# ring hazelcast --instance hc_instance service create --username hc_user --java-home $JAVA_HOME --stopped

Инициализация сервера Elasticsearch

1
2
3
4
5
# useradd elastic_user
# mkdir -p /var/cs/elastic_instance
# chown elastic_user:elastic_user /var/cs/elastic_instance
# ring elasticsearch instance create --dir /var/cs/elastic_instance --owner elastic_user
# ring elasticsearch --instance elastic_instance service create --username elastic_user --java-home $JAVA_HOME --stopped

Настройка параметров JDBC драйвера PostgreSQL

1
2
3
4
5
6
# 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 userpass
# 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 userpass

Настройка WebSocket

1
2
# ring cs --instance cs_instance websocket set-params --hostname 192.168.12.25
# ring cs --instance cs_instance websocket set-params --port 8181

По очереди включим сервисы сервера взаимодействия 1С

1
2
3
# ring elasticsearch --instance elastic_instance service start
# ring hazelcast --instance hc_instance service start
# ring cs --instance cs_instance service start

Смотрим статусы

1
2
3
# ring cs --instance cs_instance service status
# ring hazelcast --instance hc_instance service status
# ring elasticsearch --instance elastic_instance service status

Проверка

1
2
# curl http://localhost:8087/rs/health
{"status":"UP","mainDbOk":true,"allShardsOk":true,"hazelcast":{"available":true,"members":["127.0.0.1:5701"]},"elasticsearchOk":true,"mediaClusterOk":false,"mediaServers":{},"pushOk":false}

Инициализация базы данных сервера

1
# curl -Sf -X POST -H "Content-Type: application/json" -d "{ \"url\" : \"jdbc:postgresql://localhost:5432/cs_db\", \"username\" : \"db_user\", \"password\" : \"userpass\", \"enabled\" : true }" -u admin:admin http://localhost:8087/admin/bucket_server

Пример успешного ответа

1
{"id":"242e3b6c-2934-460c-9197-f070e769eee8","url":"jdbc:postgresql://localhost:5432/cs_db","username":"db_user","password":"userpass","lastUsedAt":null,"enabled":true,"deleted":false}

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

Выходим из пользователя root и добавляем ключ репозитория

1
2
# exit
$ wget --quiet -O - https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

Добавляем репозиторий Nginx

1
2
3
4
$ sudo nano /etc/apt/sources.list.d/nginx.list
# NGINX repo
deb https://nginx.org/packages/mainline/debian/ bullseye nginx
deb-src https://nginx.org/packages/mainline/debian bullseye nginx

Устанавливаем Nginx

1
2
$ sudo apt update
$ sudo apt install -y nginx

Настройка 1С:Сервера взаимодействия для работы по https

В данном примере я использую готовый ssl-сертификат. Но можно установить и настроить утилиту certbot для получения бесплатного ssl-сертификата от Let’s Encrypt. В этом случае данный пункт придется выполнять при перевыпуске сертификата, т.е. раз в 3 месяца

Переключаемся на пользователя root и создаем каталог

1
2
$ sudo su
# mkdir -p /var/cs/cs_instance/data/security

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

1
2
3
# openssl pkcs12 -export -in server.crt -inkey server.key -out /var/cs/cs_instance/data/security/pkcs.p12 -name wildcard
Enter Export Password: pkcspass
Verifying - Enter Export Password: pkcspass

Сгенерируем хранилище ключей JKS с импортированным файлом pkcs.p12

1
2
3
4
# keytool -importkeystore -destkeystore /var/cs/cs_instance/data/security/websocket-keystore.jks -srckeystore /var/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

1
2
3
4
5
6
# ring cs --instance cs_instance websocket set-params --wss true
# ring cs --instance cs_instance websocket set-params --keystore-path /var/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

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

1
# mkdir -p /etc/nginx/ssl/

Сохраняем готовый сертификат и ключ в него

1
# mv server.* /etc/nginx/ssl/

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

1
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# nano /etc/nginx/conf.d/1c-interaction.conf
server {
    listen 80;
    listen 443 ssl;
    server_name 1c-interaction.itdraft.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.11-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-сервер

1
2
3
4
# nginx -t
# nginx -s reload
или
# systemctl restart nginx

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

1
2
3
4
5
# nano /opt/1C/1CE/components/1c-cs-site-0.2.11-x86_64/config.json
{
        "serverURL": "wss://1c-interaction.itdraft.ru:8181",
        "VAPIDPublicKey": "BEYY_t98CbgoqySRFVyTl36Fq2mV44nhw0g27TZMVNyEZAToazA87Hy9s9PK-9XeYN1DrAh8msQuDp_5YvJ5mPM"
}

Параметр VAPIDPublicKey уже был в файле

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

1
# ring cs --instance cs_instance site set-params --public-url https://1c-interaction.itdraft.ru

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

1
# ring cs --instance cs_instance websocket set-params --hostname 1c-interaction.itdraft.ru

Проверяем

1
2
# ring cs --instance cs_instance websocket list-params
{hostname='1c-interaction.itdraft.ru', port=8181, keystorePath='/var/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С

1
2
3
4
5
6
7
8
9
# 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

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

Летом 2023 года в Minio были внесены изменения в подсистему безопасности.
Эти изменения пока не учтены в текущих версия “1С:Сервер взаимодействия”.
Для обхода проблемы следует использовать дистрибутивы Minio, выпущенные до лета 2023 года.

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

1
2
3
4
# exit
$ wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio.RELEASE.2023-05-04T21-44-30Z
$ sudo chmod +x minio.RELEASE.2023-05-04T21-44-30Z
$ sudo mv minio.RELEASE.2023-05-04T21-44-30Z /usr/local/bin/minio

Добавляем системного пользователя, меняем владельца

1
2
$ sudo useradd -r minio_user -s /sbin/nologin
$ sudo chown minio_user:minio_user /usr/local/bin/minio

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

1
2
$ sudo mkdir /opt/minio
$ sudo chown minio_user:minio_user /opt/minio

Создаем каталог для конфигурационных файлов, ssl-сертификата для Minio

1
2
$ sudo mkdir /etc/minio
$ sudo chown minio_user:minio_user /etc/minio

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

1
2
3
4
5
6
7
8
9
$ sudo nano /etc/default/minio
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_ROOT_USER=minioadmin
MINIO_ROOT_PASSWORD=minioadmin
MINIO_VOLUMES="/opt/minio/"
MINIO_OPTS="-C /etc/minio --address :9000 --console-address :9001"
MINIO_API_ROOT_ACCESS=on
MINIO_SERVER_URL="https://1c-interaction.itdraft.ru:9000"

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

1
2
3
4
5
6
$ curl -O https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service
$ sudo nano minio.service
...
User=minio_user
Group=minio_user
...

Переместим файл minio.service в каталог /etc/system/system

1
$ sudo mv minio.service /etc/systemd/system

Перечитаем все Systemd Unit

1
$ sudo systemctl daemon-reload

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

1
2
$ sudo systemctl enable --now minio
$ sudo systemctl status minio

Настройка Minio для работы по https и его подключение к серверу взаимодействия 1С

Копируем наш ssl-сертификат и ключ

1
2
$ sudo cp /etc/nginx/ssl/server.crt /etc/minio/certs/public.crt
$ sudo cp /etc/nginx/ssl/server.key /etc/minio/certs/private.key

Меняем владельца

1
2
$ sudo chown minio_user:minio_user /etc/minio/certs/public.crt
$ sudo chown minio_user:minio_user /etc/minio/certs/private.key

Перезапускаем сервис

1
$ sudo systemctl restart minio

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

1
https://1c-interaction.itdraft.ru:9001

Создаем контейнер cs-bucket

1
2
Bucket > Create Bucket > Bucket Name: cs-bucket
Access Policy: public

Добавляем параметры подключения к хранилищу Minio в 1С:Сервис взаимодействия

1
$ curl -Sf -X POST -H 'Content-Type: application/json' -d '{ "apiType": "AMAZON", "storageType": "DEFAULT", "baseUrl": "https://1c-interaction.itdraft.ru:9000", "containerUrl": "https://1c-interaction.itdraft.ru:9000/${container_name}", "containerName": "cs-bucket", "region": "eu-west-1", "accessKeyId": "minioadmin", "secretKey": "minioadmin", "signatureVersion": "V2", "uploadLimit": 1073741824, "downloadLimit": 1073741824, "fileSizeLimit": 104857600, "bytesToKeep": 104857600, "daysToKeep": 31, "pathStyleAccessEnabled": true }' -u admin:admin http://localhost:8087/admin/storage_server

UPD 30.07.2024 Обновление ssl сертификатов

  • Обновить сертификат для nginx (/etc/nginx/ssl/)
  • Обновить сертификат для minio (/etc/minio/certs/)
  • Обновить сертификат для сервера взаимодействия

Сделаем резервную копию и объединим сертификат и ключ в единый файл PKCS12

1
2
3
4
5
6
7
# cd /var/cs/cs_instance/data/security/
# mv pkcs.p12 pkcs.p12.2024
# mv websocket-keystore.jks websocket-keystore.jks.2024
# cd /etc/nginx/ssl/
# openssl pkcs12 -export -in server.crt -inkey server.key -out /var/cs/cs_instance/data/security/pkcs.p12 -name wildcardgge
Enter Export Password: pkcspass
Verifying - Enter Export Password: pkcspass

Сгенерируем хранилище ключей JKS с импортированным файлом pkcs.p12

1
2
3
4
# keytool -importkeystore -destkeystore /var/cs/cs_instance/data/security/websocket-keystore.jks -srckeystore /var/cs/cs_instance/data/security/pkcs.p12 -srcstoretype PKCS12 -alias wildcardgge
Enter destination keystore password: jkspass
Re-enter new password: jkspass
Enter source keystore password: pkcspass

Перезапускаем сервис cs_instance

1
2
3
4
5
# source /etc/profile.d/java.sh
# source /etc/profile.d/ring.sh
# ring cs --instance cs_instance service stop
# ring cs --instance cs_instance service start
# ring cs --instance cs_instance service status
Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.