docs: record self hosted release audit

This commit is contained in:
poyrazavsever
2026-07-18 20:18:53 +03:00
parent 1d318e1ea0
commit bace8c86cf
6 changed files with 158 additions and 28 deletions
@@ -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.