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

Описание элементов:
Пользователи — компьютеры, смартфоны, планшеты.
HAProxy — принимает входящие запросы и перенаправляет их либо на сервер авторизации, либо на Global ERP.
Сервер авторизации:
Django + Apache.
Принимает запросы от пользователя и отправляет их на Global ERP.
Если успешно, генерирует JWT токен.
Перенаправление — HAProxy направляет пользователя с токеном на Global ERP.
Global ERP(SRM):
Проверяет JWT токен.
Дает доступ к функционалу.
Подготовка#
Для работы прокси необходимо следующее ПО:
Debian 11+ (или новее) (с настроенным sudo)
Global Server
Apache HTTP Server в качестве web-сервера для сервера авторизации
HAProxy в качестве форвард-прокси (и, если требуется, распределителя нагрузки) для сервера приложений и сервера авторизации. Возможно заменить на nginx
PostgreSQL для хранения сессионной информации.
Global Server установите в соответствии с документацией
Установите пакеты:
sudo apt install apache2 libapache2-mod-wsgi-py3
sudo a2enmod wsgi
sudo apt install haproxy
sudo apt install postgresql
В файле /etc/apache2/ports.conf измените директиву Listen 80 на Listen 8000, или укажите другой порт.
Создайте PostgreSQL базу данных:
sudo -u postgres psql
Внутри открывшейся консоли:
create role "<userName>" with login nosuperuser nocreatedb nocreaterole inherit noreplication connection limit -1 password '<UserPassword>';
create database authproxy;
grant all privileges on database authproxy to worker;
Для выхода из консоли введите \q
Развертывание и конфигурация#
Скачайте архив дистрибутива с предоставленного ресурса (Предоставляется через контактное лицо, файл 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 ~/gs-authproxy/bin/*
Перейдите в каталог с проектом gs-authproxy и установите нужные серверу авторизации пакеты и настройте окружение:
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
Добавьте необходимые конфигурационные файлы:
файл с конфигурацией проекта
иконка для вкладки в браузере
логотип на странице входа
по желанию можете добавить каталог с кастомными html шаблонами
Инструкцию по работе с шаблонами можно посмотреть в разделе Работа с кастомными шаблонами
Структура каталога должны быть следующей:
gs-ap-config/
├── static/
│ ├── img/
│ │ ├── logos/
│ │ │ └── customer.svg - логотип на странице входа
│ │ └── icons/
│ │ └── favicon.svg - иконка для вкладки в браузере
├── templates/ - каталог с кастомными шаблонами (имя каталога с шаблонами указывается в yml файле конфигурации)
└── config.yml - файл с конфигурацией проекта
Важно
Система рассчитана на работу только с такой структурой директории Вы можете скопировать структуру из deploy/templates/gs-ap-config
Cконфигурируйте проект
В созданной директории заполните файл с конфигурациями проектаconfig.ymlв соответствии с требования вашего проекта:подключения к БД установленной в прошлых шагах
почтовый сервер
настройки Django
пути приватных ключей
имена для генерации токена
url на который будет отправляться запросы
путь к файлу с логами
сведения об организации
время жизни кода подтверждения
путь для доступа к cookie
включение тихого режима (True/False)
информация о компании
Для корректной работы системы с вашим файлом конфигурации и пользовательскими шаблонами необходимо задать переменную окружения APPROFILEPATH, указав в ней путь к директории с конфигурацией.
Это также требуется для применения пользовательского логотипа и favicon.
По умолчанию данная переменная задаётся в конфигурации Apache.
Пример заполненного 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'
# название базы данных GS
database_name: PGDEV
# url на который будет отправляться пользователь для аутентификации
authorize_url: '/PGDEV/?forceconnect=1'
# url который используется в режиме разработки для регистрации пользователя
debug_register_url: '/PGDEV/Bs_RegOrgMainMenu/gtk-ru.bitec.app.bs.organization.Bs_Organization%23CardForRegOrganization/?forceconnect=1'
email:
# скрывает информацию о том, существует ли введённый email в системе.
# при включении этой настройки пользователю всегда будет показываться нейтральное сообщение:
hide: False
# количество отправляемых писем за лимит времени
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/'
Задайте пароли для базы данных, секретного ключа 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 и активируйте виртуальное окружение (source venv/bin/activate), затем выполните команды.
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:8000
# Задает каталог, в котором располагаются файлы, обслуживаемые этим виртуальным хостом (каталог проекта).
DocumentRoot {{ gs_authproxy_path }}/mail_gate_pass
# Переменная окружения которая указывает на путь к каталогу с настройками пользователя
SetEnv APPROFILEPATH /opt/global/gs-ap-config
# Определяет процесс WSGI, используемый для обработки запросов к Python-приложению.
# project1 - имя процесса.
# python-home - путь к виртуальной среде Python.
# python-path - путь к каталогу Django приложения.
WSGIDaemonProcess project1 python-home={{ gs_authproxy_path }}/venv python-path={{ gs_authproxy_path }}/mail_gate_pass
WSGIProcessGroup project1
# путь к wsgi файлу Django приложения
WSGIScriptAlias / {{ gs_authproxy_path }}/mail_gate_pass/wsgi.py
#Определяет каталог на файловой системе и его настройки доступа. Устанавливает правила доступа к файлу с именем wsgi.py и разрешает доступ.
<Directory {{ gs_authproxy_path }}/mail_gate_pass>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# Создает псевдоним URL для статических файлов и определяет каталог в системе где хранятся статические файлы и настройки доступа.
Alias /gs-authproxy/static {{ gs_authproxy_path }}/static
<Directory {{ gs_authproxy_path }}/static>
Require all granted
</Directory>
# Создает псевдоним URL для медиа файлов и определяет каталог в системе где хранятся медиа файлы и настройки доступа.
Alias /gs-authproxy/media /{{ gs_authproxy_path }}/media
<Directory {{ gs_authproxy_path }}/media>
Require all granted
</Directory>
# Устанавливает файл, куда будут записываться сообщения об ошибках сервера.
ErrorLog /var/log/apache2/mail_gate_pass-error.log
# Устанавливает файл, куда будут записываться запросы к серверу.
CustomLog /var/log/apache2/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 существует.
Работа с кастомными шаблонами#
Кастомные шаблоны позволяют адаптировать внешний вид и содержимое интерфейсов под требования пользователя: изменить тексты, цвета, стили и оформление.
Для использования кастомных шаблонов необходимо:
Создать каталог для хранения шаблонов по пути: /opt/global/gs-ap-config
Имя каталога должно совпадать с именем, указанным в конфигурационном файле:
django:
template_path: <имя_каталога>.
Если кастомные шаблоны отсутствуют, система будет использовать шаблоны по умолчанию, расположенные в каталоге:
mail_gate_pass/templates
Структура каталогов, имена файлов и количество шаблонов в кастомной директории должны полностью совпадать с шаблонами по умолчанию.
Например, если в шаблонах по умолчанию содержится 5 файлов, то в кастомных шаблонах также должно быть 5 файлов с аналогичными именами и структурой.
Пример структуры:#
Шаблоны по умолчанию:#
mail_gate_pass/templates/
user_auth
├── user_auth
│ ├── index.html
│ ├── email_verification_confirm.html.html
└── base.html.html
Кастомные шаблоны:#
/opt/global/gs-ap-config/templates/
user_auth
├── user_auth
│ ├── index.html
│ ├── email_verification_confirm.html.html
└── base.html.html
При редактировании шаблонов запрещено:
изменять имена переменных ({{ variable }})
изменять или удалять служебные конструкции ({% … %})
менять структуру шаблонов (если это влияет на их логику)
Нарушение этих правил может привести к некорректной работе системы.