Berichtgen ist eine Webanwendung, mit der Auszubildende ihre Ausbildungsnachweise automatisch aus Dateien und Vorlagen erstellen können. Die App verarbeitet Uploads, verteilt Inhalte auf Berichtszeiträume und generiert daraus mit KI fertige Berichte.
- Alle Migrationen anwenden.
- Supabase
site_urlauf die exakte öffentliche Origin der App pro Umgebung setzen.- Lokal:
http://localhost:5173 - Produktion:
https://www.berichtgen.de
- Lokal:
- Alle Auth-Callback- und Redirect-URLs hinterlegen.
- Supabase
SSL Enforcementaktivieren. - Diese Variablen in Vercel setzen:
PUBLIC_SUPABASE_URLPUBLIC_SUPABASE_PUBLISHABLE_KEYSUPABASE_SECRETDATABASE_URL- direkte Postgres-Connection-String von Supabase für App/ServerSUPABASE_CA- CA-Zertifikat für die erzwungene SSL-Datenbankverbindung
- E-Mail- / OTP-Auth in Supabase aktivieren.
- SMTP-Server konfigurieren.
- Prüfen, dass Auth-E-Mails korrekt versendet werden.
- Google-Auth in Supabase aktivieren.
- Richtige Google Client-ID und Secret hinterlegen.
- Prüfen, dass die in Supabase konfigurierte Callback-URL mit der Google Cloud Console übereinstimmt.
- Diese Variablen dort setzen, wo die lokale Supabase-Konfiguration sie einliest:
AUTH_GOOGLE_IDAUTH_GOOGLE_SECRET
- Vertex-AI-API aktivieren.
- Cloud-Storage-API aktivieren.
- Bucket für Wizard-Datei-Uploads anlegen.
- In Vercel setzen:
GCS_BUCKET_NAME- Bucket für temporäre Wizard-Dateien vor der KI-Verarbeitung
- Separaten GCS-Bucket für tägliche Datenbank-Backups anlegen.
- Als GitHub-Secret hinterlegen:
GCS_BACKUP_BUCKET_NAME
- Service Account für Vertex AI und GCS anlegen.
- Berechtigungen vergeben für:
- Vertex AI
- Wizard-Upload-Bucket
- Backup-Bucket, falls derselbe Account dafür genutzt wird
- JSON-Key exportieren.
- In Vercel setzen:
GCS_SERVICE_ACCOUNT_KEY- JSON-Credentials für GCS-Signed-Uploads und Vertex AI
- Alle autorisierten Redirect-URIs eintragen.
- Falls nötig, alle autorisierten JavaScript-Origins eintragen.
- OAuth-Branding konfigurieren.
- Datenschutz- und Nutzungsbedingungen-URLs in der Google Cloud Console korrekt setzen.
- Prüfen, dass Produktion
SUPABASE_CAgesetzt hat; die App braucht es bei aktiviertem Supabase-SSL Enforcement.
- Firewall- / Bot-Schutz konfigurieren.
- Rate Limits hinzufügen für:
- Auth-Endpunkte
- teure Remote-Funktionen / KI-Routen
- Stripe-Webhook, falls nötig
- Stripe-API-Keys für die Umgebung anlegen.
- Stripe-Webhook-Endpunkt anlegen.
- Diese Stripe-Webhook-Events konfigurieren:
charge.refundedpayment_intent.canceledpayment_intent.succeeded
- Diese Variablen in Vercel setzen:
PUBLIC_STRIPE_KEYSTRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRET
- In Vercel setzen:
SENTRY_AUTH_TOKEN- wird vom Vite/Sentry-Build-Setup verwendet
- Diese Secrets anlegen:
DATABASE_URL- Supabase Session-Mode-Pooler-Connection-String für den Backup-WorkflowGCS_BACKUP_BUCKET_NAME- Bucket für komprimierte DB-DumpsGCS_BACKUP_ACCOUNT_KEY- Google-Service-Account-JSON für den Backup-Workflow
- Sicherstellen, dass
.github/workflows/daily-db-backup.ymlauf dem Default-Branch liegt. - Den Workflow einmal per
workflow_dispatchausführen. - Prüfen, dass der Dump im GCS-Backup-Bucket erscheint.
- Prüfen, dass
pg_dumpin Version 17 verwendet wird.
AUTH_GOOGLE_IDAUTH_GOOGLE_SECRETGCS_BUCKET_NAME- temporärer Wizard-Upload-BucketGCS_SERVICE_ACCOUNT_KEY- Google-Service-Account-JSON für Upload-Signing und Vertex AIPUBLIC_SUPABASE_URLPUBLIC_SUPABASE_PUBLISHABLE_KEYSUPABASE_SECRETDATABASE_URL- direkte Supabase-Postgres-Connection-StringSUPABASE_CA- DB-CA-Zertifikat für die SSL-erzwungene Supabase-VerbindungSENTRY_AUTH_TOKEN- Sentry-Auth für den BuildPUBLIC_STRIPE_KEYSTRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETSMTP_HOSTSMTP_USERSMTP_PASSSMTP_SENDER_NAMESMTP_ADMIN_EMAIL
Eine PDF-Datei mit einer textvollen Seite ist ungefähr 30 KB groß. Mit Googles Modellen entspricht das ungefähr 560 LLM-Input-Tokens. Eine TXT-Datei mit derselben Textmenge ist ungefähr 5 KB groß und liegt bei rund 1000 LLM-Input-Tokens; die tatsächliche Zahl wird dynamisch berechnet.
gemini-3.1-flash-lite-preview kostet 0,25 USD pro 1 Mio. Input-Tokens und 1,50 USD pro 1 Mio. Output-Tokens.
1 Mio. Input-Tokens entsprechen damit ungefähr 1786 PDF-Input-Dateien oder ungefähr 1000 TXT-Dateien.
| Speicher | Datenverarbeitungsoperationen |
|---|---|
0,000031507 USD / 1 Gibibyte-Stunde |
Klasse A: 0,005 USD / 1.000 OpsKlasse B: 0,0004 USD / 1.000 Ops |
Ein Upload plus Delete (Delete ist kostenlos) kostet:
0,005 USD / 1.000 = 0,000005 USD
Für einen recht großen Wikipedia-Artikel als PDF (2,5 MB) kostet die Speicherung für 24 h:
0,000031507 USD/h * 0,0025 GB * 24 h = 0,00000189042 USD/Tag
Break-even, also ab wann Speichern günstiger ist als erneutes Hochladen:
0,00000189042 USD / 0,000005 USD ≈ 0,378 Uploads
| Speicher | Datenverarbeitungsoperationen |
|---|---|
0,000150685 USD / 1 Gibibyte-Stunde |
Klasse A: 0,00113 USD / 1.000 OpsKlasse B: 0,0002 USD / 1.000 Ops |
Ein Upload plus Delete (Delete ist kostenlos) kostet:
0,00113 USD / 1.000 = 0,00000113 USD
Derselbe Artikel (2,5 MB) kostet:
0,000150685 USD/h * 0,0025 GB * 24 h = 0,0000090411 USD/Tag
Break-even, also ab wann Speichern günstiger ist als erneutes Hochladen:
0,0000090411 USD / 0,00000113 USD ≈ 8 Uploads
| Metrik | Kostenlos enthalten | Startpreis |
|---|---|---|
| Aktive CPU | 4 Stunden / Monat |
0,128 USD pro Stunde |
| Bereitgestellter Speicher | 360 GB-Stunden / Monat |
0,0106 USD pro GB-Stunde |
| Invocations | 1 Mio. / Monat |
0,60 USD pro 1 Mio. |
https://www.berichtgen.de/datenschutz
