Поднимаем “Сервер взаимодействия 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}
Если надо в фаерволе открываем порт:
firewall-cmd --zone=public --add-port=9094/tcp --permanent firewall-cmd --reload
На этом этапе мы можем уже подключить 1С к серверу. Но у нас не будут прикрепляться файлы, однако сами сообщения уже будут работать.
Этап 2: установка и подключение хранилища, для работы с файлами:
Замечаение!
Я буду использовать MinIO S3, однако можно подключить любое совместимое хранилище. Официально сервер работает с системами:
- Amazon
- Amazon CDN
- Google Cloud
- Google Cloud CDN
- Croc Cloud
- Техносерв
Как подключать облачное хранилище, смотрите в документации на ИТС.
Выдержка из доки
В данном примере будет использоваться хранилище Amazon
- В браузере открыть ссылку https://console.aws.amazon.com/s3
- Войти или создать аккаунт.
- Нажать кнопку Create bucket.
- Задать имя хранилища, например 1c-cs-bucket-2.
- Перейти по ссылке https://console.aws.amazon.com/iam/home
- В верхнем правом углу нажать на логин и в выпадающем меню выбрать My Security Credentials.
- Раскрыть пункт: Access keys (access key ID and secret access key).
- Нажать Create New Access Key.
- Нажать Show Access Key.
- Скопировать себе Access Key ID и Secret Access Key. Эти данные понадобятся в запросе на добавление хранилища в базу данных.
Если вы планируете работать в web-клиенте, то необходимо настроить CORS:
- Откройте хранилище в браузере (или перейдите по ссылке https://console.aws.amazon.com/s3/buckets/<имя_хранилища>/?region=eu-west-1)
- Permissions / CORS Configuration
- Настройка с максимальным уровнем доступа:
*
GET
POST
DELETE
* - На сервере взаимодействия выполните команду:
$ 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:9000", "containerUrl": "http://ИМЯ СЕРВЕРА ИЛИ 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) VALUES( uuid_generate_v4(), 'AMAZON', 'http://ИМЯ СЕРВЕРА ИЛИ IP:9000','http://ИМЯ СЕРВЕРА ИЛИ 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 и работающий на одном хостнейме без дополнительных портов.