Files
InsightReply/docs/DEPLOYMENT.md
zs 8cf6cb944b
Some checks failed
Extension Build & Release / build (push) Failing after 1m5s
Backend Deploy (Go + Docker) / deploy (push) Failing after 1m40s
Web Console Deploy (Vue 3 + Vite) / deploy (push) Has been cancelled
feat: 部署初版测试
2026-03-02 21:25:21 +08:00

5.6 KiB
Raw Blame History

InsightReply 部署与发布指南

本文档记录了 InsightReply 项目在生产环境下的自动化持续部署 (CI/CD) 策略。 由于项目由后端 (Go) 和前端浏览器扩展 (Vue) 组成,为了保证构建速度并解耦故障,我们采用了前后端分离的部署工作流。


🏗 CI/CD 架构方案

我们的自动部署工作流依赖于 Gitea Actions运行在 main 分支的推送动作上。

1. 后端自动化部署 (Docker)

工作流文件.gitea/workflows/backend-deploy.yml 触发条件:当推送代码到 main 分支,且 server/** 目录有变更时触发。

执行流程

  1. 获取代码并安装 Go 1.24 环境
  2. 交叉编译:在 Runner 上编译出适用于 Linux ARM64 的可执行文件 server_bin
  3. 准备部署包:将可执行文件、Dockerfiledocker-compose.yml 收集到部署文件夹。
  4. Rsync 同步:将文件同步到生产服务器的 /var/admin/InsightReply/server/ 目录下。
  5. 平滑重启服务:通过 SSH 远程执行 docker-compose up -d --build,实现不宕机更新。

Warning

Rsync 安全提醒--delete 参数会删除目标目录中不在源端的文件。务必配合 --exclude 排除 .env 和日志文件:

ARGS: -avz --delete --exclude '.env' --exclude '*.log'

服务器端准备工作

  • 必须在目标服务器上安装 Docker 和 Docker Compose。
  • /var/admin/InsightReply/server/ 目录下创建 .env 文件(参考 server/.env.example)。

2. 前端浏览器扩展构建打包

工作流文件.gitea/workflows/extension-build.yml 触发条件:当推送代码到 main 分支,且 extension/** 目录有变更时触发。

执行流程

  1. 获取代码并安装 Node.js 20 环境
  2. 依赖与构建:执行 npm installnpm run build,编译 Vite/Vue 产物。
  3. 打包产物:将生成的 dist 目录打包为 insight-reply-extension.zip
  4. Gitea Release:将生成的 zip 包发布到 Gitea Release。

Tip

后续需要上架 Chrome Web Store 时,可在此流程增加 Chrome Web Store API 上传步骤。


3. 版本管理与发布策略

发布类型 触发条件 行为
持续部署 push main + 路径过滤 自动部署到生产/构建扩展
正式发版 (规划中) 推送 v* Tag 创建 Gitea Release + 编译产物附件

推荐版本号规则

  • 后端:v1.0.0v1.1.0v1.1.1(语义化版本)
  • 扩展:同步跟随后端大版本,manifest.json 中的 version 对齐

🔧 Docker 运维规范

容器配置要点

# docker-compose.yml 推荐配置
services:
  insight-reply-server:
    build: .
    container_name: insight-reply-server
    restart: always
    ports:
      - "8080:8080"
    env_file:
      - .env
    healthcheck:
      test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/api/v1/health"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 10s
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - insight_network

Important

Healthcheck 说明:当健康检查连续失败 3 次后Docker 会将容器标记为 unhealthy。配合 restart: always 可自动恢复。

Dockerfile 优化建议

FROM alpine:latest

RUN apk --no-cache add ca-certificates tzdata wget

ENV TZ=Asia/Shanghai

WORKDIR /app

COPY server_bin .
RUN chmod +x server_bin

EXPOSE 8080

HEALTHCHECK --interval=30s --timeout=5s \
  CMD wget --spider -q http://localhost:8080/api/v1/health || exit 1

CMD ["./server_bin"]

🌐 HTTPS 配置 (反向代理)

生产环境必须使用 HTTPS。推荐使用 Caddy 自动签发 Let's Encrypt 证书:

# Caddyfile 示例
api.insightreply.com {
    reverse_proxy localhost:8080
}

或使用 Nginx

server {
    listen 443 ssl;
    server_name api.insightreply.com;

    ssl_certificate /etc/ssl/certs/cert.pem;
    ssl_certificate_key /etc/ssl/private/key.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        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;
    }
}

🔑 凭证管理 (Secrets)

要使自动化部署正常运行,请在此 Gitea 仓库的 Settings -> Actions -> Secrets 中配置以下环境变量:

Secret 名称 用途
USAARMLOGIN_SSH_KEY SSH 私钥,用于连接部署目标服务器
GITEA_TOKEN Gitea API Token用于发布 Release

🔧 服务端运维常用命令 (后端)

部署完成后,如果你需要登录目标服务器进行人工排查:

cd /var/admin/InsightReply/server/

# 查看应用运行状态
docker-compose ps

# 查看应用最新日志
docker-compose logs -f insight-reply-server

# 查看最近 100 行日志
docker-compose logs --tail 100 insight-reply-server

# 重启应用服务
docker-compose restart insight-reply-server

# 强制重新构建并启动
docker-compose up -d --build

# 进入容器内部排查
docker exec -it insight-reply-server sh

📊 监控与告警 (规划中)

维度 方案
应用日志 Docker JSON 日志 + 未来接入 Loki 或 Datadog
健康检查 Docker healthcheck + Uptime Kuma
APM 后续考虑接入 Sentry Go SDK
成本监控 api_usage_logs 表追踪 Token 消耗