Next.js + SQLite 项目 Docker 生产环境部署方案

以下是完整的 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. 安全建议

  1. 数据库加密

    prisma 复制代码
    // 使用 SQLCipher
    datasource db {
      provider = "sqlite"
      url      = "file:./data/prod.db?cipher=sqlcipher&key=your-secret-key"
    }
  2. 定期备份

    bash 复制代码
    # 每日备份脚本
    0 3 * * * docker exec app sqlite3 /app/data/prod.db ".backup /app/data/backup-$(date +\%Y\%m\%d).db"
  3. 网络隔离

    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
相关推荐
小张是铁粉2 分钟前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信15 分钟前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记19 分钟前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花24 分钟前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay25 分钟前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu33 分钟前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
热爱生活的猴子5 小时前
阿里云服务器正确配置 Docker 国内镜像的方法
服务器·阿里云·docker
脑袋大大的6 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
速易达网络7 小时前
RuoYi、Vue CLI 和 uni-app 结合构建跨端全家桶方案
javascript·vue.js·低代码