- Datenmodell: users/{uid}, households/{id} mit memberUids, plants/locations als Subcollections
- StreamProvider liefern Live-Daten, Repositories kapseln Schreibzugriffe
- Login-Screen mit Registrierung (legt Haushalt automatisch an), Logout in Einstellungen
- Router-Redirect bei Login/Logout, firestore.rules mit Haushalts-Prinzip
- Tests auf firebase_auth_mocks + fake_cloud_firestore umgestellt
- Verifiziert: analyze/test grün, Android-Debug-Build erfolgreich
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6.9 KiB
Firebase-Einrichtung — Schritt für Schritt
Firebase ist Googles „Backend als Dienst": Es liefert uns Login (Auth), Datenbank mit Echtzeit-Sync (Firestore), Foto-Speicher (Storage), serverseitigen Code (Cloud Functions) und Push-Nachrichten (FCM) — ohne dass wir einen eigenen Server betreiben.
Stand: Schritt 1–3 erledigt, Blaze aktiv (18.07.2026). Der Code für Firestore (Pflanzen, Stellplätze, Haushalte) und Login (E-Mail+Passwort) ist eingebaut — offen ist Schritt 4 (Firestore-Datenbank anlegen + E-Mail-Login aktivieren, machst du in der Console) und danach das Rules-Deployment. Dieses Dokument wird mit jedem Baustein erweitert.
Was wofür? (Überblick)
| Baustein | Aufgabe in LeafItToMe |
|---|---|
| Authentication | Login mit E-Mail+Passwort, Google und Apple |
| Cloud Firestore | Datenbank: Haushalte, Pflanzen, Stellplätze, Bestätigungen — synchronisiert in Echtzeit auf alle Geräte des Haushalts |
| Storage | Speichert die Pflanzen- und Stellplatz-Fotos |
| Cloud Functions | Unser Server-Code: ruft PlantNet/Claude auf (damit API-Keys nie in der App stecken) und verschickt die täglichen Erinnerungen |
| Cloud Messaging (FCM) | Stellt die Push-Nachrichten auf dem Sperrbildschirm zu |
Schritt 1: Firebase-Projekt anlegen (machst du, ~10 Minuten)
- Öffne https://console.firebase.google.com und melde dich mit deinem Google-Konto an.
- „Projekt hinzufügen" → Name:
leafittome→ Google Analytics kannst du deaktivieren (brauchen wir nicht). - Nach dem Anlegen bist du in der Projekt-Übersicht. Fertig für heute — Apps registrieren wir gemeinsam per CLI (Schritt 3).
Schritt 2: Auf den Blaze-Tarif umstellen (machst du, ~5 Minuten)
Cloud Functions (unser Server-Code) setzen den Blaze-Tarif („Pay as you go") voraus. Keine Sorge vor Kosten:
- Die großzügigen Gratis-Kontingente bleiben auch im Blaze-Tarif bestehen (z. B. 2 Mio. Function-Aufrufe/Monat, 50.000 Firestore-Lesezugriffe/Tag). Bei ~5 Nutzern bleiben wir weit darunter → real ~0 €/Monat.
- In der Console: Zahnrad → Nutzung und Abrechnung → Tarif ändern → Blaze → Kreditkarte hinterlegen.
Kostenschutz einrichten (wichtig, machen wir direkt mit):
- In der Google Cloud Console (https://console.cloud.google.com, gleiches Projekt) → Abrechnung → Budgets und Benachrichtigungen.
- Budget anlegen: z. B. 5 €/Monat, E-Mail-Alarm bei 50 %, 90 % und 100 %.
- So bekommst du eine Mail, lange bevor irgendetwas teuer wird.
Schritt 3: App mit Firebase verbinden (machen wir gemeinsam per CLI)
Wenn Schritt 1–2 erledigt sind, läuft das so (führe ich mit dir aus, hier zur Doku):
# Firebase-CLI installieren und einloggen (öffnet den Browser)
npm install -g firebase-tools
firebase login
# FlutterFire-CLI installieren
dart pub global activate flutterfire_cli
# Verbindet das Flutter-Projekt mit dem Firebase-Projekt:
# registriert die iOS- und Android-App und erzeugt lib/firebase_options.dart
flutterfire configure
flutterfire configure erzeugt lib/firebase_options.dart — darin stehen die Projekt-Kennungen (keine Geheimnisse, darf ins Git). Die eigentlichen API-Keys (Anthropic, PlantNet) leben nur in der Cloud-Functions-Umgebung, niemals in der App.
Was dabei konkret passiert ist (zum Nachvollziehen):
- In der Firebase Console tauchen unter Projekteinstellungen → Meine Apps jetzt zwei Apps auf (iOS und Android, jeweils
dev.leafittome.app). android/app/google-services.jsonundios/Runner/GoogleService-Info.plistsind die plattformspezifischen Verbindungsdateien;firebase.jsonmerkt sich die Zuordnung fürs CLI.- In den Android-Gradle-Dateien wurde das
google-services-Plugin eingetragen (verarbeitet die JSON-Datei beim Build). lib/main.dartruft beim StartFirebase.initializeApp(...)auf — ab jetzt können wir nach und nach Auth, Firestore, Storage und FCM andocken.
Schritt 4: Firestore und Login aktivieren (machst du, ~5 Minuten)
Der App-Code für Datenbank und Login ist fertig — zwei Schalter musst du in der Console einmalig umlegen:
- Firestore-Datenbank anlegen: Firebase Console → Build → Firestore Database → „Datenbank erstellen" → Standort
eur3(Europa) wählen → Produktionsmodus (die strengen Startregeln werden gleich durch unsere eigenen ersetzt). Das aktiviert auch die Firestore-API des Projekts. - E-Mail/Passwort-Login aktivieren: Firebase Console → Build → Authentication → „Jetzt starten" → Tab Sign-in method → E-Mail/Passwort aktivieren. (Google- und Apple-Login rüsten wir in einem späteren Block nach — Apple braucht den Developer Account.)
Danach werden die Sicherheitsregeln aus dem Repo deployt (macht Claude per CLI):
firebase deploy --only firestore --project leaf-it-to-me-app
Das Datenmodell und die Sicherheitsregeln (zum Verständnis)
users/{uid} → E-Mail, householdId (nur der Nutzer selbst)
households/{id} → Name, memberUids [Liste der Mitglieder]
households/{id}/plants/{id} → Pflanze: Art, Intervalle, lastWatered, ...
households/{id}/locations/{id} → Stellplatz: Name
Die Regeln in firestore.rules setzen das Haushalts-Prinzip durch:
- Dein Nutzerprofil (
users/{uid}) kannst nur du selbst lesen/schreiben. - Einen Haushalt sieht und ändert nur, wer in dessen
memberUidssteht. Anlegen darf man einen Haushalt nur, wenn man sich dabei selbst als Mitglied einträgt (passiert automatisch bei der Registrierung). - Alle Unterdaten (Pflanzen, Stellplätze) erben diese Regel: voller Zugriff für Mitglieder, für niemanden sonst. V2 (Sitter einladen) wird damit nur „weitere UID in
memberUidsaufnehmen".
Wichtig zu verstehen: Die App spricht direkt mit Firestore — die Regeln laufen auf Googles Servern und sind die eigentliche Zugriffskontrolle. Selbst eine manipulierte App könnte fremde Haushalte nicht lesen.
Schritt 5 und folgende (kommen mit den nächsten Blöcken)
- Storage — Pflanzen-Fotos speichern (kommt mit dem Foto-/KI-Block).
- Cloud Functions — PlantNet-/Claude-Anbindung und die geplante Erinnerungs-Function (läuft alle 15 Minuten).
- FCM — Push-Einrichtung inkl. APNs-Schlüssel für iOS (aus dem Apple Developer Account).
- Google-/Apple-Login — zusätzlich zu E-Mail/Passwort.
Begriffe kurz erklärt
- Projekt: Der Container für alles — eine App = ein Firebase-Projekt.
- Firestore-Dokument/Collection: Firestore ist keine Tabellen-Datenbank, sondern speichert JSON-artige Dokumente in Collections (Ordnern), z. B.
households/abc123/plants/xyz789. - Security Rules: Regeln auf dem Server, die festlegen, wer welche Dokumente lesen/schreiben darf — unser Schutz, obwohl die App direkt mit der Datenbank spricht.
- Cloud Function: Eine Funktion (bei uns TypeScript), die bei Ereignissen oder nach Zeitplan auf Google-Servern läuft.