настройка загрузчика
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl stop dots-core
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl start dots-core
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl is-active --quiet dots-core
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl stop dots-state-detector
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl start dots-state-detector
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl is-active --quiet dots-state-detector
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl stop dots-scheduler
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl start dots-scheduler
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl is-active --quiet dots-scheduler
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl stop vmts-upld-db0-tdtp
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl start vmts-upld-db0-tdtp
dots ALL=(ALL:ALL) NOPASSWD:/bin/systemctl is-active --quiet vmts-upld-db0-tdtp
Расписать шаги по запуску скрипта как из веба так и из консоли
1 Авторизироваться в системе DOTS, на том сервере, где заведен и находится объект мониторинга.
2 Перейти по адресу https://<your_server>/api/v1/update_service/docs
3 Вызвать метод /api/v1/auth/sigup, нажать "Try it out", указать идентификатор коробки, нажать кнопку "Execute". Ниже вы увидете уникальный токен доступа, скопируете и сохраните. В дальнейшем этот токен необходимо проаписать в конфиге БЕ.
Запустить скрипт box_dump.sh
#!/bin/bash
# скрипт создания дампа для коробок
PG_SERVER_ADDR="127.0.0.1:5434"
DB_NAME="dots"
CONN_STRING="postgresql://postgres:postgres@$PG_SERVER_ADDR/$DB_NAME"
DUMP_FILENAME="/home/ksg/box/dots-box-$(date +%Y-%m-%d_%H-%M).psql"
# echo $DUMP_FILENAME
QUERY="SELECT util.f_get_box_pgdump_command(dbname := '$CONN_STRING', compress := 0::int2, file := '$DUMP_FILENAME');"
PGDUMP_COMMAND=$(psql --dbname=$CONN_STRING -t -c "$QUERY" | cut -c 2- -)
PGDUMP_COMMAND="/usr/lib/postgresql/14/bin/$PGDUMP_COMMAND"
# echo $PGDUMP_COMMAND
$PGDUMP_COMMAND
POST_PGDUMP_COMMAND=$(psql --dbname=$CONN_STRING -t -c "SELECT util.f_get_box_pgdump_post_statements(true);" | cut -c 2- -)
echo -e $POST_PGDUMP_COMMAND >> $DUMP_FILENAME
Через копирование файла
zcat <your_dump_name>.psql.gz | psql --dbname=dots --host=localhost --port=5432 --username=postgres
Через открытый порт на коробке
zcat <your_dump_name>.psql.gz | psql --dbname=postgres --host=<your_ip_box> --port=5432 --username=postgres
Password fot user postgres: postgres
Перейти в каталог /opt/dots и склонировать репозиторий БЕ
cd /opt/dots
git clone http://gitlab.skrt.biz/root/dots-backend.git
chown -R dots: dots-backend
Cкопировать папку с ФЕ нужной версии в каталог /opt/dots/frontend
scp -r root@server.my:/home/dir/ /opt/dots/frontend
За версиями визуализатора обращаться к Владу
Проверить ветку в репозитории
cd /opt/dots/dots-backend
git branch
Репозиторий должен быть на ветке master. Если это не так, то нужно переключиться на ветку master
cd /opt/dots/dots-backend
git checkout master
Установка библиотек для python3.5
source /opt/dots/.virtualenvs/venv-3.5/bin/activate
cd /opt/dots/dots-backend
pip install -r requirements_3_5.txt
deactivate
Установка библиотек для python3.8
source /opt/dots/.virtualenvs/venv-3.8/bin/activate
cd /opt/dots/dots-backend
pip install -r requirements_3_8.txt
deactivate
Скомпилировать код написанный на С
cd /opt/dots/dots-backend/application/business_layer/libs/C
make
Перейдите в /opt/dots/dots-backend/ и создайте папку local_config, в которой поместить файл local_config.py
cd /opt/dots/dots-backend/
mkdir local_config
cd local_config
nano local_config.py
LOCAL_CONFIG = 'local_config/local_config.py'
DEBUG = True
MAX_CONTENT_LENGTH = 32 * 1024 * 1024 # 1 MB
# NOTE: REST API parameters
API_PARAMS = {
'session_duration': 7 * 24 * 3600,
'upload_path': u'/opt/dots-backend/local_config/upload/',
'upload_url': u'http://88.198.22.132/upload/',
}
# NOTE: Flask parameters
APPLICATION_PARAMS = {
'debug': 0,
'address': '127.0.0.1',
'port': 5000,
}
# NOTE: PostgreSQL parameters
DATABASE_PARAMS = {
'debug': 0,
'database': 'dots',
'user': 'backend',
'password': 'backend',
'host': '127.0.0.1',
'port': 5432,
'connect_timeout': 5,
# NOTE: Настройка для пула 'pool' не входит в libpq
'pool': {
'minconn': 1,
'maxconn': 1,
}
}
# NOTE: Redis parameters
REDIS_PARAMS = {
'host': '127.0.0.1',
'port': 6379,
'maxconn': 5
}
# NOTE: Logging parameters
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'info_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.INFO',
},
'debug_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.DEBUG',
},
'error_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.ERROR',
},
'critical_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.CRITICAL',
},
'warning_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.WARNING',
},
'audit_filter': {
'()': 'application.loggex.CustomFilter',
'level': 'logging.AUDIT',
},
'require_debug_true': {
'()': 'config_filters.RequireDebugTrue',
},
'require_debug_false': {
'()': 'config_filters.RequireDebugFalse',
},
},
'formatters': {
'info': {
'format': "%(levelname)s: %(message)s",
'datefmt': "%H:%M:%S %d.%m.%Y ",
},
'debug': {
'format': "%(levelname)s:%(name)s:\n%(message)s "
"(%(asctime)s)",
'datefmt': "%H:%M:%S %d.%m.%Y ",
},
'production': {
'format': "~~~~~~~~~~\n%(asctime)s\n%(message)s ",
'datefmt': "%Y-%m-%d %H:%M:%S ",
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'formatter': 'debug',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'debug_rotate_file': {
'level': 'DEBUG',
'formatter': 'production',
'class': 'application.loggex.MultiprocessHandler',
'filename': '/opt/dots/logs/dots-core/debug.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 3,
'filters': ['debug_filter'],
},
'error_rotate_file': {
'level': 'ERROR',
'formatter': 'production',
'class': 'application.loggex.MultiprocessHandler',
'filename': '/opt/dots/logs/dots-core/error.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 3,
'filters': ['error_filter'],
},
'critical_rotate_file': {
'level': 'CRITICAL',
'formatter': 'production',
'class': 'application.loggex.MultiprocessHandler',
'filename': '/opt/dots/logs/dots-core/critical.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 3,
'filters': ['critical_filter'],
},
'warning_rotate_file': {
'level': 'WARNING',
'formatter': 'production',
'class': 'application.loggex.MultiprocessHandler',
'filename': '/opt/dots/logs/dots-core/warning.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 3,
'filters': ['warning_filter'],
},
'audit_rotate_file': {
'level': 'AUDIT',
'formatter': 'production',
'class': 'application.loggex.MultiprocessHandler',
'filename': '/opt/dots/logs/dots-core/audit.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 3,
'filters': ['audit_filter'],
},
},
'loggers': {
'': {
'handlers': [
'console',
'debug_rotate_file',
'error_rotate_file',
'critical_rotate_file',
'warning_rotate_file',
'audit_rotate_file',
],
'level': 'DEBUG',
},
}
}
JSONIFY_PRETTYPRINT_REGULAR = False
Перейдите в /opt/dots/dots-backend/application/business_layer/calculator/notification_handler и отредактировать необходимые значения
cd /opt/dots/dots-backend/application/business_layer/calculator/notification_handler
nano config.py
# coding=utf-8
PREV_POINT_TIME_WIDTH = 900
# доп. настройка для пула, не входит в libpq.
DATABASE_PARAMS = {
'database': 'dots',
'user': 'backend',
'password': 'backend',
'host': '127.0.0.1',
'port': '5432',
}
REDIS = {
'host': '127.0.0.1',
'port': 6379,
'maxconn': 5
}
# PARAM_CACHE = {'length': 31, # days
# 'role': 'w'} # r - reader, w - writer, rw - reader&writer
FILTERS = {'aggregator': [], 'state': []} # для фильтрации - указать идентификаторы
STATISTICS_PERIOD = 60 # период обновления статистики, сек.
CHANNEL = 'task'
CHANNEL_TIMEOUT = 5
PROCESSES = 4
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'info': {
'format': "%(levelname)s: %(message)s",
'datefmt': "%H:%M:%S %d.%m.%Y ",
},
'error': {
'format': "~~~~~~~~~~\n%(asctime)s\n%(message)s ",
'datefmt': "%Y-%m-%d %H:%M:%S ",
},
'production': {
'format': "~~~~~~~~~~\n%(asctime)s\n%(message)s ",
'datefmt': "%Y-%m-%d %H:%M:%S ",
},
},
'handlers': {
'production_info_stream': {
'level': 'INFO',
'formatter': 'info',
'class': 'logging.StreamHandler',
},
'production_error_rotate_file': {
'level': 'ERROR',
'formatter': 'error',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/dots/logs/dots-state-detector/error.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 10,
},
'production_critical_rotate_file': {
'level': 'CRITICAL',
'formatter': 'production',
#'filters': ['require_debug_false'],
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/dots/logs/dots-state-detector/critical.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 10,
},
},
'loggers': {
'': {
'handlers': [
'production_info_stream',
'production_error_rotate_file',
'production_critical_rotate_file',
],
'level': 'INFO',
},
'gipc': {
'level': 'ERROR'
},
}
}
В качестве оптимизации можно изменить следующие параметры
PREV_POINT_TIME_WIDTH - (рекомендованные значения 300-900)
PROCESSES - (зависит от вычислительных мощностей коробки, рекомендованные значения 2-4)
Перейдите в /opt/dots/dots-backend/application/business_layer/calculator/scheduler и отредактировать необходимые значения
cd /opt/dots/dots-backend/application/business_layer/calculator/scheduler
nano config.py
# доп. настройка для пула, не входит в libpq.
DATABASE_PARAMS = {
'database': 'dots',
'user': 'backend',
'password': 'backend',
'host': '127.0.0.1',
'port': '5432',
}
CHANNEL = 'scheduler'
REDIS = {
'host': '127.0.0.1',
'port': 6379,
'maxconn': 5
}
STATISTICS_PERIOD = 60 # период обновления статистики, сек.
PROCESSES = 1
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'info': {
'format': "%(levelname)s: %(message)s",
'datefmt': "%H:%M:%S %d.%m.%Y ",
},
'error': {
'format': "~~~~~~~~~~\n%(asctime)s\n%(message)s ",
'datefmt': "%Y-%m-%d %H:%M:%S ",
}
},
'handlers': {
'production_info_stream': {
'level': 'INFO',
'formatter': 'info',
'class': 'logging.StreamHandler',
},
'production_error_rotate_file': {
'level': 'ERROR',
'formatter': 'error',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/dots/logs/dots-scheduler/error.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 10,
}
},
'loggers': {
'': {
'handlers': [
'production_info_stream',
'production_error_rotate_file'
],
'level': 'INFO',
},
'gipc': {
'level': 'ERROR'
},
}
}
В качестве оптимизации можно изменить следующие параметры
PROCESSES - (зависит от вычислительных мощностей коробки, рекомендованные значения 3-9)
Зачем mrp-updater на коробке?
Изменить кол-во процессов и текущие каталоги с афайлами-метками от программ приема данных
PATH = '/opt/dots/mrp'
PATH_ONLINE = '/opt/dots/mrvl/dots'
PROCESSES = 4
# доп. настройка для пула, не входит в libpq.
DATABASE_PARAMS = {
'database': 'dots',
'user': 'backend',
'password': 'backend',
'host': '127.0.0.1',
'port': '5432',
}
REDIS = {
'host': '127.0.0.1',
'port': 6379,
'maxconn': 5
}
STATISTICS_PERIOD = 60 # период обновления статистики, сек.
PATH = '/opt/dots/mrp'
PATH_ONLINE = '/opt/dots/mrvl/dots'
PROCESSES = 4
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'info': {
'format': "%(levelname)s: %(message)s",
'datefmt': "%H:%M:%S %d.%m.%Y ",
},
'error': {
'format': "~~~~~~~~~~\n%(asctime)s\n%(message)s ",
'datefmt': "%Y-%m-%d %H:%M:%S ",
}
},
'handlers': {
'production_info_stream': {
'level': 'INFO',
'formatter': 'info',
'class': 'logging.StreamHandler',
},
'production_error_rotate_file': {
'level': 'ERROR',
'formatter': 'error',
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/opt/dots/logs/dots-mrp-updater/error.log',
'encoding': 'utf8',
'maxBytes': 1024 * 1024, # 1MB
'backupCount': 10,
}
},
'loggers': {
'': {
'handlers': [
'production_info_stream',
'production_error_rotate_file'
],
'level': 'INFO',
},
'gipc': {
'level': 'ERROR'
},
}
}
Используется как обертка над dots-core для развертывания сервера приложений
Требуется установленный системный пакет
apt-get install uwsgi (пристутвует в requirements.system репозитория dots-backend)
Основная конфигурация хранится по абсолютному пути в файле
/opt/dots/configs/dots_uwsgi.ini
[uwsgi]
chdir = /opt/dots/dots-backend # абсолютный путь к проекту
uid = www-data # системный пользователь
gid = www-data # системная группа
chown-socket = www-data
manage-script-name = true
mount = /=run:app # точка монтирования приложения
lazy-apps = true
need-app = true # Этот параметр предотвращает запуск uWSGI, если он не может найти или загрузить модуль приложения.
touch-chain-reload = /opt/dots/configs/reload_file
workers = 32 # кол-во воркеров в системе, но не более чем кол-во процессоров с гипертрейдингом
logto = /opt/dots/logs/uwsgi/uwsgi.log
log-maxsize = 2000000
log-date = true
buffer-size = 32768
pidfile = /opt/dots/shared/uwsgi.pid # файл с идентификатором процесса
socket = /opt/dots/shared/uwsgi.sock # файл с linux сокетом
stats = /opt/dots/shared/uwsgi.stats
virtualenv = /opt/dots/.virtualenvs/venv-3.5 # путь к переменному окружению
Непосредственно связано с Настройка dots-core
Описание конфига нужно дополнить
server {
listen 80; # порт, прописываемый в строке браузера
access_log /opt/dots/logs/nginx/DOTS.access.log;
error_log /opt/dots/logs/nginx/DOTS.error.log;
client_max_body_size 32m;
proxy_connect_timeout 6000;
proxy_send_timeout 6000;
proxy_read_timeout 6000;
send_timeout 6000;
root /opt/dots/frontend/visualizator;
location /api/v1 {
include uwsgi_params;
uwsgi_pass unix:/opt/dots/shared/uwsgi.sock;
}
location = / {
try_files $uri $uri/index.html $uri.html =404;
break;
}
location /update {
proxy_pass http://localhost:9000/api/v1/configuration/update;
}
}
Перейдите в папку /lib/systemd/system/ и создайте файл dots-core.service
cd /lib/systemd/system/
nano dots-core.service
[Unit]
Description=uWSGI instance to serve dots app in python3.5
Wants=ssh-tunnel.service
After=ssh-tunnel.service
[Service]
ExecStart=/bin/bash -c \
'cd /opt/dots/configs; \
source /opt/dots/.virtualenvs/venv-3.5/bin/activate; \
uwsgi --ini dots_uwsgi.ini --stats /opt/dots/shared/stats.sock'
ExecStop=/bin/bash -c 'cd /opt/dots/shared ;kill -INT `cat uwsgi.pid`'
ExecReload=/bin/bash -c 'cd /opt/dots/configs; touch reload_file'
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Перейдите в папку /lib/systemd/system/ и создайте файл dots-state-detector.service
cd /lib/systemd/system/
nano dots-state-detector.service
[Unit]
Description=DOTS state detector
After=syslog.target
After=network.target
[Service]
Type=simple
User=dots
Group=dots
Environment="PYTHONPATH=/opt/dots/dots-backend"
WorkingDirectory=/opt/dots/dots-backend
ExecStart=/opt/dots/.virtualenvs/venv-3.5/bin/python3.5 /opt/dots/dots-backend/application/business_layer/calculator/notification_handler/calc_state_after_notification.py
LimitNOFILE=4096
Restart=always
WatchdogSec=3600
RestartSec=3
[Install]
WantedBy=default.target
Перейдите в папку /lib/systemd/system/ и создайте файл dots-scheduler.service
cd /lib/systemd/system/
nano dots-scheduler.service
Description=DOTS scheduler
After=syslog.target
After=network.target
[Service]
Type=simple
User=dots
Group=dots
Environment="PYTHONPATH=/opt/dots/dots-backend"
WorkingDirectory=/opt/dots/dots-backend
ExecStart=/opt/dots/.virtualenvs/venv-3.5/bin/python3.5 /opt/dots/dots-backend/application/business_layer/calculator/scheduler/app.py
LimitNOFILE=4096
[Install]
WantedBy=default.target
Перейдите в папку /lib/systemd/system/ и создайте файл dots-updater.service
cd /lib/systemd/system/
nano dots-updater.service
Description=DOTS updater
After=syslog.target
After=network.target
[Service]
Type=simple
User=dots
Group=dots
Environment="PYTHONPATH=/opt/dots/dots-backend"
WorkingDirectory=/opt/dots/dots-backend
ExecStart=/opt/dots/.virtualenvs/venv-3.8/bin/python3.8 /opt/dots/dots-backend/application/business_layer/calculator/configuration_updater/client.py
LimitNOFILE=4096
[Install]
WantedBy=default.target
После создания файлов всех сервисов, выполнить:
systemctl daemon-reload
systemctl start dots-updater
Для того чтобы создать конфигурацию объекта мониторинга на базовом сервере необходимо:
Убедиться что сервис dots-updater.service запущен на коробке
systemctl status dots-updater
Для того чтобы загрузить первую конфигурацию на коробку необходимо выполнить команду в консоле:
curl -X POST http://127.0.0.1/update
После завершения на базовом сервере в таблице "object".i_box_update_log можно будет увидеть статус обновления и сообщение ошибки в случае возникновения.
SELECT * FROM "object".i_box_update_log
WHERE i_box_id = <your_box_id>
SELECT ibul.* FROM "object".i_box_update_log ibul
JOIN "object".i_box ib ON ib.id = ibul.i_box_id
WHERE ib.i_object_id = <your_object_id>
При установке/обновлении конфигурации уже добавляются предустановленные задания для шедулера. Вы можете их изменить исходя из возможностей компьютера:
systemctl start dots-core dots-state-detector dots-scheduler