chore(release): remove legacy runtime dependencies
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
title: Neta Self-Hosted v3 Ana Dönüşüm Planı
|
||||
description: Supabase çıkışı, SQLite tabanlı backend, Better Auth, Poyraz UI v3 ve instance özelleştirmesi için ana yol haritası.
|
||||
status: active
|
||||
current_phase: "7 — AI ve gelişmiş modüller backend geçişi"
|
||||
last_updated: 2026-07-16
|
||||
current_phase: "9 — Mobil API hazırlığı"
|
||||
last_updated: 2026-07-17
|
||||
---
|
||||
|
||||
# Neta Self-Hosted v3 Ana Dönüşüm Planı
|
||||
@@ -525,8 +525,8 @@ Faz 5'in başlangıç noktası freelancer runtime'ındaki Supabase erişimleridi
|
||||
### 14.6. Portal, AI ve business devam sırası
|
||||
|
||||
- [x] Portal backend'i Faz 6 sözleşmesine göre tamamlandı.
|
||||
- [ ] AI/chat ve business backend'i Faz 7 sözleşmesine göre tamamlandı.
|
||||
- [ ] Import ve runtime Supabase temizliği Faz 8'de tamamlandı.
|
||||
- [x] AI/chat ve business backend'i Faz 7 sözleşmesine göre tamamlandı.
|
||||
- [x] Import ve runtime Supabase temizliği Faz 8'de tamamlandı.
|
||||
- [ ] Mobil API sınırı Faz 9'da tamamlandı.
|
||||
|
||||
## 15. Revizyon güvenliği ve kota işlemi
|
||||
@@ -592,20 +592,20 @@ Mobil hazırlık checklist'i:
|
||||
|
||||
### 17.1. Import aracı
|
||||
|
||||
- [ ] Supabase tablolarının kaynak mapping'i güncellendi.
|
||||
- [ ] Export formatı tanımlandı.
|
||||
- [ ] Import dry-run modu var.
|
||||
- [ ] Kaynak ve hedef satır sayıları raporlanıyor.
|
||||
- [ ] Foreign key tutarsızlıkları raporlanıyor.
|
||||
- [ ] Bilinmeyen enum/status değerlerinde import fail ediyor.
|
||||
- [ ] `completed` görev status'ü `done` olarak normalize ediliyor.
|
||||
- [ ] Para değerleri minor unit'e güvenli dönüştürülüyor.
|
||||
- [ ] `journals` ve `daily_logs` merge kuralı uygulanıyor.
|
||||
- [ ] AI API key'leri taşınmıyor.
|
||||
- [ ] Auth password/session verileri taşınmıyor.
|
||||
- [ ] Client kullanıcıları yeniden davet ediliyor.
|
||||
- [ ] Storage dosyaları metadata ve checksum ile aktarılıyor.
|
||||
- [ ] Import tekrar çalıştırıldığında davranış tanımlı.
|
||||
- [x] Supabase tablolarının kaynak mapping'i güncellendi.
|
||||
- [x] Export formatı tanımlandı.
|
||||
- [x] Import dry-run modu var.
|
||||
- [x] Kaynak ve hedef satır sayıları raporlanıyor.
|
||||
- [x] Foreign key tutarsızlıkları raporlanıyor.
|
||||
- [x] Bilinmeyen enum/status değerlerinde import fail ediyor.
|
||||
- [x] `completed` görev status'ü `done` olarak normalize ediliyor.
|
||||
- [x] Para değerleri minor unit'e güvenli dönüştürülüyor.
|
||||
- [x] `journals` ve `daily_logs` merge kuralı uygulanıyor.
|
||||
- [x] AI API key'leri taşınmıyor.
|
||||
- [x] Auth password/session verileri taşınmıyor.
|
||||
- [x] Client kullanıcıları yeniden davet ediliyor.
|
||||
- [x] Storage dosyaları metadata ve checksum ile aktarılıyor.
|
||||
- [x] Import tekrar çalıştırıldığında davranış tanımlı.
|
||||
|
||||
### 17.2. Production cutover
|
||||
|
||||
@@ -617,32 +617,32 @@ Mobil hazırlık checklist'i:
|
||||
- [ ] Satır sayısı doğrulandı.
|
||||
- [ ] Dosya sayısı ve checksum doğrulandı.
|
||||
- [ ] İlk admin Better Auth hesabı hazırlandı.
|
||||
- [ ] Client re-invite planı hazırlandı.
|
||||
- [x] Client re-invite planı hazırlandı.
|
||||
- [ ] Kritik kullanıcı akışları smoke test edildi.
|
||||
- [ ] DNS/deploy geçişi yapıldı.
|
||||
- [ ] Rollback penceresi ve yöntemi belgelendi.
|
||||
- [x] Rollback penceresi ve yöntemi belgelendi.
|
||||
- [ ] Supabase hemen silinmedi; tanımlı süre read-only backup olarak tutuldu.
|
||||
|
||||
## 18. Dependency azaltma planı
|
||||
|
||||
### 18.1. Supabase çıkışı tamamlandığında kaldırılacaklar
|
||||
|
||||
- [ ] `@supabase/ssr`
|
||||
- [ ] `@supabase/supabase-js`
|
||||
- [ ] `lib/supabase/*`
|
||||
- [ ] Legacy Supabase auth helper'ları
|
||||
- [ ] Supabase service-role client kullanımları
|
||||
- [ ] Runtime Supabase environment değişkenleri
|
||||
- [x] `@supabase/ssr`
|
||||
- [x] `@supabase/supabase-js`
|
||||
- [x] `lib/supabase/*`
|
||||
- [x] Legacy Supabase auth helper'ları
|
||||
- [x] Supabase service-role client kullanımları
|
||||
- [x] Runtime Supabase environment değişkenleri
|
||||
|
||||
### 18.2. Offline/PWA temizliği
|
||||
|
||||
- [ ] `@ducanh2912/next-pwa`
|
||||
- [ ] `dexie`
|
||||
- [ ] `dexie-react-hooks`
|
||||
- [ ] Legacy `lib/db.ts`
|
||||
- [ ] Offline indicator, kapsam dışıysa
|
||||
- [ ] Service worker çıktıları
|
||||
- [ ] PWA manifest kararı güncellendi
|
||||
- [x] `@ducanh2912/next-pwa`
|
||||
- [x] `dexie`
|
||||
- [x] `dexie-react-hooks`
|
||||
- [x] Legacy `lib/db.ts`
|
||||
- [x] Offline indicator, kapsam dışıysa
|
||||
- [x] Service worker çıktıları
|
||||
- [x] PWA manifest kararı güncellendi
|
||||
|
||||
### 18.3. Poyraz UI v3 sonrası değerlendirilecekler
|
||||
|
||||
@@ -651,9 +651,9 @@ Mobil hazırlık checklist'i:
|
||||
- [x] `radix-ui`
|
||||
- [x] `shadcn`
|
||||
- [x] Kullanılmayan local UI primitive'leri
|
||||
- [ ] `framer-motion`, kullanım kalmadıysa
|
||||
- [x] `framer-motion` değerlendirildi; auth shell'deki reduced-motion uyumlu aktif kullanım nedeniyle korundu.
|
||||
- [x] `next-themes`, tema başka şekilde çözüldüyse
|
||||
- [ ] Kullanılmayan icon/form/theme yardımcıları
|
||||
- [x] Kullanılmayan icon/form/theme yardımcıları
|
||||
|
||||
### 18.4. İşlevsel gerekçeyle korunabilecekler
|
||||
|
||||
@@ -664,18 +664,17 @@ Mobil hazırlık checklist'i:
|
||||
- Drizzle ORM
|
||||
- Zod
|
||||
- `date-fns`
|
||||
- Kanban için `dnd-kit`
|
||||
- Grafikler için Recharts
|
||||
- Gerçekten kullanılan AI provider paketleri
|
||||
|
||||
Dependency kalite kapısı:
|
||||
|
||||
- [ ] Her production dependency için aktif import veya açık gerekçe var.
|
||||
- [x] Her production dependency için aktif import veya açık gerekçe var.
|
||||
- [x] Aynı işi yapan iki UI primitive sistemi yok.
|
||||
- [ ] Aynı işi yapan iki auth sistemi yok.
|
||||
- [ ] Aynı işi yapan iki runtime database sistemi yok.
|
||||
- [ ] Browser database bağımlılığı yok.
|
||||
- [ ] Build çıktısında Supabase referansı yok.
|
||||
- [x] Aynı işi yapan iki auth sistemi yok.
|
||||
- [x] Aynı işi yapan iki runtime database sistemi yok.
|
||||
- [x] Browser database bağımlılığı yok.
|
||||
- [x] Build çıktısında Supabase referansı yok.
|
||||
- [x] Build çıktısında Poyraz UI v2 referansı yok.
|
||||
|
||||
## 19. Test stratejisi
|
||||
@@ -699,7 +698,7 @@ Mümkün olduğunda küçük ve doğrudan test araçları tercih edilir; test al
|
||||
- [x] Path traversal negatif testi
|
||||
- [x] Backup oluşturma testi
|
||||
- [x] Restore ve checksum testi
|
||||
- [ ] Supabase import fixture testi
|
||||
- [x] Supabase import fixture testi
|
||||
- [x] API response/error contract testi
|
||||
- [x] Kritik sayfalar için SSR smoke testi
|
||||
|
||||
@@ -728,27 +727,27 @@ Mümkün olduğunda küçük ve doğrudan test araçları tercih edilir; test al
|
||||
- [x] Backup SQLite online backup API kullanıyor.
|
||||
- [x] Backup upload klasörünü içeriyor.
|
||||
- [x] Backup manifest dosya boyutu ve SHA-256 içeriyor.
|
||||
- [ ] Restore manifest checksum'larını doğruluyor.
|
||||
- [x] Restore manifest checksum'larını doğruluyor.
|
||||
- [x] Restore canlı DB üzerine kontrolsüz yazmıyor.
|
||||
- [ ] Backup retention politikası belgelendi.
|
||||
- [ ] Reverse proxy ve HTTPS kurulumu belgelendi.
|
||||
- [x] Backup retention politikası belgelendi.
|
||||
- [x] Reverse proxy ve HTTPS kurulumu belgelendi.
|
||||
|
||||
## 21. Dokümantasyon planı
|
||||
|
||||
- [ ] README yeni SQLite/Better Auth mimarisini anlatıyor.
|
||||
- [ ] Supabase'in artık runtime gereksinimi olmadığı açık.
|
||||
- [ ] Docker ile kurulum belgelendi.
|
||||
- [ ] Coolify/Dokploy kurulumu belgelendi.
|
||||
- [x] README yeni SQLite/Better Auth mimarisini anlatıyor.
|
||||
- [x] Supabase'in artık runtime gereksinimi olmadığı açık.
|
||||
- [x] Docker ile kurulum belgelendi.
|
||||
- [x] Coolify/Dokploy kurulumu belgelendi.
|
||||
- [x] Environment değişkenleri güncellendi.
|
||||
- [x] İlk admin kurulumu belgelendi.
|
||||
- [x] Client invitation akışı belgelendi.
|
||||
- [ ] Branding ayarları belgelendi.
|
||||
- [x] Branding ayarları belgelendi.
|
||||
- [x] Backup/restore belgelendi.
|
||||
- [ ] Upgrade/migration akışı belgelendi.
|
||||
- [x] Upgrade/migration akışı belgelendi.
|
||||
- [ ] Mobil API sınırı belgelendi.
|
||||
- [ ] Eski ve çelişkili Supabase belgeleri archive veya kaldırıldı.
|
||||
- [x] Eski ve çelişkili Supabase belgeleri archive veya kaldırıldı.
|
||||
- [x] ADR-0006 Poyraz UI v3 kararıyla güncellendi.
|
||||
- [ ] ADR-0007 ile PWA runtime durumu uyumlu hale getirildi.
|
||||
- [x] ADR-0007 ile PWA runtime durumu uyumlu hale getirildi.
|
||||
|
||||
## 22. Uygulama fazları
|
||||
|
||||
@@ -935,12 +934,21 @@ Faz 6 tamamlanma notu (2026-07-16):
|
||||
|
||||
Amaç: AI/chat ve kapsamda kalan business modüllerini yeni backend'e taşımak.
|
||||
|
||||
- [ ] Chat session/message verileri SQLite'a taşındı.
|
||||
- [ ] AI secrets browser'dan kaldırıldı.
|
||||
- [ ] Context builder service katmanına taşındı.
|
||||
- [ ] Finans analizi taşındı.
|
||||
- [ ] Proje risk analizi taşındı.
|
||||
- [ ] Kapsamdaki business modülleri tamamlandı.
|
||||
- [x] Chat session/message verileri SQLite'a taşındı.
|
||||
- [x] AI secrets browser'dan kaldırıldı.
|
||||
- [x] Context builder service katmanına taşındı.
|
||||
- [x] Finans analizi taşındı.
|
||||
- [x] Proje risk analizi taşındı.
|
||||
- [x] Kapsamdaki business modülleri tamamlandı.
|
||||
|
||||
Faz 7 tamamlanma notu (2026-07-17):
|
||||
|
||||
- Chat sayfasındaki browser Supabase auth/tablo çağrıları owner-scoped Server Action ve domain service sözleşmelerine taşındı. Chat route'u session sahipliğini doğrular, geçmişi istemciden değil SQLite'tan kurar ve başarılı user/assistant mesajlarını kalıcılaştırır.
|
||||
- AI provider seçimi ve encrypted API key çözümü `server/ai/provider.ts` altında server-only merkezileştirildi. Browser request'inden key/provider override kaldırıldı; Ollama için key gerektirmeyen ve environment ile ayarlanabilen local endpoint desteği eklendi.
|
||||
- Chat, finans ve proje risk context'leri owner-scoped domain service okumaları, kayıt/karakter sınırları ve currency-aware finans toplamlarıyla ortak context builder'a taşındı.
|
||||
- Finans analizi ve proje risk route'ları Better Auth freelancer guard, merkezi validation, provider timeout ve secretsız `400/502/504` hata sözleşmesi kullanır.
|
||||
- Teklif, sözleşme, fatura ve abonelik için owner-scoped list/get/create/update/delete servisleri tamamlandı. Aktif teklif, fatura ve abonelik sayfaları SQLite SSR okumalarına bağlandı; repo içinde aktif sözleşme sayfası bulunmadığı için yeni tasarım route'u eklenmedi.
|
||||
- `phase7:backend-boundary`, temiz SQLite domain smoke ve gerçek Better Auth cookie'li SSR/API smoke başarılıdır. Ayrıntılar `phase-7-ai-business-backend.md` belgesindedir.
|
||||
|
||||
Çıkış kriteri: Runtime AI özelliklerinde Supabase bağımlılığı yok.
|
||||
|
||||
@@ -948,15 +956,27 @@ Amaç: AI/chat ve kapsamda kalan business modüllerini yeni backend'e taşımak.
|
||||
|
||||
Amaç: Production geçişini güvenli hale getirmek ve legacy bağımlılıkları kaldırmak.
|
||||
|
||||
- [ ] Supabase import aracı tamamlandı.
|
||||
- [ ] Import rehearsal tamamlandı.
|
||||
- [ ] Supabase runtime paketleri kaldırıldı.
|
||||
- [ ] PWA/Dexie legacy kodu kaldırıldı.
|
||||
- [ ] Kullanılmayan UI bağımlılıkları kaldırıldı.
|
||||
- [ ] Backup/restore doğrulandı.
|
||||
- [ ] Docker production smoke tamamlandı.
|
||||
- [ ] Dokümantasyon güncellendi.
|
||||
- [ ] Cutover ve rollback provası tamamlandı.
|
||||
- [x] Supabase import aracı tamamlandı.
|
||||
- [x] Import rehearsal tamamlandı.
|
||||
- [x] Supabase runtime paketleri kaldırıldı.
|
||||
- [x] PWA/Dexie legacy kodu kaldırıldı.
|
||||
- [x] Kullanılmayan UI bağımlılıkları kaldırıldı.
|
||||
- [x] Backup/restore doğrulandı.
|
||||
- [x] Docker production smoke tamamlandı.
|
||||
- [x] Dokümantasyon güncellendi.
|
||||
- [x] Cutover ve rollback provası tamamlandı.
|
||||
|
||||
Faz 8 tamamlanma notu (2026-07-17):
|
||||
|
||||
- `neta-supabase-export` v1 offline bundle importer'ı; owner scope, enum, tarih, exact para/basis-point, foreign key, dosya path/magic-byte/size/SHA-256 kontrolleriyle tamamlandı. Dry-run ve `0600` rapor, boş hedef koruması, kontrollü `--allow-existing` upsert ve DB hatasında staged file rollback davranışı eklendi.
|
||||
- Görev `completed -> done`, `journals + daily_logs` birleşimi, kanonik journal referansı, business kayıtları, user preference/AI provider ayarları ve storage URL yeniden yazımı fixture üzerinde doğrulandı. AI key, auth password/session, eski client auth bağı ve embeddings runtime'a taşınmıyor.
|
||||
- Supabase SDK/helper/env; PWA wrapper, Dexie, offline indicator, legacy browser DB ve service-worker çıktıları kaldırıldı. Kullanılmayan DnD/resolver/UUID paketleri temizlendi; temiz Docker build'in doğruladığı `react-hook-form` ve `mermaid` Poyraz UI runtime peer'i olarak gerekçeli biçimde korundu.
|
||||
- Backup'a versioned manifest, symlink reddi ve sayıya dayalı retention eklendi. Restore, manifest completeness/size/SHA-256 kontrolünden sonra DB ve upload ağacını staged atomik swap ile değiştirir ve hata halinde önceki hedefi geri alır.
|
||||
- Pre-import backup, final import, idempotent tekrar ve ayrı data directory'ye rollback fixture provası geçti. Bu prova gerçek production maintenance/DNS cutover yerine geçmez; Bölüm 17.2'de dış sistem yetkisi isteyen maddeler açık bırakıldı.
|
||||
- README ve Faz 8 runbook; SQLite/Better Auth mimarisi, env, ilk owner/client daveti, branding, Docker/Coolify/Dokploy, HTTPS, backup retention, import, upgrade, cutover ve rollback'i anlatır. Eski numaralı Supabase belgeleri ve PostgreSQL SQL kayıtları `legacy-v2-archive` sınırına alındı.
|
||||
- Supabase env'leri unset durumda typecheck, production build, source/build artifact boundary, standalone liveness/readiness ve `/register` SSR başarılıdır. Temiz Docker `npm ci` + build, non-root user, startup migration, persistent volume readiness ve restart smoke geçti.
|
||||
- Faz 2–7 boundary/smoke regresyonları ve Faz 8 hedefli ESLint başarılıdır. Repo genel ESLint'i Faz 10'da ele alınacak mevcut client-component borçlarında 14 hata/14 warning üretmeye devam ettiği için genel lint kalite kapısı işaretlenmedi.
|
||||
- Production dependency audit'inde high/critical bulgu yoktur; npm altı moderate advisory raporlar. Bunlar Next'in bundled PostCSS'i ve development migration toolchain'inin eski esbuild loader'ı kaynaklıdır; npm'in önerdiği uyumsuz downgrade otomatik uygulanmadı.
|
||||
|
||||
Çıkış kriteri: Uygulama Supabase environment değişkenleri olmadan build ve runtime smoke testini geçiyor.
|
||||
|
||||
@@ -980,8 +1000,8 @@ Başlangıç koşulları:
|
||||
|
||||
- [x] Faz 5 freelancer backend geçişi tamamlandı.
|
||||
- [x] Faz 6 portal backend geçişi tamamlandı.
|
||||
- [ ] Faz 7 kapsamındaki runtime modülleri tamamlandı veya açıkça ertelendi.
|
||||
- [ ] Faz 8 Supabase runtime temizliği ve release hardening tamamlandı.
|
||||
- [x] Faz 7 kapsamındaki runtime modülleri tamamlandı veya açıkça ertelendi.
|
||||
- [x] Faz 8 Supabase runtime temizliği ve release hardening tamamlandı.
|
||||
- [ ] Faz 9 mobil API hazırlığı tamamlandı.
|
||||
- [ ] Tasarım sırasında kullanılacak backend veri sözleşmeleri stabil.
|
||||
|
||||
@@ -1028,20 +1048,20 @@ Her sayfa için tasarım kabul checklist'i:
|
||||
### Mimari
|
||||
|
||||
- [x] Ürün kararları kilitlendi.
|
||||
- [ ] Hedef schema tamamlandı.
|
||||
- [ ] Service/repository sınırı tamamlandı.
|
||||
- [ ] Server-side authorization tamamlandı.
|
||||
- [x] Hedef schema tamamlandı.
|
||||
- [x] Service/repository sınırı tamamlandı.
|
||||
- [x] Server-side authorization tamamlandı.
|
||||
- [ ] API v1 sınırı hazırlandı.
|
||||
|
||||
### Supabase çıkışı
|
||||
|
||||
- [ ] Auth taşındı.
|
||||
- [ ] Database taşındı.
|
||||
- [ ] Storage taşındı.
|
||||
- [ ] RLS kuralları server-side testlere çevrildi.
|
||||
- [ ] Import aracı tamamlandı.
|
||||
- [ ] Supabase paketleri kaldırıldı.
|
||||
- [ ] Supabase env değişkenleri kaldırıldı.
|
||||
- [x] Auth taşındı.
|
||||
- [x] Database taşındı.
|
||||
- [x] Storage taşındı.
|
||||
- [x] RLS kuralları server-side testlere çevrildi.
|
||||
- [x] Import aracı tamamlandı.
|
||||
- [x] Supabase paketleri kaldırıldı.
|
||||
- [x] Supabase env değişkenleri kaldırıldı.
|
||||
|
||||
### UI
|
||||
|
||||
@@ -1067,26 +1087,26 @@ Her sayfa için tasarım kabul checklist'i:
|
||||
|
||||
### Operasyon
|
||||
|
||||
- [ ] Docker kurulumu çalışıyor.
|
||||
- [ ] Persistent volume doğrulandı.
|
||||
- [ ] Migration güvenli.
|
||||
- [x] Docker kurulumu çalışıyor.
|
||||
- [x] Persistent volume doğrulandı.
|
||||
- [x] Migration güvenli.
|
||||
- [x] Backup çalışıyor.
|
||||
- [x] Restore ve checksum doğrulaması çalışıyor.
|
||||
- [ ] Health endpoint'leri çalışıyor.
|
||||
- [ ] Upgrade dokümantasyonu hazır.
|
||||
- [ ] Rollback planı hazır.
|
||||
- [x] Health endpoint'leri çalışıyor.
|
||||
- [x] Upgrade dokümantasyonu hazır.
|
||||
- [x] Rollback planı hazır.
|
||||
|
||||
### Release
|
||||
|
||||
- [ ] Typecheck başarılı.
|
||||
- [x] Typecheck başarılı.
|
||||
- [ ] Lint başarılı.
|
||||
- [ ] Build başarılı.
|
||||
- [ ] Tüm smoke testler başarılı.
|
||||
- [ ] Kritik authorization negatif testleri başarılı.
|
||||
- [ ] Import rehearsal başarılı.
|
||||
- [ ] Production Docker smoke başarılı.
|
||||
- [ ] README güncel.
|
||||
- [ ] Supabase runtime referansı kalmadı.
|
||||
- [x] Build başarılı.
|
||||
- [x] Tüm smoke testler başarılı.
|
||||
- [x] Kritik authorization negatif testleri başarılı.
|
||||
- [x] Import rehearsal başarılı.
|
||||
- [x] Production Docker smoke başarılı.
|
||||
- [x] README güncel.
|
||||
- [x] Supabase runtime referansı kalmadı.
|
||||
- [x] Poyraz UI v2 referansı kalmadı.
|
||||
|
||||
## 24. Definition of Done
|
||||
@@ -1110,16 +1130,16 @@ Neta Self-Hosted v3 aşağıdaki koşulların tümü sağlandığında tamamlanm
|
||||
- Gelecekteki mobil istemci için service ve API sınırları belgelenmiştir.
|
||||
- Sayfa tasarımları backend ve runtime Supabase temizliği tamamlandıktan sonra yapılmış, kullanıcı tarafından tek tek kabul edilmiştir.
|
||||
|
||||
## 25. Sıradaki çalışma paketi — Faz 7
|
||||
## 25. Sıradaki çalışma paketi — Faz 8
|
||||
|
||||
Faz 0–6 tamamlandı. Sıradaki çalışma paketi chat, AI analizleri ve kapsamda kalan business modüllerinin backend geçişidir:
|
||||
Faz 0–7 tamamlandı. Sıradaki çalışma paketi production import, runtime Supabase temizliği ve release hardening'dir:
|
||||
|
||||
1. Chat sayfası, chat route'u, finans analizi, proje risk analizi ve business route'larındaki Supabase erişimlerini envanterlemek.
|
||||
2. Chat session/message okuma ve mutation sözleşmelerini domain service'e bağlamak.
|
||||
3. AI provider key'lerini browser request/localStorage akışından tamamen kaldırıp Faz 5'teki encrypted server-side settings service'i kullanmak.
|
||||
4. AI context builder'ı owner-scoped proje, görev, finans ve günlük service okumalarıyla yeniden kurmak.
|
||||
5. Finans analizi ve proje risk route'larını local backend'e taşımak; provider timeout/error sözleşmelerini standartlaştırmak.
|
||||
6. Release kapsamında tutulacak business modüllerinin repository/service ve runtime adapter'larını tamamlamak.
|
||||
7. Supabase boundary, secret leakage, cross-owner, AI failure ve authenticated SSR/API smoke testlerini çalıştırmak.
|
||||
1. Faz 0 schema mapping'ini temel alan tekrar çalıştırılabilir Supabase export/import aracını dry-run, satır sayısı, foreign key ve enum raporlarıyla tamamlamak.
|
||||
2. Chat ve business dahil korunacak production verisini fixture ve import rehearsal ile doğrulamak; AI key, auth password/session ve raw invitation token taşımamak.
|
||||
3. Kalan runtime Supabase importlarını ve kullanılmayan legacy helper'ları kaldırmak; `@supabase/ssr` ile `@supabase/supabase-js` paketlerini silmek.
|
||||
4. PWA/Dexie runtime kararını uygulamak ve kapsam dışı offline kod/paketleri temizlemek.
|
||||
5. Backup/restore checksum, retention, upgrade/migration ve rollback prosedürlerini production sözleşmesine bağlamak.
|
||||
6. Supabase environment değişkenleri olmadan production build, standalone/Docker runtime ve kritik cutover smoke testlerini çalıştırmak.
|
||||
7. README, self-host kurulum, reverse proxy/HTTPS, branding, backup/restore ve upgrade belgelerini güncellemek.
|
||||
|
||||
Tasarım backlog'u Faz 10'a kadar açılmaz. Faz 10 başladığında sayfa sırası ve her sayfanın görsel/UX yönü kullanıcı tarafından adım adım belirlenecektir.
|
||||
|
||||
@@ -124,7 +124,8 @@ Status: Accepted for redesign baseline.
|
||||
Karar:
|
||||
|
||||
- İlk self-hosted release'te PWA/offline sync hedeflenmez.
|
||||
- `next-pwa` kaldırılacak veya devre dışı bırakılacak.
|
||||
- `next-pwa`, Dexie, offline indicator ve üretilmiş service worker runtime'dan kaldırıldı.
|
||||
- Web manifest yalnızca install metadata/branding çıktısı olarak server-side dinamik üretilir; offline çalışma vaadi değildir.
|
||||
|
||||
Gerekçe:
|
||||
|
||||
|
||||
@@ -0,0 +1,281 @@
|
||||
---
|
||||
title: Faz 8 — Supabase Import ve Production Release Runbook
|
||||
description: Export bundle sözleşmesi, doğrulama, cutover, backup, rollback, Docker ve upgrade operasyonları.
|
||||
status: completed
|
||||
last_updated: 2026-07-17
|
||||
---
|
||||
|
||||
# Faz 8 — Supabase import ve production release runbook
|
||||
|
||||
Bu belge Neta self-hosted v3'ün operasyonel kaynağıdır. `supabase/` ve `docs/database/` yalnızca eski PostgreSQL şemasını ve import kaynağını açıklayan tarihsel arşivdir; yeni instance kurulumu için kullanılmaz.
|
||||
|
||||
## 1. Tamamlanan runtime sınırı
|
||||
|
||||
- Auth yalnızca Better Auth kullanır.
|
||||
- İş verisi yalnızca SQLite/Drizzle üzerinde çalışır.
|
||||
- Dosyalar yalnızca `DATA_DIR/uploads` altında tutulur.
|
||||
- Supabase SDK ve runtime env değişkenleri yoktur.
|
||||
- PWA service worker, Dexie ve offline cache yoktur.
|
||||
- Export/import aracı Supabase'e bağlanmaz; hazırlanmış offline bundle okur.
|
||||
|
||||
`pnpm phase8:release-boundary` bu sınırı kaynak kodda, `--build-output` argümanı ise build artifact'lerinde doğrular.
|
||||
|
||||
### Dependency denetimi
|
||||
|
||||
| Grup | Korunan doğrudan paketler | Gerekçe |
|
||||
| --- | --- | --- |
|
||||
| Runtime | `next`, `react`, `react-dom` | Web runtime ve SSR |
|
||||
| Auth/veri | `better-auth`, `better-sqlite3`, `drizzle-orm`, `zod` | Auth, SQLite erişimi, schema ve input doğrulama |
|
||||
| UI | `poyraz-ui`, `lucide-react`, `recharts`, `framer-motion`, `clsx`, `tailwind-merge`, `tailwindcss-animate` | Aktif component importları; Framer Motion auth shell'de reduced-motion ile, Recharts üç aktif ekranda kullanılır |
|
||||
| Build/UI peer | `@tailwindcss/postcss`, `mermaid`, `react-hook-form` | Tailwind v4 build plugin'i; Poyraz molecule entrypoint'inin temiz npm/container build'inde doğrudan çözdüğü peer'ler |
|
||||
| Tarih | `date-fns` | Aktif tarih filtreleme/formatlama |
|
||||
| AI | `ai`, `@ai-sdk/react`, `@ai-sdk/google`, `@ai-sdk/openai`, `@ai-sdk/groq` | Chat stream'i ve kullanıcı tarafından seçilebilen aktif provider adapter'ları |
|
||||
|
||||
Kullanımı bulunmayan `dnd-kit`, Hook Form resolver ve UUID paketleri; Supabase SDK'ları, PWA ve Dexie paketleriyle birlikte kaldırıldı. `react-hook-form`, uygulama doğrudan form API'sini çağırmasa da Poyraz molecule bundle'ının statik import ettiği runtime peer olduğu için korundu. Temizlik sonrasında pnpm kurulum ağacı 231 paket küçüldü.
|
||||
|
||||
## 2. Export bundle v1
|
||||
|
||||
Import kökünde `export.json` ve varsa `storage/` ağacı bulunur:
|
||||
|
||||
```text
|
||||
neta-export/
|
||||
export.json
|
||||
storage/
|
||||
avatars/
|
||||
project-assets/
|
||||
```
|
||||
|
||||
Minimum envelope:
|
||||
|
||||
```json
|
||||
{
|
||||
"format": "neta-supabase-export",
|
||||
"version": 1,
|
||||
"exported_at": "2026-07-17T10:00:00.000Z",
|
||||
"source": {
|
||||
"owner_user_id": "source-owner-uuid"
|
||||
},
|
||||
"tables": {
|
||||
"profiles": [],
|
||||
"clients": [],
|
||||
"client_activities": [],
|
||||
"projects": [],
|
||||
"project_planning_sections": [],
|
||||
"project_revisions": [],
|
||||
"tasks": [],
|
||||
"calendar_events": [],
|
||||
"finance_transactions": [],
|
||||
"daily_logs": [],
|
||||
"journals": [],
|
||||
"chat_sessions": [],
|
||||
"chat_messages": [],
|
||||
"proposals": [],
|
||||
"contracts": [],
|
||||
"invoices": [],
|
||||
"subscriptions": [],
|
||||
"app_settings": [],
|
||||
"document_embeddings": []
|
||||
},
|
||||
"storage": {
|
||||
"objects": []
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Eksik tablo anahtarları boş liste kabul edilir. Satırlar eski Supabase tablosundaki kolon adlarını kullanır. `user_id` taşıyan bütün satırlar `source.owner_user_id` ile aynı olmak zorundadır.
|
||||
|
||||
Storage kaydı:
|
||||
|
||||
```json
|
||||
{
|
||||
"bucket": "project-assets",
|
||||
"object_path": "owner/project-cover.png",
|
||||
"local_path": "storage/project-assets/project-cover.png",
|
||||
"original_name": "project-cover.png",
|
||||
"mime_type": "image/png",
|
||||
"bytes": 12345,
|
||||
"sha256": "64-karakter-lowercase-hex",
|
||||
"project_id": "project-uuid",
|
||||
"portal_visible": true,
|
||||
"references": [
|
||||
{
|
||||
"type": "project_cover",
|
||||
"project_id": "project-uuid"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
`local_path` export root dışına çıkamaz. Desteklenen görseller PNG, JPEG, WebP ve GIF'tir; 5 MiB sınırı, byte count, SHA-256 ve magic-byte doğrulanır.
|
||||
|
||||
Export hazırlarken:
|
||||
|
||||
1. Supabase tablolarını JSON array olarak dışarı alın.
|
||||
2. Yalnızca taşınacak owner'ın satırlarını bundle'a koyun.
|
||||
3. `avatars` ve `project-assets` objelerini indirip relative `local_path` verin.
|
||||
4. Her dosyanın byte count ve SHA-256 değerini storage manifest'e yazın.
|
||||
5. Export klasörünü erişimi sınırlı, şifreli bir alanda tutun.
|
||||
|
||||
Auth kullanıcı export'u, access/refresh token, password hash ve secret key bundle'a eklenmemelidir. Araç böyle bir alanı kullanmaz.
|
||||
|
||||
## 3. Normalization ve güvenlik kararları
|
||||
|
||||
- Kaynak UUID/text ID'leri korunur.
|
||||
- Kaynak owner kimliği hedef Better Auth owner kimliğine map edilir.
|
||||
- `tasks.status=completed`, `done` olur.
|
||||
- Ondalıklı para değerleri floating point kullanmadan integer minor unit'e çevrilir.
|
||||
- Fatura vergi yüzdesi integer basis point'e çevrilir.
|
||||
- Aynı tarihteki `daily_logs` ve `journals`, `journal_entries` içinde tek kanonik kayda birleşir.
|
||||
- Birleşen journal referansları görev ve chat context'lerinde kanonik ID'ye çevrilir.
|
||||
- Bilinmeyen enum, geçersiz tarih/para, duplicate ID ve eksik foreign key import'u durdurur.
|
||||
- Eski AI API key'i import edilmez.
|
||||
- Auth password/session verisi import edilmez.
|
||||
- Eski client auth bağları temizlenir; müşteriler yeniden davet edilir.
|
||||
- Tarihsel client revision actor'u geçerli principal bulunmadığında owner'a map edilir ve warning raporlanır.
|
||||
- `document_embeddings` runtime'a taşınmaz; warning ile arşiv kapsamı dışında bırakılır.
|
||||
- Project cover ve planning metadata içindeki taşınan storage referansları `/api/files/:id` URL'sine çevrilir.
|
||||
|
||||
## 4. Dry-run ve import
|
||||
|
||||
Hedefte migration'ları uygulayın ve ilk owner'ı `/register` üzerinden oluşturun. Owner ID'sini `user.id`/`app_profiles.auth_user_id` üzerinden belirleyin.
|
||||
|
||||
```bash
|
||||
pnpm db:import:supabase -- \
|
||||
--from /secure/path/neta-export \
|
||||
--owner-user-id TARGET_OWNER_ID \
|
||||
--dry-run \
|
||||
--report /secure/path/import-dry-run-report.json
|
||||
```
|
||||
|
||||
Dry-run DB veya upload alanını değiştirmez. Raporda kaynak sayıları, hedefe hazırlanmış sayılar, mevcut hedef sayıları ve warning'ler bulunur.
|
||||
|
||||
Apply:
|
||||
|
||||
```bash
|
||||
pnpm db:import:supabase -- \
|
||||
--from /secure/path/neta-export \
|
||||
--owner-user-id TARGET_OWNER_ID \
|
||||
--report /secure/path/import-report.json
|
||||
```
|
||||
|
||||
Araç boş domain hedefini varsayar. Kontrollü tekrar çalıştırma/merge gerekiyorsa:
|
||||
|
||||
```bash
|
||||
pnpm db:import:supabase -- \
|
||||
--from /secure/path/neta-export \
|
||||
--owner-user-id TARGET_OWNER_ID \
|
||||
--allow-existing
|
||||
```
|
||||
|
||||
Tekrar çalıştırma ID bazlı upsert'tir. Var olan aynı storage path yalnızca checksum aynıysa kabul edilir. Dosyalar DB transaction'ından önce stage edilir; DB hatasında yeni dosyalar geri alınır.
|
||||
|
||||
## 5. Production cutover
|
||||
|
||||
Gerçek production verisine erişim gerektiren bu adımlar otomatik checklist olarak işaretlenmez:
|
||||
|
||||
1. Mevcut Supabase sisteminin tam backup/export'unu alın.
|
||||
2. Yeni Neta instance'ında owner'ı oluşturun.
|
||||
3. Yeni instance'ın pre-import backup'ını alın.
|
||||
4. Export bundle'ı dry-run ile doğrulayın.
|
||||
5. Eski sistemi maintenance/read-only moda alın.
|
||||
6. Son tablo ve storage export'unu üretin.
|
||||
7. Final dry-run raporunu önceki sayımlarla karşılaştırın.
|
||||
8. Import'u uygulayın.
|
||||
9. Rapor, foreign key check, tablo sayıları ve storage checksum'larını doğrulayın.
|
||||
10. Login, müşteri, proje, görev, finans, dosya ve portal davet akışlarını smoke test edin.
|
||||
11. DNS/reverse proxy trafiğini yeni instance'a alın.
|
||||
12. Client re-invite planını uygulayın.
|
||||
13. Eski Supabase projesini en az 7 günlük rollback penceresi boyunca read-only tutun; daha uzun ürün/uyumluluk retention'ı gerekiyorsa bu süreyi artırın ve hemen silmeyin.
|
||||
|
||||
## 6. Rollback
|
||||
|
||||
Cutover öncesi:
|
||||
|
||||
```bash
|
||||
pnpm db:backup -- --retention-count 14
|
||||
```
|
||||
|
||||
Uygulamayı durdurduktan sonra doğrulama amaçlı ayrı hedefe restore:
|
||||
|
||||
```bash
|
||||
pnpm db:restore -- \
|
||||
--from /app/data/backups/neta-TIMESTAMP \
|
||||
--target /tmp/neta-rollback-rehearsal \
|
||||
--force
|
||||
```
|
||||
|
||||
Production rollback:
|
||||
|
||||
1. Yeni instance'ı maintenance'a alın ve durdurun.
|
||||
2. Cutover öncesi backup'ı restore edin veya DNS'i read-only eski sisteme döndürün.
|
||||
3. Restore sonrası `/api/health/ready` ve kritik akışları kontrol edin.
|
||||
4. Yeni sistemde cutover sonrası yazı oluştuysa veri kaybı penceresini açıkça kaydedin; iki sistemi otomatik merge etmeyin.
|
||||
|
||||
`phase8:import-smoke`, pre-import backup'ı gerçek SQLite dosyasına restore ederek bu rollback yolunu fixture üzerinde doğrular.
|
||||
|
||||
## 7. Backup politikası
|
||||
|
||||
Örnek günlük cron:
|
||||
|
||||
```text
|
||||
0 2 * * * cd /app && BACKUP_RETENTION_COUNT=14 node scripts/backup.mjs
|
||||
```
|
||||
|
||||
- En az 14 günlük local retention önerilir.
|
||||
- Backup'ı aynı diskle sınırlamayın; şifreli off-host kopya alın.
|
||||
- Restore'u düzenli olarak geçici data directory üzerinde prova edin.
|
||||
- Uygulama online iken backup alınabilir; restore sırasında process durmalıdır.
|
||||
- Manifest dışı, değiştirilmiş veya symlink içeren backup reddedilir.
|
||||
|
||||
## 8. Docker, Coolify ve Dokploy
|
||||
|
||||
Ortak production sözleşmesi:
|
||||
|
||||
- Repository `Dockerfile` kullanılır.
|
||||
- Internal port `3000`.
|
||||
- Tek replica.
|
||||
- `/app/data` persistent volume.
|
||||
- `APP_URL` ve `NEXT_PUBLIC_SITE_URL` aynı HTTPS origin.
|
||||
- Güçlü `BETTER_AUTH_SECRET`.
|
||||
- Healthcheck `/api/health/ready`.
|
||||
- Reverse proxy websocket/streaming response'ları kesmemeli ve request body limitini en az 8 MiB tutmalıdır.
|
||||
|
||||
Coolify/Dokploy'da Dockerfile build seçin; Nixpacks/ephemeral filesystem kullanmayın. Persistent volume deploy/rebuild sırasında silinmemelidir.
|
||||
|
||||
## 9. Upgrade ve rollback
|
||||
|
||||
1. Release tag/image'i sabitleyin.
|
||||
2. Backup ve restore provasını tamamlayın.
|
||||
3. Yeni image'i build edin.
|
||||
4. Tek instance'ı durdurup yeni image'i başlatın.
|
||||
5. Startup migration'ın başarılı olduğunu ve readiness'in `200` döndüğünü doğrulayın.
|
||||
6. Kritik smoke testleri çalıştırın.
|
||||
|
||||
Migration sonrası geri dönüşte eski image ile birlikte upgrade öncesi DB backup'ı restore edilmelidir. Drizzle migration dosyalarını elle silmek veya SQLite şemasını elle downgrade etmek desteklenmez.
|
||||
|
||||
## 10. Release doğrulama komutları
|
||||
|
||||
```bash
|
||||
pnpm phase1:smoke
|
||||
pnpm phase4:ui-boundary
|
||||
pnpm phase5:backend-boundary
|
||||
pnpm phase6:portal-boundary
|
||||
pnpm phase7:backend-boundary
|
||||
pnpm phase8:import-smoke
|
||||
pnpm phase8:release-boundary
|
||||
pnpm typecheck
|
||||
pnpm build
|
||||
node scripts/phase8-release-boundary.mjs --build-output
|
||||
```
|
||||
|
||||
Docker daemon bulunan hostta ayrıca:
|
||||
|
||||
```bash
|
||||
docker compose config
|
||||
docker compose build
|
||||
docker compose up -d
|
||||
curl --fail http://127.0.0.1:3000/api/health/ready
|
||||
docker compose down
|
||||
```
|
||||
|
||||
Production cutover checklist'i dış sisteme erişim, maintenance kararı ve DNS yetkisi gerektirir; fixture provası bu gerçek operasyonun yerine geçmez.
|
||||
Reference in New Issue
Block a user