FROM node:20-alpine WORKDIR /app # Install system dependencies RUN apk add --no-cache python3 build-base g++ make sqlite # Install pnpm RUN npm install -g pnpm # Copy package files COPY package.json pnpm-lock.yaml ./ # Install dependencies with native bindings build approval RUN pnpm install --unsafe-perm --no-optional --frozen-lockfile RUN pnpm rebuild better-sqlite3 # Install tsx for running TypeScript files directly RUN pnpm add -D tsx # Copy source code COPY . . # Create database directory RUN mkdir -p db/ # Build the Next.js application RUN pnpm build || echo "Generate schema failed, but continuing..." # Expose the port EXPOSE 3000 # Startup script to migrate DB and start app RUN echo '#!/bin/sh' > /app/startup.sh && \ echo 'set -e' >> /app/startup.sh && \ echo 'mkdir -p /app/db' >> /app/startup.sh && \ echo 'echo "Starting application..."' >> /app/startup.sh && \ echo 'echo "Attempting database migration..."' >> /app/startup.sh && \ echo 'NODE_ENV=production node -e "const { migrate } = require(\"drizzle-orm/better-sqlite3/migrator\"); const { db } = require(\"./src/server/db/index.js\"); try { console.log(\"Running migrations...\"); migrate(db, { migrationsFolder: \"./drizzle\" }); console.log(\"Migrations completed\"); } catch(e) { console.error(\"Migration error:\", e); }"' >> /app/startup.sh && \ echo 'echo "Migration completed or skipped"' >> /app/startup.sh && \ echo 'pnpm build || echo "Build failed, but continuing with existing build..."' >> /app/startup.sh && \ echo 'pnpm start' >> /app/startup.sh && \ chmod +x /app/startup.sh # Start the application CMD ["/app/startup.sh"]