
Sechzig Container auf einem Server
Eine Bare-Metal-Box führt Dutzende bis Hunderte von Hoody-Containern aus. KSM und BTRFS-Dedup machen die Marginalkosten nahezu null.
Die meisten CI-Pipelines verbrennen Geld an Cache-Traffic — Artefakte zu S3 pushen, sie beim nächsten Job wieder ziehen, für Storage zahlen, für Egress zahlen, nochmal zahlen, wenn Runner die Region wechseln. Auf Hoody ist der Cache ein Ordner auf demselben Bare Metal, das deinen Build-Container ausführt. Schick ein Tarball mit curl. Zieh es mit curl. Die Bytes verlassen die Box nie.
dieselben 47,2 GB Cache · zwei verschiedene Rechnungen
Der gesamte CI-Cache sind drei Befehle und ein Cleanup-Job. PUT, um ein Tarball zu schreiben. GET, um es zu lesen. find -atime, um aufzuräumen. Es gibt kein viertes Teil — keine IAM-Policy, kein Bucket-Lifecycle, keine Signed-URL-Zeremonie.
Nach Install streamt der Runner node_modules durch tar | zstd in ein einziges PUT auf /files/cache. Hoody schreibt den Body als einen Binary-Blob auf Disk. Kein Multipart, kein Part-Uploader, kein SDK.
Der erste Schritt im nächsten Job ist ein curl. Der Body kommt von NVMe mit Leitungsgeschwindigkeit, weil der Cache auf derselben physischen Box wie der Runner liegt — kein Egress-Hop, kein Cross-AZ-Pull, keine CloudFront-Edge.
Hoody Cron feuert einmal pro Nacht. find /files/cache -atime +30 -delete wirft alles raus, was kein Job seit einem Monat gelesen hat. Keine Retention-Policy, keine Glacier-Tier, kein Lifecycle-JSON zum Pflegen.
PUT schreibt. GET liest. find räumt auf. Die Hoody-Files-API ist der Cache-Server, die Aufräum-Engine und das Audit-Log — alles hinter derselben /files/[path]-URL.
Den Cache zu einem separaten Anbieter zu schieben, ergab Sinn, als Storage knapp war. Auf einem Bare-Metal-Container fügt es einfach einen Anbieter hinzu.
S3 berechnet drei Zähler: Storage, Egress und pro Request. Hoody Files ist im Pauschalserver-Preis enthalten — die Disk, die du eh schon mietest, ist die Disk, auf der der Cache sitzt. Die Bytes überschreiten nie eine Abrechnungsgrenze.
Reads kommen von derselben physischen Box, die den Build ausführt. Kein S3-Endpoint zum Auflösen, kein TLS-Handshake zu einer Region, kein Rate-Limit auf Prefix-Throughput. Ein 1,4-GB-Rust-Target packt in Sekunden aus.
Dein Runner und dein Cache leben auf derselben Instanz, werden auf derselben Rechnung abgerechnet, werden mit derselben SSH-Session debuggt. Wenn du den Container ausschaltest, ist der Cache das Disk-Image — wieder online in dem Moment, in dem du ihn hochfährst.
Ein typischer mittelgroßer CI-Footprint bewegt etwa 1,4 TB Cache-Traffic pro Monat. Hier ist die Rechnungsposition, die er auf AWS aufbaut; bei Hoody läuft der Cache im Pauschalserver, den du eh schon zahlst.
Wenn der Cache auf der Box lebt, die den Build ausführt, hat der Zähler, den S3 laufen ließ, nichts zu lesen. Die Position bewegt sich nicht, weil es keine Transaktion gibt, die abzurechnen wäre.
Hoody Files ist kein dünner Wrapper — es ist ein echtes persistentes Backend mit Hashing, History, Range-Reads und einem Audit-Journal. Der CI-Cache nutzt eine dünne Schicht von dem, was tatsächlich offengelegt ist.
PUT zum Schreiben, GET zum Lesen, HEAD für ETag und Content-Length, ?hash für SHA256, ?stat für Metadaten. Der Cache ist dieselbe Endpoint-Familie, die Logs, Builds und geteilte Artefakte antreibt.
Jeder Schreibvorgang läuft durch das File-Journal. Zieh den Cache von gestern per Timestamp oder per Revisionsnummer pro Pfad — ein Flake zu debuggen erfordert kein separates Snapshot-Tool mehr.
Wenn der Cache wirklich in S3, B2 oder einem Drive-Ordner leben muss, mounte ihn als Backend und behalte dieselbe /files/[path]-URL. Der Runner-Code ändert sich nie — der Cache zieht einfach um.
Zahlen spiegeln die veröffentlichte Hoody-Files-API-Oberfläche wider — `GET/PUT/HEAD/PATCH /api/v1/files/[path]`, die Query-Parameter `?hash`/`?stat`/`?at`/`?revision`/`?history` und die File-Journal-Endpoints unter `/api/v1/journal`.
Dein CI-Cache hört auf, ein separater Anbieter zu sein. Er ist ein Ordner auf der Box, die du eh schon mietest.
Die Standard-Cache-Backends, zu denen man greift, berechnen jeweils eine Vendor-Beziehung, eine Egress-Rechnung oder eine Pro-Build-Gebühr. /files berechnet dir nichts davon.
Hör auf, einen Cache von einer zweiten Cloud zu mieten. Schreib das Tarball auf die Disk, die du eh schon zahlst, und curl es zurück.