diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..491e440 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +node_modules +dist +.data +.config +.git +.vscode +*.md +design/ +*.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0ded232 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +COPY package*.json ./ + +RUN npm ci + +COPY . . + +RUN npm run build + +# Production stage +FROM node:20-alpine + +WORKDIR /app + +COPY package*.json ./ + +RUN npm ci --only=production + +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/server.js ./ +COPY --from=builder /app/src ./src + +ENV NODE_ENV=production +ENV PORT=3001 + +EXPOSE 3001 + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..bfa77e8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3.8' + +services: + trip-planner: + build: . + container_name: trip-planner + ports: + - "3001:3001" + volumes: + - E:\docker_workspace\trip-planner_datas:/app/.data + environment: + - NODE_ENV=production + - PORT=3001 + - DATA_DIR=/app/.data + restart: unless-stopped diff --git a/server.js b/server.js index b1f5606..c481a2c 100644 --- a/server.js +++ b/server.js @@ -5,10 +5,16 @@ import path from 'path' import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const CONFIG_DIR = path.join(__dirname, '.config') + +// Support Docker environment variable for data directory +const DATA_DIR = process.env.DATA_DIR || path.join(__dirname, '.data') +const CONFIG_DIR = process.env.CONFIG_DIR || path.join(__dirname, '.config') const CONFIG_FILE = path.join(CONFIG_DIR, 'ai-config.json') -// Ensure config directory exists +// Ensure directories exist +if (!fs.existsSync(DATA_DIR)) { + fs.mkdirSync(DATA_DIR, { recursive: true }) +} if (!fs.existsSync(CONFIG_DIR)) { fs.mkdirSync(CONFIG_DIR, { recursive: true }) } diff --git a/src/db/database.js b/src/db/database.js index 770c936..2a4ad8d 100644 --- a/src/db/database.js +++ b/src/db/database.js @@ -6,12 +6,13 @@ import { fileURLToPath } from 'url' const __dirname = path.dirname(fileURLToPath(import.meta.url)) -const DB_PATH = path.join(__dirname, '../../.data', 'trip-planner.db') +// Support Docker environment variable for data directory +const DATA_DIR = process.env.DATA_DIR || path.join(__dirname, '../../.data') +const DB_PATH = path.join(DATA_DIR, 'trip-planner.db') // 确保数据目录存在 -const dbDir = path.dirname(DB_PATH) -if (!fs.existsSync(dbDir)) { - fs.mkdirSync(dbDir, { recursive: true }) +if (!fs.existsSync(DATA_DIR)) { + fs.mkdirSync(DATA_DIR, { recursive: true }) } const db = new Database(DB_PATH)