Cyber and Space · Tech-con

En box.
Tjugo världar.
Ett gäng Claudes.

Så driver vi ett tjugotal tjänster på en enda server — där git är sanningen, maskinen aldrig bygger något själv, och utvecklingen sker av parallella Claude-sessioner i tmux.

1 server~20 containrar1 reverse proxy0 handredigerade filer

↓ scrolla eller använd piltangenterna

01 · Översikt

Box B i ett diagram

All trafik går genom Cloudflare och in i en Caddy-proxy — den enda containern som öppnar portar mot världen. Bakom den bor varje tjänst i sin egen container på ett internt nätverk.

Internet besökare Cloudflare DNS · TLS · WAF Access Box B en VM · Docker · ett internt nätverk Caddy reverse proxy enda öppna porten Appar curemydisease · brfkartan · … Statiska sajter cyberandspace.se · … Interna verktyg analys · status · env Skydd bot-detektering framför Databaser Postgres · MySQL Batch-jobb körs vid behov code-central Claude + tmux ingen publik port

En ingång

Caddy är den enda som lyssnar utåt. Varje sajt är ett block i en enda Caddyfile.

En container per tjänst

Ingen tjänst delar process med en annan. Krashar en, står resten kvar.

Ingen källkod på boxen

Servern drar färdiga images. Den bygger aldrig och har aldrig sett en rad app-kod.

02 · Principen

Git är sanningen.
Servern är en utdata.

Inget skrivs för hand på servern. Allt — appar, proxy, konfiguration — når boxen genom ett repo och en pipeline. Om boxen och repot är oense är det boxen som har fel.

git push app-repot GitHub Actions bygger image Registry immutabel tagg Deploy SSH, låst användare Live compose up Boxen drar en färdig image och startar om containern — det är allt den gör.
boxb-infra

Infrarepot

Äger proxyn — varje sajts Caddy-block — plus de tjänster som saknar eget repo. Ett drift-skript jämför repo mot box före varje ändring.

alfa-world m.fl.

App-repona

Varje app äger sin egen compose-fil och sin egen CI. Monorepot alfa-world rymmer ett dussin projekt med en workflow var.

lärdom

Varför så strikt?

2026 lades fyra sajter till direkt på servern. Filen tappade alla kommentarer, och nästa synk hade tagit fyra sajter offline. Nu vägrar synken.

03 · Kontrollrummet

code-central

En container på boxen där utvecklingen sker. Den har Claude Code, tmux, alla repon — och full makt över boxen. Därför har den ingen publik port alls: bara operatören når den.

tmux · session "main" xo dispatchern tar emot uppdrag väljer en ledig slot startar en Claude där rapporterar en rad gör aldrig jobbet själv långlivade projektfönster scalefigures curemydisease redovisning… slots — finns bara medan de jobbar alfa-world-1 🏢 brfkartan: nettoskuld worktree → PR cyberandspace-1 🛰️ den här sidan worktree → PR boxb-infra-1 🔀 nytt Caddy-block drift-check → synk

Slot = fönster

Varje uppdrag får ett tmux-fönster <repo>-<n> med en egen Claude. Inget register — finns fönstret är slotten upptagen.

En emoji per uppgift

Sessionerna syns i Claude-appen; operatören hittar rätt rad på formen innan hen läst ett ord.

Följ från telefonen

Sessionerna körs med fjärrkontroll, så samma arbete går att följa och styra från vilken enhet som helst.

04 · En slots livscykel

Från en mening till live

Ett uppdrag på en rad blir en färdig deploy — utan att någon rör servern.

01

Uppdrag

Operatören säger vad. xo skriver ett kickoff-brev och lägger det i en ny slot.

02

Worktree

Slotten jobbar i en egen git-worktree — aldrig i huvudträdet, så parallella sessioner krockar inte.

03

Pull request

Ändringen landar som en PR. Numret rapporteras direkt.

04

Code review

Diffen granskas innan merge — av en Claude, med fokus på riktiga buggar.

05

Merge → Actions

Merge till main triggar bygget och deployen. Det är den enda vägen ut.

06

Live & städat

Sajten verifieras, fönstret stängs och minnet (≈350 MB per Claude) frigörs.

05 · Env-sidan

Hemligheter man kan skriva
men aldrig läsa

Nycklar och lösenord sätts i ett webbverktyg bakom Cloudflare Access och passkey. Värdet krypteras i webbläsaren och kan därefter inte läsas av någon — inte av sidan, inte av servern.

Klistra in i webbläsaren Förseglas sealed box, lokalt Passkey-tryck för just detta värde GitHub secret skriv, ej läs Deploy Actions skriver env → omstart klartext finns aldrig någonstans utanför operatörens webbläsare och den körande containern

Lager på lager

Cloudflare Access med en enda tillåten identitet, passkey-inloggning, och ett nytt passkey-tryck för varje sparning och deploy.

Isolerad

Env-sidan kör distroless, utan root och utan någon väg in i boxens kontrollplan. Ett intrång i appen blir inte ett intrång i boxen.

Värsta fallet

Även fullt komprometterad kan servern bara skriva över hemligheter och starta deployer — aldrig läsa en enda.

06 · Husregler

Tre regler — alla skrivna
för att de bröts

Rör aldrig servern för hand

Ändringar går repo → push → synk/CI. En handskriven fil är en lögn i repot och försvinner tyst vid nästa synk.

Riv inte golvet du står på

Att återskapa kontrollrummet avslutar varje Claude-session i det — inklusive den som gör det. Det sker bara mellan sessioner, på operatörens order.

Användardata är off limits

Agenterna får läsa schema och kod, aldrig innehållet i användartabeller. Behövs det, stannar sessionen och frågar.

Sammanfattning

Liten server.
Stor disciplin.

Git är sanningen

Boxen är en utdata. Drift upptäcks och vägras.

Bygg i CI, kör på boxen

Immutabla images, en deployväg.

Parallella Claudes

En slot per uppdrag, en worktree per slot, en PR per ändring.

Hemligheter enkelriktat

Skriv i webbläsaren, läs bara i containern.