homeio
PublikFork dari doctor-io/homeio
db-migrate.ts
import { existsSync, readFileSync } from "node:fs";
import { join } from "node:path";
import { Pool } from "pg";
import { drizzle } from "drizzle-orm/node-postgres";
import { migrate } from "drizzle-orm/node-postgres/migrator";
import { parseEnvFileContent } from "@/lib/shared/env-file";
const MIGRATIONS_FOLDER = join(process.cwd(), "drizzle");
function getDatabaseUrl(): string {
if (process.env.DATABASE_URL) return process.env.DATABASE_URL;
for (const envFile of [".env.local", ".env"]) {
const envPath = join(process.cwd(), envFile);
if (!existsSync(envPath)) continue;
const env = parseEnvFileContent(readFileSync(envPath, "utf8"));
if (env.DATABASE_URL) return env.DATABASE_URL;
}
return "postgresql://postgres:postgres@127.0.0.1:5432/home_server";
}
async function run() {
const pool = new Pool({ connectionString: getDatabaseUrl() });
const db = drizzle(pool);
// Reset migration tracking so every migration reruns from scratch.
// All SQL files use IF NOT EXISTS / DO $$ EXCEPTION blocks, so rerunning
// is always safe — existing tables and data are never touched.
await pool.query(`CREATE SCHEMA IF NOT EXISTS drizzle`);
await pool.query(`DROP TABLE IF EXISTS drizzle.__drizzle_migrations`);
await migrate(db, { migrationsFolder: MIGRATIONS_FOLDER });
await pool.end();
console.log("[db] Migrations applied successfully.");
}
run().catch((err) => {
console.error("[db] Migration failed:", err);
process.exit(1);
});