docs: record self hosted release audit
This commit is contained in:
@@ -3,7 +3,7 @@ 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ı.
|
description: Supabase çıkışı, SQLite tabanlı backend, Better Auth, Poyraz UI v3 ve instance özelleştirmesi için ana yol haritası.
|
||||||
status: active
|
status: active
|
||||||
current_phase: "10 — Kullanıcı yönlendirmeli sayfa tasarımları"
|
current_phase: "10 — Kullanıcı yönlendirmeli sayfa tasarımları"
|
||||||
last_updated: 2026-07-17
|
last_updated: 2026-07-18
|
||||||
---
|
---
|
||||||
|
|
||||||
# Neta Self-Hosted v3 Ana Dönüşüm Planı
|
# Neta Self-Hosted v3 Ana Dönüşüm Planı
|
||||||
@@ -705,7 +705,7 @@ Mümkün olduğunda küçük ve doğrudan test araçları tercih edilir; test al
|
|||||||
### 19.2. Her faz sonunda çalıştırılacak kalite kapıları
|
### 19.2. Her faz sonunda çalıştırılacak kalite kapıları
|
||||||
|
|
||||||
- [x] Typecheck başarılı.
|
- [x] Typecheck başarılı.
|
||||||
- [ ] Lint başarılı.
|
- [x] Lint başarılı.
|
||||||
- [x] Production build başarılı.
|
- [x] Production build başarılı.
|
||||||
- [x] İlgili smoke testler başarılı.
|
- [x] İlgili smoke testler başarılı.
|
||||||
- [x] Database migration temiz DB üzerinde başarılı.
|
- [x] Database migration temiz DB üzerinde başarılı.
|
||||||
@@ -971,12 +971,14 @@ 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.
|
- `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.
|
- 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.
|
- 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.
|
||||||
|
- Runtime tarafından okunmayan legacy PostgreSQL SQL ağacı, migration kayıtları ve çelişkili numaralı v2 belgeleri release ağacından kaldırıldı; tarihsel içerik Git geçmişinde kaldı. Offline import aracı Supabase SDK veya network bağlantısı kullanmadan mevcut production verisini korumak için tutuldu.
|
||||||
- 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.
|
- 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ı.
|
- 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ı.
|
- 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ı aktif release ağacından kaldırıldı.
|
||||||
- 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.
|
- 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 canonical `pnpm-lock.yaml` + 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.
|
- Faz 2–9 boundary/smoke regresyonları, repo genel ESLint, typecheck ve production build kalite kapıları başarılıdır.
|
||||||
- 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ı.
|
- Production dependency audit'inde high/critical bulgu yoktur; canonical pnpm ağacı iki moderate advisory raporlar. Bunlar Next'in bundled PostCSS'i ve development migration toolchain'inin eski esbuild loader'ı kaynaklıdır; uyumsuz framework/tooling downgrade'i otomatik uygulanmadı.
|
||||||
|
- 2026-07-18 final teknik denetiminin kanıtları, kalıntı riskleri ve production cutover sınırı `release-readiness-2026-07-18.md` içinde kaydedildi.
|
||||||
|
|
||||||
Çıkış kriteri: Uygulama Supabase environment değişkenleri olmadan build ve runtime smoke testini geçiyor.
|
Çıkış kriteri: Uygulama Supabase environment değişkenleri olmadan build ve runtime smoke testini geçiyor.
|
||||||
|
|
||||||
@@ -1112,7 +1114,7 @@ Her sayfa için tasarım kabul checklist'i:
|
|||||||
### Release
|
### Release
|
||||||
|
|
||||||
- [x] Typecheck başarılı.
|
- [x] Typecheck başarılı.
|
||||||
- [ ] Lint başarılı.
|
- [x] Lint başarılı.
|
||||||
- [x] Build başarılı.
|
- [x] Build başarılı.
|
||||||
- [x] Tüm smoke testler başarılı.
|
- [x] Tüm smoke testler başarılı.
|
||||||
- [x] Kritik authorization negatif testleri başarılı.
|
- [x] Kritik authorization negatif testleri başarılı.
|
||||||
@@ -1143,16 +1145,13 @@ 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.
|
- 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.
|
- 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 8
|
## 25. Kalan çalışma — Faz 10 kabulü ve production cutover
|
||||||
|
|
||||||
Faz 0–7 tamamlandı. Sıradaki çalışma paketi production import, runtime Supabase temizliği ve release hardening'dir:
|
Faz 0–9'un teknik backend, Supabase çıkışı, self-host hardening ve mobil API kapsamı tamamlandı. Repository 2026-07-18 denetiminde Supabase'siz teknik release adayıdır.
|
||||||
|
|
||||||
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.
|
Tam ürün Definition of Done için iki ayrı iş paketi açıktır:
|
||||||
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.
|
1. Faz 10'daki freelancer/portal sayfalarının responsive, accessibility, light/dark ve loading/empty/error/permission durumlarını kullanıcıyla sayfa bazında doğrulayıp kabul checklist'lerini kapatmak.
|
||||||
|
2. Gerçek production ortamında Bölüm 17.2'deki backup, maintenance/read-only, final export/import, satır/dosya/checksum doğrulama, kritik akış smoke, DNS/deploy ve rollback retention adımlarını yürütmek.
|
||||||
|
|
||||||
|
Offline Supabase importer yalnızca eski kurulumların verisini kaybetmeden taşıyabilmek için korunur; SDK, environment değişkeni veya network bağlantısı kullanmaz ve uygulamanın build/runtime dependency'si değildir.
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ Bu tablo Faz 0 kritik davranış kaydıdır. Canlı ekran kaydı mevcut hibrit a
|
|||||||
|
|
||||||
## 7. Supabase kaynak envanteri
|
## 7. Supabase kaynak envanteri
|
||||||
|
|
||||||
`supabase/setup.sql` üzerinden doğrulanan kaynak tablolar:
|
Geçiş başlangıcında bulunan ve daha sonra release ağacından kaldırılan legacy PostgreSQL setup kaydı üzerinden doğrulanan kaynak tablolar:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
profiles
|
profiles
|
||||||
@@ -235,7 +235,7 @@ Kaynak RPC/trigger function yüzeyi:
|
|||||||
|
|
||||||
### 7.1. Fixture satır baseline'ı
|
### 7.1. Fixture satır baseline'ı
|
||||||
|
|
||||||
`supabase/seeds/0001_demo_freelancer_os_data.sql` deterministik içerik:
|
Geçiş başlangıcındaki legacy demo seed'in deterministik içeriği:
|
||||||
|
|
||||||
| Tablo | Satır |
|
| Tablo | Satır |
|
||||||
| --- | ---: |
|
| --- | ---: |
|
||||||
@@ -247,7 +247,7 @@ Kaynak RPC/trigger function yüzeyi:
|
|||||||
| daily_logs | 3 |
|
| daily_logs | 3 |
|
||||||
| app_settings | 1 |
|
| app_settings | 1 |
|
||||||
|
|
||||||
`supabase/seed.sql` legacy fixture; 1 profile, 1 settings, 2 project, 3 task, 3 finance ve 3 daily log içerir. Bu seed'de `completed` task status'ü ve `daily_logs.notes` alanı gibi güncel schema ile uyumsuz legacy değerler vardır; hedef seed olarak kullanılmayacaktır.
|
İlk legacy fixture; 1 profile, 1 settings, 2 project, 3 task, 3 finance ve 3 daily log içeriyordu. Bu seed'de `completed` task status'ü ve `daily_logs.notes` alanı gibi güncel schema ile uyumsuz legacy değerler vardı; hedef seed olarak kullanılmadı ve release ağacından kaldırıldı.
|
||||||
|
|
||||||
### 7.2. Production veri sayımı durumu
|
### 7.2. Production veri sayımı durumu
|
||||||
|
|
||||||
|
|||||||
@@ -11,12 +11,7 @@ Faz 0'da hedef DB schema henüz oluşmadığı için kesin SQLite seed dosyası
|
|||||||
|
|
||||||
## Mevcut seed referansı
|
## Mevcut seed referansı
|
||||||
|
|
||||||
Kaynak:
|
Geçiş başlangıcında iki legacy PostgreSQL seed'i kaynak veri kapsamını belirlemek için referans alındı. Hedef SQLite testleri bu dosyaları hiçbir zaman çalıştırmadı. Geçiş tamamlandıktan sonra seed'ler aktif release ağacından kaldırıldı ve gerektiğinde Git geçmişinden incelenebilir.
|
||||||
|
|
||||||
- `supabase/seeds/0001_demo_freelancer_os_data.sql`
|
|
||||||
- `supabase/seed.sql`
|
|
||||||
|
|
||||||
Bu seed'ler Supabase schema için referanstır; hedef SQLite seed'i doğrudan bu dosyaları çalıştırmayacak.
|
|
||||||
|
|
||||||
## Küçük fixture kapsamı
|
## Küçük fixture kapsamı
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ last_updated: 2026-07-17
|
|||||||
|
|
||||||
# Faz 8 — Supabase import ve production release runbook
|
# 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.
|
Bu belge Neta self-hosted v3'ün operasyonel kaynağıdır. Eski PostgreSQL şeması, migration kayıtları ve v2 kurulum belgeleri aktif release ağacından kaldırılmıştır; gerektiğinde Git geçmişinden incelenebilir. Yeni instance kurulumu yalnızca SQLite migration'larını kullanır.
|
||||||
|
|
||||||
## 1. Tamamlanan runtime sınırı
|
## 1. Tamamlanan runtime sınırı
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@ Bu belge Neta self-hosted v3'ün operasyonel kaynağıdır. `supabase/` ve `docs
|
|||||||
| Runtime | `next`, `react`, `react-dom` | Web runtime ve SSR |
|
| 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 |
|
| 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 |
|
| 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 |
|
| Build/UI peer | `@tailwindcss/postcss`, `mermaid`, `react-hook-form` | Tailwind v4 build plugin'i; Poyraz molecule entrypoint'inin temiz pnpm/container build'inde doğrudan çözdüğü peer'ler |
|
||||||
| Tarih | `date-fns` | Aktif tarih filtreleme/formatlama |
|
| 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ı |
|
| 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ı |
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,96 @@
|
|||||||
|
---
|
||||||
|
title: Neta Self-Hosted v3 Release Readiness
|
||||||
|
description: 2026-07-18 Supabase çıkışı, dependency, build, runtime, Docker ve production cutover denetimi.
|
||||||
|
status: release-candidate
|
||||||
|
audited_at: 2026-07-18
|
||||||
|
---
|
||||||
|
|
||||||
|
# Neta Self-Hosted v3 release readiness — 2026-07-18
|
||||||
|
|
||||||
|
## Sonuç
|
||||||
|
|
||||||
|
Repository teknik olarak Supabase'siz self-host release adayıdır.
|
||||||
|
|
||||||
|
- Uygulamanın build veya runtime aşamasında Supabase paketi, client/helper, environment değişkeni, SQL ağacı veya servis bağlantısı yoktur.
|
||||||
|
- İş verisi SQLite + Drizzle, auth Better Auth, dosyalar persistent local data volume üzerinden çalışır.
|
||||||
|
- Supabase environment değişkenleri özellikle unset edilerek production build ve standalone runtime doğrulanmıştır.
|
||||||
|
- Temiz Docker build, startup migration, non-root runtime, healthcheck, persistent volume ve restart smoke başarılıdır.
|
||||||
|
- Lokal geliştirme ve Docker aynı `pnpm@11.5.1` ile tek canonical `pnpm-lock.yaml` kullanır.
|
||||||
|
|
||||||
|
Bu sonuç gerçek production cutover'ın yapıldığı anlamına gelmez. Production verisi ve altyapı yetkisi workspace'te bulunmadığı için son export/import, DNS ve gerçek kullanıcı smoke adımları ortam sahibi tarafından yürütülmelidir.
|
||||||
|
|
||||||
|
## Supabase denetimi
|
||||||
|
|
||||||
|
Kaldırılan aktif release kalıntıları:
|
||||||
|
|
||||||
|
- `supabase/` altındaki PostgreSQL schema, migration, seed ve setup dosyaları
|
||||||
|
- `docs/database/` altındaki eski Supabase/PostgreSQL migration kayıtları
|
||||||
|
- Supabase kurulumunu anlatan çelişkili numaralı v2 belgeleri
|
||||||
|
- takip edilen geçici `.artifacts` logları ve Python bytecode çıktısı
|
||||||
|
|
||||||
|
Doğrulanan sınırlar:
|
||||||
|
|
||||||
|
- `@supabase/ssr` ve `@supabase/supabase-js` dependency/lockfile ağacında yok
|
||||||
|
- `NEXT_PUBLIC_SUPABASE_URL`, `NEXT_PUBLIC_SUPABASE_ANON_KEY` ve `SUPABASE_SERVICE_ROLE_KEY` runtime sözleşmesinde yok
|
||||||
|
- `app`, `components`, `config`, `lib`, `server`, proxy ve Next config içinde Supabase runtime importu yok
|
||||||
|
- `.next` production server/static çıktısında Supabase paket, env veya `supabase.co` referansı yok
|
||||||
|
- release boundary eski `supabase/` ve `docs/database/` ağaçlarının yeniden eklenmesini hata olarak kabul ediyor
|
||||||
|
|
||||||
|
Repository'de kalan `supabase` kelimeleri tarihsel dönüşüm belgeleri, regresyon sınırı testleri ve offline veri import aracıdır. `scripts/import-supabase.mjs` hazırlanmış bir export bundle'ını diskten okur; Supabase SDK kullanmaz, Supabase'e bağlanmaz ve uygulama runtime'ına import edilmez. Mevcut kurulumların verisini korumak için bilinçli olarak tutulmuştur.
|
||||||
|
|
||||||
|
## Bu denetimde düzeltilen release sorunları
|
||||||
|
|
||||||
|
1. Repo genelindeki ESLint hata ve uyarıları giderildi; props-state senkronizasyon effect'leri deterministik override modellerine taşındı, `any` kullanımları tiplendi ve görseller Next Image'a alındı.
|
||||||
|
2. `next/font/google` kaldırıldı. Üretim build'i artık Google Fonts ağına bağlanmadan sistem font stack'iyle deterministik tamamlanır.
|
||||||
|
3. Standalone build'in public ve static asset'leri eksiksiz paketlemesi için `postbuild` hazırlığı eklendi.
|
||||||
|
4. `pnpm start`, `output: standalone` ile uyumsuz `next start` yerine doğrudan standalone server'ı çalıştırır.
|
||||||
|
5. Docker ve lokal geliştirme arasındaki npm/pnpm lockfile ayrışması kaldırıldı. `package-lock.json` silindi; Docker frozen canonical pnpm lockfile kullanır.
|
||||||
|
6. Docker native dependency build scriptleri `pnpm-workspace.yaml` içindeki dar allowlist ile sınırlandı.
|
||||||
|
7. Docker build'deki gereksiz ikinci dependency kurulumu kaldırıldı.
|
||||||
|
|
||||||
|
## Doğrulama kanıtları
|
||||||
|
|
||||||
|
Başarılı kontroller:
|
||||||
|
|
||||||
|
- `pnpm lint`
|
||||||
|
- `pnpm typecheck`
|
||||||
|
- Faz 1 migration, persistence, backup retention, restore ve checksum smoke
|
||||||
|
- Faz 2 auth/domain smoke
|
||||||
|
- Faz 3 storage smoke
|
||||||
|
- Faz 4 UI boundary
|
||||||
|
- Faz 5 freelancer backend boundary/smoke
|
||||||
|
- Faz 6 portal boundary/smoke ve cross-client negatif akışlar
|
||||||
|
- Faz 7 AI/business boundary/smoke
|
||||||
|
- Faz 8 offline import dry-run/apply/idempotency/rollback smoke
|
||||||
|
- Faz 8 source ve build artifact release boundary
|
||||||
|
- Faz 9 API boundary/smoke
|
||||||
|
- Supabase environment değişkenleri olmadan production build
|
||||||
|
- Standalone migration, liveness, readiness, `/register`, public asset ve static CSS smoke
|
||||||
|
- Docker Node 22 build, Next 16.2.10, non-root `nextjs` user, startup migration ve readiness
|
||||||
|
- Aynı persistent volume ile Docker restart sonrası readiness
|
||||||
|
- `git diff --check`
|
||||||
|
|
||||||
|
Readiness yanıtında `dataDirWritable`, `databaseReachable` ve `migrationsApplied` kontrollerinin tamamı `true` dönmüştür.
|
||||||
|
|
||||||
|
## Güvenlik audit'i
|
||||||
|
|
||||||
|
Canonical production ağacında high veya critical advisory yoktur. `pnpm audit --prod` iki moderate bulgu raporlar:
|
||||||
|
|
||||||
|
1. Eski esbuild, Better Auth'ın opsiyonel Drizzle Kit/tooling zinciri üzerinden gelir. Advisory, esbuild development server'ın başka sitelere okunabilir yanıt vermesiyle ilgilidir; Neta production container'ı esbuild development server çalıştırmaz.
|
||||||
|
2. Next'in kendi içinde taşıdığı eski PostCSS sürümü için stringify advisory'si vardır. Neta production'da kullanıcıdan CSS alıp build/stringify etmez; PostCSS yalnızca güvenilen source build'inde çalışır.
|
||||||
|
|
||||||
|
Audit'in önerdiği zorunlu downgrade/force fix framework ve migration tooling'i uyumsuz sürümlere taşıdığı için uygulanmamıştır. Upstream Next ve Drizzle/Better Auth zinciri güncellendiğinde lockfile yenilenip audit tekrar çalıştırılmalıdır.
|
||||||
|
|
||||||
|
## Yayın öncesi kalan zorunlu dış adımlar
|
||||||
|
|
||||||
|
Gerçek production deploy için aşağıdakiler hâlâ ortam sahibinin sorumluluğundadır:
|
||||||
|
|
||||||
|
- güçlü ve benzersiz `BETTER_AUTH_SECRET`
|
||||||
|
- HTTPS reverse proxy ve doğru `APP_URL`, `NEXT_PUBLIC_SITE_URL`, gerekirse `TRUSTED_ORIGINS`
|
||||||
|
- kalıcı `/app/data` volume'u ve host-level şifreli/off-site backup
|
||||||
|
- mevcut kurulum varsa maintenance/read-only, final export, import dry-run/final import
|
||||||
|
- gerçek satır, dosya ve checksum karşılaştırması
|
||||||
|
- owner hesabı ve kritik owner/client akışlarının production smoke'u
|
||||||
|
- DNS geçişi ve tanımlı rollback penceresi
|
||||||
|
|
||||||
|
Ürün seviyesinde Faz 10'un sayfa bazlı responsive, accessibility, light/dark ve kullanıcı kabul checklist'leri master planda açık kalmaktadır. Bu maddeler teknik Supabase çıkışını engellemez; “Neta Self-Hosted v3 tamamen tamamlandı” etiketi için ayrıca kapatılmalıdır.
|
||||||
@@ -10,6 +10,13 @@ const installed = {
|
|||||||
...packageJson.optionalDependencies,
|
...packageJson.optionalDependencies,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
assert.equal(packageJson.packageManager, "pnpm@11.5.1", "The canonical package manager must be pinned");
|
||||||
|
assert.equal(
|
||||||
|
fs.existsSync(path.join(repoRoot, "package-lock.json")),
|
||||||
|
false,
|
||||||
|
"A second npm lockfile must not diverge from the canonical pnpm lockfile",
|
||||||
|
);
|
||||||
|
|
||||||
const removedPackages = [
|
const removedPackages = [
|
||||||
"@supabase/ssr",
|
"@supabase/ssr",
|
||||||
"@supabase/supabase-js",
|
"@supabase/supabase-js",
|
||||||
@@ -27,6 +34,22 @@ for (const dependency of removedPackages) {
|
|||||||
assert.equal(installed[dependency], undefined, `Removed dependency is still declared: ${dependency}`);
|
assert.equal(installed[dependency], undefined, `Removed dependency is still declared: ${dependency}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
packageJson.scripts?.start,
|
||||||
|
"node .next/standalone/server.js",
|
||||||
|
"Production start command must use the generated standalone server",
|
||||||
|
);
|
||||||
|
assert.equal(
|
||||||
|
packageJson.scripts?.postbuild,
|
||||||
|
"node scripts/prepare-standalone.mjs",
|
||||||
|
"Production build must package public and static assets into standalone output",
|
||||||
|
);
|
||||||
|
const dockerfile = fs.readFileSync(path.join(repoRoot, "Dockerfile"), "utf8");
|
||||||
|
assert.match(dockerfile, /COPY package\.json pnpm-lock\.yaml pnpm-workspace\.yaml \.\//);
|
||||||
|
assert.match(dockerfile, /pnpm install --frozen-lockfile --config\.node-linker=hoisted/);
|
||||||
|
assert.match(dockerfile, /pnpm --config\.node-linker=hoisted build/);
|
||||||
|
assert.doesNotMatch(dockerfile, /\bnpm (?:ci|install|run)\b/);
|
||||||
|
|
||||||
const runtimeTargets = [
|
const runtimeTargets = [
|
||||||
"app",
|
"app",
|
||||||
"components",
|
"components",
|
||||||
@@ -40,6 +63,7 @@ const runtimeTargets = [
|
|||||||
const runtimePatterns = [
|
const runtimePatterns = [
|
||||||
[/@supabase\//i, "Supabase package import"],
|
[/@supabase\//i, "Supabase package import"],
|
||||||
[/\b(?:NEXT_PUBLIC_SUPABASE_URL|NEXT_PUBLIC_SUPABASE_ANON_KEY|SUPABASE_SERVICE_ROLE_KEY)\b/, "Supabase runtime environment variable"],
|
[/\b(?:NEXT_PUBLIC_SUPABASE_URL|NEXT_PUBLIC_SUPABASE_ANON_KEY|SUPABASE_SERVICE_ROLE_KEY)\b/, "Supabase runtime environment variable"],
|
||||||
|
[/next\/font\/google/i, "build-time Google Fonts network dependency"],
|
||||||
[/\b(?:dexie|dexie-react-hooks)\b/i, "browser database dependency"],
|
[/\b(?:dexie|dexie-react-hooks)\b/i, "browser database dependency"],
|
||||||
[/\bnext-pwa\b/i, "PWA wrapper"],
|
[/\bnext-pwa\b/i, "PWA wrapper"],
|
||||||
[/\b(?:serviceWorker|service-worker|workbox|OfflineIndicator|offline-indicator)\b/i, "offline/PWA runtime"],
|
[/\b(?:serviceWorker|service-worker|workbox|OfflineIndicator|offline-indicator)\b/i, "offline/PWA runtime"],
|
||||||
@@ -56,6 +80,22 @@ for (const filePath of runtimeTargets.flatMap(walk)) {
|
|||||||
}
|
}
|
||||||
assert.deepEqual(violations, [], `Phase 8 runtime boundary violations:\n${violations.join("\n")}`);
|
assert.deepEqual(violations, [], `Phase 8 runtime boundary violations:\n${violations.join("\n")}`);
|
||||||
|
|
||||||
|
for (const removedLegacyPath of ["supabase", "docs/database"]) {
|
||||||
|
assert.equal(
|
||||||
|
fs.existsSync(path.join(repoRoot, removedLegacyPath)),
|
||||||
|
false,
|
||||||
|
`Legacy Supabase archive must not remain in the release tree: ${removedLegacyPath}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const legacyNumberedDocs = fs.existsSync(path.join(repoRoot, "docs"))
|
||||||
|
? fs.readdirSync(path.join(repoRoot, "docs")).filter((fileName) => /^\d{2}-.+\.md$/.test(fileName))
|
||||||
|
: [];
|
||||||
|
assert.deepEqual(
|
||||||
|
legacyNumberedDocs,
|
||||||
|
[],
|
||||||
|
`Legacy v2 documentation must not remain beside active release docs:\n${legacyNumberedDocs.join("\n")}`,
|
||||||
|
);
|
||||||
|
|
||||||
const publicFiles = walk("public").map((filePath) => path.basename(filePath).toLowerCase());
|
const publicFiles = walk("public").map((filePath) => path.basename(filePath).toLowerCase());
|
||||||
assert.equal(
|
assert.equal(
|
||||||
publicFiles.some((fileName) => /^(?:sw|service-worker|workbox-.+)\.(?:js|mjs)$/.test(fileName)),
|
publicFiles.some((fileName) => /^(?:sw|service-worker|workbox-.+)\.(?:js|mjs)$/.test(fileName)),
|
||||||
|
|||||||
Reference in New Issue
Block a user