lb26 — Load Balancer¶
Общее¶
| Параметр | Значение |
|---|---|
| Тип | CX23 (2 vCPU, 3.7 GB RAM, 40 GB SSD) |
| ОС | Ubuntu 24.04.4 LTS (Noble Numbat) |
| Ядро | 6.8.0-107-generic |
| Public IP | 168.119.247.232 |
| Private IP | 10.26.0.2 |
| Timezone | Asia/Jerusalem |
| Проект | infra26 |
| SSH | ssh digi.i26.lb26 (порт 1022) |
| Ansible playbook | project/lb26.yml |
Сервисы¶
| Сервис | Версия | Порт | Описание |
|---|---|---|---|
| HAProxy | 3.0.19 (PPA vbernat/haproxy-3.0) |
0.0.0.0:80, 0.0.0.0:443 |
Основной load balancer / reverse proxy |
| HAProxy stats | — | localhost:8404/stats |
Веб-панель статистики |
| HAProxy metrics | — | 10.26.0.2:8405 |
Prometheus-эндпоинт (builtin) |
| Nginx | 1.24.0 | 127.0.0.1:8080 |
Только для ACME-challenge |
| node_exporter | 1.8.2 | 10.26.0.2:9100 |
Prometheus-метрики хоста |
| bareos-filedaemon | 25.0.4 | 10.26.0.2:9102 |
Клиент резервного копирования |
| Docker | 28.5.2 | — | Установлен, контейнеры не запущены |
| glpi-agent | 1.15 | — | Инвентаризация (glpi.digiproduct.co.il) |
HAProxy — маршрутизация¶
Входящий трафик (порт 80)
├── /.well-known/acme-challenge/ → nginx (127.0.0.1:8080)
└── всё остальное → redirect 301 https://
Входящий трафик (порт 443, TLS)
├── docs.digiproduct.co.il → backend dcsdgprdct (10.26.0.7:20011, send-proxy)
├── www.docs.digiproduct.co.il → redirect → docs.digiproduct.co.il
├── edupsyhappy.co.il → backend edupsyhappy.co.il (10.26.0.7:20010, send-proxy)
└── www.edupsyhappy.co.il → redirect → edupsyhappy.co.il
- Балансировка:
leastconn - Health-check: каждые 2 с, rise 2 / fall 3
- Cloudflare: реальный IP берётся из заголовка
CF-Connecting-IP(список/etc/haproxy/cf_ips.txt) - Заблокирован IP
5.29.19.3и user-agentMJ12bot
Добавление нового сайта¶
Новый сайт подключается через роль haproxy_config в плейбуке приложения (обычно prod26-NN-<sitename>.yml).
Роль выполняет на lb26 (через delegate_to):
- Выпуск сертификата —
/usr/local/bin/issue-helper.sh <domain>(certbot webroot через nginx) - Добавление
load crtв секциюcrt-store acme - Добавление домена в строку
bind *:443 … crt "@acme/<domain>" - Добавление
acl,use_backend(router) и блокаbackendвhaproxy.cfg - Перезагрузка HAProxy (
systemctl reload haproxy)
Все блоки в конфиге обёрнуты в # BEGIN/END ANSIBLE MANAGED BLOCK FOR … — ручные правки между ними будут перезаписаны.
SSL-сертификаты¶
Управляются через certbot (Let's Encrypt) в virtualenv /venv.
Email: [email protected]
| Скрипт | Назначение |
|---|---|
/usr/local/bin/issue-helper.sh <domain> |
Выпуск нового сертификата (webroot через nginx) |
/usr/local/bin/certbot-helper.sh |
Обновление всех сертификатов + копирование в HAProxy + reload |
Cron: 0 3 * * * → certbot-helper.sh >> /var/log/certbot-combine.log 2>&1
| Домен | Статус |
|---|---|
docs.digiproduct.co.il |
активен, подключён в HAProxy |
edupsyhappy.co.il |
активен, подключён в HAProxy |
dev.mitgavrim.digiproduct.co.il |
сертификат есть, в конфиге не подключён |
selfsigned |
fallback при отсутствии SNI-совпадения |
Сертификаты хранятся в /etc/letsencrypt/live/ и копируются в:
- /etc/haproxy/ssl/certs/<domain>.pem
- /etc/haproxy/ssl/private/<domain>.key
Nginx¶
Слушает только 127.0.0.1:8080.
Обслуживает ACME-challenge из /var/www/html/.well-known/acme-challenge/.
Вся остальная логика проксирования — на HAProxy.
Docker¶
Установлен, но контейнеры не запущены.
При перезагрузке автозапуск: docker compose up -d --project-directory /docker/compose.
Файл /docker/compose/docker-compose.yml содержит заготовку сетей (infra, cli, web, fpm) — сервисов пока нет.
Мониторинг¶
| Компонент | Детали |
|---|---|
| node_exporter | слушает 10.26.0.2:9100, скрейпят Prometheus с 116.203.108.152 и 46.224.166.151 (mon26) |
| HAProxy Prometheus | 10.26.0.2:8405 (builtin endpoint) |
| glpi-agent | роль lb26, env production-infra26, provider Hetzner, DC fsn1 |
Резервное копирование (Bareos)¶
| Параметр | Значение |
|---|---|
| Клиент | bareos-filedaemon на 10.26.0.2:9102 |
| Директор | bkp26 (10.26.0.8), FQDN bkp26-local.digiproduct.co.il |
| Хранилище | Hetzner Object Storage fsn1.your-objectstorage.com |
| Бакет | digibkpinfra26 |
| Расписание | WeeklyCycle |
| Удержание | 90 дней |
| Макс. томов (incremental) | 100 |
| Spool dir | /var/lib/bareos/spool/lb26 |
Файрвол¶
UFW отключён. Файрвол управляется через iptables (/etc/iptables/rules.v4).
Открытые порты: 80/tcp, 443/tcp, 1022/tcp (SSH).
Ansible-роль systemd_haproxy добавляет правила для 80 и 443 автоматически.
Ansible-роли¶
Плейбук project/lb26.yml:
| Роль | Статус | Назначение |
|---|---|---|
infra26 |
закомментирована (уже применена) | базовая настройка: swap 4GB, Docker, apt-upgrade, timezone |
node_exporter |
закомментирована (уже применена) | Prometheus-экспортер |
glpi_agent |
закомментирована (уже применена) | инвентаризация |
systemd_haproxy |
закомментирована (уже применена) | HAProxy + Nginx + certbot |
systemd_bareos_client |
закомментирована (уже применена) | bareos-filedaemon |
bareos_bkp_system_s3 |
активна | настройка задания бэкапа системы в S3 |
Заметки¶
- SSH нестандартный порт: 1022
- Журнал systemd ограничен 300 MB (
@daily journalctl --vacuum-size=300M) - Swap 4 GB создаётся ролью
infra26при первом деплое