Files
quartz/content/20-29 HOBBYS/22 SELF HOSTING/22.11 DIGITAL GARDEN/Caddy.md
Quartz Syncer fe0581e423
All checks were successful
Build and Deploy Quartz / build (push) Successful in 27s
Published multiple files
2026-02-05 12:24:25 -07:00

149 lines
2.6 KiB
Markdown

---
publish: true
permalink: /sh/garden/caddy
title: Caddy
created: 2026-02-05T09:58:59.617-07:00
modified: 2026-02-05T12:21:13.914-07:00
tags:
- self_hosting
- web_server
cssclasses: ""
---
Caddy is a powerful web server with automatic HTTPS. I use it to serve my [[20-29 HOBBYS/22 SELF HOSTING/22.11 DIGITAL GARDEN/Quartz]] digital garden.
## Installation
**Arch Linux:**
```bash
sudo pacman -S caddy
```
**Docker:**
```bash
docker pull caddy:latest
```
**Binary:**
Download from https://caddyserver.com/download
## Basic Configuration
Caddyfile location: `/etc/caddy/Caddyfile`
### Serve Static Files
```caddyfile
garden.example.com {
root * /var/www/garden/public
file_server
# Handle SPA routing (if using Quartz SPA mode)
try_files {path} {path}/ /index.html
# Compression
encode gzip zstd
}
```
### With Reverse Proxy
If running Quartz dev server:
```caddyfile
garden.example.com {
reverse_proxy localhost:8080
}
```
## Automatic HTTPS
Caddy automatically provisions TLS certificates via Let's Encrypt. Just use a domain name and Caddy handles the rest.
Requirements:
- Domain DNS points to your server
- Ports 80 and 443 accessible
- Caddy can bind to those ports
## Running Caddy
### systemd
```bash
sudo systemctl enable --now caddy
```
### Manual
```bash
caddy run --config /etc/caddy/Caddyfile
```
### Reload config
```bash
sudo systemctl reload caddy
# or
caddy reload --config /etc/caddy/Caddyfile
```
## Digital Garden Setup
My Caddyfile for serving Quartz:
```caddyfile
garden.example.com {
root * /var/www/garden/public
file_server
# Quartz SPA routing
try_files {path} {path}.html {path}/ /index.html
# Compression for faster loads
encode gzip zstd
# Cache static assets
@static {
path *.css *.js *.woff2 *.png *.jpg *.svg
}
header @static Cache-Control "public, max-age=31536000"
# Security headers
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy strict-origin-when-cross-origin
}
}
```
## Deployment Workflow
1. Build Quartz: `npx quartz build`
2. Copy to server: `rsync -avz public/ server:/var/www/garden/public/`
3. Caddy automatically serves the new files
Or use a CI/CD pipeline to automate.
## Multiple Sites
```caddyfile
garden.example.com {
root * /var/www/garden/public
file_server
}
blog.example.com {
root * /var/www/blog
file_server
}
api.example.com {
reverse_proxy localhost:3000
}
```
## Resources
- Docs: https://caddyserver.com/docs/
- Caddyfile: https://caddyserver.com/docs/caddyfile