以下是完整的 Next.js + SQLite 项目 Docker 生产环境部署方案:
1. 项目结构准备
bash
your-project/
├── prisma/
│ ├── schema.prisma
│ └── migrations/
├── app/
├── lib/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
└── .env.production
2. 关键配置文件
Dockerfile
dockerfile
# 使用官方 Node 镜像
FROM node:18-alpine AS builder
# 安装依赖
WORKDIR /app
COPY package*.json ./
COPY prisma ./prisma/
RUN npm ci
# 生成 Prisma 客户端
RUN npx prisma generate
# 构建应用
COPY . .
RUN npm run build
# 生产镜像
FROM node:18-alpine AS runner
WORKDIR /app
# 仅安装生产依赖
COPY --from=builder /app/package*.json ./
RUN npm ci --only=production
# 复制必要文件
COPY --from=builder /app/node_modules/.prisma ./node_modules/.prisma
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/prisma ./prisma
COPY --from=builder /app/package.json ./
# 设置环境变量
ENV NODE_ENV production
ENV DATABASE_URL file:/app/data/prod.db
# 持久化数据卷
VOLUME /app/data
EXPOSE 3000
CMD ["npm", "start"]
docker-compose.yml
yaml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- db_data:/app/data
environment:
- NODE_ENV=production
- DATABASE_URL=file:/app/data/prod.db
restart: unless-stopped
volumes:
db_data:
.dockerignore
node_modules
.next
.env*
Dockerfile
docker-compose.yml
.env.production
ini
DATABASE_URL="file:./data/prod.db"
NEXTAUTH_SECRET="your-production-secret"
NEXTAUTH_URL="http://your-domain.com"
3. 部署步骤
1. 构建生产镜像
bash
docker-compose build
2. 初始化数据库
bash
# 创建数据目录
mkdir -p data
# 应用数据库迁移
docker-compose run --rm app npx prisma migrate deploy
3. 启动服务
bash
docker-compose up -d
4. 查看日志
bash
docker-compose logs -f
4. 关键配置说明
SQLite 生产环境优化
prisma
// prisma/schema.prisma
datasource db {
provider = "sqlite"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
previewFeatures = ["fullTextSearch"]
}
数据库备份方案
bash
# 备份数据库
docker exec -it your-container-id sqlite3 /app/data/prod.db ".backup /app/data/backup.db"
# 恢复数据库
docker exec -it your-container-id cp /app/data/backup.db /app/data/prod.db
健康检查配置
yaml
# docker-compose.yml 补充
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 10s
retries: 3
5. 常见问题解决方案
问题1:数据库权限错误
bash
# 确保数据目录可写
docker-compose run --rm app chown -R node:node /app/data
问题2:迁移失败
bash
# 重置开发环境
docker-compose down -v
docker-compose run --rm app npx prisma migrate reset --force
问题3:性能优化
dockerfile
# Dockerfile 补充
RUN apk add --no-cache libc6-compat
ENV NEXT_TELEMETRY_DISABLED 1
6. 监控与维护
日志收集
bash
# 查看最近100行日志
docker-compose logs --tail=100
性能监控
bash
docker stats
更新流程
bash
docker-compose down
git pull origin main
docker-compose build --no-cache
docker-compose up -d
7. 安全建议
-
数据库加密
prisma// 使用 SQLCipher datasource db { provider = "sqlite" url = "file:./data/prod.db?cipher=sqlcipher&key=your-secret-key" }
-
定期备份
bash# 每日备份脚本 0 3 * * * docker exec app sqlite3 /app/data/prod.db ".backup /app/data/backup-$(date +\%Y\%m\%d).db"
-
网络隔离
yaml# docker-compose.yml networks: internal: internal: true
通过以上配置,你将获得:
✅ 可复制的生产环境部署
✅ 持久化的 SQLite 数据库存储
✅ 自动化的迁移流程
✅ 完善的监控方案
✅ 企业级安全实践
***问题记录:
next-auth\]\[error\]\[NO_SECRET
bash
# 每月轮换脚本
#!/bin/bash
NEW_SECRET=$(openssl rand -base64 32)
sed -i "s/NEXTAUTH_SECRET=.*/NEXTAUTH_SECRET=$NEW_SECRET/" .env.production
docker-compose down && docker-compose up -d