以下是完整的 Next.js + SQLite 項目 Docker 生產環境部署方案:
1. 項目結構準備
your-project/
├── prisma/
│ ├── schema.prisma
│ └── migrations/
├── app/
├── lib/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
└── .env.production
2. 關鍵配置文件
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/dataEXPOSE 3000
CMD ["npm", "start"]
docker-compose.yml
version: '3.8'services:app:build: .ports:- "3000:3000"volumes:- db_data:/app/dataenvironment:- NODE_ENV=production- DATABASE_URL=file:/app/data/prod.dbrestart: unless-stoppedvolumes:db_data:
.dockerignore
node_modules
.next
.env*
Dockerfile
docker-compose.yml
.env.production
DATABASE_URL="file:./data/prod.db"
NEXTAUTH_SECRET="your-production-secret"
NEXTAUTH_URL="http://your-domain.com"
3. 部署步驟
1. 構建生產鏡像
docker-compose build
2. 初始化數據庫
# 創建數據目錄
mkdir -p data# 應用數據庫遷移
docker-compose run --rm app npx prisma migrate deploy
3. 啟動服務
docker-compose up -d
4. 查看日志
docker-compose logs -f
4. 關鍵配置說明
SQLite 生產環境優化
// prisma/schema.prisma
datasource db {provider = "sqlite"url = env("DATABASE_URL")
}generator client {provider = "prisma-client-js"previewFeatures = ["fullTextSearch"]
}
數據庫備份方案
# 備份數據庫
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
健康檢查配置
# docker-compose.yml 補充
healthcheck:test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]interval: 30stimeout: 10sretries: 3
5. 常見問題解決方案
問題1:數據庫權限錯誤
# 確保數據目錄可寫
docker-compose run --rm app chown -R node:node /app/data
問題2:遷移失敗
# 重置開發環境
docker-compose down -v
docker-compose run --rm app npx prisma migrate reset --force
問題3:性能優化
# Dockerfile 補充
RUN apk add --no-cache libc6-compat
ENV NEXT_TELEMETRY_DISABLED 1
6. 監控與維護
日志收集
# 查看最近100行日志
docker-compose logs --tail=100
性能監控
docker stats
更新流程
docker-compose down
git pull origin main
docker-compose build --no-cache
docker-compose up -d
7. 安全建議
-
數據庫加密
// 使用 SQLCipher datasource db {provider = "sqlite"url = "file:./data/prod.db?cipher=sqlcipher&key=your-secret-key" } -
定期備份
# 每日備份腳本 0 3 * * * docker exec app sqlite3 /app/data/prod.db ".backup /app/data/backup-$(date +\%Y\%m\%d).db" -
網絡隔離
# docker-compose.yml networks:internal:internal: true
通過以上配置,你將獲得:
? 可復制的生產環境部署
? 持久化的 SQLite 數據庫存儲
? 自動化的遷移流程
? 完善的監控方案
? 企業級安全實踐
***問題記錄:
[next-auth][error][NO_SECRET]
# 每月輪換腳本
#!/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