orchard
mirrorEvery site I host, in one repo, along with the Cloudflare Tunnel and Caddy that front them. It's all Go, Vite, and SQLite, and it runs on a desktop at home with nothing listening on an inbound port.
blogbuncaddycloudflare-tunneldockergogolanghomelabhtml-templatemonorepoself-hostedseosqlitestatic-sitetypstuptime-monitoringviteweb-analytics
1name: orchard-dash
2
3# No published ports and no secrets. Everything this site shows is public: free
4# market data, two public feeds, the weather, and whether Isaac's own sites are
5# answering. The volume holds one JSON file, the upstream guard's state, which
6# has to survive a restart or the circuit breaker is not one.
7
8services:
9 app:
10 build:
11 context: .
12 dockerfile: Dockerfile
13 container_name: orchard-dash
14 restart: unless-stopped
15 # Longer than Docker's 10s default, because shutdown drains the log shipper
16 # queue and flushes the guard state.
17 stop_grace_period: 30s
18 volumes:
19 - data:/data
20 # A ceiling to fail against rather than a target. This process holds one
21 # state snapshot and a handful of open SSE connections, so it is the
22 # lightest site here.
23 deploy:
24 resources:
25 limits:
26 cpus: "0.50"
27 memory: 128M
28 healthcheck:
29 test: ["CMD", "/app", "-healthcheck"]
30 interval: 30s
31 timeout: 5s
32 retries: 3
33 start_period: 10s
34 security_opt:
35 - no-new-privileges:true
36 logging:
37 driver: json-file
38 options:
39 max-size: "10m"
40 max-file: "3"
41 networks: [edge]
42
43volumes:
44 data:
45 name: orchard-dash-data
46
47networks:
48 edge:
49 name: orchard-edge
50 external: true