Skip to content

Hata Ayıklama ve Yaygın Sorunlar

İlk günlerde sık karşılaşılan hatalar ve çözümleri — DB, Stripe webhook, auth, Bunny, build/typecheck, Drizzle migration.

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 yereldeYerelde 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 konumuDosya 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 gelmiyorYerelde 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ğilStripe 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 / 404401 genelde imza doğrulama hatası: STRIPE_WEBHOOK_SECRET yanlış veya eksik. 404: Forward URL yanlış; /api/stripe/webhook tam path olmalı.
Production’da webhookStripe 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.

Auth — “Giriş yapmanız gerekiyor” / session kayboluyor

Section titled “Auth — “Giriş yapmanız gerekiyor” / session kayboluyor”
  • 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ızBetter 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 / SameSiteSession 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 URLGoogle (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_SECRETEksik veya değiştiyse session şifreleme bozulur; .dev.vars içinde sabit bir değer kullanın.

Bunny — Video yüklenmiyor / storage upload hatası

Section titled “Bunny — Video yüklenmiyor / storage upload hatası”
  • Öğ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/keyDers 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_KEYVideo 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 typegenRoute 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 tiplerinpm 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 / bozukrm -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ı.
KomutNe zaman kullanılır
drizzle-kit generateapp/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 pushMigration 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.


Sorun alanıİlk bakılacakDetay
DB bağlantısı.dev.varsDATABASE_URL; Neon IP; Hyperdrive yerelde localConnectionStringOrtam Değişkenleri, Hyperdrive
Stripe webhookstripe listen; .dev.varsSTRIPE_WEBHOOK_SECRET güncel miGeliştirme Akışı
Auth / sessionBASE_URL, BETTER_AUTH_URL tutarlı mı; OAuth callback URLOrtam Değişkenleri, API Referansı — Better Auth
Bunny video/storageBUNNY_VIDEO_SECURITY_KEY (signed URL); BUNNY_STORAGE_*, BUNNY_PULL_ZONE_URLOrtam Değişkenleri, Güvenlik ve Optimizasyon
Build / typechecknpm run typecheck, npm run cf-typegen, route isimleriGeliştirme Akışı
Drizzle migrationgeneratemigrate; production’da push kullanmayınDrizzle ORM

Sorununuz burada yoksa Yeni Geliştirici Onboarding “Sorun yaşandığında” bölümündeki linklere ve ilgili mimari sayfalara bakın.