Skip to main content

Поднимаем “Сервер взаимодействия 1С” на Debian 10/11/12

За основу взята чистая система Debian 10, дистрибутив сервера взаимодействия 24.0.28 и рекомендованные версии java и PostgreSQL.
УСТАНОВКА БАЗОВАЯ, НАСТРОЙКУ УЖЕ ТРЕБУЕТСЯ ДЕЛАТЬ ПО ВАШЕЙ СИТУАЦИИ!

Этап 1. Установка основного сервера, Java и PostgreSQL

Сначала поставим все зависимости:

apt update
apt upgrade -y

#для debian 10/11 (основные зависимости)
apt install wget sudo ca-certificates gnupg gawk curl net-tools libicu libllvm

#для debian 12
apt install wget sudo software-properties-common apt-transport-https ca-certificates gnupg gawk curl net-tools \
libasound2 libfreetype6 libfontconfig1 libx11-6 libxdmcp6 libxext6 libxrender1 libxtst6 libxi6 libxau6 libxcb1

Добавим репозиторий java и установим его:

#для debian 10/11
wget -q -O - https://download.bell-sw.com/pki/GPG-KEY-bellsoft | sudo apt-key add -
echo "deb [arch=amd64] https://apt.bell-sw.com/ stable main" | sudo tee /etc/apt/sources.list.d/bellsoft.list

sudo apt-get update
sudo apt-get install bellsoft-java11

#для debian 12 из репозитория пока нормально не поставить, ставим deb
wget https://download.bell-sw.com/java/11.0.20.1+1/bellsoft-jdk11.0.20.1+1-linux-amd64.deb
sudo dpkg -i bellsoft-jdk11.0.20.1+1-linux-amd64.deb

Добавляем переменную JAVA_HOME глобально для всех юзеров:

#открываем на редактирование файл
nano /etc/environment

#пишем в него строчку
export JAVA_HOME="/usr/lib/jvm/bellsoft-java11-amd64/"

#применяем
source /etc/environment

Добавим репозиторий для PostgreSQL и установим его:

#для debian 10/11
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt-get update
sudo apt-get install postgresql-12 postgresql-contrib-12

#для debian 12
curl -fsSl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql.gpg > /dev/null

echo deb [arch=amd64,arm64,ppc64el signed-by=/usr/share/keyrings/postgresql.gpg] \
http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main | sudo tee /etc/apt/sources.list.d/postgresql.list

sudo apt update
sudo apt install postgresql-12 postgresql-contrib-12

Сразу произведем первичную настройку ии создание базы данных:

#логинимся в систему и подключаемся к SQL
sudo -u postgres -i
psql

#меняем пароль для пользователя postgres, у меня он будет passwordSQL
\password postgres

#создаем и настраиваем базу данных
\c cs_db
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

#выходим
\q
exit

Качаем дистрибутив сервера с сайта ИТС или грузим в консоль с моего сервера командой ниже (ссылка на ИТС клик)

#качаем дистрибутив от меня
wget https://cloud.vlytkin.ru/s/rkDJsQnFj8qT7n5/download/1c_cs_24.0.28_linux_x86_64.tar.gz

#распаковываем инсталлятор
tar xvzf 1c_cs_24.0.28_linux_x86_64.tar.gz

#запускаем установку
sudo ./1ce-installer-cli install

Начинаем установку компонентов

#сервера
useradd cs_user
mkdir -p /var/cs/cs_instance
chown cs_user:cs_user /var/cs/cs_instance
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
instance create --dir /var/cs/cs_instance --owner cs_user
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance service create --username cs_user --java-home $JAVA_HOME --stopped

#Hazelcast
useradd hc_user
mkdir -p /var/cs/hc_instance
chown hc_user:hc_user /var/cs/hc_instance
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring hazelcast \
instance create --dir /var/cs/hc_instance --owner hc_user
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring hazelcast \
--instance hc_instance service create --username hc_user --java-home $JAVA_HOME --stopped

#Elasticsearch
useradd elastic_user
mkdir -p /var/cs/elastic_instance
chown elastic_user:elastic_user /var/cs/elastic_instance
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring elasticsearch \
instance create --dir /var/cs/elastic_instance --owner elastic_user
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring elasticsearch \
--instance elastic_instance service create --username elastic_user --java-home $JAVA_HOME --stopped

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

/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name common set-params --url jdbc:postgresql://localhost:5432/cs_db?currentSchema=public
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name common set-params --username postgres
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name common set-params --password passwordSQL

/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name privileged set-params --url jdbc:postgresql://localhost:5432/cs_db?currentSchema=public
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name privileged set-params --username postgres
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance jdbc pools --name privileged set-params --password passwordSQL

Указываем порт и хост, я буду работать на localhost, так как потом направлю подключение через NGINX:

/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance websocket set-params --hostname localhost
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring cs \
--instance cs_instance websocket set-params --port 9094

Запускаем системы:

/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring \
hazelcast --instance hc_instance service start
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring \
elasticsearch --instance elastic_instance service start
/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/ring \
cs --instance cs_instance service start

Проверяем работу командой:

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,
  "services": {
    "available": true,
    "unsatisfied": []
  }
}

Если что не так, то логи тут:

/var/cs/cs_instance/logs/
/var/cs/hc_instance/logs/
/var/cs/elastic_instance/logs/

Инициируем базу данных (пароль пишите свой):

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

О том что все хорошо, скажет ответ типа:

{
  "id": "c5e5f69a-8fa8-48eb-a24d-bc23b888f5e5",
  "url": "jdbc:postgresql://localhost:5432/cs_db",
  "username": "postgres",
  "password": "passwordSQL",
  "lastUsedAt": null,
  "enabled": true,
  "deleted":false} false
}

Если надо в фаерволе открываем порт:

firewall-cmd --zone=public --add-port=9094/tcp --permanent
firewall-cmd --reload

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

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

Замечаение!

Я буду использовать MinIO S3, однако можно подключить любое совместимое хранилище. Официально сервер работает с системами:

  1. Amazon
  2. Amazon CDN
  3. Google Cloud
  4. Google Cloud CDN
  5. Croc Cloud
  6. Техносерв

Как подключать облачное хранилище, смотрите в документации на ИТС.

Выдержка из доки

В данном примере будет использоваться хранилище Amazon

  1. В браузере открыть ссылку https://console.aws.amazon.com/s3
  2. Войти или создать аккаунт.
  3. Нажать кнопку Create bucket.
  4. Задать имя хранилища, например 1c-cs-bucket-2.
  5. Перейти по ссылке https://console.aws.amazon.com/iam/home
  6. В верхнем правом углу нажать на логин и в выпадающем меню выбрать My Security Credentials.
  7. Раскрыть пункт: Access keys (access key ID and secret access key).
  8. Нажать Create New Access Key.
  9. Нажать Show Access Key.
  10. Скопировать себе Access Key ID и Secret Access Key. Эти данные понадобятся в запросе на добавление хранилища в базу данных.

Если вы планируете работать в web-клиенте, то  необходимо настроить CORS:

  1. Откройте хранилище в браузере (или перейдите по ссылке https://console.aws.amazon.com/s3/buckets/<имя_хранилища>/?region=eu-west-1)
  2. Permissions / CORS Configuration
  3. Настройка с максимальным уровнем доступа:
        *
        GET
        POST
        DELETE
        *
  4. На сервере взаимодействия выполните команду:
    $ curl -Sf -X POST -H 'Content-Type: application/json' -d '{ "type": "AMAZON", "baseUrl": "https://s3.amazonaws.com", "containerUrl": "https://${container_name}.s3.${region}.amazonaws.com", "containerName": "Имя хранилища", "region": "eu-west-1", "accessKeyId": "Access Key ID", "secretKey": "Secret Access Key", "signatureVersion": "V4", "uploadLimit": 1073741824, "downloadLimit": 1073741824, "fileSizeLimit": 104857600, "bytesToKeep": 104857600, "daysToKeep": 31, "pathStyleAccessEnabled": false }' -u admin:admin http://localhost:8087/admin/storage_server


Начинаем установку хранилища:

useradd minio
sudo mkdir -p /opt/minio
sudo chown minio:minio /opt/minio
sudo mkdir -p /var/minio
sudo chown minio:minio /var/minio
cd /opt/minio
wget https://dl.min.io/server/minio/release/linux-amd64/minio
sudo chmod +x minio

Для доступа к серверу хранилища, необходимо задать логин и пароль в переменных среды MINIO_ACCESS_KEY и MINIO_SECRET_KEY, соответственно. Чтобы значения этих переменных устанавливались при старте, занесем их инициализацию в /etc/default.

nano /etc/default/minio

MINIO_ACCESS_KEY=minioACCESS
MINIO_SECRET_KEY=minioSECRET
MINIO_VOLUMES="/var/minio/"
MINIO_OPTS="--address :9000"

Создаем службу:

sudo nano /etc/systemd/system/minio.service

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

[Service]
WorkingDirectory=/var/minio
User=minio
Group=minio

EnvironmentFile=-/etc/default/minio
ExecStart=/opt/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
TimeoutStopSec=20

StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Запускаем:

systemctl daemon-reload
sudo systemctl enable minio.service
sudo systemctl start minio.service

http://IP-адрес-сервера-хранилища:9000

Создайте новое хранилище, например cs-bucket

Логин:  значение переменной MINIO_ACCESS_KEY,
Пароль: значение переменной MINIO_SECRET_KEY

Для хранилища укажите, что оно работает в режиме "Read and Write".

На сервере взаимодействия выполните команду, только внимательно подправьте под свою конфигурацию:

curl -Sf -X POST -H 'Content-Type: application/json' \
-d '{
  "apiType": "AMAZON",
  "storageType": "DEFAULT",
  "baseUrl": "http://ИМЯ СЕРВЕРА ИЛИ IP:_IP:9000",
  "containerUrl": "http://ИМЯ СЕРВЕРА ИЛИ IP:_IP:9000/${container_name}",
  "containerName": "cs-bucket",
  "region": "eu-west-1",
  "accessKeyId": "minio",
  "minioACCESS": "minioSECRET",
  "signatureVersion": "V2",
  "uploadLimit": 1073741824,
  "downloadLimit": 1073741824,
  "fileSizeLimit": 104857600,
  "bytesToKeep": 104857600,
  "daysToKeep": 31,
  "pathStyleAccessEnabled": true
}' \
-u admin:admin http://localhost:8087/admin/storage_server

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

sudo -u postgres psql
 \c cs_db

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)storage_type
VALUES() VALUES (
    uuid_generate_v4(), 
    'AMAZON', 
    'http://ИМЯ СЕРВЕРА ИЛИ IP:_IP:9000',
    'http://ИМЯ СЕРВЕРА ИЛИ IP:_IP:9000/${container_name}', 
    'cs-bucket', 
    'eu-west-1', 
    'minio', 
    'youpass',
    'V2', 
    false, 
    1073741824, 
    1073741824, 
    104857600, 
    CURRENT_TIMESTAMP, 
    CURRENT_TIMESTAMP, 
    NULL, 
    NULL, 
    NULL, 
    'ACTIVE', 
    false, 
    true, 
    0, 
    0, 
    NULL, 
    'AMAZON', 
    'DEFAULT'
);


На этом этапе мы получили полностью работающую систему взаимодействия, где работают звонки, сообщения и вложения.
Тонкую настройку уже сами разбираемся как делать. Как разгрузить звонки комп при звонках, тоже можно посмотреть на ИТС. (гуглить как медиасервера для проведения видеоконференций, применяют в качестве него WebRTC Server «Janus».

Далее, я уже занимаюсь баловством и то что я буду делать, дает мне возможность спрятать за одним портом весь сервер с его хранилищем, чтоб база подключалась только по WSS (веб-сокет с шифрованием) и работала как с базами опубликованными по HTTPS, так и с простыми базами, при этом работающая даже там, где блокируются все порты кроме 80 и 443.

Немного упростим работу с ring, чтоб не писать постоянно весь путь

#открываем на редактирование файл
nano /etc/environment

#пишем в него строчку
export PATH=$PATH:"/opt/1C/1CE/components/1c-enterprise-ring-0.19.5+12-x86_64/"

#применяем
source /etc/environment

 

Этап 3. Баловство, ради опыта:

Как упомянул в начале, я хочу в данной системе задействовать NGINX. Я прекрасно понимаю что обеспечить работу по WSS можно и без него, но я не хочу конвертировать сертификат в формат для java и я не хочу открывать более одного порта. Хочу просто домен третьего уровня, который будет работать как надо)

Приступим и начнем с установки NGINX и CertBot (да, да. Я хочу бесплатные сертификаты с автоматическим обновлением):

apt install nginx python3-certbot-nginx

Создаем конфиг нашего "сайта" для того чтоб хранилище было по пути /storage, а в корне наш сервер взаимодейтвия

#nano /etc/nginx/sites-enabled/examlpe.com.conf

server {
    listen 80;
    server_name examlpe.com;
 location /storage/ {
        proxy_pass http://localhost:9000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # Аутентификация MinIO сервера
        proxy_set_header Authorization "Basic base64_encoded_access_key:secret_key";
    }

location / {
        proxy_pass http://localhost:9094/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

#делаю фри серт по классике
certbot --nginx

Переходим к правке сервера, рабочим хост в файле nano /var/cs/cs_instance/config/websocket.yml и указываем localhost. На этом этапе если перезапустить сервер взаимодействия 1С уже можно подключить по WSS, но за пределами сети не будут работать файлы.

Далее надо подцепиться к скулю (я буду юзать туннель и HeidiSQL) и там отредактировать подключение к хранилищу.

Правим в нашей базе данных таблицу public.storage_server, указываем адрес к серверу с полным путем и меняем версию с 2 на 4.
Профит)
Вот у нас и получился сервер взаимодействия с WSS и работающий на одном хостнейме без дополнительных портов.