Документация проекта: Развертывание конфигурации HAProxy по событию через systemd path
1. Архитектурное описание
Комплекс предназначен для мгновенного и контролируемого отката/применения резервной конфигурации балансировщика HAProxy по клику оператора с рабочей станции Windows.
Вместо периодического опроса через cron система использует событийную модель ядра Linux (inotify) через связку systemd path + systemd service, что обеспечивает нулевую задержку реакции и отсутствие холостых запусков скрипта.
[ Рабочая станция Windows ]
|
(Ярлык на рабочем столе)
|
deployfile.exe (.NET 4.8)
|
| (1. SSH-сессия: ed25519)
| (2. Запись status/change.me + status/sha256.hash)
v
[ Linux-сервер (HAProxy) ]
/var/lib/depfile/status/change.me
|
(Событие inotify: IN_CLOSE_WRITE)
v
depfile-watcher.path (systemd)
| (Активирует однократный сервис)
v
depfile-watcher.service (systemd: oneshot)
| (Запуск /usr/local/bin/deploy_haproxy.sh)
|
|-- 1. Валидация SHA-256 суммы файла change.me
|-- 2. Проверка синтаксиса backup/haproxy.cfg (haproxy -c)
|-- 3. Подмена боевого /etc/haproxy/haproxy.cfg
|-- 4. Перезапуск службы haproxy (systemctl restart)
|-- 5. Удаление директории status/
`-- 6. Запись отчета в deployment/success.me
2. Настройка Linux-сервера
2.1. Создание сервисного пользователя и рабочих каталогов
Подключитесь к серверу с правами root или через sudo:
# 1. Создаем системного пользователя с домашним каталогом /var/lib/depfile
sudo useradd -m -d /var/lib/depfile -s /bin/bash -c "File deploment service" depfile
# 2. Назначаем права доступа на домашний каталог
sudo chown -R depfile:depfile /var/lib/depfile
sudo chmod 750 /var/lib/depfile
# 3. Создаем каталог резервных конфигураций HAProxy и размещаем эталонный конфиг
sudo mkdir -p /etc/haproxy/backup
sudo cp /etc/haproxy/haproxy.cfg /etc/haproxy/backup/haproxy.cfg
sudo chown -R root:root /etc/haproxy/backup
sudo chmod 750 /etc/haproxy/backup
2.2. Подготовка каталога SSH-ключей
Домашняя директория пользователя — /var/lib/depfile, соответственно путь к файлу доверенных ключей: /var/lib/depfile/.ssh/authorized_keys.
sudo -u depfile mkdir -p /var/lib/depfile/.ssh
sudo -u depfile touch /var/lib/depfile/.ssh/authorized_keys
sudo chmod 700 /var/lib/depfile/.ssh
sudo chmod 600 /var/lib/depfile/.ssh/authorized_keys
2.3. Создание скрипта развертывания
Создайте исполняемый файл /usr/local/bin/deploy_haproxy.sh:
sudo nano /usr/local/bin/deploy_haproxy.sh
Содержимое скрипта:
Назначьте права на выполнение:
sudo chmod +x /usr/local/bin/deploy_haproxy.sh
2.4. Настройка связки systemd (Path + Service)
Для мгновенного реагирования создаются два системных юнита.
Шаг 1: Юнит сервиса (depfile-watcher.service)
Создайте файл описания процесса:
sudo nano /etc/systemd/system/depfile-watcher.service
[Unit]
Description=HAProxy Config Rollback Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/deploy_haproxy.sh
StandardOutput=journal
StandardError=journal
Шаг 2: Юнит отслеживания файловой системы (depfile-watcher.path)
Создайте файл монитора событий:
sudo nano /etc/systemd/system/depfile-watcher.path
[Unit]
Description=Watch for deployment trigger file change.me
[Path]
# PathChanged срабатывает в момент, когда запись в файл завершена и дескриптор закрыт (IN_CLOSE_WRITE)
PathChanged=/var/lib/depfile/status/change.me
Unit=depfile-watcher.service
[Install]
WantedBy=multi-user.target
Шаг 3: Активация и запуск монитора
Примените конфигурацию и включите монитор в автозагрузку:
sudo systemctl daemon-reload
sudo systemctl enable --now depfile-watcher.path
Проверьте статус наблюдателя:
systemctl status depfile-watcher.path
(Должен быть в статусе active (waiting)).
3. Настройка рабочей станции Windows
3.1. Генерация SSH-ключа
В командной строке (cmd) или PowerShell на рабочей станции:
ssh-keygen -t ed25519 -f "D:\sys\C-Sharp\deployfile\key\test_key.key" -N ""
Будут созданы:
test_key.key— приватный ключ (остается на машине оператора).test_key.key.pub— открытый ключ.
3.2. Экспорт открытого ключа на сервер
Выполните команду передачи публичного ключа (потребуется однократный ввод пароля пользователя depfile):
type "D:\sys\C-Sharp\deployfile\key\test_key.key.pub" | ssh depfile@10.228.48.110 "cat >> /var/lib/depfile/.ssh/authorized_keys"
Проверьте вход по ключу:
ssh -i "D:\sys\C-Sharp\deployfile\key\test_key.key" depfile@10.228.48.110 "whoami && pwd"
Ожидаемый ответ:
depfile
/var/lib/depfile
4. Клиентское приложение C# (.NET Framework 4.8)
4.1. Исходный код (Program.cs)
Код утилиты запускает встроенный клиент Windows OpenSSH, автоматически обрабатывает 32/64-битные системные пути и при необходимости устанавливает OpenSSH Client.
4.2. Сборка и создание ярлыка на рабочем столе
- В Visual Studio в свойствах проекта (Build / Сборка) установите платформу x64 (или снимите флаг Prefer 32-bit).
- Скомпилируйте проект в конфигурации Release (
D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe). - Создайте ярлык на рабочем столе:
- Объект:
"D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe" - Название:
Откатить конфигурацию HAProxy.
5. Проверка работы комплекса
- Нажмите на ярлык на рабочем столе Windows.
- В консоли отобразится успешный статус:
Используется ключ: D:\sys\C-Sharp\deployfile\key\test_key.key
Подключение к depfile@10.228.48.110:22...
Файл status/change.me и хеш status/sha256.hash успешно созданы на сервере.
- Реакция сервера происходит мгновенно (без задержек таймера cron). Проверьте журнал выполнения сервиса:
sudo journalctl -u depfile-watcher.service -n 25 --no-pager
- Убедитесь в результатах развертывания:
- Каталог
/var/lib/depfile/statusудален. - Конфигурация
/etc/haproxy/haproxy.cfgобновлена из бэкапа. - Служба активна:
systemctl status haproxy. - Метка времени зафиксирована в
/var/lib/depfile/deployment/success.me:
cat /var/lib/depfile/deployment/success.me