Bu rehber, Oluculer.com (Deterministik Fırsat Avcısı) projesini sıfırdan canlıya almak, veritabanını kurmak, scraping (veri kazıma) botlarını yapılandırmak ve n8n ile otomasyona bağlamak için gereken tüm adımları içerir.
Proje 3 temel bacaktan oluşur:
- Frontend / Web: Next.js (App Router), Tailwind CSS
- Backend / Veritabanı: Supabase (PostgreSQL)
- Data Pipeline / Otomasyon: Node.js (Playwright Stealth Scraper) & n8n (Cron/Scheduler)
Projenin tüm verileri ve deterministik kuralları Supabase (PostgreSQL) üzerinde tutulur.
- Supabase'e gidin ve yeni bir proje oluşturun.
- Proje ayarlarından (Project Settings -> API) URL, anon (public) key ve service_role (secret) key bilgilerini kopyalayın.
- Supabase panosunda sol menüden SQL Editor'e girin.
- Proje dizininde yer alan
supabase/database_schema.sqldosyasının içindeki tüm kodları kopyalayıp SQL Editor'e yapıştırın ve çalıştırın. - Bu işlem;
categories,products,product_offers,price_history,couponstablolarını, gerekli foreign-key kurallarını, B-Tree Indekslerini ve Row Level Security (RLS) ayarlarını otomatik olarak kuracaktır.
Proje kök dizininde (package.json ile aynı yerde) bir .env.local dosyası oluşturun ve aşağıdaki değişkenleri doldurun:
# Supabase Ayarları (Zorunlu)
NEXT_PUBLIC_SUPABASE_URL=https://[PROJE_ID].supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR...
# Sunucu Tarafı Güvenli İşlemler İçin (Zorunlu)
SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR...
# SEO ve Site Haritası İçin (Opsiyonel - Canlıya alırken zorunlu)
NEXT_PUBLIC_BASE_URL=https://oluculer.com
# Kazıma İşlemi İçin Proxy (Eğer kullanılacaksa)
RESIDENTIAL_PROXY_URL=http://username:password@proxy.example.com:8080Terminali açın ve proje dizininde şu komutları çalıştırın:
npm install- Geliştirme Modu (Localhost):
npm run devkomutunu çalıştırın.http://localhost:3000adresinden siteye erişebilirsiniz. - Canlı (Production) Build: Vercel veya kendi sunucunuza çıkmadan önce projeyi derlemek için
npm run buildkomutunu çalıştırın. (Proje sıfır hata toleransıyla yapılandırıldığı içinnpm run lintvebuildkomutları başarıyla "0 hata" ile tamamlanmalıdır). - Production Server Başlatma: Build sonrası
npm run startile projeyi canlı modda test edebilirsiniz.
Fiyat verileri, anti-bot sistemlerini atlatmak için Playwright ve puppeteer-extra-plugin-stealth kullanılarak kazınır.
Kazıma kodları src/scripts/scraper.ts dosyasında bulunur. Bu dosya:
- Belirtilen (veya dinamik alınan) ürün hedeflerine gider.
- Playwright kullanarak sayfayı tam bir insan gibi donanım ivmelendirmeli olarak çizer.
- Fiyat bilgisini HTML DOM üzerinden Regex ile ayrıştırıp temizler.
- Çektiği fiyatı
src/utils/algorithms.tsiçerisindeki deterministik kural motorundan (Sıcak Fırsat / SMA 30 kuralı) geçirir. - Fırsat olarak etiketlenip etiketlenmeyeceğine karar verir.
- Veriyi doğrudan
SUPABASE_SERVICE_ROLE_KEYyetkisi ile veritabanınaupserteder ve fiyat geçmişi (price_history) logu oluşturur.
Kazıyıcıyı terminalden test etmek için ts-node kullanabilirsiniz (öncesinde global kurulu olmalıdır npm i -g ts-node):
ts-node src/scripts/scraper.tsNot: Büyük ölçekli taramalar yapacaksanız, IP banlarından kaçınmak için .env.local içine RESIDENTIAL_PROXY_URL değişkenini tanımladığınızdan emin olun.
Kazıma betiğinin elle çalıştırılması yerine, sistemi tam otonom hale getirmek için n8n (Node-base otomasyon aracı) kullanmalısınız. n8n ister yerel Docker konteynerinizde isterseniz bulut (n8n.cloud) üzerinde çalışabilir.
- n8n ara yüzünü açın ve yeni bir Workflow oluşturun.
- İlk Node olarak "Schedule Trigger" (Cron) ekleyin. (Örneğin: Her 60 dakikada bir çalış -
0 * * * *şeklinde ayarlayın).
- Supabase'den Kazınacak URL'leri çekmek için "PostgreSQL" veya "HTTP Request" node'u ekleyin. (Supabase REST API'sine
GET /rest/v1/product_offers?select=original_url,product_idşeklinde istek atabilirsiniz).
Burada birden fazla mimari seçilebilir:
- A Yöntemi (execute command): Eğer n8n aynı sunucuda/Docker'da koşuyorsa "Execute Command" node'u ekleyip içine
npx ts-node /app/oluculer.com/src/scripts/scraper.tsyazarak scripti direkt tetikleyebilirsiniz. - B Yöntemi (API Dönüşümü - Tavsiye Edilen): Next.js tarafında
src/app/api/scrape/route.tsşeklinde bir API Endpoint açabilirsiniz. Bot koruması olmaması için bu endpoint sadeceBEARER TOKENveya özelSUPABASE_SERVICE_ROLE_KEYile çalışmalıdır. n8n üzerinden "HTTP Request" node'u ile bu API'yePOSTisteği göndererek scraper'ı bulut üzerinden tetikleyebilirsiniz.
- Kazıma sonucu Supabase'de
is_hot_deal = trueolan yeni bir kayıt eklendiğinde (Supabase Realtime Webhook kullanılarak), n8n üzerindeki başka bir "Webhook" node'una veri gönderilir. - Bu veriyi n8n'de "Telegram" veya "Discord" node'una bağlayıp "🔥 YENİ DİP FİYAT GELDİ 🔥" şeklinde kullanıcılarınıza/kendinize anında alarm verebilirsiniz.
Projenizde Google AdSense tam uyumlu olarak (lazy-load) çalışmaktadır. Kodu aktifleştirmek için:
src/app/layout.tsxdosyasını açın.<meta name="google-adsense-account" content="ca-pub-0000000000000000" />kısmındakica-pub-00...kimliğini kendi AdSense kimliğinizle değiştirin.- Aynı dosyadaki
adsbygoogle.jsURL'si içindeki client id'yi yine kendinize göre güncelleyin. - Bileşenlerde yer alan
<AdSlot type="..." />modülü sayfa düzenini asla kaydırmayacak (zero-CLS) şekilde CSS yapılarına sahiptir.
Artık sistem kendi kendine veri çeken, işleyen, sunan ve bunlardan gelir elde eden tamamen otonom bir yapıdadır. Tebrikler! 🎉