Stirling-PDF fuer Vibe Factory
Worum’s geht
VF braucht PDF-Werkzeuge (Mergen, Splitten, OCR, Komprimieren, Wasserzeichen). Stirling-PDF ist die fertige Open-Source-Loesung — wir hosten sie auf unserer AWS-Infra in av-production, hinter Cloudflare Access mit Email-Allow-List @vibe-factory.de, erreichbar an https://pdf-vf.agenticventures.de.
Kein eigenes ERP, keine Custom-Logik. Wir liefern: gehosteter Service mit Auth, EU-Daten-Standort, ~22 €/Monat Selbstkosten.
Architektur
Gleicher Stack wie mcp-vf-hosted, aber ohne Scalekit-OAuth — Auth uebernimmt Cloudflare Access direkt am Edge. Trust-Boundary liegt damit nicht im Container, sondern am CF-PoP.
Browser (VF-Mitarbeiter)
| CF Access Login (Email-OTP @vibe-factory.de)
v
Cloudflare Edge (pdf-vf.agenticventures.de)
| TLS + Access-Policy
v
Cloudflare Tunnel
| QUIC outbound nach Frankfurt
v
AWS Fargate Task (av-production, eu-central-1, default-Cluster)
+-- stirling (stirlingtools/stirling-pdf:latest, Port 8080)
+-- cloudflared (Sidecar)
Container-Sizing: 0.5 vCPU / 2 GB. Stirling braucht RAM fuer LibreOffice + Tesseract bei OCR — cloudflared ist <128 MB. Wenn unter Last OOM: hoch auf 1 vCPU / 4 GB.
Stateless: Hochgeladene PDFs werden nach 30 Min automatisch geloescht (SYSTEM_MAXFILEAGE=30). Kein EFS, kein S3 — alles im Container-Layer der Task.
Repo
~/source/apps/stirling-pdf-vf/infra/— CDK-Stack (StirlingPdfVfinav-production/eu-central-1)README.md— Deploy + Operationsdocs/— Detail-Notes
CDK-Stack-File: ~/source/apps/stirling-pdf-vf/infra/lib/stirling-pdf-vf-stack.ts.
Cost
| Posten | EUR/Monat |
|---|---|
| Fargate (0.5 vCPU / 2 GB, 730h) | ~18 € |
| Secrets Manager (1 Secret) | 0,40 € |
| CloudWatch Logs (30d Retention) | ~1 € |
| Data Transfer out via CF Tunnel | ~2 € |
| Cloudflare Tunnel + Access | 0 € (Free Tier) |
| Total | ~22 € |
Aktuell Pilot, nicht an VF berechnet. Wenn VF mehr hosted Services bekommt → Hosting-Bundle-Posten in den naechsten Vertrag.
Phasen
Phase 1 — Setup (in Arbeit, 2026-05-12)
- Repo-Skeleton + CDK-Stack
- AWS Secret-Stub angelegt (
stirling-pdf-vf/cloudflared-token, ARN endetFiycl6) - CDK Stack-File mit echter Secret-ARN gepatcht
-
cdk synthclean - Cloudflare Tunnel + Public Hostname anlegen (Marvin, Browser)
- Cloudflare Access Application + Policy anlegen (Marvin, Browser)
- AWS Secret mit echtem Tunnel-Token befuellen
-
cdk deploy --profile av-prod - Smoke-Test https://pdf-vf.agenticventures.de
Phase 2 — Hardening (nach Live)
- Stirling-Image-Digest pinnen statt
:latest(gegen Supply-Chain-Drift) - Verhalten unter Last messen, ggf. Sizing anpassen
- cloudflared-Image-Digest auf eine neuere Version aktualisieren wenn Stirling stabil
Phase 3 — Wenn VF skaliert
- Mehr VF-User in CF Access Policy aufnehmen
- Ggf. Stirling-Pro-Features evaluieren (gibt Enterprise-Lizenz mit zusaetzlichen Features)
Setup-Schritte fuer Marvin (Cloudflare Dashboard)
Schritt 1: Tunnel anlegen
- https://one.dash.cloudflare.com/ → Account
hello@marvinkuehlmann.com→ Networks → Tunnels - “Create a tunnel” → Connector-Type: Cloudflared
- Tunnel name:
stirling-pdf-vf - Save tunnel
- Auf der naechsten Seite (“Install and run a connector”) steht der Tunnel-Token (
eyJ...). Token kopieren — den brauchen wir gleich. - WICHTIG: Marvin gibt mir den Token, ich pack ihn in AWS Secrets Manager. Token nicht ueber unsicheren Kanal weitergeben — am besten direkt in dieser Session.
- Auf “Next” klicken (Container-Setup uebergehen — wir laufen in Fargate).
- Public Hostname dranhaengen:
- Subdomain:
pdf-vf - Domain:
agenticventures.de - Service:
HTTPlocalhost:8080 - Save hostname.
- Subdomain:
Schritt 2: CF Access Application
- https://one.dash.cloudflare.com/ → Access → Applications → “Add an application” → Self-hosted
- Application name:
stirling-pdf-vf - Session duration: 24h (Default)
- Application domain: Subdomain
pdf-vf/ Domainagenticventures.de/ Path: leer - Identity providers: One-time PIN (Default, kein extra Setup noetig)
- Policy hinzufuegen:
- Policy name:
vf-team - Action: Allow
- Configure rules: Selector
Emails ending in→ Value@vibe-factory.de
- Policy name:
- Zweite Policy (optional aber empfohlen):
- Policy name:
admin - Action: Allow
- Selector
Emails→ Valuehello@marvinkuehlmann.com
- Policy name:
- Save application.
Schritt 3: Token in AWS einspeisen + Deploy
Sobald Marvin den Tunnel-Token gegeben hat, mache ich:
aws secretsmanager put-secret-value \
--profile av-prod \
--secret-id stirling-pdf-vf/cloudflared-token \
--secret-string '<TOKEN>'
cd ~/source/apps/stirling-pdf-vf/infra
npx cdk deploy --profile av-prod --require-approval neverStack-Deploy dauert 3-5 Min. Stirling-Container braucht weitere 60-90s zum vollen Bootup.
Stolperer-Antizipation (aus mcp-vf-hosted-Erfahrung)
- Erst-Deploy crashed wenn Secret leer: ECS resolved
secrets:-Mapping beim Container-Start. Token MUSS vorcdk deployecht sein, nicht derPLACEHOLDER_BEFORE_DEPLOYder heute drinsteht. - CF Access muss VOR DNS-CNAME stehen: CF macht den CNAME-Eintrag automatisch beim Public-Hostname-Setup im Tunnel. Heisst: in der Sekunde wo Schritt 1.8 fertig ist, ist
pdf-vf.agenticventures.deaufloesbar. Wenn Access in Schritt 2 dann noch nicht steht, ist der Service kurzzeitig ohne Auth — zwar mit leerem Backend (Stirling laeuft noch nicht), aber als Habit: Access erst fertig machen, DANN deploy. - Stirling Startup-Zeit: 60-90s wegen LibreOffice-Init. Wenn ECS Healthcheck zu frueh schlaegt:
startPeriodist auf 90s gesetzt — sollte reichen.
Open Questions
- Will VF Stirling auf eigener Domain (
pdf.vibe-factory.de)? Aktuell auf unserer Domain — schneller weil wir die Zone kontrollieren. Migration spaeter trivial: CNAME aendern + CF Access Domain umstellen. - Wer von VF soll initial Zugang haben? Aktuell Policy
@vibe-factory.deallowt alle VF-Email-Adressen. Falls explizite Whitelist gewuenscht: Policy auf Einzel-Emails umstellen.
Related
- mcp-vf-hosted — Schwesterstack (Mono-MCP fuer VF in claude.ai)
- _index — VF-eigene Open-WebUI-Chat-Instanz (Sister-Projekt, in Planung)
- mcp-hosting-aws-ecs-express — Hosting-Pattern (Vorgaenger-Doku)
- vibe-factory — Kunden-File
- Stirling-PDF Doku: https://docs.stirlingpdf.com/