49136e6529
add cerbot documentation
273 lines
11 KiB
Markdown
273 lines
11 KiB
Markdown
# Документация по сервису Certbot
|
||
*Последнее обновление: 3 декабря 2025 г.*
|
||
|
||
## Обзор
|
||
|
||
Сервис Certbot предназначен для автоматического получения и обновления SSL/TLS сертификатов Let's Encrypt для нескольких доменов в Docker-окружении. Сервис использует webroot-метод для подтверждения владения доменами и работает как автономный контейнер в составе Docker Compose стека.
|
||
|
||
## Архитектура
|
||
|
||
### Основные компоненты
|
||
|
||
1. **Контейнер Certbot** (`certbot/certbot` образ)
|
||
2. **Конфигурационные файлы**:
|
||
- `certbot.ini` - основные настройки Certbot
|
||
- `init-certbot.sh` - скрипт инициализации и запуска
|
||
- `checkRenewCerts.sh` - скрипт проверки и обновления сертификатов
|
||
- Индивидуальные скрипты обновления для каждого домена
|
||
3. **Cron-задачи** для автоматического обновления
|
||
4. **Volumes** для хранения сертификатов и данных
|
||
|
||
### Поддерживаемые домены
|
||
|
||
Текущий список обслуживаемых доменов (декабрь 2025):
|
||
|
||
| Домен | Переменная окружения | Назначение |
|
||
|-------|---------------------|------------|
|
||
| `yalarba.ru` | `DOMAINS_yalarba` | Основной туристический портал |
|
||
| `valitovgaziz.ru` | `DOMAINS_valitovgaziz` | Персональный сайт |
|
||
| `easysite102.ru` | `DOMAINS_easysite102` | Сайт туроператора |
|
||
| `бегущийбашкир.рф` (IDN) | `DOMAINS_begushiybashkir` | Спортивный портал (кириллица) |
|
||
| `begushiybashkir.ru` | `DOMAINS_begushiybashkir_latin` | Спортивный портал (латиница) |
|
||
|
||
## Конфигурация
|
||
|
||
### Файлы конфигурации
|
||
|
||
#### `certbot.ini`
|
||
```ini
|
||
# Режим staging (используется для тестирования)
|
||
staging = False # Для продакшена установить False
|
||
|
||
# Контактная информация
|
||
email = valitovgaziz@yandex.ru
|
||
|
||
# Согласие с условиями
|
||
agree-tos = True
|
||
|
||
# Неинтерактивный режим для автоматизации
|
||
non-interactive = True
|
||
|
||
# Путь для webroot-аутентификации
|
||
webroot-path = /var/www/certbot
|
||
|
||
# Настройки криптографии
|
||
key-type = ecdsa # Использовать ECDSA ключи
|
||
elliptic-curve = secp384r1 # Кривая для ECDSA
|
||
```
|
||
|
||
#### `docker-compose.yml` (фрагмент для certbot)
|
||
```yaml
|
||
certbot:
|
||
build:
|
||
context: ./certbot
|
||
dockerfile: Dockerfile
|
||
container_name: certbot
|
||
volumes:
|
||
- ./certbot/config:/etc/letsencrypt/config
|
||
- certbot_data:/etc/letsencrypt
|
||
- certbot_www:/var/www/certbot
|
||
env_file:
|
||
- .env
|
||
environment:
|
||
- EMAIL=${EMAIL}
|
||
- DOMAINS=${ALL_DOMAINS}
|
||
- STAGING=0
|
||
restart: unless-stopped
|
||
healthcheck:
|
||
test:
|
||
[
|
||
"CMD-SHELL",
|
||
"test -f /etc/letsencrypt/live/$$(echo $${DOMAINS} | cut -d',' -f1)/fullchain.pem || exit 1",
|
||
]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 3
|
||
start_period: 40s
|
||
```
|
||
|
||
### Переменные окружения
|
||
|
||
Необходимые переменные в `.env` файле:
|
||
|
||
```bash
|
||
# Общие настройки
|
||
EMAIL=valitovgaziz@yandex.ru
|
||
|
||
# Списки доменов (через запятую)
|
||
DOMAINS_yalarba=yalarba.ru,www.yalarba.ru
|
||
DOMAINS_valitovgaziz=valitovgaziz.ru,www.valitovgaziz.ru
|
||
DOMAINS_easysite102=easysite102.ru,www.easysite102.ru
|
||
DOMAINS_begushiybashkir=бегущийбашкир.рф,www.бегущийбашкир.рф
|
||
DOMAINS_begushiybashkir_latin=begushiybashkir.ru,www.begushiybashkir.ru
|
||
|
||
# Агрегированный список для инициализации
|
||
ALL_DOMAINS=yalarba.ru,valitovgaziz.ru,easysite102.ru,бегущийбашкир.рф,begushiybashkir.ru
|
||
```
|
||
|
||
## Рабочий процесс
|
||
|
||
### 1. Инициализация (`init-certbot.sh`)
|
||
|
||
При запуске контейнера выполняются следующие шаги:
|
||
|
||
1. Проверка наличия сертификатов для каждого домена
|
||
2. Получение недостающих сертификатов через webroot-метод
|
||
3. Активация cron-демона
|
||
4. Настройка ежедневной проверки сертификатов
|
||
5. Запуск бесконечного процесса для поддержания работы контейнера
|
||
|
||
### 2. Ежедневная проверка (`checkRenewCerts.sh`)
|
||
|
||
Каждый день в 00:00 выполняется проверка всех сертификатов:
|
||
|
||
1. Проверяется срок действия каждого сертификата
|
||
2. Если до истечения осталось ≤ 2 дней, запускается процесс обновления
|
||
3. Используется индивидуальный скрипт для каждого домена
|
||
|
||
### 3. Обновление сертификатов
|
||
|
||
Индивидуальные скрипты обновления:
|
||
- `renewYalarbaCert.sh` - для yalarba.ru
|
||
- `renewValitovGazizCert.sh` - для valitovgaziz.ru
|
||
- `renewEasysite102.sh` - для easysite102.ru
|
||
- `renewBegushiyBashkir.sh` - для бегущийбашкир.рф
|
||
- `renewBegushiyBashkirLatin.sh` - для begushiybashkir.ru
|
||
|
||
## Мониторинг и логи
|
||
|
||
### Health Checks
|
||
- Certbot: проверка наличия файла `fullchain.pem` для первого домена
|
||
- Логи доступны через `docker logs certbot`
|
||
|
||
### Структура каталогов
|
||
```
|
||
/etc/letsencrypt/
|
||
├── live/
|
||
│ ├── yalarba.ru/
|
||
│ │ ├── cert.pem
|
||
│ │ ├── chain.pem
|
||
│ │ ├── fullchain.pem
|
||
│ │ └── privkey.pem
|
||
│ ├── valitovgaziz.ru/
|
||
│ └── ...
|
||
├── archive/ # Архивные версии сертификатов
|
||
└── renewal/ # Конфигурации обновления
|
||
```
|
||
|
||
## Расширение системы
|
||
|
||
### Добавление нового домена
|
||
|
||
1. **Добавить переменную окружения** в `.env` файл:
|
||
```bash
|
||
DOMAINS_newdomain=newdomain.ru,www.newdomain.ru
|
||
```
|
||
|
||
2. **Обновить список всех доменов**:
|
||
```bash
|
||
ALL_DOMAINS=existing.domains,newdomain.ru
|
||
```
|
||
|
||
3. **Создать скрипт обновления** (`renewNewdomainCert.sh`):
|
||
```bash
|
||
#!/bin/sh
|
||
echo "Получаем новые сертификаты для ${DOMAINS_newdomain}"
|
||
certbot certonly --webroot \
|
||
--config /etc/letsencrypt/config/certbot.ini \
|
||
-w /var/www/certbot \
|
||
-d ${DOMAINS_newdomain}
|
||
```
|
||
|
||
4. **Обновить `init-certbot.sh`**:
|
||
```bash
|
||
# Проверяем наличие сертификатов для newdomain.ru
|
||
if [ ! -d "/etc/letsencrypt/live/newdomain.ru" ]; then
|
||
echo "Получаем новые сертификаты newdomain.ru ..."
|
||
certbot certonly --webroot \
|
||
--config /etc/letsencrypt/config/certbot.ini \
|
||
-w /var/www/certbot \
|
||
-d ${DOMAINS_newdomain}
|
||
fi
|
||
```
|
||
|
||
5. **Обновить `checkRenewCerts.sh`**:
|
||
Добавить новую функцию проверки и вызов в `main()`.
|
||
|
||
6. **Настроить nginx** для использования нового сертификата.
|
||
|
||
## Устранение неполадок
|
||
|
||
### Общие проблемы
|
||
|
||
1. **Ошибки при получении сертификатов**
|
||
- Проверить доступность доменов из контейнера
|
||
- Убедиться, что nginx обслуживает `.well-known/acme-challenge/`
|
||
|
||
2. **Сертификаты не обновляются**
|
||
- Проверить логи cron: `docker exec certbot cat /var/log/cron`
|
||
- Убедиться, что скрипты имеют права на выполнение
|
||
|
||
3. **Health check падает**
|
||
- Проверить наличие сертификатов в `/etc/letsencrypt/live/`
|
||
- Убедиться, что volumes правильно подключены
|
||
|
||
### Команды для диагностики
|
||
|
||
```bash
|
||
# Проверить статус контейнера
|
||
docker-compose ps certbot
|
||
|
||
# Посмотреть логи
|
||
docker logs certbot
|
||
|
||
# Проверить cron задачи
|
||
docker exec certbot crontab -l
|
||
|
||
# Проверить срок действия сертификата
|
||
docker exec certbot openssl x509 -in /etc/letsencrypt/live/yalarba.ru/cert.pem -noout -dates
|
||
|
||
# Запустить проверку вручную
|
||
docker exec certbot /opt/checkRenewCerts.sh
|
||
```
|
||
|
||
## Безопасность
|
||
|
||
### Рекомендации
|
||
|
||
1. **Приватные ключи**: Хранятся в volume `certbot_data`, доступ только для certbot и nginx
|
||
2. **Staging режим**: Для тестирования установить `staging = True` в `certbot.ini`
|
||
3. **Ротация ключей**: Используется ECDSA с кривой secp384r1 для лучшей безопасности
|
||
4. **Ограничение доступа**: Контейнер не имеет открытых портов
|
||
|
||
### Резервное копирование
|
||
|
||
Рекомендуется регулярное копирование volume `certbot_data`:
|
||
```bash
|
||
# Создание бэкапа
|
||
docker run --rm -v certbot_data:/data -v $(pwd):/backup alpine tar czf /backup/certbot_backup_$(date +%Y%m%d).tar.gz -C /data .
|
||
```
|
||
|
||
## Часто задаваемые вопросы
|
||
|
||
**Q: Как часто обновляются сертификаты?**
|
||
A: Проверка выполняется ежедневно, обновление - за 2 дня до истечения срока.
|
||
|
||
**Q: Что делать при добавлении поддомена?**
|
||
A: Добавить поддомен в соответствующую переменную `DOMAINS_*` и перезапустить контейнер.
|
||
|
||
**Q: Как перейти с staging на production?**
|
||
A: Установить `staging = False` в `certbot.ini` и перезапустить контейнер.
|
||
|
||
**Q: Как проверить работу cron?**
|
||
A: `docker exec certbot crontab -l` покажет активные задачи.
|
||
|
||
## Контакты и поддержка
|
||
|
||
- Ответственный за обслуживание: Valitov Gaziz
|
||
- Email: valitovgaziz@yandex.ru
|
||
- Дата последнего обновления документации: 3 декабря 2025 г.
|
||
|
||
---
|
||
|
||
*Документация будет обновляться при добавлении новых доменов или изменении архитектуры системы.* |