Made-with: Cursor
5.0 KiB
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 слушатель
*:2222→192.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).
Убедитесь, что Gitea реально отдаёт HTTPS на 443 на 192.168.160.129, если в конфиге HAProxy указан именно этот порт. Если контейнер слушает только HTTP :3000, нужен отдельный TLS-фронт на этом хосте или изменение схемы публикации (см. комментарии в haproxy-kalinamall.cfg).
После правок перезапустите 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.