1. The problem I’m having:
When proxying Alexandrite on a base domain Firefox gets 404 errors on fonts, leading to fontawesome glyphs not displaying properly.
https://ctrlaltelite.xyz in Firefox shows:
https://a.ctrlaltelite.xyz in Firefox as well as https://ctrlaltelite.xyz in Brave show:
In the Network console I see the working subdomain sending the font requests as HTTP/2
:
But the broken base domain sends as HTTP/1.1
:
I tried forcing this to HTTP/2
using
reverse_proxy alexandrite:3000 {
transport http {
versions 2
}
}
but still got 404s:
2. Error messages and/or full log output:
I’m not seeing any errors watching the container with docker compose logs -f
. My access logs also do not show hits, even after clearing cache.
3. Caddy version:
v2.6.4
4. How I installed and ran Caddy:
Running a custom built image.
Dockerfile
:
FROM caddy:2.6.4-builder-alpine AS builder
RUN apk add --no-cache tzdata
RUN xcaddy build v2.6.4 \
--with github.com/caddy-dns/cloudflare@latest \
--with github.com/caddyserver/transform-encoder \
--with github.com/sjtug/caddy2-filter
FROM caddy:2.6.4
COPY --from=builder /usr/bin/caddy /usr/bin/caddy
docker-compose.yml
:
version: "3.7"
services:
caddy:
image: flcr.foreveratroll.com/caddy:v2.6.4-fl6
hostname: caddy
container_name: caddy
restart: unless-stopped
environment:
- CF_API_TOKEN=${CF_API_TOKEN}
- TZ=${TZ}
ports:
- "80:80"
- "443:443"
- "443:443/udp"
networks:
- frontend
- backend
volumes:
- /opt/docker/caddy/Caddyfile:/etc/caddy/Caddyfile
- /opt/docker/caddy/caddy.d:/etc/caddy/caddy.d
- /opt/docker/caddy/data/site:/srv
- /opt/docker/caddy/data/caddy-data:/data
- /opt/docker/caddy/data/config:/config
- /opt/log/caddy:/opt/log/caddy
networks:
frontend:
name: frontend
external: true
backend:
name: backend
external: true
volumes:
caddy_data:
external: true
caddy_config:
Caddyfile
:
{
acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
storage file_system {
root /etc/caddy
}
}
import /etc/caddy/caddy.d/snippets.caddy
import /etc/caddy/caddy.d/sites/*
snippets.caddy
:
(init) {
header {
x-proxy-version v2.6.4-fl6
-Server
Strict-Transport-Security "max-age=63072000;includeSubDomains; preload always"
}
log {
format transform `{request>headers>X-Forwarded-For>[0]:request>remote_ip} - {request>user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size} "{request>headers>Referer>[0]}" "{request>headers>User-Agent>[0]}"` {
time_format "02/Jan/2006:15:04:05 -0700"
}
output file /opt/log/caddy/{args.0}
}
tls {
dns cloudflare "{env.CF_API_TOKEN}"
}
@denied not remote_ip private_ranges
respond @denied "HTTP/2 403 Forbidden" 403 {
close
}
}
(init_external) {
header {
x-proxy-version v2.6.4-fl6
-Server
Strict-Transport-Security "max-age=63072000;includeSubDomains; preload always"
}
log {
format transform `{request>headers>X-Forwarded-For>[0]:request>remote_ip} - {request>user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size} "{request>headers>Referer>[0]}" "{request>headers>User-Agent>[0]}"` {
time_format "02/Jan/2006:15:04:05 -0700"
}
output file /opt/log/caddy/{args.0} {
}
}
tls {
dns cloudflare "{env.CF_API_TOKEN}"
}
}
(logger) {
log {
format transform `{request>headers>X-Forwarded-For>[0]:request>remote_ip} - {request>user_id} [{ts}] "{request>method} {request>uri} {request>proto}" {status} {size} "{request>headers>Referer>[0]}" "{request>headers>User-Agent>[0]}"` {
time_format "02/Jan/2006:15:04:05 -0700"
}
output file /opt/log/caddy/{args.0}
}
}
(caddy-common) {
encode gzip
header {
-Server
Strict-Transport-Security "max-age=31536000; include-subdomains;"
X-XSS-Protection "1; mode=block"
X-Frame-Options "DENY"
X-Content-Type-Options nosniff
Referrer-Policy no-referrer-when-downgrade
X-Robots-Tag "none"
}
}
/etc/caddy/caddy.d/sites/ctrlaltelite.xyz
:
*.ctrlaltelite.xyz, ctrlaltelite.xyz {
import caddy-common
import logger "ctrlaltelite.xyz"
reverse_proxy alexandrite:3000
@a host a.ctrlaltelite.xyz
import logger "a.ctrlaltelite.xyz"
handle @a {
reverse_proxy alexandrite:3000
}
@lemmy {
path /api/*
path /pictrs/*
path /feeds/*
path /nodeinfo/*
path /.well-known/*
}
@lemmy-hdr {
header Accept application/*
}
@lemmy-post {
method POST
}
handle @lemmy-hdr {
reverse_proxy lemmy-app:8536
}
handle @lemmy {
reverse_proxy lemmy-app:8536
}
handle @lemmy-post {
reverse_proxy lemmy-app:8536
}
@m host m.ctrlaltelite.xyz
import logger "m.ctrlaltelite.xyz"
import caddy-common
handle @m {
reverse_proxy lemmy-ui:1234
}
}
a. System environment:
Docker (see above)
b. Command:
Docker (see above)
c. Service/unit/compose file:
Docker (see above)
d. My complete Caddy config:
Docker (see above)
5. Links to relevant resources:
Issue with the developer.