Чтобы использовать Certbot для установки SSL-сертификата Let's Encrypt на домен с использованием Docker и Nginx, следуйте этим основным шагам:
0. Подготовьте ваше окружение:
Убедитесь, что у вас установлен Docker и Docker Compose на сервере и вы имеете доступности всех используемых DNS-имен.
1. Создайте файл `docker-compose.yml` с контейнерами для Nginx и Certbot:
```yaml
version: '3'
services:
nginx:
image: nginx:latest
container_name: nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./data/nginx:/etc/nginx/conf.d
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
depends_on:
- certbot
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
```
2. Настройте конфигурацию Nginx (`./data/nginx/default.conf`), чтобы обслуживать `.well-known/acme-challenge` через корректный root:
```nginx
server {
listen 80;
server_name site.ru;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri;
}
}
```
3. Запустите Nginx контейнер:
```bash
docker-compose up -d nginx
```
4. Запустите Certbot для получения сертификата:
```bash
docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d site.ru
```
5. Если Certbot успешно выпустил сертификат, обновите конфигурацию Nginx, чтобы включить SSL:
```nginx
server {
listen 80;
server_name site.ru;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name site.ru;
ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem;
location / {
# Конфигурация для обслуживания вашего приложения через HTTPS
}
}
```
6. Перезапустите Nginx, чтобы применить новую конфигурацию:
```bash
docker-compose down
docker-compose up -d nginx
```
Если возникает ошибка 404 при доступе к пути `.well-known/acme-challenge`, это может быть вызвано следующими проблемами:
- Директория `/var/www/certbot` не существует в контейнере или неправильно настроена. Убедитесь, что вы создали соответствующие тома в `docker-compose.yml`.
- DNS настройки для вашего домена неправильные или DNS изменения еще не распространились. Убедитесь, что ваш домен корректно указывает на IP-адрес сервера.
- Ошибка в конфигурации Nginx. Проверьте правильность настроек и путей в `server` блоке относящемся к `.well-known/acme-challenge`.
Попробуйте также запросы на сервере для локальной диагностики:
```bash
curl -i localhost/.well-known/acme-challenge/test
```
Это должно вернуть 404 ошибку, но без внешнего HTTP запроса, чтобы проверить, что внутренняя маршрутизация работает как задумано.