Tüm Projeler
2026

DerinRüya

Next.js, Express ve MySQL üzerine kurulu, Linux sunucuda 7/24 çalışan bir yapay zekâ otomasyon servisiyle günde yedi kez kendi kendine içerik üreten bir rüya tabirleri sitesi.

DerinRüya

PROJE DETAYI

DerinRüya'yı, reklam destekli organik aramadan trafik kazanmak amacıyla kurgulanmış bir Türkçe rüya tabirleri arşivi olarak sıfırdan geliştirdim. Ürünün amacı nettir: rüya sembolü arayan ziyaretçiyi arama motorundan doğrudan karşılayan sayfalar üretmek, siteyi sürekli büyüyen bir arşiv haline getirmek ve bu trafiği reklam gösterimine dönüştürmek. Projenin asıl mühendislik tarafı ise arayüzden çok, içeriğin nasıl üretildiğinde: sitedeki yazıların tamamı, Linux sunucuda arka planda sürekli çalışan bir yapay zekâ otomasyon servisi tarafından, insan müdahalesi olmadan yazılıp yayınlanıyor. Teknoloji Yığını ve Mimari Önyüzde Next.js 16 (App Router) ve React 19 kullanılıyor; içerik MySQL'den anlık olarak çekilip sunucu tarafında render ediliyor. Express 5 tabanlı ayrı bir API, admin panelini, kimlik doğrulamayı ve içerik uçlarını yönetiyor. Production ortamında Nginx, '/' altındaki her şeyi Next.js'e, '/api/admin' ve '/api/content' altını Express'e yönlendiren bir reverse proxy olarak çalışıyor; Next.js, Express ve otomasyon servisi birbirinden bağımsız üç systemd servisi olarak Ubuntu üzerinde ayrı ayrı yönetiliyor. Konu Havuzu: 27.000 Sorgudan 4.000 Benzersiz Başlığa İçerik üretimine başlamadan önce SEMrush kaynaklı yaklaşık 27.000 satırlık bir anahtar kelime listesini işleyen bir seçim script'i yazdım. Script önce zorluk bandına göre (kolay/orta/zor) ayrılan satırları normalize edip tam yinelenenleri eliyor, uyuşturucu, cinsel içerik, istismar, intihar ve grafik şiddet gibi güvensiz örüntüleri regex tabanlı bir filtreyle baştan çıkarıyor, kalanları ekleri sadeleştirilmiş kök kelimelere göre kümeliyor ve her kümeden en yüksek aramalı temsilciyi seçiyor. Sonuçta üretime, konu tekrarı olmayan ve zorluktan hacme göre sıralanmış tam 4.000 benzersiz rüya konusu giriyor. Bu 4.000 konu, otomasyonun besleneceği kuyruğun tamamını oluşturuyor. İçerik Otomasyonu: Linux'ta Sürekli Çalışan Yapay Zekâ Servisi Bu projenin en çok zaman harcadığım kısmı burası. 'server/worker.mjs', systemd altında 'Restart=always' ile tanımlı, sunucu ayakta olduğu sürece asla durmayan bir Node.js sürecidir; internetteki klasik crontab satırlarının aksine dışarıdan tetiklenmiyor, kendi içinde 30 saniyelik bir 'setInterval' ile sürekli nabız atıyor ve her atışta bir "otomasyon tick"i çalıştırıyor. Bu tick sırasıyla şunları yapıyor: 1. Günlük yayın yuvalarını oluşturuyor: 'automation_settings' tablosundaki takvime göre (Europe/Istanbul saat dilimi, günde yedi sabit saat: 07:00, 09:30, 12:00, 14:30, 17:00, 19:30, 22:00) o günün henüz geçmemiş saatleri için 'publishing_slots' tablosuna yuva açıyor. Worker gün ortasında yeniden başlarsa geçmiş saatleri toplu halde doldurmuyor, yalnızca kalan yuvaları dolduruyor. 2. Boş yuvalara konu ayırıyor: Bekleyen her yuvayı, kuyruktaki en zor olmayan ve hacmi en yüksek keyword kümesiyle transaction içinde eşleştiriyor; böylece aynı konu iki yuvaya birden atanamıyor. 3. İçeriği üretiyor: Her yuva için OpenRouter API üzerinden bir dil modeline yapılandırılmış bir JSON şeması dayatarak ('response_format: json_schema', 'strict: true') 800–1800 kelimelik bir rüya tabiri ürettiriyor. Üretilen yazı; başlık, kısa özet, 4-5 somut alt senaryo (variant) ve üç ayrı yorum ekseninden (İslami/sembolik, psikolojik/öz değerlendirme, astrolojik) oluşan sabit bir doküman şemasına oturuyor. Model çağrısından önce ayrı bir "keyword değerlendirme" adımı çalışıyor; konu ham haliyle değil önce sadeleştirilip ("rüyada birinin sana taş attığını görmek" → "rüyada taş atıldığını görmek" gibi) odak kelimeye indirgeniyor. 4. Güvenlik ve içerik uygunluğunu üretimden önce filtreliyor: Aynı değerlendirme adımı; uyuşturucu, açık cinsel içerik, istismar, ensest, grafik şiddet, kendine zarar verme veya intihar ana konu olduğunda kümeyi "reddedildi" damgasıyla üretim dışına alıyor. Yalnızca ölüm, kaza veya rahatsız edici bir imge geçmesi tek başına reddetme sebebi sayılmıyor; kural, teşvik edici ya da grafik olmayan sembolik anlatımı üretime devam ettirecek şekilde tasarlandı. 5. Özgünlüğü otomatik denetliyor: Her yeni yazının başlıkları, son 20 yayınlanmış makalenin başlıklarıyla kelime köklerine indirgenip Jaccard benzerliğiyle karşılaştırılıyor. Benzerlik eşiği aşıldığında ("Rüyada X Görmenin Genel Anlamı" gibi kalıp başlıklar dahil) yazı reddediliyor, model reddedilme sebebi geri bildirim olarak verilip aynı konu için en fazla üç deneme daha yapılıyor. Bu adım, "aynı şablonun anahtar kelimesi değiştirilmiş hali" türünden içeriğin yayına çıkmasını engelleyen asıl mekanizma. 6. Yayına alıyor: Doğrulamadan geçen yazı MySQL'e taslak olarak yazılıp yuvasına bağlanıyor; yuvanın 'publish_at' zamanı geldiğinde ayrı bir adım bu taslağı otomatik yayına alıyor ve 'published_at' damgasını basıyor. Hata Toleransı ve Gözlenebilirlik Üretim sırasında geçici bir hata (zaman aşımı, oran sınırı, model routing hatası) oluşursa yuva üstel geri çekilmeyle (30 saniyeden başlayıp en fazla bir saate kadar) yeniden denemeye alınıyor; üç denemeden sonra hâlâ başarısızsa küme "başarısız" işaretlenip kuyruktan çıkarılıyor ve bir sonraki uygun konuya sıra geçiyor. OpenRouter'ın geçici model yönlendirme hatalarını ('404: No endpoints found') tanıyıp bu yüzden elenmiş kümeleri otomatik olarak havuza geri döndüren ayrı bir kurtarma adımı da var. Her tick'in sonucu (kaç yazı üretildi, kaç tanesi hata verdi, kaç tanesi yayınlandı) 'automation_runs' tablosuna loglanıyor ve bir "heartbeat" kaydı en son çalışma zamanını tutuyor; bu sayede worker'ın gerçekten çalışıp çalışmadığı admin panelinden veya 'journalctl -u derinruya-worker' ile anında görülebiliyor. SEO ve Yapay Zekâ Aramaları için Görünürlük Üretilen her rüya sayfası için Article, BreadcrumbList, DefinedTerm/DefinedTermSet ve görünen bölümlerden türetilen FAQPage yapılandırılmış verisi otomatik basılıyor; meta title, meta description, canonical ve index/noindex alanları makale bazında yönetiliyor. Sitemap MySQL'den anlık üretiliyor. Üretken arama motorlarının ve LLM tabanlı asistanların siteyi doğru biçimde taraması için ayrıca bir '/llms.txt' ve buna uygun bir robots politikası eklendi; amaç, trafiğin yalnızca klasik aramadan değil, yapay zekâ destekli arama yüzeylerinden de gelebilmesi. Sonuç DerinRüya, ticari amacı basit olsa da (reklam gelirine dönüşecek organik trafik), bunu sağlayan mühendislik tarafı hiç basit değildi: 27.000 satırlık ham veriyi güvenli ve benzersiz 4.000 konuya indirgeyen bir seçim hattı, günde yedi kez insansız çalışan zamanlanmış bir yayın takvimi, üretim öncesi içerik güvenliği filtresi, yayın öncesi otomatik özgünlük denetimi ve tüm bunları ayakta tutan hataya dayanıklı bir Linux servisi kurmak gerekti. Sonuç olarak site, benim hiç dokunmadan günde yedi yeni rüya tabiri yazıp yayınlayan, kendi kendini besleyen bir içerik operasyonuna dönüştü.

TEKNOLOJİ STACK

Next.jsExpress.jsMySQLOpenRouterAI İçerik OtomasyonusystemdNode.jsSEO