Как настроить certbot для работы с nginx в контейнере Docker?

У меня есть PHP-приложение, которое деплоится с помощью GitLab CI и Docker Compose. Nginx настраивается в Dockerfile, и в тот же образ устанавливается Certbot. Проблема в том, что после каждого деплоя мне приходится вручную заходить в контейнер и запускать Certbot. Существует ли способ автоматизировать этот процесс? Я пробовал смонтировать /etc/letsencrypt в volume, но это не решает проблему, так как Certbot также редактирует конфигурации Nginx. 

P.S. Пожалуйста, не предлагайте покупку отдельного сертификата и его ручное добавление.
  • 3 сентября 2024 г. 8:03
Ответы на вопрос 1
Чтобы автоматизировать процесс получения и обновления SSL-сертификатов с помощью Certbot в Docker-контейнере с Nginx, вы можете использовать подход с запуском Certbot в фоновом режиме и автоматизацией его задач с помощью cron или с помощью системного таймера. Вот пошаговая инструкция:

### 1. Обновите Dockerfile

Убедитесь, что ваш Dockerfile устанавливает все необходимые зависимости:

```Dockerfile
FROM nginx:latest

# Установка Certbot
RUN apt-get update && \
    apt-get install -y certbot python3-certbot-nginx

# Копируем конфигурацию Nginx
COPY nginx.conf /etc/nginx/nginx.conf

# Создайте директории для сертификатов
RUN mkdir -p /etc/letsencrypt /var/lib/letsencrypt /var/log/letsencrypt

# Порт, который будет использоваться для HTTP и HTTPS
EXPOSE 80 443

# Запуск Nginx и Cron
CMD ["sh", "-c", "nginx && cron -f"]
```

### 2. Настройка конфигурации Nginx

Убедитесь, что ваш конфигурационный файл Nginx настроен на обработку HTTP- и HTTPS-запросов, а также на использование Certbot для автоматического редиректа на HTTPS.

Пример конфигурации Nginx:

```nginx
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    # Директивы настройки вашего приложения
}
```

### 3. Создание скрипта для обновления сертификатов

Создайте bash-скрипт, который будет запускать Certbot для обновления сертификатов. Например, создайте файл `renew_certificates.sh`:

```bash
#!/bin/bash

# Запуск Certbot для получения и обновления сертификатов
certbot --nginx -d yourdomain.com -d www.yourdomain.com --non-interactive --agree-tos --email [email protected]

# Перезагрузить Nginx после обновления сертификатов
nginx -s reload
```

Не забудьте сделать скрипт исполняемым:

```bash
chmod +x renew_certificates.sh
```

### 4. Настройка Cron для автоматического обновления сертификатов

Вы можете создать cron-задачу, чтобы периодически вызывать этот скрипт. Добавьте следующее в crontab:

```bash
# Открыть crontab
crontab -e

# Добавьте следующую строку, чтобы запускать обновление сертификатов каждый день в 2 часа ночи
0 2 * * * /path/to/renew_certificates.sh >> /var/log/certbot.log 2>&1
```

### 5. Обновите docker-compose.yml

Обновите ваш `docker-compose.yml`, чтобы описать сервис Nginx и включить `volumes`, чтобы сохранить сертификаты:

```yaml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - certbot-etc:/etc/letsencrypt
      - certbot-var:/var/lib/letsencrypt
      - certbot-log:/var/log/letsencrypt
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./renew_certificates.sh:/renew_certificates.sh

volumes:
  certbot-etc:
  certbot-var:
  certbot-log:
```

### 6. Запустите контейнер

Теперь, когда вы запустите ваш контейнер через Docker Compose, Nginx будет работать, а Cron будет автоматически вызывать ваш скрипт для получения и обновления сертификатов.

### Примечания

- Убедитесь, что ваш порт 80 открыт и доступен для Let's Encrypt, чтобы проводить верификацию.
- Убедитесь, что заменили `yourdomain.com` и `[email protected]` на свои реальные данные.
- Вы можете дополнительно настроить логи и обработку ошибок в вашем скрипте.
- Возможно, вам также придется убедиться, что другие задачи в cron проходят корректно и не конфликтуют с запуск
Похожие вопросы