# Документация проекта: Развертывание резервной конфигурации HAProxy по требованию ## 1. Архитектурное описание Комплекс предназначен для контролируемого применения резервной конфигурации балансировщика **HAProxy** по клику оператора с рабочей станции Windows. ``` [ Рабочая станция Windows ] | (Ярлык на рабочем столе) | deployfile.exe (.NET 4.8) | | (1. SSH connection: ed25519) | (2. Генерация status/change.me + status/sha256.hash) v [ Linux-сервер (HAProxy) ] /var/lib/depfile/ (Домашний каталог depfile) ├── .ssh/authorized_keys ├── status/ │ ├── change.me │ └── sha256.hash └── deployment/ └── success.me | (cron: раз в минуту) v deploy_haproxy.sh (Bash) |-- 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 ``` ### Принцип работы 1. **Windows-клиент (`deployfile.exe`):** * Разработан на .NET Framework 4.8 без внешних библиотек. * Вызывает встроенный клиент Windows OpenSSH (`ssh.exe`) с автоопределением путей (включая обход WOW64-редиректа `Sysnative` для 32-битных процессов) и автоматической установкой OpenSSH через PowerShell при его отсутствии. * Генерирует случайный текстовый блок, подключается к серверу по SSH под пользователем `depfile` с использованием ED25519-ключа и записывает данные в `/var/lib/depfile/status/change.me`. * На стороне сервера генерирует файл контрольной суммы `/var/lib/depfile/status/sha256.hash`. 2. **Серверный обработчик (`deploy_haproxy.sh`):** * Выполняется по cron от имени `root`. * Проверяет наличие файла `/var/lib/depfile/status/change.me`. Если файл отсутствует — завершает работу без нагрузки на систему. * Валидирует целостность `change.me` через `sha256sum -c`. * Выполняет проверку синтаксиса резервного файла (`haproxy -c -f /etc/haproxy/backup/haproxy.cfg`). При обнаружении ошибок применение отменяется. * Копирует резервную конфигурацию в боевой файл `/etc/haproxy/haproxy.cfg`. * Перезапускает службу `haproxy`. * Удаляет временную директорию `/var/lib/depfile/status`. * Фиксирует статус и метку времени в файле `/var/lib/depfile/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. Настройка периодического запуска в cron Откройте планировщик суперпользователя: ```bash sudo crontab -e ``` Добавьте задачу запуска раз в минуту: ```cron * * * * * /usr/local/bin/deploy_haproxy.sh >> /var/log/deploy_haproxy.log 2>&1 ``` --- ## 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. Добавление открытого ключа на сервер Передайте содержимое открытого ключа в `authorized_keys` пользователя `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" ``` *(При первом подключении введите пароль пользователя `depfile` на сервере).* Проверьте беспарольный вход: ```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](Program.cs) ### 4.2. Сборка и создание ярлыка на рабочем столе 1. В Visual Studio в свойствах проекта (**Свойства** -> **Сборка** / **Build**) рекомендуется выставить целевую платформу **x64** (или снять флаг *Prefer 32-bit*). 2. Скомпилируйте проект в конфигурации **Release** (результирующий бинарник: `D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe`). 3. Создайте ярлык на рабочем столе: * **Расположение объекта:** ```cmd "D:\sys\C-Sharp\deployfile\bin\Release\deployfile.exe" ``` * **Имя ярлыка:** `Откатить конфигурацию HAProxy`. --- ## 5. Проверка работы комплекса 1. **Запуск с клиента:** * Дважды кликните по созданному ярлыку на рабочем столе. * Консоль отобразит процесс подключения и результат: ```text Используется ключ: D:\sys\C-Sharp\deployfile\key\test_key.key Подключение к depfile@10.228.48.110:22... Файл status/change.me и хеш status/sha256.hash успешно созданы на сервере. ``` 2. **Проверка на сервере (в пределах 1 минуты):** * Каталог `/var/lib/depfile/status` удален. * Файл конфигурации `/etc/haproxy/haproxy.cfg` перезаписан из `/etc/haproxy/backup/haproxy.cfg`. * Статус HAProxy: `systemctl status haproxy` в состоянии `active (running)`. * Проверка фиксации развертывания: ```bash cat /var/lib/depfile/deployment/success.me ``` *Вывод:* ```text deploment success {2026-10-13 12:45:00} ``` * Журнал работы скрипта доступен в `/var/log/deploy_haproxy.log`.