README: ACME example for ubuntu1/ubuntu2 via Host on port 80

This commit is contained in:
PTah
2026-04-11 20:09:23 +10:00
parent e739ead995
commit f4d477344c
+28 -7
View File
@@ -232,7 +232,20 @@ sudo haproxy -c -f /etc/haproxy/haproxy.cfg
1. На **пограничном роутере** разрешить с интернета **TCP 80** на IP хоста с HAProxy (или на тот хост, где будет отвечать ACME). 1. На **пограничном роутере** разрешить с интернета **TCP 80** на IP хоста с HAProxy (или на тот хост, где будет отвечать ACME).
2. В **`haproxy.cfg`** добавить отдельный **HTTP**-фронтенд на **80** и отправлять только путь проверки на бэкенд с ответом ACME (остальное — редирект на HTTPS, пустой ответ или отказ — по политике). 2. В **`haproxy.cfg`** добавить отдельный **HTTP**-фронтенд на **80** и отправлять только путь проверки на бэкенд с ответом ACME (остальное — редирект на HTTPS, пустой ответ или отказ — по политике).
Черновик логики (пути и имена бэкендов подставьте свои): ### Пример: два Ubuntu в LAN и HTTP-01 через один периметровый HAProxy
Допустим, во внутренней сети два сервера **Ubuntu**, для обоих нужны публичные имена и периодическое обновление сертификатов Let’s Encrypt по **HTTP-01**:
| Имя (снаружи) | Внутренний IP |
|----------------|-----------------|
| **ubuntu1.kalinamall.ru** | **192.168.160.90** |
| **ubuntu2.kalinamall.ru** | **192.168.190.60** |
**DNS:** записи **A** для `ubuntu1.kalinamall.ru` и `ubuntu2.kalinamall.ru` должны указывать на **тот же публичный IP**, что и для остальных сервисов за HAProxy (чтобы запросы Let’s Encrypt пришли на **порт 80** этого хоста).
**На каждой Ubuntu:** поднимите **HTTP на порту 80** (nginx/apache) с корнем для **Certbot webroot** (`/.well-known/acme-challenge/…`) или используйте схему выпуска с **DNS-01**, если открывать 80 не хотите. Автообновление — **`certbot renew`** + **systemd timer** (или cron) **на соответствующей** машине.
**На HAProxy:** один фронтенд на **80**, маршрутизация по заголовку **Host** + путь ACME на разные бэкенды:
```text ```text
frontend fe_http frontend fe_http
@@ -240,18 +253,26 @@ frontend fe_http
mode http mode http
option httplog option httplog
acl path_acme path_beg /.well-known/acme-challenge/ acl path_acme path_beg /.well-known/acme-challenge/
use_backend be_acme_http if path_acme acl host_u1 hdr(host) -i ubuntu1.kalinamall.ru
acl host_u2 hdr(host) -i ubuntu2.kalinamall.ru
use_backend be_acme_u1 if path_acme host_u1
use_backend be_acme_u2 if path_acme host_u2
http-request deny if !path_acme http-request deny if !path_acme
backend be_acme_http backend be_acme_u1
mode http mode http
# Пример: веб-корень Certbot на внутренней Ubuntu (nginx/apache или certbot webroot) server u1 192.168.160.90:80 check
server acme 192.168.x.x:80 check
backend be_acme_u2
mode http
server u2 192.168.190.60:80 check
``` ```
Варианты без отдельного «полного» веб-сервера на бэкенде: **DNS-01** на той же Ubuntu; либо плагины/схемы, где HAProxy отдаёт challenge (требует отдельной настройки и обычно скриптов обновления). Lets Encrypt при проверке обращается к **`http://ubuntu1.kalinamall.ru/.well-known/...`** или **`http://ubuntu2...`** — HAProxy по **Host** пересылает запрос на нужный внутренний **:80**, где локальный веб-сервер отдаёт файлы challenge.
После добавления `bind :80` обновите раздел **«Порты на фаерволе»** выше и проверку: `sudo haproxy -c -f /etc/haproxy/haproxy.cfg`. Варианты без проброса HTTP на две машины: на каждой Ubuntu **DNS-01** (порт 80 на периметре тогда не обязателен для этих сертификатов); либо **TLS-ALPN-01** по **443** (потребуется уже другая схема на HAProxy, не этот пример).
После добавления `bind :80` допишите в раздел **«Порты на фаерволе»** выше порт **80** и выполните `sudo haproxy -c -f /etc/haproxy/haproxy.cfg`.
## Лицензия ## Лицензия