4adba05532
Made-with: Cursor
86 lines
5.0 KiB
Markdown
86 lines
5.0 KiB
Markdown
# 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.
|