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

86 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HAProxy и Gitea для kalinamall.ru
Здесь два связанных сценария:
1. **Периметровый HAProxy (продакшен kalinamall.ru)** — TCP на `:443`, маршрутизация по **SNI**, TLS до бэкендов (сертификаты на Exchange/RDS/ERP). Готовый снимок конфигурации: [`haproxy/haproxy-perimeter-kalinamall.cfg.example`](../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`](../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 см. в репозитории:
- [`haproxy/haproxy-kalinamall.cfg.example`](../haproxy/haproxy-kalinamall.cfg.example)
Полный многосервисный образец (другие vhost, Zabbix, DSM и т.д.) — в [`haproxy/haproxy.cfg`](../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:
```bash
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy
```
Снаружи и из LAN (по необходимости):
```bash
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`)
Пример:
```sshconfig
Host git-kalinamall
HostName git.kalinamall.ru
User git
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
```