Container-ready via docker/ compose (frontend nginx + backend Node). Compose adjusted for Coolify on the prod server: frontend uses expose:80 (no host binding — host 8080 is taken by the Coolify proxy; Traefik routes visigine.de), backend ALLOWED_ORIGINS=https://visigine.de. Secrets stay in server/.env (git-ignored); see server/.env.example. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 lines
870 B
JavaScript
22 lines
870 B
JavaScript
// Synchronous SQLite initialization. On startup ensure the data directory
|
|
// exists, open the DB, and run schema.sql (idempotent CREATE IF NOT EXISTS).
|
|
import Database from 'better-sqlite3'
|
|
import { readFileSync, mkdirSync } from 'node:fs'
|
|
import { dirname, resolve } from 'node:path'
|
|
import { fileURLToPath } from 'node:url'
|
|
|
|
const here = dirname(fileURLToPath(import.meta.url))
|
|
const defaultPath = resolve(here, '..', 'data', 'visigine.db')
|
|
const dbPath = process.env.DB_PATH ? resolve(process.env.DB_PATH) : defaultPath
|
|
|
|
mkdirSync(dirname(dbPath), { recursive: true })
|
|
|
|
export const db = new Database(dbPath)
|
|
db.pragma('journal_mode = WAL') // better concurrent reads
|
|
db.pragma('foreign_keys = ON') // enforce ON DELETE CASCADE
|
|
|
|
const schema = readFileSync(new URL('./schema.sql', import.meta.url), 'utf8')
|
|
db.exec(schema)
|
|
|
|
console.log(`[db] opened ${dbPath}`)
|