Bu sayfa Coursio projesinde ilk günlerde sık karşılaşılan hataları ve çözümlerini toplar. Sorun yaşadığınızda önce bu sayfaya bakın; detay için ilgili kılavuz veya mimari sayfaya yönlendirilirsiniz.
- Uygulama açılmıyor veya “DB connection failed”, “getDb” hatası.
- Loader/action içinde sorgu atarken timeout veya connection refused.
| Neden | Çözüm |
|---|
| DATABASE_URL eksik veya yanlış | Proje kökünde .dev.vars dosyasında DATABASE_URL=postgresql://... tanımlı olmalı. Neon Dashboard’dan connection string’i kopyalayın; ?sslmode=require ekleyin. Ortam Değişkenleri sayfasına bakın. |
| Hyperdrive yerelde | Yerelde Wrangler (npm run start) kullanıyorsanız, wrangler.toml içinde Hyperdrive için localConnectionString (veya benzeri) tanımlı olmalı; yoksa doğrudan DATABASE_URL kullanılır. Hyperdrive production’da kullanılır; yerelde genelde DATABASE_URL yeterlidir. |
| Neon IP kısıtlaması | Neon’da “Restrict access by IP” açıksa, yerel IP’nizi veya “Allow all” ekleyin. Aksi halde bağlantı reddedilir. |
| .dev.vars konumu | Dosya proje kökünde olmalı (coursio/.dev.vars). docs/ veya başka bir alt klasörde olmamalı. |
- Ödeme tamamlandığı halde enrollment oluşmuyor; webhook log’da 401/404.
- “Webhook signature verification failed” veya benzeri hata.
| Neden | Çözüm |
|---|
| Yerelde webhook gelmiyor | Yerelde Stripe’ın sunucunuza erişmesi için stripe listen kullanın. Önce npm run start (port 8787) veya npm run dev (port 5173) çalıştırın; sonra başka terminalde: stripe listen --forward-to localhost:8787/api/stripe/webhook (veya 5173). Geliştirme Akışı sayfasına bakın. |
| whsec_… güncel değil | Stripe CLI her stripe listen başlatıldığında yeni bir webhook secret verir. Bu değeri .dev.vars içinde STRIPE_WEBHOOK_SECRET=whsec_... olarak güncelleyin; uygulamayı yeniden başlatın. |
| 401 / 404 | 401 genelde imza doğrulama hatası: STRIPE_WEBHOOK_SECRET yanlış veya eksik. 404: Forward URL yanlış; /api/stripe/webhook tam path olmalı. |
| Production’da webhook | Stripe Dashboard’da Webhook endpoint’i production URL’inize eklenmeli; signing secret production için farklıdır; Cloudflare secrets’ta STRIPE_WEBHOOK_SECRET production değeri kullanılır. |
- Giriş yaptıktan sonra sayfa yenilenince veya başka sayfaya gidince session düşüyor.
- OAuth (Google) ile girişte callback’ten sonra hata veya boş sayfa.
- “Giriş yapmanız gerekiyor” mesajı alıyorsunuz ama giriş yaptığınızı düşünüyorsunuz.
| Neden | Çözüm |
|---|
| BASE_URL / BETTER_AUTH_URL tutarsız | Better Auth session ve callback URL’i bu değerlere göre üretir. Yerelde BASE_URL ve BETTER_AUTH_URL aynı olmalı: http://localhost:5173 (Vite) veya http://localhost:8787 (Wrangler). .dev.vars veya wrangler.toml içinde tanımlayın. Tarayıcıda açtığınız adres ile aynı olmalı. |
| Cookie / SameSite | Session cookie’si aynı origin’de gönderilir. localhost’ta farklı port kullanıyorsanız (örn. 5173 vs 8787) cookie birinde set edilip diğerinde gönderilmez; aynı port ile test edin. |
| OAuth callback URL | Google (veya diğer provider) Console’da callback URL, BASE_URL/api/auth/callback/google formatında ve kullandığınız port ile eşleşmeli (örn. http://localhost:5173/api/auth/callback/google). |
| BETTER_AUTH_SECRET | Eksik veya değiştiyse session şifreleme bozulur; .dev.vars içinde sabit bir değer kullanın. |
- Öğrenme sayfasında video oynatılmıyor; “Video yüklenemedi” veya boş player.
- Ders kaynağı veya sohbet görseli yüklenirken 500 veya “Bunny Storage ayarları eksik”.
| Neden | Çözüm |
|---|
| Signed URL için BUNNY_VIDEO_SECURITY_KEY | İmzalı video URL’i kullanılıyorsa Bunny panelinden Pull Zone → Security / Remote Auth Key değeri gerekir. .dev.vars içinde BUNNY_VIDEO_SECURITY_KEY=... tanımlayın. Eksikse imzalı URL üretilmez; eski (imzasız) embed URL kullanılır; bazı ayarlarda video yine de açılmayabilir. Güvenlik ve Optimizasyon sayfasına bakın. |
| Storage upload — zone/key | Ders kaynağı veya sohbet görseli yükleme için BUNNY_STORAGE_ZONE, BUNNY_STORAGE_KEY, BUNNY_PULL_ZONE_URL (veya projedeki adı) gerekir. Eksikse API 500 veya “Bunny Storage ayarları eksik” döner. Ortam Değişkenleri listesine bakın. |
| BUNNY_LIBRARY_ID / BUNNY_API_KEY | Video listeleme, yükleme ve durum sorgulama için gerekli; eğitmen panelinde video yükleme çalışmıyorsa bu değerleri kontrol edin. |
npm run build veya npm run typecheck hata veriyor.
- “Cannot find module” veya React Router / Cloudflare tipleri eksik.
| Neden | Çözüm |
|---|
| TypeScript hataları | npm run typecheck çalıştırın; hata satırlarını düzeltin. Eksik tipler veya yanlış import’lar sık nedendir. |
| React Router typegen | Route değişikliği yaptıysanız React Router typegen’in çalışması gerekir; genelde npm run build veya npm run typecheck sırasında otomatik çalışır. routes.ts ve route dosya isimleri tutarlı olmalı. |
| Cloudflare Workers tipleri | npm run cf-typegen ile Cloudflare Workers (env, bindings) tipleri üretilir. wrangler.toml ve binding’ler güncellendiyse bu komutu tekrar çalıştırın. |
| node_modules eksik / bozuk | rm -rf node_modules ve npm install ile yeniden kurun. |
- Şema değişikliği yaptınız ama veritabanında tablo/kolon yok.
- “column does not exist” veya migration uygulanmamış hatası.
| Komut | Ne zaman kullanılır |
|---|
| drizzle-kit generate | app/db/schema.ts (veya Drizzle şema dosyalarınız) değişti. Yeni migration SQL dosyası üretir; drizzle/ altına yazılır. |
| drizzle-kit migrate | Üretilmiş migration’ları veritabanına uygular. DATABASE_URL gerekir; genelde CI veya manuel çalıştırılır. |
| drizzle-kit push | Migration dosyası üretmeden şemayı doğrudan DB ile senkronize eder. Geliştirme ortamı için hızlı; production’da riskli (veri kaybı olabilir). Production’da generate + migrate tercih edin. |
- Şema değişikliği yapın →
npx drizzle-kit generate ile migration SQL üretin.
- Migration’ı inceleyin; gerekirse düzenleyin (örn. default değer, NOT NULL ekleme sırası).
- Production DB’ye migration’ı migrate ile uygulayın (CI pipeline veya manuel, güvenli bir pencerede).
push production’da kullanmayın; beklenmeyen DROP veya veri kaybına yol açabilir.
Detay için Drizzle ORM & Database ve proje kökündeki drizzle.config.ts / README’ye bakın.
Sorununuz burada yoksa Yeni Geliştirici Onboarding “Sorun yaşandığında” bölümündeki linklere ve ilgili mimari sayfalara bakın.