diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a50d691 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +.next +.git +*.md +.env +.env.local +prisma/dev.db +prisma/dev.db-journal diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3447f8b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +FROM node:20-alpine AS base + +# ── 依赖安装层 ── +FROM base AS deps +WORKDIR /app +RUN corepack enable pnpm +COPY package.json pnpm-lock.yaml ./ +COPY prisma ./prisma +RUN pnpm install --frozen-lockfile +RUN pnpm exec prisma generate + +# ── 构建层 ── +FROM base AS builder +WORKDIR /app +RUN corepack enable pnpm +COPY --from=deps /app/node_modules ./node_modules +COPY . . +ENV NEXT_TELEMETRY_DISABLED=1 +RUN pnpm build + +# ── 运行层 ── +FROM base AS runner +WORKDIR /app +RUN corepack enable pnpm + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# 拷贝构建产物 +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static + +# 拷贝 prisma 和数据库 +COPY --from=builder /app/prisma ./prisma +COPY --from=deps /app/node_modules/.prisma ./node_modules/.prisma +COPY --from=deps /app/node_modules/@prisma ./node_modules/@prisma + +# 数据库持久化目录 +RUN mkdir -p /app/prisma && chown -R nextjs:nodejs /app + +USER nextjs +EXPOSE 3000 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..198d75a --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,19 @@ +services: + blog: + build: . + container_name: sui-blog + restart: unless-stopped + ports: + - "3000:3000" + environment: + - DATABASE_URL=file:/app/prisma/dev.db + - SESSION_SECRET=${SESSION_SECRET:-change-me-to-a-random-string} + - ADMIN_PASSWORD=${ADMIN_PASSWORD:-asui2026} + - AI_BASE_URL=${AI_BASE_URL:-https://api.openai.com/v1} + - AI_API_KEY=${AI_API_KEY:-} + - AI_MODEL=${AI_MODEL:-gpt-4o-mini} + volumes: + - blog-data:/app/prisma + +volumes: + blog-data: diff --git a/next.config.ts b/next.config.ts index 69ca4d8..8653535 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,6 +1,7 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { + output: "standalone", poweredByHeader: false, images: {