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

Описание


В состав 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
    }
}

// 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 - время хранения данных в кэше

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


Для запуска мониторинга со стороны 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:

Шаблоны для Grafana, Prometheus  и docker-compose.yml можно  взять из  архива: portal_monitoring.zip. Для запуска нужно  извлечь данные из архива, перейти в директорию  и  запустить:

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.20-<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}
    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

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

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

  • 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


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

docker-compose up
  • Нет меток