Bol Oyun, Türkçe odaklı, hızlı ve hafif bir mini oyun portalıdır.
Ana hedef basit: kullanıcı oyunu bulur, oyun sayfasını açar, Oyunu Başlat butonuna basar ve tarayıcı içinde oynar. Proje bu akışı bozmadan oyun keşfi, kategori/etiket sayfaları, arama, favoriler, yorumlar, admin yönetimi, import kuyruğu, reklam alanları ve SEO içerikleri sunar.
- Canlı site: https://boloyun.com
- Canonical repo: https://github.com/huseyinemanet/boloyun.com
- Production branch:
main
Bol Oyun bir SaaS paneli, sosyal ağ veya ağır oyun platformu değildir. Public taraf Türkçe-first, kompakt ve hızlı kalır.
Temel kullanıcı akışı:
Oyun bul -> oyun sayfasını aç -> Oyunu Başlat -> oyna -> başka oyun keşfetPublic tarafta:
- Türkçe ana sayfa, kategori sayfaları, etiket sayfaları ve arama
- Kompakt oyun kartları ve sticky kategori navigasyonu
- iframe, HTML5, SWF/Flash ve external oyun türleri
- SWF oyunlar için Ruffle desteği
- Oyuncu tıklamadan yüklenmeyen oyun oynatıcı
- Favoriler, son oynananlar, yorumlar ve puanlama
- SEO başlığı, açıklaması, canonical ve Open Graph çıktıları
Admin tarafta:
- Oyun, kategori, etiket ve statik sayfa yönetimi
- Reklam slotları ve reklam kodu yönetimi
- Import/crawler kayıtları için inceleme kuyruğu
- AI destekli Türkçe içerik üretim alanları
- Onay, ret ve düzeltme akışları
- Yorum moderasyonu
- Next.js 16 App Router
- React 19
- TypeScript
- Tailwind CSS 4
- shadcn/ui ve Radix tabanlı arayüz bileşenleri
- Supabase Postgres
- Supabase Auth
- Supabase RLS ve admin yetki kontrolleri
- S3 uyumlu obje depolama/CDN üzerinden kapak ve site varlıkları
- Ruffle ile SWF/Flash oyun desteği
- Node.js CLI import ve crawler scriptleri
- Docker, Docker Compose ve Nginx
- Hetzner VPS üzerinde izole production runtime
- GitHub Actions ile image build, sunucuya aktarım ve otomatik deploy
Production runtime Hetzner VPS üzerinde Docker container olarak çalışır. Sunucudaki Nginx, dış trafiği sadece local porta bağlı uygulama container'ına proxy'ler.
Kullanıcı
-> https://boloyun.com
-> Nginx
-> 127.0.0.1:3001
-> boloyun-app
-> Supabase / obje deposu / harici servisler
Arka plan işleri
-> boloyun-worker
-> crawler_jobs kuyruğu
-> scrape / AI / inceleme kuyruğuDeploy akışı:
main branch'e push veya merge
-> GitHub Actions
-> Next.js standalone Docker image build
-> image arşivinin VPS'ye aktarılması
-> /usr/local/sbin/boloyun-deploy
-> container health check
-> başarılıysa yeni sürüm, başarısızsa rollbackSunucudaki uygulama dosyaları:
/opt/boloyun/compose.yml
/opt/boloyun/.env.production
/opt/boloyun/.deploy.env
/opt/boloyun/cache
/usr/local/sbin/boloyun-deployUygulama SMF forumundan ayrı Docker Compose projesi ve ayrı local port üzerinde çalışır.
Crawler ve AI toplu işleri public web sürecinde çalışmaz. Aynı production image'ını kullanan, dışarı port açmayan ve kaynakları sınırlandırılmış boloyun-worker servisi bu işleri Supabase üzerindeki kalıcı kuyruktan küçük partiler hâlinde alır.
Worker kurulumu, sağlık kontrolleri ve ilk production geçişi için arka plan worker rehberine bakın.
src/app Next.js App Router sayfaları ve route handler'lar
src/app/(public) Public Türkçe oyun sitesi
src/app/admin Admin paneli
src/components Paylaşılan UI, layout, oyun, reklam ve profil bileşenleri
src/components/player Oyun oynatıcı bileşenleri
src/import Sitemap keşfi, scraper, parser, import ve publish scriptleri
src/lib Veritabanı erişimi, auth, SEO, güvenlik ve yardımcı modüller
supabase/migrations Reprodüksiyonlu veritabanı migration dosyaları
deploy/compose.yml VPS üzerindeki production Docker Compose servisi
deploy/server Production deploy scripti ve dar sudoers kuralı
Dockerfile Next.js standalone production image- Node.js 20 veya üzeri
- pnpm
11.7.0 - Supabase projesi
- S3 uyumlu obje depolama/CDN alanı
- Docker ve Docker Compose kurulu Linux VPS
- Nginx reverse proxy
- İsteğe bağlı AI sağlayıcı API anahtarı
Repo packageManager alanında pnpm sürümünü sabitler. Yerelde pnpm yoksa komutları npx -y pnpm@11.7.0 ... şeklinde çalıştırabilirsiniz.
Repoyu klonlayın:
git clone https://github.com/huseyinemanet/boloyun.com.git
cd boloyun.comBağımlılıkları kurun:
npx -y pnpm@11.7.0 installOrtam dosyasını hazırlayın:
cp .env.example .env.localTemel değişkenler:
NEXT_PUBLIC_SUPABASE_URL=
NEXT_PUBLIC_SUPABASE_ANON_KEY=
SUPABASE_SERVICE_ROLE_KEY=
AI_PROVIDER=
AI_API_KEY=
AI_SETTINGS_ENCRYPTION_KEY=
AI_TRANSLATION_CRON_SECRET=
SITE_URL=http://localhost:3000
ABUSE_HASH_SECRET=
SLOW_QUERY_MS=500Obje deposu/CDN ve bot koruma ayarları için repodaki .env.example dosyasını esas alın. Production secret'ları README yerine sunucudaki /opt/boloyun/.env.production dosyasında tutulur.
Geliştirme sunucusunu başlatın:
npx -y pnpm@11.7.0 devYerel adres:
http://localhost:3000Geliştirme:
npx -y pnpm@11.7.0 devTip kontrolü:
npx -y pnpm@11.7.0 typecheckLint:
npx -y pnpm@11.7.0 lintTest:
npx -y pnpm@11.7.0 testProduction build:
npx -y pnpm@11.7.0 buildPerformans kontrolü:
npx -y pnpm@11.7.0 perf:checkDocker image build:
docker build \
--build-arg NEXT_PUBLIC_SUPABASE_URL="$NEXT_PUBLIC_SUPABASE_URL" \
--build-arg NEXT_PUBLIC_SUPABASE_ANON_KEY="$NEXT_PUBLIC_SUPABASE_ANON_KEY" \
--build-arg SUPABASE_SERVICE_ROLE_KEY="$SUPABASE_SERVICE_ROLE_KEY" \
--build-arg SITE_URL="https://boloyun.com" \
--tag boloyun:local \
.Container smoke test:
docker run --rm --env-file .env.local -p 3001:3000 boloyun:localVeritabanı Supabase Postgres üzerinde çalışır ve migration dosyaları supabase/migrations altında tutulur.
Production şema değişiklikleri için kural:
- Yeni migration dosyası oluştur.
- Dry-run ile doğrula.
- Migration listesini kontrol et.
- Kod, migration ve gerekli konfigürasyonu birlikte commit'le.
- Push/merge sonrası remote migration durumunu doğrula.
Komutlar:
supabase db push --dry-run
supabase db push
supabase migration listAna tablolar:
profiles
games
categories
tags
game_categories
game_tags
game_imports
homepage_sections
comments
favorites
ratings
game_plays
ad_slots
ads
static_pagesImport hattı public yayını doğrudan değiştirmez. Kayıtlar önce game_imports tablosuna girer, admin incelemesinden geçer ve sadece onay sonrası public oyuna dönüşür.
Akış:
discover -> scrape -> parse -> generate_ai_content -> pending_review -> approve/reject -> publishSitemap üzerinden oyun URL'lerini keşfetme:
npx -y pnpm@11.7.0 import:discover <sitemap-url> --limit 50Miniplay parser ile scrape:
npx -y pnpm@11.7.0 import:scrape --source miniplay --limit 100Tekil URL scrape dry-run:
npx -y pnpm@11.7.0 import:scrape --source miniplay --dry-run https://www.miniplay.com/game/exampleAI içerik üretimi:
npx -y pnpm@11.7.0 import:generate-content --limit 50Onaylanmış import kayıtlarını public oyuna çevirme:
npx -y pnpm@11.7.0 import:approve --limit 10Başarısız import kayıtlarını tekrar deneme:
npx -y pnpm@11.7.0 import:retry-failedKapak/CDN yardımcı komutları:
npx -y pnpm@11.7.0 covers:audit
npx -y pnpm@11.7.0 covers:migrate
npx -y pnpm@11.7.0 covers:retry
npx -y pnpm@11.7.0 covers:rollbackHer oyun bir game_type değerine sahiptir:
iframe
swf
html5
externalOynatıcı davranışı:
- Oyun, kullanıcı Oyunu Başlat demeden yüklenmez.
- Önce kapak görseli ve başlatma aksiyonu gösterilir.
iframevehtml5oyunlar kontrollü iframe ile açılır.swfoyunlar Ruffle ile oynatılır.externaloyunlarda gömme mümkün değilse dış bağlantı aksiyonu sunulur.- Admin preview, oyun yayına alınmadan önce test etmeye izin verir.
- Admin rotaları oturum ve yetki kontrolüyle korunur.
- Supabase RLS kuralları ordinary user ile admin işlemlerini ayırır.
- Yorum yazma için giriş gerekir.
- Yorum moderasyonu zorunludur.
- Reklam kodu sadece admin tarafından düzenlenir.
- Import edilen ham HTML public tarafta render edilmez.
- iframe URL'leri ve SVG ikon girdileri doğrulanır/sanitize edilir.
- Secret değerler repo içine commit'lenmez.
Reklamlar slot bazlıdır:
<AdSlot slotKey="game_page_below_player" />Başlıca slotlar:
homepage_top_banner
homepage_between_sections
sidebar_top
sidebar_middle
game_page_top
game_page_below_player
game_page_before_comments
category_page_top
search_results_top
mobile_sticky_bottomMobil sticky reklamlar oyun oynatıcı aktifken kullanıcı deneyimini bozmayacak şekilde yönetilmelidir.
Production deploy main branch'e push veya merge sonrası GitHub Actions ile tetiklenir.
Gerekli GitHub Actions secret'ları:
VPS_HOST
VPS_USER
VPS_SSH_PRIVATE_KEY
VPS_SSH_KNOWN_HOSTS
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
SUPABASE_SERVICE_ROLE_KEYBot koruma, obje deposu/CDN, AI sağlayıcısı ve diğer runtime secret'ları sunucuda /opt/boloyun/.env.production içinde tutulur. GitHub Actions image'i build eder, VPS'ye yükler ve deploy scriptini çalıştırır.
SUPABASE_SERVICE_ROLE_KEY image katmanına yazılmaz; build sırasında yalnız BuildKit secret mount ile geçici olarak erişilir ve production runtime değeri VPS .env.production dosyasından okunur.
Deploy sonrası temel doğrulama:
curl -sS -I https://boloyun.com/ | grep -Ei 'HTTP/|server:|location:'
curl -sS -I https://www.boloyun.com/ | grep -Ei 'HTTP/|server:|location:'Beklenen sonuç:
https://boloyun.com/ -> 200
https://www.boloyun.com/ -> https://boloyun.com yönlendirmesi
server -> nginxBir değişiklik tamamlandığında:
- Değişikliği odaklı tut.
- Diff'i baştan sona gözden geçir.
- Uygun kontrolleri çalıştır.
- Secret,
.env.local, build çıktısı veya geçici dosya commit'leme. - Migration gerekiyorsa yeni migration dosyasını kodla birlikte commit'le.
- Production değişikliklerini
mainbranch'e bilinçli push/merge ile ulaştır. - Deploy sonrası canlı route'u doğrula.
Uygulama değişikliklerinde varsayılan kontrol seti:
npx -y pnpm@11.7.0 typecheck
npx -y pnpm@11.7.0 lint
npx -y pnpm@11.7.0 test
npx -y pnpm@11.7.0 buildDokümantasyon-only değişikliklerde en azından diff ve whitespace kontrolü yapılmalıdır:
git diff --checkBu repo Bol Oyun projesinin kaynak kodudur. Yayın, deploy ve üretim erişimleri proje sahibinin kontrolündedir.