# 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.