From 73bd55a1dc8d43cf2c8876afa3aba031546a37b3 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 22:30:28 -0400 Subject: [PATCH 01/31] Update Caddyfile config for PiHole --- docker/caddy/Caddyfile | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 132b1ff..3191788 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -91,12 +91,40 @@ smrtgeekdevs.com { } pihole.smrtgeekdevs.com { - import smrtgeekdevs + import smrtgeekdevs + + @atRoot { + path / + } + redir @atRoot /admin/ 302 + + # Update your reverse_proxy block to look like this: + reverse_proxy http://{$IP_PIHOLE} { + # Caddy v2 usually does this automatically, but we'll be explicit + # to ensure WebSocket upgrade headers are passed correctly. + header_up Host {http.request.host} + header_up X-Real-IP {http.request.remote.host} + header_up X-Forwarded-For {http.request.remote.host} + header_up X-Forwarded-Proto {http.request.scheme} + } - redir / /admin{uri} - reverse_proxy pihole + log { + output file /data/logs/pihole.smrtgeekdevs.com.log { + roll_size 10mb + roll_keep 5 + roll_local_time + } + format console + } } +# pihole.smrtgeekdevs.com { +# import smrtgeekdevs + +# redir / /admin{uri} +# reverse_proxy pihole +# } + *.smrtgeekdevs.com { import smrtgeekdevs } From 8e2b54e42ca3708dbdd2b5ac693cff546aeba868 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:09:25 -0400 Subject: [PATCH 02/31] Update Caddy logging and update error pages --- docker/caddy/Caddyfile | 60 +++++++++++++++---------------- docker/caddy/error-pages/404.html | 39 ++++++++++++++++++++ docker/caddy/error-pages/5xx.html | 22 ++++++++++++ docker/docker-compose.yml | 6 ++++ 4 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 docker/caddy/error-pages/404.html create mode 100644 docker/caddy/error-pages/5xx.html diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 3191788..8eaec7d 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -11,17 +11,37 @@ } } +(logging) { + log { + output file /data/logs/{http.request.host}.log { + roll_size 10mb + roll_keep 5 + roll_local_time + } + format console + level INFO + } +} + # Global Imports (all) { + + import logging + handle_errors { - respond "{err.status_code} {err.status_text}" + @4xx status 400-499 + rewrite @4xx /error-pages/404.html + + rewrite * /error-pages/5xx.html + + template { + mime text/html + } + + file_server { + root /etc/caddy + } } - # handle_errors { - # rewrite * /404.html - # file_server { - # status 404 - # } - # } } # Default options for internal facing sites @@ -98,33 +118,9 @@ pihole.smrtgeekdevs.com { } redir @atRoot /admin/ 302 - # Update your reverse_proxy block to look like this: - reverse_proxy http://{$IP_PIHOLE} { - # Caddy v2 usually does this automatically, but we'll be explicit - # to ensure WebSocket upgrade headers are passed correctly. - header_up Host {http.request.host} - header_up X-Real-IP {http.request.remote.host} - header_up X-Forwarded-For {http.request.remote.host} - header_up X-Forwarded-Proto {http.request.scheme} - } - - log { - output file /data/logs/pihole.smrtgeekdevs.com.log { - roll_size 10mb - roll_keep 5 - roll_local_time - } - format console - } + reverse_proxy http://{$IP_PIHOLE} } -# pihole.smrtgeekdevs.com { -# import smrtgeekdevs - -# redir / /admin{uri} -# reverse_proxy pihole -# } - *.smrtgeekdevs.com { import smrtgeekdevs } diff --git a/docker/caddy/error-pages/404.html b/docker/caddy/error-pages/404.html new file mode 100644 index 0000000..7f2ed00 --- /dev/null +++ b/docker/caddy/error-pages/404.html @@ -0,0 +1,39 @@ + + + + + + 404 Not Found + + + + +
+

Oops! Page Not Found

+

Sorry, we couldn't find the page you were looking for.

+

Return to Homepage

+
+ + + diff --git a/docker/caddy/error-pages/5xx.html b/docker/caddy/error-pages/5xx.html new file mode 100644 index 0000000..bbcf664 --- /dev/null +++ b/docker/caddy/error-pages/5xx.html @@ -0,0 +1,22 @@ + + + + + Server Error + + + +
+

Oops! Something Went Wrong

+

A server error occurred and we have been notified. Our administrator will look into it.

+

If you need to report this issue, please provide the following Error ID:

+

Error ID: {{.Error.ID}}

+

Return to Homepage

+
+ + diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 0009b19..9593437 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -64,11 +64,17 @@ services: hostname: caddy image: ghcr.io/caddybuilds/caddy-cloudflare:latest restart: unless-stopped + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "5" networks: macvlan: ipv4_address: ${IP_CADDY} volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile + - ./caddy/error-pages:/etc/caddy/error-pages:ro - /srv:/srv - caddy_data:/data - caddy_config:/config From 0b19859e5fef3f68f1e16861d1fd6e98c44bbb14 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:16:39 -0400 Subject: [PATCH 03/31] Refine error handling and update file server root in Caddyfile --- docker/caddy/Caddyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 8eaec7d..4d3b88e 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -29,7 +29,7 @@ import logging handle_errors { - @4xx status 400-499 + @4xx expression {http.error.status_code} >= 400 && {http.error.status_code} < 500 rewrite @4xx /error-pages/404.html rewrite * /error-pages/5xx.html @@ -39,7 +39,7 @@ } file_server { - root /etc/caddy + root /srv } } } From 726780ef7ae3a8697badd2206140c18faa18f72f Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:22:40 -0400 Subject: [PATCH 04/31] Fix template error --- docker/caddy/Caddyfile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 4d3b88e..4eea255 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -34,12 +34,9 @@ rewrite * /error-pages/5xx.html - template { - mime text/html - } - file_server { root /srv + templates } } } From d78ccb27d60e203f28a61deb757713ef81cd5106 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:29:15 -0400 Subject: [PATCH 05/31] Move 'templates' directive back out of 'file_server' directive. --- docker/caddy/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 4eea255..066ba0f 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -34,9 +34,9 @@ rewrite * /error-pages/5xx.html + templates file_server { root /srv - templates } } } From be097f020d2c148f17d92d47278cdab66e4e0f84 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:33:07 -0400 Subject: [PATCH 06/31] Fix Caddy variables --- docker/caddy/Caddyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 066ba0f..ef74d3b 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -13,7 +13,7 @@ (logging) { log { - output file /data/logs/{http.request.host}.log { + output file /data/logs/{request.host}.log { roll_size 10mb roll_keep 5 roll_local_time @@ -29,7 +29,7 @@ import logging handle_errors { - @4xx expression {http.error.status_code} >= 400 && {http.error.status_code} < 500 + @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 rewrite @4xx /error-pages/404.html rewrite * /error-pages/5xx.html From f8878dae8626b5c9ce03edd744f9417f69acaedf Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:50:24 -0400 Subject: [PATCH 07/31] Move logging import into site specific configs --- docker/caddy/Caddyfile | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index ef74d3b..e622f83 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -13,7 +13,7 @@ (logging) { log { - output file /data/logs/{request.host}.log { + output file /data/logs/{http.request.host}.log { roll_size 10mb roll_keep 5 roll_local_time @@ -25,9 +25,6 @@ # Global Imports (all) { - - import logging - handle_errors { @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 rewrite @4xx /error-pages/404.html @@ -49,11 +46,13 @@ grafana.home { import home + import logging reverse_proxy http://{$IP_GRAFANA}:3000 } uptime.home { import home + import logging reverse_proxy http://{$IP_UPTIME_KUMA}:3001 } @@ -85,18 +84,19 @@ uptime.home { geeksbsmrt.com { import geeksbsmrt - + import logging root * /srv/geeksbsmrt.com } analytics.geeksbsmrt.com { import geeksbsmrt - + import logging reverse_proxy http://{$IP_UMAMI_APP}:3000 } *.geeksbsmrt.com { import geeksbsmrt + import logging } (smrtgeekdevs) { @@ -104,12 +104,13 @@ analytics.geeksbsmrt.com { } smrtgeekdevs.com { + import logging #root * /var/www/smrtgeekdevs } pihole.smrtgeekdevs.com { import smrtgeekdevs - + import logging @atRoot { path / } @@ -120,4 +121,5 @@ pihole.smrtgeekdevs.com { *.smrtgeekdevs.com { import smrtgeekdevs + import logging } From 5e9d2a552d97ad6c5a06706ca75da217c1eab897 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 12 Jun 2025 23:59:33 -0400 Subject: [PATCH 08/31] Change logging to use arguments --- docker/caddy/Caddyfile | 85 +++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index e622f83..32e0763 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -2,18 +2,18 @@ # https://caddyserver.com/docs/caddyfile { - # Global options + # Global options - # Monitoring - admin :2019 - metrics { - per_host - } + # Monitoring + admin :2019 + metrics { + per_host + } } (logging) { log { - output file /data/logs/{http.request.host}.log { + output file /data/logs/{args.0}.log { roll_size 10mb roll_keep 5 roll_local_time @@ -25,7 +25,7 @@ # Global Imports (all) { - handle_errors { + handle_errors { @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 rewrite @4xx /error-pages/404.html @@ -40,77 +40,78 @@ # Default options for internal facing sites (home) { - import all - tls internal + import all + tls internal } grafana.home { - import home - import logging - reverse_proxy http://{$IP_GRAFANA}:3000 + import home + import logging grafana.home + reverse_proxy http://{$IP_GRAFANA}:3000 } uptime.home { - import home - import logging - reverse_proxy http://{$IP_UPTIME_KUMA}:3001 + import home + import logging uptime.home + reverse_proxy http://{$IP_UPTIME_KUMA}:3001 } # Default options for external facing sites (external) { - import all + import all - tls { + tls { dns cloudflare {env.CLOUDFLARE_API_TOKEN} } - header { - Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" - X-Xss-Protection "1; mode=block" - X-Content-Type-Options "nosniff" - X-Frame-Options "DENY" - Content-Security-Policy "upgrade-insecure-requests" - Referrer-Policy "strict-origin-when-cross-origin" - Cache-Control "public, max-age=15, must-revalidate" - Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(self), camera=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(*), speaker-selection=(), usb=(), xr-spatial-tracking=()" - [defer] - } - file_server + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + X-Xss-Protection "1; mode=block" + X-Content-Type-Options "nosniff" + X-Frame-Options "DENY" + Content-Security-Policy "upgrade-insecure-requests" + Referrer-Policy "strict-origin-when-cross-origin" + Cache-Control "public, max-age=15, must-revalidate" + Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(self), camera=(), encrypted-media=(), fullscreen=(self), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(*), speaker-selection=(), usb=(), xr-spatial-tracking=()" + [defer] + } + file_server } (geeksbsmrt) { - import external + import external } geeksbsmrt.com { - import geeksbsmrt - import logging + import geeksbsmrt + import logging geeksbsmrt.com root * /srv/geeksbsmrt.com } analytics.geeksbsmrt.com { import geeksbsmrt - import logging + import logging analytics.geeksbsmrt.com reverse_proxy http://{$IP_UMAMI_APP}:3000 } *.geeksbsmrt.com { - import geeksbsmrt - import logging + import geeksbsmrt + import logging wildcard.geeksbsmrt.com } (smrtgeekdevs) { - import external + import external } smrtgeekdevs.com { - import logging - #root * /var/www/smrtgeekdevs + import smrtgeekdevs # Inherit `external` config here + import logging smrtgeekdevs.com + #root * /var/www/smrtgeekdevs } pihole.smrtgeekdevs.com { import smrtgeekdevs - import logging + import logging pihole.smrtgeekdevs.com @atRoot { path / } @@ -120,6 +121,6 @@ pihole.smrtgeekdevs.com { } *.smrtgeekdevs.com { - import smrtgeekdevs - import logging + import smrtgeekdevs + import logging wildcard.smrtgeekdevs.com } From 0f1a6185071d51209c80e109f8e9f9169b6a10d9 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Fri, 13 Jun 2025 00:02:29 -0400 Subject: [PATCH 09/31] Disable logging --- docker/caddy/Caddyfile | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 32e0763..66172dc 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -46,13 +46,13 @@ grafana.home { import home - import logging grafana.home + # import logging grafana.home reverse_proxy http://{$IP_GRAFANA}:3000 } uptime.home { import home - import logging uptime.home + # import logging uptime.home reverse_proxy http://{$IP_UPTIME_KUMA}:3001 } @@ -84,19 +84,19 @@ uptime.home { geeksbsmrt.com { import geeksbsmrt - import logging geeksbsmrt.com + # import logging geeksbsmrt.com root * /srv/geeksbsmrt.com } analytics.geeksbsmrt.com { import geeksbsmrt - import logging analytics.geeksbsmrt.com + # import logging analytics.geeksbsmrt.com reverse_proxy http://{$IP_UMAMI_APP}:3000 } *.geeksbsmrt.com { import geeksbsmrt - import logging wildcard.geeksbsmrt.com + # import logging wildcard.geeksbsmrt.com } (smrtgeekdevs) { @@ -105,13 +105,13 @@ analytics.geeksbsmrt.com { smrtgeekdevs.com { import smrtgeekdevs # Inherit `external` config here - import logging smrtgeekdevs.com + # import logging smrtgeekdevs.com #root * /var/www/smrtgeekdevs } pihole.smrtgeekdevs.com { import smrtgeekdevs - import logging pihole.smrtgeekdevs.com + # import logging pihole.smrtgeekdevs.com @atRoot { path / } @@ -122,5 +122,5 @@ pihole.smrtgeekdevs.com { *.smrtgeekdevs.com { import smrtgeekdevs - import logging wildcard.smrtgeekdevs.com + # import logging wildcard.smrtgeekdevs.com } From 8fa6564a97d6367da396a9c7391932becf785f5a Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Mon, 16 Jun 2025 18:07:18 -0400 Subject: [PATCH 10/31] Update deprecated args accessor --- docker/caddy/Caddyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 66172dc..9796d83 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -13,7 +13,7 @@ (logging) { log { - output file /data/logs/{args.0}.log { + output file /data/logs/{args[0]}.log { roll_size 10mb roll_keep 5 roll_local_time From 666ae22e006aae3c8a2a603fdf8c29c542b5fa9e Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Wed, 18 Jun 2025 17:44:36 -0400 Subject: [PATCH 11/31] Improve error handling by updating 4xx and 5xx responses to serve custom error pages --- docker/caddy/Caddyfile | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 9796d83..0b2a9c0 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -27,14 +27,24 @@ (all) { handle_errors { @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 - rewrite @4xx /error-pages/404.html + handle @4xx { + root * /srv + file_server /error-pages/404.html + } + + # Handle 5xx errors + @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 + handle @5xx { + root * /srv + file_server /error-pages/5xx.html + } - rewrite * /error-pages/5xx.html + # handle { + # root * /srv + # file_server /error-pages/default.html + # } templates - file_server { - root /srv - } } } From 43f4f6d6222ef9f655387e2c73f24b601a073a4a Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:27:43 -0400 Subject: [PATCH 12/31] Add --quiet to docker compose pull to limit output in GHA. --- .github/workflows/deploy-prod.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-prod.yaml b/.github/workflows/deploy-prod.yaml index 3d4621a..a7d8ecc 100644 --- a/.github/workflows/deploy-prod.yaml +++ b/.github/workflows/deploy-prod.yaml @@ -174,7 +174,7 @@ jobs: - name: Pull latest Docker images run: | cd "${{ secrets.DOCKER_DIR }}" - sudo docker compose pull + sudo docker compose pull --quiet - name: Apply Docker Compose changes run: | From 3cb14b12c22324c2f7206da368f27aea1d30a53a Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:41:41 -0400 Subject: [PATCH 13/31] Enhance error handling by implementing dynamic error pages for 4xx and 5xx responses and updating file paths in Caddy configuration --- docker/caddy/Caddyfile | 40 +++++++++++---- .../caddy/error-pages/{404.html => 4xx.html} | 21 ++++++-- docker/caddy/error-pages/5xx.html | 50 ++++++++++++++++--- docker/docker-compose.yml | 2 +- 4 files changed, 92 insertions(+), 21 deletions(-) rename docker/caddy/error-pages/{404.html => 4xx.html} (52%) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 0b2a9c0..e8790ee 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -25,26 +25,46 @@ # Global Imports (all) { + # Caddy-generated error handling (e.g., from file_server) handle_errors { + # Catch all 4xx errors and serve the dynamic 404.html page @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 handle @4xx { - root * /srv - file_server /error-pages/404.html + status {error.status_code} # Keep the specific status code Caddy generated + rewrite * /404.html # Serve the dynamic 404 page + templates + file_server { root /srv/error-pages } } - # Handle 5xx errors + # Catch all 5xx errors and serve the dynamic 5xx.html page @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 handle @5xx { - root * /srv - file_server /error-pages/5xx.html + status {error.status_code} # Keep the specific status code Caddy generated + rewrite * /5xx.html # Serve the dynamic 5xx page + templates + file_server { root /srv/error-pages } } + } - # handle { - # root * /srv - # file_server /error-pages/default.html - # } + # Upstream-generated error handling for reverse_proxy + handle_response { + # Catch all 4xx errors from upstream and serve the dynamic 404.html page + @upstream_4xx status 400-499 + handle @upstream_4xx { + status {http.response.status_code} # Use the upstream's specific status code + rewrite * /404.html # Serve the dynamic 404 page + templates + file_server { root /srv/error-pages } + } - templates + # Catch all 5xx errors from upstream and serve the dynamic 5xx.html page + @upstream_5xx status 500-599 + handle @upstream_5xx { + status {http.response.status_code} # Use the upstream's specific status code + rewrite * /5xx.html # Serve the dynamic 5xx page + templates + file_server { root /srv/error-pages } + } } } diff --git a/docker/caddy/error-pages/404.html b/docker/caddy/error-pages/4xx.html similarity index 52% rename from docker/caddy/error-pages/404.html rename to docker/caddy/error-pages/4xx.html index 7f2ed00..c8b6b78 100644 --- a/docker/caddy/error-pages/404.html +++ b/docker/caddy/error-pages/4xx.html @@ -3,7 +3,7 @@ - 404 Not Found + {{.Error.status_code}} {{.Error.status_text}}
-

Oops! Page Not Found

-

Sorry, we couldn't find the page you were looking for.

+

Error {{.Error.status_code}} - {{.Error.status_text}}

+

Sorry, something went wrong, or the page you were looking for could not be found.

+ {{- if .Error.msg }} +

Details: {{.Error.msg}}

+ {{- end }}

Return to Homepage

diff --git a/docker/caddy/error-pages/5xx.html b/docker/caddy/error-pages/5xx.html index bbcf664..1b09e08 100644 --- a/docker/caddy/error-pages/5xx.html +++ b/docker/caddy/error-pages/5xx.html @@ -1,22 +1,58 @@ + - Server Error + {{.Error.status_code}} {{.Error.status_text}} +
-

Oops! Something Went Wrong

-

A server error occurred and we have been notified. Our administrator will look into it.

+

Oops! Error {{.Error.status_code}} - {{.Error.status_text}}

+

A server error occurred and we have been notified. Our administrator will look into it. +

+ {{- if .Error.ID }}

If you need to report this issue, please provide the following Error ID:

Error ID: {{.Error.ID}}

+ {{- end }} + {{- if .Error.msg }} +

Details: {{.Error.msg}}

+ {{- end }}

Return to Homepage

+ diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 9593437..5974f01 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -74,7 +74,7 @@ services: ipv4_address: ${IP_CADDY} volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile - - ./caddy/error-pages:/etc/caddy/error-pages:ro + - ./caddy/error-pages:/srv/error-pages:ro - /srv:/srv - caddy_data:/data - caddy_config:/config From 35069ca0acfa1e6067b00c3e9504be74d2c34872 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:45:16 -0400 Subject: [PATCH 14/31] Remove whitespace in file_server directives --- docker/caddy/Caddyfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index e8790ee..b4f9ffb 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -33,7 +33,7 @@ status {error.status_code} # Keep the specific status code Caddy generated rewrite * /404.html # Serve the dynamic 404 page templates - file_server { root /srv/error-pages } + file_server {root /srv/error-pages} } # Catch all 5xx errors and serve the dynamic 5xx.html page @@ -42,7 +42,7 @@ status {error.status_code} # Keep the specific status code Caddy generated rewrite * /5xx.html # Serve the dynamic 5xx page templates - file_server { root /srv/error-pages } + file_server {root /srv/error-pages} } } @@ -54,7 +54,7 @@ status {http.response.status_code} # Use the upstream's specific status code rewrite * /404.html # Serve the dynamic 404 page templates - file_server { root /srv/error-pages } + file_server {root /srv/error-pages} } # Catch all 5xx errors from upstream and serve the dynamic 5xx.html page @@ -63,7 +63,7 @@ status {http.response.status_code} # Use the upstream's specific status code rewrite * /5xx.html # Serve the dynamic 5xx page templates - file_server { root /srv/error-pages } + file_server {root /srv/error-pages} } } } From b4a5638c2588a014b3b0dc52bdfc02301a0a99c1 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:48:09 -0400 Subject: [PATCH 15/31] Refactor error handling to use 'respond' for serving dynamic error pages for 4xx and 5xx responses --- docker/caddy/Caddyfile | 45 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index b4f9ffb..de637b9 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -25,45 +25,46 @@ # Global Imports (all) { - # Caddy-generated error handling (e.g., from file_server) + # Enable templates for the entire scope, so error pages can be processed dynamically + templates + + # Caddy-generated error handling (e.g., from file_server directives) handle_errors { - # Catch all 4xx errors and serve the dynamic 404.html page + # Catch all 4xx errors @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 handle @4xx { - status {error.status_code} # Keep the specific status code Caddy generated - rewrite * /404.html # Serve the dynamic 404 page - templates - file_server {root /srv/error-pages} + # Use 'respond' to set the status code and serve the templated error page + respond {error.status_code} { + body @/srv/error-pages/404.html # Serve the content of 404.html as the body + } } - # Catch all 5xx errors and serve the dynamic 5xx.html page + # Catch all 5xx errors @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 handle @5xx { - status {error.status_code} # Keep the specific status code Caddy generated - rewrite * /5xx.html # Serve the dynamic 5xx page - templates - file_server {root /srv/error-pages} + respond {error.status_code} { + body @/srv/error-pages/5xx.html # Serve the content of 5xx.html as the body + } } } - # Upstream-generated error handling for reverse_proxy + # Upstream-generated error handling (for reverse_proxy directives) handle_response { - # Catch all 4xx errors from upstream and serve the dynamic 404.html page + # Catch all 4xx errors from the upstream @upstream_4xx status 400-499 handle @upstream_4xx { - status {http.response.status_code} # Use the upstream's specific status code - rewrite * /404.html # Serve the dynamic 404 page - templates - file_server {root /srv/error-pages} + # Use 'respond' to set the status code from the upstream response and serve the error page + respond {http.response.status_code} { + body @/srv/error-pages/404.html # Serve the content of 404.html as the body + } } - # Catch all 5xx errors from upstream and serve the dynamic 5xx.html page + # Catch all 5xx errors from the upstream @upstream_5xx status 500-599 handle @upstream_5xx { - status {http.response.status_code} # Use the upstream's specific status code - rewrite * /5xx.html # Serve the dynamic 5xx page - templates - file_server {root /srv/error-pages} + respond {http.response.status_code} { + body @/srv/error-pages/5xx.html # Serve the content of 5xx.html as the body + } } } } From 9fa57eab57f4cb452a0f5b5e5d08562eb2cf15c5 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:55:36 -0400 Subject: [PATCH 16/31] Refactor error handling to use 'rewrite' and 'file_server' for serving custom error pages for 4xx and 5xx responses --- docker/caddy/Caddyfile | 51 +++++++++++++++++------------------------- 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index de637b9..ceaaae2 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -30,45 +30,36 @@ # Caddy-generated error handling (e.g., from file_server directives) handle_errors { - # Catch all 4xx errors - @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 - handle @4xx { - # Use 'respond' to set the status code and serve the templated error page - respond {error.status_code} { - body @/srv/error-pages/404.html # Serve the content of 404.html as the body - } - } + @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 + handle @4xx { + rewrite * /4xx.html + file_server + } - # Catch all 5xx errors - @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 - handle @5xx { - respond {error.status_code} { - body @/srv/error-pages/5xx.html # Serve the content of 5xx.html as the body - } - } + @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 + handle @5xx { + rewrite * /5xx.html + file_server } +} # Upstream-generated error handling (for reverse_proxy directives) handle_response { - # Catch all 4xx errors from the upstream - @upstream_4xx status 400-499 - handle @upstream_4xx { - # Use 'respond' to set the status code from the upstream response and serve the error page - respond {http.response.status_code} { - body @/srv/error-pages/404.html # Serve the content of 404.html as the body - } - } + @upstream_4xx status 400-499 + handle @upstream_4xx { + rewrite * /4xx.html + file_server + } - # Catch all 5xx errors from the upstream - @upstream_5xx status 500-599 - handle @upstream_5xx { - respond {http.response.status_code} { - body @/srv/error-pages/5xx.html # Serve the content of 5xx.html as the body - } - } + @upstream_5xx status 500-599 + handle @upstream_5xx { + rewrite * /5xx.html + file_server } } +} + # Default options for internal facing sites (home) { import all From 903bc0164777251d5e7bcdb0fceafde204aefef7 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 10:58:37 -0400 Subject: [PATCH 17/31] Refactor error handling to serve dynamic error pages from a specified root for 4xx and 5xx responses --- docker/caddy/Caddyfile | 51 ++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index ceaaae2..52dea1e 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -25,41 +25,44 @@ # Global Imports (all) { - # Enable templates for the entire scope, so error pages can be processed dynamically + # Enable templates for dynamic error pages templates - # Caddy-generated error handling (e.g., from file_server directives) + # Error handling for Caddy-generated errors handle_errors { - @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 - handle @4xx { - rewrite * /4xx.html - file_server - } + @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 + handle @4xx { + root * /srv/error-pages + rewrite * /4xx.html + file_server + } - @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 - handle @5xx { - rewrite * /5xx.html - file_server + @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 + handle @5xx { + root * /srv/error-pages + rewrite * /5xx.html + file_server + } } -} - # Upstream-generated error handling (for reverse_proxy directives) + # Error handling for upstream (reverse_proxy) responses handle_response { - @upstream_4xx status 400-499 - handle @upstream_4xx { - rewrite * /4xx.html - file_server - } + @upstream_4xx status 400-499 + handle @upstream_4xx { + root * /srv/error-pages + rewrite * /4xx.html + file_server + } - @upstream_5xx status 500-599 - handle @upstream_5xx { - rewrite * /5xx.html - file_server + @upstream_5xx status 500-599 + handle @upstream_5xx { + root * /srv/error-pages + rewrite * /5xx.html + file_server + } } } -} - # Default options for internal facing sites (home) { import all From 7ac993bfea8558a431bc7e897a0880fd6e30d07a Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 11:00:21 -0400 Subject: [PATCH 18/31] Remove upstream error handling for 4xx and 5xx responses from Caddyfile --- docker/caddy/Caddyfile | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 52dea1e..aaee5c6 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -44,23 +44,6 @@ file_server } } - - # Error handling for upstream (reverse_proxy) responses - handle_response { - @upstream_4xx status 400-499 - handle @upstream_4xx { - root * /srv/error-pages - rewrite * /4xx.html - file_server - } - - @upstream_5xx status 500-599 - handle @upstream_5xx { - root * /srv/error-pages - rewrite * /5xx.html - file_server - } - } } # Default options for internal facing sites From e115840505eb9f175d052ab416188ddea36d1b88 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 11:05:31 -0400 Subject: [PATCH 19/31] Update error page directory paths in Caddyfile and docker-compose.yml --- docker/caddy/Caddyfile | 4 ++-- docker/docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index aaee5c6..e60905e 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -32,14 +32,14 @@ handle_errors { @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 handle @4xx { - root * /srv/error-pages + root * /opt/error-pages rewrite * /4xx.html file_server } @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 handle @5xx { - root * /srv/error-pages + root * /opt/error-pages rewrite * /5xx.html file_server } diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 5974f01..a61b22f 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -74,7 +74,7 @@ services: ipv4_address: ${IP_CADDY} volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile - - ./caddy/error-pages:/srv/error-pages:ro + - ./caddy/error-pages:/opt/caddy-error-pages:ro - /srv:/srv - caddy_data:/data - caddy_config:/config From 7ecf44afcc5764537ac17af7c55d01ec53abd700 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 11:08:02 -0400 Subject: [PATCH 20/31] Refactor error handling to use status directives for 4xx and 5xx responses in Caddyfile --- docker/caddy/Caddyfile | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index e60905e..55be6ec 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -30,19 +30,18 @@ # Error handling for Caddy-generated errors handle_errors { - @4xx expression {error.status_code} >= 400 && {error.status_code} < 500 - handle @4xx { - root * /opt/error-pages - rewrite * /4xx.html - file_server - } + @4xx status 400-499 + handle @4xx { + root * /opt/caddy-error-pages + rewrite * /4xx.html + file_server + } - @5xx expression {error.status_code} >= 500 && {error.status_code} < 600 - handle @5xx { - root * /opt/error-pages - rewrite * /5xx.html - file_server - } + @5xx status 500-599 + handle @5xx { + root * /opt/caddy-error-pages + rewrite * /5xx.html + file_server } } From 32c22756d21e0ae8e16d53c1b37f704d789974a0 Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 11:09:29 -0400 Subject: [PATCH 21/31] Fix missing } --- docker/caddy/Caddyfile | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index 55be6ec..a79a21e 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -30,18 +30,19 @@ # Error handling for Caddy-generated errors handle_errors { - @4xx status 400-499 - handle @4xx { - root * /opt/caddy-error-pages - rewrite * /4xx.html - file_server - } + @4xx status 400-499 + handle @4xx { + root * /opt/caddy-error-pages + rewrite * /4xx.html + file_server + } - @5xx status 500-599 - handle @5xx { - root * /opt/caddy-error-pages - rewrite * /5xx.html - file_server + @5xx status 500-599 + handle @5xx { + root * /opt/caddy-error-pages + rewrite * /5xx.html + file_server + } } } From c64e429288ce13b3d48abec69c7c91f513af5a8b Mon Sep 17 00:00:00 2001 From: Adam Crawford Date: Thu, 19 Jun 2025 11:13:28 -0400 Subject: [PATCH 22/31] Refactor error handling to serve a unified error page for all responses and remove specific 4xx and 5xx error pages --- docker/caddy/Caddyfile | 15 +---- docker/caddy/error-pages/5xx.html | 58 ------------------- .../error-pages/{4xx.html => error.html} | 21 +++++-- 3 files changed, 18 insertions(+), 76 deletions(-) delete mode 100644 docker/caddy/error-pages/5xx.html rename docker/caddy/error-pages/{4xx.html => error.html} (60%) diff --git a/docker/caddy/Caddyfile b/docker/caddy/Caddyfile index a79a21e..e73762e 100644 --- a/docker/caddy/Caddyfile +++ b/docker/caddy/Caddyfile @@ -30,19 +30,10 @@ # Error handling for Caddy-generated errors handle_errors { - @4xx status 400-499 - handle @4xx { - root * /opt/caddy-error-pages - rewrite * /4xx.html - file_server - } + root * /opt/caddy-error-pages - @5xx status 500-599 - handle @5xx { - root * /opt/caddy-error-pages - rewrite * /5xx.html - file_server - } + rewrite * /error.html + file_server } } diff --git a/docker/caddy/error-pages/5xx.html b/docker/caddy/error-pages/5xx.html deleted file mode 100644 index 1b09e08..0000000 --- a/docker/caddy/error-pages/5xx.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - {{.Error.status_code}} {{.Error.status_text}} - - - - -
-

Oops! Error {{.Error.status_code}} - {{.Error.status_text}}

-

A server error occurred and we have been notified. Our administrator will look into it. -

- {{- if .Error.ID }} -

If you need to report this issue, please provide the following Error ID:

-

Error ID: {{.Error.ID}}

- {{- end }} - {{- if .Error.msg }} -

Details: {{.Error.msg}}

- {{- end }} -

Return to Homepage

-
- - - diff --git a/docker/caddy/error-pages/4xx.html b/docker/caddy/error-pages/error.html similarity index 60% rename from docker/caddy/error-pages/4xx.html rename to docker/caddy/error-pages/error.html index c8b6b78..ecb78fe 100644 --- a/docker/caddy/error-pages/4xx.html +++ b/docker/caddy/error-pages/error.html @@ -3,7 +3,7 @@ - {{.Error.status_code}} {{.Error.status_text}} + {{ .StatusCode }} {{ .StatusText }}