Files
owngit/docs/haproxy-kalinamall.md
T
2026-04-22 10:06:47 +10:00

5.4 KiB
Raw Blame History

HAProxy и Gitea для kalinamall.ru

Здесь два связанных сценария:

  1. Периметровый HAProxy (продакшен kalinamall.ru) — TCP на :443, маршрутизация по SNI, TLS до бэкендов (сертификаты на Exchange/RDS/ERP). Готовый снимок конфигурации: haproxy/haproxy-perimeter-kalinamall.cfg.example. В нём нет git.kalinamall.ru: заняты SNI ext, autodiscover, rds, erp.
  2. Gitea за HAProxy — отдельный пример с завершением TLS на прокси (HTTP mode, PEM на HAProxy) или вынос Gitea на другой порт/узел — haproxy/haproxy-kalinamall.cfg.example.

Если нужен один внешний :443 и для почты/ERP/RDS, и для Gitea с passthrough, на периметре добавляют SNI git.kalinamall.ru и backend в режиме TCP на 192.168.160.129:443 (если Gitea отдаёт HTTPS на 443) или проектируют публикацию Gitea на отдельном порту/хосте — см. таблицу ниже.

Периметр: что в примере haproxy-perimeter-kalinamall.cfg.example

SNI (клиент подключается к) Backend (LAN)
ext.kalinamall.ru, autodiscover.kalinamall.ru 192.168.160.42:443 (Exchange), TLS к бэкенду
rds.kalinamall.ru 192.168.160.40:4430 (RDS), TLS к бэкенду
erp.kalinamall.ru 192.168.160.150:443 (1С и т.п.), TLS к бэкенду
SMTP :25 192.168.160.57:25 (KSMG)
Статистика :8404 HTTP stats; в файле в репозитории пароль заглушка — задайте свой на сервере и не храните секрет в Git.

Неверный или неизвестный SNI на :443 отбрасывается (tcp-request content reject if !sni_known).

Имена и адреса (Gitea)

Роль Значение
Публичный URL Gitea (браузер, git remote по HTTPS) https://git.kalinamall.ru
SSH для Git (git push / clone по SSH) хост git.kalinamall.ru, порт 2222 (как на HAProxy в примере)
Бэкенд Gitea в LAN 192.168.160.129 — рекомендуется в server строках HAProxy для предсказуемости и отсутствия зависимости от DNS на самом прокси
Альтернатива бэкенду git.kalinamall.ru:3000 и :2222 — допустимо, если на узле HAProxy имя резолвится во внутренний IP сервера Gitea (Split DNS или запись в /etc/hosts)

Пример конфигурации только для Gitea + ACME см. в репозитории:

Полный многосервисный образец (другие vhost, Zabbix, DSM и т.д.) — в haproxy/haproxy.cfg; нужные блоки можно перенести в свой боевой конфиг и подставить свои хосты и LAN IP.

TLS-сертификат на HAProxy

  • Файл PEM в примере: /etc/haproxy/certs/kalinamall.pem (цепочка + ключ).
  • В SAN сертификата должно быть имя git.kalinamall.ru (и любые другие имена, для которых этот же bind принимает HTTPS).

Gitea: ROOT_URL и SSH

В app.ini на сервере Gitea (не на HAProxy):

  • ROOT_URL=https://git.kalinamall.ru/
  • Для SSH обычно задают отображение для пользователей: домен git.kalinamall.ru, порт 2222 (совпадает с тем, что слушает HAProxy снаружи).

После смены домена перезапустите контейнер Gitea.

DNS

  • Из интернета: git.kalinamall.ru → публичный IP HAProxy (или NAT на него).
  • Из LAN: удобно настроить Split DNS: тот же FQDN указывает на внутренний IP HAProxy или напрямую на Gitea — тогда один и тот же URL в документации и в remotes.

Если Split DNS нет, изнутри сети можно пользоваться https://192.168.160.129 только для проверки, но для постоянной работы лучше имя и корректный ROOT_URL.

Проверка после выкладки конфига

На узле HAProxy:

sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy

Снаружи и из LAN (по необходимости):

curl -fsS -o /dev/null -w "%{http_code}\n" https://git.kalinamall.ru/api/healthz
ssh -T -p 2222 git@git.kalinamall.ru

Клиент SSH (~/.ssh/config)

Пример:

Host git-kalinamall
    HostName git.kalinamall.ru
    User git
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
    IdentitiesOnly yes