's'
This commit is contained in:
60
docker/.dockerignore
Normal file
60
docker/.dockerignore
Normal file
@@ -0,0 +1,60 @@
|
||||
# 依赖
|
||||
node_modules
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# 本地环境文件
|
||||
.env*.local
|
||||
.env
|
||||
|
||||
# Vercel
|
||||
.vercel
|
||||
|
||||
# TypeScript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
# Next.js
|
||||
.next/
|
||||
out/
|
||||
|
||||
# 生产构建
|
||||
/build
|
||||
|
||||
# 杂项
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# 调试
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# 本地环境变量
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# IDE
|
||||
.vscode
|
||||
.idea
|
||||
|
||||
# Git
|
||||
.git
|
||||
.gitignore
|
||||
README*.md
|
||||
|
||||
# Docker
|
||||
Dockerfile*
|
||||
docker-compose*
|
||||
.dockerignore
|
||||
|
||||
# 其他
|
||||
*.log
|
||||
.nyc_output
|
||||
coverage
|
||||
.cache
|
||||
54
docker/Dockerfile
Normal file
54
docker/Dockerfile
Normal file
@@ -0,0 +1,54 @@
|
||||
# 使用官方 Node.js 18 Alpine 镜像作为基础镜像
|
||||
FROM node:18-alpine AS base
|
||||
|
||||
# 安装依赖阶段
|
||||
FROM base AS deps
|
||||
# 检查 https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine
|
||||
RUN apk add --no-cache libc6-compat
|
||||
WORKDIR /app
|
||||
|
||||
# 安装依赖
|
||||
COPY package.json pnpm-lock.yaml* ./
|
||||
RUN corepack enable pnpm && pnpm i --frozen-lockfile
|
||||
|
||||
# 构建阶段
|
||||
FROM base AS builder
|
||||
WORKDIR /app
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY . .
|
||||
|
||||
# 设置环境变量
|
||||
ENV NEXT_TELEMETRY_DISABLED 1
|
||||
|
||||
# 构建应用
|
||||
RUN corepack enable pnpm && pnpm run build
|
||||
|
||||
# 运行阶段
|
||||
FROM base AS runner
|
||||
WORKDIR /app
|
||||
|
||||
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
|
||||
|
||||
# 设置正确的权限
|
||||
RUN mkdir .next
|
||||
RUN chown nextjs:nodejs .next
|
||||
|
||||
# 复制构建产物和依赖
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
USER nextjs
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
ENV PORT 3000
|
||||
ENV HOSTNAME "0.0.0.0"
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
104
docker/README.md
Normal file
104
docker/README.md
Normal file
@@ -0,0 +1,104 @@
|
||||
# Docker 部署文件
|
||||
|
||||
这个目录包含了NavSphere项目的Docker部署相关文件。
|
||||
|
||||
## 文件说明
|
||||
|
||||
### Dockerfile
|
||||
多阶段构建的Docker镜像配置文件,包含:
|
||||
- **deps阶段**: 安装项目依赖
|
||||
- **builder阶段**: 构建Next.js应用
|
||||
- **runner阶段**: 运行时环境,优化镜像大小
|
||||
|
||||
### docker-compose.yml
|
||||
开发环境的Docker Compose配置:
|
||||
- 端口映射: 3000:3000
|
||||
- 环境变量通过 `.env.local` 文件加载
|
||||
- 包含健康检查配置
|
||||
|
||||
### docker-compose.prod.yml
|
||||
生产环境的Docker Compose配置:
|
||||
- 端口映射: 80:3000 (生产环境通常使用80端口)
|
||||
- 资源限制: 内存限制512M,预留256M
|
||||
- 日志轮转配置
|
||||
- 自动重启策略
|
||||
|
||||
### .dockerignore
|
||||
Docker构建时忽略的文件和目录:
|
||||
- node_modules
|
||||
- .git
|
||||
- 开发环境文件
|
||||
- 构建产物等
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 快速部署
|
||||
```bash
|
||||
# 在项目根目录执行
|
||||
./scripts/docker-deploy.sh
|
||||
```
|
||||
|
||||
### 手动部署
|
||||
|
||||
1. **构建镜像**
|
||||
```bash
|
||||
docker build -f docker/Dockerfile -t navsphere:latest .
|
||||
```
|
||||
|
||||
2. **开发环境**
|
||||
```bash
|
||||
docker-compose -f docker/docker-compose.yml up -d
|
||||
```
|
||||
|
||||
3. **生产环境**
|
||||
```bash
|
||||
docker-compose -f docker/docker-compose.prod.yml up -d
|
||||
```
|
||||
|
||||
### 管理命令
|
||||
|
||||
```bash
|
||||
# 查看容器状态
|
||||
docker-compose -f docker/docker-compose.yml ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose -f docker/docker-compose.yml logs -f
|
||||
|
||||
# 停止服务
|
||||
docker-compose -f docker/docker-compose.yml down
|
||||
|
||||
# 重启服务
|
||||
docker-compose -f docker/docker-compose.yml restart
|
||||
```
|
||||
|
||||
## 环境要求
|
||||
|
||||
- Docker 20.0+
|
||||
- Docker Compose 2.0+
|
||||
- 至少512MB可用内存
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **环境变量**: 确保项目根目录存在 `.env.local` 文件
|
||||
2. **端口冲突**: 确保3000端口(开发)或80端口(生产)未被占用
|
||||
3. **健康检查**: 服务启动后会自动进行健康检查,确保服务正常运行
|
||||
4. **数据持久化**: 当前配置不包含数据卷,重启容器不会丢失数据(因为数据存储在GitHub)
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **构建失败**
|
||||
- 检查Docker版本
|
||||
- 确保网络连接正常
|
||||
- 查看构建日志: `docker build -f docker/Dockerfile -t navsphere:latest . --no-cache`
|
||||
|
||||
2. **容器启动失败**
|
||||
- 检查环境变量配置
|
||||
- 查看容器日志: `docker-compose -f docker/docker-compose.yml logs`
|
||||
- 检查端口是否被占用
|
||||
|
||||
3. **健康检查失败**
|
||||
- 等待更长时间让服务完全启动
|
||||
- 检查 `/api/health` 端点是否正常
|
||||
- 查看应用日志排查问题
|
||||
31
docker/docker-compose.prod.yml
Normal file
31
docker/docker-compose.prod.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "80:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
env_file:
|
||||
- .env.local
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 512M
|
||||
reservations:
|
||||
memory: 256M
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
22
docker/docker-compose.yml
Normal file
22
docker/docker-compose.yml
Normal file
@@ -0,0 +1,22 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
ports:
|
||||
- "3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- NEXTAUTH_URL=http://localhost:3000/api/auth
|
||||
- NEXT_PUBLIC_API_URL=http://localhost:3000
|
||||
env_file:
|
||||
- .env.local
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 40s
|
||||
Reference in New Issue
Block a user