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
1{{ define "main" }}
2<div class="container-fluid px-4 py-4">
3 <div class="page-head">
4 <div>
5 <div class="auth-eyebrow">security</div>
6 <h1 class="page-title">{{ .Title }}</h1>
7 </div>
8 </div>
9
10 {{ template "alerts" . }}
11
12 <div class="row g-3">
13 <div class="col-12 col-lg-6">
14 <div class="panel">
15 <div class="panel-title">recovery codes</div>
16 <div class="stat {{ if lt .Remaining 3 }}is-low{{ end }}">{{ .Remaining }}<span class="text-muted" style="font-size:1rem; font-weight:400;"> of 10 left</span></div>
17 <div class="pips" aria-hidden="true">
18 {{ range pips .Remaining }}<span class="pip {{ if . }}is-lit{{ end }}"></span>{{ end }}
19 </div>
20 <p class="auth-hint mt-0">Each works once. A new set invalidates every old code, and is shown
21 once and never again.</p>
22 {{ if .InSudo }}
23 <form method="POST" action="/security/recovery">
24 <button type="submit" class="btn btn-primary btn-sm">Generate a new set</button>
25 </form>
26 {{ else }}
27 <a href="/login?next=/security" class="btn btn-outline-light btn-sm">Sign in again to replace them</a>
28 {{ end }}
29 </div>
30 </div>
31
32 <div class="col-12 col-lg-6">
33 <div class="panel">
34 <div class="panel-title">the phone</div>
35 <dl class="field-list">
36 <div><dt>server</dt><dd>{{ .NtfyHost }}</dd></div>
37 <div><dt>account</dt><dd>{{ .NtfyUser }}</dd></div>
38 <div><dt>topic</dt><dd>{{ .NtfyTopic }}</dd></div>
39 </dl>
40 <p class="auth-hint">The ntfy password is not here and cannot be. ntfy stores it hashed and
41 will not hand one back, and the two ways around that are keeping a second reversible copy
42 on an internet facing box or giving this container the Docker socket. Change it with
43 <code>make ntfy-passwd</code> on the machine.</p>
44 </div>
45 </div>
46 </div>
47</div>
48{{ end }}