From f4d477344c04d35c6aa6e60e48a66f3b371432e9 Mon Sep 17 00:00:00 2001 From: PTah Date: Sat, 11 Apr 2026 20:09:23 +1000 Subject: [PATCH] README: ACME example for ubuntu1/ubuntu2 via Host on port 80 --- README.md | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 172e543..7188fb0 100644 --- a/README.md +++ b/README.md @@ -232,7 +232,20 @@ sudo haproxy -c -f /etc/haproxy/haproxy.cfg 1. На **пограничном роутере** разрешить с интернета **TCP 80** на IP хоста с HAProxy (или на тот хост, где будет отвечать ACME). 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 frontend fe_http @@ -240,18 +253,26 @@ frontend fe_http mode http option httplog 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 -backend be_acme_http +backend be_acme_u1 mode http - # Пример: веб-корень Certbot на внутренней Ubuntu (nginx/apache или certbot webroot) - server acme 192.168.x.x:80 check + server u1 192.168.160.90:80 check + +backend be_acme_u2 + mode http + server u2 192.168.190.60:80 check ``` -Варианты без отдельного «полного» веб-сервера на бэкенде: **DNS-01** на той же Ubuntu; либо плагины/схемы, где HAProxy отдаёт challenge (требует отдельной настройки и обычно скриптов обновления). +Let’s 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`. ## Лицензия