felixisfelix.labs
← terug naar felixisfelix.com
Platform / Infra · Doelarchitectuur

Secrets & Auth,
voor alle labs op één plek.

Waar we naartoe werken: één versleutelde kluis op orin3, en een MCP die Claude laat beheren, uitrollen en auditen — zodat tokens en wachtwoorden niet langer plain in unit-files of publieke pagina's staan. Elk lab blijft standalone draaien.

Status: fase 1 (secrets) gebouwd & getest — uitrol op live services in beraad
01 De plaat

Van bron naar service. De kluis is de enige bron van waarheid; alles stroomt daar naar beneden uit. De MCP en CLI zijn twee gezichten op dezelfde labsctl-kern.

bron · enige bron van waarheid

🔒 age-kluis

Versleuteld blob + keyfile, chmod 600, in ~/.config/labs-secrets/buiten elke git-repo. Plaintext bestaat alleen kort in geheugen.

kern · pure logica, los testbaar

labsctl-core

Stdlib-only. Opent de kluis, beheert secrets, rendert naar de juiste bestanden, en scant op lekken.

vaultrenderauditexample
bediening · twee gezichten op dezelfde kern

MCP-server

Claude krijgt 5 tools: list · get · set · render · audit. Beheren zonder secrets in de chat te plakken.

labsctl CLI

Zelfde acties met de hand: labsctl render derwisch-ritueel. Volledig zonder Claude bruikbaar.

uitrol · naar waar de service het al verwacht

EnvironmentFile

chmod 600, root-owned. De systemd-unit leest het via EnvironmentFile=. Geen plain keys meer in de unit.

🔑 .auth

Gebruiker + sha256(wachtwoord) voor de Basic-Auth-pagina's. Deterministisch, overleeft herstarts.

services

derwisch-ritueel, sysmonitor, … blijven env/.auth lezen zoals nu — alleen de waarden komen uit de kluis.

Audit — bewaakt de randen

Scant publieke pagina's en unit-files op secret-waarden en bijna-verlopen tokens. Meldt bv. het publiek gelekte token in de transcribe-pagina — zonder de waarde te tonen.

Portabiliteit — draaibaar bij iedereen

De kluis is gemak, geen vereiste. sync-example schrijft een .env.example (alleen namen) in elke repo. git clone + je eigen .env = draaien, ook zonder orin3.

02 Wat verandert er

De concrete impact op de huidige situatie — precies de rommel die deze week bovenkwam.

Nu
  • Live API-keys plain in systemd-unitsAnthropic- en OpenAI-key als leesbare Environment=-regels.
  • GitHub-token publiek in pagina-JSWordt door GitHub telkens ingetrokken → wekelijks "auth kapot".
  • Wachtwoorden als defaults / verspreidVallen terug op een default na een herstart → login geweigerd.
  • Geen overzicht, geen waarschuwingNiemand ziet welk secret waar staat of bijna verloopt.
Doel
  • Alle secrets in één versleutelde kluisUitgerold naar chmod 600-bestanden; units bevatten geen waarden.
  • De lek-cyclus doorbrokenAudit signaleert publieke lekken; upload-secret los van je GitHub-credential.
  • Deterministische, persistente loginZelfde wachtwoord na elke herstart/reboot — geen wekelijkse verrassing.
  • Inventaris + verval-/lek-auditEén commando toont wat waar leeft en wat aandacht vraagt.
03 Waar we naartoe werken

Klein beginnen, dan uitbouwen op dezelfde kern. Fase 1 is gebouwd; 2 en 3 hangen erboven.

nu
FASE 1

Secrets & Auth

Kluis, render naar EnvironmentFile/.auth, audit, CLI + MCP. De basis waarop de rest leunt.

later
FASE 2

Uniforme ops

Zelfde MCP-kern breidt uit naar git / Vercel / Tailscale / cloudflared: status, deploy, herstart per lab.

later
FASE 3

Health-overzicht

Eén read-only beeld: welke services draaien, welke tunnels leven, welke tokens bijna verlopen.

04 Zo werkt het straks in de praktijk

Een token roteren of een service opnieuw uitrollen is drie stappen — met de hand of via Claude.

Zetten

secret_set plaatst een nieuwe waarde in de kluis (versleuteld).

Uitrollen

secret_render schrijft de EnvironmentFile/.auth en herstart de service — na bevestiging.

Auditen

secret_audit bevestigt dat de oude waarde nergens meer plain of publiek staat.