A simple Bluesky bot to make sense of the noise, with responses powered by Gemini, similar to Grok.

feat: migrate db before running

-3
.env.example
··· 7 7 DB_PATH="data/sqlite.db" 8 8 GEMINI_MODEL="gemini-2.5-flash" 9 9 10 - ADMIN_DID="" 11 - ADMIN_HANDLE="" 12 - 13 10 DID="" 14 11 HANDLE="" 15 12
+1 -1
docker-compose.yml
··· 7 7 - "AUTHORIZED_USERS=${AUTHORIZED_USERS}" 8 8 - "SERVICE=${SERVICE:?https://bsky.social}" 9 9 - "DB_PATH=data/sqlite.db" 10 - - "GEMINI_MODEL=${GEMINI_MODEL:?gemini-2.5-flash}" 10 + - "GEMINI_MODEL=${GEMINI_MODEL:-gemini-2.5-flash}" 11 11 - "DID=${DID:?}" 12 12 - "HANDLE=${HANDLE:?}" 13 13 - "BSKY_PASSWORD=${BSKY_PASSWORD:?}"
+3
src/db/index.ts
··· 2 2 import { Database } from "bun:sqlite"; 3 3 import * as schema from "./schema"; 4 4 import { env } from "../env"; 5 + import { migrateDB } from "./migrate"; 6 + 7 + await migrateDB(); 5 8 6 9 const sqlite = new Database(env.DB_PATH); 7 10 export default drizzle(sqlite, { schema });
+5 -3
src/db/migrate.ts
··· 3 3 import { Database } from "bun:sqlite"; 4 4 import { env } from "../env"; 5 5 6 - const sqlite = new Database(env.DB_PATH); 7 - const db = drizzle(sqlite); 8 - migrate(db, { migrationsFolder: "./drizzle" }); 6 + export async function migrateDB() { 7 + const sqlite = new Database(env.DB_PATH); 8 + const db = drizzle(sqlite); 9 + await migrate(db, { migrationsFolder: "./drizzle" }); 10 + }