1. The problem I’m having:
Setup Caddy as a reverse proxy for SeaFile and other apps. Caddy is returning a 502 error code.
curl -v http://docs.eaglewings.com
* Trying 2607:7700:0:c:0:1:17e3:ad83:80...
* Connected to docs.eaglewings.com (2607:7700:0:c:0:1:17e3:ad83) port 80 (#0)
> GET / HTTP/1.1
> Host: docs.eaglewings.com
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 308 Permanent Redirect
< Connection: close
< Location: https://docs.eaglewings.com/
< Server: Caddy
< Date: Mon, 18 Sep 2023 21:18:40 GMT
< Content-Length: 0
<
* Closing connection 0
curl -v https://docs.eaglewings.com
* Trying 2607:7700:0:c:0:1:17e3:ad83:443...
* Connected to docs.eaglewings.com (2607:7700:0:c:0:1:17e3:ad83) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS header, Certificate Status (22):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS header, Finished (20):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.2 (OUT), TLS header, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=docs.eaglewings.com
* start date: Sep 18 00:38:46 2023 GMT
* expire date: Dec 17 00:38:45 2023 GMT
* subjectAltName: host "docs.eaglewings.com" matched cert's "docs.eaglewings.com"
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify ok.
* Using HTTP2, server supports multiplexing
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* Using Stream ID: 1 (easy handle 0x5562971fce90)
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
> GET / HTTP/2
> Host: docs.eaglewings.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
* TLSv1.2 (OUT), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
< HTTP/2 502
< alt-svc: h3=":443"; ma=2592000
< server: Caddy
< content-length: 0
< date: Mon, 18 Sep 2023 21:20:25 GMT
<
* Connection #0 to host docs.eaglewings.com left intact
2. Error messages and/or full log output:
docker-caddy-1 | {"level":"debug","ts":1695071829.7238595,"logger":"tls.handshake","msg":"no certificate matching TLS ClientHello","remote_ip":"63.143.42.253","remote_port":"55558","server_name":"admin.eaglewings.com","remote":"63.143.42.253:55558","identifier":"admin.eaglewings.com","cipher_suites":[4866,4867,4865,49199,49195,49200,49196,158,49191,103,49192,107,163,159,52393,52392,52394,49327,49325,49315,49311,49245,49249,49239,49235,162,49326,49324,49314,49310,49244,49248,49238,49234,49188,106,49187,64,49162,49172,57,56,49161,49171,51,50,157,49313,49309,49233,156,49312,49308,49232,61,60,53,47,255],"cert_cache_fill":0.0001,"load_or_obtain_if_necessary":true,"on_demand":false}
docker-caddy-1 | {"level":"debug","ts":1695071829.7240493,"logger":"http.stdlib","msg":"http: TLS handshake error from 63.143.42.253:55558: no certificate available for 'admin.eaglewings.com'"}
docker-caddy-1 | {"level":"debug","ts":1695071906.8561368,"logger":"events","msg":"event","name":"tls_get_certificate","id":"8b5dc8f0-d505-42e1-a03b-14b6c2f76fc9","origin":"tls","data":{"client_hello":{"CipherSuites":[49195,49199,49196,49200,52393,52392,49161,49171,49162,49172,156,157,47,53,49170,10,4865,4866,4867],"ServerName":"","SupportedCurves":[29,23,24,25],"SupportedPoints":"AA==","SignatureSchemes":[2052,1027,2055,2053,2054,1025,1281,1537,1283,1539,513,515],"SupportedProtos":null,"SupportedVersions":[772,771],"Conn":{}}}}
docker-caddy-1 | {"level":"debug","ts":1695071906.85632,"logger":"tls.handshake","msg":"no matching certificates and no custom selection logic","identifier":"172.20.0.2"}
docker-caddy-1 | {"level":"debug","ts":1695071906.8563483,"logger":"tls.handshake","msg":"no certificate matching TLS ClientHello","remote_ip":"51.15.54.119","remote_port":"20004","server_name":"","remote":"51.15.54.119:20004","identifier":"172.20.0.2","cipher_suites":[49195,49199,49196,49200,52393,52392,49161,49171,49162,49172,156,157,47,53,49170,10,4865,4866,4867],"cert_cache_fill":0.0001,"load_or_obtain_if_necessary":true,"on_demand":false}
docker-caddy-1 | {"level":"debug","ts":1695071906.8565276,"logger":"http.stdlib","msg":"http: TLS handshake error from 51.15.54.119:20004: no certificate available for '172.20.0.2'"}
docker-caddy-1 | {"level":"debug","ts":1695071952.3503578,"logger":"events","msg":"event","name":"tls_get_certificate","id":"09ea23bf-b001-41b2-892b-1b659eeb72d1","origin":"tls","data":{"client_hello":{"CipherSuites":[4866,4867,4865,49196,49200,159,52393,52392,52394,49195,49199,158,49188,49192,107,49187,49191,103,49162,49172,57,49161,49171,51,157,156,61,60,53,47,255],"ServerName":"eaglewings.com","SupportedCurves":[29,23,30,25,24,256,257,258,259,260],"SupportedPoints":"AAEC","SignatureSchemes":[1027,1283,1539,2055,2056,2057,2058,2059,2052,2053,2054,1025,1281,1537,771,769,770,1026,1282,1538],"SupportedProtos":["h2","http/1.1"],"SupportedVersions":[772,771],"Conn":{}}}}
docker-caddy-1 | {"level":"debug","ts":1695071952.350632,"logger":"tls.handshake","msg":"no matching certificates and no custom selection logic","identifier":"eaglewings.com"}
docker-caddy-1 | {"level":"debug","ts":1695071952.350642,"logger":"tls.handshake","msg":"no matching certificates and no custom selection logic","identifier":"*.com"}
docker-caddy-1 | {"level":"debug","ts":1695071952.350647,"logger":"tls.handshake","msg":"no matching certificates and no custom selection logic","identifier":"*.*"}
docker-caddy-1 | {"level":"debug","ts":1695071952.3506615,"logger":"tls.handshake","msg":"no certificate matching TLS ClientHello","remote_ip":"172.58.151.12","remote_port":"55335","server_name":"eaglewings.com","remote":"172.58.151.12:55335","identifier":"eaglewings.com","cipher_suites":[4866,4867,4865,49196,49200,159,52393,52392,52394,49195,49199,158,49188,49192,107,49187,49191,103,49162,49172,57,49161,49171,51,157,156,61,60,53,47,255],"cert_cache_fill":0.0001,"load_or_obtain_if_necessary":true,"on_demand":false}
docker-caddy-1 | {"level":"debug","ts":1695071952.35086,"logger":"http.stdlib","msg":"http: TLS handshake error from 172.58.151.12:55335: no certificate available for 'eaglewings.com'"}
docker-caddy-1 | {"level":"debug","ts":1695072025.3019593,"logger":"events","msg":"event","name":"tls_get_certificate","id":"b7952193-d1b6-4119-a899-f1ca2a4a50a2","origin":"tls","data":{"client_hello":{"CipherSuites":[4866,4867,4865,49196,49200,159,52393,52392,52394,49195,49199,158,49188,49192,107,49187,49191,103,49162,49172,57,49161,49171,51,157,156,61,60,53,47,255],"ServerName":"docs.eaglewings.com","SupportedCurves":[29,23,30,25,24,256,257,258,259,260],"SupportedPoints":"AAEC","SignatureSchemes":[1027,1283,1539,2055,2056,2057,2058,2059,2052,2053,2054,1025,1281,1537,771,769,770,1026,1282,1538],"SupportedProtos":["h2","http/1.1"],"SupportedVersions":[772,771],"Conn":{}}}}
docker-caddy-1 | {"level":"debug","ts":1695072025.302135,"logger":"tls.handshake","msg":"choosing certificate","identifier":"docs.eaglewings.com","num_choices":1}
docker-caddy-1 | {"level":"debug","ts":1695072025.3022072,"logger":"tls.handshake","msg":"default certificate selection results","identifier":"docs.eaglewings.com","subjects":["docs.eaglewings.com"],"managed":true,"issuer_key":"acme-v02.api.letsencrypt.org-directory","hash":"29b22656065e4a1d78a812644fd9e399246da8e305e32d5f2fac2906a30c6601"}
docker-caddy-1 | {"level":"debug","ts":1695072025.3022256,"logger":"tls.handshake","msg":"matched certificate in cache","remote_ip":"172.58.151.12","remote_port":"14874","subjects":["docs.eaglewings.com"],"managed":true,"expiration":1702773526,"hash":"29b22656065e4a1d78a812644fd9e399246da8e305e32d5f2fac2906a30c6601"}
docker-caddy-1 | {"level":"debug","ts":1695072025.4434516,"logger":"http.handlers.reverse_proxy","msg":"selected upstream","dial":"seafile:8080","total_upstreams":1}
docker-caddy-1 | {"level":"debug","ts":1695072025.4497743,"logger":"http.handlers.reverse_proxy","msg":"upstream roundtrip","upstream":"seafile:8080","duration":0.00614827,"request":{"remote_ip":"172.58.151.12","remote_port":"14874","client_ip":"172.58.151.12","proto":"HTTP/2.0","method":"GET","host":"docs.eaglewings.com","uri":"/","headers":{"X-Forwarded-Proto":["https"],"X-Forwarded-Host":["docs.eaglewings.com"],"User-Agent":["curl/7.81.0"],"Accept":["*/*"],"X-Forwarded-For":["172.58.151.12"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"docs.eaglewings.com"}},"error":"dial tcp: lookup seafile on 127.0.0.11:53: server misbehaving"}
docker-caddy-1 | {"level":"error","ts":1695072025.4499848,"logger":"http.log.error","msg":"dial tcp: lookup seafile on 127.0.0.11:53: server misbehaving","request":{"remote_ip":"172.58.151.12","remote_port":"14874","client_ip":"172.58.151.12","proto":"HTTP/2.0","method":"GET","host":"docs.eaglewings.com","uri":"/","headers":{"User-Agent":["curl/7.81.0"],"Accept":["*/*"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h2","server_name":"docs.eaglewings.com"}},"duration":0.006768806,"status":502,"err_id":"4xz6ygmqw","err_trace":"reverseproxy.statusError (reverseproxy.go:1248)"}
docker-caddy-1 | {"level":"debug","ts":1695072046.0699177,"logger":"events","msg":"event","name":"tls_get_certificate","id":"1110b5fb-a59e-49f5-bcc6-14503d05cd0f","origin":"tls","data":{"client_hello":{"CipherSuites":[4865,4866,4867],"ServerName":"docs.eaglewings.com","SupportedCurves":[29,23,24],"SupportedPoints":null,"SignatureSchemes":[1027,2052,1025,1283,2053,1281,2054,1537,513],"SupportedProtos":["h3"],"SupportedVersions":[772],"Conn":{}}}}
docker-caddy-1 | {"level":"debug","ts":1695072046.0701268,"logger":"tls.handshake","msg":"choosing certificate","identifier":"docs.eaglewings.com","num_choices":1}
docker-caddy-1 | {"level":"debug","ts":1695072046.0701487,"logger":"tls.handshake","msg":"default certificate selection results","identifier":"docs.eaglewings.com","subjects":["docs.eaglewings.com"],"managed":true,"issuer_key":"acme-v02.api.letsencrypt.org-directory","hash":"29b22656065e4a1d78a812644fd9e399246da8e305e32d5f2fac2906a30c6601"}
docker-caddy-1 | {"level":"debug","ts":1695072046.0701592,"logger":"tls.handshake","msg":"matched certificate in cache","remote_ip":"172.58.146.98","remote_port":"51986","subjects":["docs.eaglewings.com"],"managed":true,"expiration":1702773526,"hash":"29b22656065e4a1d78a812644fd9e399246da8e305e32d5f2fac2906a30c6601"}
docker-caddy-1 | {"level":"debug","ts":1695072046.269895,"logger":"http.handlers.reverse_proxy","msg":"selected upstream","dial":"seafile:8080","total_upstreams":1}
docker-caddy-1 | {"level":"debug","ts":1695072046.2723358,"logger":"http.handlers.reverse_proxy","msg":"upstream roundtrip","upstream":"seafile:8080","duration":0.002314931,"request":{"remote_ip":"172.58.146.98","remote_port":"51986","client_ip":"172.58.146.98","proto":"HTTP/3.0","method":"GET","host":"docs.eaglewings.com","uri":"/","headers":{"Sec-Ch-Ua-Platform":["\"Linux\""],"Sec-Fetch-Mode":["navigate"],"User-Agent":["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"],"Sec-Fetch-Site":["none"],"Sec-Fetch-Dest":["document"],"Sec-Gpc":["1"],"X-Forwarded-For":["172.58.146.98"],"Accept-Language":["en-US,en;q=0.7"],"Sec-Fetch-User":["?1"],"Sec-Ch-Ua-Mobile":["?0"],"Sec-Ch-Ua":["\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Brave\";v=\"116\""],"Upgrade-Insecure-Requests":["1"],"Accept-Encoding":["gzip, deflate, br"],"Accept":["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"],"X-Forwarded-Proto":["https"],"X-Forwarded-Host":["docs.eaglewings.com"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h3","server_name":"docs.eaglewings.com"}},"error":"dial tcp: lookup seafile on 127.0.0.11:53: server misbehaving"}
docker-caddy-1 | {"level":"error","ts":1695072046.272444,"logger":"http.log.error","msg":"dial tcp: lookup seafile on 127.0.0.11:53: server misbehaving","request":{"remote_ip":"172.58.146.98","remote_port":"51986","client_ip":"172.58.146.98","proto":"HTTP/3.0","method":"GET","host":"docs.eaglewings.com","uri":"/","headers":{"Upgrade-Insecure-Requests":["1"],"Sec-Fetch-Dest":["document"],"Accept-Encoding":["gzip, deflate, br"],"Sec-Ch-Ua":["\"Chromium\";v=\"116\", \"Not)A;Brand\";v=\"24\", \"Brave\";v=\"116\""],"Accept":["text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8"],"Sec-Gpc":["1"],"Accept-Language":["en-US,en;q=0.7"],"Sec-Fetch-Mode":["navigate"],"Sec-Fetch-User":["?1"],"Sec-Fetch-Site":["none"],"Sec-Ch-Ua-Mobile":["?0"],"Sec-Ch-Ua-Platform":["\"Linux\""],"User-Agent":["Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36"]},"tls":{"resumed":false,"version":772,"cipher_suite":4865,"proto":"h3","server_name":"docs.eaglewings.com"}},"duration":0.002605629,"status":502,"err_id":"36ee0qigw","err_trace":"reverseproxy.statusError (reverseproxy.go:1248)"}
3. Caddy version:
v2.7.4 h1:J8nisjdOxnYHXlorUKXY75Gr6iBfudfoGhrJ8t7/flI=
4. How I installed and ran Caddy:
docker compose
a. System environment:
b. Command:
c. Service/unit/compose file:
version: '3'
services:
db:
image: mariadb:10.11
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=Stylized6-Living-Multiple # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- mysql-data:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
restart: unless-stopped
networks:
- seafile-net
memcached:
image: memcached:latest
container_name: seafile-memcached
entrypoint: memcached -m 256
restart: unless-stopped
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "8080:80"
#- "443:443" # If https is enabled, cancel the comment.
volumes:
- seafile-data:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=passwordroot # Requested, the value should be root's password of MySQL service.
- TIME_ZONE=Etc/UTC # Optional, default is UTC. Should be uncomment and set to your local time zone.
- SEAFILE_ADMIN_EMAIL=admin@eaglewings.com # Specifies Seafile admin user, default is 'me@example.com'.
- SEAFILE_ADMIN_PASSWORD=password1 # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=docs.eaglewingsessentialhealth.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
networks:
- seafile-net
caddy:
image: caddy:latest
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./seafile/seahub-data:/shared/seahub-data
- ./site:/srv
- caddy_data:/data
- caddy_config:/config
networks:
seafile-net:
volumes:
mysql-data:
seafile-data:
caddy_data:
caddy_config:
d. My complete Caddy config:
{
#acme_ca https://acme.zerossl.com/v2/DV90
email admin@eaglewings.com
debug
}
docs.eaglewings.com {
handle /seafhttp* {
reverse_proxy seafile:8082
}
handle_path /media* {
root * /shared/media
file_server
}
handle {
reverse_proxy seafile:8080
}
}