README: step-by-step nginx+Certbot webroot for ACME on Ubuntu

This commit is contained in:
PTah
2026-04-11 20:11:48 +10:00
parent bd39118589
commit 9af9797cd6
+79 -1
View File
@@ -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** этого хоста). **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** — иначе Lets 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 на разные бэкенды: **На HAProxy:** один фронтенд на **80**, маршрутизация по заголовку **Host** + путь ACME на разные бэкенды: