HTTPS not enabled on reverse-proxied Jellyfin

1. The problem I’m having:

I am attempting to run a Jellyfin server on a Ubuntu machine, using Caddy as a reverse proxy/to enable HTTPS support. Issue is that the reverse proxy appears to be working, but traffic is not auto routed to HTTPS like I would expect Caddy to do. Jellyfin by default handles traffic on port 80 (HTTP). I have my router port forwarded from external port 80, to internal port 8096. I have verified the port is actually open, and as stated before, I can access the Jellyfin server through my DNS I have linked with Caddy, but Caddy isn’t using HTTPS. I am using a DNS through DuckDNS. I also have a port forward rule for port 443 (HTTPS) to internal port 8920, but it still appears closed because there is no traffic listening on that port in Jellyfin yet (or maybe I won’t need that at all if Caddy will work).

The more explicit of an explanation, the better. I am fairly new to this stuff, but pick up things quickly.

EDIT: I have a base URL of /jellyfin for the server and I read here: jellyfin(dot)org/docs/general/networking/caddy#subpath (can only have 4 links in a post since this is a new account) that there are additional changes in the Caddyfile that need to be made, namely adding a redir and adding the base url to the reverse proxy command, but still no luck. It isn’t serving over HTTPS.

2. Error messages and/or full log output:

-- Boot b3338b53e84c4c5f83544bda582d078c --
Dec 31 17:40:35 connor-OptiPlex-7060 systemd[1]: Starting Caddy...
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: caddy.HomeDir=/var/lib/caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: caddy.AppDataDir=/var/lib/caddy/.local/share/caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: caddy.AppConfigDir=/var/lib/caddy/.config/caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: caddy.ConfigAutosavePath=/var/lib/caddy/.config/caddy/autosave.json
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: caddy.Version=v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.GOOS=linux
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.GOARCH=amd64
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.Compiler=gc
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.NumCPU=6
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.GOMAXPROCS=6
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: runtime.Version=go1.21.4
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: os.Getwd=/
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: LANG=en_US.UTF-8
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: NOTIFY_SOCKET=/run/systemd/notify
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: HOME=/var/lib/caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: LOGNAME=caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: USER=caddy
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: INVOCATION_ID=ac3acbb1b746444798a1f22280896553
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: JOURNAL_STREAM=8:25036
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: SYSTEMD_EXEC_PID=1587
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: GOTRACEBACK=none
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6391742,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"warn","ts":1704062435.6424487,"msg":"Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies","adapter":"caddyfile","file"
:"/etc/caddy/Caddyfile","line":10}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6440113,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//[::1]:201
9","//127.0.0.1:2019","//localhost:2019"]}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.645218,"logger":"http.auto_https","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding on
e to enable TLS","server_name":"srv0","https_port":443}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6452408,"logger":"http.auto_https","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6454442,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6460683,"msg":"failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://gi
thub.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details."}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.646239,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0004c4400"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6502075,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6503255,"logger":"http.log","msg":"server running","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6503305,"logger":"http","msg":"enabling automatic TLS certificate management","domains":["dz-jellyfin.duckdns.org"]}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6507232,"logger":"tls.obtain","msg":"acquiring lock","identifier":"dz-jellyfin.duckdns.org"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6520736,"msg":"autosaved config (load with --resume flag)","file":"/var/lib/caddy/.config/caddy/autosave.json"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6521375,"msg":"serving initial configuration"}
Dec 31 17:40:35 connor-OptiPlex-7060 systemd[1]: Started Caddy.
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.655744,"logger":"tls.obtain","msg":"lock acquired","identifier":"dz-jellyfin.duckdns.org"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6558774,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"dz-jellyfin.duckdns.org"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"warn","ts":1704062435.659813,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/var/lib/caddy/.loc
al/share/caddy","instance":"f910ed84-ef03-4fbe-8500-86f0fa09942a","try_again":1704148835.6598113,"try_again_in":86399.999999771}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6598668,"logger":"tls","msg":"finished cleaning storage units"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6637447,"logger":"tls.issuance.acme","msg":"waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca":"htt
ps://acme-v02.api.letsencrypt.org/directory","account":""}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6637595,"logger":"tls.issuance.acme","msg":"done waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca"
:"https://acme-v02.api.letsencrypt.org/directory","account":""}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.698737,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Dec 31 17:40:35 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062435.6987503,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"warn","ts":1704062436.198032,"logger":"dynamic_dns.ip_sources.simple_http","msg":"no IP found; consider disabling this IP version","type":"IPv6"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062436.1980567,"logger":"dynamic_dns","msg":"updating DNS record","zone":"dz-jellyfin.duckdns.org","type":"A","name":"jellyfin","value":"<PUBLIC IP>","ttl":0}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062436.3247044,"logger":"dynamic_dns","msg":"finished updating DNS","current_ips":["<PUBLIC IP>"]}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062436.3962328,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062436.4978316,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.dz-jellyfin.duckdns.org\" (usually OK if presenting also failed)"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062436.6204655,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"dz-jellyfin.duckdns.org","issuer":"acme-v02.api.letsencrypt.org-directory","error":"[dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=dz5ntqrcbmw2XOyO96DW6LxtV99C-cpoPsY2am2T7wE&verbose=true], body: KO (order=https://acme-v02.api.letsencrypt.org/acme/order/1493309776/233312529576) (ca=https://acme-v02.api.letsencrypt.org/directory)"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062436.6218135,"logger":"tls.issuance.zerossl","msg":"waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca":"https://acme.zerossl.com/v2/DV90","account":"caddy@zerossl.com"}
Dec 31 17:40:36 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062436.6218235,"logger":"tls.issuance.zerossl","msg":"done waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca":"https://acme.zerossl.com/v2/DV90","account":"caddy@zerossl.com"}
Dec 31 17:40:37 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062437.478123,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","ca":"https://acme.zerossl.com/v2/DV90"}
Dec 31 17:40:37 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062437.5005999,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.dz-jellyfin.duckdns.org\" (usually OK if presenting also failed)"}
Dec 31 17:40:37 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062437.8178332,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"dz-jellyfin.duckdns.org","issuer":"acme.zerossl.com-v2-DV90","error":"[dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=vz4CNBeqIGWUiy0ilNLhGEVTdiC3kfnZER92pv_v-rE&verbose=true], body: KO (order=https://acme.zerossl.com/v2/DV90/order/KtcNQnmWCu2Uwmoe4r1ULA) (ca=https://acme.zerossl.com/v2/DV90)"}
Dec 31 17:40:37 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062437.8178804,"logger":"tls.obtain","msg":"will retry","error":"[dz-jellyfin.duckdns.org] Obtain: [dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=vz4CNBeqIGWUiy0ilNLhGEVTdiC3kfnZER92pv_v-rE&verbose=true], body: KO (order=https://acme.zerossl.com/v2/DV90/order/KtcNQnmWCu2Uwmoe4r1ULA) (ca=https://acme.zerossl.com/v2/DV90)","attempt":1,"retrying_in":60,"elapsed":2.162124852,"max_duration":2592000}
Dec 31 17:41:37 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062497.818448,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"dz-jellyfin.duckdns.org"}
Dec 31 17:41:38 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062498.366481,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
Dec 31 17:41:38 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062498.3888366,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.dz-jellyfin.duckdns.org\" (usually OK if presenting also failed)"}
Dec 31 17:41:38 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062498.4815755,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"dz-jellyfin.duckdns.org","issuer":"acme-v02.api.letsencrypt.org-directory","error":"[dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=UHDNTPSB8aM8BSBxV-ne33zV_Jcd2KwRcvKGN9n2TTU&verbose=true], body: KO (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/130737394/13345863634) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
Dec 31 17:41:38 connor-OptiPlex-7060 caddy[1587]: {"level":"info","ts":1704062498.88112,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","ca":"https://acme.zerossl.com/v2/DV90"}
Dec 31 17:41:38 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062498.9032001,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.dz-jellyfin.duckdns.org\" (usually OK if presenting also failed)"}
Dec 31 17:41:39 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062499.018438,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"dz-jellyfin.duckdns.org","issuer":"acme.zerossl.com-v2-DV90","error":"[dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=RlWwaSjwIde-ZFoLAgeCjeOTYyeFzC0deFdPkU02wag&verbose=true], body: KO (order=https://acme.zerossl.com/v2/DV90/order/1LJ1ZWnGsZl4Hii2PUlyHQ) (ca=https://acme.zerossl.com/v2/DV90)"}
Dec 31 17:41:39 connor-OptiPlex-7060 caddy[1587]: {"level":"error","ts":1704062499.0184746,"logger":"tls.obtain","msg":"will retry","error":"[dz-jellyfin.duckdns.org] Obtain: [dz-jellyfin.duckdns.org] solving challenges: presenting for challenge: adding temporary record for zone \"duckdns.org.\": DuckDNS request failed, expected (OK) but got (KO), url: [https://www.duckdns.org/update?domains=dz-jellyfin.duckdns.org&token=&txt=RlWwaSjwIde-ZFoLAgeCjeOTYyeFzC0deFdPkU02wag&verbose=true], body: KO (order=https://acme.zerossl.com/v2/DV90/order/1LJ1ZWnGsZl4Hii2PUlyHQ) (ca=https://acme.zerossl.com/v2/DV90)","attempt":2,"retrying_in":120,"elapsed":63.362718937,"max_duration":2592000}

3. Caddy version:

v2.7.6

4. How I installed and ran Caddy:

I installed following the exact instructions here: Install — Caddy Documentation (I quite literally copy/pasted what is there for stable build)

a. System environment:

Ubuntu 22.04.3 LTS

b. Command:

Service runs on startup. I just use caddy stop and caddy start to start/stop the service if I am tweaking things. If I am just modifying the Caddyfile I just use caddy adapt.

c. Service/unit/compose file:

[Unit]
Description=Caddy
Documentation=https://caddyserver.com/docs/
After=network.target network-online.target
Requires=network-online.target

[Service]
Type=notify
User=caddy
Group=caddy
ExecStart=/usr/bin/caddy run --environ --config /etc/caddy/Caddyfile
ExecReload=/usr/bin/caddy reload --config /etc/caddy/Caddyfile --force
TimeoutStopSec=5s
LimitNOFILE=1048576
LimitNPROC=512
PrivateTmp=true
ProtectSystem=full
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE

[Install]
WantedBy=multi-user.target

d. My complete Caddy config:

{
	dynamic_dns {
		# replace with your DNS provider's plugin name and credentials

		provider duckdns {env.DUCKDNS_API_TOKEN}

		domains {
			# DNS zone first, followed by subdomain if any (I know it's weird)

			dz-jellyfin.duckdns.org jellyfin
		}
	}
}

dz-jellyfin.duckdns.org {
	reverse_proxy 127.0.0.1:8096 127.0.0.1:8920
	tls {
		dns duckdns {env.DUCKDNS_API_TOKEN}
	}
}

5. Links to relevant resources:

I was following this tutorial: Access your Jellyfin anywhere with Caddy
I also have these plugins installed using the add-package command since I don’t have/can’t have a static public IP through my ISP:
GitHub - mholt/caddy-dynamicdns: Caddy app that keeps your DNS records (A/AAAA) pointed at itself.
GitHub - caddy-dns/duckdns: Caddy module: dns.providers.duckdns

How did you set the env var? Are you sure it’s set? It reads to me like the token was empty on the request to DuckDNS.

See the instructions on Keep Caddy Running — Caddy Documentation which explain how to set env var overrides for your systemd service.

Make sure you followed these steps Build from source — Caddy Documentation otherwise next time you apt upgrade to a new Caddy version, your plugins will get wiped out.

Yeah that is not what I did for the environment variable. I had just said DUCKDNS_API_TOKEN=<my-token-here> and then did export DUCKDNS_API_TOKEN just in the normal terminal, but I followed the instructions you linked and restarted the service, but I am still unable to access the server over HTTPS. Here is the updated logs:

Jan 01 01:55:23 connor-OptiPlex-7060 systemd[1]: Starting Caddy...
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: caddy.HomeDir=/var/lib/caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: caddy.AppDataDir=/var/lib/caddy/.local/share/caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: caddy.AppConfigDir=/var/lib/caddy/.config/caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: caddy.ConfigAutosavePath=/var/lib/caddy/.config/caddy/autosave.json
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: caddy.Version=v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.GOOS=linux
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.GOARCH=amd64
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.Compiler=gc
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.NumCPU=6
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.GOMAXPROCS=6
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: runtime.Version=go1.21.4
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: os.Getwd=/
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: LANG=en_US.UTF-8
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: NOTIFY_SOCKET=/run/systemd/notify
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: HOME=/var/lib/caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: LOGNAME=caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: USER=caddy
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: INVOCATION_ID=c570bf0dcd944ad2b5f3633e5d14fb1d
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: JOURNAL_STREAM=8:30513
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: SYSTEMD_EXEC_PID=2934
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: DUCKDNS_API_TOKEN=<my-token-here>
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: GOTRACEBACK=none
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8316572,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"warn","ts":1704092123.8326178,"msg":"Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies","adapter":"caddyfile","file"
:"/etc/caddy/Caddyfile","line":10}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.833192,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//localhost:
2019","//[::1]:2019","//127.0.0.1:2019"]}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8333313,"logger":"http.auto_https","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding o
ne to enable TLS","server_name":"srv0","https_port":443}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.83334,"logger":"http.auto_https","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8333862,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc0004a3900"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8335369,"logger":"http.log","msg":"server running","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8335629,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8336208,"msg":"failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details."}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.833691,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8336966,"logger":"http","msg":"enabling automatic TLS certificate management","domains":["dz-jellyfin.duckdns.org"]}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.833841,"msg":"autosaved config (load with --resume flag)","file":"/var/lib/caddy/.config/caddy/autosave.json"}
Jan 01 01:55:23 connor-OptiPlex-7060 systemd[1]: Started Caddy.
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8343701,"logger":"tls.obtain","msg":"acquiring lock","identifier":"dz-jellyfin.duckdns.org"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8351073,"msg":"serving initial configuration"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"warn","ts":1704092123.837469,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/var/lib/caddy/.local/share/caddy","instance":"eab0e6de-b24c-4bf2-a294-b3a1652270d7","try_again":1704178523.8374681,"try_again_in":86399.999999742}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8375509,"logger":"tls","msg":"finished cleaning storage units"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.83993,"logger":"tls.obtain","msg":"lock acquired","identifier":"dz-jellyfin.duckdns.org"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8400078,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"dz-jellyfin.duckdns.org"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8404362,"logger":"tls.issuance.acme","msg":"waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.840444,"logger":"tls.issuance.acme","msg":"done waiting on internal rate limiter","identifiers":["dz-jellyfin.duckdns.org"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8844712,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Jan 01 01:55:23 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092123.8844907,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Jan 01 01:55:24 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092124.2955663,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"dz-jellyfin.duckdns.org","challenge_type":"dns-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}
Jan 01 01:55:24 connor-OptiPlex-7060 caddy[2934]: {"level":"warn","ts":1704092124.3479137,"logger":"dynamic_dns.ip_sources.simple_http","msg":"no IP found; consider disabling this IP version","type":"IPv6"}
Jan 01 01:55:24 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092124.3479395,"logger":"dynamic_dns","msg":"updating DNS record","zone":"dz-jellyfin.duckdns.org","type":"A","name":"jellyfin","value":"<my-public-ip>","ttl":0}
Jan 01 01:55:24 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092124.4585342,"logger":"dynamic_dns","msg":"finished updating DNS","current_ips":["<my-public-ip>"]}
Jan 01 01:55:27 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092127.4692729,"logger":"tls.issuance.acme.acme_client","msg":"authorization finalized","identifier":"dz-jellyfin.duckdns.org","authz_status":"valid"}
Jan 01 01:55:27 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092127.469288,"logger":"tls.issuance.acme.acme_client","msg":"validations succeeded; finalizing order","order":"https://acme-v02.api.letsencrypt.org/acme/order/1493309776/233401705456"}
Jan 01 01:55:27 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092127.826249,"logger":"tls.issuance.acme.acme_client","msg":"successfully downloaded available certificate chains","count":2,"first_url":"https://acme-v02.api.letsencrypt.org/acme/cert/0352dcbcc15a5d7d9c9a889117c899bea438"}
Jan 01 01:55:27 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092127.8265743,"logger":"tls.obtain","msg":"certificate obtained successfully","identifier":"dz-jellyfin.duckdns.org"}
Jan 01 01:55:27 connor-OptiPlex-7060 caddy[2934]: {"level":"info","ts":1704092127.8266363,"logger":"tls.obtain","msg":"releasing lock","identifier":"dz-jellyfin.duckdns.org"}

Just from what I can see, it does look like it is reading the API token now. Not sure what could be causing a breakage now.

Make sure you followed these steps Build from source — Caddy Documentation otherwise next time you apt upgrade to a new Caddy version, your plugins will get wiped out.

Could this be something that is causing it to break, or is this something I need to do before I update Caddy in the future?

Edit: This is very strange to me that it’s still not working. The logs I posted to me even show the certificate was correctly generated and the DNS records were updated successfully. I am not sure if it is being generated but not used or something?

That doesn’t work, that only sets the env var for your current shell session.

Looks like you successfully got a TLS cert now.

Just something you need to do once, to make sure future apt package upgrades don’t cause your plugins to disappear.

Please be more specific. What do you mean by this? What error do you see? Show an example request with curl -v. Enable the debug global option and show your logs after making a request.

curl -v dz-jellyfin.duckdns.org returns:

*   Trying <public-ip-here>:80...
* Connected to dz-jellyfin.duckdns.org (<public-ip-here>) port 80 (#0)
> GET / HTTP/1.1
> Host: dz-jellyfin.duckdns.org
> User-Agent: curl/7.81.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Content-Length: 0
< Date: Mon, 01 Jan 2024 08:14:04 GMT
< Server: Kestrel
< Location: /jellyfin/web/index.html

Trying curl -v https://dz-jellyfin.duckdns.org yields:

*   Trying <public-ip-here>:443...
* connect to <public-ip-here> port 443 failed: Connection refused
* Failed to connect to dz-jellyfin.duckdns.org port 443 after 36 ms: Connection refused
* Closing connection 0
curl: (7) Failed to connect to dz-jellyfin.duckdns.org port 443 after 36 ms: Connection refused

Here is the full logs with debug enabled:

Jan 01 03:18:09 connor-OptiPlex-7060 systemd[1]: Starting Caddy...
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: caddy.HomeDir=/var/lib/caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: caddy.AppDataDir=/var/lib/caddy/.local/share/caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: caddy.AppConfigDir=/var/lib/caddy/.config/caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: caddy.ConfigAutosavePath=/var/lib/caddy/.config/caddy/autosave.json
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: caddy.Version=v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.GOOS=linux
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.GOARCH=amd64
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.Compiler=gc
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.NumCPU=6
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.GOMAXPROCS=6
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: runtime.Version=go1.21.4
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: os.Getwd=/
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: LANG=en_US.UTF-8
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: NOTIFY_SOCKET=/run/systemd/notify
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: HOME=/var/lib/caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: LOGNAME=caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: USER=caddy
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: INVOCATION_ID=5ddb958d68c54786a8d62faf7b415fc3
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: JOURNAL_STREAM=8:31353
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: SYSTEMD_EXEC_PID=2860
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: DUCKDNS_API_TOKEN=<api-token-here>
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: GOTRACEBACK=none
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.186849,"msg":"using provided configuration","config_file":"/etc/caddy/Caddyfile","config_adapter":""}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"warn","ts":1704097089.1880083,"msg":"Caddyfile input is not formatted; run 'caddy fmt --overwrite' to fix inconsistencies","adapter":"caddyfile","file"
:"/etc/caddy/Caddyfile","line":10}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1886723,"logger":"admin","msg":"admin endpoint started","address":"localhost:2019","enforce_origin":false,"origins":["//localhost
:2019","//[::1]:2019","//127.0.0.1:2019"]}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1888871,"logger":"http.auto_https","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding o
ne to enable TLS","server_name":"srv0","https_port":443}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1888955,"logger":"http.auto_https","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1889248,"logger":"tls.cache.maintenance","msg":"started background certificate maintenance","cache":"0xc000302700"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.1889267,"logger":"http.auto_https","msg":"adjusted config","tls":{"automation":{"policies":[{"subjects":["dz-jellyfin.duckdns.org"]},{}]}},"http":{"servers":{"remaining_auto_https_redirects":{"listen":[":80"],"routes":[{},{}]},"srv0":{"listen":[":443"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"static_response","headers":{"Location":["/jellyfin/"]},"status_code":302}],"match":[{"path":["/jellyfin"]}]},{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"127.0.0.1:8096"}]}],"match":[{"path":["/jellyfin/*"]}]}]}],"terminal":true}],"tls_connection_policies":[{}],"automatic_https":{}}}}}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1892312,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1893122,"msg":"failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details."}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1892312,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1893122,"msg":"failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/quic-go/quic-go/wiki/UDP-Buffer-Sizes for details."}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.1893957,"logger":"http","msg":"starting server loop","address":"[::]:443","tls":true,"http3":true}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1894195,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.189447,"logger":"http","msg":"starting server loop","address":"[::]:80","tls":false,"http3":false}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1894517,"logger":"http.log","msg":"server running","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1894548,"logger":"http","msg":"enabling automatic TLS certificate management","domains":["dz-jellyfin.duckdns.org"]}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.1897018,"logger":"tls","msg":"loading managed certificate","domain":"dz-jellyfin.duckdns.org","expiration":1711864527,"issuer_key":"acme-v02.api.letsencrypt.org-directory","storage":"FileStorage:/var/lib/caddy/.local/share/caddy"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.1898978,"logger":"tls.cache","msg":"added certificate to cache","subjects":["dz-jellyfin.duckdns.org"],"expiration":1711864527,"managed":true,"issuer_key":"acme-v02.api.letsencrypt.org-directory","hash":"6d15f98278b3a957718c24d87f32ccab44e5278f6e9c8a2717c7489161cfecc9","cache_size":1,"cache_capacity":10000}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.189912,"logger":"events","msg":"event","name":"cached_managed_cert","id":"770befc8-227d-4396-963b-3529bd754dc1","origin":"tls","data":{"sans":["dz-jellyfin.duckdns.org"]}}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.1899624,"logger":"dynamic_dns","msg":"beginning IP address check"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1900036,"msg":"autosaved config (load with --resume flag)","file":"/var/lib/caddy/.config/caddy/autosave.json"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1900625,"msg":"serving initial configuration"}
Jan 01 03:18:09 connor-OptiPlex-7060 systemd[1]: Started Caddy.
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"warn","ts":1704097089.1918716,"logger":"tls","msg":"storage cleaning happened too recently; skipping for now","storage":"FileStorage:/var/lib/caddy/.local/share/caddy","instance":"eab0e6de-b24c-4bf2-a294-b3a1652270d7","try_again":1704183489.1918705,"try_again_in":86399.999999652}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.1920822,"logger":"tls","msg":"finished cleaning storage units"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.2442174,"logger":"dynamic_dns","msg":"found DNS record","type":"A","name":"@","zone":"dz-jellyfin.duckdns.org","value":"<public-ip-here>"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.2443373,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.2443495,"logger":"dynamic_dns","msg":"domain not found in DNS","domain":"jellyfin.dz-jellyfin.duckdns.org"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.2443624,"logger":"dynamic_dns","msg":"looked up current IPs from DNS","lastIPs":{"jellyfin.dz-jellyfin.duckdns.org":{"A":[""],"AAAA":[""]}}}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.307823,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup","type":"IPv4","endpoint":"https://api64.ipify.org","ip":"<public-ip-here>"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.3194332,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://api64.ipify.org","error":"Get \"https://api64.ipify.org\": dial tcp6 [2607:f2d8:1:3c::3]:443: connect: network is unreachable"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.5257916,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://myip.addr.space","error":"Get \"https://myip.addr.space\": dial tcp6: lookup myip.addr.space on 127.0.0.53:53: server misbehaving"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.534543,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://ifconfig.me","error":"Get \"https://ifconfig.me\": dial tcp6 [2600:1901:0:bbc3::]:443: connect: network is unreachable"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.5458913,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://icanhazip.com","error":"Get \"https://icanhazip.com\": dial tcp6 [2606:4700::6812:7261]:443: connect: network is unreachable"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.5544243,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://ident.me","error":"Get \"https://ident.me\": dial tcp6 [2a01:4f8:c0c:bd0a::1]:443: connect: network is unreachable"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"debug","ts":1704097089.5631962,"logger":"dynamic_dns.ip_sources.simple_http","msg":"lookup failed","type":"IPv6","endpoint":"https://ipecho.net/plain","error":"Get \"https://ipecho.net/plain\": dial tcp6 [2600:1901:0:bbc3::]:443: connect: network is unreachable"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"warn","ts":1704097089.5632167,"logger":"dynamic_dns.ip_sources.simple_http","msg":"no IP found; consider disabling this IP version","type":"IPv6"}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.5632246,"logger":"dynamic_dns","msg":"updating DNS record","zone":"dz-jellyfin.duckdns.org","type":"A","name":"jellyfin","value":"<public-ip-here>","ttl":0}
Jan 01 03:18:09 connor-OptiPlex-7060 caddy[2860]: {"level":"info","ts":1704097089.6912372,"logger":"dynamic_dns","msg":"finished updating DNS","current_ips":["<public-ip-here>"]}

Specifically, if I navigate to my domain dz-jellyfin.duckdns.org, I would expect to see in the URL it resolves to, to be an HTTPS URL, but it is still HTTP. Trying to manually do https://dz-jellyfin.duckdns.org, results in a 404.

I see Server: Kestrel here, implying Caddy isn’t being reached.

Are you sure your DNS and port forwarding is set up to route the requests to Caddy?

Route the requests to Caddy? I am guessing I have made a stupid mistake then because that is not what I have setup. I have 2 port forwarding rules. They are rules for my servers internal ip with external ports 80 & 443 and internal ports of 8096 & 8920. These internal ports are the default public ports for Jellyfin. I am guessing this is not what I should be doing. As for DNS setup, all DuckDNS lets you do is make a domain, I can’t customize it at all from my understanding. It doesn’t seem like this would be the issue since I see DuckDNS recommended all over the place and the seemingly strong plugin support it has.
Edit: I think the 2 plugins I have installed should handle the DNS setup for DuckDNS correct?

Do you mean you’re forwarding 80 → 8096 and 443 → 8920?

This means you’re bypassing Caddy and directly connecting to Jellyfin.

You should be forwarding 80 → 80 and 443 → 443.

This means you’re bypassing Caddy and directly connecting to Jellyfin.
You should be forwarding 80 → 80 and 443 → 443.

You sir are a genius for exposing my stupidity. This was the issue. The URL resolves to an HTTPS URL now.

If I could borrow your genius for one small nit now. So when I navigate to the URL (dz-jellyfin.duckdns.org), it just take me to the root (/ which is just an empty page). However, the base URL of the server is not /, it’s /jellyfin. In my original Caddyfile I have in the original post, I thought the redir and related code was going to automatically redirect me to the correct page. Is there a way I can modify this Caddyfile so that when I navigate to dz-jellyfin.duckdns.org, it actually directs me to dz-jellyfin.duckdns.org/jellyfin?

btw this seems wrong; you shouldn’t have two upstreams like this. Change it to simply:

reverse_proxy 127.0.0.1:8096

Why not just make sure Jellyfin is configured to use / as its base URL? Why do you need to use a subpath?

Anyway, please read this article which explains many of the caveats:

btw this seems wrong; you shouldn’t have two upstreams like this.

Oh yeah I forgot I had removed this already. Realized it looked wrong too.

Why not just make sure Jellyfin is configured to use / as its base URL?

Fair point. I got rid of it after some thought. Just in case someone comes along with a similar issue and does want to keep the base URL, I was able to fix it by removing the redir line and the /jellyfin/* from the reverse_proxy line I had in my Caddyfile (not in original post).

Thank you once again so much for your help. You were my light where there was none.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.