Files
UpdateHaproxyConfig/readme.md
T

234 lines
8.9 KiB
Markdown
Raw Normal View History

2026-10-13 11:05:58 +00:00
# Документация проекта: Развертывание резервной конфигурации 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
```
Вставьте следующий код:
2026-10-13 11:16:16 +00:00
[deploy_haproxy.sh](deploy_haproxy.sh)
2026-10-13 11:05:58 +00:00
Назначьте права на запуск:
```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)
2026-10-13 11:16:16 +00:00
### 4.1. Исходный код
[Program.cs](Program.cs)
2026-10-13 11:05:58 +00:00
### 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`.