docs: restore haproxy-kalinamall.md with git.kalinamall.ru guide

Made-with: Cursor
This commit is contained in:
PTah
2026-04-22 10:16:34 +10:00
parent 25a9e5d972
commit 4adba05532
2 changed files with 87 additions and 1 deletions
+85
View File
@@ -0,0 +1,85 @@
# 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.