Made-with: Cursor
5.4 KiB
HAProxy и Gitea для kalinamall.ru
Здесь два связанных сценария:
- Периметровый HAProxy (продакшен kalinamall.ru) — TCP на
:443, маршрутизация по SNI, TLS до бэкендов (сертификаты на Exchange/RDS/ERP). Готовый снимок конфигурации:haproxy/haproxy-perimeter-kalinamall.cfg.example. В нём нетgit.kalinamall.ru: заняты SNIext,autodiscover,rds,erp. - 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