Принципиальная схема предлагаемого решения
Для работы решения понадобятся пять виртуальных машин: 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);
! 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 достижим для внешних клиентов.
В текущей реализации на обоих серверах, в качестве тестового скрипта, предлагается использовать следующий:
#!/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).
#!/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 следующее:
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>
[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, в которых необходимо указать пароль.
Назначить права доступа к файлам, выполнив на обоих серверах:
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
Способ запуска/остановки
Для запуска сервиса используется команда:
Для остановки сервиса используется команда:
Для проверки — запущен ли сервис в данный момент, используется команда:
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)
#!/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.
Поэтому при переходе мастерства вторая нода не будет ничего знать о клиентских сертификатах.
Чтобы это исправить нужно:
- выбираем ноду, которая будет владеть актуальными данными, например первую ноду
Добавить ip-адрес второго хоста в переменную окружения
echo "export SLAVE_HOST="YOUR_IP"" | sudo tee /etc/environment && source /etc/environment
/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
Запустить команды с выбранной вами ноды в статусе "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
эти команды синхронизируют данные с вашей второстепенной нодой
- убедитесь, что файлы в директориях /var/lib/eltex-radius-nbi/ и /etc/eltex-radius/certs/ совпадают
выполнить команду на двух нодах
systemctl restart eltex-radius.service
Настройка 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.
На обоих серверах должна быть запись такого типа:
Подготовка внешних нод баз данных
Подготовьте 3 дополнительных виртуальных машины для работы баз данных в калстере.
Установка 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"
#
# 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 настраиваем в нем следующие параметры:
[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"
Где:
Запуск первой ноды в Galera
Запуск происходит вручную с "первой ноды" (Администратор самостоятельно определяет первую ноду из перечня).
1) Перед запуском первой ноды прописываем в окружении переменную:
sudo systemctl set-environment MYSQLD_OPTS="--wsrep-new-cluster"
2) Выполняем рестарт сервера:
sudo systemctl restart mariadb
3) Подключаемся на хосте к 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 командой:
2) Затем проверяем статус:
3) Проверяем статус кластера на каждой ноде командами:
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
Конфигурация внешних нод для работы с контроллером SoftWLC
Добавляем репозитории Eltex (Данный раздел надо исправить на оф репо)
Добавляем ключ и адреса репозиториев, затем обновляем apt
Развертывание БД SoftWLC
Создание пользователя root, необходимого для установки пакетов "*-db":
Перенос БД с Первой ноды 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 добавляем пользователя:
После переноса БД, за счет синхронизации, она распространится на все ноды.
Установка пакета 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:
Для создания БД ELTEX_PORTAL, eltex_doors, eltex_ngw необходимо настроить подключение БД в сервисах eltex-portal/eltex-portal-constructor, eltex-doors, eltex-ngw и выполнить их рестарт. После рестарта они создадут соответствующие им БД.
Установка ProxySQL
Принимать все запросы от сервисов контроллера SoftWLC будет сервис под названием ProxySQL, его необходимо установить на обе ноды Контроллеров (не на ноды БД)
Скачиваем текущую актуальную версию ProxySQL на каждый хост SOftWLC:
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
Исправляем вывод файла логов на более обычную директорию:
Добавляем секцию с информацией о серверах MariaDB:
Добавляем информацию о пользователях БД:
Пример настройки:
#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;
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"
Изменение конфигураций
1) В файле /etc/eltex-pcrf/pcrf.json замените в ссылках конструкцию "jdbc:mysql://localhost/" на "jdbc:mysql://127.0.0.1:3306", в конце каждой измененной ссылке должен быть сегмент "&useSSL=false"
{
"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
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
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
# 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
# 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
во всех строках.
<?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" если он отсутствует.
# 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
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
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 строках.
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
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
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
<?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
<?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>
Добавление пользователя в таблицу NAS
Для доступа в Личный кабинет необходимо добавить соответствующие записи в таблицу NAS.
Данная таблица находится в БД eltex_auth_service и содержит адреса клиентов, имеющих право отправлять запросы на проведение авторизации пользователей. Если клиент не включен в эту таблицу, то запросы авторизации будут игнорироваться.
Для этого в личном кабинете в разделе Настройки → Серверные адреса добавить :
Смена настроек в 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 .