setcap cap_net_bind_service). Enhetliga säkerhets-headers: HSTS, nosniff, X-Frame-Options,
strikt CSP (extern JS, inga inline-skript). Betyg gick F → A/A+.knuths.dev
Ett självhostat privat moln på en enda Ubuntu-VM — byggt öppet, härdat medvetet.
01Apparna — live
Flera småappar under en domän, en app per subdomän. Alla länkar går till skarpa tjänster.
Kollar driftstatus…
02Arkitektur
All publik ingress går via en utgående Cloudflare Tunnel — det finns inga öppna inkommande portar på VM:en. Admin (SSH + Dokploy) sker bara över Tailscale.
Ingress-väg:
Internet → Cloudflare (DNS/TLS/Access) → Tunnel → cloudflared → traefik :80 → app:80
(Host-header). Traefik serverar ren HTTP; TLS termineras vid edgen.
Solid linje = publik trafikväg, streckad = internt/admin. Tjänsterna i detalj: se Stacken nedan.
bet.knuths.dev — subsystem
Bet-appen är komplex nog att förtjäna en egen genomlysning. Odds från flera böcker
de-viggas till ett kontolöst konsensus-ankare (bok-namn hashas bort), en daglig
generate → snapshot → settle mäter varje signals Closing Line Value
— som pendlar ≈0, för marknaden är effektiv (ingen mätbar kant, bevisat på
24k+ matcher). Endast papper. Full doc:
bet/ARCHITECTURE.md.
CLV är hjälten — det enda robusta kant-testet — och det pendlar ≈0. Fria resultat-feeds settlar utan API-krediter; en offline-backfill på 24k matcher matar samma vyer. Böcker visas aldrig med namn, bara som ett antal.
03Stacken
Allt körs i containrar och återskapas ur repot. Publikt = via Cloudflare · Access = e-postgatad ·
Internal = bara på dokploy-network · Tailscale = enbart över tailnet.
| Komponent | Image | Vad | Exponering |
|---|---|---|---|
| nav | node:24.19.0-alpine | Node-hub + realtidsstatus per app-kort | Publik |
| cv / bolan / info | nginx-unprivileged | Statiska appar (non-root) | Publik |
| chat · Byggboten | node:24.19.0-alpine | Multi-bot AI-chat + RAG | Publik |
| regelsok | node:24.19.0-alpine | Semantisk sök i regelkorpusen (utan LLM) | Publik |
| chelsea | node:24.19.0-alpine | Chelsea FC-dashboard — nyheter/resultat/tabell, server-side-hämtat | Publik |
| security | node:24.19.0-alpine | Säkerhets-posture + Trivy-rapport | Access |
| bet | node:24.19.0-alpine | CLV-mätlabb (paper-only, CLV över tid) | Publik |
| echo | node:24.19.0-alpine | Request-inspektör (stateless) | Publik |
| lon | nginx-unprivileged | Nettolönekalkylator brutto→netto per kommun (2025) | Publik |
| foraldra | nginx-unprivileged | Föräldrapenning- & ledighetsplanerare (FK 2026, återanvänder lons skattemodell) | Publik |
| veckomat | node:24.19.0-alpine | Recept-roulette: slumpa middagar ur Mealie → inköpslista (pratar med mealie server-side) | Publik |
| ollama | ollama/ollama | Lokal LLM + embeddings på GPU | Internal |
| ragdb | pgvector/pgvector:pg17 | Vektor-DB för RAG | Internal |
| redis | redis:8.10.1-alpine | Delad rate-limit/samtidighet (chat) | Internal |
| beszel (+agent) | henrygd/beszel | Metrics-hub · host/container/GPU | Access |
| uptime-kuma | louislam/uptime-kuma | Publik statussida | Publik |
| dozzle | amir20/dozzle | Enhetlig live-loggvy (read-only via socket-proxy) | Access |
| dokploy (+pg/redis) | dokploy/dokploy | PaaS-kontrollpanel | Tailscale |
| dokploy-traefik | traefik:v3 | Reverse proxy / ingress | via tunnel |
| cloudflared | host · systemd | Cloudflare Tunnel (utgående) | — |
| trivy | aquasec/trivy | Nattlig sårbarhetsscan (cron) | — |
Hårdvara: NVIDIA RTX A2000 6 GB. Modeller i Ollama: llama3.1:8b, qwen2.5:7b, gemma2:9b, bge-m3 (embeddings).
04Så här är det byggt
Designprinciperna bakom bygget — och de medvetna säkerhetsvalen.