9–10 Ekim oturumlarının commit'lenmemiş işi tek parça alındı (raporlar: docs/ekip-raporlari/2026-10-09, 2026-10-10): - Landing deneyim dili 1. dalga: sayfa geçişi (ViewTransition), piksel morf/şerit, sorun sahneleri, adım akışı, sayan sayı, mobil menü, adım göstergesi, logoya tepki; DESIGN.md §11 ve AGENTS.md kuralları, tasarım denetimine yeni kurallar - Tema: tema ikonu, D kısayolu, tema geçişi - PWA: manifest.ts ve ikonlar - Danışman: revizyon niyet modeli (OPENROUTER_NIYET_MODEL), sohbet geçmişi, soru API'si - /listem ve /sonuc tadımlığı bileşen denetimi düzeltmeleri - eslint: .venv-tts/ yok sayılır tsc, eslint ve tasarım denetimi sıfır hata. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
101 lines
4.9 KiB
YAML
101 lines
4.9 KiB
YAML
name: Deploy
|
||
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
|
||
jobs:
|
||
deploy:
|
||
runs-on: ubuntu-latest
|
||
container:
|
||
image: catthehacker/ubuntu:act-latest
|
||
steps:
|
||
- name: Kaynak kodu çek
|
||
uses: actions/checkout@v4
|
||
|
||
- name: .env.production oluştur
|
||
run: |
|
||
cat > .env.production <<'EOF'
|
||
BETTER_AUTH_SECRET=${{ secrets.BETTER_AUTH_SECRET }}
|
||
BETTER_AUTH_URL=${{ secrets.BETTER_AUTH_URL }}
|
||
# Ödeme callback/yönlendirme kökü. Public önekli DEĞİL: build'e değil
|
||
# runtime'a geçmesi gerekiyor (bkz. src/lib/app-url.ts). Secret adı
|
||
# geçmişten NEXT_PUBLIC_APP_URL, değeri aynı https kök adres.
|
||
APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL }}
|
||
GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}
|
||
GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}
|
||
RESEND_API_KEY=${{ secrets.RESEND_API_KEY }}
|
||
EMAIL_FROM=${{ secrets.EMAIL_FROM }}
|
||
# İsteğe bağlı: secret yoksa boş gelir → kod destek@kolaytercih.com'a düşer.
|
||
EMAIL_REPLY_TO=${{ secrets.EMAIL_REPLY_TO }}
|
||
IYZICO_API_KEY=${{ secrets.IYZICO_API_KEY }}
|
||
IYZICO_SECRET_KEY=${{ secrets.IYZICO_SECRET_KEY }}
|
||
IYZICO_BASE_URL=${{ secrets.IYZICO_BASE_URL }}
|
||
OPENROUTER_API_KEY=${{ secrets.OPENROUTER_API_KEY }}
|
||
OPENROUTER_MODEL=${{ secrets.OPENROUTER_MODEL }}
|
||
# İsteğe bağlı: sohbetten liste revizyonu niyet çıkarımının modeli
|
||
# (src/lib/ai/revizyon-niyeti.ts). Secret yoksa boş gelir → rapor
|
||
# modeli kullanılır. Ölçüm 10 Eki 2026: google/gemini-3.1-flash-lite
|
||
# tek sağlayıcı, p90 1,9 sn, 42/44 kural doğru (deepseek p90 5-15 sn).
|
||
OPENROUTER_NIYET_MODEL=${{ secrets.OPENROUTER_NIYET_MODEL }}
|
||
# İsteğe bağlı: reasoning_effort ("none" varsayılan; bazı modeller
|
||
# "none"ı reddeder → "minimal"/"low", "yok" alanı göndermez).
|
||
AI_REASONING_EFFORT=${{ secrets.AI_REASONING_EFFORT }}
|
||
# İsteğe bağlı: danışman çıktı denetimi (src/lib/ai/jev.ts). Secret
|
||
# yoksa boş gelir → denetim atlanır, danışman aynen çalışır.
|
||
TYPESAFE_API_KEY=${{ secrets.TYPESAFE_API_KEY }}
|
||
# Sunucu tarafı Rybbit olayları (odeme_tamamlandi, giris_basarili —
|
||
# src/lib/analitik-sunucu.ts). Üçünden biri boşsa gönderim no-op.
|
||
RYBBIT_HOST=${{ secrets.RYBBIT_HOST }}
|
||
RYBBIT_SITE_ID=${{ secrets.RYBBIT_SITE_ID }}
|
||
RYBBIT_API_KEY=${{ secrets.RYBBIT_API_KEY }}
|
||
EOF
|
||
|
||
# BuildKit'te "docker build --memory" YOK SAYILIR (moby/buildkit#1362);
|
||
# gerçek sınır ancak buildkitd'yi kendi cgroup'u olan bir container'da
|
||
# (buildx docker-container driver) koşturarak konur. Böylece build OOM
|
||
# olursa yalnızca builder container'ı ölür — uygulama + Gitea ayakta kalır
|
||
# ve adım 35-90 dk sessiz kilitlenme yerine hızlı, görünür hata verir.
|
||
#
|
||
# Sınırlar container İLK oluşturulduğunda donar; değerleri değiştirmek için
|
||
# önce: docker buildx rm sinirli && docker rm -f buildx_buildkit_sinirli0
|
||
- name: Sınırlı builder hazırla
|
||
run: |
|
||
cat > buildkitd.toml <<'EOF'
|
||
[worker.oci]
|
||
enabled = true
|
||
max-parallelism = 1
|
||
EOF
|
||
# Act container'ı her koşuda sıfırdan geldiği için client kaydı hep
|
||
# yeniden oluşturulur; host'taki buildx_buildkit_sinirli0 container'ı
|
||
# (ve build cache'i) varsa bootstrap'ta aynen yeniden kullanılır.
|
||
docker buildx create --name sinirli \
|
||
--driver docker-container \
|
||
--driver-opt memory=2200m \
|
||
--driver-opt memory-swap=4200m \
|
||
--driver-opt cpu-quota=150000 \
|
||
--buildkitd-config ./buildkitd.toml \
|
||
2>/dev/null || true
|
||
docker buildx inspect sinirli --bootstrap >/dev/null
|
||
|
||
- name: Build (sınırlı builder)
|
||
run: |
|
||
docker compose -p kolaytercih build --builder sinirli
|
||
# docker-container driver'da imajın daemon'a --load ile düştüğünü doğrula;
|
||
# düşmediyse aynı cache'ten yeniden build edip elle yükle.
|
||
docker image inspect kolaytercih-app >/dev/null 2>&1 || \
|
||
docker buildx build --builder sinirli --load -t kolaytercih-app .
|
||
|
||
- name: Deploy
|
||
run: docker compose -p kolaytercih up -d --no-build --remove-orphans
|
||
|
||
- name: Temizlik (başarısız build'de de çalışır)
|
||
if: always()
|
||
run: |
|
||
docker image prune -f || true
|
||
# sinirli builder'ın cache'ini 4 GB'ta tut (flag adı buildx sürümüne göre değişti)
|
||
docker buildx prune --builder sinirli -f --max-used-space 4gb 2>/dev/null || \
|
||
docker buildx prune --builder sinirli -f --keep-storage 4gb || true
|
||
# eski varsayılan-builder cache artıkları
|
||
docker builder prune -f --filter "until=72h" || true
|