diff --git a/Dockerfile b/Dockerfile index d19cef8..a767ced 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,34 +1,19 @@ -FROM node:25-alpine AS base +FROM node:25-alpine WORKDIR /app -# Dependencies stage -FROM base AS deps +# Install dependencies COPY package*.json ./ RUN npm install --production -# Production stage -FROM base AS production -COPY --from=deps /app/node_modules ./node_modules +# Copy application code COPY . . -# Copy init script -COPY scripts/init-data-dir.sh /usr/local/bin/init-data-dir.sh -RUN chmod +x /usr/local/bin/init-data-dir.sh - -EXPOSE 3000 - -# Create a non-root user -RUN addgroup -g 1001 -S nodejs -RUN adduser -S nextjs -u 1001 - -# Create directory for database -RUN mkdir -p /app/data - -USER nextjs +# Create directory for database with open permissions +RUN mkdir -p /app/data && chmod 777 /app/data # Set environment variable for database path ENV DB_PATH=/app/data/data.db -# Use init script as entrypoint wrapper -ENTRYPOINT ["/usr/local/bin/init-data-dir.sh"] +EXPOSE 3000 + CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index dc81f29..5237a2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,15 +12,6 @@ services: environment: - PORT=3000 - JWT_SECRET=${JWT_SECRET:-change-this-secret-key-in-production} - - DB_PATH=/app/data/data.db volumes: - ./data:/app/data restart: unless-stopped - depends_on: - - init-data-dir - - init-data-dir: - image: alpine:latest - command: chown -R 1001:1001 /app/data - volumes: - - ./data:/app/data diff --git a/scripts/init-data-dir.sh b/scripts/init-data-dir.sh index d21fd21..3678b5a 100644 --- a/scripts/init-data-dir.sh +++ b/scripts/init-data-dir.sh @@ -3,12 +3,14 @@ # Create data directory if it doesn't exist mkdir -p /app/data -# Try to set permissions for the data directory -# This might fail in some environments, but that's okay -chown -R 1001:1001 /app/data 2>/dev/null || true -chmod 755 /app/data 2>/dev/null || true +# Try to create the database file if it doesn't exist +touch /app/data/data.db 2>/dev/null || true -echo "Data directory initialized" +# Set permissions for the data directory and database file +chmod 777 /app/data 2>/dev/null || true +chmod 666 /app/data/data.db 2>/dev/null || true + +echo "Data directory initialized with open permissions" # Execute the main command exec "$@" diff --git a/server/database.js b/server/database.js index 1680354..0eb675b 100644 --- a/server/database.js +++ b/server/database.js @@ -1,9 +1,32 @@ const sqlite3 = require('sqlite3').verbose(); const { DB_PATH } = require('./config'); +const fs = require('fs'); +const path = require('path'); + +// Ensure the directory exists +const dbDir = path.dirname(DB_PATH); +if (!fs.existsSync(dbDir)) { + try { + fs.mkdirSync(dbDir, { recursive: true }); + console.log('Created database directory:', dbDir); + } catch (err) { + console.error('Failed to create database directory:', err.message); + } +} + +// Try to create the database file if it doesn't exist +try { + fs.closeSync(fs.openSync(DB_PATH, 'a')); + console.log('Database file is accessible:', DB_PATH); +} catch (err) { + console.error('Failed to access database file:', err.message); +} const db = new sqlite3.Database(DB_PATH, (err) => { if (err) { console.error('数据库连接失败:', err.message); + console.error('数据库路径:', DB_PATH); + console.error('当前工作目录:', process.cwd()); process.exit(1); } console.log('已连接到 SQLite 数据库');