Files
leaudit-platform-frontend/docs/docker-deployment.md
T

6.9 KiB
Raw Blame History

Docker 部署指南

环境变量工作原理

在 Remix 项目中如何工作

  1. 构建时环境变量: 在 Docker 构建时,环境变量会被嵌入到构建产物中
  2. 运行时环境变量: 通过 dotenv 包在应用启动时加载环境变量
  3. 客户端环境变量: 以 NEXT_PUBLIC_ 开头的变量可以在客户端访问

API 配置文件的识别机制

我们的 app/config/api-config.ts 配置文件通过以下方式识别环境变量:

// 从环境变量获取配置,如果环境变量不存在则使用默认配置
const getConfigFromEnv = (defaultConfig: ApiConfig): ApiConfig => {
  return {
    baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL || defaultConfig.baseUrl,
    documentUrl: process.env.NEXT_PUBLIC_DOCUMENT_URL || defaultConfig.documentUrl,
    uploadUrl: process.env.NEXT_PUBLIC_UPLOAD_URL || defaultConfig.uploadUrl,
    postgrestUrl: process.env.NEXT_PUBLIC_POSTGREST_URL || defaultConfig.postgrestUrl,
  };
};

文件使用配置的映射关系

  1. app/api/axios-client.ts 使用:

    • API_BASE_URL (来自 NEXT_PUBLIC_API_BASE_URL)
    • DOCUMENT_URL (来自 NEXT_PUBLIC_DOCUMENT_URL)
  2. app/api/files/files-upload.ts 使用:

    • UPLOAD_URL (来自 NEXT_PUBLIC_UPLOAD_URL)

Docker 部署方式

方式一:直接使用 docker run 命令

# 构建镜像
docker build -t docreview-app .

# 运行容器,通过 -e 参数传入环境变量
docker run -d \
  --name docreview \
  -p 3000:3000 \
  -e NODE_ENV=production \
  -e NEXT_PUBLIC_API_BASE_URL=http://your-api-server.com:3000 \
  -e NEXT_PUBLIC_DOCUMENT_URL=http://your-docs-server.com:9000/docauditai/ \
  -e NEXT_PUBLIC_UPLOAD_URL=http://your-upload-server.com:8008/admin/documents/upload \
  docreview-app

方式二:使用 docker-compose

  1. 使用内联环境变量:
# docker-compose.yml
version: '3.8'
services:
  docreview-app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - NEXT_PUBLIC_API_BASE_URL=http://api.company.com:3000
      - NEXT_PUBLIC_DOCUMENT_URL=http://docs.company.com:9000/docauditai/
      - NEXT_PUBLIC_UPLOAD_URL=http://upload.company.com:8008/admin/documents/upload
  1. 使用环境变量文件:

创建 .env.production 文件:

NODE_ENV=production
NEXT_PUBLIC_API_BASE_URL=http://api.company.com:3000
NEXT_PUBLIC_DOCUMENT_URL=http://docs.company.com:9000/docauditai/
NEXT_PUBLIC_UPLOAD_URL=http://upload.company.com:8008/admin/documents/upload

然后在 docker-compose.yml 中引用:

services:
  docreview-app:
    build: .
    ports:
      - "3000:3000"
    env_file:
      - .env.production

方式三:Kubernetes 部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: docreview-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: docreview-app
  template:
    metadata:
      labels:
        app: docreview-app
    spec:
      containers:
      - name: docreview-app
        image: docreview-app:latest
        ports:
        - containerPort: 3000
        env:
        - name: NODE_ENV
          value: "production"
        - name: NEXT_PUBLIC_API_BASE_URL
          value: "http://api.company.com:3000"
        - name: NEXT_PUBLIC_DOCUMENT_URL
          value: "http://docs.company.com:9000/docauditai/"
        - name: NEXT_PUBLIC_UPLOAD_URL
          value: "http://upload.company.com:8008/admin/documents/upload"

环境变量验证

在容器内检查环境变量

# 进入运行中的容器
docker exec -it docreview /bin/sh

# 查看环境变量
env | grep NEXT_PUBLIC

# 或者查看具体变量
echo $NEXT_PUBLIC_API_BASE_URL
echo $NEXT_PUBLIC_DOCUMENT_URL
echo $NEXT_PUBLIC_UPLOAD_URL

应用内验证

在开发模式下,配置文件会输出当前使用的配置:

📦 API配置信息: {
  environment: "production",
  config: {
    baseUrl: "http://api.company.com:3000",
    documentUrl: "http://docs.company.com:9000/docauditai/",
    uploadUrl: "http://upload.company.com:8008/admin/documents/upload"
  }
}

构建时的环境变量注入

方式一:Docker 构建时传入

docker build \
  --build-arg NEXT_PUBLIC_API_BASE_URL=http://api.company.com:3000 \
  --build-arg NEXT_PUBLIC_DOCUMENT_URL=http://docs.company.com:9000/docauditai/ \
  --build-arg NEXT_PUBLIC_UPLOAD_URL=http://upload.company.com:8008/admin/documents/upload \
  -t docreview-app .

然后在 Dockerfile 中添加:

# 在构建阶段添加
ARG NEXT_PUBLIC_API_BASE_URL
ARG NEXT_PUBLIC_DOCUMENT_URL
ARG NEXT_PUBLIC_UPLOAD_URL

ENV NEXT_PUBLIC_API_BASE_URL=$NEXT_PUBLIC_API_BASE_URL
ENV NEXT_PUBLIC_DOCUMENT_URL=$NEXT_PUBLIC_DOCUMENT_URL
ENV NEXT_PUBLIC_UPLOAD_URL=$NEXT_PUBLIC_UPLOAD_URL

多环境配置示例

开发环境

# .env.development
NODE_ENV=development
NEXT_PUBLIC_API_BASE_URL=http://localhost:8008
NEXT_PUBLIC_DOCUMENT_URL=http://localhost:9000/docauditai/
NEXT_PUBLIC_UPLOAD_URL=http://localhost:8008/admin/documents/upload

测试环境

# .env.testing
NODE_ENV=testing
NEXT_PUBLIC_API_BASE_URL=http://test-api.company.com:3000
NEXT_PUBLIC_DOCUMENT_URL=http://test-docs.company.com:9000/docauditai/
NEXT_PUBLIC_UPLOAD_URL=http://test-upload.company.com:8008/admin/documents/upload

生产环境

# .env.production
NODE_ENV=production
NEXT_PUBLIC_API_BASE_URL=http://api.company.com:3000
NEXT_PUBLIC_DOCUMENT_URL=http://docs.company.com:9000/docauditai/
NEXT_PUBLIC_UPLOAD_URL=http://upload.company.com:8008/admin/documents/upload

部署脚本示例

创建 deploy.sh 脚本:

#!/bin/bash

# 部署脚本
ENV=${1:-production}

echo "部署环境: $ENV"

# 构建镜像
docker build -t docreview-app:$ENV .

# 停止旧容器
docker stop docreview-$ENV 2>/dev/null || true
docker rm docreview-$ENV 2>/dev/null || true

# 根据环境启动容器
case $ENV in
  "development")
    docker run -d \
      --name docreview-$ENV \
      -p 3001:3000 \
      --env-file .env.development \
      docreview-app:$ENV
    ;;
  "testing")
    docker run -d \
      --name docreview-$ENV \
      -p 3002:3000 \
      --env-file .env.testing \
      docreview-app:$ENV
    ;;
  "production")
    docker run -d \
      --name docreview-$ENV \
      -p 3000:3000 \
      --env-file .env.production \
      docreview-app:$ENV
    ;;
esac

echo "部署完成,容器名: docreview-$ENV"

使用方法:

chmod +x deploy.sh
./deploy.sh production  # 部署生产环境
./deploy.sh testing     # 部署测试环境

注意事项

  1. 环境变量优先级Docker 环境变量 > 环境变量文件 > 默认配置
  2. 客户端变量:必须以 NEXT_PUBLIC_ 开头才能在客户端使用
  3. 构建时注入:客户端环境变量在构建时被注入,运行时修改不会生效
  4. 安全性:不要在环境变量中存储敏感信息,如API密钥等
  5. 网络访问:确保容器能够访问配置的API地址