Troubleshooting
Häufige Probleme und Lösungen bei der Entwicklung mit Roestify.
Build & Development
npm run dev startet nicht
Symptom: Server startet, aber Seiten laden nicht.
Lösung:
- Prüfe ob
.env.localexistiert undDATABASE_URLkorrekt ist - Prüfe ob die DB erreichbar ist:
npx tsx scripts/migrate.ts - Lösche den Cache:
rm -rf .next && npm run dev
TypeScript-Fehler nach Paket-Update
Lösung:
rm -rf node_modules .next
npm install
npm run dev
Turbopack-Fehler
Symptom: HMR funktioniert nicht, Seiten aktualisieren sich nicht.
Lösung: Dev-Server neustarten. Turbopack hat gelegentlich Cache-Probleme.
Datenbank
Migration schlägt fehl
Symptom: npm run db:migrate gibt SQL-Fehler.
Ursache: Migration ist nicht idempotent.
Lösung: Jede Migration muss idempotent sein:
CREATE TABLE→CREATE TABLE IF NOT EXISTSCREATE TYPE→DO $$ BEGIN CREATE TYPE ... ; EXCEPTION WHEN duplicate_object THEN NULL; END $$;ALTER TABLE ... ADD COLUMN→ALTER TABLE ... ADD COLUMN IF NOT EXISTSCREATE INDEX→CREATE INDEX IF NOT EXISTS
Siehe auch: Migrationen
RLS-Verletzung (403)
Symptom: API gibt 403 zurück, obwohl der User eingeloggt ist.
Ursache: Die Query versucht auf Daten eines anderen Tenants zuzugreifen, oder der RLS-Context ist nicht gesetzt.
Debugging:
- Prüfe ob
tenantIdim tRPC-Context gesetzt ist - Prüfe die RLS-Policy auf der betroffenen Tabelle
- Teste die Query direkt mit SQL und explizitem
tenant_id
Parallele Migrationen
Symptom: Zwei Instanzen versuchen gleichzeitig Migrationen auszuführen.
Lösung: Der Migration-Runner verwendet pg_try_advisory_lock(73719283). Nur eine Instanz kann gleichzeitig migrieren.
Auth
Session abgelaufen / Redirect-Loop
Symptom: Nach Login sofort wieder auf Login-Seite.
Debugging:
- Prüfe
AUTH_SECRETin.env.local - Prüfe ob die DB erreichbar ist (Sessions werden dort gespeichert)
- Cookies löschen und neu einloggen
Google OAuth funktioniert nicht lokal
Lösung: NEXTAUTH_URL=http://localhost:3000 muss in .env.local gesetzt sein. Google OAuth Redirect-URI muss http://localhost:3000/api/auth/callback/google enthalten.
tRPC
FORBIDDEN mit cause.code = "MODULE_INACTIVE"
Symptom: tRPC-Query gibt 403 zurück mit Modul-Fehler.
Ursache: Das Feature-Modul ist für diesen Tenant nicht aktiviert.
Lösung: Prüfe tenant_modules Tabelle. Module werden beim Onboarding basierend auf dem Plan geseeded.
Hydration-Mismatch
Symptom: React-Warnung "A tree hydrated but some attributes of the server rendered HTML didn't match."
Ursache: Server und Client rendern unterschiedlichen Output (z.B. durch typeof window, new Date() ohne Timezone).
Lösung:
- Kein
typeof windowodertypeof navigatorim Render-Body - Stattdessen:
useState(fallback)+useEffect(() => setX(browserValue), []) - Datumsformatierung immer mit
timeZone: "Europe/Berlin"
Shopify / DHL
Shopify-Webhook kommt nicht an
Debugging:
- Prüfe Webhook-Konfiguration in Shopify Admin
- Prüfe ob die App öffentlich erreichbar ist (kein localhost)
- Prüfe Signatur-Validierung in den Server-Logs
DHL-Label-Erstellung schlägt fehl
Häufige Ursachen:
- Credentials nicht konfiguriert oder abgelaufen
- Adresse nicht DHL-konform (Hausnummer fehlt, PLZ ungültig)
- Rate Limit erreicht