IndieShow 图标IndieShow 使用文档
部署上线

使用 Docker 部署

使用 Docker 容器化部署 IndieShow 项目的详细指南,包括环境配置、镜像构建和容器编排

使用 Docker 部署

IndieShow 项目已经预配置了完整的 Docker 支持,包括多阶段构建、安全优化和性能调优。本指南将帮助您了解如何使用 Docker 部署您的应用。

准备工作

在开始之前,请确保:

  1. 安装了 Docker(Docker 安装指南
  2. 项目代码已经完成开发和测试
  3. 准备好所需的环境变量

Docker 配置说明

项目中的 Docker 配置采用了多阶段构建策略,主要包含三个阶段:

  1. deps: 安装依赖阶段
  2. builder: 构建应用阶段
  3. runner: 运行应用阶段

主要特性

  • 使用 Node.js 22.14.0 和 Alpine 3.21 基础镜像
  • 采用 pnpm 10.4.1 作为包管理器
  • 实现了最佳安全实践(非 root 用户运行、文件权限控制等)
  • 优化的缓存策略和构建层
  • 支持自定义环境变量配置

环境变量配置

项目支持以下环境变量:

# 必需的环境变量
NUXT_PUBLIC_SITE_URL=https://your-domain.com    # 网站 URL
NUXT_PUBLIC_SITE_NAME="Your Site Name"          # 网站名称
NUXT_PUBLIC_API_BASE=https://api.your-domain.com # API 基础 URL
 
# 可选的环境变量
NUXT_PUBLIC_TYPEWRITER_ENABLED=true             # 是否启用打字机效果
NUXT_PUBLIC_TYPEWRITER_SPEED=50                 # 打字机效果速度
NUXT_PUBLIC_GA_ID=                              # Google Analyti
NUXT_PUBLIC_UMAMI_WEBSITE_ID=                   # Umami 网站统计 ID
NUXT_PUBLIC_PLAUSIBLE_DOMAIN=                   # Plausible Analytics 域名
NUXT_PUBLIC_OP_CLIENT_ID=                       # OpenID Connect 客户端 ID
NUXT_PUBLIC_BAIDU_ID=                           # 百度统计 ID

部署步骤

使用以下命令构建镜像,注意替换环境变量值:

构建命令
docker build \
  --build-arg NUXT_PUBLIC_SITE_URL=https://your-domain.com \
  --build-arg NUXT_PUBLIC_SITE_NAME="Your Site Name" \
  --build-arg NUXT_PUBLIC_API_BASE=https://api.your-domain.com \  
  --build-arg NUXT_PUBLIC_TYPEWRITER_ENABLED=true \
  --build-arg NUXT_PUBLIC_TYPEWRITER_SPEED=50 \
  --build-arg NUXT_PUBLIC_GA_ID=your-ga-id \
  --build-arg NUXT_PUBLIC_UMAMI_WEBSITE_ID=your-umami-id \
  --build-arg NUXT_PUBLIC_PLAUSIBLE_DOMAIN=your-domain.com \
  --build-arg NUXT_PUBLIC_OP_CLIENT_ID=your-op-client-id \
  --build-arg NUXT_PUBLIC_BAIDU_ID=your-baidu-id \
  -t indieshow-app .
运行容器
docker run -d \
  -p 3000:3000 \
  --name indieshow \
  --restart unless-stopped \
  indieshow-app
容器状态查看
# 查看容器日志
docker logs -f indieshow
 
# 查看容器状态
docker ps -a

使用 Docker Compose

对于开发环境或简单的部署场景,可以使用 Docker Compose:

docker-compose.yml
# docker-compose.yml
version: '3.8'
 
services:
  app:
    build:
      context: .
      args:
        NUXT_PUBLIC_SITE_URL: https://your-domain.com
        NUXT_PUBLIC_SITE_NAME: Your Site Name
        NUXT_PUBLIC_API_BASE: https://api.your-domain.com
        NUXT_PUBLIC_GA_ID: your-ga-id
        NUXT_PUBLIC_TYPEWRITER_ENABLED: "true"
        NUXT_PUBLIC_TYPEWRITER_SPEED: "50"
        NUXT_PUBLIC_UMAMI_WEBSITE_ID: your-umami-id
        NUXT_PUBLIC_PLAUSIBLE_DOMAIN: your-domain.com
        NUXT_PUBLIC_OP_CLIENT_ID: your-op-client-id
        NUXT_PUBLIC_BAIDU_ID: your-baidu-id
    ports:
      - "3000:3000"
    restart: unless-stopped

使用以下命令启动服务:

Docker Compose 命令
# 启动服务
docker-compose up -d
 
# 查看日志
docker-compose logs -f

生产环境部署建议

1. 使用 Nginx 反向代理

推荐的 Nginx 配置:

nginx.conf
# nginx.conf
server {
    listen 80;
    server_name your-domain.com;
 
    # 开启 gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
    # 安全相关头部
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";
 
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. 容器资源限制

在生产环境中,建议设置容器资源限制:

资源限制命令
docker run -d \
  -p 3000:3000 \
  --name indieshow \
  --restart unless-stopped \
  --memory="2g" \
  --memory-swap="2g" \
  --cpus="2" \
  indieshow-app

3. 日志管理

配置日志轮转以防止日志文件过大:

日志配置命令
# 在 docker run 命令中添加日志配置
docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  ... # 其他选项

监控和维护

1. 容器健康检查

可以使用 Docker 的健康检查功能:

健康检查命令
docker run -d \
  --health-cmd="curl -f http://localhost:3000/api/health || exit 1" \
  --health-interval=30s \
  --health-timeout=10s \
  --health-retries=3 \
  --health-start-period=40s \
  ... # 其他选项

2. 常用维护命令

维护命令
# 查看容器资源使用情况
docker stats indieshow
 
# 查看容器详细信息
docker inspect indieshow
 
# 更新容器
docker pull indieshow-app:latest
docker-compose up -d --no-deps --build app
 
# 备份容器数据
docker cp indieshow:/app/data ./backup

常见问题解决

1. 构建失败

常见原因和解决方案:

  • 网络问题:检查网络连接,必要时配置镜像源
  • 内存不足:增加 Docker 可用内存
  • 依赖问题:清理并重新安装依赖

2. 容器无法启动

检查以下几点:

  • 端口占用:确保 3000 端口未被占用
  • 环境变量:验证所有必需的环境变量都已正确设置
  • 日志信息:使用 docker logs 查看详细错误信息

3. 性能优化

  • 使用 NODE_ENV=production 环境变量
  • 配置适当的 Node.js 内存限制
  • 启用 Nginx 缓存和 gzip 压缩
  • 定期清理未使用的镜像和容器

资源链接

下一步