From 9af9797cd6bec85ddfb84551111270a94e7b0142 Mon Sep 17 00:00:00 2001 From: PTah Date: Sat, 11 Apr 2026 20:11:48 +1000 Subject: [PATCH] README: step-by-step nginx+Certbot webroot for ACME on Ubuntu --- README.md | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bb7c9fe..a774f57 100644 --- a/README.md +++ b/README.md @@ -243,7 +243,85 @@ sudo haproxy -c -f /etc/haproxy/haproxy.cfg **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) **на соответствующей** машине. +**На каждой Ubuntu:** нужен **HTTP на порту 80** и каталог под **webroot** Certbot (`/.well-known/acme-challenge/…`). Ниже — пошагово для **nginx** (типичный вариант); в конце — кратко про **Apache**. Если открывать 80 не хотите, используйте **DNS-01** на той же машине (без этого блока). + +#### Пошагово: nginx + Certbot webroot на Ubuntu + +Выполняйте **на каждой** Ubuntu отдельно; подставляйте своё имя (`ubuntu1.kalinamall.ru` или `ubuntu2.kalinamall.ru`). + +1. **Установите nginx и certbot** + ```bash + sudo apt update + sudo apt install -y nginx certbot + ``` + +2. **Каталог для challenge** (Certbot будет писать сюда файлы, nginx — отдавать): + ```bash + sudo mkdir -p /var/www/certbot/.well-known/acme-challenge + sudo chown -R www-data:www-data /var/www/certbot + ``` + +3. **Виртуальный хост только под ACME и имя сервера** + Создайте файл, например `/etc/nginx/sites-available/acme-le.conf` (на одной машине в `server_name` — `ubuntu1.kalinamall.ru`, на другой — `ubuntu2.kalinamall.ru`): + + ```nginx + server { + listen 80 default_server; + listen [::]:80 default_server; + server_name ubuntu1.kalinamall.ru; + + location ^~ /.well-known/acme-challenge/ { + root /var/www/certbot; + default_type "text/plain"; + } + + location / { + return 404; + } + } + ``` + +4. **Включите сайт и перезапустите nginx** + ```bash + sudo ln -sf /etc/nginx/sites-available/acme-le.conf /etc/nginx/sites-enabled/ + sudo rm -f /etc/nginx/sites-enabled/default + sudo nginx -t && sudo systemctl reload nginx + ``` + Убедитесь, что снаружи (через HAProxy и открытый WAN **80**) до этой машины доходит запрос с правильным **Host** — иначе Let’s Encrypt не пройдёт проверку. + +5. **Первый выпуск сертификата (webroot)** + Подставьте свой домен и e-mail: + ```bash + sudo certbot certonly --webroot -w /var/www/certbot \ + -d ubuntu1.kalinamall.ru \ + --email admin@example.com --agree-tos --non-interactive + ``` + При первом запуске можно убрать `--non-interactive`, чтобы согласиться с условиями в диалоге. Сертификаты появятся в `/etc/letsencrypt/live/<имя>/`. + +6. **Проверка автообновления** + ```bash + sudo systemctl enable --now certbot.timer + sudo certbot renew --dry-run + ``` + +7. **Перезагрузка nginx после успешного renew** + Создайте скрипт и сделайте его исполняемым: + ```bash + sudo install -d /etc/letsencrypt/renewal-hooks/deploy + echo 'systemctl reload nginx' | sudo tee /etc/letsencrypt/renewal-hooks/deploy/01-reload-nginx.sh + sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/01-reload-nginx.sh + ``` + Таймер **`certbot.timer`** по расписанию вызывает `certbot renew`; при обновлении сертификата выполняются hook’и из `renewal-hooks/deploy`. + +Дальше на этой же машине можно настроить **HTTPS** для своих сервисов, указав в nginx `ssl_certificate` и `ssl_certificate_key` на файлы из `/etc/letsencrypt/live/<домен>/` (это уже отдельно от HAProxy, если TLS терминируется на Ubuntu). + +#### Кратко: Apache вместо nginx + +1. `sudo apt install -y apache2 certbot python3-certbot-apache` (или только `certbot` и webroot без плагина apache). +2. Корень для challenge: например `sudo mkdir -p /var/www/certbot/.well-known/acme-challenge` и в виртуальном хосте на **:80** для вашего `ServerName` — `Alias /.well-known/acme-challenge /var/www/certbot/.well-known/acme-challenge` и доступ `Require all granted` для этого каталога. +3. `sudo apachectl configtest && sudo systemctl reload apache2` +4. `sudo certbot certonly --webroot -w /var/www/certbot -d ubuntu1.kalinamall.ru` (и аналогично для второго имени на второй машине). +5. Таймер **`certbot.timer`** и при необходимости hook с `systemctl reload apache2`. **На HAProxy:** один фронтенд на **80**, маршрутизация по заголовку **Host** + путь ACME на разные бэкенды: