6.7 KiB
title, description, phase, status, last_updated
| title | description | phase | status | last_updated |
|---|---|---|---|---|
| I18n Faz 9 — Hardening, Migrasyon ve Release Readiness | Çok dilli sistemin self-host production yayınına hazır olduğunu gösteren migration, backup, API, Dokploy ve operasyon raporu. | 9 | completed | 2026-07-19 |
I18n Faz 9 — Hardening, migrasyon ve release readiness
Faz-9, çok dilli sistemin production self-host kurulumunda güvenli şekilde yayınlanabilmesi için migration, backup/restore, import, mobil API ve operasyon kapılarını kapatır.
Sonuç
Çok dilli sistem release adayıdır.
- Yeni kurulumda
trveenaktif gelir, default localetrolur. - Eski Türkçe kolonlar
content_translationsiçinetrlocale'iyle backfill edilir. - Backfill tekrar çalışan migration'da duplicate üretmez.
frcustom locale, content translation, backup ve restore zincirinde korunur.- API v1 localization sözleşmesi additive ve eski mobil client'larla uyumludur.
- Runtime Supabase bağımlılığı veya Supabase env kullanımı geri gelmemiştir.
- Built-in kataloglar standalone server bundle içinde bulunur.
Release kapıları
Migration
pnpm i18n:phase9-hardening şu migration senaryolarını gerçek temp SQLite DB
üzerinde çalıştırır:
- Boş DB migration.
- Boş DB üzerinde ikinci migration çalıştırması.
- 0000–0007 arası eski schema üzerinde production-benzeri Türkçe veri.
- 0008 i18n migration'ı sonrası Türkçe backfill doğrulaması.
- Aynı DB üzerinde tekrar migration ve idempotent count kontrolü.
Backfill doğrulanan alanlar:
project.nameproject.descriptiontask.titleplanning_section.titlebranding.portalWelcome
Backup ve restore
Hardening smoke, production-benzeri DB'ye fr custom locale ve Fransızca proje
çevirisi ekler, backup alır ve ayrı bir data directory içine restore eder.
Restore sonrası:
instance_locales.fraktif kalır.content_translationsiçindeki Fransızca çeviri korunur.foreign_key_checktemiz döner.
Restore failure prosedürü de test edilir: checksum'u bozulan backup restore edilmez ve mevcut hedef DB korunur.
Supabase import uyumu
Faz-9, Supabase import aracının Faz-8 smoke kapsamını release blocker kabul eder.
phase8:import-smoke şu davranışları doğrular:
- dry-run DB'yi değiştirmez;
- apply import kayıtları taşır;
--allow-existingidempotent upsert yapar;- invalid enum, eksik foreign key ve unsafe storage path reddedilir;
- pre-import backup restore ile rollback provası yapılır.
Import aracı Supabase SDK kullanmaz; offline neta-supabase-export bundle'ını
okur.
Dokploy / Docker operasyon notu
Dokploy'da /app/data kalıcı volume olmalıdır. Bu volume şunları taşır:
neta.dbuploads/backups/tmp/
Production deploy öncesi:
pnpm db:backup -- --retention-count 14
Restore provası production volume üstüne değil, ayrı geçici hedefe yapılmalıdır:
pnpm db:restore -- \
--from /app/data/backups/neta-TIMESTAMP \
--target /tmp/neta-restore-rehearsal \
--force
Translation tabloları neta.db içinde olduğu için backup/restore kapsamında
otomatik korunur:
instance_localesinstance_i18n_settingsinstance_ui_translationscontent_translationsclients.portal_localeportal_invitations.localeuser_preferences.language
Self-host default locale
Yeni kurulumda default locale tr olur. Owner Ayarlar üzerinden varsayılan dili
aktif başka bir locale'e alabilir. Default locale yalnız active locale olabilir;
draft veya archived locale default yapılamaz.
Mobil istemciler instance dil bilgisini şu endpoint'lerden keşfeder:
GET /.well-known/netaGET /api/v1/metaGET /api/v1/me
Dil ekleme ve import/export rehberi
Owner akışı:
- Ayarlar → Diller ve çeviriler bölümünden yeni locale ekle.
- Locale'i önce
draftolarak tut. - UI çeviri eksiklerini tamamla veya JSON import ile yükle.
- İçerik formlarındaki locale tab'larında proje/görev/portal metinlerini gir.
- Portal'a hazır olduğunda locale'i
activeyap. - Gerekirse varsayılan locale'i değiştir.
Import/export:
- UI çeviri export paketi
neta-i18nformatındadır. - Import yalnız owner scope ile çalışır.
- Built-in locale'ler silinmez veya archived yapılamaz.
- Bozuk namespace/key/value import'u validation ile reddedilir.
Portal müşterisine dil atama
Müşteri portal dili iki noktada belirlenir:
- Portal daveti oluştururken seçilen locale.
- Müşteri detayındaki portal dili ayarı.
Davet kabul edildiğinde:
clients.portal_localeset edilir;- client user preference dili aynı locale'e alınır;
- davet kabulü sonrası login ekranı davet locale'iyle açılır.
Mobil API localization sözleşmesi
Mobil taraf locale'i şu sırayla çözmelidir:
- Explicit query:
/api/v1/me?locale=en - Better Auth session preference
- Client portal locale
Accept-Language- Instance default locale
Unsupported explicit locale için server:
{
"ok": false,
"error": {
"code": "UNSUPPORTED_LOCALE",
"message": "Unsupported locale.",
"details": {
"messageKey": "validation.unsupportedLocale"
}
}
}
Client kullanıcıya gösterilecek metni kendi catalog'undan messageKey ile
çözmelidir; program akışı stabil code alanına bağlanmalıdır.
Gözlem ve performans
Faz-9 smoke seviyesi performans kapıları:
- Dashboard ve portal listeleri batch content resolver kullanır; N+1 translation sorgusu release riski kabul edilir.
- Missing translation durumunda raw key production kullanıcı arayüzüne düşmemeli; fallback chain kullanılmalıdır.
- Catalog version, UI translation mutation'larında artar ve mobil meta cache invalidation için kullanılabilir.
- Hassas içerik loglanmamalıdır; missing translation log'u key/locale seviyesinde kalmalıdır.
Verification
Çalıştırılan komutlar:
pnpm phase-i18n:boundary
pnpm i18n:phase9-hardening
pnpm i18n:phase8-smoke
pnpm i18n:phase7-smoke
pnpm i18n:phase5-smoke
pnpm i18n:phase3-smoke
pnpm i18n:phase2-smoke
pnpm i18n:phase1-smoke
pnpm phase8:import-smoke
pnpm typecheck
pnpm build
pnpm phase9:smoke
git diff --check
phase9:smoke local listener açtığı için sandbox içinde EPERM alabilir; bu
durumda izinli çalıştırılmalıdır.
Release uyarısı
Bu rapor teknik release readiness sağlar. Gerçek production cutover için ortam sahibi yine şu dış adımları yürütmelidir:
- production backup;
- maintenance/read-only penceresi;
- final Supabase export/import;
- gerçek satır ve dosya checksum karşılaştırması;
- owner/client kabul smoke'u;
- DNS/reverse proxy geçişi;
- rollback retention penceresi.