A repeatable checklist for deploying a new self-hosted service.
service.folk.zone)service-name: image: image:tag container_name: service-name restart: unless-stopped environment: - KEY=value volumes: - ./service/data:/data networks: - cafe_net
In caddy/Caddyfile:
@service host service.folk.zone
handle @service {
reverse_proxy service-name:port
}
For password protection, add basic_auth inside the handle block. Generate hash:
docker exec cafe-caddy-1 caddy hash-password --plaintext 'password'
scp cafe/docker-compose.yml brennan@192.168.1.65:/home/brennan/cafe/docker-compose.yml scp cafe/caddy/Caddyfile brennan@192.168.1.65:/home/brennan/cafe/caddy/Caddyfile ssh brennan@192.168.1.65 "cd /home/brennan/cafe && docker compose up -d service-name" ssh brennan@192.168.1.65 "docker exec cafe-caddy-1 caddy reload --config /etc/caddy/Caddyfile"
Zero Trust → Networks → Tunnels → cafe → Public Hostnames → Add:
Do NOT edit the local config.yml — it is overridden by the dashboard config.
https://status.folk.zone → Add New Monitor → HTTP(s), URL: https://service.folk.zone, interval: 60s.
Edit dashboard/index.html and dashboard/services.html, then:
scp dashboard/index.html brennan@192.168.1.65:/home/brennan/cafe/dashboard/index.html scp dashboard/services.html brennan@192.168.1.65:/home/brennan/cafe/dashboard/services.html
Create :folkzone:services:service-name following the service page template.