Files
owngit/docs/haproxy-kalinamall.md
2026-04-22 13:15:13 +10:00

5.0 KiB
Raw Permalink Blame History

HAProxy и Gitea для kalinamall.ru

Этот документ описывает боевую схему kalinamall.ru: HAProxy на периметре в режиме TCP + SNI на порту 443 без завершения TLS на самом HAProxy — соединение с шифрованием уходит на внутренние серверы (*GlobalSign wildcard .kalinamall.ru на каждом бэкенде, включая Gitea).

Актуальный конфиг целиком лежит в репозитории:

Общая логика

Снаружи клиент видит HAProxy делает Бэкенд
HTTPS по имени из списка SNI Прозрачный TCP-туннель по выбранному правилу Сервер с TLS на своём порту

Для git.kalinamall.ru:

  • По SNI git.kalinamall.ru на :443 трафик идёт на 192.168.160.129:443 (backend be_gitea), проверка check ssl verify none.
  • Сертификат wildcard должен быть настроен на узле Gitea (или на промежуточном TLS-терминаторе перед Gitea на этом IP): HAProxy только пересылает уже установленное клиентом TLS-соединение.

По SSH для Git:

  • На HAProxy слушатель *:2222192.168.160.129:2222 (типичный SSH-порт контейнера Gitea на хосте).

Остальные имена на том же :443 (Exchange, RDS, ERP, SMTP на :25, stats на :8404) — как в файле конфигурации и комментариях к нему.

Имена и адреса для Gitea

Роль Значение
Публичный URL веб-интерфейса и HTTPS Git https://git.kalinamall.ru
SSH Git (clone / push) хост git.kalinamall.ru, порт 2222 (на периметре)
Бэкенд в LAN 192.168.160.129 — HTTPS 443, SSH 2222

Если на HAProxy имя git.kalinamall.ru резолвится во внутренний адрес — это удобно для диагностики из LAN; для самого HAProxy маршрутизация задаётся по SNI, а не по DNS на прокси.

Gitea: app.ini

На сервере Gitea (не на HAProxy):

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

Убедитесь, что на 192.168.160.129 на порту 443 что-то принимает TLS (периметровый HAProxy шлёт сюда TCP 443). Контейнер Gitea сам по себе слушает только HTTP :3000 — практичный вариант: nginx на том же сервере с wildcard-сертификатом. Пошаговая установка: docs/gitea-nginx-https.md и примеры в каталоге nginx/.

После правок перезапустите Gitea.

DNS

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

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

На узле HAProxy:

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

Проверки с клиента (после того как DNS и сертификаты готовы):

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

Статистика HAProxy в примере конфига на порту :8404; в файле репозитория пароль — заглушка, на сервере задайте свой и не коммитьте секреты в Git.

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

Пример:

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

Отличие от варианта «TLS на HAProxy»

В haproxy/haproxy.cfg для домашней сети используется режим HTTP на HAProxy, сертификат PEM на прокси и бэкенд Gitea по HTTP :3000. В kalinamall.ru наоборот: TLS до бэкенда, один общий паттерн с Exchange/RDS/ERP.