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

86 lines
5.0 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
Этот документ описывает **боевую схему kalinamall.ru**: HAProxy на периметре в режиме **TCP + SNI на порту 443** без завершения TLS на самом HAProxy — соединение с шифрованием уходит на внутренние серверы (**GlobalSign wildcard *.kalinamall.ru** на каждом бэкенде, включая Gitea).
Актуальный конфиг целиком лежит в репозитории:
- **[`docs/haproxy-kalinamall.cfg`](haproxy-kalinamall.cfg)**
## Общая логика
| Снаружи клиент видит | 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`](haproxy-kalinamall.cfg)).
После правок перезапустите Gitea.
## DNS
- **Из интернета:** записи для нужных имён (в том числе `git.kalinamall.ru`) должны указывать на публичный IP HAProxy (или NAT на него).
- **Из LAN:** по желанию **Split DNS**, чтобы те же FQDN резолвились во внутренний адрес HAProxy или сервера.
## Проверка после выкладки конфига HAProxy
На узле HAProxy:
```bash
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy
```
Проверки с клиента (после того как DNS и сертификаты готовы):
```bash
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`)
Пример:
```sshconfig
Host git-kalinamall
HostName git.kalinamall.ru
User git
Port 2222
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
```
## Отличие от варианта «TLS на HAProxy»
В [`haproxy/haproxy.cfg`](../haproxy/haproxy.cfg) для домашней сети используется режим **HTTP на HAProxy**, сертификат PEM на прокси и бэкенд Gitea по **HTTP :3000**. В kalinamall.ru наоборот: **TLS до бэкенда**, один общий паттерн с Exchange/RDS/ERP.