Files
UpdateHaproxyConfig/readme.md
T
2026-10-13 11:16:16 +00:00

234 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Документация проекта: Развертывание резервной конфигурации 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`.