87 lines
2.4 KiB
Caddyfile
87 lines
2.4 KiB
Caddyfile
# Template: Caddyfile.override
|
|
# Purpose: Default configuration for custom containers.
|
|
# Description:
|
|
# - Serves static files from /srv.
|
|
# - Provides a /health endpoint for health checks.
|
|
# - Designed to run behind a reverse proxy like Træfik, listening only on port 80.
|
|
# - comes with security headers
|
|
|
|
:80 {
|
|
# Health check endpoint
|
|
respond /health "OK" 200
|
|
|
|
# Enable compression for text-based resources
|
|
encode gzip zstd
|
|
|
|
# Security headers
|
|
header {
|
|
# Cross-Origin headers
|
|
Cross-Origin-Embedder-Policy "require-corp"
|
|
Cross-Origin-Opener-Policy "same-origin"
|
|
Cross-Origin-Resource-Policy "same-origin"
|
|
|
|
# Permissions Policy
|
|
Permissions-Policy "camera=(), microphone=(), geolocation=(), interest-cohort=()"
|
|
|
|
# Referrer Policy
|
|
Referrer-Policy "strict-origin-when-cross-origin"
|
|
|
|
# HSTS
|
|
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
|
|
|
|
# Content Type Options
|
|
X-Content-Type-Options "nosniff"
|
|
|
|
# XSS Protection
|
|
X-XSS-Protection "1; mode=block"
|
|
|
|
# Frame Options (prevents clickjacking)
|
|
X-Frame-Options "SAMEORIGIN"
|
|
|
|
# Frame ancestors (prevents embedding in other sites)
|
|
Content-Security-Policy "frame-ancestors 'none'"
|
|
|
|
# Remove Server header
|
|
-Server
|
|
}
|
|
|
|
# Cache control for static assets - images, fonts, etc.
|
|
@staticAssets {
|
|
path *.jpg *.jpeg *.png *.webp *.avif *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot
|
|
method GET HEAD
|
|
}
|
|
header @staticAssets Cache-Control "public, max-age=31536000, immutable"
|
|
header @staticAssets ?Access-Control-Allow-Origin *
|
|
|
|
# Special handling for CSS and JS files
|
|
@cssAndJs {
|
|
path *.css *.js
|
|
method GET HEAD
|
|
}
|
|
header @cssAndJs Cache-Control "public, max-age=31536000, immutable"
|
|
|
|
# Cache HTML files but for a shorter period
|
|
@htmlFiles {
|
|
path *.html
|
|
method GET HEAD
|
|
}
|
|
header @htmlFiles Cache-Control "public, max-age=86400, must-revalidate"
|
|
|
|
# Static file server
|
|
file_server {
|
|
root /srv # Root directory for serving static files
|
|
}
|
|
|
|
# Restrict allowed methods to only GET and HEAD
|
|
@staticRequests {
|
|
method GET HEAD
|
|
}
|
|
|
|
handle @staticRequests {
|
|
root * /srv
|
|
file_server
|
|
}
|
|
|
|
# Handle all other methods
|
|
respond "Method Not Allowed" 405
|
|
} |