# 在 Synology NAS 上用 Docker 架 AdGuard Home 並啟用 DoT 和 DoH 因為 Synology DSM 有內建[取得並自動更新 Let's Encrypt 憑證的機制](https://kb.synology.com/zh-tw/DSM/tutorial/How_to_enable_HTTPS_and_create_a_certificate_signing_request_on_your_Synology_NAS),如果能用這裡的憑證來提供 DoT(DNS over TLS)跟 DoH(DNS over HTTPS)的服務就好了。 > 如果是 Synology DDNS 的網域,因為是他們的 Server 直接走 DNS-01 驗證方式,所以不需要設定什麼就能夠輕鬆拿到 Wildcard(萬用字元)憑證。但如果是自己的網域則只能走 HTTP-01 驗證方式(支援 IPv6),想要 Wildcard(萬用字元)憑證的話推薦使用 acme.sh,因為他有內建 Synology DSM 的 deploy hook,還有一篇 wiki 直接[教你怎麼做](https://github.com/acmesh-official/acme.sh/wiki/Synology-NAS-Guide) ```bash # https://dash.cloudflare.com/profile/api-tokens export CF_Token=<CLOUDFLARE_API_TOKEN> export CF_Email=<CLOUDFLARE_EMAIL> ./acme.sh --issue --server letsencrypt --home . --dns dns_cf -d 'pinlin.me' -d '*.pinlin.me' export SYNO_USE_TEMP_ADMIN=1 export SYNO_PORT=<HTTP_PORT> export SYNO_CREATE=1 export SYNO_CERTIFICATE="Pin Lin's Wildcard Certificate by acme.sh" ./acme.sh --deploy --home . -d 'pinlin.me' --deploy-hook synology_dsm ``` 到工作排程器設定每週執行一次更新憑證(快到期才會真的更新) ```bash /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh ``` 產生完憑證之後,使用 SSH 登入 NAS 然後切換到 root 帳號(務必小心操作),`cat /usr/syno/etc/certificate/_archive/INFO` 可以看到 NAS 目前有憑證對應的代號 `xxxxxx`,再到 `/usr/syno/etc/certificate/_archive/xxxxxx` 目錄就可以看到憑證的檔案了 接著就是直接 bind-mount 進去,附上我的 `docker-compose.yml` 內容: ```yaml services: adguardhome: image: adguard/adguardhome:latest container_name: adguardhome network_mode: host # 為了取到真正的 Client IP volumes: - /volume1/docker/adguardhome/work:/opt/adguardhome/work - /volume1/docker/adguardhome/conf:/opt/adguardhome/conf - /usr/syno/etc/certificate/_archive/xxxxxx:/certs:ro restart: always ``` 在工作排程器設定更新完憑證 reload AdGuard 的 container(實驗中,不確定能不能 work) ```bash docker exec adguardhome /opt/adguardhome/AdGuardHome -s reload ```