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

Принципиальная схема предлагаемого решения

Для работы решения понадобятся пять виртуальных машин: 2 хоста SoftWLC развернутых автоматическим скриптом установщиком и 3 хоста для баз данных.  На хостах должно быть минимум по 2 сетевых инетрфейса работающих в двух независимых. Первая сеть - сеть управления, включающая VRRP-адрес для синхронизации нод SoftWLC (в примере 10.10.0.0/24), вторая сеть - сеть взаимодействия с БД (В примере 100.111.20.0/24).

Сетевые адреса в примерах данной инструкции и в реальной эксплуатации будут отличаться. При работе с файлами конфигураций - используйте адреса в рамках вашей сетевой адресации.

Подготовка нод SoftWLC

Необходимо подготовить 2 хоста независимых хоста SoftWLC, развернутых скриптом установщиком.

Инструкция по развертыванию SoftWLC

Синхронизация токенов сервиса eltex-doors

Описание 

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

1) Условно обозначить развернутые контроллеры как Master и Slave

2) Удалить ключи на сервере Slave, а затем заменить их ключами скопированнными с сервера Master.

3) Присвоить файлам ключей необходимые привилегии и владельцев.

4) Перезапустить зависимые от ключей сервисы.

5) Удалить записи о ключах из БД контроллера Slave и перезапустить зависимые от ключей сервисы.

6) Открыть личный кабинет на обоих серверах и перейти во вкладку "Сервисы и тарифы" (в момент перехода - в БД создадутся новые записи о ключах).

Выполнение действий

1) Удалите содержимое папки "/etc/eltex-doors/keys/" на сервере Slave (файлы private.pem и public.pem).

2) Скопируйте содержимое папки "/etc/eltex-doors/keys/" с сервера Master на сервер Slave (файлы private.pem и public.pem), например при помощи scp.

3) Выполните следующие команды для установки корректных владельцев файлов и назначения корректных прав:

sudo chown root /etc/eltex-doors/keys/private.pem
sudo chown eltex /etc/eltex-doors/keys/public.pem

4) Перезапустите на сервере Slave следующие сервисы:  

sudo service eltex-disconnect-service restart
sudo service eltex-doors restart
sudo service eltex-johnny restart
sudo service eltex-portal restart
sudo service eltex-portal-constructor restart

5) На обоих серверах удалите из целевой БД в MySQL записи о токенах сервиса eltex-doors командой:

mysql -ujavauser -pjavapassword -e "delete from eltex_doors.auth_token;"

Перейдите к веб-интерфейсу личного кабинета на каждом сервере, адрес "http://<ip-адрес сервера>:8080/wifi-cab", внутри личного кабинета перейдите во вкладку "Сервисы и тарифы". Редактировать ничего не требуется, при переходе в указанный раздел ЛК -  записи об удаленных на шаге "3" токенах сгенерируются в БД повторно.

Установка и настройка keepalived

Описание пакета

Пакет keepalived - это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации. Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.

Установка keepalived

Для установки пакета, необходимо загрузить его на сервер и выполнить следующую команду (установка должна производиться от имени суперпользователя root на обоих серверах):

sudo apt update
sudo apt install keepalived

После установки необходимо добавить демона Keepalived в автозагрузку и запустить его:

sudo systemctl enable keepalived
sudo systemctl start keepalived


Основной файл конфигурации:

На обоих серверах в файле /etc/keepalived/keepalived.conf меняем следующие параметры: 

<interface> - наименование сетевого интерфейса (свой для каждого сервера) аналогично записи (eth1);

<virtual_ip> - виртуальный ip-адрес (с указанием префикса) аналогично записи (100.111.195.202 /24);

<ip_адрес другого сервера> - ip-адрес другого сервера аналогично записи (100.111.195.200);

/etc/keepalived/keepalived.conf
! Configuration File for keepalived
 
global_defs {
 
   script_user root
   enable_script_security 
}

vrrp_script check_network {
    script "/etc/keepalived/check_ping.sh"
    interval 5
    weight 50
    fall 3
    rise 3
    init_fail
    user root
}

vrrp_instance VI_SWLC {
    state BACKUP
    interface <interface>
    virtual_router_id 1
    track_script {
        check_network
    }
    track_interface {
        <interface> weight 50
    }
    priority 150
    advert_int 1
    nopreempt
	# Uncomment and comment "nopreempt" if preemption needed
	#preempt_delay 180
    authentication {
        auth_type PASS
        auth_pass eltex
    }
    virtual_ipaddress {
        <virtual_ip> dev <interface> label <interface>:1
    }
 
    notify_master "/etc/keepalived/keep_notify.sh master"
    notify_backup "/etc/keepalived/keep_notify.sh backup"
    notify_fault "/etc/keepalived/keep_notify.sh fault"
 
    unicast_peer {
        <ip_адрес_другого_сервера>
    }
}

Тест-скрипт

Скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта, гарантируется, что SoftWLC достижим для внешних клиентов. 

В текущей реализации на обоих серверах, в качестве тестового скрипта, предлагается использовать следующий:

/etc/keepalived/check_ping.sh
#!/bin/bash

# host to ping
# there - default gw
HOST=<default_gw_ip>
# -q quiet
# -c nb of pings to perform
ping -q -c5 $HOST > /dev/null

# $? var keeping result of execution
# previous command
if [ $? -eq 0 ]
    then
        echo `date +"%T %F"` "OK gw reachable"
        EXIT_CODE=0
    else
        echo `date +"%T %F"` "ERROR gw unreacheble!"
        EXIT_CODE=1
fi

exit $EXIT_CODE

где <default_gw_ip> - шлюз по умолчанию для этого сервера аналогично записи (100.10.194.1);.

Конфигурация смены роли

При смене состояния сервера, выполняется скрипт keep_notify.sh, где <mysql_user> и <mysql_password> - логин и пароль от БД MySQL (по умолчанию root/root).

/etc/keepalived/keep_notify.sh
#!/bin/bash

MYSQL_USER="<mysql_user>"
MYSQL_PASSWORD="<mysql_password>"

if ! lockfile-create --use-pid -r 5 /tmp/keep.mode.lock; then
    echo "Unable to lock"
    echo "Unable to lock" > /tmp/keep.mode.lock.fail
    exit 0
fi

case "$1" in
    master)
    #  ems_reload_all
    echo "MASTER" > /tmp/keep.mode

    service eltex-ems restart
    service eltex-ngw restart

    # рестарт слейва MySQL чтобы при восстановлении связи - сразу получить изменения,
    # а не ждать периодического heartbeat от второго сервера
#    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
#    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
  ;;
 backup)
    echo "BACKUP" > /tmp/keep.mode
    service eltex-ems stop
    service eltex-ngw stop
#    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave"
#    mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave"
 ;;
 fault)
    echo "FAULT" > /tmp/keep.mode
 ;;
 *)
    echo "Usage: $0 {master|backup|fault}"
    exit 1
esac

lockfile-remove /tmp/keep.mode.lock;

exit 0

Для того, чтобы скрипты работали корректно, необходимо назначить права на их исполнение:

sudo chmod +x /etc/keepalived/check_ping.sh
sudo chmod +x /etc/keepalived/keep_notify.sh

Выделение лога в отдельный файл

По умолчанию keepalived записывает лог в файл /var/log/syslog . Для удобства отладки, мониторинга и контроля работы keepalived, можно настроить ведение собственного, отдельного лог-файла.

Ниже приведен пример настройки rsyslog:

sudo nano -w /etc/rsyslog.d/10-keepalived.conf

Добавьте в файл 10-keepalived.conf следующее:

/etc/rsyslog.d/10-keepalived.conf
if $programname contains 'Keepalived' then /var/log/keepalived.log
if $programname contains 'Keepalived' then ~

Затем, нужно перезапустить rsyslog командой:

sudo service rsyslog restart

Теперь сообщения от демона keepalived попадут только в лог-файл /var/log/keepalived.log и не попадут в /var/log/syslog .

Настройка rsync

Rsync в схеме резервирования отвечает за синхронизацию служебных файлов, сервисов Eltex-EMS и Eltex-APB, а также файлов прошивок, шаблонов конфигурации, выгрузок конфигураций точек. Rsync представляет собой клиент серверное ПО. В данной схеме master-сервер выступает в роли клиента и синхронизирует каталоги slave-сервера с локальными.

Конфигурация сервера rsync

Для активации сервера rsync, необходимо на каждом сервере в файле /etc/default/rsync установить значение:
RSYNC_ENABLE=true

Создать файл ,. Листинг файла приведен ниже.

hosts allow = <ip_другого_сервера> <virtual ip>

Запись hosts allow = <ip_другого_сервера> <virtual ip> в конфигурации встречается в 3 местах, не забудьте исправить все значения!
/etc/rsyncd.conf
[ems-conf]
path = /usr/lib/eltex-ems/conf/
use chroot = no
max connections = 2
lock file = /var/lock/rsyncd
read only = no
list = no
uid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
strict modes = yes
# IP-адрес сервера, который будет иметь доступ к ресурсу, т.е. адрес второго сервера в паре
hosts allow = <ip_адрес_другого_сервера> <virtual_ip>
ignore errors = no
ignore nonreadable = yes
transfer logging = no
timeout = 60
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz
 
[ems-tftp]
path = /tftpboot
use chroot = no
max connections = 2
lock file = /var/lock/rsyncd.tftp
read only = no
list = no
uid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
strict modes = yes
hosts allow = <ip_адрес_другого_сервера> <virtual_ip>
ignore errors = no
ignore nonreadable = yes
transfer logging = no
timeout = 60
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

[ems-wp]
path = /var/ems-data/WP
use chroot = no
max connections = 2
lock file = /var/lock/rsyncd.ems-wp
read only = no
list = no
uid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
strict modes = yes
hosts allow = <ip_адрес_другого_сервера> <virtual_ip>
ignore errors = no
ignore nonreadable = yes
transfer logging = no
timeout = 60
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

[radius-nbi-certs]
path = /var/lib/eltex-radius-nbi
use chroot = no
max connections = 2
lock file = /var/lock/rsyncd.radius
read only = no
list = no
uid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
strict modes = yes
hosts allow = <ip_адрес_другого_сервера> <virtual_ip>
ignore errors = no
ignore nonreadable = yes
transfer logging = no
timeout = 60
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

[radius-certs]
path = /etc/eltex-radius/certs
use chroot = no
max connections = 2
lock file = /var/lock/rsyncd.radius
read only = no
list = no
uid = root
auth users = backup
secrets file = /etc/rsyncd.secrets
strict modes = yes
hosts allow = <ip_адрес_другого_сервера> <virtual_ip>
ignore errors = no
ignore nonreadable = yes
transfer logging = no
timeout = 60
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

Для аутентификации, необходимо настроить пользователя rsync, для этого, на каждом сервере создайте файлы /etc/rsyncd.secrets, в которых необходимо указать пароль.

/etc/rsyncd.secrets
backup:rspasswd

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

sudo chmod 600 /etc/rsyncd.secrets

Настройка запуска синхронизации
Создайте файлы /etc/rsync_client.secrets, в которых укажите пароль:                           

echo "rspasswd" | sudo tee /etc/rsync_client.secrets && sudo chmod 600 /etc/rsync_client.secrets

Начиная с версии rsync 3.2.0 добавлена по умолчанию защита каталога /usr, /boot, /home (защиту home в дальнейшем убрали) Решением является переопределение защищающей опции rsync.
Для этого необходимо на обоих хостах:
прописать команду
systemctl edit rsync
в открывшемся файле в начале прописать:
[Service]
ProtectSystem=off
перезапустить службу
service rsync restart

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

Для запуска сервиса используется команда:

sudo service rsync start

Для остановки сервиса используется команда:

sudo service rsync stop

Для проверки — запущен ли сервис в данный момент, используется команда:

sudo service rsync status

Конфигурация скрипта для  eltex-ems

Операцию синхронизации файлов осуществляет задача cron, в которой выполняется скрипт /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh. Скрипт запускает rsync клиент и синхронизирует локальные директории с директориями на втором (backup) сервере. Синхронизация запускается только в случае, если сервер в состоянии master. 
В 6 строке заменить HOST  на ip-адрес другого сервера (Пример: HOST=100.111.195.201)

/usr/lib/eltex-ems/scripts/rsync_ems_backup.sh
#!/bin/bash

LOCKFILE="/run/lock/rsync_ems_backup"

# IP address backup server
HOST=<ip_адрес_другого_сервера>
# Check if we're root
if [ `whoami` != "root" ]
    then
	echo "This script should be run by root."
	exit 1
fi

# Check and create lock file
if ! lockfile-create --use-pid -r 0 $LOCKFILE &> /dev/null ; then
    echo "Backup is already running"
    exit 0
fi

# Check - if we're master - try to perform backup to slave
SRVMODE=`cat /tmp/keep.mode`
if [ "$SRVMODE" == "MASTER" ]
    then
	rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /usr/lib/eltex-ems/conf/ backup@$HOST::ems-conf > /tmp/rsync_ems_conf.log 2>&1
	echo $? >> /tmp/rsync_ems_conf_result.log
	rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /tftpboot/ backup@$HOST::ems-tftp > /tmp/rsync_ems_tftpboot.log 2>&1
	echo $? >> /tmp/rsync_ems_tftpboot_result.log
    rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /var/ems-data/WP/ backup@$HOST::ems-wp > /tmp/rsync_ems_wp.log 2>&1
    echo $? >> /tmp/rsync_ems_wp_result.log
else
	echo "Not master. No action will be performed."
fi

lockfile-remove $LOCKFILE

Конфигурация скрипта для  eltex-radius/eltex-radius-nbi

Сервис eltex-radius-nbi генерирует для каждой из нод свой собственный CA и серверный сертификат, после чего копирует их в eltex-radius:

  • /var/lib/eltex-radius-nbi/wireless-ca.crt > /etc/eltex-radius/certs/ca/local.pem
  • /var/lib/eltex-radius-nbi/certificates/server.crt > /etc/eltex-radius/certs/server.crt
  • /var/lib/eltex-radius-nbi/certificates/server.key > /etc/eltex-radius/certs/server.key

На основании wireless-ca.crt буду генерироваться клиентские сертификаты (создаются через ЛК) в директории /var/lib/eltex-radius-nbi/certificates/
При создании сертификата пользователя через ЛК он будет сгенерирован на только ноде, на которой сейчас вы находитесь и на основании его собственного wireless-ca.crt.
Поэтому при переходе мастерства вторая нода не будет ничего знать о клиентских сертификатах.

Обязательно убедитесь, что в файле /etc/eltex-radius-nbi/radius_nbi_config.txt в переменной tomcat.host установлен ваш виртуальный ip-адрес


Чтобы это исправить нужно:

  1. выбираем ноду, которая будет владеть актуальными данными, например первую ноду
  2. Добавить ip-адрес второго хоста в переменную окружения 

    echo "export SLAVE_HOST="YOUR_IP"" | sudo tee /etc/environment && source /etc/environment
  3.  /usr/lib/eltex-radius-nbi/rsync_radius_cert_synchronization.sh
    #!/bin/bash
    # You mustn't change this script. After new installation it will be replaced.
    
    LOCKFILE="/run/lock/rsync_radius_cert_synchronization"
    
    # IP address server for synchronization.
    # Please before all define SLAVE_HOST for your environment.
    SLAVE_HOST=${SLAVE_HOST:-SLAVE_HOST_DEFAULT}
    # Check if we're root
    if [ `whoami` != "root" ]
        then
        echo "This script should be run by root."
        exit 1
    fi
    
    # Check and create lock file
    if ! lockfile-create --use-pid -r 0 $LOCKFILE &> /dev/null ; then
        echo "Backup is already running"
        exit 0
    fi
    
    # Check - if we're master - try to perform backup to slave
    SRVMODE=`cat /tmp/keep.mode`
    if [ "$SRVMODE" == "MASTER" ]
        then
        rsync -urlogtp --password-file=/etc/rsync_client.secrets /var/lib/eltex-radius-nbi/ backup@$SLAVE_HOST::radius-nbi-certs > /tmp/rsync_radius_nbi_certs.log 2>&1
        echo $? >> /tmp/rsync_radius_nbi_certs.log
        rsync -urlogtp --password-file=/etc/rsync_client.secrets /etc/eltex-radius/certs/ backup@$SLAVE_HOST::radius-certs > /tmp/rsync_radius_certs.log 2>&1
        echo $? >> /tmp/rsync_radius_certs.log
    else
        echo "Not master. No action will be performed."
    fi
    
    lockfile-remove $LOCKFILE
  4.  Запустить команды с выбранной вами ноды в статусе "MASTER"
    rsync -rlogtp --delete-after --password-file=/etc/rsync_client.secrets /var/lib/eltex-radius-nbi/ backup@$SLAVE_HOST::radius-nbi-certs > /tmp/rsync_radius_nbi_certs.log 2>&1
    rsync -rlogtp --delete-after --password-file=/etc/rsync_client.secrets /etc/eltex-radius/certs/ backup@$SLAVE_HOST::radius-certs > /tmp/rsync_radius_certs.log 2>&1

    эти команды синхронизируют данные с вашей второстепенной нодой

  5.  убедитесь, что файлы в директориях /var/lib/eltex-radius-nbi/ и /etc/eltex-radius/certs/ совпадают
  6.  выполнить команду на двух нодах
    systemctl restart eltex-radius.service


Статус можно проверить в файле /tmp/keep.mode

Настройка cron


Cоздать задачу в cron на обоих серверах, для запуска синхронизации раз в минуту:

sudo crontab -l | { cat; echo "*/1 * * * * /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh"; } | sudo crontab
sudo crontab -l | { cat; echo "*/1 * * * * /usr/lib/eltex-radius-nbi/rsync_radius_cert_synchronization.sh"; } | sudo crontab

Проверяем список задач:

sudo crontab -l
*/1 * * * * /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh
*/1 * * * * /usr/lib/eltex-radius-nbi/rsync_radius_cert_synchronization.sh

Если задача не добавилась или случайно добавилась несколько раз - редактируем список вручную:

sudo crontab -e

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /usr/bin/code
  4. /bin/ed

Choose 1-4 [1]: 1                                 # выбираем в каком редакторе открыть

Проверить работу rsync можно в EMS. Во вкладке "Информация"-Состояние системы резервирования-Rsync service. 

На обоих серверах должна быть запись такого типа:

OK. Успешная синхронизация файлов из директории: /usr/lib/eltex-ems/conf/* 
OK. Успешная синхронизация файлов из директории: /tftpboot/* 
OK. Успешная синхронизация файлов из директории: /var/ems-data/WP/*

Подготовка внешних нод баз данных

Подготовьте 3 дополнительных виртуальных машины для работы баз данных в калстере.

Минимальные требования к VM при запуске galera cluster:

  • 2 CPU
  • 4Gb RAM
  • 30Gb HDD

Установка MariaDB нужной версии на внешние ноды БД

Так как мы используем нв SoftWLC 1.31 MariaDB версии 10.6.17+maria~ubu2204 на всех трех внешних нодах БД нужно использовать эту же версию. В данной инструкции мы установим все необходимое из deb-пакетов:

1) Скачиваем необходимый архив deb-инсталляторов, загружаем архив mariadb-10.6.17-ubuntu-jammy-amd64-debs.tar в удобную для загрузки директорию.

2) Разархивируем в целевую директорию и перейдем в нее

sudo tar -xvf mariadb-10.6.17-ubuntu-jammy-amd64-debs.tar
cd ./mariadb-10.6.17-ubuntu-jammy-amd64-debs

3) Установка командами:

# Установка необходимых зависимостей

sudo apt-get update
sudo apt-get install libdbi-perl libdbd-mysql-perl psmisc libaio1 socat

# Установка дебок из директории марии с deb-пакетами

sudo dpkg --install ./mariadb-common*.deb \
   ./mysql-common*.deb \
   ./mariadb-client*.deb \
   ./libmariadb3_*.deb \
   ./libmysqlclient18*.deb 

sudo dpkg --install ./mariadb-server*.deb \
   ./mariadb-backup*.deb \
   ./galera-4*.deb

# Проверка установки

sudo dpkg -l | grep -i mariadb

# Результат
ii  libdbd-mysql-perl:amd64          4.050-5ubuntu0.22.04.1                  amd64        Perl5 database interface to the MariaDB/MySQL database
ii  libmariadb3:amd64                1:10.6.17+maria~ubu2204                 amd64        MariaDB database client library
ii  mariadb-backup                   1:10.6.17+maria~ubu2204                 amd64        Backup tool for MariaDB server
ii  mariadb-client                   1:10.6.17+maria~ubu2204                 all          MariaDB database client binaries (metapackage depending on the latest version)
ii  mariadb-client-10.6              1:10.6.17+maria~ubu2204                 amd64        MariaDB database client binaries
ii  mariadb-client-core-10.6         1:10.6.17+maria~ubu2204                 amd64        MariaDB database core client binaries
ii  mariadb-common                   1:10.6.17+maria~ubu2204                 all          MariaDB database common files (e.g. /etc/mysql/mariadb.conf.d/)
ii  mariadb-server                   1:10.6.17+maria~ubu2204                 all          MariaDB database server binaries (metapackage depending on the latest version)
ii  mariadb-server-10.6              1:10.6.17+maria~ubu2204                 amd64        MariaDB database server binaries
ii  mariadb-server-core-10.6         1:10.6.17+maria~ubu2204                 amd64        MariaDB database core server files
ii  mysql-common                     1:10.6.17+maria~ubu2204                 all          MariaDB client common configuration files package (e.g. /etc/mysql/my.cnf)
sudo dpkg -l | grep -i galera

# Результат
ii  galera-4                         26.4.16-ubu2204                         amd64        Replication framework for transactional applications

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

На каждой ноде БД выполняем следующие действия:

1) Заходим в mysql и добавляем пользователя для выполнения репликации:

CREATE USER 'mysql'@'localhost' IDENTIFIED VIA unix_socket;
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'mysql'@'localhost';
flush privileges;

2) В файле /etc/mysql/mariadb.conf.d/50-server.cnf комментируем "bind-address", исправляем значение max_connections на 500, и добавляем строку "progress_report_time    = 0" 

#bind-address          = 127.0.0.1
max_connections        = 500
progress_report_time   = 0
Пример файла /etc/mysql/mariadb.conf.d/50-server.cnf
#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Basic Settings
#
user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
socket                  = /run/mysqld/mysqld.sock
#port                   = 3306
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
#skip-external-locking

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address            = 127.0.0.1

#
# * Fine Tuning
#
#key_buffer_size        = 16M
#max_allowed_packet     = 16M
#thread_stack           = 192K
#thread_cache_size      = 8
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
#myisam_recover_options = BACKUP
max_connections        = 500
#table_cache            = 64
#thread_concurrency     = 10
progress_report_time    = 0

#
# * Query Cache Configuration
#
#query_cache_limit      = 1M
query_cache_size        = 16M

#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
# Be aware that this log type is a performance killer.
# As of 5.1 you can enable the log at runtime!
#general_log_file       = /var/log/mysql/mysql.log
#general_log            = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Enable the slow query log to see queries with especially long duration
#slow_query_log_file    = /var/log/mysql/mariadb-slow.log
#long_query_time        = 10
#log_slow_rate_limit    = 1000
#log_slow_verbosity     = query_plan
#log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
#       other settings you may need to change.
#server-id              = 1
#log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
#max_binlog_size        = 100M
#binlog_do_db           = include_database_name
#binlog_ignore_db       = exclude_database_name

#
# * Security Features
#
# Read the manual, too, if you want chroot!
#chroot = /var/lib/mysql/
#
# For generating SSL certificates you can use for example the GUI tool "tinyca".
#
#ssl-ca = /etc/mysql/cacert.pem
#ssl-cert = /etc/mysql/server-cert.pem
#ssl-key = /etc/mysql/server-key.pem
#
# Accept only connections using the latest and most secure TLS protocol version.
# ..when MariaDB is compiled with OpenSSL:
#ssl-cipher = TLSv1.2
# ..when MariaDB is compiled with YaSSL (default in Debian):
#ssl = on

#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci

#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!

#
# * Unix socket authentication plugin is built-in since 10.0.22-6
#
# Needed so the root database user can authenticate without a password but
# only when running as the unix root user.
#
# Also available for other users if required.
# See https://mariadb.com/kb/en/unix_socket-authentication-plugin/

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.3 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand

3) Создаем файл /etc/mysql/conf.d/galera.cnf настраиваем в нем следующие параметры:

Пример файла /etc/mysql/conf.d/galera.cnf
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://100.111.206.35,100.111.206.36,100.111.206.37"
 
# Galera Synchronization Configuration
#wsrep_sst_method=rsync
wsrep_sst_method=mariabackup
#wsrep_sst_auth=sst:password
wsrep_sst_auth=mysql:
 
# Galera Node Configuration
wsrep_node_address="100.110.3.70"
wsrep_node_name="node1"
 
# Enable Conflict Logging
wsrep_log_conflicts=ON
wsrep_provider_options="cert.log_conflicts=YES;pc.weight=40;evs.auto_evict=5"

Где:

wsrep_cluster_address="gcomm://100,111,206,35,100,111,206,36,100,111,206,37" - перечень адресов всех нод БД

wsrep_cluster_name="test_cluster" - название кластера (должно совпадать на всех нодах БД)

wsrep_provider_options="cert.log_conflicts=YES;pc.weight=40;evs.auto_evict=5" - вес в системе нод (pc.weight=40) - должен быть уникальным для каждой ноды (от 1 до 250)

Запуск первой ноды в Galera

Запуск происходит вручную с "первой ноды" (Администратор самостоятельно определяет первую ноду из перечня).

1) Перед запуском первой ноды прописываем в окружении переменную:

sudo systemctl set-environment MYSQLD_OPTS="--wsrep-new-cluster"

2) Выполняем рестарт сервера:

sudo systemctl restart mariadb

3) Подключаемся на хосте к mysql:

sudo mysql

4) Проверяем состояние кластера (пока нода одна) командами:

show status like 'wsrep_cluster_status';
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+

show status like 'wsrep_evs_state';
+-----------------+-------------+
| wsrep_evs_state | OPERATIONAL |
+-----------------+-------------+

show status like 'wsrep_local_state_comment';
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+

show status like 'wsrep_provider_name';
+---------------------+--------+
| wsrep_provider_name | Galera |
+---------------------+--------+

show status like 'wsrep_cluster_size';
+--------------------+-------+
| wsrep_cluster_size | 1 	 |
+--------------------+-------+

Обратите  внимание, что пока в кластере только одна нода:

show status like 'wsrep_cluster_size';
+--------------------+-------+
| wsrep_cluster_size | 1 	 |
+--------------------+-------+

5) После успешного запуска удаляем глобальную переменную командой:

sudo systemctl unset-environment MYSQLD_OPTS

Запуск остальных нод в Galera

Предполагается, что на данном шаге все вышеуказанные конфигурационные фалы созданы и откорректированы, а первая нода запущена

1) На каждой ноде кроме первой, перезапускаем MySQL командой:

sudo systemctl restart mariadb

2) Затем  проверяем статус:

sudo systemctl status mariadb

Если сервис не запустился, значит где-то допущена ошибка.

3) Проверяем статус кластера на каждой ноде командами:

Команды для проверки статуса ноды в Galera
show status like 'wsrep_cluster_status';
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+

show status like 'wsrep_evs_state';
+-----------------+-------------+
| wsrep_evs_state | OPERATIONAL |
+-----------------+-------------+

show status like 'wsrep_local_state_comment';
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+

show status like 'wsrep_provider_name';
+---------------------+--------+
| wsrep_provider_name | Galera |
+---------------------+--------+

show status like 'wsrep_cluster_size';
+--------------------+-------+
| wsrep_cluster_size | 1 	 |
+--------------------+-------+

В схеме с использованием 3х нод, после запуска всех нод 'wsrep_cluster_size' должен быть равен 3

show status like 'wsrep_cluster_size';
+--------------------+-------+
| wsrep_cluster_size |  1    |
+--------------------+-------+

Конфигурация внешних нод для работы с контроллером SoftWLC

Добавляем репозитории Eltex (Данный раздел надо исправить на оф репо)

Добавляем ключ и адреса репозиториев, затем обновляем apt

sudo wget -q -O - http://lab3-repo.eltex.loc:2088/repo.gpg.key | gpg --yes --dearmor -o /etc/apt/keyrings/eltex.gpg
   
sudo echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/eltex.gpg] http://lab3-repo.eltex.loc:2088 softwlc-1.31-common main" >> /etc/apt/sources.list.d/eltex.list
sudo echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/eltex.gpg] http://lab3-repo.eltex.loc:2088 softwlc-1.31-jammy main" >> /etc/apt/sources.list.d/eltex.list
sudo echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/eltex.gpg] http://lab3-repo.eltex.loc:2088 softwlc-1.31-dependencies-jammy main" >> /etc/apt/sources.list.d/eltex.list

sudo apt update 

Развертывание БД SoftWLC

Создание пользователя root, необходимого для установки пакетов "*-db":

create user 'root'@'127.0.0.1' identified by 'root';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION;
FLUSH PRIVILEGES;


Перенос БД с Первой ноды SoftWLC на первую ноду Galera

Выполните перенос полноuj дампа бд SoftWLC с первой ноды SoftWLC на первую ноду Galera (Условно ту, с которой выполнен запуск Galera) при помощи mysqldump. Для этого, необходимо на первом сервере заблокировать таблицы, снять дамп, разблокировать таблицы и скопировать получившийся файл на второй сервер:

sudo mysql -uroot -proot -e "FLUSH TABLES WITH READ LOCK;"

sudo mysqldump -uroot -proot --databases ELTEX_PORTAL eltex_alert eltex_auth_service eltex_bruce eltex_doors eltex_ems eltex_jobs eltex_ngw eltex_ont radius wireless eltex_pcrf  eltex_wids eltex_wifi_customer_cab > mysqldump_master.sql

sudo mysql -uroot -proot -e "UNLOCK TABLES;"

sudo scp mysqldump_master.sql <username>@<ip_ноды_Galera>:/home/<username>/

Затем, развернуть dump на ноде Galera, на которую выполнен перенос, командой:

sudo mysql -uroot -proot < /home/<username>/mysqldump_master.sql

В БД mysql добавляем пользователя:

CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'%';

После переноса БД, за счет синхронизации, она распространится на все ноды.

Установка пакета eltex-radius-db

Сервис eltex-radius-db требуется включить в cron очистку устаревших записей - так что этот пакет необходимо установить на каждой ноде баз данных.

Выполните установку для каждой из трех нод командой:

sudo apt install eltex-radius-db

# Подтвердите следующее в процессе установки
Do you want to add ThreeYearsRadacct monitor to cron? [Y/n] Y

После установки пакетов БД появиться пользователь javauser, дадим ему права на работу с БД портала, ngw, doors, Syslog:

GRANT ALL PRIVILEGES ON *.* TO 'javauser'@'%' IDENTIFIED BY 'javapassword';
GRANT ALL PRIVILEGES ON eltex_auth_service.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `radius`.* TO 'javauser'@'%';            
GRANT ALL PRIVILEGES ON `wireless`.* TO 'javauser'@'%';          
GRANT ALL PRIVILEGES ON `Syslog`.* TO 'javauser'@'%';            
GRANT ALL PRIVILEGES ON `eltex_doors`.* TO 'javauser'@'%';       
GRANT ALL PRIVILEGES ON `eltex_ngw`.* TO 'javauser'@'%';         
GRANT ALL PRIVILEGES ON `ELTEX_PORTAL`.* TO 'javauser'@'%';      
GRANT ALL PRIVILEGES ON `eltex_ems`.* TO 'javauser'@'%';         
GRANT ALL PRIVILEGES ON `eltex_alert`.* TO 'javauser'@'%';       
GRANT ALL PRIVILEGES ON `eltex_auth_service`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_bruce`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_pcrf`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_wids`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_wifi_customer_cab`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_jobs`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_sorm2`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_ott`.* TO 'javauser'@'%';
GRANT ALL PRIVILEGES ON `eltex_jerry`.* TO 'javauser'@'%';
FLUSH PRIVILEGES;

Для создания БД ELTEX_PORTAL, eltex_doors, eltex_ngw необходимо настроить подключение БД в сервисах eltex-portal/eltex-portal-constructor, eltex-doors, eltex-ngw и выполнить их рестарт. После рестарта они создадут соответствующие им БД.

Установка ProxySQL

Принимать все запросы от сервисов контроллера SoftWLC будет сервис под названием ProxySQL, его необходимо установить на обе ноды Контроллеров (не на ноды БД)

Скачиваем текущую актуальную версию ProxySQL на каждый хост SOftWLC:

SystemEventsProperties
sudo wget https://github.com/sysown/proxysql/releases/download/v2.6.3/proxysql_2.6.3-ubuntu22_amd64.deb
sudo dpkg -i ./proxysql_2.6.3-ubuntu22_amd64.deb

Официальная страница загрузки 

Первичная настройка ProxySQL

Редактируем файл настроек /etc/proxysql.cnf

Исправляем вывод файла логов на более обычную директорию:

errorlog="/var/log/proxysql/proxysql.log"

Добавляем секцию с информацией о серверах MariaDB:

	{
		address = "ip-адрес_ноды_БД1"
		port = 3306
		hostgroup = 0
		maxconnections = 500
	},
	{
		address = "ip-адрес_ноды_БД2"
		port = 3306
		hostgroup = 0
		maxconnetions = 500
	},
	{
		address = "ip-адрес_ноды_БД3"
		port = 3306
		hostgroup = 0
		maxconnetions = 500
	}

Добавляем информацию о пользователях БД:

	{
		username = "root"
		password = "root"
		default_hostgroup = 0
	        active = 1
	        max_connections = 500
	        fast_forward = 1
	},
	{
        	username = "javauser"
        	password = "javapassword"
        	default_hostgroup = 0
        	active = 1
        	max_connections = 500
        	fast_forward = 1
	},
	{
		username = "radius"
	        password = "radpass"
        	default_hostgroup = 0
        	active = 1
        	max_connections = 500
        	fast_forward = 1
	}

Пример настройки:

proxysql.cnf
#file proxysql.cfg

########################################################################################
# This config file is parsed using libconfig , and its grammar is described in:
# http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-File-Grammar
# Grammar is also copied at the end of this file
########################################################################################

########################################################################################
# IMPORTANT INFORMATION REGARDING THIS CONFIGURATION FILE:
########################################################################################
# On startup, ProxySQL reads its config file (if present) to determine its datadir.
# What happens next depends on if the database file (disk) is present in the defined
# datadir (i.e. "/var/lib/proxysql/proxysql.db").
#
# If the database file is found, ProxySQL initializes its in-memory configuration from
# the persisted on-disk database. So, disk configuration gets loaded into memory and
# then propagated towards the runtime configuration.
#
# If the database file is not found and a config file exists, the config file is parsed
# and its content is loaded into the in-memory database, to then be both saved on-disk
# database and loaded at runtime.
#
# IMPORTANT: If a database file is found, the config file is NOT parsed. In this case
#            ProxySQL initializes its in-memory configuration from the persisted on-disk
#            database ONLY. In other words, the configuration found in the proxysql.cnf
#            file is only used to initial the on-disk database read on the first startup.
#
# In order to FORCE a re-initialise of the on-disk database from the configuration file
# the ProxySQL service should be started with "systemctl start proxysql-initial".
#
########################################################################################

datadir="/var/lib/proxysql"
errorlog="/var/log/proxysql/proxysql.log"

admin_variables=
{
	admin_credentials="admin:admin"
#	mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
	mysql_ifaces="0.0.0.0:6032"
#	refresh_interval=2000
#	debug=true
}

mysql_variables=
{
	threads=4
	max_connections=2048
	default_query_delay=0
	default_query_timeout=36000000
	have_compress=true
	poll_timeout=2000
#	interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
	interfaces="0.0.0.0:6033"
	default_schema="information_schema"
	stacksize=1048576
	server_version="5.5.30"
	connect_timeout_server=3000
# make sure to configure monitor username and password
# https://github.com/sysown/proxysql/wiki/Global-variables#mysql-monitor_username-mysql-monitor_password
	monitor_username="monitor"
	monitor_password="monitor"
	monitor_history=600000
	monitor_connect_interval=60000
	monitor_ping_interval=10000
	monitor_read_only_interval=1500
	monitor_read_only_timeout=500
	ping_interval_server_msec=120000
	ping_timeout_server=500
	commands_stats=true
	sessions_sort=true
	connect_retries_on_failure=10
}


# defines all the MySQL servers
mysql_servers =
(
	{
		address = "10.10.0.21"
		port = 3306
		hostgroup = 0
		maxconnections = 500
	},
	{
		address = "10.10.0.22"
		port = 3306
		hostgroup = 0
		maxconnetions = 500
	},
	{
		address = "10.10.0.23"
		port = 3306
		hostgroup = 0
		maxconnetions = 500
	}
#	{
#		address = "127.0.0.1" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
#		port = 3306           # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
#		hostgroup = 0	        # no default, required
#		status = "ONLINE"     # default: ONLINE
#		weight = 1            # default: 1
#		compression = 0       # default: 0
#   max_replication_lag = 10  # default 0 . If greater than 0 and replication lag passes such threshold, the server is shunned
#	},
#	{
#		address = "/var/lib/mysql/mysql.sock"
#		port = 0
#		hostgroup = 0
#	},
#	{
#		address="127.0.0.1"
#		port=21891
#		hostgroup=0
#		max_connections=200
#	},
#	{ address="127.0.0.2" , port=3306 , hostgroup=0, max_connections=5 },
#	{ address="127.0.0.1" , port=21892 , hostgroup=1 },
#	{ address="127.0.0.1" , port=21893 , hostgroup=1 }
#	{ address="127.0.0.2" , port=3306 , hostgroup=1 },
#	{ address="127.0.0.3" , port=3306 , hostgroup=1 },
#	{ address="127.0.0.4" , port=3306 , hostgroup=1 },
#	{ address="/var/lib/mysql/mysql.sock" , port=0 , hostgroup=1 }
)


# defines all the MySQL users
mysql_users:
(
	{
		username = "root"
		password = "root"
		default_hostgroup = 0
	        active = 1
	        max_connections = 500
	        fast_forward = 1
	},
	{
        	username = "javauser"
        	password = "javapassword"
        	default_hostgroup = 0
        	active = 1
        	max_connections = 500
        	fast_forward = 1
	},
	{
		username = "radius"
	        password = "radpass"
        	default_hostgroup = 0
        	active = 1
        	max_connections = 500
        	fast_forward = 1
	}
#	{
#		username = "username" # no default , required
#		password = "password" # default: ''
#		default_hostgroup = 0 # default: 0
#		active = 1            # default: 1
#	},
#	{
#		username = "root"
#		password = ""
#		default_hostgroup = 0
#		max_connections=1000
#		default_schema="test"
#		active = 1
#	},
#	{ username = "user1" , password = "password" , default_hostgroup = 0 , active = 0 }
)



#defines MySQL Query Rules
mysql_query_rules:
(
#	{
#		rule_id=1
#		active=1
#		match_pattern="^SELECT .* FOR UPDATE$"
#		destination_hostgroup=0
#		apply=1
#	},
#	{
#		rule_id=2
#		active=1
#		match_pattern="^SELECT"
#		destination_hostgroup=1
#		apply=1
#	}
)

scheduler=
(
#  {
#    id=1
#    active=0
#    interval_ms=10000
#    filename="/var/lib/proxysql/proxysql_galera_checker.sh"
#    arg1="0"
#    arg2="0"
#    arg3="0"
#    arg4="1"
#    arg5="/var/lib/proxysql/proxysql_galera_checker.log"
#  }
)


mysql_replication_hostgroups=
(
#        {
#                writer_hostgroup=30
#                reader_hostgroup=40
#                comment="test repl 1"
#       },
#       {
#                writer_hostgroup=50
#                reader_hostgroup=60
#                comment="test repl 2"
#        }
)




# http://www.hyperrealm.com/libconfig/libconfig_manual.html#Configuration-File-Grammar
#
# Below is the BNF grammar for configuration files. Comments and include directives are not part of the grammar, so they are not included here.
#
# configuration = setting-list | empty
#
# setting-list = setting | setting-list setting
#
# setting = name (":" | "=") value (";" | "," | empty)
#
# value = scalar-value | array | list | group
#
# value-list = value | value-list "," value
#
# scalar-value = boolean | integer | integer64 | hex | hex64 | float
#                | string
#
# scalar-value-list = scalar-value | scalar-value-list "," scalar-value
#
# array = "[" (scalar-value-list | empty) "]"
#
# list = "(" (value-list | empty) ")"
#
# group = "{" (setting-list | empty) "}"
#
# empty =

Рестартуем сервис:

systemctl restart proxysql

Останавливаем MariaDB на SoftWLC командой:

systemctl stop mariadb.service

Переходим в админку ProxySQL чтобы изменить порт сервиса на стандартный 3306

mysql -uadmin -padmin -P 6032 -h 127.0.0.1 --prompt='Admin>'

Меняем порт сервиса на стандартный 3306 и сохраняем настройку

update global_variables set variable_value = '0.0.0.0:3306' where variable_name = 'mysql-interfaces';
save mysql variables to disk;

Разрешаем запись только в одну ноду кластера (с наибольшим приоритетом)

DELETE FROM mysql_servers;

INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,max_connections, max_replication_lag) VALUES (0,'ip-дрес_ноды_БД1',3306,1000,500,10);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,max_connections, max_replication_lag) VALUES (0,'ip-дрес_ноды_БД2',3306,800,500,10);
INSERT INTO mysql_servers(hostgroup_id,hostname,port,weight,max_connections, max_replication_lag) VALUES (0,'ip-дрес_ноды_БД3',3306,600,500,10);

DELETE FROM mysql_galera_hostgroups;

INSERT INTO mysql_galera_hostgroups (writer_hostgroup, backup_writer_hostgroup, reader_hostgroup, offline_hostgroup, active, max_writers, writer_is_also_reader, max_transactions_behind, comment) VALUES (0, 1, 2, 3, 1, 1, 1, 100, NULL);

LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;

select * from runtime_mysql_servers;
Соответствие параметров hostgroup и значений
writer_hostgroup           0
backup_writer_hostgroup    1
reader_hostgroup           2
offline_hostgroup          3 
active                     1 
max_writers                1 
writer_is_also_reader      1 
max_transactions_behind  100
comment                 NULL

Рестартуем сервис повторно:

systemctl restart proxysql

Включение панели мониторинга

Включаем web-панель для proxysql (логин/пароль stats / stats , панель будет доступна по адресу сервера, через https на порту 6080):

SET admin-web_enabled='true';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;

SELECT * FROM global_variables WHERE variable_name LIKE '%admin-web%';


Изменений файлов конфигурации сервисов

Описание

Сервисы Eltex в рамках комплекса SoftWLC производят различные транзакции опирирую записями в БД. Работа транзакций выполняется по ссылкам в файлах конфигурации сервисов. Для корректной работы - необходимо изменить некоторые конфигурационные файлы. Измените в перечисленных ниже файлах конфигураций ссылки - конструкцию "jdbc:mysql://localhost/" замените на "jdbc:mysql://127.0.0.1:3306", в конце каждой измененной ссылки добавьте сегмент "&useSSL=false" если он отсутствует.

Пример

Как ссылка выглядит в конфигурации по умолчанию:

"jdbc:mysql://localhost/radius?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true"

Как должно быть:

"jdbc:mysql://127.0.0.1:3306/radius?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false"

После внесения изменений в конфигурационные файлы необходимо перезапустить соответствующий сервис:

service eltex-<service_name> restart

Изменение конфигураций

1) В файле /etc/eltex-pcrf/pcrf.json замените в ссылках конструкцию "jdbc:mysql://localhost/" на "jdbc:mysql://127.0.0.1:3306", в конце каждой измененной ссылке должен быть сегмент "&useSSL=false"

Файл /etc/eltex-pcrf/eltex-pcrf.json
{
  "auth.address" : "0.0.0.0",
  "auth.port" : 31812,
  "auth.mac.open.timeout.s" : 3600,
  "auth.mac.welcome.service" : "WELCOME",

  "acct.address" : "0.0.0.0",
  "acct.ports" : [1813, 31813],

  "lease.saver.address" : "0.0.0.0",
  "lease.saver.port" : 4381,

  "aaa.instances" : 5,
  "aaa.host" : "127.0.0.1",
  "aaa.secret" : "testing123",
  "aaa.auth.port" : 1812,
  "aaa.acct.port" : 1813,
  "aaa.rest.port" : 7080,
  "aaa.timeout" : 10,
  "aaa.attempts" : 1,

  "web.monitoring.port" : 7070,

  "cluster.enable" : false,
  "cluster.eventBusPort" : 5801,

  "radius" : {
    "url": "jdbc:mysql://127.0.0.1:3306/radius?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 16
  },

  "mongo.pcrf" : {
    "connection_string": "mongodb://localhost:27017/pcrf?waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0",
    "db_name": "pcrf"
  },

  "session.storage" : {
    "session.check.period.s" : 300,
    "unauth.store.time.s" : 600,
    "interval.number.expired" : 3,
    "min.interval.s" : 45,
    "default.interval.s" : 600
  },

  "bras.coa" : {
    "coa.timeout" : 10,
    "coa.attempts" : 1,
    "coa.secret" : "testing123",
    "remote.coa.port" : 3799,
    "log.clean.period.s" : 604800,
    "log.store.period" : {
      "period" : 14,
      "unit" : "D"
    },
    "worker.pool.size": 20
  },

  "sql.ems" : {
    "url": "jdbc:mysql://127.0.0.1:3306/eltex_ems?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 16
  },

  "sql.wireless" : {
    "url": "jdbc:mysql://127.0.0.1:3306/wireless?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 16
  },

  "sql.auth.service" : {
    "url": "jdbc:mysql://127.0.0.1:3306/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 4
  },

  "sql.pcrf" : {
    "url": "jdbc:mysql://127.0.0.1:3306/eltex_pcrf?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&socketTimeout=5000&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 60
  },

  "sql.ott" : {
    "url": "jdbc:mysql://127.0.0.1:3306/eltex_ott?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&socketTimeout=5000&useSSL=false",
    "user": "javauser",
    "password": "javapassword",
    "max_pool_size": 32
  },

  "language" : "en",

  "radius.nbi" : {
    "wdsl.url" : "http://localhost:8080/axis2/services/RadiusNbiService?wsdl",
    "username" : "softwlc_service",
    "password" : "softwlc",
    "connection.timeout.ms" : 30000,
    "request.timeout.ms" : 120000
  },

  "tariffs.update.interval" : {
    "interval" : 1,
    "unit" : "hours",
    "apb_enabled": false,
    "apb_host": "localhost",
    "apb_port": 8090
  },

  "bras.cron.update.interval": {
    "interval" : 1,
    "unit": "hours"
  },

  "filters.cache.dir" : "/var/lib/eltex-pcrf/filters/",

  "clickhouse": {
    "url": "jdbc:clickhouse://localhost:8123/radius",
    "user_name": "javauser",
    "user_password": "javapassword",
    "actualization_period_ms": 15000
  },

  "accounting.options": {
    "use_clickhouse": false,
    "use_mysql": true,
    "batch_interval_ms": 300000,
    "max_queue_load": 100
  },

  "generic.ap.registrar": {
    "max_aps_in_queue": 30,
    "ap_register_interval_ms": 600000,
    "added_ap_cache_ttl_ms": 600000,
    "host": "localhost",
    "port": 8080,
    "worker_pool_size": 8
  },

  "kafka": {
    "mcd.enabled": false,
    "circuit.breaker": {
      "timeout.ms": 30000,
      "reset.ms": 60000,
      "max.failures": 3
    },
    "producer": {
      "bootstrap.servers": "localhost:9092",
      "linger.ms": "1000",
      "topic": "mcd",
      "max.block.ms": "30000",
      "request.timeout.ms": "14000",
      "delivery.timeout.ms": "30000",
      "acks": "1",
      "retries": "1"
    }
  },

  "worker.pool.size": 40
}


2) В файле /etc/eltex-portal-constructor/application.conf

  • изменить localhost на 127.0.0.1:3306 в строке 15
  • изменить localhost на virtual_ip в строках 48, 54, 64, 95
Файл /etc/eltex-portal-constructor/application.conf
login {
    # Количество попыток входа в панель администратора до наступления блокировки
    maxAttemptsLogin = 3
    maxAttemptsIP = 5
    # Количество минут блокировки после достижения максимального числа попыток входа в панель администратора
    blockTime = 5m
}

access {
    // Временно задаём plaintext-secret прямо здесь (HMAC256), потом будем использовать путь в FS до PEM-файла (RSA256)
    secret = "secret"
}

database {
    host = 127.0.0.1:3306
    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 = 30s
    }
}

sso {
    enabled = false
    # Must be in double quotes
    version = "1.0"

    rest {
        scheme = http
        host = 10.10.0.13
        port = 80
        sso_api_path = /apiman-gateway/b2b_test
    }
    auth {
        scheme = http
        host = 10.10.0.13
        port = 80
        authentication_path = /auth/realms/b2b/protocol/openid-connect/auth
        logout_path = /auth/realms/b2b/protocol/openid-connect/logout
    }


    params {
        client_id = id
        # URL of epadmin, URL must be in double quotes (!!!)
        redirect_uri = "http://10.10.0.13:8080/epadmin/sso"
        client_secret = secret
    }
}

jetty {
    http.port = 9001
    https {
        port = 9444
        keystorePass = 12345
        keystoreFile = /etc/eltex-portal-constructor/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
        ]
    }
    multipart {
        maxFileSize = 100MB
        maxRequestSize = 100MB
    }
}

validation {
    public_key = /etc/eltex-doors/keys/public.pem
}

logging {
  host = 10.10.0.13
  port = 9099
}

2) В файле /etc/eltex-portal/application.conf

  • изменить localhost на 127.0.0.1:3306 в строке 27
Файл /etc/eltex-portal/application.conf
portal {
    defaultRedirectUrl = "http://eltex-co.ru"

    scheduler {
        tariffCheckerPeriod = 1d
        paymentsCleanerPeriod = "0 0 * * * ?"
    }
}

jetty {
    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"

3) В файле /etc/eltex-radius-nbi/radius_nbi_config.txt

  • заменить конструкцию "jdbc:mysql://localhost/" на "jdbc:mysql://127.0.0.1:3306", в конце каждой измененной ссылки добавьте сегмент "&useSSL=false" если он отсутствует.
  • в остальных строках заменить localhost и 127.0.0.1 на virtual_ip
Файл /etc/eltex-radius-nbi/radius_nbi_config.txt
# DB  radius(alias=radius)
radius.jdbc.driver=org.gjt.mm.mysql.Driver
radius.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
radius.jdbc.username=javauser
radius.jdbc.password=javapassword
radius.jdbc.maxPoolSize=48
radius.jdbc.inUse=yes

# DB  radius replica(alias=radiusReplicaPool)
#TODO: Change it to replica url
radius.jdbc.replica.driver=org.gjt.mm.mysql.Driver
radius.jdbc.replica.dbUrl=jdbc:mysql://127.0.0.1:3306/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
radius.jdbc.replica.username=javauser
radius.jdbc.replica.password=javapassword
radius.jdbc.replica.maxPoolSize=48
radius.jdbc.replica.inUse=yes

# DB ems(alias=ems)
ems.jdbc.driver=org.gjt.mm.mysql.Driver
ems.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_ems?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true&useSSL=false
ems.jdbc.username=javauser
ems.jdbc.password=javapassword
ems.jdbc.maxPoolSize=48
ems.jdbc.inUse=yes

# DB  wireless (alias=wireless)
wireless.jdbc.driver=org.gjt.mm.mysql.Driver
wireless.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/wireless?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000
wireless.jdbc.username=javauser
wireless.jdbc.password=javapassword
wireless.jdbc.maxPoolSize=48
wireless.jdbc.inUse=yes

# DB logs (alias=logs)
logs.jdbc.driver=org.gjt.mm.mysql.Driver
logs.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_alert?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
logs.jdbc.username=javauser
logs.jdbc.password=javapassword
logs.jdbc.maxPoolSize=48
logs.jdbc.inUse=yes

# DB logs (alias=eltex_auth_service)
eltex_auth_service.jdbc.driver=org.gjt.mm.mysql.Driver
eltex_auth_service.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
eltex_auth_service.jdbc.username=javauser
eltex_auth_service.jdbc.password=javapassword
eltex_auth_service.jdbc.maxPoolSize=48
eltex_auth_service.jdbc.inUse=yes

# адрес ems-northbound
ems.nbi.host=10.10.0.13
ems.nbi.port=8080
ems.nbi.path=northbound
ems.nbi.protocol=http

# tomcat url
tomcat.host=10.10.0.13
tomcat.port=8080

# pcrf stuff
pcrf.enabled=true
pcrf.url=http://10.10.0.13:7070
pcrf.username=admin
pcrf.password=password
pcrf.readtimeout=11
pcrf.writetimeout=11

# pcrf mysql
pcrf.jdbc.driver=org.gjt.mm.mysql.Driver
pcrf.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_pcrf?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
pcrf.jdbc.username=javauser
pcrf.jdbc.password=javapassword
pcrf.jdbc.maxPoolSize=48
pcrf.jdbc.inUse=yes


# wifi-customer-cab mysql
wifi_cab.jdbc.driver=org.gjt.mm.mysql.Driver
wifi_cab.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_wifi_customer_cab?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
wifi_cab.jdbc.username=javauser
wifi_cab.jdbc.password=javapassword
wifi_cab.jdbc.maxPoolSize=48
wifi_cab.jdbc.inUse=yes

# Eltex.SORM2.replicator MariaDB 'sorm2' connect
sorm2.jdbc.driver=org.gjt.mm.mysql.Driver
sorm2.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_sorm2?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
sorm2.jdbc.username=javauser
sorm2.jdbc.password=javapassword
sorm2.jdbc.maxPoolSize=48
sorm2.jdbc.inUse=yes

# wifi-customer-cab request settings
wificab.timeout=90000

# Eltex.SORM2.replicator host to use API
sorm2.enabled=false
sorm2.url=http://10.10.0.13:7071
sorm2.username=admin
sorm2.password=password

#It enables records export to SORM3 while editing wifi users
sorm3.enabled=false
# ott mysql
ott.jdbc.driver=org.gjt.mm.mysql.Driver
ott.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_ott?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
ott.jdbc.username=javauser
ott.jdbc.password=javapassword
ott.jdbc.maxPoolSize=48
ott.jdbc.inUse=yes

# metrics
metric.port=9010

# SSO settings
sso.enabled=false

#the "clientSecret" settings only matter when "provider=rtk"
sso.clientSecret=

#the "clientId" settings only matter when "provider=rtk"
sso.clientId=

# SSO REST
sso.rest.server.protocol=http
sso.rest.server.address=
sso.rest.server.port=80
sso.rest.server.timeout.sec=10

# possible value for sso.rest.protocol.provider are "rtk", "keycloak"
sso.rest.protocol.provider=rtk

#the "version" settings only matter when "provider=rtk"
sso.rest.protocol.version=2.0

#the "username" settings only matter when "provider=rtk"
sso.rest.username=

#the "password" settings only matter when "provider=rtk"
sso.rest.password=

# SSO SETTINGS
sso.rest.getToken.path=/apiman-gateway/b2b_test/getToken
sso.rest.getUserInfo.path=/apiman-gateway/b2b_test/getUserInfo

#the least below sso settings only matter when "provider=rtk"
sso.rest.addUser.path=/apiman-gateway/b2b_test/addUser
sso.rest.updateUser.path=/apiman-gateway/b2b_test/updateUser
sso.rest.delUser.path=/apiman-gateway/b2b_test/delUser
sso.rest.addUserParam.path=/apiman-gateway/b2b_test/addUserParam
sso.rest.delUserParam.path=/apiman-gateway/b2b_test/delUserParam
sso.rest.getUserByName.path=/apiman-gateway/b2b_test/getUserByName
sso.rest.getUserByEmail.path=/apiman-gateway/b2b_test/getUserByEmail
sso.rest.resetPassword.path=/apiman-gateway/b2b_test/resetPassword
sso.rest.getUserByParam.path=/apiman-gateway/b2b_test/getUserByParam

# BRUCE
bruce.host=10.10.0.13
bruce.port=8008

###########################################################################

##########################DB ELTEX_PORTAL settings#########################

###########################################################################
portal.db.driver=com.mysql.jdbc.Driver
portal.db.url=jdbc:mysql://127.0.0.1:3306/ELTEX_PORTAL?max_allowed_packet=32362048&useUnicode=true&characterEncoding=utf8&useSSL=false
portal.db.username=javauser
portal.db.password=javapassword

# NGW
ngw.url=http://10.10.0.13:8040

# DOORS
doors.url = http://10.10.0.13:9097/
doors.timeout = 60
doors.username = user
doors.password = password

# ELVIS
elvis.url=http://10.10.0.13:9001/epadmin/

4) В файле /etc/eltex-ngw/application.conf

  • Изменить localhost на 127.0.0.1 в строках 7 и 14
  • Изменить localhost и 127.0.0.1 в остальных строках на virtual_ip
Файл /etc/eltex-radius/local.conf
# Ports on which the server will listen
auth_port=1812
#acct_port=1813
inner_tunnel_port=18121

# MySQL database
db_host="127.0.0.1"
db_port=3306
db_login="radius"
db_password="radpass"
db_name="radius"

# MySQL 'wireless' database
wireless_db_host="127.0.0.1"
wireless_db_port=3306
wireless_db_login="javauser"
wireless_db_password="javapassword"
wireless_db_name="wireless"

# PCRF
# If you setting pcrf_enabled=0, then you also should enable accounting port listening in "default" server
pcrf_host="10.10.0.13"
pcrf_port=7080
pcrf_enabled=1

# EAP
ca_cert_name="local.pem"
tls_key_password="1234"

# Proxying
proxy_auth=0
proxy_domain_regex="^(.+\.)?enterprise\.root$"
proxy_host="10.10.0.13"
proxy_port=18121
proxy_secret="eltex"

# Ubiquity vendor detection
ubi_vendor_regex="Apple|Ubiquiti"
vendor_group_enabled=1

# Settings of runtime NAS discovery
dynamic_clients=false
dynamic_client_subnet=192.168.0.0/16
dynamic_client_lifetime=3600
dynamic_client_rate_limit=false

# Proxy SSID (for example to eltex-eap-tls) #139679
proxy_ssid_enabled=0
proxy_ssid_value="EAP_TLS"
proxy_ssid_host="10.10.0.13"
proxy_ssid_port=18122
proxy_ssid_secret="eltex"

5) В файле /etc/eltex-wifi-cab/system.xml

  • Изменить localhost на virtual_ip во всех строках.
Файл /etc/eltex-wifi-cab/system.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <entry key="nbiaddress">http://10.10.0.13:8080/axis2/services/RadiusNbiService?wsdl</entry>
    <entry key="nbi.serviceLogin.user">softwlc_service</entry>
    <entry key="nbi.serviceLogin.password">softwlc</entry>
    <entry key="nbi.serviceLogin.requestTimeout.sec">120</entry>

    <!--Bonnie or NBI-->
    <entry key="data.service.type">NBI</entry>
    <entry key="bonnie.service.host">10.10.0.13</entry>
    <entry key="bonnie.service.port">9070</entry>

    <!--Bruce-->
    <entry key="bruce.service.host">10.10.0.13</entry>
    <entry key="bruce.service.port">8008</entry>

    <!--Jobs-->
    <entry key="jobs.service.host">10.10.0.13</entry>
    <entry key="jobs.service.port">9696</entry>

    <!-- Support link  -->
    <entry key="support.page.enabled">false</entry>
    <entry key="support.page.url">http://eltex-co.ru</entry>

    <!-- DPI link  -->
    <entry key="dpi.page.enabled">false</entry>
    <entry key="dpi.page.url">https://filter.wifi.rt.ru/</entry>

    <!-- SSO Settings -->
    <entry key="sso.enabled">false</entry>
    <entry key="sso.redirectUri">http://10.10.0.13:8080/wifi-cab/sso</entry>
    <entry key="sso.clientSecret"></entry>
    <entry key="sso.clientId"></entry>
    <entry key="sso.localauth.enabled">true</entry>

    <!-- SSO Auth -->
    <entry key="sso.auth.server.protocol">http</entry>
    <entry key="sso.auth.server.address"></entry>
    <entry key="sso.auth.server.port">80</entry>

    <entry key="sso.auth.auth.path">/auth/realms/b2b/protocol/openid-connect/auth</entry>
    <entry key="sso.auth.logout.path">/auth/realms/b2b/protocol/openid-connect/logout</entry>

    <!-- SSO REST -->
    <entry key="sso.rest.server.protocol">http</entry>
    <entry key="sso.rest.server.address"></entry>
    <entry key="sso.rest.server.port">80</entry>
    <entry key="sso.rest.server.timeout.sec">10</entry>
    <entry key="sso.rest.protocol.provider">rtk</entry> <!-- rtk/keycloak -->
    <entry key="sso.rest.protocol.version">2.0</entry> <!--setting only matters when provider=rtk-->
    <entry key="sso.rest.username"></entry> <!--setting only matters when provider=rtk-->
    <entry key="sso.rest.password"></entry> <!--setting only matters when provider=rtk-->

    <entry key="sso.rest.getToken.path">/apiman-gateway/b2b_test/getToken</entry>
    <entry key="sso.rest.getUserInfo.path">/apiman-gateway/b2b_test/getUserInfo</entry>

    <!--the settings only matter when provider=rtk-->
    <entry key="sso.rest.addUser.path">/apiman-gateway/b2b_test/addUser</entry>
    <entry key="sso.rest.updateUser.path">/apiman-gateway/b2b_test/updateUser</entry>
    <entry key="sso.rest.delUser.path">/apiman-gateway/b2b_test/delUser</entry>
    <entry key="sso.rest.addUserParam.path">/apiman-gateway/b2b_test/addUserParam</entry>
    <entry key="sso.rest.delUserParam.path">/apiman-gateway/b2b_test/delUserParam</entry>
    <entry key="sso.rest.getUserByName.path">/apiman-gateway/b2b_test/getUserByName</entry>
    <entry key="sso.rest.resetPassword.path">/apiman-gateway/b2b_test/resetPassword</entry>
    <entry key="sso.rest.getUserByParam.path">/apiman-gateway/b2b_test/getUserByParam</entry>
    <entry key="sso.rest.getUserByEmail.path">/apiman-gateway/b2b_test/getUserByEmail</entry>

</properties>

6) В файле /usr/lib/eltex-ems/conf/config.txt

  • заменить конструкцию "jdbc:mysql://localhost/" на "jdbc:mysql://127.0.0.1:3306", в конце каждой измененной ссылки добавьте сегмент "&useSSL=false" если он отсутствует.
Файл /usr/lib/eltex-ems/conf/config.txt
# DB Event
poolName1=event
event.jdbc.driver=org.gjt.mm.mysql.Driver
event.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_alert?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
event.jdbc.username=javauser
event.jdbc.password=javapassword
event.jdbc.maxPoolSize=32
event.jdbc.inUse=yes
# remote db host access with su privileges
# event.ssh.login=
# event.ssh.password=
# event.ssh.port=

# DB Tree
poolName2=tree
tree.jdbc.driver=org.gjt.mm.mysql.Driver
tree.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_ems?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true&useSSL=false
tree.jdbc.username=javauser
tree.jdbc.password=javapassword
tree.jdbc.maxPoolSize=20
tree.jdbc.inUse=yes

# DB Ont
poolName3=ont
ont.jdbc.driver=org.gjt.mm.mysql.Driver
ont.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/eltex_ont?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
ont.jdbc.username=javauser
ont.jdbc.password=javapassword
ont.jdbc.maxPoolSize=40
ont.jdbc.inUse=yes

# DB Syslog
poolName4=syslog
syslog.jdbc.driver=org.gjt.mm.mysql.Driver
syslog.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/Syslog?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
syslog.jdbc.username=javauser
syslog.jdbc.password=javapassword
syslog.jdbc.maxPoolSize=4
syslog.jdbc.inUse=yes
# remote db host access with su privileges
# syslog.ssh.login=
# syslog.ssh.password=
# syslog.ssh.port=

# DB acsmain (alias=cpe)
poolName5=cpe
cpe.jdbc.driver=org.gjt.mm.mysql.Driver
cpe.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/acsmain?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
cpe.jdbc.username=javauser
cpe.jdbc.password=javapassword
cpe.jdbc.maxPoolSize=2
cpe.jdbc.inUse=yes

# DB  acscmds(alias=cmds)
poolName6=cmds
cmds.jdbc.driver=org.gjt.mm.mysql.Driver
cmds.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/acscmds?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
cmds.jdbc.username=javauser
cmds.jdbc.password=javapassword
cmds.jdbc.maxPoolSize=2
cmds.jdbc.inUse=yes

# DB  acsinf(alias=inf)
poolName7=inf
inf.jdbc.driver=org.gjt.mm.mysql.Driver
inf.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/acsinf?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
inf.jdbc.username=javauser
inf.jdbc.password=javapassword
inf.jdbc.maxPoolSize=2
inf.jdbc.inUse=yes

# DB  acscache(alias=cache)
poolName8=cache
cache.jdbc.driver=org.gjt.mm.mysql.Driver
cache.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/acscache?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
cache.jdbc.username=javauser
cache.jdbc.password=javapassword
cache.jdbc.maxPoolSize=2
cache.jdbc.inUse=yes

# DB  radius(alias=radius)
poolName9=radius
radius.jdbc.driver=org.gjt.mm.mysql.Driver
radius.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/radius?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
radius.jdbc.username=javauser
radius.jdbc.password=javapassword
radius.jdbc.maxPoolSize=40
radius.jdbc.inUse=yes
# remote db host access with su privileges
# radius.ssh.login=
# radius.ssh.password=
# radius.ssh.port=

# ------------------------------------------- SSID ---------------------------------------------
# DB  wireless (alias=wireless)
poolName10=wireless
wireless.jdbc.driver=org.gjt.mm.mysql.Driver
wireless.jdbc.dbUrl=jdbc:mysql://127.0.0.1:3306/wireless?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&useSSL=false
wireless.jdbc.username=javauser
wireless.jdbc.password=javapassword
wireless.jdbc.maxPoolSize=30
wireless.jdbc.inUse=yes

# memcached server address
#memcached_server_ip_port=127.0.0.1:11211

7) В файле /etc/eltex-bruce/application.properties

  • Изменить localhost на virtual_ip в строке 2
  • Изменить localhost на 127.0.0.1:3306 в строке 4
Файл /etc/eltex-bruce/application.properties
server.port=8008
server.address.jobs=http://10.10.0.13:9696

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/eltex_bruce
spring.datasource.username=javauser
spring.datasource.password=javapassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.flyway.url=${spring.datasource.url}
spring.flyway.user=${spring.datasource.username}
spring.flyway.password=${spring.datasource.password}

#Quartz
spring.quartz.job-store-type=jdbc
spring.quartz.properties.quartz.jdbc.initialize-schema=never

spring.quartz.properties.org.quartz.scheduler.instanceName=jobs-quartz
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO

spring.quartz.properties.org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
spring.quartz.properties.org.quartz.jobStore.useProperties=false
spring.quartz.properties.org.quartz.jobStore.tablePrefix=QRTZ_
spring.quartz.properties.org.quartz.jobStore.clusterCheckinInterval=20000
spring.quartz.properties.org.quartz.jobStore.misfireThreshold=12000000000
spring.quartz.properties.org.quartz.jobStore.isClustered=false
spring.quartz.properties.org.quartz.jobStore.dataSource=quartzDataSource

spring.quartz.properties.org.quartz.dataSource.quartzDataSource.provider=hikaricp
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.driver=${spring.datasource.driver-class-name}
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.URL=${spring.datasource.url}
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.user=${spring.datasource.username}
spring.quartz.properties.org.quartz.dataSource.quartzDataSource.password=${spring.datasource.password}

spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
spring.quartz.properties.org.quartz.threadPool.threadCount=10
spring.quartz.properties.org.quartz.threadPool.threadPriority=5

management.health.defaults.enabled=true
management.endpoints.web.exposure.include=health, beans, prometheus, env, threaddump, heapdump, metrics, httptrace
management.endpoint.health.enabled=true

8) В файле /etc/eltex-disconnect-service/application.conf

  • Изменить localhost на virtual_ip в строке 2
Файл /etc/eltex-disconnect-service/application.conf
pcrf {
  host = 10.10.0.13
  // connection port (7070 is default)
  port = 7070

  // for timeouts (you can use ns, us, ms, s, m and h letters)
  // consult with HOCON duration format for more information

  // how long we wait for connection
  connectionTimeout = 10s

  // how long we wait for response end
  // minimum value should be greater then pcrf coa timeout
  socketReadTimeout = 15s

  // pool configuration
  pool {
    // minimum idle objects in pool
    min = 1
    // maximum pool size
    max = 20
    // timeout to retrieve an object from pool
    waitTimeout = 5s
  }
}

// JWT validation. You need a key from Eltex Doors.
// Or you could generate it yourself.
validation {
  public_key = /etc/eltex-doors/keys/public.pem
}

9) В файле /etc/eltex-johnny/application.conf

  • Изменить localhost на virtual_ip в 3, 24, 41, 65, 70 строках.
Файл /etc/eltex-johnny/application.conf
pcrf {
  // connection host
  host = 10.10.0.13
  // connection port (7070 is default)
  port = 7070
  // timeout (you can use ns, us, ms, s, m and h letters)
  // consult with HOCON duration format for more information
  timeout = 10s

  // pool configuration
  pool {
    // minimum idle objects in pool
    min = 1
    // maximum pool size
    max = 20
    // timeout to retrieve an object from pool
    waitTimeout = 5s
  }
}


mercury {
   // connection host
   host = 10.10.0.13
   // connection port (6565 is default)
   port = 6565

   // pool configuration
   pool {
     // minimum idle objects in pool
     min = 1
     // maximum pool size
     max = 20
     // timeout to retrieve an object from pool
     waitTimeout = 5s
   }
}

nbi {
  // connection host
  host = 10.10.0.13
  // connection port (8080 is default)
  port = 8080
  // timeout (you can use ns, us, ms, s, m and h letters)
  // consult with HOCON duration format for more information
  timeout = 80s
  // NBI login
  login = admin
  // NBI password
  password = password

  // pool configuration
  pool {
    // minimum idle objects in pool
    min = 1
    // maximum pool size
    max = 20
    // timeout to retrieve an object from pool
    waitTimeout = 5s
  }
}

portal {
  scheme = http
  host = 10.10.0.13
  port = 9000
}

doors {
  host = 10.10.0.13
  port = 9097
  path = /api
  username = user
  password = password
}

http {
  connectionTimeout = 20s
  connectionTotal = 100
}

// JWT validation. You need a key from Eltex Doors.
// Or you could generate it yourself.
validation {
  public_key = /etc/eltex-doors/keys/public.pem
}

10) В файле /etc/eltex-logging-service/application.conf

  • Изменить localhost на 127.0.0.1 в строке 15
Файл /etc/eltex-logging-service/application.conf
server {
  port = 9099
}

eventlog {
  enabled = true
}

sorm {
  enabled = false
  dir = /var/log/eltex-logging-service/sorm3/
}

database {
  jdbcUrl = "jdbc:mysql://127.0.0.1:3306/eltex_wifi_customer_cab"
  username = "javauser"
  password = "javapassword"
}

11) В файле /etc/eltex-mercury/application.conf

  • Изменить localhost на 127.0.0.1 в строках 2 и 27
Файл /etc/eltex-mercury/application.conf
database {
  host = 10.10.0.13
  port = 3306
  name = radius
  user = javauser
  password = javapassword

  readOnly = false

  pool {
    maxPoolSize = 20
    minimumIdle = 1
    connectionTimeout = 5000
  }

}

jdbc {
  properties {
    useSSL = false
  }
}

sorm3Enabled = false

logging {
  host = 10.10.0.13
  port = 9099
}

12) В файле /etc/eltex-pcrf/hazelcast-local.xml

  • Изменить localhost на virtual_ip в строке 18
Файл /etc/eltex-pcrf/hazelcast-local.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (c) 2008-2016, Hazelcast, Inc. All Rights Reserved.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  -->

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config http://www.hazelcast.com/schema/config/hazelcast-config-3.6.xsd"
           xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <group>
        <name>dev</name>
    </group>
    <management-center enabled="false">http://10.10.0.13:8080/mancenter</management-center>
    <network>
        <port auto-increment="false" port-count="100">5701</port>
        <outbound-ports>
            <ports>0</ports>
        </outbound-ports>
        <join>
            <multicast enabled="false"/>
            <tcp-ip enabled="false"/>
            <discovery-strategies>
            </discovery-strategies>
        </join>
        <interfaces enabled="false"/>
        <ssl enabled="false"/>
        <socket-interceptor enabled="false"/>
        <symmetric-encryption enabled="false">
            <algorithm>PBEWithMD5AndDES</algorithm>
            <!-- salt value to use when generating the secret key -->
            <salt>thesalt</salt>
            <!-- pass phrase to use when generating the secret key -->
            <password>thepass</password>
            <!-- iteration count to use when generating the secret key -->
            <iteration-count>19</iteration-count>
        </symmetric-encryption>
    </network>
    <partition-group enabled="false"/>

    <map name="__vertx.subs">
        <backup-count>1</backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>NONE</eviction-policy>
        <max-size policy="PER_NODE">0</max-size>
        <eviction-percentage>25</eviction-percentage>
        <merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
    </map>

    <semaphore name="__vertx.*">
        <initial-permits>1</initial-permits>
    </semaphore>

    <!--map name="serviceOnlineMap">
        <in-memory-format>OBJECT</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>NONE</eviction-policy>
        <max-size policy="PER_NODE">0</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>100</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map-->

    <map name="sessions">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.user.UserSessionStore</class-name>
            <write-delay-seconds>1</write-delay-seconds>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="sourceIpNodeIdMap">
        <map-store enabled="false"></map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>60</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="subnets">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.SubnetLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlSsid">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.wireless.SsidLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlSsidLink">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.wireless.SsidLinkLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlGeoObj">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.geo.GeoObjectLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlCell">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.cell.CellLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlNas">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.NasLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlTariff">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.TariffLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="shapers">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.shaper.ShaperLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="vrf">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.vrf.VrfLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <serialization>
        <portable-version>0</portable-version>
    </serialization>

    <services enable-defaults="true"/>

    <lite-member enabled="false"/>

    <properties>
        <property name="hazelcast.logging.type">log4j2</property>
        <property name="hazelcast.shutdownhook.enabled">false</property>
        <property name="hazelcast.jmx">true</property>
    </properties>

</hazelcast>

13) В файле /etc/eltex-pcrf/hazelcast-cluster.xml

  • Изменить localhost на virtual_ip в строке 15
Файл /etc/eltex-pcrf/hazelcast-cluster.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (c) 2008-2016, Hazelcast, Inc. All Rights Reserved.
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~ http://www.apache.org/licenses/LICENSE-2.0
  -->

<hazelcast xsi:schemaLocation="http://www.hazelcast.com/schema/config hazelcast-config-3.6.xsd"
           xmlns="http://www.hazelcast.com/schema/config"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <management-center enabled="false">http://10.10.0.13:8080/mancenter</management-center>

    <!-- load network configuration from another file -->
    <import resource="file:///etc/eltex-pcrf/hazelcast-cluster-network.xml"/>

    <partition-group enabled="false"/>

    <map name="__vertx.subs">
        <backup-count>1</backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>NONE</eviction-policy>
        <max-size policy="PER_NODE">0</max-size>
        <eviction-percentage>25</eviction-percentage>
        <merge-policy>com.hazelcast.map.merge.LatestUpdateMapMergePolicy</merge-policy>
    </map>

    <semaphore name="__vertx.*">
        <initial-permits>1</initial-permits>
    </semaphore>

    <!--map name="serviceOnlineMap">
        <in-memory-format>OBJECT</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>NONE</eviction-policy>
        <max-size policy="PER_NODE">0</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>100</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map-->

    <map name="sessions">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.user.UserSessionStore</class-name>
            <write-delay-seconds>1</write-delay-seconds>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>0</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="sourceIpNodeIdMap">
        <map-store enabled="false"></map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>60</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="subnets">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.SubnetLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlSsid">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.wireless.SsidLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlSsidLink">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.wireless.SsidLinkLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlGeoObj">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.geo.GeoObjectLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlCell">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.cell.CellLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlNas">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.NasLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="mysqlTariff">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.hazelcast.mysql.TariffLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">5</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="shapers">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.shaper.ShaperLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <map name="vrf">
        <map-store enabled="true">
            <class-name>org.eltex.softwlc.pcrf.hazelcast.vrf.VrfLoader</class-name>
            <properties>
                <property name="configPath">/etc/eltex-pcrf/eltex-pcrf.json</property>
            </properties>
        </map-store>
        <in-memory-format>BINARY</in-memory-format>
        <backup-count>0</backup-count>
        <async-backup-count>0</async-backup-count>
        <time-to-live-seconds>600</time-to-live-seconds>
        <max-idle-seconds>0</max-idle-seconds>
        <eviction-policy>LRU</eviction-policy>
        <max-size policy="FREE_HEAP_PERCENTAGE">10</max-size>
        <eviction-percentage>25</eviction-percentage>
        <min-eviction-check-millis>5000</min-eviction-check-millis>
        <merge-policy>com.hazelcast.map.merge.PutIfAbsentMapMergePolicy</merge-policy>
        <cache-deserialized-values>INDEX-ONLY</cache-deserialized-values>
    </map>

    <serialization>
        <portable-version>0</portable-version>
    </serialization>

    <services enable-defaults="true"/>

    <lite-member enabled="false"/>

    <properties>
        <property name="hazelcast.logging.type">log4j2</property>
        <property name="hazelcast.shutdownhook.enabled">false</property>
        <property name="hazelcast.jmx">true</property>
    </properties>

</hazelcast>


Скопируйте лицензии в директорию /usr/lib/eltex-ems/conf/licence/ на обоих серверах. 

Если используются иные лицензионные файлы, также необходимо скопировать их на второй сервер (список всех лицензионных файлов доступен в следующей статье)

Добавление пользователя в таблицу NAS

Для доступа в Личный кабинет необходимо добавить соответствующие записи в таблицу NAS.

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

Для этого в личном кабинете в разделе НастройкиСерверные адреса добавить : 

  • <ip_server_1> - IP-адрес сервера-1
  • <ip_server_2> - IP-адрес сервера-2
  • <virtual_ip> - Виртуальный IP-адрес









Ключ RADIUS -eltex


Смена настроек в GUI

Также нужно настроить модули SoftWLC при помощи графического интерфейса.

Личный кабинет Wi-Fi

В разделе Настройки → Интеграция в параметрах PCRF URL, URL NGW-клиента и URL конструктора порталов изменить localhost на виртуальный ip-адрес:

Конструктор порталов

Изменить localhost на виртуальный ip-адрес в разделах настроек:

Системные настройки → Конструктор порталов

Системные настройки → Доступ к NBI

Системные настройки → Доступ к NGW

Системные настройки → Доступ к PCRF

Системные настройки → Доступ к Mercury

EMS-GUI

В графическом интерфейсе сервера EMS изменить localhost (либо 127.0.0.1) на виртуальный ip-адрес в следующих разделах:

Администрирование → Настройка сервера → Системные модули → pcrf

Администрирование → Настройка сервера → Системные модули → radius

Также, необходимо отключить перезапуск RADIUS

Администрирование → Настройка сервера → Системные модули → softwlc.nbi

Администрирование → Настройка сервера → Системные модули → system

Администрирование → Настройка сервера → Системные модули → tftpserver

Администрирование → Настройка сервера → Системные модули →wifelessCommon

Данный ключ должен совпадать с файлом /etc/eltex-wifi-cab/local_secret на каждом хосте, где установлен eltex-wifi-cab . 



  • Нет меток