- Вопрос или проблема
- Ответ или решение
- Как настроить Caddy с SSL от Let’s Encrypt и Duck DNS для обслуживания нескольких служб на Docker-контейнерах
- Шаг 1: Настройка Duck DNS
- Шаг 2: Настройка pfSense
- Шаг 3: Обновление Docker Compose файла
- Шаг 4: Конфигурация Caddyfile
- Шаг 5: Проверка и перезапуск Docker
- Шаг 6: Тестирование
- Заключение
Вопрос или проблема
Мне удалось настроить 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-контейнеров. Настройка безопасного и удобного доступа ко всем вашим услугам – важный шаг в улучшении рабочего процесса.