Установка и настройка Системы под Linux


Инструкция для размещения ADVANTA на сервере с ОС Linux и СУБД PostgreSQL

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

Описание установки Системы основывается на том, что уже выполнены требования к программному обеспечению сервера базы данных и сервера приложения, а также имеется в наличии инсталляционный диск Системы. Если Систему планируется разносить на два сервера, то рекомендуем сначала выполнить настройку сервера базы данных, а затем сервера приложения.

Подготовка сервера базы данных

Если у вас для Системы ADVANTA используется БД MS SQL, развернутая на отдельном сервере под управлением ОС Windows, то инструкцию по подготовке сервера базы данных можно найти здесь.

Если же у вас для Системы ADVANTA база данных будет развертываться под ОС Linux, то используется БД PostgreSQL. Перед началом настройки БД PostgreSQL необходимо включить сетевые репозитории и выполнить установку пакетов:

deb cdrom:[OS Astra Linux 1.7.2 1.7_x86-64 DVD ]/ 1.7_x86-64 contrib main non-free
deb https://download.astralinux.ru/astra/stable/1.7_x86-64/repository-main/ 1.7_x86-64 main contrib non-free
deb https://download.astralinux.ru/astra/stable/1.7_x86-64/repository-update/ 1.7_x86-64 main contrib non-free
deb https://download.astralinux.ru/astra/stable/1.7_x86-64/repository-base/ 1.7_x86-64 main contrib non-free
deb https://download.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 main contrib non-free
deb https://download.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 astra-ce
apt update
apt install postgresql-14

Далее необходимо выполнить первичную настройку СУБД PostgreSQL:

1. Выполнить вход в сессию служебного пользователя postgres:

su - postgres

Работая в сессии служебного пользователя postgres установить пароль администратора СУБД:

psql -c "alter user postgres with password '<указать_пароль>'"
  • Вместо текста <пароль> указать устанавливаемый пароль;
  • Пароль заключается в одинарные кавычки;
  • Вся команда заключается в двойные кавычки.

Завершить работу в сессии служебного пользователя postgres:

exit

2. Наcтроить удаленный доступ к СУБД, для чего в конфигурационном файле /etc/postgresql/14/main/postgresql.conf скорректировать параметр listen_addresses:

listen_addresses = '<указать_ip>'

3. В файле /etc/postgresql/14/main/pg_hba.conf добавить строку:

host    all             all             <указать_подсеть>            scram-sha-256

4. Добавить разрешающее правило файрволла для порта 5432:

ufw allow 5432/tcp

5. Перезагрузить службу postgresql:

systemctl restart postgresql

Далее необходимо создать пустую БД:

su - postgres
psql
CREATE DATABASE "a2nta_db"
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'ru_RU.UTF-8'
LC_CTYPE = 'ru_RU.UTF-8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
 
ALTER DATABASE "a2nta_db" SET search_path TO "$user", public, dbo;
 
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
 
GRANT TEMPORARY, CONNECT ON DATABASE a2nta_db TO PUBLIC;
 
GRANT ALL ON DATABASE a2nta_db TO postgres WITH GRANT OPTION;

После создания базы данных необходимо выполнить восстановление предоставленного в дистрибутиве дампа базы данных в новую созданную БД a2nta_db.

Подробную инструкцию по подготовке сервера базы данных можно найти на отдельной странице Настройка базы данных PostgreSQL.

Подготовка сервера приложения

Необходимые пакеты ОС

Для работы сервера приложений ADVANTA необходимо установить в операционной системе следующие стандартные пакеты (из репозитория ОС):

curl gnupg2 ca-certificates lsb-release debian-archive-keyring wget apt-transport-https

Веб-сервер/Прокси (последняя стабильная версия из репозитория ОС или от вендора):

nginx

Среды .Net (варианты установки):

wget http://archive.ubuntu.com/ubuntu/pool/main/libx/libxkbfile/libxkbfile1_1.1.0-1_amd64.deb
apt install ./libxkbfile1_1.1.0-1_amd64.deb
apt install ca-certificates
wget -O - https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
wget https://packages.microsoft.com/config/debian/10/prod.list -O /etc/apt/sources.list.d/microsoft-prod.list
apt update
apt install dotnet-sdk-6.0

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

deb cdrom:[OS Astra Linux 1.7.0 1.7_x86-64 DVD ]/ 1.7_x86-64 contrib main non-free
deb https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-main/     1.7_x86-64 main contrib non-free
deb https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-update/   1.7_x86-64 main contrib non-free
deb https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-base/     1.7_x86-64 main contrib non-free
deb https://dl.astralinux.ru/astra/stable/1.7_x86-64/repository-extended/ 1.7_x86-64 main contrib non-free astra-ce backports
apt update
apt install curl
apt install gnupg2
apt install apt-transport-https
apt install nginx
apt install cifs-utils
apt install libldap2-dev
 
apt install libldap-common
 
apt install libldap-2.4-2

В случае, если документы Системы лежат на SMB шаре, отредактировать файл /etc/fstab, добавив в него строку подключения/монтирования:

//192.168.X.X/documents/a2nta /mnt/documents/a2nta cifs guest 0 0

Опционально, можно установить базовые шрифты от MS (для использования в отчетах типа «Электронная таблица») и обновить кэш шрифтов сервера:

apt install ttf-mscorefonts-installer
fc-cache -f -v

Опционально, для использования авторизации в Системе ADVANTA через службу Active Directory необходимо установить библиотеку:

apt install libldap2-dev libldap-common libldap-2.4-2

Выполнить настройку https и локального сертификата:

dotnet dev-certs https
dotnet dev-certs https --trust

Настройка системных файлов

1. Загрузить и распаковать файлы приложения ADVANTA на сервер.

2. Создать файл конфигурации приложения (образцы находятся по пути: <версия приложения>/SL/config/). Созданный файл конфигурации разместить в основном каталоге приложения: /opt/advanta-app/Advanta/client.config. Пример созданного файла конфигурации client.config:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    <!--<section name="ldapService" type="Config.LDAPConfigurationSection, smcorelib"/>
    <section name="adDomains" type="Config.ADDomainsConfiguration, smcorelib"/>
    <section name="openIdConnect" type="Config.OpenIdConnectConfigurationSection, smcorelib"/>
    <section name="hashiCorpVault" type="Config.HashiCorpVaultConfigurationSection, smcorelib"/>-->
  </configSections>

Теги:

  <connectionStrings>
    <add name="db" providerName="Npgsql" connectionString="User ID=postgres;Password=P@ssw0rd;Host=192.168.16.46;MaxPoolSize=1000;Port=5432;Database=chd-perf-test;EF Template Database=chd-perf-test;Pooling=false" />
    <add name="dbCubes" providerName="Npgsql" connectionString="User ID=postgres;Password=P@ssw0rd;Host=192.168.16.46;MaxPoolSize=1000;Port=5432;Database=chd-perf-test;EF Template Database=chd-perf-test;Pooling=false" />
    <add name="busDb" providerName="Npgsql" connectionString="User ID=postgres;Password=P@ssw0rd;Host=192.168.16.46;MaxPoolSize=1000;Port=5432;Database=chd-perf-test;EF Template Database=chd-perf-test;Pooling=false" />
  </connectionStrings>

Значения:

  • connectionString – строка подключения к базе данных;
  • User – пользователь для базы данных;
  • Password – пароль пользователя.

Теги:

  <appSettings>
    <add key="WebPath" value="https://192.168.16.250:5000" />
    <add key="TimeZone" value="+5" />
    <add key="autologin" value="false" />
    <add key="FilesRootPath" value="C:\SL_Files" />
    <add key="BusTransportType" value="PostgreSql" />
    <add key="NegotiationByEmailTimeout" value="120" />
    <add key="ApplicationId" value="81c341c9da40" />
    <add key="EnableSwagger" value="1" />
    <add key="EnableTestODataEndPoint" value="1" />
    <!--
    <add key="AllowedUrlRedirects" value="https://www.wikipedia.org;https://www.deepl.com/translator" />
    -->
    <!--
    <add key="DocumentsArchiveLifeTimeHours" value="168" />    
    <add key="MaxTotalFileSize" value="2097152000" />
    <add key="MaxFileCount" value="500" />
    <add key="MaxDocumentsArchivingActionCount" value="3" />
    <add key="MaxFullPathLength" value="150" />
    <add key="MinFolderNameLength" value="3" />
    <add key="MinRootFolderNameLength" value="30" />  
 
    <add key="DocumentsArchivingService" value="Remote" />
    -->
    <!--
    <add key="DocumentsArchivingService" value="Local" />
    <add key="Bus_DocumentsArchivingCommandsQueue:NumberOfWorkers" value="1"/>
    <add key="Bus_DocumentsArchivingCommandsQueue:MaxParallelism" value="3"/>
    <add key="ProfilerLogEnable" value="true"/>
    <add key="IsWriteToProfilerLogAllRequests" value="true"/>
    <add key="ProfilerAllLogsSizeLimitMegaBytes" value="10"/>
    <add key="CompressionLevel" value="Optimal|Fastest|NoCompression"/>
    <add key="TemporaryArchiveFlat" value="Memory|FileSystem"/>
    <add key="PathToTemporaryArchiveFlat" value="C:\Temp"/>
    -->
  </appSettings>

Параметр value – это ссылка, которая отображается в уведомлениях из Системы, рассылаемых на почтовые ящики.

Теги:

  <!--<ldapService ldapPath="LDAP://" baseDN="">
    <authenticationTypes>
      <add authenticationType="Secure" />
      <add authenticationType="Signing" />
      <add authenticationType="Sealing" />
    </authenticationTypes>
  </ldapService>
 
  <adDomains>
    <domains>
      <add name="DOMAIN_NAME" login="login" password="password" ldappath="LDAP://DC=domain_name,DC=local"/>
    </domains>
  </adDomains>
  <openIdConnect>
    <providers>
      <add caption="caption" clientId="clientId" metadataURL="metadataURL" authenticationType="authenticationType" enabled="false"/>
    </providers>
  </openIdConnect>-->
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <container>
      <register type="System.IO.DirectoryInfo, mscorlib" mapTo="System.IO.DirectoryInfo, mscorlib" name="searchIndexPath">
        <constructor>
                <param name="path" value="/var/advanta-app/search" />
            </constructor>
      </register>
      <register type="Lucene.Net.Store.Directory, Lucene.Net" mapTo="Lucene.Net.Store.SimpleFSDirectory, Lucene.Net">
        <constructor>
              <param name="path" dependencyName="searchIndexPath" />
            </constructor>
      </register>
      <register type="SL.Storage.IFileStorageProvider, smcorelib" mapTo="SL.Storage.LocalFileStorageProvider, smcorelib">
        <constructor>
          <param name="documentsFolder" value="/var/advanta-app/documents" type="string"></param>
        </constructor>
      </register>
      <register type="SmartSuite.Data.Persistence.StorageProviderFactory, SmartSuite.Data" mapTo="SmartSuite.PostgreSQL.PgStorageProviderFactory, SL.PostgreSQL" />
      <register type="SL.App.ServerObjects.IServerObjectsProvider, SL.App.ServerObjects" mapTo="SL.App.ServerObjects.PostgreSQL.ServerObjectsProvider, SL.PostgreSQL" />
      <register type="P2M.Cubes.Data.IDirectoryDataManager, smcorelib" mapTo="SL.PostgreSQL.Data.DirectoryDataManager, SL.PostgreSQL" />
      <register type="P2M.Cubes.Data.IPivotDataManager, smcorelib" mapTo="SL.PostgreSQL.Data.PivotDataManager, SL.PostgreSQL" />
      <!--<register type="SL.Storage.IFileStorageProvider, smcorelib" mapTo="SL.Storage.SqlFileStorageProvider, smcorelib">
        <constructor>
          <param name="connectionStringName" value="db" type="string">
          </param>
        </constructor>
      </register>-->
 
      <!--<register type="SL.Storage.IFileStorageProvider, smcorelib" mapTo="SL.Storage.LocalFileStorageProvider, smcorelib">
        <constructor>
          <param name="documentsFolder" type="string" value="/var/advanta-app/documents" />
        </constructor>
      </register>-->
      <register type="Advanta.Files.IFileStorageProvider, Advanta.Infrastructure"
                mapTo="SL.Storage.LocalFileStorageProvider, smcorelib">
        <constructor>
          <param name="documentsFolder" type="string" value="/var/advanta-app/documents" />
        </constructor>
      </register>
 
    </container>
  </unity>
  <!--
  <hashiCorpVault address="" roleId="" secretId="">
    <containers>
      <add id="dbPasswords" version="V1" mountPoint="kv-v1" path="dbPasswords"/>
      <add id="adDomainPasswords" version="V2" mountPoint="kv-v2" path="adDomainPasswords"/>
    </containers>
  </hashiCorpVault>
  -->
</configuration>

3. В файле <версия приложения>/Advanta/appsettings.json необходимо указать URL, по которому будет открываться приложение. Пример листинга конфигурационного файла appsettings.json:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-Advanta-53bc9b9d-9d6a-45d4-8429-2a2761773502;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ASPNETCORE_ENVIRONMENT": "Development",

  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "https://192.168.16.250:5000"
      },
    }
  },

  "AllowedHosts": "*",
    "appSettings": {
        "AppName": "streamline",
        "FirstUserMail": "support@advanta-group.ru",
        "support": "bug@advanta-group.ru",
        "statistics": "statistics@advanta-group.ru",
        "ConfigurationSettingsFile": "_Resources\\Config\\ConfigFiles\\ConfigurationSettings.xml",
        "Security_PagesConfig": "_Resources\\Config\\ConfigFiles\\SecuritySettings.xml",
        "PortletsConfig_File": "_Resources\\Config\\PortletEngine\\EngineConfig.xml",
        "Projects_StatusFile": "_Resources\\Config\\P2M\\Projects\\ProjectStatuses.xml",
        "Projects_PriorityFile": "_Resources\\Config\\P2M\\Projects\\ProjectPriority.xml",
        "errorMode": "debug",
        "ValidationSettings:UnobtrusiveValidationMode": "None",
        "SoapServicesAspNetCompatibility" :  "false"
    },
    "FormOptions": {
        "ValueCountLimit": "2048"
    }
}

Начиная с версии Системы 4.00 в appSettings.json добавлен режим совместимости с ASP.NET. Режим включается флагом в appSettings.json:

{      "SoapServicesAspNetCompatibility" :  "true" }

Выбор языка интерфейса Системы

Для выбора языка, отличного от русского, нужно:

  1. Открыть на редактирование файл globalization.config.
  2. Найти строку:
    <globalization culture="ru-RU" uiCulture="ru-Ru" fileEncoding="windows-1251" requestEncoding="utf-8" responseEncoding="utf-8" />
  3. Изменить в ней значение параметра uiCulture на: en , если нужен английский язык интерфейса.

Получение лицензии

  1. Необходимо получить у менеджера ADVANTA архив GetLicenseInfo и распаковать его на сервере.
  2. Сгенерировать файл запроса лицензии:
    dotnet Advanta.GetLicenseInfo.dll
  3. Сгенерированный файл _sl.dat отправить менеджеру ADVANTA.
  4. Получить от менеджера ADVANTA файл лицензии sl.lic и скопировать его в /opt/advanta-app/Advanta/.
  5. Запускать приложение в папке /opt/advanta-app/Advanta/ командой:
    dotnet Advanta.dll

Убедиться в работоспособности приложения

Выполнить настройку службы ADVANTA:

1. Создать файл службы /etc/systemd/system/Advanta.service. Пример файла службы Advanta.service:

[Unit]
Description=Advanta Service

[Service]
# will set the Current Working Directory (CWD). Worker service will have issues without this setting
WorkingDirectory=/opt/advanta-app/Advanta
# systemd will run this executable to start the service
# if /usr/bin/dotnet doesn't work, use `which dotnet` to find correct dotnet executable path
ExecStart=/usr/bin/dotnet /opt/advanta-app/Advanta/Advanta.dll
# to query logs using journalctl, set a logical name here
SyslogIdentifier=AdvantaService

# Use your username to keep things simple.
# If you pick a different user, make sure dotnet and all permissions are set correctly to run the app
# To update permissions, use 'chown yourusername -R /srv/HelloWorld' to take ownership of the folder and files,
# Use 'chmod +x /srv/HelloWorld/HelloWorld' to allow execution of the executable file
User=root
# ensure the service restarts after crashing
Restart=always
# amount of time to wait before restarting the service
RestartSec=5
# This environment variable is necessary when dotnet isn't loaded for the  pecified user.
# To figure out this value, run 'env | grep DOTNET_ROOT' when dotnet has been loaded into your shell.
Environment=DOTNET_ROOT=/usr/share/dotnet

[Install]
WantedBy=multi-user.target
systemctl daemon-reload

2. Добавить созданную службу в автозапуск:

systemctl enable advanta

После выполнения всех настроек и проверки корректного включения и работы приложения ADVANTA, необходимо выполнить:

dotnet /opt/advanta-app/Updates/Bin/Advanta.Migration/Advanta.Migration.dll /opt/advanta-app/Advanta/client.config

Сервис для обеспечения работы таймера

В кросс-платформенной версии данный сервис встроен в платформу. Установка отдельного фонового приложения для обеспечения работы таймера как для версии 3.хх - не требуется.