Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
73bd55a
Update Caddyfile config for PiHole
geeksbsmrt Jun 13, 2025
8e2b54e
Update Caddy logging and update error pages
geeksbsmrt Jun 13, 2025
0b19859
Refine error handling and update file server root in Caddyfile
geeksbsmrt Jun 13, 2025
726780e
Fix template error
geeksbsmrt Jun 13, 2025
d78ccb2
Move 'templates' directive back out of 'file_server' directive.
geeksbsmrt Jun 13, 2025
be097f0
Fix Caddy variables
geeksbsmrt Jun 13, 2025
f8878da
Move logging import into site specific configs
geeksbsmrt Jun 13, 2025
5e9d2a5
Change logging to use arguments
geeksbsmrt Jun 13, 2025
0f1a618
Disable logging
geeksbsmrt Jun 13, 2025
8fa6564
Update deprecated args accessor
geeksbsmrt Jun 16, 2025
666ae22
Improve error handling by updating 4xx and 5xx responses to serve cus…
geeksbsmrt Jun 18, 2025
43f4f6d
Add --quiet to docker compose pull to limit output in GHA.
geeksbsmrt Jun 19, 2025
3cb14b1
Enhance error handling by implementing dynamic error pages for 4xx an…
geeksbsmrt Jun 19, 2025
35069ca
Remove whitespace in file_server directives
geeksbsmrt Jun 19, 2025
b4a5638
Refactor error handling to use 'respond' for serving dynamic error pa…
geeksbsmrt Jun 19, 2025
9fa57ea
Refactor error handling to use 'rewrite' and 'file_server' for servin…
geeksbsmrt Jun 19, 2025
903bc01
Refactor error handling to serve dynamic error pages from a specified…
geeksbsmrt Jun 19, 2025
7ac993b
Remove upstream error handling for 4xx and 5xx responses from Caddyfile
geeksbsmrt Jun 19, 2025
e115840
Update error page directory paths in Caddyfile and docker-compose.yml
geeksbsmrt Jun 19, 2025
7ecf44a
Refactor error handling to use status directives for 4xx and 5xx resp…
geeksbsmrt Jun 19, 2025
32c2275
Fix missing }
geeksbsmrt Jun 19, 2025
c64e429
Refactor error handling to serve a unified error page for all respons…
geeksbsmrt Jun 19, 2025
5079c6b
Move templates directive into handle_errors
geeksbsmrt Jun 19, 2025
86a54e2
Update error.html to use correct error variables
geeksbsmrt Jun 19, 2025
da83216
Add generic error page for troubleshooting.
geeksbsmrt Jun 19, 2025
a4e273f
Add .Error to Caddy variables
geeksbsmrt Jun 19, 2025
cc7bac2
Fully qualify variable reference
geeksbsmrt Jun 19, 2025
a0caec6
Add Placeholder directive
geeksbsmrt Jun 19, 2025
9406f34
Refactor error handling: update error page to use placeholders and re…
geeksbsmrt Jun 19, 2025
6c71e77
Refactor error handling: fully qualify status code checks in error page
geeksbsmrt Jun 19, 2025
ff72361
Refactor Caddyfile: streamline logging imports and remove unnecessary…
geeksbsmrt Jun 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/deploy-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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: |
Expand Down
108 changes: 62 additions & 46 deletions docker/caddy/Caddyfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,101 +2,117 @@
# 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/{args[0]}.log {
roll_size 10mb
roll_keep 5
roll_local_time
}
format console
level INFO
}
}

# Global Imports
(all) {
handle_errors {
respond "{err.status_code} {err.status_text}"
# Error handling for Caddy-generated errors
handle_errors {
root * /opt/caddy-error-pages
rewrite * /error.html
templates
file_server
}
# handle_errors {
# rewrite * /404.html
# file_server {
# status 404
# }
# }
}

# Default options for internal facing sites
(home) {
import all
tls internal
import all
tls internal
}

grafana.home {
import home
reverse_proxy http://{$IP_GRAFANA}:3000
import home
import logging grafana.home
reverse_proxy http://{$IP_GRAFANA}:3000
}

uptime.home {
import home
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 geeksbsmrt
import logging geeksbsmrt.com
root * /srv/geeksbsmrt.com
}

analytics.geeksbsmrt.com {
import geeksbsmrt

import logging analytics.geeksbsmrt.com
reverse_proxy http://{$IP_UMAMI_APP}:3000
}

*.geeksbsmrt.com {
import geeksbsmrt
import geeksbsmrt
import logging wildcard.geeksbsmrt.com
}

(smrtgeekdevs) {
import external
import external
}

smrtgeekdevs.com {
#root * /var/www/smrtgeekdevs
import smrtgeekdevs # Inherit `external` config here
import logging smrtgeekdevs.com
#root * /var/www/smrtgeekdevs
}

pihole.smrtgeekdevs.com {
import smrtgeekdevs

redir / /admin{uri}
reverse_proxy pihole
import smrtgeekdevs
import logging pihole.smrtgeekdevs.com
redir / /admin{uri} 308
reverse_proxy http://pihole
}

*.smrtgeekdevs.com {
import smrtgeekdevs
import smrtgeekdevs
import logging wildcard.smrtgeekdevs.com
}
62 changes: 62 additions & 0 deletions docker/caddy/error-pages/error.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="utf-8">
<title>Error {{placeholder "http.error.status_code"}} - {{placeholder "http.error.status_text"}}</title>
<style>
body {
font-family: sans-serif;
text-align: center;
padding: 40px;
background-color: #f8f9fa;
color: #343a40;
}

.container {
max-width: 600px;
margin: auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

h1 {
color: #dc3545;
}

p.error-detail {
font-size: 1.1em;
color: #6c757d;
}

code {
background-color: #e9ecef;
padding: 2px 6px;
border-radius: 4px;
font-family: monospace;
}
</style>
</head>

<body>
<div class="container">
<h1>Error {{placeholder "http.error.status_code"}} - {{placeholder "http.error.status_text"}}</h1>
<p class="error-detail">
{{if ge (atoi (placeholder "http.error.status_code")) 500}}
We’re experiencing some internal trouble. Please try again later.
{{else if ge (atoi (placeholder "http.error.status_code")) 400}}
The page you're looking for doesn't exist or your request was invalid.
{{else}}
An unexpected issue occurred.
{{end}}
</p>
{{ with placeholder "http.error.message" }}
<p><strong>Details:</strong> <code>{{.}}</code></p>
{{ end }}
<p><a href="/">Return to Homepage</a></p>
</div>
</body>

</html>
6 changes: 6 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:/opt/caddy-error-pages:ro
- /srv:/srv
- caddy_data:/data
- caddy_config:/config
Expand Down