chore(release): remove legacy runtime dependencies

This commit is contained in:
poyrazavsever
2026-07-17 09:13:23 +03:00
parent 5948907e5d
commit 8cd3de8e1f
42 changed files with 910 additions and 6207 deletions
@@ -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: "7AI ve gelişmiş modüller backend geçişi"
last_updated: 2026-07-16
current_phase: "9Mobil 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 27 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 06 tamamlandı. Sıradaki çalışma paketi chat, AI analizleri ve kapsamda kalan business modüllerinin backend geçişidir:
Faz 07 tamamlandı. Sıradaki çalışma paketi production import, runtime Supabase temizli 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.
+2 -1
View File
@@ -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.