Перейти к основному содержанию
`Ctrl`+`K`

# Развертывание сервера приложений GS с сервером авторизации

Инструкция описывает установку сервера (далее также - прокси, gs-authproxy) регистрации и авторизации пользователей, представляющих внешние организации (например, для возможности завести личный кабинет поставщика) Для корректной работы сервера авторизации на сервере приложенией необходим модуль `srm`.

## Схема работы сервера авторизации

Описание элементов:

- Пользователи — компьютеры, смартфоны, планшеты.

- HAProxy — принимает входящие запросы и перенаправляет их либо на сервер авторизации, либо на Global ERP.

- Сервер авторизации:

  - Django + Apache.

  - Принимает запросы от пользователя и отправляет их на Global ERP.

  - Если успешно, генерирует JWT токен.

  - Перенаправление — HAProxy направляет пользователя с токеном на Global ERP.

- Global ERP(CRM):

  - Проверяет JWT токен.

  - Дает доступ к функционалу.

## Подготовка

Для работы прокси необходимо следующее ПО:

1. Debian 11 (с настроенным sudo)

2. Global Server

3. Apache HTTP Server в качестве web-сервера для сервера авторизации

4. HAProxy в качестве форвард-прокси (и, если требуется, распределителя нагрузки) для сервера приложений и сервера авторизации. Возможно заменить на nginx

5. PostgreSQL для хранения сессионной информации.

Global Server установите в соответствии с документацией

Установите пакеты:

    sudo apt install apache2 libapache2-mod-wsgi-py3
    sudo a2enmod wsgi
    sudo apt install haproxy

В файле `/etc/apache2/ports.conf` измените директиву `Listen 80` на `Listen 8000`, или укажите другой порт.

Создайте PostgreSQL базу данных:

    create user worker with password 'worker';
    create database authproxy;
    grant all privileges on database authproxy to worker;

## Развертывание и конфигурация

Скачайте архив дистрибутива с предоставленного ресурса (Предоставляется через контактное лицо, файл gs-authproxy.zip). Создайте временную директорию и загрузите файлы дистрибутива на сервер

    sudo mkdir -p /tmp/gs-authproxy

Распакуйте сервер авторизации

    sudo mkdir -p ~/gs-authproxy
    sudo unzip /tmp/gs-authproxy/gs-authproxy.zip -d ~/gs-authproxy

Выдайте разрешение на запуск

    sudo chmod +x ~/gs-authproxy/set_credentials.sh
    sudo chmod +x ~/gs-authproxy/update.sh
    sudo chmod +x bin/*

Установите нужные серверу авторизации пакеты и настройте окружение:

    sudo ./bin/installpkg.sh
    ./bin/initvenv.sh

Создайте свою пару ключей для подписи токенов (настоятельно рекомендуется), то сгенерируйте их следующими командами:

    openssl genrsa -out privateKey.pem 2048
    openssl rsa -in privateKey.pem -pubout -out publicKey.pem

### Настройка GlobalServer

Откройте в Global Server «Настройка системы» - «Настройки и сервисы» - «Настройки модулей системы» - «Общие настройки модулей» - «btk»:

- Для ключа `jSettingForGenGidUrl`,укажите следующие значения:

  - `"sTransferProtocolForGenGidUrl":"http"`

  - `"sHostNameForGenGidUrl":"192.168.24.89:9000"`

- Обратите внимание на флаг `bUsernameEnglishLettersOnly`. Если он установлен, то системные имена пользователей не могут содержать символы национального алфавита, только английские буквы.

- Для ключа `extUserPublicKey` добавьте публичный ключ подписи в текстовом виде без заголовка и подвала. (Ключ должен быть в одну строку без переносов)

      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnY1eq7C1PMhnXdvrlM5EcC6B4VgkLheotvPIiLf5vV2ZS+VPDhc2ZyCy17Fmn68Py28YUHJqCmP1BvXiPomFNPQrf4rgVAu3C6w5Orv86r8IjZiyApCIC0G5qkL6Cuvu3qDkT1axQ3pqSCyrgnUDuatPp019kjvOJo9a5PfnrlKw/i4zoFcs8qUwHfCwsTRmdl828YRlzf0rHA/jiT21J1AzkkgMSQmIH9XRxlSS9HmkP6Hgvx7Fe+ir86kU6Pw5OLaCeBnlh0RUrolSnyLNhjPuCqIQ54pfz8YzR/T2jMgxU+hvVjD2vC8OJLNDWv7g0rNzynV4zIWNt6gkiHzkvwIDAQAB

### Настройка gs-authproxy

- Создайте директорию `/opt/global/gs-ap-config` для конфигурации проекта.

       sudo mkdir -p /opt/global/gs-ap-config

  Добавьте необходимые конфигурационные файлы (файл с конфигурацией проекта, иконка для вкладки в браузере, логотип на странице входа).

  Структура каталога должны быть следующей:

        gs-ap-config/
        ├── static/
        │   ├── img/
        │   │   ├── logos/
        │   │   │   └── customer.svg - логотип на странице входа
        │   │   └── icons/
        │   │       └── favicon.svg - иконка для вкладки в браузере
        └── config.yml - файл с конфигурацией проекта

  Важно

  Система рассчитана на работу только с такой структурой директории Вы можете скопировать структуру из deploy/templates/gs-ap-config

  - Cконфигурируйте проект
    В созданной директории заполните файл с конфигурациями проекта `config.yml` в соответствии с требования вашего проекта:

    - подключения к БД установленной в прошлых шагах

    - почтовый сервер

    - настройки Django

    - пути приватных ключей

    - имена для генерации токена

    - url на который будет отправляться запросы

    - путь к файлу с логами

    - сведения об организации

    - время жизни кода подтверждения

    - путь для доступа к cookie

    - включение тихого режима (True/False)

    - информация о компании

  - Задайте переменные окружения с названием `APPROFILEPATH`, где укажите путь к директории с конфигурацией

Пример заполненного config.yml

    database:
    # Имя БД
      name: authproxy
    # хост на котором будет запущена БД
      host: localhost
    # порт на котором будет запущена БД
      port: 5432

    django:
    # Url для записи секретного ключа в credential manager. Секретный ключ Django играет роль в обеспечении безопасности вашего веб-приложения.
      url: 'django_secret_key'
    # Режим разработки.
      debug: true

    endpoints:
    # url на который будет отправляться запросы
      request_url: 'http://127.0.0.1:80/app/sys/rest/ss/pkg/Btk_JexlGatePkg/execute'
    # url на который будет отправляться пользователь для авторизации
      authorize_url: '/PGDEV/Btk_ConfiguratorMainMenu/gtk-ru.bitec.app.btk.Btk_Notification%23Head/'
      database_name: PGDEV
      debug_register_url: '/PGDEV/Bs_RegOrgMainMenu/gtk-ru.bitec.app.bs.organization.Bs_Organization%23CardForRegOrganization/'

    email:
    # количество отправляемых писем за лимит времени
      email_limit: 60
    # лимит времени по отправки писем
      limit_window: 60
    # адрес SMTP-сервера, через который будут отправляться электронные письма. Замените 'smtp.example.com' на реальный адрес вашего SMTP-сервера.
      email_host: 'smtp.example.com'
    # порт SMTP-сервера. Значение 587 часто используется для подключения к серверу через TLS (Transport Layer Security)
      email_port: 587
    # булевое значение, указывающее, следует ли использовать TLS (Transport Layer Security) для защищенного соединения с SMTP-сервером. Установите True, если ваш SMTP-сервер поддерживает TLS, и False в противном случае
      email_use_tls: True
      email_use_ssl: False
    # Тема письма.
      subject: 'Код подтверждения для портала поставщиков'
    # Текст сообщения в письме. Обязательно сохранять переменную "{code}"
      message: '''
      Добрый день!

    Ваш код подтверждения {code} – введите его на сайте для продолжения.
    Если Вы не запрашивали данный код, пожалуйста, проигнорируйте это письмо.

    С уважением

    ----

    Данное сообщение сформировано автоматически и ответ на этот адрес не будет прочитан.'''

    gs_tokens:
      # Ключ для подписи токена сервисного пользователя
      # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
      service_private_key: 'security/service_private_key.pem'

      # Ключ для подписи токена пользователя под которым идет регистрация учетных данных
      # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
      register_private_key: 'security/register_private_key.pem'

      # Ключ для подписи простых пользователей.
      # Должен распологаться в каталоге gs-authproxy/mail_gate_pass/security
      user_private_key: 'security/user_private_key.pem'
      # имя сервисного пользователя
      service_user_name: 'admin'
      # имя пользователя под которым идет регистрация учетных данных.
      register_user_name: 'admin'

    # Используется для указания доверенных источников запросов, которые могут обходить защиту от атак CSRF.
    # В неё нужно прописывать домены или IP-адреса, с которых разрешены такие запросы.
    csrf:
      domain: 'http://127.0.0.1'

    # Укажите путь, по которому куки будут доступны
    cookie:
      path: 'PGDEV'

    # Укажите путь для хранения логов
    log:
      path: /tmp/gs-authproxy-error.log

    # Укажите время жизни кода подтверждения в секундах.
    verification_code:
      time: 300

    # Тихий режим. При включении не запрашивает место для хранения ключа от паролей, использует значение по-умолчанию.
    # Нужен для работы в режиме CI/CD. Допустимые значения: True / False. По-умолчанию приватный ключ хранится в ~/.gs-authproxy.priv
    silent_mode:
      enabled: {{ silent_mode_enabled }}

    # Данные организации. Для замены логотипа и favicon. Замените соответствующие файлы в директории "mail_gate_pass/static_dev/img"
    organization:
      name: "Бизнес Технологии"
      phone_number: '+7 (777) 77-78-90'
      email: 'support@gmail.com'
      background_color: '#33a93d'
      url: 'https://global-system.ru/'

Примечание

Не включайте режим debug: на актуальной версии он не работает, так как неправильно перенаправляет на карточку регистрации (начиная с btk 1.0.734 открытие карточки регистрации возможно только по ссылке, сгенерированной сервером, в режиме отладки серевер авторизации пересылает по статичной ссылке).

Задайте пароли для базы данных, секретного ключа Django и почтового сервера. Для этого перейдите в каталог `gs-authproxy` и выполните скрипт `set_credentials.sh`

./set_credentials.sh set –url your_url –user your_user –password your_password`

- для БД:

  - в качестве параметра `--url` используйте имя БД, которое вы указали в файле с конфигурациями проекта.

  - для параметра `--user` имя пользователя, которое вы использовали при создании БД.

  - для параметра `--password` пароль от БД, который вы использовали при создании БД.

- для секретного ключа Django:

  - в качестве параметра `--url` используйте django:url, который вы указали в файле с конфигурациями проекта.

  - для параметра `--user` «django».

  - для параметра `--password` можно использовать любой достаточно длинный случайный набор символов.

- для сервера почты:

  - в качестве параметра `--url` используйте email_host, который вы указали в файле с конфигурациями проекта.

  - для параметра `--user` имя пользователя (адрес электронной почты) для аутентификации на SMTP-сервере

  - для параметра `--password` пароль для аутентификации на SMTP-сервере````

Затем инициализируйте БД и соберите статические файлы. Перейдите в директорию gs-authproxy и активируйте виртуальное окружение, затем выполните команды.

    cd mail_gate_pass
    python manage.py migrate
    python manage.py collectstatic

### Настройка Apache2

Заполните шаблон `001-mail_gate.conf` из `deploy/templates` и поместите файл в директорию `/etc/apache2/sites-available/`:

- Укажите адрес и порт прослушивания (Virtual Host)

- Укажите доменное имя сервера или IP-адрес (ServerName)

- В директивах DocumentRoot, WSGIDaemonProcess, WSGIScriptAlias, Directory, Alias поправьте пути так, чтобы они вели на соответсвующие файлы и папки из репозитория.

#### Пример заполненного Apache2

    # Укажите полные пути в соответствии с вашим проектом.
    <VirtualHost *:8000>
        # Устанавливает основное имя сервера для данного виртуального хоста. Здесь указан IP-адрес сервера, можно указать доменное имя.
        ServerName 192.168.24.89:9000
        # Задает каталог, в котором располагаются файлы, обслуживаемые этим виртуальным хостом (каталог проекта).
        DocumentRoot /opt/gs-ap/mail_gate_pass

        # Определяет процесс WSGI, используемый для обработки запросов к Python-приложению.
        # project1 - имя процесса.
        # python-home - путь к виртуальной среде Python.
        # python-path - путь к каталогу Django приложения.
        WSGIDaemonProcess project1 python-home=/opt/gs-ap/venv python-path=/opt/gs-ap/mail_gate_pass
        WSGIProcessGroup project1
        # путь к wsgi файлу Django приложения
        WSGIScriptAlias / /opt/gs-ap/mail_gate_pass/mail_gate_pass/wsgi.py

        #Определяет каталог на файловой системе и его настройки доступа. Устанавливает правила доступа к файлу с именем wsgi.py и разрешает доступ.
        <Directory /opt/gs-ap/mail_gate_pass/mail_gate_pass>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        # Создает псевдоним URL для статических файлов и определяет каталог в системе где хранятся статические файлы и настройки доступа.
        Alias /gs-authproxy/static /opt/gs-ap/mail_gate_pass/static
        <Directory /opt/gs-ap/mail_gate_pass/static>
           Require all granted
        </Directory>

        # Создает псевдоним URL для медиа файлов и определяет каталог в системе где хранятся медиа файлы и настройки доступа.
        Alias /gs-authproxy/media /opt/gs-ap/mail_gate_pass/media
        <Directory /opt/gs-ap/mail_gate_pass/media>
            Require all granted
        </Directory>

        # Устанавливает файл, куда будут записываться сообщения об ошибках сервера.
        ErrorLog /var/log/mail_gate_pass-error.log
        # Устанавливает файл, куда будут записываться запросы к серверу.
        CustomLog /var/log/mail_gate_pass-access.log combined
    </VirtualHost>

Включите сайт:

    sudo a2ensite 001-mail_gate.conf

Перезапустите Apache:

    sudo systemctl restart apache2

### Настройка HAProxy

Заполните шаблон `haproxy.cfg` из `deploy/templates` и поместите файл в директорию `/etc/haproxy/haproxy.cfg`:

- Укажите адрес и порт прослушивания (директива bind в секции http-in)

- Укажите адрес доступа к Apache (директива server в секции gs_authproxy_server)

- Укажите адрес доступа к Global Server (директива server в секции globalservers)

Пример заполненного haproxy.cfg

    # определяет, что это для обработки входящих HTTP запросов
    frontend http-in
        mode http
        # указывает HaProxy, какие адреса и порты прослушивать
        bind :80
        option forwardfor
        # создает условие, проверяющее, является ли запрос корнем ("/").
        acl is_root path -m str /
        # создает условие, проверяющее, начинается ли путь запроса с "/gs-authproxy".
        acl is_gs_authproxy path_beg /gs-authproxy
        # указывает HaProxy использовать бэкенд gs_authproxy_servers для запросов, удовлетворяющих условию.
        use_backend gs_authproxy_servers if is_gs_authproxy || is_root
        # определяет бэкенд по умолчанию для всех остальных запросов.
        use_backend globalservers unless is_gs_authproxy || is_root

    # определяет бэкенд для обработки запросов с префиксом "/gs-authproxy".
    backend gs_authproxy_servers
        mode http
        #определяет Django сервер.
        server django_server 127.0.0.1:8000

    #определяет бэкенд для всех остальных запросов.
    backend globalservers
        mode http
        # добавляет заголовок X-Forwarded-Port
        http-request set-header X-Forwarded-Port %[dst_port]
        # определяет  globalserver.
        server globalserver 127.0.0.1:8080

Пример конфигурации haproxy.cfg с использованием https

    frontend http-in
        mode http
        # указывает HaProxy, какие адреса и порты прослушивать
        bind :443 ssl crt /etc/haproxy/certs/cert.pem # путь до ssl-сертификата
        http-request add-header X-Forwarded-Proto https if { ssl_fc }
        option forwardfor
        # создает условие, проверяющее, является ли запрос корнем ("/").
        acl is_root path -m str /
        # создает условие, проверяющее, начинается ли путь запроса с "/gs-authproxy".
        acl is_gs_authproxy path_beg /gs-authproxy
        # указывает HaProxy использовать бэкенд gs_authproxy_servers для запросов, удовлетворяющих условию.
        use_backend gs_authproxy_servers if is_gs_authproxy || is_root
        # определяет бэкенд по умолчанию для всех остальных запросов.
        use_backend globalservers unless is_gs_authproxy || is_root

    # определяет бэкенд для обработки запросов с префиксом "/gs-authproxy".
    backend gs_authproxy_servers
        mode http
        #определяет Django сервер.
        server django_server 127.0.0.1:8000

    #определяет бэкенд для всех остальных запросов.
    backend globalservers
        mode http
        # добавляет заголовок X-Forwarded-Port
        http-request set-header X-Forwarded-Port %[dst_port]
        # определяет  globalserver.
        server globalserver 127.0.0.1:8080

Перезапустите сервис haproxy:

    sudo systemctl restart haproxy

## Обновление

### Подготовка

Скачайте релиз и поместите его в рабочий каталог проекта:

`gs-authproxy/workspace/`

### Запуск обновления

Для выполнения обновления запустите скрипт:

    ./update.sh

Скрипт выполнит все необходимые операции по обновлению файлов.

### Резервное копирование

Во время обновления создаётся резервная копия текущей версии проекта в директории:

`../backups/` (на уровень выше каталога gs-authproxy)

При необходимости вы можете восстановить предыдущую версию из этой резервной копии вручную. Для этого перейдите в каталог с резервными копиями и распакуйте необходимую вам:

    cd ~/backups/
    tar -xzf backup_20250725_142846.tar.gz -C ./extracted_files

Перед извлечением убедитесь что каталог extracted_files существует.