1. The problem I’m having:
I’m trying to run a home server to host a media server, a teamspeak server and a minecraft server. I’ve got a custom domain through cloudflare so friends/family will be able to access these without having to connect through a direct IP. I have managed to get all of these running and accessible through a direct IP connection, however I’m struggling with the Caddy setup.
I have a separate cloudflare DNS record for each, but they are all configured the same way and point at the same IPv6 address. I installed the caddy version with the cloudflare extension because at some point I thought it would fix my problems but now I don’t know if I needed it or not. I also have the cloudflare key hardcoded in the config file because it did not want to load the environment variable, but that is a problem for another time.
Here’s my problem: Despite using the same config the media server is accessible through the custom domain but the teamspeak and minecraft server are not. Teamspeak and minecraft both don’t give any useful errors.
I see “HTTP/2 skipped because it requires TLS” in the logs and I wonder if that is relevant, but if it is I can not figure out what to do about it.
I am very much a noob at this but I’ve spent 10 hours trying to figure this out and I am at the end of my google powers, any help would be very appreciated ![]()
(also, please let me know if caddy is not the right tool for this)
Thank you
2. Error messages and/or full log output:
{"level":"info","ts":1770837413.7781637,"logger":"http.auto_https","msg":"server is listening only on the HTTPS port but has no TLS connection policies; adding one to enable TLS","server_name":"srv0","https_port":443}
{"level":"info","ts":1770837413.7781835,"logger":"http.auto_https","msg":"enabling automatic HTTP->HTTPS redirects","server_name":"srv0"}
{"level":"debug","ts":1770837413.7782083,"logger":"http.auto_https","msg":"adjusted config","tls":{"automation":{"policies":[{"subjects":["jellyfin.lemonday.cc","lego.lemonday.cc"]},{"subjects":["yap.lemonday.cc"]},{}]}},"http":{"servers":{"remaining_auto_https_redirects":{"listen":[":80"],"routes":[{},{}],"logs":{"logger_names":{"jellyfin.lemonday.cc":["log0"],"lego.lemonday.cc":["log2"],"yap.lemonday.cc":["log1"]}}},"srv0":{"listen":[":443"],"routes":[{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"141.134.59.198:8096"}]}]}]}],"terminal":true},{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"141.134.59.198:4895"}]}]}]}],"terminal":true},{"handle":[{"handler":"subroute","routes":[{"handle":[{"handler":"reverse_proxy","upstreams":[{"dial":"141.134.59.198:9987"}]}]}]}],"terminal":true}],"tls_connection_policies":[{}],"automatic_https":{},"logs":{"logger_names":{"jellyfin.lemonday.cc":["log0"],"lego.lemonday.cc":["log2"],"yap.lemonday.cc":["log1"]}}}}}}
{"level":"debug","ts":1770837413.7784297,"logger":"http","msg":"starting server loop","address":"[::]:443","tls":true,"http3":false}
{"level":"info","ts":1770837413.7784476,"logger":"http","msg":"enabling HTTP/3 listener","addr":":443"}
{"level":"info","ts":1770837413.7784579,"logger":"http.log","msg":"server running","name":"srv0","protocols":["h1","h2","h3"]}
{"level":"debug","ts":1770837413.7785044,"logger":"http","msg":"starting server loop","address":"[::]:80","tls":false,"http3":false}
{"level":"warn","ts":1770837413.7785132,"logger":"http","msg":"HTTP/2 skipped because it requires TLS","network":"tcp","addr":":80"}
{"level":"warn","ts":1770837413.7785177,"logger":"http","msg":"HTTP/3 skipped because it requires TLS","network":"tcp","addr":":80"}
{"level":"info","ts":1770837413.7785215,"logger":"http.log","msg":"server running","name":"remaining_auto_https_redirects","protocols":["h1","h2","h3"]}
{"level":"info","ts":1770837413.7785268,"logger":"http","msg":"enabling automatic TLS certificate management","domains":["lego.lemonday.cc","yap.lemonday.cc","jellyfin.lemonday.cc"]}
{"level":"debug","ts":1770837413.7785544,"logger":"events","msg":"event","name":"started","id":"00d0404c-15b4-4195-a280-6e4b69492973","origin":"","data":null}
{"level":"debug","ts":1770837413.7785697,"logger":"events","msg":"event","name":"stopping","id":"d143236c-8fe3-4db2-8687-86a518b2d387","origin":"","data":null}
{"level":"info","ts":1770837413.7786005,"logger":"http","msg":"servers shutting down with eternal grace period"}
{"level":"info","ts":1770837413.7788372,"msg":"autosaved config (load with --resume flag)","file":"/var/lib/caddy/.config/caddy/autosave.json"}
{"level":"info","ts":1770837413.7788858,"logger":"admin.api","msg":"load complete"}
{"level":"info","ts":1770837413.779944,"logger":"admin","msg":"stopped previous server","address":"localhost:2019"}
3. Caddy version:
v2.10.2 h1:g/gTYjGMD0dec+UgMw8SnfmJ3I9+M2TdvoRL/Ovu6U8=
4. How I installed and ran Caddy:
a. System environment:
Ubuntu 24.04, no docker or other containers
b. Command:
sudo systemctl reload caddy
c. Service/unit/compose file:
d. My complete Caddy config:
{
debug
log {
output file /var/log/caddy/access.log
}
}
(logging) {
log {
output file /var/log/caddy/{args[0]}.access.log
format json
}
}
jellyfin.lemonday.cc {
import logging jellyfin.lemonday.cc
tls {
dns cloudflare <APIKEY>
}
reverse_proxy xxx.xxx.xx.xxx:8096
}
yap.lemonday.cc {
import logging yap.lemonday.cc
tls {
dns cloudflare <APIKEY>
}
reverse_proxy xxx.xxx.xx.xxx:9987
}
lego.lemonday.cc {
import logging lego.lemonday.cc
tls {
dns cloudflare <APIKEY>
}
reverse_proxy xxx.xxx.xx.xxx:4895
}