
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.
Stündlicher Browser-Scrape, tägliches SQLite-Digest, wöchentliches File-Archiv. Drei Rhythmen nisten sauber in einer crontab — sie sind nur drei Zeilen `* * * * *`, die auf drei Skripte zeigen. Kein Scheduler-Service, keine Job-Queue, kein Worker-Pool.
eine crontab · drei Kadenzen · derselbe Container
Der Hoody-Cron-Service exponiert die Raw-crontab als REST-Ressource. PUTe die Datei einmal, und der Kernel führt sie für immer aus. Drei Zeilen, drei Skripte — jedes ein One-Liner, der schon HTTP spricht.
# Ersetze die ganze crontab in einem Call.
PUT /users/root/crontab
Content-Type: text/plain
@hourly bash /scripts/scrape.sh
0 9 * * * bash /scripts/digest.sh
0 0 * * 0 bash /scripts/archive.sh
HTTP/1.1 204 No Content# scrape.sh — jede Stunde, einen Screenshot in sqlite fächern
curl -sS https://browser.containers.hoody.com/screenshot \
--data-urlencode "url=https://store.hoody.com/p/123" | sqlite3 /data/prices.db \
"INSERT INTO rows VALUES (?, ?, ?)"
# digest.sh — um 9 Uhr, Deltas berechnen und das Digest piping
sqlite3 /data/prices.db < /scripts/digest.sql \
> /tmp/digest.txt && curl -T /tmp/digest.txt \
https://pipe.hoody.com/api/v1/pipe/digest
# archive.sh — Sonntag um Mitternacht, dumpen und ablegen
sqlite3 /data/prices.db ".dump" | curl -T - \
https://files.containers.hoody.com/archives/$(date +%Y-w%V).sqlDrei Skripte. Drei URLs, die sie schon aufrufen können. Ein PUT-Request, um den Zeitplan zu installieren. Es gibt keinen Scheduler-Service davor — der crond des Kernels liest die Datei, die du geschrieben hast, und führt sie aus.
Jede Kadenz hat einen einzigen 5-Feld-Ausdruck und eine einzige Shell-Zeile dahinter. Keiner muss von den anderen zwei wissen — sie teilen sich nur eine Disk und eine Uhr.
hoody-browser screenshotet eine Liste von Produkt-URLs. Jede Zeile geht direkt in eine SQLite-Tabelle auf dem Volume des Containers. Kein Scrape-Worker-Pool — die Cron-Zeile ist der Worker-Pool.
Um 9 Uhr liest das Digest-Skript die letzten 24 Stunden Zeilen, berechnet Preisdeltas und curlt das Digest an eine Pipe-URL. Dein Posteingang / Dashboard liest aus derselben Pipe.
Sonntag um Mitternacht macht das Archiv-Skript ein `.dump` von SQLite, benennt die Datei nach ISO-Woche und PUTet sie an hoody-files. Alte Zeilen werden weggeschnitten. Das Volume bleibt für immer klein.
Drei Kadenzen in einem Container sind kein Hack — es ist die natürliche Form von Cron. Die Plattform hat dir den Scheduler schon gegeben; du hast einfach aufgehört, dreimal dafür zu zahlen.
Der stündliche Scrape schreibt die Zeilen, die das tägliche Digest liest. Das tägliche Digest schreibt die Deltas, die das wöchentliche Archiv dumpt. Es gibt keine IPC zwischen ihnen — sie sind nur drei Prozesse auf demselben Volume.
Wenn du re-deployst, deployst du ein Image. Wenn du Logs checkst, tailst du eine Logdatei. Wenn die Disk vollläuft, läuft sie einmal voll. Der Blast Radius jeder Kadenz ist derselbe wie jeder anderen.
Lambda/EventBridge berechnet pro Invocation; ECS Scheduled Tasks berechnet das immer-an-Cluster. Bei Hoody läuft dies innerhalb des Pauschalservers, den du eh schon zahlst. Drei Kadenzen kosten nicht mehr als eine.
Die crontab ist eine Datei. Die Datei hat eine URL. Alles, was du mit der Datei machen würdest, kannst du über HTTP machen.
Erstelle einen verwalteten Eintrag mit einer UUID und einem optionalen Kommentar. Die API injiziert die Zeile für dich in die crontab und gibt dir einen Handle, um sie später zu aktivieren, deaktivieren oder löschen.
Pause eine Kadenz während eines Vorfalls, ohne ihre Definition zu verlieren. Schalte sie wieder an, wenn der Vorfall geschlossen ist. Die Zeile bleibt in der Datei, kommentiert als managed-disabled.
Hole die Raw-crontab jederzeit zurück, inklusive aller verwalteten Einträge. Diff sie gegen dein Repo. Pipe sie in Versionskontrolle. Cron ist eine Datei, und jetzt ist die Datei eine URL.
Endpoints aus der Hoody Cron API: verwaltete-Eintrag-CRUD plus volle Raw-crontab-Lese-/Schreibe-Operationen pro User. Standard-5-Feld-Ausdrücke und Makros (@hourly, @daily, @weekly).
Drei Zahlen aus dem tatsächlichen Mechanismus. Zahlen kommen aus den Hoody-Cron-API-Garantien und dem Pauschalserver-Modell — keine erfundenen Benchmarks.
Alle drei Kadenzen laufen innerhalb des gleichen Pauschalservers. Einstiegsserver starten bei $29/Monat; extra Cron-Zeilen addieren keine zusätzliche Gebühr.
Eine @hourly, eine täglich-um-9, eine wöchentlich-am-Sonntag. Drei Zeilen in /users/root/crontab. Der ganze Orchestrator passt in einen PUT-Request.
Kein Lambda, kein EventBridge, kein Sidekiq, kein Airflow-Scheduler, keine ECS-Scheduled-Task-Definition. Die HTTP-API für Cron IST der Scheduler.
Laut Hoody Cron API: verwaltete Einträge per JSON-CRUD, Raw-crontab-Lesen/Schreiben, Auto-Expiration via expires_at, und Per-User-crontab-Isolation. Makros @hourly / @daily / @weekly werden neben 5-Feld-Ausdrücken akzeptiert.
Drei Kadenzen, drei Cron-Zeilen, ein Container auf einem Pauschalserver mit $29/Monat Einstiegspreis.
Drei Lambdas, drei GitHub Actions, drei ECS-Scheduled-Tasks — die Standardstacks, zu denen du für drei Kadenzen greifst. Jeder berechnet dir pro Kadenz oder Aufruf; Hoody rechnet den Server ab.
Hör auf, einen Scheduler zu mieten. Schreib den Zeitplan in eine Datei. Der Container fährt schon Cron — drei Zeilen später hast du die ganze Pipeline ausgeliefert.