feat: prod app.db şemasını açılışta drizzle migration'larıyla eşitle
Some checks failed
Deploy / deploy (push) Failing after 13s
Some checks failed
Deploy / deploy (push) Failing after 13s
Volume'deki app.db yalnızca ilk kurulumda seed'den kopyalanıyordu; sonraki deploy'larda şemaya eklenen kolonlar (son örnek: kredi_bitti_at, kredi_hatirlatma_gonderildi_at) prod'a hiç ulaşmıyor ve 'no such column' hatalarıyla kırılıyordu. - drizzle-kit generate ile baseline migration üretildi (drizzle/0000_baslangic) - scripts/db-goc.mjs: entrypoint'te server'dan önce koşan migration runner; drizzle migrator protokolünü birebir taklit eder (__drizzle_migrations, sha256, created_at=journal.when) ama yalnızca @libsql/client'a dayanır — drizzle-orm standalone imajda bundle'landığından paket olarak çözülemiyor - Benimseme: migration kaydı olmayan mevcut volume'lerde baseline additive uzlaştırılır (IF NOT EXISTS + snapshot'tan eksik kolon ALTER'ları) ve damgalanır; sonraki migration'lar normal akışla uygulanır - sema-guvence.ts kaldırıldı: elle DDL aynalama yerini migration'lara bıraktı - Yeni akış: şema değişikliğinde pnpm db:generate ile migration commit'lenir Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,10 +6,8 @@
|
||||
export async function register() {
|
||||
if (process.env.NEXT_RUNTIME !== "nodejs") return;
|
||||
if (process.env.NEXT_PHASE === "phase-production-build") return;
|
||||
// Migration akışı olmadığından sonradan eklenen tablolar açılışta güvenceye
|
||||
// alınır (additive DDL, idempotent) — mevcut prod volume'ü seed'den kopyalanmaz.
|
||||
const { semayiGuvenceyeAl } = await import("./lib/appdb/sema-guvence");
|
||||
await semayiGuvenceyeAl();
|
||||
// Şema, konteyner açılışında scripts/db-goc.mjs'in uyguladığı drizzle
|
||||
// migration'larıyla güncellenir (bkz. docker-entrypoint.sh); burada DDL koşmaz.
|
||||
const { krediHatirlatmaBaslat } = await import("./lib/kredi-hatirlatma");
|
||||
krediHatirlatmaBaslat();
|
||||
}
|
||||
|
||||
@@ -156,7 +156,8 @@ export const reports = sqliteTable("reports", {
|
||||
// Anonim /sonuc tadımlığı: batch üretilmiş tek tercih satırları.
|
||||
// Anahtar: sıra kovası × puan türü × kategori ("genel" = kategorisiz fallback).
|
||||
// Anonim istek LLM'e asla gitmez; bu tablo salt-okunur servis edilir.
|
||||
// NOT: Yeni tablo/kolon eklerken sema-guvence.ts'teki DDL de güncellenmeli.
|
||||
// NOT: Yeni tablo/kolon eklerken `pnpm db:generate` ile migration üretilmeli;
|
||||
// prod şeması açılışta yalnızca drizzle/ altındaki migration'larla güncellenir.
|
||||
export const tadimlikHavuzu = sqliteTable(
|
||||
"tadimlik_havuzu",
|
||||
{
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
import { sql } from "drizzle-orm";
|
||||
import { appDb } from "./index";
|
||||
|
||||
/**
|
||||
* Prod volume'ündeki app.db'ye sonradan eklenen tabloları güvenceye alır.
|
||||
*
|
||||
* Projede drizzle migration akışı yok: şema lokalde `pnpm db:push` ile
|
||||
* uygulanıp data/app.db seed olarak taşınıyor; ama docker-entrypoint.sh
|
||||
* app.db'yi yalnızca volume BOŞKEN kopyalar — mevcut prod volume'üne yeni
|
||||
* tablolar başka türlü gelmez. Burası sunucu açılışında (instrumentation)
|
||||
* bir kez koşar; yalnızca additive DDL içerir, idempotenttir.
|
||||
*
|
||||
* NOT: schema.ts'e tablo/kolon eklendiğinde buradaki DDL de güncellenmeli.
|
||||
*/
|
||||
export async function semayiGuvenceyeAl(): Promise<void> {
|
||||
await appDb.run(sql`
|
||||
CREATE TABLE IF NOT EXISTS tadimlik_havuzu (
|
||||
id TEXT PRIMARY KEY,
|
||||
kova_slug TEXT NOT NULL,
|
||||
tur TEXT NOT NULL,
|
||||
kategori_slug TEXT NOT NULL,
|
||||
program_id TEXT NOT NULL,
|
||||
dilim TEXT NOT NULL,
|
||||
gerekce TEXT NOT NULL,
|
||||
risk_notu TEXT NOT NULL,
|
||||
trend_ozeti TEXT NOT NULL,
|
||||
program TEXT NOT NULL,
|
||||
ornek_sira INTEGER NOT NULL,
|
||||
uretim_at INTEGER NOT NULL
|
||||
)
|
||||
`);
|
||||
await appDb.run(
|
||||
sql`CREATE UNIQUE INDEX IF NOT EXISTS tadimlik_anahtar ON tadimlik_havuzu (kova_slug, tur, kategori_slug)`,
|
||||
);
|
||||
await appDb.run(sql`
|
||||
CREATE TABLE IF NOT EXISTS saved_lists (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL UNIQUE REFERENCES user(id),
|
||||
items TEXT NOT NULL,
|
||||
profil TEXT,
|
||||
created_at INTEGER NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
)
|
||||
`);
|
||||
}
|
||||
Reference in New Issue
Block a user