СУБД
В качестве СУБД используется PostgreSQL версии 12 и выше. СУБД PostgreSQL хранит технические данные для работы BI.ZONE EDR: агенты, задачи, группы, лицензии и т.д.
В последующих релизах BI.ZONE EDR поддержка PostgreSQL для хранения файлов может быть отключена. Рекомендуется настроить Сервер управления на использование S3-хранилища.
Если у вас уже настроен pg_cron с отдельным пользователем, то добавьте его в конфигурационный файл сервера: database.
PostgreSQL уже установлен
Если у вас уже установлен PostgreSQL (например, при развертывании Хранилища телеметрии), то выполните дополнительные настройки.
Чтобы дополнительно настроить PostgreSQL:
Создайте новую роль и БД со следующими правами:
docker exec -it postgres psql -U postgres CREATE USER <user> WITH PASSWORD '<password>'; CREATE DATABASE <edr_db> OWNER <edr_db_user>; GRANT ALL PRIVILEGES ON DATABASE <edr_db> TO <edr_db_user>; GRANT ALL PRIVILEGES ON SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO <edr_db_user>; \qНастройте pg_cron (опционально с версии EDR сервера 1.37):
#Вместо edr_db укажите имя вашей БД, созданной на шаге ранее docker exec -it postgres psql -U postgres -d edr_db \conninfoВы должны увидеть следующую строку:
You are connected to database "edr_db" as user "postgres"Выполните команды:
CREATE EXTENSION pg_cron; #В этой строке и далее вместо edr_db_user подставьте имя роли, созданной на шаге ранее GRANT USAGE ON SCHEMA cron TO edr_db_user; GRANT ALL ON ALL TABLES IN SCHEMA cron TO edr_db_user; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA cron TO edr_db_user; GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA cron TO edr_db_user;
PostgreSQL не установлен
Если у вас отсутствует PostgreSQL, выполните действия по установке и настройке ниже.
Для установки и настройки СУБД PostgreSQL:
Установите необходимые пакеты PostgreSQL:
Пример для DEB:
apt install -y postgresql-common /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh #Добавление репозитория PostgreSQL в менеджер пакетовapt update apt install postgresql postgresql-contrib postgresql-15-cronПример для RPM:
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install postgresql15-server postgresql15-contrib.x86_64 pg_cron_15/usr/pgsql-15/bin/postgresql-15-setup initdb #Инициализация БД только для RPM
Перейдите к файлу конфигурации:
/etc/postgresql/15/main/postgresql.conf.Примечание: путь может отличаться в зависимости от версии ОС и варианта установки PostgreSQL.
Воспользуйтесь калькулятором для расчета параметров и внесите значения из калькулятора в конфигурационный файл:
listen_addresses = 'localhost' #указать адрес сервера postgresql #Вместо звездочек ниже — ваши значения из https://www.pgconfig.org/ #Максимальное количество клиентских соединений, которые могут быть активны одновременно max_connections = **** #Количество памяти, выделенное PostgreSQL для кеширования данных shared_buffers = **** #Максимальный размер кеша PostgreSQL effective_cache_size = *** #Размер памяти, выделенной для выполнения операций обслуживания, таких как VACUUM, CREATE INDEX и т.д. maintenance_work_mem = *** #Целевое время завершения чекпоинта в секундах checkpoint_completion_target = *** #Размер буфера, используемого для записи в журнал предварительной записи (WAL) (Write-Ahead Log) wal_buffers = **** #Параметр, который определяет целевой уровень статистики для плана выполнения запросов default_statistics_target = *** #Стоимость чтения одной страницы дискового хранилища. Указывается в единицах планов выполнения запросов (CU) random_page_cost = *** #Максимальное количество одновременных операций ввода-вывода, которые могут быть выполнены PostgreSQL effective_io_concurrency = **** #Размер памяти, выделенной для сортировки и хеширования work_mem = *** #Минимальный размер WAL min_wal_size = *** #Максимальный размер WAL max_wal_size = *** shared_preload_libraries = 'pg_cron' #Укажите любое имя БД, ниже в инструкции вместо edr_db указывайте это же название cron.database_name = 'edr_db'Перейдите к конфигурационному файлу:
/etc/postgresql/15/main/pg_hba.conf.Примечание: конфигурационный файл pg_cron использует libpq, чтобы открыть новое соединение с локальной базой данных. Может потребоваться включить доверительную аутентификацию для соединений, идущих от localhost в pg_hba.conf для пользователя, выполняющего задание cron. Кроме того, вы можете добавить пароль в файл .pgpass, который libpq будет использовать при открытии соединения
Для настройки используйте пример рабочей конфигурации:
#Каждая строка в этом файле определяет одну запись конфигурации, которая указывает, какие пользователи могут подключаться к базе данных, откуда они могут подключаться и какие методы аутентификации они могут использовать. Необходимо настраивать pg_hba.conf таким образом, чтобы разрешалось подключение только для доверенных пользователей и из доверенных сетей, используя надежные методы аутентификации. #TYPE: тип подключения. Возможные значения: local (локальное подключение), host (удаленное подключение), hostssl (удаленное подключение через SSL), hostnossl (удаленное подключение без SSL). #DATABASE: имя базы данных, к которой пытается подключиться пользователь. Возможные значения: all (для всех баз данных) или имя конкретной базы данных. #USER: имя пользователя, который пытается подключиться к базе данных. Возможные значения: all (для всех пользователей) или имя конкретного пользователя. #ADDRESS: адрес клиента или подсеть, из которой разрешено подключение. Может быть указан в формате CIDR. #METHOD: метод аутентификации, который должен использоваться для этого подключения. Возможные значения: trust (не требует пароля), md5 (пароль в хешированном виде), password (пароль в открытом виде), peer (используется для локальных подключений Unix-сокета), scram-sha-256 (используется для SCRAM-SHA-256 аутентификации) и т.д. # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only #local all all peer # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the replication privilege. #local replication all peer host all all 0.0.0.0/0 password host all pguser 0.0.0.0/0 password local all all trustЗапустите базу данных:
systemctl enable postgresql.service systemctl start postgresql.service systemctl status postgresql.serviceСоздайте новую роль в БД с правами:
Пример для DEB:
sudo -i -u postgres psql CREATE USER <user> WITH PASSWORD '<password>'; CREATE DATABASE <edr_db> OWNER <edr_db_user>; GRANT ALL PRIVILEGES ON DATABASE <edr_db> TO <edr_db_user>; GRANT ALL PRIVILEGES ON SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO <edr_db_user>; \qПример для RPM:
psql -U postgres CREATE USER <user> WITH PASSWORD '<password>'; CREATE DATABASE <edr_db> OWNER <edr_db_user>; GRANT ALL PRIVILEGES ON DATABASE <edr_db> TO <edr_db_user>; GRANT ALL PRIVILEGES ON SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO <edr_db_user>; GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO <edr_db_user>; \q
Настройте pg_cron:
Пример для DEB:
sudo -i -u postgres #Вместо edr_db укажите имя вашей БД, созданной на шаге ранее psql -d edr_db \conninfoПример для RPM:
psql -U postgres -d edr_dbВы увидите следующую строку:
You are connected to database "edr_db" as user "postgres"Выполните команды:
CREATE EXTENSION pg_cron; #В этой строке и далее вместо edr_db_user подставьте имя роли, созданной на шаге ранее GRANT USAGE ON SCHEMA cron TO edr_db_user; GRANT ALL ON ALL TABLES IN SCHEMA cron TO edr_db_user; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA cron TO edr_db_user; GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA cron TO edr_db_user;
При возникновении дополнительных вопросов используйте документацию решения:
Отказ от pg_cron
Если вы по каким-либо причинам не желаете использовать pg_cron, то для правильной и бесперебойной работы базы данных необходимо настроить bash-скрипт, который с помощью cron будет запускаться по расписанию.
Чтобы настроить bash-скрипт:
Создайте скрипт
postgres.shсо следующим содержимым:#!/bin/bash # Параметры подключения к PostgreSQL в Docker CONTAINER_NAME="postgres" # Имя контейнера с PostgreSQL PG_HOST="ip" # IP хоста, на котором производится установка PG_PORT="5432" # Порт PostgreSQL PG_DB="edr_db" # Имя базы данных, которую создали на предыдущих шагах PG_USER="edr_db_user" # Пользователь PostgreSQL, которого создали на предыдущих шагах PG_PASSWORD="your_password" # Пароль от пользователя, которого создали на предыдущих шагах # Функция для выполнения SQL-запроса внутри контейнера PostgreSQL run_psql_in_docker() { local query="$1" docker exec -i "$CONTAINER_NAME" psql -U "$PG_USER" -d "$PG_DB" -c "$query" } ### 1. Ежемесячный запуск (1-го числа в 00:00) if [ "$(date +'%d')" == "01" ]; then echo "[$CURRENT_DATE] Запуск action_logs_partition_maintenance()" run_psql_in_docker "SELECT action_logs_partition_maintenance();" fi ### 2. Ежедневный запуск (VACUUM) echo "[$CURRENT_DATE] Запуск VACUUM для agent_last_seens" run_psql_in_docker "VACUUM (VERBOSE, ANALYZE) agent_last_seens;"Сделайте скрипт
postgres.shисполняемым:chmod +x postgres.shОткройте редактор crontab:
crontab -eДобавьте запись с вашим сценарием:
0 1 * * * /полный/путь/к/postgres.sh