Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Описание


В состав SoftWLC включен WEB-портал, с помощью которого реализуется модель авторизации hotspot-клиентов. Неизвестный системе пользователь может свободно (без получения заранее логина и пароля) подключиться к точке доступа, но при попытке выйти в интернет через браузер пользователь перенаправляется на страницу WEB-портала, на которой может по выбору пройти процедуру авторизации или получения данных для авторизации (например, с помощью SMS). В процессе выполнения процедуры авторизации абонент может наблюдать рекламные сообщения в виде баннеров, кастомизированных в соответствии с требованиями оператора.

Данный сервис используется для отображения страниц виртуальных порталов и проведения регистрации и авторизации пользователей Wi-Fi, подключающихся к точкам доступа Eltex или при помощи ESR/BRAS.

Во время инициализации сервиса eltex-portal и до полной его загрузки,  вместо портала будет отображаться страница "Warming up", что свидетельствует о том, что портал еще в процессе инициализации, а модули сервиса находятся в процессе конфигурации. После того как сервис eltex-portal полностью загрузился, будет произведен автоматический редирект пользователя на главную страницу портала.
Пример страницы инициализации портала:

Управление сервисом


Установка сервиса

apt-get install eltex-portal


Сбособы запуска/остановки сервиса

ДействиеКомандаОтвет
Проверка состояния
service eltex-portal status

Сервис работает

eltex-portal start/running, process <pid>

Сервис не работает

eltex-portal stop/waiting
Запуск сервиса
service eltex-portal start

Сервис успешно запущен

eltex-portal start/running, process <pid>

Сервис уже работает

start: Job is already running: eltex-portal
Остановка сервиса
service eltex-portal stop

Сервис успешно остановлен

eltex-portal stop/waiting

Сервис не остановлен, т.к. не был запущен

stop: Unknown instance: 
Перезапуск сервиса
service eltex-portal restart

Сервис успешно перезапущен

eltex-portal stop/waiting
eltex-portal start/running, process <pid>
stop: Unknown instance: 
eltex-portal start/running, process <pid>


Создание пользователя в БД MySQL

Чтобы сервис eltex-portal получил доступ для работы с БД MySQL необходимо создать пользователя.

eltex-potal create-db-user -h <server_ip>

При выполнении данной команды происходит подключение к БД и создание пользователя указанного в настройка конфигурационного файла /etc/eltex-portal-constructor/application.conf



Конфигурация


/etc/eltex-portal/application.conf

Cодержит основные настройки сервиса:

Пример дефолтной конфигурации
portal {
    defaultRedirectUrl = "http://eltex-co.ru"
	
	# If set to 'true', an authentication URL will be shortened when proxy-server detected
    shortenAuthUrlOnProxy = true

    scheduler {
        tariffCheckerPeriod = 1d
        promoBindingsCleaner {
            period = 1d
            bindingsLifetime = 5d
        }
        paymentsCleanerPeriod = "0 0 * * * ?"
    }
}

jetty {
	http.port = 9000
    https {
        port = 9443
        keystorePass = 12345
        keystoreFile = /etc/eltex-portal/localhost.pfx
        keystoreType = PKCS12
        keyAlias = 1
        ciphers = [
            TLS_RSA_WITH_AES_128_CBC_SHA256
            TLS_RSA_WITH_AES_128_CBC_SHA
            TLS_RSA_WITH_AES_256_CBC_SHA256
            TLS_RSA_WITH_AES_256_CBC_SHA
        ]
    }
}

database {
    host = localhost
    port = 3306
    name = ELTEX_PORTAL
    user = javauser
    password = javapassword

    pool {
        # Time to wait for a connection
        connectionTimeout = 10s
        # Time to wait for connection validation
        validationTimeout = 3s

        min = 1
        max = 10
    }

    cache {
        # Limit of cached simple entries count (for each query type)
        maxEntries = 1000
        # Limit of total cached portal resources size
        maxResourceBytes = 32m
        # Maximum time to retain items in the cache
        expireTime = 2m
    }
}
 
    jdbc {
        properties {
            useSSL = false
        }
    }
}
 
// JWT validation. You need a key from Eltex Doors.
// Or you could generate it yourself.
validation {
   public_key = "etc/eltex-doors/keys/public.pem"
}


ПараметрыОписание
portal

defaultRedirectUrl

Адрес, на который будет выполнено перенаправление пользователя, в случае необходимости перезапуска его сессии на портале. Должен быть настроен по протоколу http.

tariffCheckerPeriod

Интервал выполнения проверки наличия тарифных планов на порталах. В случае отсутствия тарифного плана: формируется сообщение об ошибке.
promoBindingsCleaner

period - настройка периода проверки привязок, показанных баннеров клиенту. Указывается в минутах/часах/днях m/h/d

bindingsLifetime - время жизни привязки, показанного баннера клиенту. Указывается в минутах/часах/днях m/h/d

paymentsCleanerPeriodПериод очистки записей о неуспешной оплате тарифа в БД портала. Указывается в формате cron.
jetty
https

Настройки работы контейнера по https. Необходимо указать расположение сертификата, ключ и прослушиваемый порт.

port - прослушиваемый порт

keystorePass - ключ от хранилища сертификатов

keystoreFile - файл хранилища, содержащий сертификат

keystoreType - тип хранилища

certAlias - алиас сертификата в хранилище

ciphers - поддерживаемые методы шифрования

database
hostАдрес сервера БД
portПорт, на который сервер БД принимает входящее подключение
nameНазвание БД
userИмя пользователя БД
passwordПароль пользователя БД
pool

Управление соединениями к БД

connectionTimeout - Время жизни коннекта при бездействии

validationTimeout - интервал проверки бездействующих коннектов

min - минимальное количество коннектов

max - максимальное количество коннектов

cache

Настройки кэширования

maxEntries - максимальное количество элементов в кэше

maxResourceBytes - размер кэша

expireTime - время хранения данных в кэше

jdbc

Дополнительные настройки подключения к БД

useSSL - включить/выключить SSL

validation

Подключение к сервису eltex-doors

public_key - путь до ключа для валидации JWT



/etc/default/eltex-portal

Cодержит параметры, необходимые для инициализации сервиса.

Пример дефолтной конфигурации
# Eltex-Portal daemon parameters

# Port for use by Eltex Portal
PORT=9000

# Initial size of Java heap
JAVA_INIT_HEAP=16m
# Maximum size of Java heap
JAVA_MAX_HEAP=256m

# Additional arguments to pass to java
JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/eltex-portal"
ПараметрыОписание
PORT
Порт, на который сервис будет принимать соединения
JAVA_INIT_HEAP
Количество памяти, выделяемое на работу сервиса при старте. Рекомендуется выставлять равное JAVA_MAX_HEAP.
JAVA_MAX_HEAP
Максимальное количество памяти, которое может зарезервировать сервис
JAVA_OPTS
Дополнительные опции для запуска jvm

/etc/eltex-portal/log4j2.xml

Содержит настройки логирования работы сервиса.

Пример дефолтной конфигурации
<?xml version="1.0" encoding="UTF-8"?>

<Configuration monitorInterval="10">

    <Properties>
        <Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</Property>

        <Property name="baseDir">/var/log/eltex-portal</Property>
        <Property name="maxFileSize">20 MB</Property>
        <Property name="accumulatedFileSize">10 GB</Property>
        <Property name="lastModified">4d</Property>
        <Property name="maxCount">20</Property>
        <Property name="logPattern">%d{ISO8601} [%t] %-5p %logger{12} %C{1}.%M(line:%L). %m%n</Property>
        <Property name="dateSuffix">%d{yyyyMMdd}</Property>

        <Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property>
        <Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property>
        <Property name="gelfPort">${env:GELF_PORT:-12201}</Property>
    </Properties>

    <Appenders>

        <Console name="STDERR" target="System.err">
            <PatternLayout pattern="${logPattern}"/>
        </Console>

        <RollingFile name="RollingFile"
                     fileName="${baseDir}/portal.log"
                     filePattern="${baseDir}/log/portal-%i.log.gz">
            <PatternLayout pattern="${logPattern}"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="${maxFileSize}"/>
                <OnStartupTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/portal-*.log.gz">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AccessRollingFile"
                     fileName="${baseDir}/access.log"
                     filePattern="${baseDir}/access/access_${dateSuffix}.log">
            <PatternLayout pattern="%m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/access_*.log">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="AuthRollingFile"
                     fileName="${baseDir}/auth.log"
                     filePattern="${baseDir}/auth/auth_${dateSuffix}.log">
            <PatternLayout pattern="%d{ISO8601} %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="${maxCount}">
                <Delete basePath="${baseDir}" maxDepth="3">
                    <IfFileName glob="*/auth_*.log">
                        <IfAny>
                            <IfAccumulatedFileSize exceeds="${accumulatedFileSize}"/>
                            <IfLastModified age="${lastModified}"/>
                        </IfAny>
                    </IfFileName>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>

        <Gelf name="Gelf" host="${gelfHost}" port="${gelfPort}" version="1.1" facility="eltex-portal"
              extractStackTrace="true" originHost="%host{fqdn}" maximumMessageSize="8192" >
            <Field name="thread" pattern="%t"/>
            <Field name="level" pattern="%level"/>
            <Field name="severity" pattern="%-5level"/>
            <Field name="logger" pattern="%logger{12}"/>
            <Field name="location" pattern="%C{1}.%M(line:%L)"/>
        </Gelf>

    </Appenders>

    <Loggers>
        <Root level="${rootLevel}">
            <AppenderRef ref="RollingFile"/>
            <AppenderRef ref="STDERR" level="OFF"/>
            <AppenderRef ref="Gelf" level="${gelfLevel}"/>
        </Root>

        <Logger name="AccessLogger" additivity="false">
            <AppenderRef ref="AccessRollingFile"/>

            <!--"custom" for custom format with BRAS parameters and AP headers-->
            <!--"default" for NCSA format-->
            <Property name="format">default</Property>

            <!--Customizable parts of the access log-->
            <Property name="cookies">true</Property>
            <Property name="headers">true</Property>
            <Property name="bras">true</Property>
        </Logger>

        <Logger name="AuthLogger" additivity="false" level="INFO">
            <AppenderRef ref="AuthRollingFile"/>
            <AppenderRef ref="Gelf" level="${gelfLevel}"/>
        </Logger>

        <Logger name="org.springframework" level="ERROR"/>
        <Logger name="org.eclipse.jetty"   level="ERROR"/>
        <Logger name="org.apache.tomcat"   level="ERROR"/>
        <logger name="io.grpc.netty"       level="ERROR"/>
        <Logger name="io.netty"            level="ERROR"/>

        <!--SQL logging-->
        <Logger name="org.jooq.tools.LoggerListener" level="OFF"/>

        <Logger name="jndi"       level="OFF"/>
        <Logger name="org.quartz" level="OFF"/>
        <Logger name="com.zaxxer" level="OFF"/>
        <Logger name="org.apache" level="OFF"/>
        <Logger name="org.jooq.impl.DefaultConnectionProvider" level="OFF"/>

    </Loggers>

</Configuration>


  • Интервал автоматического перечитывания конфигурации логгера:
<Configuration monitorInterval="10">
  • Уровень логирования:
<Property name="rootLevel">${env:LOG_LEVEL:-ERROR}</Property>
  • Базовая директория хранения логов:
 <Property name="baseDir">/var/log/eltex-portal</Property>
  • Максимально допустимый размер файла (при его превышении создается новый файл. а старый архивируется):
<Property name="maxFileSize">20 MB</Property>
  • Суммарный размер логов (текущий файл + архивные). При его превышении наиболее старые файлы будут удаляться:
<Property name="accumulatedFileSize">10 GB</Property>
  • Срок хранения логов, файлы модифицированные раннее этого срока будут удаляться:
<Property name="lastModified">4d</Property>
  • Максимальное количество архивных файлов, при его превышении наиболее старые файлы будут перезаписываться:
<Property name="maxCount">20</Property>
  • Блок настройки перенаправления логов в Graylog (уровень логирования, адрес, порт):
<Property name="gelfLevel">${env:GELF_LEVEL:-OFF}</Property>
<Property name="gelfHost">${env:GELF_HOST:-udp:lab3-test.eltex.loc}</Property>
<Property name="gelfPort">${env:GELF_PORT:-12201}</Property>


Описание ошибок в логах


Лог-файл: /var/log/eltex-portal/log_ep.txt 

НазваниеЗначениеПример
CHECK LOGIN AND PSW IN smsc_gate.confПроблема доступности NGW к сервису отправки SMS сообщений2018-08-22T09:38:56,420 [SimpleContainerScope.Executor@266376052-35] ERROR org.eltex.portal.sms.SendSmsWithPswResponseHandler SendSmsWithPswResponseHandler.onResult(line:53). Error while sending message on number: 79529056800. ErrorCode: 10, errMessage: 79529056800. Received error code = 1. CHECK LOGIN AND PSW IN smsc_gate.conf. Error in the parameters of function of dispatch sms via http protocol
NGW_NOT_AVAILABLEПроблема доступности портала к сервису NGW2020-07-09T09:45:07,827 [qtp76432244-17] ERROR org.eltex.portal.sms.NotificationClient NotificationClient.getConfigurationInfo(line:527). Can`t connect to Ngw server with code: 1601 code 1601:NGW_NOT_AVAILABLE and reason: NgwException{FAILED: 'Protocol is not supported by the server: eltex-ngw-api#1.16.5'}

Мониторинг

Для мониторинга сервиса APB поддержаны совместимые с Prometheus метрики. Для просмотра списка метрик надо открыть в браузере:

http://<адрес сервера Eltex-portal>:9000/eltex_portal/api/metrics
Пример вывода метрик
# HELP hikaricp_connections_active Active connections
# TYPE hikaricp_connections_active gauge
hikaricp_connections_active{application="Portal",pool="HikariPool-1",} 0.0
# HELP portal_authentication_started_total User authentication process started, by verification way
# TYPE portal_authentication_started_total counter
portal_authentication_started_total{application="Portal",verification_way="INBOUND_SMS",} 0.0
portal_authentication_started_total{application="Portal",verification_way="DEMO",} 5.0
portal_authentication_started_total{application="Portal",verification_way="PMS",} 3.0
portal_authentication_started_total{application="Portal",verification_way="ESIA",} 1.0
portal_authentication_started_total{application="Portal",verification_way="INBOUND_CALL",} 3.0
portal_authentication_started_total{application="Portal",verification_way="OUTBOUND_SMS",} 2.0
portal_authentication_started_total{application="Portal",verification_way="PASSWORD",} 1.0
portal_authentication_started_total{application="Portal",verification_way="FAN_ID",} 0.0
portal_authentication_started_total{application="Portal",verification_way="OUTBOUND_CALL",} 1.0
portal_authentication_started_total{application="Portal",verification_way="SATS",} 0.0
# HELP smart_service_response_total Counter of user that authorized in SMART application with http status 200 OK
# TYPE smart_service_response_total counter
smart_service_response_total{application="Portal",status="AUTHORIZED",} 0.0
smart_service_response_total{application="Portal",status="UNKNOWN",} 0.0
# HELP process_files_max_files The maximum file descriptor count
# TYPE process_files_max_files gauge
process_files_max_files{application="Portal",} 1048576.0
# HELP hikaricp_connections_usage_seconds Connection usage time
# TYPE hikaricp_connections_usage_seconds summary
hikaricp_connections_usage_seconds_count{application="Portal",pool="HikariPool-1",} 813.0
hikaricp_connections_usage_seconds_sum{application="Portal",pool="HikariPool-1",} 14.36
# HELP hikaricp_connections_usage_seconds_max Connection usage time
# TYPE hikaricp_connections_usage_seconds_max gauge
hikaricp_connections_usage_seconds_max{application="Portal",pool="HikariPool-1",} 0.0
# HELP spar_rest_template_seconds Timer of RestTemplate operation. Statistic expiry 5 m.
# TYPE spar_rest_template_seconds summary
spar_rest_template_seconds{application="Portal",method="POST",quantile="0.25",} 0.0
spar_rest_template_seconds{application="Portal",method="POST",quantile="0.5",} 0.0
spar_rest_template_seconds{application="Portal",method="POST",quantile="0.75",} 0.0
spar_rest_template_seconds{application="Portal",method="POST",quantile="0.95",} 0.0
spar_rest_template_seconds{application="Portal",method="POST",quantile="0.99",} 0.0
spar_rest_template_seconds_count{application="Portal",method="POST",} 1.0
spar_rest_template_seconds_sum{application="Portal",method="POST",} 0.583106492
# HELP spar_rest_template_seconds_max Timer of RestTemplate operation. Statistic expiry 5 m.
# TYPE spar_rest_template_seconds_max gauge
spar_rest_template_seconds_max{application="Portal",method="POST",} 0.583106492
# HELP spar_service_response_total Counter of user that authorized in SPAR application with http status 200 OK
# TYPE spar_service_response_total counter
spar_service_response_total{application="Portal",status="AUTHORIZED",} 0.0
spar_service_response_total{application="Portal",status="UNKNOWN",} 1.0
# HELP system_load_average_1m The sum of the number of runnable entities queued to available processors and the number of runnable entities running on the available processors averaged over a period of time
# TYPE system_load_average_1m gauge
system_load_average_1m{application="Portal",} 0.470703125
# HELP process_uptime_seconds The uptime of the Java virtual machine
# TYPE process_uptime_seconds gauge
process_uptime_seconds{application="Portal",} 182269.174
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{application="Portal",area="nonheap",id="Compressed Class Space",} 1.9394696E7
jvm_memory_used_bytes{application="Portal",area="nonheap",id="Code Cache",} 6.0316288E7
jvm_memory_used_bytes{application="Portal",area="nonheap",id="Metaspace",} 1.42699256E8
jvm_memory_used_bytes{application="Portal",area="heap",id="G1 Old Gen",} 1.31924072E8
jvm_memory_used_bytes{application="Portal",area="heap",id="G1 Eden Space",} 1.42606336E8
jvm_memory_used_bytes{application="Portal",area="heap",id="G1 Survivor Space",} 5242880.0
# HELP hikaricp_connections_creation_seconds_max Connection creation time
# TYPE hikaricp_connections_creation_seconds_max gauge
hikaricp_connections_creation_seconds_max{application="Portal",pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_creation_seconds Connection creation time
# TYPE hikaricp_connections_creation_seconds summary
hikaricp_connections_creation_seconds_count{application="Portal",pool="HikariPool-1",} 211.0
hikaricp_connections_creation_seconds_sum{application="Portal",pool="HikariPool-1",} 221.242
# HELP portal_authentication_success_total User successfully authenticated, by verification way
# TYPE portal_authentication_success_total counter
portal_authentication_success_total{application="Portal",verification_way="INBOUND_SMS",} 0.0
portal_authentication_success_total{application="Portal",verification_way="DEMO",} 5.0
portal_authentication_success_total{application="Portal",verification_way="PMS",} 1.0
portal_authentication_success_total{application="Portal",verification_way="ESIA",} 0.0
portal_authentication_success_total{application="Portal",verification_way="INBOUND_CALL",} 2.0
portal_authentication_success_total{application="Portal",verification_way="OUTBOUND_SMS",} 2.0
portal_authentication_success_total{application="Portal",verification_way="PASSWORD",} 1.0
portal_authentication_success_total{application="Portal",verification_way="FAN_ID",} 0.0
portal_authentication_success_total{application="Portal",verification_way="OUTBOUND_CALL",} 1.0
portal_authentication_success_total{application="Portal",verification_way="SATS",} 0.0
# HELP portal_authorization_completed_total User authorized, by result status
# TYPE portal_authorization_completed_total counter
portal_authorization_completed_total{application="Portal",status="success",} 13.0
portal_authorization_completed_total{application="Portal",status="failed",} 0.0
# HELP hikaricp_connections_timeout_total Connection timeout total count
# TYPE hikaricp_connections_timeout_total counter
hikaricp_connections_timeout_total{application="Portal",pool="HikariPool-1",} 1.0
# HELP process_cpu_usage The "recent cpu usage" for the Java Virtual Machine process
# TYPE process_cpu_usage gauge
process_cpu_usage{application="Portal",} 0.0035629453681710215
# HELP portal_registration_process_total User registration process started
# TYPE portal_registration_process_total counter
portal_registration_process_total{application="Portal",} 11.0
# HELP process_start_time_seconds Start time of the process since unix epoch.
# TYPE process_start_time_seconds gauge
process_start_time_seconds{application="Portal",} 1.65588132082E9
# HELP hikaricp_connections_idle Idle connections
# TYPE hikaricp_connections_idle gauge
hikaricp_connections_idle{application="Portal",pool="HikariPool-1",} 1.0
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool
# TYPE jvm_buffer_total_capacity_bytes gauge
jvm_buffer_total_capacity_bytes{application="Portal",id="direct",} 791588.0
jvm_buffer_total_capacity_bytes{application="Portal",id="mapped",} 0.0
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytes{application="Portal",area="nonheap",id="Compressed Class Space",} 2.0250624E7
jvm_memory_committed_bytes{application="Portal",area="nonheap",id="Code Cache",} 6.0751872E7
jvm_memory_committed_bytes{application="Portal",area="nonheap",id="Metaspace",} 1.47390464E8
jvm_memory_committed_bytes{application="Portal",area="heap",id="G1 Old Gen",} 1.98180864E8
jvm_memory_committed_bytes{application="Portal",area="heap",id="G1 Eden Space",} 3.33447168E8
jvm_memory_committed_bytes{application="Portal",area="heap",id="G1 Survivor Space",} 5242880.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{application="Portal",id="direct",} 60.0
jvm_buffer_count_buffers{application="Portal",id="mapped",} 0.0
# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool
# TYPE jvm_buffer_memory_used_bytes gauge
jvm_buffer_memory_used_bytes{application="Portal",id="direct",} 791589.0
jvm_buffer_memory_used_bytes{application="Portal",id="mapped",} 0.0
# HELP system_cpu_usage The "recent cpu usage" for the whole system
# TYPE system_cpu_usage gauge
system_cpu_usage{application="Portal",} 0.0855106888361045
# HELP jvm_threads_states_threads The current number of threads having NEW state
# TYPE jvm_threads_states_threads gauge
jvm_threads_states_threads{application="Portal",state="waiting",} 6.0
jvm_threads_states_threads{application="Portal",state="blocked",} 0.0
jvm_threads_states_threads{application="Portal",state="timed-waiting",} 21.0
jvm_threads_states_threads{application="Portal",state="runnable",} 9.0
jvm_threads_states_threads{application="Portal",state="terminated",} 0.0
jvm_threads_states_threads{application="Portal",state="new",} 0.0
# HELP process_files_open_files The open file descriptor count
# TYPE process_files_open_files gauge
process_files_open_files{application="Portal",} 63.0
# HELP spar_rest_template_total Counter of response status code
# TYPE spar_rest_template_total counter
spar_rest_template_total{application="Portal",status="200",} 1.0
# HELP hikaricp_connections_min Min connections
# TYPE hikaricp_connections_min gauge
hikaricp_connections_min{application="Portal",pool="HikariPool-1",} 1.0
# HELP jvm_threads_daemon_threads The current number of live daemon threads
# TYPE jvm_threads_daemon_threads gauge
jvm_threads_daemon_threads{application="Portal",} 18.0
# HELP hikaricp_connections_max Max connections
# TYPE hikaricp_connections_max gauge
hikaricp_connections_max{application="Portal",pool="HikariPool-1",} 10.0
# HELP jvm_threads_live_threads The current number of live threads including both daemon and non-daemon threads
# TYPE jvm_threads_live_threads gauge
jvm_threads_live_threads{application="Portal",} 36.0
# HELP cache_hitRate The cache hit rate
# TYPE cache_hitRate gauge
cache_hitRate{application="Portal",cache="cssCache",} 1.0
cache_hitRate{application="Portal",cache="satsMacCache",} 1.0
cache_hitRate{application="Portal",cache="accessListsCache",} 1.0
cache_hitRate{application="Portal",cache="incomingEventsCache",} 0.25
cache_hitRate{application="Portal",cache="internalRedirectCache",} 1.0
cache_hitRate{application="Portal",cache="chargeCache",} 1.0
cache_hitRate{application="Portal",cache="outgoingSmsCache",} 0.8666666666666667
cache_hitRate{application="Portal",cache="pcrfUserCache",} 0.4
cache_hitRate{application="Portal",cache="brasSessionStatusCache",} 0.75
cache_hitRate{application="Portal",cache="ssidCache",} 0.9384615384615385
cache_hitRate{application="Portal",cache="mercuryUserCache",} 0.48717948717948717
cache_hitRate{application="Portal",cache="authCache",} 0.7521865889212828
cache_hitRate{application="Portal",cache="brasSessionsCache",} 1.0
cache_hitRate{application="Portal",cache="preAuthCache",} 0.8333333333333334
cache_hitRate{application="Portal",cache="tariffsCache",} 0.7619047619047619
cache_hitRate{application="Portal",cache="attemptsCache",} 0.5
cache_hitRate{application="Portal",cache="domainTimezoneCache",} 0.9194630872483222
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management
# TYPE jvm_memory_max_bytes gauge
jvm_memory_max_bytes{application="Portal",area="nonheap",id="Compressed Class Space",} 1.073741824E9
jvm_memory_max_bytes{application="Portal",area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{application="Portal",area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{application="Portal",area="heap",id="G1 Old Gen",} 5.36870912E8
jvm_memory_max_bytes{application="Portal",area="heap",id="G1 Eden Space",} -1.0
jvm_memory_max_bytes{application="Portal",area="heap",id="G1 Survivor Space",} -1.0
# HELP jvm_threads_peak_threads The peak live thread count since the Java virtual machine started or peak was reset
# TYPE jvm_threads_peak_threads gauge
jvm_threads_peak_threads{application="Portal",} 47.0
# HELP hikaricp_connections_pending Pending threads
# TYPE hikaricp_connections_pending gauge
hikaricp_connections_pending{application="Portal",pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_acquire_seconds Connection acquire time
# TYPE hikaricp_connections_acquire_seconds summary
hikaricp_connections_acquire_seconds_count{application="Portal",pool="HikariPool-1",} 814.0
hikaricp_connections_acquire_seconds_sum{application="Portal",pool="HikariPool-1",} 11.156142703
# HELP hikaricp_connections_acquire_seconds_max Connection acquire time
# TYPE hikaricp_connections_acquire_seconds_max gauge
hikaricp_connections_acquire_seconds_max{application="Portal",pool="HikariPool-1",} 0.0
# HELP hikaricp_connections Total connections
# TYPE hikaricp_connections gauge
hikaricp_connections{application="Portal",pool="HikariPool-1",} 1.0
# HELP system_cpu_count The number of processors available to the Java virtual machine
# TYPE system_cpu_count gauge
system_cpu_count{application="Portal",} 2.0


Для запуска мониторинга со стороны Prometheus нужно добавить в его конфигурации:

  - job_name: 'portal-server'
    scrape_interval: 5s
    metrics_path: /eltex_portal/api/metrics

    static_configs:
      # external address of the Portal server
      - targets: [ '<адрес сервера Eltex-portal>:9000' ]


Grafana и Prometheus можно запустить в docker используя docker-compose.yml:

docker-compose.yml
version: '3'

services:
  portal-prometheus:
    image: prom/prometheus:v2.25.0
    volumes:
      - ./prometheus/:/etc/prometheus/
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    ports:
      - 9090:9090
    networks:
      - portal-monitoring

  portal-grafana:
    image: grafana/grafana:7.4.2
    volumes:
      - ./grafana/provisioning/:/etc/grafana/provisioning
    ports:
      - 3000:3000
    depends_on:
      - portal-prometheus
    networks:
      - portal-monitoring

networks:
  portal-monitoring:


docker-compose up

Докеризация сервиса


Сервис может быть запущен в docker-контейнере. Для этого необходимо подготовить файл с переменными окружения .env и docker-compose.yml

docker-compose.yml
version: "3"
services:
  eltex-portal:
    container_name: eltex-portal
    image:  hub.eltex-co.ru/softwlc/eltex-portal:1.23-<tag>
    ports:
      - 9000:${PORTAL_PORT}
      - 9443:${PORTAL_HTTPS_PORT}
    environment:
      - PORT=${PORTAL_PORT}
      - portal.defaultRedirectUrl=${PORTAL_DEFAULT_REDIRECT_URL}
      - database.host=${PORTAL_DATABASE_HOST}
      - database.port=${PORTAL_DATABASE_PORT}
      - database.name=${PORTAL_DATABASE_NAME}
      - database.user=${PORTAL_DATABASE_USER}
      - database.password=${PORTAL_DATABASE_PASSWORD}
      - jetty.https.port=${PORTAL_HTTPS_PORT}
      - jetty.https.keystorePass=${PORTAL_HTTPS_KEYSTORE_PASS}
      - jetty.https.keystoreFile=${PORTAL_HTTPS_KEYSTORE_FILE}
      - validation.public_key=${PORTAL_PUBLIC_KEY}
      - TZ=${TZ}
    volumes:
      - /etc/eltex-doors/keys/public.pem:${PORTAL_PUBLIC_KEY}:ro
Вместо <tag> необходимо указать актуальную версию, которую можно посмотреть по ссылке.
.env
PORTAL_PORT=9000

PORTAL_HTTPS_PORT=9443
PORTAL_HTTPS_KEYSTORE_PASS=12345
PORTAL_HTTPS_KEYSTORE_FILE=/etc/eltex-portal/localhost.pfx

PORTAL_DEFAULT_REDIRECT_URL=http://eltex-co.ru
PORTAL_PUBLIC_KEY=/etc/eltex-doors/keys/public.pem

PORTAL_DATABASE_HOST=<ip-addr>
PORTAL_DATABASE_PORT=3306
PORTAL_DATABASE_NAME=ELTEX_PORTAL
PORTAL_DATABASE_USER=javauser
PORTAL_DATABASE_PASSWORD=javapassword

#Настройка часового пояса
TZ=Asia/Novosibirsk

Описание переменных окружения

Запуск сервиса

  • PORTAL_PORT - порт, на котором будет стартовать сервис внутри контейнера
  • JAVA_INIT_HEAP - аргумент запуска JVM -Xms
  • JAVA_MAX_HEAP - аргумент запуска JVM -Xmx
  • JAVA_OPTS – другие аргументы запуска JVM (может перезаписать любые другие аргументы)

Логирование

  • LOG_LEVEL - уровень Root логера
  • GELF_HOST - хост подключения к Gelf
  • GELF_PORT - порт подключения к Gelf
  • GELF_LEVEL - уровень Gelf логера

Подключение к БД

  • PORTAL_DATABASE_HOST - хост подключения к БД
  • PORTAL_DATABASE_PORT - порт подключения к БД
  • PORTAL_DATABASE_NAME - название БД
  • PORTAL_DATABASE_USER - пользователь БД
  • PORTAL_DATABASE_PASSWORD - пароль БД
  • database.pool.connectionTimeout - таймаут подключения к БД
  • database.pool.validationTimeout - таймаут валидации соединения с БД
  • database.pool.min - минимальное число idle соединений с БД в пуле
  • database.pool.max - максимальное число соединений с БД в пуле
  • database.cache.maxEntries - максимальное число простых кэшированных записей (для каждого типа запроса)
  • database.cache.maxResourceBytes - максимальный размер кэшированных ресурсов
  • database.cache.expireTime - максимальное время хранения записей в кеше

Конфигурация eltex-portal

  • PORTAL_DEFAULT_REDIRECT_URL - URL редиректа пользователя по-умолчанию
  • portal.scheduler.tariffCheckerPeriod - период запуска задачи "PortalTariffChecker"
  • portal.scheduler.promoBindingsCleaner.period - период запуска задачи "PromoBindingsCleaner"
  • portal.scheduler.promoBindingsCleaner.bindingsLifetime - время жизни привязок промо-баннеров к пользователям
  • portal.scheduler.paymentsCleanerPeriod - период запуска задачи "PaymentsCleaner"

Доступ через HTTPS

  • PORTAL_HTTPS_PORT - HTTPS порт сервиса внутри контейнера
  • PORTAL_HTTPS_KEYSTORE_PASS - пароль к KeyStore
  • PORTAL_HTTPS_KEYSTORE_FILE - путь до KeyStore
  • jetty.https.keystoreType - тип KeyStore
  • jetty.https.keyAlias - алиас SSL сертификата
  • jetty.https.ciphers - список названий шифров

Валидация JWT

  • PORTAL_PUBLIC_KEY - путь до public.pem ключа для валидации JWT

Настройка часового пояса

  • TZ - часовой пояс в формате Asia/Novosibirsk (список существующих можно посмотреть командой timedatectl list-timezones)


Файлы .env и docler-compose.yml должны находиться в одной папке. Контейнер запускается командой:

docker-compose up
 Добавление сторонних сертификатов CA и sub-CA в контейнер

По умолчанию в ОС Ubuntu 18.04 не содержится сертификатов Министерства цифрового развития. Требуется добавить данные сертификаты для корректной работы при использовании платных тарифов.

В директории, где расположен файл docker-compose.yml создать папку "certs":

sudo mkdir certs

Загрузить в созданную папку сертификаты CA и sub-CA командой:

sudo wget https://gu-st.ru/content/Other/doc/russiantrustedca.pem -P ./certs

В файле docker-compose.yml в раздел "volumes" добавить строчку:

      - ./certs:/usr/local/share/ca-certificates:ro

Перезапустить контейнер командой:

sudo docker-compose up -d

Проверить наличие сертификатов в контейнере можно командой:

sudo docker container exec  portal /bin/sh -c 'keytool --list -storepass changeit -keystore /etc/ssl/certs/java/cacerts | grep russian -A 1'

Пример вывода команды:

russiantrustedsubca, Feb 10, 2023, trustedCertEntry, 
Certificate fingerprint (SHA1): 33:5D:43:F5:34:51:B7:81:53:5F:F3:88:2D:F7:13:D3:C1:4F:8A:01
--
russiantrustedrootca, Feb 10, 2023, trustedCertEntry, 
Certificate fingerprint (SHA1): 8F:F9:15:CC:AB:7B:C1:6F:8C:5C:80:99:D5:3E:0E:11:5B:3A:EC:2F
  • Нет меток