diff --git a/Dockerfile b/Dockerfile index f89b10c..619fc17 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,25 +17,25 @@ COPY . . ARG NEXT_PUBLIC_AMAP_API_KEY ENV NEXT_PUBLIC_AMAP_API_KEY=${NEXT_PUBLIC_AMAP_API_KEY} RUN npx prisma generate -ENV DATABASE_URL="file:./template.db" -RUN npx prisma db push RUN npm run build # --- Production --- 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 COPY --from=builder /app/public ./public COPY --from=builder /app/prisma ./prisma -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 + engines for schema sync on startup +COPY --from=deps /app/node_modules/prisma ./node_modules/prisma +COPY --from=deps /app/node_modules/@prisma ./node_modules/@prisma + COPY docker-entrypoint.sh ./ RUN chmod +x docker-entrypoint.sh diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh index a0d448d..6167b1c 100644 --- a/docker-entrypoint.sh +++ b/docker-entrypoint.sh @@ -1,36 +1,14 @@ #!/bin/sh set -e -TEMPLATE="/app/template.db" DB="/app/data/prod.db" if [ ! -f "$DB" ]; then - echo "[db] First run — creating database from template" - cp "$TEMPLATE" "$DB" - exec node server.js + echo "[db] First run — initializing database" fi echo "[db] Syncing 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 - +node ./node_modules/prisma/build/index.js db push --skip-generate --accept-data-loss 2>&1 echo "[db] Schema sync complete" + exec node server.js