Пример nginx + letsencrypt для docker-compose

Внесите в ваш docker-compose.yml следующие изменения и оставьте открытыми порты (80 и 443) только в сервисе nginx-proxy и добавьте VIRTUAL_HOST и LETSENCRYPT_HOST в environments в ваш сервис (или сервисы), который слушает 80 порт (можно использовать и другие порты/настройки, см. ниже):

version: '2'

services:

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - ./vhost.d:/etc/nginx/vhost.d:ro
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html
      - ./proxy.conf:/etc/nginx/proxy.conf

  nginx-proxy-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    restart: always
    environment:
      - DEFAULT_EMAIL=crusat@yandex.ru
      - NGINX_PROXY_CONTAINER=nginx-proxy
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/acme.sh
      - ./vhost.d:/etc/nginx/vhost.d
      - ./data/certs:/etc/nginx/certs
      - ./data/html:/usr/share/nginx/html

  server:
    # ...
    environment:
      - VIRTUAL_HOST=example.ru
      - LETSENCRYPT_HOST=example.ru

  # ...

Создайте в корне файл proxy.conf:

# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;

# Mitigate httpoxy attack (see README for details)
proxy_set_header Proxy "";

# additional
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;

Создайте файл vhost.d/default:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

client_max_body_size 200m;

Также, если необходимо несколько доменов, то можно добавить прокси по имену домена, например, vhost.d/example.ru:

## Start of configuration add by letsencrypt container
location ^~ /.well-known/acme-challenge/ {
    auth_basic off;
    auth_request off;
    allow all;
    root /usr/share/nginx/html;
    try_files $uri =404;
    break;
}
## End of configuration add by letsencrypt container

server_tokens off;
client_max_body_size 2000m;

Для дополнительной документации смотрите сюда: https://hub.docker.com/r/jwilder/nginx-proxy/

devops docker