Ortam Değişkenleri
Tüm Secret ve Public anahtarlar — STRIPE, DATABASE, BUNNY ve diğerleri, açıklamalı liste.
Bu sayfada Achidemy projesinde kullanılan tüm ortam değişkenleri, Secret (gizli) ve Public (açık) olarak açıklamalı listelenir. Yerel geliştirme için .dev.vars, production için Cloudflare secrets veya wrangler.toml içindeki [vars] kullanılır.
Production (Achidemy): Canlı uygulama https://achidemy.net apex adresinde çalışır; B2B kiracı panelleri https://<subdomain>.achidemy.net (wildcard route) üzerinden sunulur. BASE_URL ve BETTER_AUTH_URL production için https://achidemy.net olmalıdır. Veritabanı Neon PostgreSQL (pooler; örn. us-east-1); Worker’da bağlantı Hyperdrive + DATABASE_URL secret (veya yerel localConnectionString / .dev.vars) ile yapılır.
Veritabanı (DATABASE)
Section titled “Veritabanı (DATABASE)”| Değişken | Tür | Açıklama |
|---|---|---|
DATABASE_URL | Secret | Neon PostgreSQL bağlantı dizesi (?sslmode=require). Yerelde .dev.vars; production’da wrangler secret put DATABASE_URL (Hyperdrive’ın döndürdüğü connection string veya doğrudan Neon pooler URL’si — mevcut deploy mimarisine göre). Yerel wrangler dev için ayrıca wrangler.toml → [[hyperdrive]] → localConnectionString aynı Neon veritabanına işaret etmelidir. |
Stripe
Section titled “Stripe”| Değişken | Tür | Açıklama |
|---|---|---|
STRIPE_SECRET_KEY | Secret | Stripe API gizli anahtarı. Test: sk_test_..., Canlı: sk_live_.... Ödemeler, abonelik ve Connect işlemleri için gerekli. |
STRIPE_WEBHOOK_SECRET | Secret | Stripe webhook imza doğrulama anahtarı (whsec_...). Yerelde stripe listen --forward-to localhost:8787/api/stripe/webhook çalıştırıldığında CLI’dan alınır. |
STRIPE_PUBLIC_KEY | Public | Stripe publishable anahtarı (pk_test_... / pk_live_...). İstemci tarafında Stripe.js ile kullanılır. wrangler.toml içinde vars olarak tanımlanabilir. |
STRIPE_PRICE_ID_MONTHLY | Public | Aylık abonelik fiyat ID’si (price_...). |
STRIPE_PRICE_ID_YEARLY | Public | Yıllık abonelik fiyat ID’si (price_...). |
STRIPE_B2B_PRICE_ID | Public | B2B (company) per-seat abonelik Price ID’si (price_...). company.billing checkout’unda mode: subscription ile kullanılır; quantity = organizations.seatLimit. |
Bunny (Video & Storage)
Section titled “Bunny (Video & Storage)”| Değişken | Tür | Açıklama |
|---|---|---|
BUNNY_LIBRARY_ID | Public | Bunny Video kütüphane ID’si. Video stream ve yönetim için. |
BUNNY_API_KEY | Secret | Bunny API anahtarı. Video/storage API istekleri için. Altyazı (caption) yükleme/silme ve eski video upload akışları için kullanılabilir. |
BUNNY_STREAM_API_KEY | Secret (opsiyonel, tavsiye edilen) | Bunny Stream API için özel anahtar. Direct upload (TUS) video yükleme sistemi ve altyazı (caption) işlemleri için bu anahtar tercih edilir; kodda BUNNY_STREAM_API_KEY yoksa otomatik olarak BUNNY_API_KEY fallback olarak kullanılır. |
BUNNY_STORAGE_ZONE | Public | Bunny Storage zone adı. Dosya yükleme (ders kaynakları, sohbet resimleri vb.) için. |
BUNNY_STORAGE_KEY | Secret | Bunny Storage zone API anahtarı. |
BUNNY_VIDEO_SECURITY_KEY | Secret | Bunny stream güvenlik anahtarı (signed URL üretimi için). |
Better Auth & E-posta
Section titled “Better Auth & E-posta”| Değişken | Tür | Açıklama |
|---|---|---|
BETTER_AUTH_SECRET | Secret | Better Auth oturum/şifreleme için kullanılan rastgele gizli anahtar. |
BETTER_AUTH_URL | Public | Uygulama kök URL’i (örn. http://localhost:8787, https://achidemy.net). OAuth callback ve oturum için. |
RESEND_API_KEY | Secret | Resend e-posta API anahtarı (re_...). E-posta doğrulama ve şifre sıfırlama için (isteğe bağlı). |
EMAIL_FROM | Public | Gönderen e-posta adresi (örn. Achidemy <[email protected]>). |
Genel (Base URL vb.)
Section titled “Genel (Base URL vb.)”| Değişken | Tür | Açıklama |
|---|---|---|
BASE_URL | Public | Uygulama kök URL’i. E-posta linkleri, OAuth callback ve mutlak URL üretimi için. Yerelde http://localhost:8787 veya http://localhost:5173; production’da https://achidemy.net. |
Sentry (Hata İzleme)
Section titled “Sentry (Hata İzleme)”| Değişken | Tür | Açıklama |
|---|---|---|
SENTRY_DSN | Public | Sentry proje DSN’i. Worker (backend) tarafında hata izleme için. Yerelde .dev.vars; production’da wrangler.toml [vars] veya wrangler secret put SENTRY_DSN. |
VITE_SENTRY_DSN | Public | Aynı DSN; client (tarayıcı) bundle’da build zamanında kullanılır. Yerelde .env veya .dev.vars; production build için CI ortamında veya .env.production ile tanımlanmalı. |
Not: DSN boşsa Sentry event göndermez; uygulama normal çalışır. Sentry çalışma yapısı için Monitoring ve Observability sayfasına bakın.
Algolia (Arama)
Section titled “Algolia (Arama)”| Değişken | Tür | Açıklama |
|---|---|---|
VITE_ALGOLIA_APP_ID | Public | Algolia uygulama ID’si. Navbar anlık arama (client) ve backend senkronizasyonu için. wrangler.toml [vars] içinde tanımlanır. |
VITE_ALGOLIA_SEARCH_KEY | Public | Algolia salt-okunur arama anahtarı. Client (tarayıcı) tarafında algoliasearch/lite ile kullanılır. wrangler.toml [vars] içinde tanımlanır. |
ALGOLIA_ADMIN_KEY | Secret | Algolia yönetici (write) anahtarı. Backend’den kursları Algolia’ya senkronize etmek için (syncCourseToAlgolia). Yerelde .dev.vars; production’da wrangler secret put ALGOLIA_ADMIN_KEY. |
Not: Algolia anahtarları Algolia Dashboard → API Keys sayfasından alınır. VITE_ prefix’li değişkenler Vite tarafından client bundle’a dahil edilir; ALGOLIA_ADMIN_KEY ise yalnızca sunucu tarafında erişilebilir.
Cloudflare Turnstile (giriş / kayıt)
Section titled “Cloudflare Turnstile (giriş / kayıt)”| Değişken | Tür | Açıklama |
|---|---|---|
VITE_TURNSTILE_SITE_KEY | Public | Turnstile widget site key. npm run build sırasında Vite ile client bundle’a gömülür; yerelde .env, production öncesi build ortamında aynı değer olmalıdır. app/lib/turnstile.ts içinde import.meta.env.VITE_TURNSTILE_SITE_KEY okunur. |
TURNSTILE_SECRET_KEY | Secret | Secret key — challenges.cloudflare.com/turnstile/v0/siteverify ile token doğrulama. Production’da wrangler secret put veya güvenli şekilde Dashboard’dan; kod env.TURNSTILE_SECRET_KEY kullanır. |
Not: Cloudflare Turnstile panelinde widget için hostname listesine achidemy.net, gerekiyorsa www.achidemy.net ve *.achidemy.net ekleyin; aksi halde istemci tarafında 110200 benzeri hatalar oluşabilir.
Yerel Geliştirme: .dev.vars
Section titled “Yerel Geliştirme: .dev.vars”Bu dosya git’e eklenmez (.gitignore). Proje kökünde oluşturun. Yukarıdaki Secret değişkenleri burada tanımlayın; Public değişkenler wrangler.toml içinde de tutulabilir.
# VeritabanıDATABASE_URL=postgresql://user:pass@host/neondb?sslmode=require
# Stripe (yerel webhook test için)STRIPE_SECRET_KEY=sk_test_...STRIPE_WEBHOOK_SECRET=whsec_...
# Better Auth / E-posta (isteğe bağlı)RESEND_API_KEY=re_...BETTER_AUTH_SECRET=rastgele-gizli-anahtar
# Bunny (gerekirse)BUNNY_API_KEY=...BUNNY_STORAGE_KEY=...BUNNY_VIDEO_SECURITY_KEY=...
# Sentry (hata izleme)SENTRY_DSN=https://[email protected]/...VITE_SENTRY_DSN=https://[email protected]/...
# Algolia (arama)VITE_ALGOLIA_APP_ID=YOUR_APP_IDVITE_ALGOLIA_SEARCH_KEY=YOUR_SEARCH_KEYALGOLIA_ADMIN_KEY=YOUR_ADMIN_KEY
# Turnstile (login/register — istemci + sunucu aynı widget çifti)VITE_TURNSTILE_SITE_KEY=0x...TURNSTILE_SECRET_KEY=0x...Not: wrangler dev çalışırken Hyperdrive için wrangler.toml içindeki localConnectionString kullanılır; DATABASE_URL ise .dev.vars veya ortamdan okunur. Client tarafı için VITE_SENTRY_DSN ve VITE_TURNSTILE_SITE_KEY build sırasında okunur; yerelde .env veya .dev.vars ile aynı değeri verebilirsiniz.
Production: Wrangler ve Cloudflare
Section titled “Production: Wrangler ve Cloudflare”- Vars (Public):
BASE_URL,BETTER_AUTH_URL,VITE_TURNSTILE_SITE_KEY,STRIPE_PUBLIC_KEY,STRIPE_PRICE_ID_*,BUNNY_LIBRARY_ID,BUNNY_STORAGE_ZONE,EMAIL_FROM,SENTRY_DSN,VITE_SENTRY_DSN,VITE_ALGOLIA_APP_ID,VITE_ALGOLIA_SEARCH_KEYvb.wrangler.tomliçinde[vars]veya Cloudflare Dashboard’dan. - Secrets (Gizli):
wrangler secret put DATABASE_URL,wrangler secret put STRIPE_SECRET_KEY,wrangler secret put STRIPE_WEBHOOK_SECRET,wrangler secret put ALGOLIA_ADMIN_KEY,wrangler secret put TURNSTILE_SECRET_KEY(secret’ı yalnızca[vars]yerine CLI ile tutmak istiyorsanız) vb. Production’da gizli bilgileri asla kalıcı olarak repoya yazmayın.