Как настроить Caddy с SSL Let’s Encrypt и Duck DNS для обслуживания нескольких сервисов, работающих в контейнерах Docker?

Вопрос или проблема

Мне удалось настроить VaultWarden, который доступен только в локальной сети с SSL-сертификатом Let’s Encrypt с использованием Caddy. Caddy, VaultWarden и другие сервисы работают как контейнеры Docker на хосте Raspberry Pi.

Я создал домен Duck DNS: test111.duckdns.org, который указывает на мой приватный IP-адрес LAN Raspberry Pi.

Я добавил переопределение хоста в настройки DNS-резолвера pfSense (это был ключевой шаг, чтобы всё заработало) следующим образом:

Хост: test111
Домен: duckdns.org
IP-адрес: <IP-адрес Raspberry Pi>

Мой файл Docker Compose:

networks:
  docker-mongoose:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "172.16.117.0/27"

services:
  caddy:
    image: caddy:2
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.10
    container_name: caddy
    restart: always
    ports:
      - 80:80
      - 443:443
      - 443:443/udp # Необходимо для HTTP/3.
    volumes:
      - ./caddy:/usr/bin/caddy  
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "test111.duckdns.org" 
      #EMAIL: ""
      DUCKDNS_TOKEN: "<токен duckdns>"
      LOG_FILE: "/data/access.logs"

  unifi-network-application:
    container_name: unifi-network-application
    image: lscr.io/linuxserver/unifi-network-application:latest
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.9
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=1
    ports:
      - 8443:8443
      - 3478:3478/udp
      - 10001:10001/udp
      - 8080:8080
      - 1900:1900/udp #по желанию
      #- 8843:8843 #по желанию
      #- 8880:8880 #по желанию
      #- 6789:6789 #по желанию
      #- 5514:5514/udp #по желанию
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - MONGO_USER=user
      - MONGO_PASS=password
      - MONGO_HOST=unifi-db
      - MONGO_PORT=27017
      - MONGO_DBNAME=unifi-db
      - MEM_LIMIT=1024 #по желанию
      - MEM_STARTUP=1024 #по желанию
      #- MONGO_TLS= #по желанию
      #- MONGO_AUTHSOURCE= #по желанию
    volumes:
      - /home/user/docker/unifi-network-application/config:/config
    restart: unless-stopped

  vaultwarden:
    image: vaultwarden/server:latest
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.8
    container_name: vaultwarden
    restart: always
    environment:
      DOMAIN: "https://test111.duckdns.org"
      SIGNUPS_ALLOWED: "false"
      INVITATIONS_ALLOWED: "false"
      SHOW_PASSWORD_HINT: "false"
      LOG_FILE: "/data/vaultwarden.log"
      LOG_LEVEL: "warn"
    volumes:
      - ./vw-data:/data # путь перед : можно изменить
    #ports:
      #- 8888:80 # вы можете заменить 11001 на Preferred port

Мой Caddyfile:

{$DOMAIN} {
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }

    # Используйте вызов ACME DNS-01, чтобы получить сертификат для заданного домена.
    tls {
        dns duckdns {$DUCKDNS_TOKEN}
    }

    # Эта настройка может иметь проблемы совместимости с некоторыми браузерами
    # (например, загрузка вложений в Firefox). Попробуйте отключить это,
    # если столкнетесь с проблемами.
    encode zstd gzip

    # Прокси всё к Rocket
    reverse_proxy vaultwarden:80
}

Эта настройка работает отлично, я могу получить доступ к своему VaultWarden по SSL, перейдя по адресу https://test111.duckdns.org, и он использует сертификат Let’s Encrypt. Я использовал это руководство, чтобы добиться этого.

Однако я хотел бы использовать Caddy для нескольких служб Docker. Например, чтобы посетить VaultWarden, я мог бы перейти по адресу https://vaultwarden.test111.duckdns.org или https://service.test111.duckdns.org и т.д.

Я пытался изменить это в Caddyfile, используя подстановочные знаки:

# Подстановочный SSL для всех подсайтов под доменом, определенным в переменной {$DOMAIN}
*.{$DOMAIN} {
    tls {
        dns duckdns {$DUCKDNS_TOKEN}
    }

    # Конфигурация логов (по желанию, при необходимости подгоняйте)
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }

    # Настройка обратного прокси для общего сервиса, если ни одна конкретная служба не соответствует
    reverse_proxy service_default:80
}

# Служба Vaultwarden
vaultwarden.{$DOMAIN} {
    reverse_proxy vaultwarden:80
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }
}

unifi.{$DOMAIN} {
    reverse_proxy unifi-network-application:8443
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }
}

Я также добавил переопределения хоста в настройки DNS-резолвера pfSense для различных служб, чтобы они указывали на мои IP-адреса Docker:

Хост: unifi     
Домен: test111.duckdns.org     
IP-адрес: 172.16.117.9
Хост: vaultwarden   
Домен: test111.duckdns.org     
IP-адрес: 172.16.117.8

И это можно найти с помощью nslookup:

nslookup vaultwarden.test111.duckdns.org
Сервер:     127.0.0.53
Адрес:    127.0.0.53#53

Неавторитетный ответ:
Имя:   vaultwarden.test111.duckdns.org
Адрес: 172.16.117.8

Тем не менее, это не работает, я не могу получить доступ к своим службам Docker, и в моем контейнере Caddy появляются следующие ошибки:

{"level":"info","ts":1731770427.407683,"msg":"использование конфигурации из файла","file":"/etc/caddy/Caddyfile"}

{"level":"info","ts":1731770427.4159002,"msg":"адаптация конфигурации в JSON","adapter":"caddyfile"}

{"level":"info","ts":1731770427.4204524,"logger":"admin","msg":"админская конечная точка запущена","address":"localhost:2019","enforce_origin":false,"origins":["//localhost:2019","//[::1]:2019","//127.0.0.1:2019"]}

{"level":"info","ts":1731770427.4216182,"logger":"tls.cache.maintenance","msg":"запущено фоновое обслуживание сертификатов","cache":"0x383a900"}

{"level":"info","ts":1731770427.4221516,"logger":"http.auto_https","msg":"сервер слушает только на HTTPS-порту, но не имеет политик подключения TLS; добавление одной для включения TLS","server_name":"srv0","https_port":443}

{"level":"info","ts":1731770427.4224873,"logger":"http.auto_https","msg":"включение автоматических перенаправлений HTTP->HTTPS","server_name":"srv0"}

{"level":"info","ts":1731770427.4248602,"logger":"http","msg":"включение слушателя HTTP/3","addr":":443"}

{"level":"info","ts":1731770427.4254677,"msg":"не удалось достаточно увеличить размер буфера приёма (было: 208 kiB, хотели: 7168 kiB, получили: 416 kiB). См. https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes для подробностей."}

{"level":"info","ts":1731770427.4263346,"logger":"http.log","msg":"сервер работает","name":"srv0","protocols":["h1","h2","h3"]}

{"level":"info","ts":1731770427.4268074,"logger":"http.log","msg":"сервер работает","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}

{"level":"info","ts":1731770427.4269671,"logger":"http","msg":"включение автоматического управления сертификатами TLS","domains":["vaultwarden.test111.duckdns.org","unifi.test111.duckdns.org","*.test111.duckdns.org"]}

{"level":"info","ts":1731770427.4284034,"msg":"автосохранённая конфигурация (загрузите с флагом --resume)","file":"/config/caddy/autosave.json"}

{"level":"info","ts":1731770427.4289424,"msg":"обслуживание первоначальной конфигурации"}

{"level":"info","ts":1731770427.4288747,"logger":"tls.obtain","msg":"приобретение блокировки","identifier":"vaultwarden.test111.duckdns.org"}

{"level":"info","ts":1731770427.4296653,"logger":"tls.obtain","msg":"приобретение блокировки","identifier":"unifi.test111.duckdns.org"}

{"level":"info","ts":1731770427.429877,"logger":"tls.obtain","msg":"приобретение блокировки","identifier":"*.test111.duckdns.org"}

{"level":"info","ts":1731770427.4420304,"logger":"tls","msg":"очистка хранилища проводилась недавно; пока пропустить","storage":"FileStorage:/data/caddy","instance":"a16163dc-5a65-4977-a1d2-99f3861efde9","try_again":1731856827.4420183,"try_again_in":86399.999995129}

{"level":"info","ts":1731770427.4445798,"logger":"tls","msg":"завершена очистка единиц хранения"}

{"level":"info","ts":1731770427.44627,"logger":"tls.obtain","msg":"блокировка получена","identifier":"*.test111.duckdns.org"}

{"level":"info","ts":1731770427.4462702,"logger":"tls.obtain","msg":"блокировка получена","identifier":"vaultwarden.test111.duckdns.org"}

{"level":"info","ts":1731770427.446822,"logger":"tls.obtain","msg":"получение сертификата","identifier":"*.test111.duckdns.org"}

{"level":"info","ts":1731770427.4474423,"logger":"tls.obtain","msg":"получение сертификата","identifier":"vaultwarden.test111.duckdns.org"}

{"level":"info","ts":1731770427.4468448,"logger":"tls.obtain","msg":"блокировка получена","identifier":"unifi.test111.duckdns.org"}

{"level":"info","ts":1731770427.4486356,"logger":"tls.obtain","msg":"получение сертификата","identifier":"unifi.test111.duckdns.org"}

{"level":"info","ts":1731770427.4698937,"logger":"tls","msg":"ожидание внутреннего ограничения скорости","identifiers":["unifi.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.4699652,"logger":"tls","msg":"завершено ожидание внутреннего ограничения скорости","identifiers":["unifi.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.4700146,"logger":"tls","msg":"использование учетной записи ACME","account_id":"https://acme-v02.api.letsencrypt.org/acme/acct/1972895377","account_contact":[]}

{"level":"info","ts":1731770427.4704852,"logger":"tls","msg":"ожидание внутреннего ограничения скорости","identifiers":["vaultwarden.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.4709487,"logger":"tls","msg":"завершено ожидание внутреннего ограничения скорости","identifiers":["vaultwarden.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.472356,"logger":"tls","msg":"использование учетной записи ACME","account_id":"https://acme-v02.api.letsencrypt.org/acme/acct/1972895377","account_contact":[]}

{"level":"info","ts":1731770427.4715934,"logger":"tls.issuance.acme","msg":"ожидание внутреннего ограничения скорости","identifiers":["*.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.4725082,"logger":"tls.issuance.acme","msg":"завершено ожидание внутреннего ограничения скорости","identifiers":["*.test111.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}

{"level":"info","ts":1731770427.4725654,"logger":"tls.issuance.acme","msg":"использование учетной записи ACME","account_id":"https://acme-v02.api.letsencrypt.org/acme/acct/1972895377","account_contact":[]}

{"level":"info","ts":1731770428.6145887,"logger":"tls.acme_client","msg":"попытка решить задачу","identifier":"vaultwarden.test111.duckdns.org","challenge_type":"tls-alpn-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}

{"level":"info","ts":1731770428.686017,"logger":"tls.acme_client","msg":"попытка решить задачу","identifier":"unifi.test111.duckdns.org","challenge_type":"tls-alpn-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}

{"level":"info","ts":1731770428.8439467,"logger":"tls.issuance.acme.acme_client","msg":"попытка решить задачу","identifier":"*.test111.duckdns.org","challenge_type":"dns-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}

{"level":"error","ts":1731770429.2492373,"logger":"tls.acme_client","msg":"задача не удалась","identifier":"unifi.test111.duckdns.org","challenge_type":"tls-alpn-01","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"не найдено действительных A записей для unifi.test111.duckdns.org; Проблема с DNS: SERVFAIL при проверке AAAA для unifi.test111.duckdns.org - серверы имен домена могут быть неисправны","instance":"","subproblems":[]}}

{"level":"error","ts":1731770429.2495832,"logger":"tls.acme_client","msg":"подтверждение авторизации","identifier":"unifi.test111.duckdns.org","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"не найдено действительных A записей для unifi.test111.duckdns.org; Проблема с DNS: SERVFAIL при проверке AAAA для unifi.test111.duckdns.org - серверы имен домена могут быть неисправны","instance":"","subproblems":[]},"order":"https://acme-v02.api.letsencrypt.org/acme/order/1972895377/323713330197","attempt":1,"max_attempts":3}

{"level":"info","ts":1731770430.672126,"logger":"tls.acme_client","msg":"попытка решить задачу","identifier":"unifi.test111.duckdns.org","challenge_type":"http-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}

{"level":"error","ts":1731770431.3256845,"logger":"tls.issuance.acme.acme_client","msg":"очистка решения","identifier":"*.test111.duckdns.org","challenge_type":"dns-01","error":"нет памяти, чтобы представить DNS запись для \"_acme-challenge.test111.duckdns.org\" (обычно это нормально, если представление также не удалось)"}

{"level":"error","ts":1731770431.5020833,"logger":"tls.obtain","msg":"не удалось получить сертификат от издателя","identifier":"*.test111.duckdns.org","issuer":"acme-v02.api.letsencrypt.org-directory","error":"[*test111.duckdns.org] решение задач: представление для задачи: не удалось определить зону для домена \"_acme-challenge.test111.duckdns.org\": неожиданный код ответа 'SERVFAIL' для _acme-challenge.test111.duckdns.org. (order=https://acme-v02.api.letsencrypt.org/acme/order/1972895377/323713330907) (ca=https://acme-v02.api.letsencrypt.org/directory)"}

{"level":"error","ts":1731770431.5025475,"logger":"tls.obtain","msg":"будет повторная попытка","error":"[*test111.duckdns.org] Получить: [*.test111.duckdns.org] решение: [*.test111.duckdns.org]: [*.test111.duckdns.org] авторизация не удалась: HTTP 400 urn:ietf:params:acme:error:dns - не найдено действительных A записей для unifi.test111.duckdns.org; не найдены действительные AAAA записи для unifi.test111.duckdns.org (ca=https://acme-v02.api.letsencrypt.org/directory)","attempt":1,"retrying_in":60,"elapsed":4.05621756,"max_duration":2592000}

{"level":"error","ts":1731770438.8788044,"logger":"tls.acme_client","msg":"задача не удалась","identifier":"vaultwarden.test111.duckdns.org","challenge_type":"http-01","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны","instance":"","subproblems":[]}}

{"level":"error","ts":1731770438.8789387,"logger":"tls.acme_client","msg":"подтверждение авторизации","identifier":"vaultwarden.test111.duckdns.org","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны"},"order":"https://acme-v02.api.letsencrypt.org/acme/order/1972895377/323713378127","attempt":1,"max_attempts":3}

{"level":"info","ts":1731770440.2944498,"logger":"tls.acme_client","msg":"попытка решить задачу","identifier":"vaultwarden.test111.duckdns.org","challenge_type":"http-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}

{"level":"error","ts":1731770450.1866465,"logger":"tls.acme_client","msg":"задача не удалась","identifier":"unifi.test111.duckdns.org","challenge_type":"http-01","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"не найдены действительные A записи для unifi.test111.duckdns.org; не найдены действительные AAAA записи для unifi.test111.duckdns.org","instance":"","subproblems":[]}}

{"level":"error","ts":1731770450.1867352,"logger":"tls.acme_client","msg":"подтверждение авторизации","identifier":"unifi.test111.duckdns.org","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"не найдены действительные A записи для unifi.test111.duckdns.org; не найдены действительные AAAA записи для unifi.test111.duckdns.org","instance":"","subproblems":[]},"order":"https://acme-v02.api.letsencrypt.org/acme/order/1972895377/323713337107","attempt":2,"max_attempts":3}

{"level":"error","ts":1731770450.1868649,"logger":"tls.obtain","msg":"не удалось получить сертификат от издателя","identifier":"unifi.test111.duckdns.org","issuer":"acme-v02.api.letsencrypt.org-directory","error":"HTTP 400 urn:ietf:params:acme:error:dns - не найдены действительные A записи для unifi.test111.duckdns.org; не найдены действительные AAAA записи для unifi.test111.duckdns.org"}

{"level":"error","ts":1731770450.1870203,"logger":"tls.obtain","msg":"будет повторная попытка","error":"[unifi.test111.duckdns.org] Получить: [unifi.test111.duckdns.org] решение: unifi.test111.duckdns.org: [unifi.test111.duckdns.org] авторизация не удалась: HTTP 400 urn:ietf:params:acme:error:dns - не найдены действительные A записи для unifi.test111.duckdns.org; не найдены действительные AAAA записи для unifi.test111.duckdns.org (ca=https://acme-v02.api.letsencrypt.org/directory)","attempt":1,"retrying_in":60,"elapsed":22.738644345,"max_duration":2592000}

{"level":"error","ts":1731770460.5871239,"logger":"tls.acme_client","msg":"задача не удалась","identifier":"vaultwarden.test111.duckdns.org","challenge_type":"http-01","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны","instance":"","subproblems":[]}}

{"level":"error","ts":1731770460.5872557,"logger":"tls.acme_client","msg":"подтверждение авторизации","identifier":"vaultwarden.test111.duckdns.org","problem":{"type":"urn:ietf:params:acme:error:dns","title":"","detail":"Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны"},"order":"https://acme-v02.api.letsencrypt.org/acme/order/1972895377/323713378127","attempt":2,"max_attempts":3}

{"level":"error","ts":1731770460.5873518,"logger":"tls.obtain","msg":"не удалось получить сертификат от издателя","identifier":"vaultwarden.test111.duckdns.org","issuer":"acme-v02.api.letsencrypt.org-directory","error":"HTTP 400 urn:ietf:params:acme:error:dns - Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны"}

{"level":"error","ts":1731770460.5875442,"logger":"tls.obtain","msg":"будет повторная попытка","error":"[vaultwarden.test111.duckdns.org] Получить: [vaultwarden.test111.duckdns.org] решение: vaultwarden.test111.duckdns.org: [vaultwarden.test111.duckdns.org] авторизация не удалась: HTTP 400 urn:ietf:params:acme:error:dns - Проблема с DNS: SERVFAIL при проверке A для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны; Проблема с DNS: SERVFAIL при проверке AAAA для vaultwarden.test111.duckdns.org - серверы имен домена могут быть неисправны (ca=https://acme-v02.api.letsencrypt.org/directory)","attempt":1,"retrying_in":60,"elapsed":33.140588664,"max_duration":2592000}

Я, по сути, пытаюсь достичь этого, но с Caddy и duck dns. Но я не уверен, возможно ли это или неправильно настраиваю Caddy.

Ответ или решение

Как настроить Caddy с SSL от Let’s Encrypt и Duck DNS для обслуживания нескольких служб на Docker-контейнерах

В этом руководстве мы обсудим, как можно использовать Caddy совместно с Let’s Encrypt и Duck DNS для развертывания нескольких служб на Docker-контейнерах. Поскольку у вас уже есть работающая установка в связке с VaultWarden, мы будем сосредоточены на расширении этой конфигурации для других служб, таких как UniFi Network Application.

Шаг 1: Настройка Duck DNS

Для использования Duck DNS вам необходимо удостовериться, что доменное имя, например test111.duckdns.org, корректно настроено и указывает на ваш Raspberry Pi. Убедитесь, что ваш Duck DNS установлен и обновляется запросами, чтобы он всегда указывал на ваш текущий IP-адрес. Часто это реализуется с помощью скрипта на вашем Raspberry Pi, который периодически делает HTTP-запрос для обновления IP.

Шаг 2: Настройка pfSense

Вы уже добавили нужные настройки в pfSense для разрешения DNS. Убедитесь, что ваши записи выглядят следующим образом:

Host: vaultwarden    
Domain: test111.duckdns.org  
IP Address: 172.16.117.8

Host: unifi     
Domain: test111.duckdns.org    
IP Address: 172.16.117.9

Это позволит вашему маршрутизатору правильно указывать внутренние IP-адреса контейнеров.

Шаг 3: Обновление Docker Compose файла

Отредактируйте ваш docker-compose.yml, чтобы добавить новые сервисы и убедиться, что на них есть конфигурация сети:

version: "3.8"

networks:
  docker-mongoose:
    driver: bridge
    ipam:
      config:
        - subnet: "172.16.117.0/27"

services:
  caddy:
    image: caddy:2
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.10
    container_name: caddy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-config:/config
      - ./caddy-data:/data
    environment:
      DOMAIN: "test111.duckdns.org"
      DUCKDNS_TOKEN: "<duckdns_token>"
      LOG_FILE: "/data/access.log"

  vaultwarden:
    image: vaultwarden/server:latest
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.8
    container_name: vaultwarden
    environment:
      DOMAIN: "https://vaultwarden.test111.duckdns.org"
    restart: always
    volumes:
      - ./vw-data:/data

  unifi-network-application:
    image: lscr.io/linuxserver/unifi-network-application:latest
    networks:
      docker-mongoose:
        ipv4_address: 172.16.117.9
    container_name: unifi-network-application
    environment:
      - TZ=Europe/London
    restart: unless-stopped

Здесь дополните описание для других сервисов, чтобы они были доступны через Caddy.

Шаг 4: Конфигурация Caddyfile

Ваш Caddyfile играет критически важную роль в маршрутизации запросов. Обновите его следующим образом:

{$DOMAIN} {
    log {
        level INFO
        output file {$LOG_FILE} {
            roll_size 10MB
            roll_keep 10
        }
    }

    tls {
        dns duckdns {$DUCKDNS_TOKEN}
    }

    encode zstd gzip

    # Проксирование для VaultWarden
    reverse_proxy vaultwarden:80 {
        header_down Access-Control-Allow-Origin *
    }

    # Проксирование для UniFi Network Application
    reverse_proxy unifi.test111.duckdns.org {
        reverse_proxy unifi-network-application:8443 {
            header_down Access-Control-Allow-Origin *
        }
    }
}

# Опциональные записи для поддоменов
*.{$DOMAIN} {
    reverse_proxy {http.request.host} {
        to {
            if {http.request.host} == "vaultwarden.{$DOMAIN}" { to vaultwarden:80 }
            if {http.request.host} == "unifi.{$DOMAIN}" { to unifi-network-application:8443 }
        }
    }
}

Шаг 5: Проверка и перезапуск Docker

После обновления вашего docker-compose.yml и Caddyfile, выполните следующие команды, чтобы перезапустить ваши контейнеры и применить изменения:

docker-compose down
docker-compose up -d

Убедитесь, что ваша настройка Caddy работает должным образом. Проверьте логи Caddy на наличие ошибок:

docker logs caddy

Шаг 6: Тестирование

Теперь, когда все настроено, вы можете получить доступ к вашим службам, используя URL-адреса:

Заключение

Теперь вы успешно настроили Caddy с Let’s Encrypt и Duck DNS для обслуживания нескольких Docker-сервисов. Если возникают какие-либо проблемы, внимательно проверьте логи Caddy и настройки Docker-контейнеров. Настройка безопасного и удобного доступа ко всем вашим услугам – важный шаг в улучшении рабочего процесса.

Оцените материал
Добавить комментарий

Капча загружается...