0'dan mobil uygulama geliştiriyorum.

Sıfırdan bir rüya günlüğü uygulaması yapıyorum ve mağazaya çıkana kadar her adımı burada tutuyorum: kararlar, yapılanlar, hatalar. Her bölüm tıklayınca açılır.

Sıfırdan bir rüya günlüğü uygulaması yapıyorum. Tüm süreç burada.

Genel ilerlemehesaplanıyor
0 / 0 adım tamamlandı

Uygulama ne yapıyor?

Yaz, yorumla, biriktir, benzer rüya görenlerle eşleş.

Rüya günlüğü

Sabah rüyanı yazarsın ya da sesli anlatırsın. Duygu, netlik ve temalarla kaydolur, zamanla kalıplar görünür.

Yapay zekâ yorumu

Esere dayalı üç bakış: klasik tabir, tasavvufî bakış, psikoloji bakışı. Yapılandırılmış, kaynağı belli, sınırı belli yorum.

Benzer rüya eşleşmesi

Aynı türden rüya görenlerle anonim eşleşme, karşılıklı onayla tanışma, takma adla başlayan sohbet.

Adımlar

Tıkla, aç: neden ve yapılanlar.

Neden

Rüyalarını kaybetmeden kaydetmek, anlamlandırmak ve aynı şeyi görenlerle konuşmak isteyenler için bir uygulama. Üç çekirdek var: günlük, yorum, eşleşme. Sabah rüyanı yazarsın ya da anlatırsın; yapay zekâ esere dayalı üç bakışla yorumlar; zamanla kendi kalıplarını görürsün; istersen benzer rüya gören biriyle anonim başlayan bir sohbete geçersin. Ücretsiz ve premium sınırlarını şimdi belirlemiyoruz; gerçek kullanımdan öğrenip sonra çizeceğiz.

Uygulama ne içerecek

  1. Rüya günlüğü: metinle ya da sesle kaydet (ses → metin), tarih, duygu, etiketler; arama ve arşiv
  2. Yapay zekâ yorumu: üç bakış (klasik tabir · tasavvufî bakış · psikoloji bakışı); semboller, duygular, temalar, öneriler ve kaynak notu
  3. Sembol kartları: rüyandaki her sembol için kaynaklı, kısa açıklama
  4. Kalıplar: zamanla tekrar eden semboller ve duygular, haftalık/aylık özet, grafikler
  5. Görselleştirme: rüyanın yapay zekâ ile üretilmiş görseli (isteğe bağlı), paylaşılabilir rüya kartı
  6. Hatırlatıcı: sabah 'rüyanı yaz' bildirimi, uyanınca tek dokunuşla kayıt
  7. Gizlilik: rüyalar sana ait; hesabı ve tüm veriyi uygulama içinden silme
  8. Eşleşme ve sohbet: benzer rüya görenlerle tanışma (aşağıda)
  9. Sonraki sürümler: lucid rüya araçları, uyku verisiyle bağlantı, İngilizce

İnsanlar nasıl eşleşecek

  1. Her rüya, kimlik bilgisi olmadan bir 'rüya kartına' dönüşür: semboller, temalar, duygu
  2. Sistem benzer kartları bulur; aynı kelimeler şart değil, anlam benzerliğine bakar
  3. Sana anonim bir önizleme gelir: 'Senin rüyana benzer bir rüya var' ve kartın özeti; kişi bilgisi yok
  4. İlgilenirsen istek gönderirsin; karşı taraf da onaylarsa sohbet açılır (karşılıklı onay)
  5. Sohbet takma adla başlar; kimlik paylaşımı iki tarafın isteğiyle, ne zaman istersen
  6. 18+; engelle ve raporla bir dokunuş uzakta; hassas içerik filtresi; sohbeti istediğin an sil
  7. Eşleşme tamamen isteğe bağlı: kapattığında rüyaların hiçbir zaman başkasına gösterilmez
Rüya günlüğüYapay zekâ yorumuSembol kartlarıKalıplarEşleşmeSohbet

Neden

Web tabanlı bir çekirdek (Next.js) ve onu saran mobil kabuk (WebView): bir değişiklik her seferinde mağaza onayı beklemez; abonelik ve bildirim gibi mağazaya bağlı işler kabukta kalır. Altyapıda küçük ve ucuz başladık: Frankfurt'ta tek Lightsail sunucu (Node 22 + PostgreSQL 16 + pgvector + nginx), önünde Cloudflare; medya S3 + CloudFront imzalı bağlantı; e-posta SES. Büyüyünce veritabanı ve önbellek ayrılır, mimari değişmez.

Seçilen yığın

  1. Sunucu: AWS Lightsail (Frankfurt, 2 GB), Ubuntu 24.04 — tek kutu, statik IP
  2. Uygulama: Node.js 22 + pm2; çekirdek Next.js; mobil kabuk WebView (iOS/Android)
  3. Veritabanı: PostgreSQL 16 + pgvector (benzer rüya araması) — şimdilik aynı sunucuda
  4. Kenar: Cloudflare (DNS, proxy, WAF, rate limit); origin yalnız Cloudflare'den
  5. Medya: S3 kapalı kova + CloudFront süreli imzalı bağlantı
  6. E-posta: Amazon SES; bildirim: push (kabuk üzerinden)
  7. Yapay zekâ: sağlayıcı-bağımsız katman (model değişse uygulama değişmez)
  8. Abonelik: Apple / Google uygulama içi ödeme, RevenueCat
  9. Kuyruk: başlangıçta PostgreSQL tabanlı (pg-boss; 95 sn'den uzun AI işleri için), istemciye SSE/yoklama; Redis + BullMQ büyüyünce
LightsailCloudflareNode 22Next.jsPostgreSQL 16pgvectorS3 + CloudFrontSESRevenueCatWebView

Neden

Uygulama kodundan önce sağlam bir zemin: küçük tek sunucu, yönetilen DNS ve CDN, otomatik yedek ve her adımı bağımsız bir denetimden geçirme alışkanlığı. Rüya, ses ve fotoğraf gibi kişisel veri taşıyacağı için güvenlik ve en az yetki ilkesi en başta kuruldu. Tasarım ve kurulum, yapay zekâ ile düşmanca (adversarial) denetimden üç tur geçti; bulunan her açık kapatıldı. Kurulum bitince "bu 1 milyon kullanıcıda dayanır mı?" sorusuyla bir ölçek denetimi daha yapıldı; çıkan yedi madde (33–39) uygulandı.

Yapılanlar · sırayla

  1. Alan adı al, e-postayı onayla
  2. Cloudflare'e alan adını ekle, nameserver'ları değiştir
  3. AWS CLI kur, yeni SSH anahtarı üret
  4. Lightsail sunucu aç, statik IP bağla
  5. Firewall kur (SSH tek IP, 80/443)
  6. Otomatik anlık görüntü aç
  7. Sunucu kurulum script'ini yaz ve çalıştır
  8. Swap ve otomatik yama ayarla
  9. fail2ban ve ufw kur
  10. Node.js ve pm2 kur
  11. PostgreSQL 16 + pgvector kur (sadece localhost)
  12. Sırları ve .env'i kur: DB şifresini sunucuda üret, .env 640 root:uygulama, anahtarları anahtarlıkta tut, sunucuya stdin ile taşı
  13. nginx kur, yer tutucu sayfa ve /health koy
  14. Cloudflare DNS kayıtlarını temizle, A kayıtlarını gir (turuncu bulut)
  15. SSL kur (Let's Encrypt), Cloudflare'i Full strict yap
  16. HTTP → HTTPS yönlendirme kur
  17. S3 kovası aç, kapat (public erişim yok)
  18. IAM kimlikleri kur (uygulama + yedek, en az yetki)
  19. CloudFront kur, imzalı bağlantı anahtarı üret
  20. SES e-posta kur, DKIM/SPF/DMARC gir
  21. Gece yedek script'i ve cron kur
  22. Origin'i sadece Cloudflare IP'lerine daralt
  23. Catch-all kur (bilinmeyen alan adına cevap yok)
  24. Authenticated Origin Pulls aç
  25. IPv6 kapat, root girişi kapat
  26. Alarm ve günlük sağlık kontrolü kur
  27. Rate limit kur (nginx + Cloudflare)
  28. Güvenlik başlıkları ve CSP kur
  29. Cloudflare sıkılaştırma (Always Use HTTPS, HSTS, min TLS 1.2, Bot Fight Mode)
  30. Kanıt script'ini çalıştır
  31. Düşmanca denetim (3 tur) ve düzeltmeler
  32. Kontrollü yeniden başlatma, son test
  33. Rate limit'i kullanıcı bazlı yap (token/oturum; IP yalnız anonim), /api/auth/ için sıkı sınır
  34. Akış (SSE) için proxy tamponunu kapat; uzun AI işleri kuyruk + akış kararı
  35. Cloudflare'i mobil uygulama UA'larıyla test et (WebView challenge görmemeli)
  36. PostgreSQL'i 2 GB'a göre ayarla, pg_stat_statements; Node heap; pm2 ecosystem .env'i kendisi okur (env_file yok); log döndürme
  37. pgBackRest kur: şifreli S3 yedek + WAL arşivi (kayıp penceresi ≤ 5 dk), günlük cron
  38. Aylık gerçek geri yükleme tatbikatı; günlük kontrole yedek sağlığı ekle
  39. Kurtarma runbook'u ve bus-factor paketi (offline sırlar, MFA, alan adı kilidi)
Hazırlık · hesaplar, araçlar, alan adısıfırdan başlayan için · H1–H10
  1. AWS hesabı açmaKayıt, kart doğrulaması, Basic destek planı; root'a MFA, günlük iş için IAM kullanıcısı, bütçe alarmı, bölge Frankfurt.
  2. AWS CLI kurma ve bağlamamacOS/Windows/Linux kurulum; erişim anahtarı üret, aws configure, get-caller-identity ile doğrula; çoklu hesapta profil kullan.
  3. SSH anahtarı üretmessh-keygen -t ed25519 (Windows'ta PowerShell'de de çalışır); özel anahtar sende kalır, açık anahtar sunucuya; ~/.ssh/config ile tek komut.
  4. Lightsail'i panelden açmaCreate instance → Frankfurt → Ubuntu 24.04 → anahtarını yükle → 2 GB plan; statik IP bağla, SSH'ı kendi IP'ne kısıtla, otomatik snapshot aç.
  5. Alan adı almaRegistrar seç, WHOIS gizliliği ve otomatik yenileme açık; kayıt e-postasındaki ICANN doğrulamasına hemen tıkla (yoksa askıya alınır); transfer kilidi açık.
  6. Cloudflare hesabı ve alan adı eklemeKayıt + 2FA; Add a domain → Free; taramadan gelen çöp kayıtları sil; verilen 2 nameserver'ı not et.
  7. Nameserver yönlendirmeRegistrar panelinde Nameservers → custom → Cloudflare'in ikisini yaz; panelde yoksa destek talebi (örnek metin MD'de); dig ile yayılımı kontrol et.
  8. Alan adını sunucuya bağlamaA kayıtları @, www, api → sunucu IP (turuncu bulut); SPF/DMARC koruması; SSL modu Full → sertifika sonrası Full (strict).
  9. Cloudflare API tokenCustom token: DNS, Zone Settings, Zone WAF, SSL and Certificates, Zone Read; sadece o alan adı; anahtarlıkta sakla.
  10. İlk bağlantı ve kurulum script'issh ile bağlan, script'i gönder, nohup ile çalıştır, logu izle; .bootstrap-done oluşunca /health cevap verir.
Tam adımlar, komutlar ve destek talebi örnek metni bu adımın MD dosyasında.
LightsailCloudflarePostgreSQL 16pgvectorCloudFrontSESLet's EncryptAdversarial denetim
Aylık maliyet en küçük paket seviyesinde; medya CDN'i ve e-posta başlangıçta ücretsiz katmanda. Bu adımın videosu yayında.
Bu adımın notları ve yapılanlar, tek dosyada (Markdown).

Neden

İleride bu siteden rüya sembolleri ve anlamları yayınlanacak, uygulama ve site birden çok dili destekleyecek ve insanlar soruları artık sohbet botlarına da soruyor. Arama motoru tabanını içerik gelmeden kurmak gerekiyordu: her adrese 200 dönen bir site, www kopyası ve JavaScript'e gömülü içerikle başlamak sonradan temizlenmesi zor bir borç bırakır. Bütün etiketler, sitemap, robots, görsel meta verisi ve yapısal veri tek bir dil-bilinçli yapılandırma dosyasından üretiliyor; yeni sayfa, dil ya da görsel eklemek bir satır. Google'ın SEO başlangıç kılavuzu ve yapay zekâ kılavuzu madde madde karşılaştırıldı, eksikler kapatıldı.

Yapılanlar · sırayla

  1. Bilinmeyen adresler için gerçek 404 (SPA fallback kaldırıldı), sade 404 sayfası, noindex
  2. www → apex 301, her sayfada canonical, charset başlığı
  3. Tek yapılandırma dosyası: sayfalar, diller, çeviriler, görseller → tüm etiketler üretilir
  4. hreflang (tr + x-default), og:locale, dil öneki kararı /tr/…, /en/…; dile göre otomatik yönlendirme yok
  5. sitemap.xml (hreflang ve görsel uzantılı) ve robots.txt
  6. OG ve Twitter kartları, her sayfaya şablondan üretilen 1200×630 görsel
  7. JSON-LD: Organization, Person, WebSite, WebPage/Article/AboutPage, BreadcrumbList, ImageObject, VideoObject
  8. Yapım günlüğü adımları ham HTML'e ön-render; adım başlıkları gerçek h3
  9. Ana sayfaya h2'li içerik; Hakkında sayfası (kim, nasıl, neden)
  10. Görsel hattı: dil başına alt/altyazı JSON'dan, WebP + boyut, açıklayıcı dosya adları, görsel sitemap, LCP preload
  11. Statik varlıklara 30 gün önbellek; HTML her açılışta doğrulanır
  12. llms.txt + llms-full.txt, RSS, site.webmanifest + ikonlar
  13. IndexNow (Bing, Yandex, Naver anında); Search Console bağlı
  14. Yapay zekâ botları: Content-Signal ve açık izin (arama + eğitim), Cloudflare yönetilen robots kapatıldı
  15. Google SEO başlangıç kılavuzu ve AI kılavuzu ile karşılaştırma, eksikler kapatıldı
  16. Build sonrası SEO regresyon testi: canonical, hreflang karşılıklılığı, tek h1, JSON-LD hedefleri, OG ve görsel dosyaları, alt metinler, sitemap ↔ sayfalar; hata varsa yayın durur
  17. Rüya sözlüğü için adres ve içerik modeli: /{dil}/{bölüm}/{slug} — bölüm adı dile göre (ruya, dreams, traumdeutung, sonnik…), 12 dil kademeli (önce TR/EN/DE), ASCII slug, sayfa kalıbı (kısa cevap + üç bakış), kaynak ve alıntı modeli, konu kümeleri (iç linkleme), Search Console → içerik döngüsü
SEOGEOhreflangJSON-LDsitemapIndexNowi18n
Bu adımın notları ve yapılanlar, tek dosyada (Markdown).

Neden

Yeni bir yorum ekolü eklemek ya da bir promptu değiştirmek için mobil uygulamaya yeni sürüm çıkarmak istemedik: ekoller, promptlar ve model listesi veritabanında, panelde değişiyor, uygulama bir sonraki isteğinde görüyor. Prompt ürünün davranışını değiştirdiği için sürümleniyor ve canlıya almadan deneniyor; her cevabın hangi sürüm ve modelle üretildiği günlükte. Kullanıcıya görünen ne varsa (ad, açıklama, kapak, adres, prompt) dile göre ayrı, sistem kimliği ortak. Panel ayrı bir güvenlik yüzeyi olduğu için kimlik, oturum, CSRF ve girdi denetimi baştan sıkı kuruldu ve canlıya çıkmadan kodu görmemiş bir yapay zekâ ajanına kırdırıldı.

Yapılanlar · sırayla

  1. Next.js 16 (standalone) + PostgreSQL + Drizzle; adres /appsomnio, noindex, girişsiz her sayfa girişe
  2. Şifre argon2id, sabit süreli giriş; oturum token'ı DB'de hash'li, httpOnly + Secure + SameSite=strict, 12 saat kayan; tüm oturumları düşürme
  3. Giriş sınırı iki katman (nginx + uygulama), CSRF için Origin denetimi, roller, denetim kaydı, admin'e özel CSP/HSTS başlıkları
  4. Yorum kategorileri tek formda: ortak ayarlar + dil sekmeleri (ad, açıklama, not, kapak, SEO adresi)
  5. Sistem anahtarı başlıktan otomatik; dil bazlı slug (Türkçe/Almanca/Kiril/Arapça/CJK → Latin), elle düzenlenebilir, dil içinde benzersiz
  6. Kapak görseli dil bazlı: tarayıcıda 1600 px WebP, sunucuda byte imzasıyla tür denetimi, içerik-hash'li ad, CDN önbelleği; dilde kapak yoksa TR
  7. Prompt şablonu = kategori × dil, * varsayılan; taslak → aktif → arşiv, tek aktif sürüm DB kısıtıyla; yer tutucu çipleri, JSON çıktı şeması
  8. Dene: gerçek Gemini çağrısı, render edilmiş promptlar, süre, token, maliyet (düşünme token'ları dahil), günlük kota
  9. AI modelleri panelde (kimlik, fiyat, varsayılan); her çağrı ai_runs günlüğünde
  10. Public /api/categories: uygulama için dilin adı, kapağı, slug'ı ve aktif şablon bilgisi (dinamikliğin kanıtı)
  11. Tasarım: tek CSS token dosyası, inline SVG ikon seti, self-host font, sayfa başına ayrı istemci bileşeni
  12. Yerel hat: derle → standalone → test DB sıfırla → 80 uçtan uca API kontrolü → headless ekran görüntüleri
  13. Bağımsız 'kır bunu' denetimi: 12 bulgu (kritik SVG XSS dahil) kapatıldı; kara liste yerine allowlist temizleyici
  14. Deploy: Mac'te derle → sürüm klasörü → migrasyon öncesi yedek → migrasyon → pm2 → sağlık → otomatik geri alma; Linux native prebuild'leri pakette
  15. MD: tam kaynak kodla, bir yapay zekâya verip kendi projene uyarlatabileceğin rehber
Next.jsPostgreSQLDrizzleargon2Geminiprompt sürümlemei18ngüvenlikdeploy
Bu adımın notları ve yapılanlar, tek dosyada (Markdown).