From bf806f08915c871d43e713dc08eda5876661d2d1 Mon Sep 17 00:00:00 2001 From: kurihada Date: Sat, 28 Feb 2026 17:33:49 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=B9=E7=94=A8=20sqlite3=20=E5=8E=9F?= =?UTF-8?q?=E7=94=9F=E5=B7=A5=E5=85=B7=E5=81=9A=20schema=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=EF=BC=8C=E6=9B=BF=E4=BB=A3=E4=B8=8D=E5=8F=AF=E9=9D=A0?= =?UTF-8?q?=E7=9A=84=20prisma=20CLI=20=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 5 +---- docker-entrypoint.sh | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index b3095ff..f89b10c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,6 +25,7 @@ RUN npm run build FROM base AS runner WORKDIR /app ENV NODE_ENV=production +RUN apk add --no-cache sqlite RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs @@ -35,10 +36,6 @@ COPY --from=builder /app/prisma/template.db ./template.db COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static -# Prisma CLI + schema engine for automatic schema migration on startup -COPY --from=builder /app/node_modules/prisma ./node_modules/prisma -COPY --from=builder /app/node_modules/@prisma/engines ./node_modules/@prisma/engines - COPY docker-entrypoint.sh ./ RUN chmod +x docker-entrypoint.sh diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index f2a73e4..a0d448d 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,15 +1,36 @@ #!/bin/sh set -e -DB_PATH="/app/data/prod.db" +TEMPLATE="/app/template.db" +DB="/app/data/prod.db" -if [ ! -f "$DB_PATH" ]; then +if [ ! -f "$DB" ]; then echo "[db] First run — creating database from template" - cp /app/template.db "$DB_PATH" + cp "$TEMPLATE" "$DB" + exec node server.js fi echo "[db] Syncing schema..." -node ./node_modules/prisma/build/index.js db push --skip-generate --accept-data-loss 2>&1 || \ - echo "[db] ⚠ Schema sync failed, starting with existing schema" +# 1) Create any new tables +sqlite3 "$TEMPLATE" ".schema" | \ + sed 's/CREATE TABLE /CREATE TABLE IF NOT EXISTS /g' | \ + sed 's/CREATE INDEX /CREATE INDEX IF NOT EXISTS /g' | \ + sed 's/CREATE UNIQUE INDEX /CREATE UNIQUE INDEX IF NOT EXISTS /g' | \ + sqlite3 "$DB" 2>/dev/null || true + +# 2) Add missing columns to existing tables +for table in $(sqlite3 "$TEMPLATE" "SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_prisma%'"); do + prod_cols=$(sqlite3 "$DB" "PRAGMA table_info('$table')" 2>/dev/null | cut -d'|' -f2 || echo "") + + sqlite3 "$TEMPLATE" "PRAGMA table_info('$table')" | while IFS='|' read -r _cid name type notnull dflt _pk; do + if ! echo "$prod_cols" | grep -qx "$name"; then + alter="ALTER TABLE \"$table\" ADD COLUMN \"$name\" $type" + [ -n "$dflt" ] && alter="$alter DEFAULT $dflt" + sqlite3 "$DB" "$alter" 2>/dev/null && echo "[db] + $table.$name" || true + fi + done +done + +echo "[db] Schema sync complete" exec node server.js