Skip to content

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-agent MJ12bot

Добавление нового сайта

Новый сайт подключается через роль haproxy_config в плейбуке приложения (обычно prod26-NN-<sitename>.yml).

Роль выполняет на lb26 (через delegate_to):

  1. Выпуск сертификата — /usr/local/bin/issue-helper.sh <domain> (certbot webroot через nginx)
  2. Добавление load crt в секцию crt-store acme
  3. Добавление домена в строку bind *:443 … crt "@acme/<domain>"
  4. Добавление acl, use_backend (router) и блока backend в haproxy.cfg
  5. Перезагрузка 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 при первом деплое