Каким образом можно наилучшим образом интегрировать certbot в среду Docker для работы с сервером Nginx?

Как можно включить установку сертификата Let's Encrypt в образ Docker с Nginx и настроить его для нескольких доменов с помощью нескольких команд? Можно ли избежать сложностей при добавлении сертификата Let's Encrypt, которые часто возникают в примерах, и установить Nginx извне Docker, чтобы упростить структуру Docker Compose?
  • 26 января 2024 г. 18:08
Ответы на вопрос 2
Для интеграции Certbot в среду Docker с сервером Nginx вы можете использовать один из двух подходов:

1. **Certbot внутри контейнера Docker с Nginx**:
    Создайте Docker образ, который будет содержать как Nginx, так и Certbot. Вы можете использовать официальный образ Certbot в качестве основы и добавить Nginx, или наоборот.

    В вашем `Dockerfile` это может выглядеть следующим образом:

    ```dockerfile
    FROM nginx:latest

    # Устанавливаем Certbot
    RUN apt-get update && \
        apt-get install -y certbot python-certbot-nginx && \
        rm -rf /var/lib/apt/lists/*

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

    # Скрипт для получения сертификатов и автоматического обновления
    COPY ./init-letsencrypt.sh /usr/local/bin/init-letsencrypt.sh
    RUN chmod +x /usr/local/bin/init-letsencrypt.sh

    CMD ["/usr/local/bin/init-letsencrypt.sh"]
    ```

    Здесь скрипт `init-letsencrypt.sh` будет отвечать за получение сертификатов и настройку автоматического их обновления.

2. **Используем Certbot за пределами Docker**:
    Если вы хотите упростить структуру Docker Compose и избежать сложностей с установкой и обновлением сертификатов Let's Encrypt внутри Docker, можно запустить Certbot на хосте, а не в контейнере.

    Следующие шаги помогут вам настроить это:

    - Запустите Nginx в Docker, как обычно.
    - Выделите папки, где будут храниться сертификаты (`/etc/letsencrypt` и `/var/lib/letsencrypt`) и делайте их доступными для вашего контейнера через volume.
    - Запустите Certbot на хосте, желательно как cron job или systemd timer, для автоматического обновления сертификатов.

    В вашем `docker-compose.yml`:

    ```yaml
    version: '3'
    
    services:
      nginx:
        image: nginx:latest
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
          - /etc/letsencrypt:/etc/letsencrypt:ro
          - /var/lib/letsencrypt:/var/lib/letsencrypt:ro
        depends_on:
          - web
    ```

    Сконфигурируйте Certbot на хосте, чтобы использовать веб-корень Nginx, который соответствует volume, предоставленному контейнером Nginx.

    Для Certbot можно использовать следующую команду, чтобы получить сертификат для нескольких доменов:

    ```sh
    certbot certonly --webroot -w /path/to/nginx/webroot -d example.com -d www.example.com
    ```

    И не забудьте настроить автоматическое обновление сертификатов, добавив Certbot в cron:

    ```cron
    0 12 * * * /usr/bin/certbot renew --quiet --renew-hook "docker-compose -f /path/to/docker-compose.yml exec nginx nginx -s reload"
    ```

Оба метода работоспособны, но второй способ позволяет отделять процесс управления сертификатом от контейнера с Nginx, что может упростить управление и обновление сертификатов.

Учтите, что примеры конфигураций могут потребовать дополнительной настройки в зависимости от специфик вашей среды.
Ну либо взять и погуглить готовое для копипасты - мне даже набирать ничего не пришлось - я прям вопрос мышкой выделил и нажал "найти в поисковике" 
Ну или там же в поиске - прям сразу узнать про 1-2 volume, которые достаточно смонтировать
Похожие вопросы