From c75fa5aa18ebe9aa7597e43789aa68772a7e49b2 Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 1 May 2026 18:56:42 +0200 Subject: [PATCH] =?UTF-8?q?v0.1.7=20=E2=80=94=20auto-migrate=20301?= =?UTF-8?q?=E2=86=92302=20on=20startup,=20auto-install=20sqlite3,=20ensure?= =?UTF-8?q?=5Fsqlite=20helper?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/nexredirect | 18 ++++++++++++++---- lib/db.ts | 19 +++++++++++++++++++ scripts/update.sh | 5 +++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/bin/nexredirect b/bin/nexredirect index 8128762..d368c82 100755 --- a/bin/nexredirect +++ b/bin/nexredirect @@ -103,26 +103,36 @@ cmd_caddy() { esac } +ensure_sqlite() { + if command -v sqlite3 >/dev/null 2>&1; then return 0; fi + if [[ $EUID -eq 0 ]]; then + echo "==> sqlite3 wird installiert..." + apt-get install -y -qq sqlite3 >/dev/null 2>&1 && return 0 + fi + echo "sqlite3 nicht installiert. Bitte ausführen: sudo apt install -y sqlite3" >&2 + return 1 +} + cmd_db() { - command -v sqlite3 >/dev/null || { echo "sqlite3 nicht installiert: apt install -y sqlite3"; exit 1; } + ensure_sqlite || exit 1 sqlite3 -header -column "$DB" } cmd_domains() { - command -v sqlite3 >/dev/null || { echo "sqlite3 nicht installiert"; exit 1; } + ensure_sqlite || exit 1 sqlite3 -header -column "$DB" \ "SELECT id, domain, status, redirect_code AS code, COALESCE(target_url, (SELECT target_url FROM domain_groups g WHERE g.id = d.group_id), '—') AS target FROM domains d ORDER BY created_at DESC;" } cmd_hits() { - command -v sqlite3 >/dev/null || { echo "sqlite3 nicht installiert"; exit 1; } + ensure_sqlite || exit 1 local n="${1:-20}" sqlite3 -header -column "$DB" \ "SELECT datetime(ts/1000,'unixepoch','localtime') AS time, (SELECT domain FROM domains WHERE id = h.domain_id) AS domain, country, substr(path,1,40) AS path FROM hits h ORDER BY ts DESC LIMIT $n;" } cmd_tokens() { - command -v sqlite3 >/dev/null || { echo "sqlite3 nicht installiert"; exit 1; } + ensure_sqlite || exit 1 sqlite3 -header -column "$DB" \ "SELECT id, name, scopes, datetime(created_at/1000,'unixepoch','localtime') AS created, CASE WHEN revoked_at IS NULL THEN 'active' ELSE 'revoked' END AS status FROM api_tokens ORDER BY id DESC;" } diff --git a/lib/db.ts b/lib/db.ts index 38e94fb..600ecb2 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -91,6 +91,25 @@ function ensureSchema(db: Database.Database) { log TEXT ); `); + + runMigrations(db); +} + +function getSettingDirect(db: Database.Database, key: string): string | null { + const row = db.prepare("SELECT value FROM settings WHERE key = ?").get(key) as { value: string } | undefined; + return row?.value ?? null; +} +function setSettingDirect(db: Database.Database, key: string, value: string) { + db.prepare("INSERT INTO settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, value); +} + +function runMigrations(db: Database.Database) { + // m_301_to_302: switch existing 301-redirects to 302 so browser-cache stops eating hits. + if (getSettingDirect(db, "m_301_to_302") !== "done") { + db.prepare("UPDATE domains SET redirect_code = 302 WHERE redirect_code = 301").run(); + db.prepare("UPDATE domain_groups SET redirect_code = 302 WHERE redirect_code = 301").run(); + setSettingDirect(db, "m_301_to_302", "done"); + } } export function getSetting(key: string): string | null { diff --git a/scripts/update.sh b/scripts/update.sh index 7cec260..b66ab4c 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -15,6 +15,11 @@ cd "$INSTALL_DIR" chmod +x "$INSTALL_DIR/scripts/"*.sh 2>/dev/null || true chown -R "$SERVICE_USER:$SERVICE_USER" "$INSTALL_DIR" +# Sicherstellen dass sqlite3 für die CLI da ist (idempotent, keine Fehler wenn schon da) +if ! command -v sqlite3 >/dev/null 2>&1; then + apt-get install -y -qq sqlite3 >/dev/null 2>&1 || true +fi + if [[ -z "$TAG" ]]; then TAG=$(curl -fsSL "https://api.github.com/repos/${REPO}/releases/latest" 2>/dev/null \ | grep -m1 '"tag_name"' | sed -E 's/.*"tag_name": *"([^"]+)".*/\1/' || true)