Архив

Редактировал(а) Антон Волков 2024/11/18 00:41

Блог - Публикации блога September 2024

сент. 24 2024

Настройка уведомлений о результатах выполнения планов обслуживания MSSQL

Входе настройки процедур резервного копирования баз данных в СУБД MS SQL Server присутствует необходимость отслеживания результатов выполнения планов обслуживания.

Рассмотрим два возможных варианта по уведомлению администраторов резервного копирования.

Настройка почтовых уведомлений

ВНИМАНИЕ!!! Для работы Database Mail требуется установка компонента Net Framework 3.5!!!

В MS SQL Server уже есть встроенный компонент, отвечающий за отправку почты который называется DatabaseMail, который мы можем найти в Object Explorer в каталоге Managment.

1727174326340-402.png

Тыкнув на него нам откроется мастер конфигурации:

1727174386150-365.png

Тыкаем на далее и выбираем первый пункт, в появившемся окошке жмем "YES"

1727174502484-619.png

Жмем указываем имя профиля, жмем Add и добавляем новый Mail Account, где заполняем имя аккаунта, почтовый адрес и настройки подключения к SMTP серверу.

1727174911839-116.png

Нажимаем Ок, Next и в следующем шаге назначаем нашего пользователя профилю.

1727175176170-433.png

Прощёлкиваем далее до конца и жмем закрыть.

Мы настроили компонент Database Mail, теперь необходимо добавить операторов, которым он будет слать уведомления по почте, для этого в Object Explorer переходим во вкладку SQL Server Agent и находим папку Operators, на которой щелкаем правой кнопкой и выпираем New Operator.

1727175466901-841.png

В открывшемся окне заполняем поля Name и E-mail name этого будет достаточно.

1727191514508-873.png

Теперь открываем наш Maintance Plan в котором необходимо настроить уведомления и добавляем элемент "Notify Operator Task", перетаскивая его на наш Maintace Plan

1727175843931-702.png

Теперь нам надо соединить задачу резервного копирования с задачей уведомления оператора и нажать на соединяющую их стрелку. В открывшемся окне выбрать в качестве Evaluation operation - Constraint, в качестве Value - Fail, для того что бы уведомление оператора происходило только при ошибке выполнения задания.

1727176953055-256.png

Сохраняем план обслуживания и ждем уведомлений на почту.

Настройка уведомлений через Telegram

MS SQL Server поддерживаем выполнение скриптов PowerShell через задания SQL Agent.

Отравлять уведомления в телегу будем как раз через PowerShell.

Скрипт:

$token = "35412311473:ADAM7WAcxvWEd1rYVRJev8jgC_dneLL6pxw"   # Полученный нами token 

$chat_id = "-88541191" # Тут указываем id чата
                                                                             
$name=[System.Net.Dns]::GetHostName() | Select 
$text1 = "Ошибка задания резервного копирования MSSQL "

$URI = "https://api.telegram.org/bot" + $token + "/sendMessage?chat_id=" + $chat_id + "&text=" + $text1 + "`n" + $name

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Invoke-WebRequest -URI ($URI) UseBasicParsing

Создаем задание SQL Agent:

 1727191628180-361.png

Добавляем шаг, вводим Step Name, выбираем тип задания PowerShell и вставляем наш скрипт и жмем ОК

1727191658807-862.png

Добавляем в наш план обслуживание выполнения задания 

1727178281093-555.png

1727178306659-555.png

Два раза тыкаем на задачи выполнения агента и выбираем наше задание.

1727178347921-284.png

Жмем ОК и сохраняем план обслуживания.

сент. 23 2024

Установка NetBox

Требования

 Устанавливать будем на FreeBSD 14.1, для Linux дистрибутивов шаги особо ничем не будут отличаться.

Для Netbox требуется сначала установить следующие компоненты:
PostgreSQL >= 12
Python = 3.10,3.11,3.12
Redis > 4.0
Для веб-сервера нам понадобиться Nginx.

Установка PostgreSQL

 Смотрим какие версии у нас есть в репозитории, нам нужна версия 10 или выше.

# pkg search postgresql

postgresql16-client-16.3       PostgreSQL database (client)
postgresql16-contrib-16.3      The contrib utilities from the PostgreSQL distribution
postgresql16-docs-16.3         The PostgreSQL documentation set
postgresql16-plperl-16.3       Write SQL functions for PostgreSQL using Perl5
postgresql16-plpython-16.3     Module for using Python to write SQL functions
postgresql16-pltcl-16.3        Module for using Tcl to write SQL functions
postgresql16-server-16.3       PostgreSQL is the most advanced open-source database available anywhere

 Ставим последнюю доступную версию:

# pkg install postgresql16-server

 Включаем службу и инициализируем СУБД:

# sysrc postgresql_enable="YES"
postgresql_enable:  -> YES
# service postgresql initdb

 Настраиваем pg_hba.conf

TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all           all             0.0.0.0/0             scram-sha-256

Где ADDRESS - IP адрес или сеть откуда мы сможем соединиться с нашей СУБД.

METHOD - метод авторизации, в данном случае это шифрованный пароль. (md5 - хешированный пароль).

 Редактируем postgresql.conf:

listen_addresses = '*'          #  '*' - слушает на всех интерфейсах, но можно оставить и localhost;
port = 5432                         # порт оставляем по умолчанию
max_connections = 600     #  на всякий случай увеличим количество соединений (100 по умолчанию

Запускаем службу:

# service postgresql start

 Подключаемся к СУБД

# psql -U postgres

 И создаем базу, пользователя netbox и даем пользователю права на базу:

CREATE DATABASE netbox;
CREATE USER netbox WITH PASSWORD 'P@ssw0rd!';
ALTER DATABASE netbox OWNER TO netbox;
GRANT CREATE ON SCHEMA public TO netbox; 

 Выходим, набирая \q.

 Далее можно проверить соединение с БД для пользователя netbox

# psql --username netbox --password --host localhost netbox

Установка Redis

 Устанавливаем пакет Redis (в разных дистрибутивах он может назваться по разному, например: redis-server) и проверяем версию, она должна быть не ниже 4.0.

# pkg install redis
# redis-server -v
Redis server v=7.2.5 sha=00000000:0 malloc=libc bits=64 build=a673021ce8a50e10

 Далее включаем службу и проверяем работоспособность сервиса.

# sysrc redis_enable="YES"
redis_enable:  -> YES
# service redis start
# redis-cli ping
PONG

Установка NetBox

 Перед установкой нам нужно доставить все зависимости, для разных дистрибутивов пакеты будут называться по разному, лучше обратиться к официальной документации

 Качаем последнюю стабильную версию с Github Releases  netbox-community/netbox (github.com) , распаковываем архив и ставим, возможно нас попросят доставить зависимости, например django.

# cd /usr/local/share
# wget https://github.com/netbox-community/netbox/archive/v4.1.1.tar.gz
# tar -xzf v4.1.1.tar.gz -C /usr/local/share/
# mv /usr/local/share/netbox-4.1.1 /usr/local/share/netbox
Или
# pkg install git
# git clone -b master --depth 1 https://github.com/netbox-community/netbox.git

 Создаем пользователя netbox и выдаем ему права на каталоги:

# adduser netbox
# chown -R netbox /usr/local/share/netbox/netbox/media/
# chown -R netbox /usr/local/share/netbox/netbox/reports/
# chown -R netbox /usr/local/share/netbox/netbox/scripts/

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

--- Активируем venv для Python например из каталога Netbox---
$ cd /usr/local/share/netbox/
$ pip install venv
$ python3.11 -m venv venv
$ . venv/bin/activate
(venv)$ pkg install py311-django50
(venv)$ pkg install py311-pip
(venv)$ pkg install rust
(venv)$ pkg install openjpeg
(venv)$ pkg install zlib-ng
(venv)$ pip install --upgrade pip setuptools wheel
(venv)$ pip install --upgrade pillow
(venv)$ cd /usr/local/share/netbox/
(venv)$ pip install -r requirements.txt

 Проваливаемся в каталог с конфигами NetBox и переименовываем пример файла конфигурации, который называется configuration.py.

(venv)$ cd /usr/local/share/netbox/netbox/netbox/
(venv)$ cp configuration_example.py configuration.py

В файле конфигурации вводим настройки соединения с базой Postgresql и Redis:

DATABASE = {
    'NAME': 'netbox',               # Database name
   'USER': 'netbox',               # PostgreSQL username
   'PASSWORD': 'P@ssw0rd!', # PostgreSQL password
   'HOST': 'localhost',            # Database server
   'PORT': '',                     # Database port (leave blank for default)
   'CONN_MAX_AGE': 300,            # Max database connection age (seconds)
}
REDIS = {
    'tasks': {
       'HOST': 'localhost',      # Redis server
       'PORT': 6379,             # Redis port
       'PASSWORD': '',           # Redis password (optional)
       'DATABASE': 0,            # Database ID
       'SSL': False,             # Use SSL (optional)
    },
   'caching': {
       'HOST': 'localhost',
       'PORT': 6379,
       'PASSWORD': '',
       'DATABASE': 1,            # Unique ID for second database
       'SSL': False,
    }
}

Указываем список имен FQDN или IP адресов с которых мы будем иметь доступ к сервису NetBox ('*' звездочка означает все доступные адреса), обычно эта запись дублирует имя и адрес хоста на котором стоит Netbox.

ALLOWED_HOSTS = ['netbox.example.com', 'localhost']

Устанавливаем SECRET_KEY, который является секретной, псевдослучайная строкой, используемой для помощи в создании новых криптографических хэшей для паролей и файлов cookie HTTP. Ключ, определенный здесь, не должен распространяться за пределами файла конфигурации. может быть изменен в любое время без влияния на сохраненные данные, однако имейте в виду, что это приведет к аннулированию всех существующих пользовательских сессий. Развертывания NetBox, состоящие из нескольких узлов, должны иметь один и тот же секретный ключ, настроенный на всех узлах.SECRET_KEY.

(venv)$ cd /usr/local/share/netbox
(venv)$ python3.11 netbox/generate_secret_key.py

 После выполнения скрипта, копируем секретный ключ в файл конфигурации configuration.py

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

# ln -s /usr/local/bin/python3.11 /usr/local/bin/python3
(venv)$ cd /usr/local/share/netbox/netbox
(venv)$ python3.11 manage.py migrate
(venv)$ python3.11 manage.py createsuperuser
(venv)$ python3.11 manage.py collectstatic --no-input

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

(venv)$ cd /usr/local/share/netbox/netbox
(venv)$ python3.11 manage.py runserver 0.0.0.0:8000 --insecure

Теперь мы можем зайти по адресу netbox.example.com:8000 под пользователем которого мы создали в предыдущем шаге. 

1727094875543-494.png

Настройка запуска в качестве службы

Для запуска сервиса будем использовать WSGI-сервер Gunicorn.

Ставим Gunicorn:

# pkg install py311-gunicorn

Если для дистрибутивов Linux примеры конфигурационных файлов сервисов лежать в каталоге /netbox-4.1.1/contrib/, то для freebsd скопируем текст скрипта сервиса в файл /usr/local/etc/rc.d/netbox

#!/bin/sh

# This sample rc script eliminate the need to use sysutils/py-supervisor to
# run NetBox as a system service. Only www/py-gunicorn is needed as a WSGI.
#
# Of course a working HTTP server like Apache/nginx is still required to make
# use of the gunicorn WSGI.
#

# PROVIDE: netbox
# REQUIRE: DAEMON
# KEYWORD: shutdown

# netbox_enable (bool): Set to NO by default.
#                       Set it to YES to enable netbox.
# netbox_config (str):  Default to "/usr/local/etc/${name}.conf}"
#                       Config file for gunicorn's netbox config file
# netbox_command (str): Default to "/usr/local/share/netbox/venv/bin/gunicorn"
#                       Path to gunicorn to run netbox
# netbox_bind (str):    Default to "localhost:8001"
#                       Interface and port to bind to
# netbox_workers (int): Default to "3"
#                       Number of gunicorn works
# netbox_timeout (int): Default to "120"
#                       Worker timeout for gunicorn


. /etc/rc.subr

name="netbox"
rcvar=netbox_enable
netbox_path=/usr/local/share/netbox/netbox/

load_rc_config $name

start_precmd="netbox_precmd"
command=${netbox_program:-/usr/local/share/netbox/venv/bin/gunicorn}
procname=${netbox_procname:-/usr/local/share/netbox/venv/bin/python3.11}
netbox_chdir=${netbox_path}
pidfile=${netbox_pidfile:-/var/run/${name}/${name}.pid}
netbox_user=${netbox_user:-netbox}
netbox_bind=${netbox_bind:-localhost:8001}
netbox_workers=${netbox_workers:-3}
netbox_timeout=${netbox_timeout:-120}

command_args="${netbox_args} -D \
        --log-syslog --log-syslog-prefix 
${name} \
        --log-syslog-to unix:///var/run/log#dgram \
        --disable-redirect-access-to-syslog \
        -p 
${pidfile} --pythonpath ${netbox_chdir} \
        -b 
${netbox_bind} -w ${netbox_workers} -t ${netbox_timeout} \
        netbox.wsgi"


netbox_precmd()
{
        install -d -o ${netbox_user} 'dirname ${pidfile}'
}

run_rc_command "$1"

Добавляем записи в rc.conf и разрешаем выполнение rc-скрипта

# sysrc netbox_enable="YES"
# chmod +x /usr/local/etc/rc.d/netbox

 Теперь можно запускать службу.

P.S. После запуска службы лично она у меня сразу грохалась с ошибкой создания .pid файла, для этого я создал заранее каталог для pid файла netbox и сделал пользователя netbox его владельцем

# mkdir /var/run/netbox
# chown netbox /var/run/netbox

Создание SSL сертификата

Для работы через протокол https нам потребуется сертификат, мы может сгенерировать самоподписанный сертификат на 10 лет командой:

# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/ssl/private/netbox.key \
-out /etc/ssl/certs/netbox.crt

Но в моем случае, при наличии доменного центра сертификации я сгенерирую запрос на выдачу сертификата.

Для этого необходимо создать конфигурационный файл, например netbox_openssl.cnf:

[req]
distinguished_name=req_distinguished_name
promt = no
[ req_distinguished_name ]
commonName = FQDN of server
commonName_default = APACHE-SERVER.mydom.com
countryName = Country Name (2 letter code)
countryName_default = RU
0.organizationName = Organization Name (eg, company)
0.organizationName_default = MyCompany
localityName = Locality Name (eg, city)
localityName_default = Moscow
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = MOSCOW
subjectAltName = domain name
subjectAltName_default = example.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = netbox.example.com
IP.1 = 172.16.1.100

Создаем закрытый ключ и запрос на сертификат:

# openssl genrsa -out netbox.example.com.key 2048
# openssl req -new -key netbox.example.com.key -config netbox_openssl.cnf -reqexts req_ext -out netbox.csr

По запросу выдаем сертификат и кидаем к нам на сервер.

Установка NGINX в качестве обратного прокси

Перед тем как ставить nginx нам надо создать каталог static если мы его еще не создали.

# ln -s /usr/local/bin/python3.11 /usr/local/bin/python3

И запускаем скрипт:

# chown -R netbox /usr/local/share/netbox-4.1.1/venv
$ sh /usr/local/share/netbox-4.1.1/upgrade.sh

Ставим nginx и включаем службу:

# pkg install nginx
# sysrc nginx_enable="YES"

Редактируем конфиг nginx где указываем location и пути до наших сертиков:

Запускаем службу и пробуем войти в netbox https://netbox.example.com

Настройка housekeeping

Для очистки старых заданий и очередей необходимо настроить housekeeping

открываем cron и вставляем туда команду:

/usr/local/bin/python3.11 /usr/local/share/netbox/netbox/manage.py housekeeping

 Или создаем  скрипт

Настройка Netbox RQ

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

Например мы сначала цепляем скрипт, а потом создаем задачу на его выполнение:

1728652313316-346.png

 

1728652385802-848.png

Для запуска службы нам по аналогии со службой netbox нужно создать файл скрипта службы:

#!/bin/sh

# This sample rc script starts the RQ worker background service which is
# required for Webhooks and various automation tasks.

#
# PROVIDE: netbox_rq
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# Add the following line to /etc/rc.conf.local or /etc/rc.conf
# to enable netbox-rq:
#
# netbox_rq_enable (bool):              Set to NO by default.
#                                       Set it to YES to enable netbox_rq.

. /etc/rc.subr

name=netbox_rq
rcvar=netbox_rq_enable

load_rc_config $name

start_cmd="netbox_rq_start"
start_precmd="netbox_rq_precmd"
command="/usr/local/share/netbox/venv/bin/python3.11"
command_args="/usr/local/share/netbox/netbox/manage.py rqworker"
pidfile=${netbox_rq_pidfile:-/var/run/${name}/${name}.pid}
netbox_rq_user=${netbox_rq_user:-netbox}


netbox_rq_precmd()
{
        install -d -o ${netbox_rq_user} `dirname ${pidfile}`
}

netbox_rq_start()
{
       echo "Starting netbox_rq."
        /usr/sbin/daemon -cf -p ${pidfile} -u ${netbox_rq_user} ${command} ${command_args}
}

run_rc_command "$1"

Дать разрешение на выполнения файла скрипта и добавить его rc.conf:

# chmod +x /usr/loca/etc/rc.d/netbox_rq
# sysrc netbox_rq_enable="YES"
# service netbox_rq start

сент. 16 2024

Установка FTP сервера ProFTP на Feebsd 14.1

Установка proftpd

# pkg install proftpd
# sysrc proftpd_enable="YES"

Далее создаем пользователя

# adduser ftp

 Указываем в мастере группу ftp.

Настройка базовой аутентификации по пользователи и паролю

Узнаем идентификатор пользователя и группы ftp:

# cat /etc/passwd

ftp:*:1002:14:ftp:/ftp:/usr/sbin/nologin

# cat /etc/group

ftp:*:14:

Далее нам необходимо сгенерировать файл ftp.passwd и ftp.group для виртуального пользователя, для этого необходимо использовать утилиту ftpasswd,  поскольку это perl-скрипт, нам надо установить среду perl:

# pkg install perl5
# ftpasswd --passwd --file=/usr/local/etc/proftpd/ftpd.passwd --name=ftp --uid=1002 --gid=14 --home=/srv/ftp/test/ --shell=/bin/false
# ftpasswd --group --name=ftp --file=/usr/local/etc/proftpd/ftpd.group --gid=14 --member ftp

открываем конфигурационный файл /usr/loca/proftpd/etc/proftpd.conf

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

# service proftpd start

Если при запуске службы будет вылазить ошибка: unable to use world-readable AuthUserFile ‘/use/local/etc/proftpd/ftpd.passwd’: Операция не позволена,

То раздадим права доступа:

chmod 640 /use/local/etc/proftpd/ftpd.passwd

chown proftpd:root /use/local/etc/proftpd/ftpd.passwd

Настройка анонимного доступа

Тут все тоже самое только конфигурационный файл будет отличаться.