# Документация проекта: Развертывание конфигурации 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`: ```bash # 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`. ```bash 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`: ```bash sudo nano /usr/local/bin/deploy_haproxy.sh ``` Содержимое скрипта: [deploy_haproxy.sh](deploy_haproxy.sh) Назначьте права на выполнение: ```bash sudo chmod +x /usr/local/bin/deploy_haproxy.sh ``` --- ### 2.4. Настройка связки systemd (Path + Service) Для мгновенного реагирования создаются два системных юнита. #### Шаг 1: Юнит сервиса (`depfile-watcher.service`) Создайте файл описания процесса: ```bash sudo nano /etc/systemd/system/depfile-watcher.service ``` ```ini [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`) Создайте файл монитора событий: ```bash sudo nano /etc/systemd/system/depfile-watcher.path ``` ```ini [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: Активация и запуск монитора Примените конфигурацию и включите монитор в автозагрузку: ```bash sudo systemctl daemon-reload sudo systemctl enable --now depfile-watcher.path ``` Проверьте статус наблюдателя: ```bash systemctl status depfile-watcher.path ``` *(Должен быть в статусе `active (waiting)`).* --- ## 3. Настройка рабочей станции Windows ### 3.1. Генерация SSH-ключа В командной строке (`cmd`) или PowerShell на рабочей станции: ```cmd 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`): ```powershell type "D:\sys\C-Sharp\deployfile\key\test_key.key.pub" | ssh depfile@10.228.48.110 "cat >> /var/lib/depfile/.ssh/authorized_keys" ``` Проверьте вход по ключу: ```cmd ssh -i "D:\sys\C-Sharp\deployfile\key\test_key.key" depfile@10.228.48.110 "whoami && pwd" ``` Ожидаемый ответ: ```text depfile /var/lib/depfile ``` --- ## 4. Клиентское приложение C# (.NET Framework 4.8) ### 4.1. Исходный код (`Program.cs`) Код утилиты запускает встроенный клиент Windows OpenSSH, автоматически обрабатывает 32/64-битные системные пути и при необходимости устанавливает OpenSSH Client. [Program.cs](Program.cs) ### 4.2. Сборка и создание ярлыка на рабочем столе 1. В Visual Studio в свойствах проекта (**Build** / **Сборка**) установите платформу **x64** (или снимите флаг *Prefer 32-bit*). 2. Скомпилируйте проект в конфигурации **Release** (`D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe`). 3. Создайте ярлык на рабочем столе: * **Объект:** `"D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe"` * **Название:** `Откатить конфигурацию HAProxy`. --- ## 5. Проверка работы комплекса 1. Нажмите на ярлык на рабочем столе Windows. 2. В консоли отобразится успешный статус: ```text Используется ключ: D:\sys\C-Sharp\deployfile\key\test_key.key Подключение к depfile@10.228.48.110:22... Файл status/change.me и хеш status/sha256.hash успешно созданы на сервере. ``` 3. Реакция сервера происходит **мгновенно** (без задержек таймера cron). Проверьте журнал выполнения сервиса: ```bash sudo journalctl -u depfile-watcher.service -n 25 --no-pager ``` 4. Убедитесь в результатах развертывания: * Каталог `/var/lib/depfile/status` удален. * Конфигурация `/etc/haproxy/haproxy.cfg` обновлена из бэкапа. * Служба активна: `systemctl status haproxy`. * Метка времени зафиксирована в `/var/lib/depfile/deployment/success.me`: ```bash cat /var/lib/depfile/deployment/success.me ```