{"repo": "alchemy-studio/upctl-compose", "files": {"README.md": {"02f2f6764e876475c71738fa0bb0394762c4d58c": {"t": 1785746616.3992507, "n": 4877, "h": "f6c5d2137a340ad1", "c": "# UpCtl\n\n> AI Agent 驱动的全自动开发测试部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 **用户指南**\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 & 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景(含系统架构设计、请求流程、API 路由)\n\n构建方式:`./scripts/build-pdf.sh`(编译全部 PDF,详见 [build-pdf.sh](scripts/build-pdf.sh))\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 & 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景\n- [ARCHITECTURE.md](ARCHITECTURE.md) — Markdown 版架构文档(权威来源)\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [build-pdf.sh](scripts/build-pdf.sh) — PDF 统一构建脚本\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "5c7f83c8ec8360a7ad2a7426746d30c63f144cac": {"t": 1785766301.6271667, "n": 4877, "h": "f6c5d2137a340ad1", "c": "# UpCtl\n\n> AI Agent 驱动的全自动开发测试部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 **用户指南**\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 & 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景(含系统架构设计、请求流程、API 路由)\n\n构建方式:`./scripts/build-pdf.sh`(编译全部 PDF,详见 [build-pdf.sh](scripts/build-pdf.sh))\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 & 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景\n- [ARCHITECTURE.md](ARCHITECTURE.md) — Markdown 版架构文档(权威来源)\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [build-pdf.sh](scripts/build-pdf.sh) — PDF 统一构建脚本\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "27f0fd0792c9b469cde208bc6cb997c27623c0be": {"t": 1785766302.9722612, "n": 4879, "h": "e032047d1258bc11", "c": "# UpCtl\n\n> AI Agent 驱动的全自动开发测试部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 **用户指南**\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 \\& 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景(含系统架构设计、请求流程、API 路由)\n\n构建方式:`./scripts/build-pdf.sh`(编译全部 PDF,详见 [build-pdf.sh](scripts/build-pdf.sh))\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 \\& 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景\n- [ARCHITECTURE.md](ARCHITECTURE.md) — Markdown 版架构文档(权威来源)\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [build-pdf.sh](scripts/build-pdf.sh) — PDF 统一构建脚本\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "a0df38c513c4705ff58ec6c78f2daa5a094f5240": {"t": 1785766304.5239599, "n": 4883, "h": "004dd9086735ba44", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 **用户指南**\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 \\& 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景(含系统架构设计、请求流程、API 路由)\n\n构建方式:`./scripts/build-pdf.sh`(编译全部 PDF,详见 [build-pdf.sh](scripts/build-pdf.sh))\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n- [**Agent 可靠性工程 \\& 系统架构(PDF)**](userguide/upctl-pitch.pdf) — 方法论与开源平台全景\n- [ARCHITECTURE.md](ARCHITECTURE.md) — Markdown 版架构文档(权威来源)\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [build-pdf.sh](scripts/build-pdf.sh) — PDF 统一构建脚本\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "c4ced8bd80fb752dcc99be02daa6ec3a4a29624f": {"t": 1785766306.325289, "n": 4559, "h": "c9dbf29a45516cd0", "c": "# UpCtl\n\n> AI Agent 驱动的全自动开发测试部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "5dffbcccdf5a6132d64e255a740da3e6906bf5af": {"t": 1785766308.46468, "n": 4567, "h": "5b0f56c1d50c528b", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动开发测试部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "1089505609aa9426a4f4f0cafb3dc07a768b53a4": {"t": 1785766309.8448558, "n": 4567, "h": "7f5fc67aacc00348", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动测试开发部署工作平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "02fedf36daf4da972e2136585618506382db672c": {"t": 1785766311.269818, "n": 4563, "h": "97d8db8cae8b2957", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n\n"}, "d2f8e329f98d02c4561f9ee8ff611f44170ad252": {"t": 1785766312.7740676, "n": 4562, "h": "5660df1d23ae077c", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n**登录页**\n---\n\"登录页\"/\n\n**工单列表**\n---\n\"工单列表\"/\n\n**工单详情**\n---\n\"工单详情\"/\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n"}, "352e5deef5e276fdab44c126ba84c47fd4f152dd": {"t": 1785766314.5477908, "n": 4553, "h": "bf314bdce9ecc13b", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n\"登录页\"/\n\n**登录页**\n\n\"工单列表\"/\n\n**工单列表**\n\n\"工单详情\"/\n\n**工单详情**\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n"}, "5a6be5e164f72df79da093862377cd616631978c": {"t": 1785766316.280021, "n": 4560, "h": "12a9be5f19b606e0", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n📖 [**用户手册(PDF)**](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 部署步骤与操作详解\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n\"登录页\"/\n**登录页**\n\n\"工单列表\"/\n**工单列表**\n\n\"工单详情\"/\n**工单详情**\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- [用户手册(PDF)](https://github.com/alchemy-studio/upctl-compose/raw/main/userguide/userguide.pdf) — 幻灯片格式部署指南\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n"}, "8c5e774f6412ae47ef38634dd575063f50219507": {"t": 1785766317.8175554, "n": 4484, "h": "54f2ce6d924fd0de", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n![工单列表](userguide/screenshots/05-main-page.png)\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n![AI 处理流程](userguide/screenshots/05-ticket-list-with-data.png)\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n\"登录页\"/\n**登录页**\n\n\"工单列表\"/\n**工单列表**\n\n\"工单详情\"/\n**工单详情**\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- `userguide/userguide.pdf` — 用户手册(幻灯片格式)\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n"}, "9379483d9b0664ca0bd2395eb2bf5e5e47f4a033": {"t": 1785766319.607259, "n": 4425, "h": "470269a3a5fbaeee", "c": "# upctl-compose\n\n> AI Agent 驱动的全自动工单处理平台 — 一键部署,智能响应。\n\n[![Docker Compose](https://img.shields.io/badge/Docker_Compose-2.24%2B-2496ED?logo=docker)](https://docs.docker.com/compose/)\n[![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n[![Node](https://img.shields.io/badge/node-20%2B-339933?logo=node.js)](https://nodejs.org/)\n[![Rust](https://img.shields.io/badge/Rust-1.80%2B-000000?logo=rust)](https://www.rust-lang.org/)\n\n---\n\n![工单列表](userguide/screenshots/05-main-page.png)\n\n**upctl-compose** 是一个开箱即用的工单管理系统。它把 [Gitea](https://about.gitea.com/) 作为工单后端,搭配 Vue 3 管理界面和 Rust API 服务,并通过 **DeepSeek V4 AI Agent** 自动处理已批准的工单,实现从创建到关闭的全链路自动化。\n\n## 功能特色\n\n### 🤖 AI Agent 自动处理\n\n工单创建后打上 `approved` 标签,ai-agent 自动轮询、调用 DeepSeek 模型处理,评论结果并关闭工单,全程无需人工介入。\n\n![AI 处理流程](userguide/screenshots/05-ticket-list-with-data.png)\n\n> ai-agent 每 5 分钟轮询一次。也可通过 `docker compose exec ai-agent python3 /app/poll_worker.py --once` 手动触发即时处理。\n\n### 🖥️ 工单管理界面\n\n基于 Vue 3 的现代化 SPA,支持标签页切换、卡片视图、状态标记,通过 nginx 同源代理访问各后端服务。\n\n| 登录页 | 工单列表 | 工单详情 |\n|:---:|:---:|:---:|\n| ![登录页](userguide/screenshots/01-login-page.png) | ![工单列表](userguide/screenshots/02-ticket-list.png) | ![工单详情](userguide/screenshots/03-ticket-detail.png) |\n\n### 🐙 Gitea 内置\n\n所有工单数据存储在本地 Gitea 实例中,无需外部 SaaS 服务。可直接通过 Gitea 管理界面查看和处理工单。\n\n![Gitea 工单后台](userguide/screenshots/04-gitea-issues.png)\n\n### 🐳 一键部署\n\n6 个容器,一条命令启动:\n\n```bash\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\ndocker compose up -d\n```\n\n## 架构概览\n\n| 服务 | 端口 | 职责 |\n|------|------|------|\n| **nginx** | `:8088` | 反向代理,路由静态文件与 API 请求 |\n| **upctl-web** | (nginx 内) | Vue 3 工单管理前端 |\n| **upctl-svc** | `:3005` | Rust 工单 CRUD API(Gitea 代理 + 附件) |\n| **authcore** | `:3000` | 身份认证,JWT 签发 |\n| **authcoreadmin** | `:8089` | 用户与角色管理后台 |\n| **ai-agent** | — | Python AI 工单处理 worker |\n| **gitea** | `:3001` | 代码托管 + 工单追踪 + CI |\n| **postgres** | `:5432` | 全局数据库 |\n| **redis** | `:6379` | 缓存 / session 存储 |\n\n详细架构说明、请求流程和序列图见 [ARCHITECTURE.md](ARCHITECTURE.md)。\n\n## 快速上手\n\n### 环境要求\n\n- Docker 24.0+、Docker Compose 2.24+\n- Git\n\n### 启动\n\n```bash\n# 克隆\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看状态\ndocker compose ps\n```\n\n### 初始化 Gitea\n\n首次启动需要等待服务就绪后初始化 Gitea:\n\n```bash\n# 等待 Gitea 就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do sleep 3; done\n\n# 运行初始化脚本\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化会创建组织 `weli`、仓库 `tickets`,以及 **approved / in_progress / blocked** 三个工单标签。\n\n访问 `http://localhost:8088` 进入工单管理界面。 \nGitea 管理后台:`http://localhost:3001`(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI Agent(可选)\n\n创建 `.env` 文件启用 AI 自动处理:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-v4-flash\n```\n\n重启 ai-agent 使配置生效:\n\n```bash\ndocker compose up -d ai-agent\n```\n\n设置后,在 Gitea 中创建工单并打上 `approved` 标签,AI agent 即会自动处理。\n\n### 验证部署\n\n```bash\n# 冒烟测试\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\ncurl -sf http://localhost:3001/api/v1/version # Gitea API\n```\n\n## AI Agent 工作流程\n\n```\n创建工单 → 标记 approved → ai-agent 轮询发现\n → 添加 in_progress 标签 → 调用 DeepSeek API\n → 评论处理结果 → 关闭工单\n```\n\nai-agent 通过 tmux session 托管 DeepSeek TUI,使用 `tmux send-keys` 注入工单内容、`tmux capture-pane` 读取模型回复,实现无头自动化。\n\n查看 ai-agent 运行状态:\n\n```bash\n# 查看轮询日志\ndocker compose logs -f ai-agent\n\n# 进入 tmux 交互 session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## CI & 测试\n\n本项目内置全链路测试,通过 GitHub Actions 自动运行:\n\n- **lint** — 验证 docker-compose.yml 格式\n- **build** — 构建所有服务镜像\n- **integration** — 启动全部服务,运行冒烟 + E2E 测试\n\n### E2E 测试\n\n| 测试 | 工具 | 范围 |\n|------|------|------|\n| 后端 E2E | Python + JWT | 认证、工单 CRUD、AI 处理全流程 |\n| 前端渲染 | Playwright | 登录页、路由守卫、工单列表渲染 |\n\n```bash\n# 后端 E2E\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n\n# 前端 Playwright\ncd tests/playwright\nnpm install && npx playwright test\n```\n\n## 停止与清理\n\n```bash\n# 停止服务(保留数据卷)\ndocker compose down\n\n# 完全清理\ndocker compose down -v\n```\n\n## 相关文档\n\n- [ARCHITECTURE.md](ARCHITECTURE.md) — 系统架构、API 路由、序列图\n- [CLAUDE.md](CLAUDE.md) — 项目开发约定\n- `userguide/userguide.pdf` — 用户手册(幻灯片格式)\n- `docker-compose.yml` — 完整服务配置\n\n---\n\nBuilt by [鉬馨玥翼](https://github.com/alchemy-studio).\n"}, "7f83fab2f76a9f98bdadda0b14a224dbcf72731e": {"t": 1785766321.1697545, "n": 7716, "h": "1e847349524e5ae1", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **authcoreadmin** | Vue 3 AuthCore admin frontend (teacher management) | 80 → :8089 |\n| **ai-agent** | AI agent: polls Gitea, processes tickets via DeepSeek API | — |\n| **gitea** | Code hosting, CI/CD runner, and issue tracker | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# 1. Clone and enter the project\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 2. (Optional) Set DeepSeek API key for AI agent\necho \"DEEPSEEK_API_KEY=sk-your-key-here\" > .env\n\n# 3. Start all services in background\ndocker compose up -d\n\n# 4. Seed Gitea with org, repo, and labels\n# Wait ~30s for services to be healthy, then:\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n\n# 5. Open in browser\nopen http://localhost:8088\n```\n\n## 本地部署运行指南\n\n### 环境要求\n\n| 要求 | 版本 |\n|------|------|\n| Docker | >= 24.0 |\n| Docker Compose | >= 2.24 (含 `docker compose` 插件) |\n| Git | 任意现代版本 |\n\n### 首次启动\n\n```bash\n# 克隆仓库\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动依赖服务(数据库和 Gitea)\ndocker compose up -d postgres gitea\n\n# 等待数据库就绪(约 10 秒)\nuntil docker compose exec postgres pg_isready -U upctl; do sleep 2; done\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看服务日志确认启动正常\ndocker compose logs --tail=20 authcore upctl-svc upctl-web\n```\n\n### 初始化 Gitea\n\n首次启动需要初始化 Gitea(组织、仓库、标签):\n\n```bash\n# 检测 Gitea 是否就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do\n echo \"等待 Gitea 就绪...\"\n sleep 3\ndone\n\n# 运行初始化脚本(创建 org weli、仓库 tickets、标签)\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化后,访问 `http://localhost:8088` 即可看到工单管理界面。使用 `http://localhost:3001` 访问 Gitea 管理界面(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI 代理(可选)\n\n`ai-agent` 使用 DeepSeek API 自动处理工单。需要在项目根目录创建 `.env` 文件:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-chat\n```\n\n设置后重启 `ai-agent`:\n\n```bash\ndocker compose up -d ai-agent\n```\n\nAI 代理每 5 分钟轮询一次 Gitea,自动处理带 `approved` 标签的工单。\n\n### 验证部署\n\n```bash\n# 检查所有服务运行状态\ndocker compose ps\n\n# 冒烟测试:各服务 API\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\n\n# Gitea API 连通性\ncurl -sf http://localhost:3001/api/v1/version\n\n# 运行 E2E 测试\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 常见问题\n\n| 问题 | 原因 | 解决 |\n|------|------|------|\n| `panic: POOL_SIZE must be set` | authcore 缺少环境变量 | 确保 docker-compose.yml 中 `authcore` 有 `POOL_SIZE: \"10\"` |\n| `JWT_KEY not set` | upctl-svc 缺少 JWT_KEY | 确保 docker-compose.yml 中 `upctl-svc` 有 `JWT_KEY` 环境变量 |\n| Gitea API 返回 404 | API 路径错误 | 使用 `/api/v1/` 根路径,非 `/gitea/api/v1/` |\n| 前端页面白屏 / JS 404 | 前端资源未正确构建 | `docker compose build upctl-web` 重新构建 |\n| `ai-agent` 未连接到 DeepSeek | 缺少 API Key | 配置 `DEEPSEEK_API_KEY` 环境变量后重启 |\n\n### 停止与清理\n\n```bash\n# 停止所有服务(保留数据卷)\ndocker compose down\n\n# 完全清理(删除所有数据)\ndocker compose down -v\n```\n\n## Architecture\n\n```mermaid\ngraph TB\n subgraph External [外部访问]\n User[用户浏览器]\n end\n\n subgraph Compose [upctl-compose 容器网络]\n NGX[nginx :8088]\n WEB[upctl-web
Vue 3 SPA]\n AUTH[authcore :3000
身份认证]\n SVC[upctl-svc :3005
工单 API]\n AI[ai-agent
AI 工单处理]\n GIT[gitea :3000
代码托管 + CI + 工单追踪]\n DB[postgres :5432
数据库]\n end\n\n subgraph ExternalAPI [外部 API]\n DEEPSEEK[DeepSeek API]\n end\n\n User --> NGX\n NGX --> WEB\n NGX --> AUTH\n NGX --> SVC\n NGX --> GIT\n SVC --> GIT\n AI --> SVC\n AI --> DEEPSEEK\n AUTH --> DB\n GIT --> DB\n```\n\n### Request Flow\n\n```mermaid\nsequenceDiagram\n participant User as 浏览器\n participant NGX as nginx :8088\n participant WEB as upctl-web\n participant AUTH as authcore\n participant SVC as upctl-svc\n participant GIT as gitea\n\n User->>NGX: GET /\n NGX->>WEB: 静态文件\n WEB-->>User: Vue SPA\n\n User->>NGX: POST /api/v1/uc/login\n NGX->>AUTH: 转发\n AUTH-->>User: JWT token\n\n User->>NGX: GET /api/v2/upctl/api/tickets\n NGX->>SVC: 转发\n SVC->>GIT: 代理请求\n GIT-->>SVC: 工单数据\n SVC-->>User: JSON 响应\n```\n\n### AI Agent Flow\n\n```mermaid\nsequenceDiagram\n participant AI as ai-agent\n participant SVC as upctl-svc\n participant GIT as gitea\n participant DEEPSEEK as DeepSeek API\n\n loop 每 5 分钟\n AI->>SVC: GET /api/v2/upctl/api/tickets\n SVC->>GIT: 查询已批准工单\n GIT-->>AI: 工单列表\n alt 有已批准的工单\n AI->>GIT: 添加 in_progress 标签\n AI->>DEEPSEEK: 发送工单内容\n DEEPSEEK-->>AI: 处理结果\n AI->>GIT: 提交处理结果评论\n AI->>GIT: 关闭工单\n end\n end\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/admin/` | `authcoreadmin:80` (proxied) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/upctl/api/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n### upctl-svc\n\nRust Axum service providing:\n- Gitea API proxy for ticket CRUD operations (list, create, update, close, comment)\n- Attachment upload and serving (local storage in `uploads/` volume)\n- JWT authentication via AuthCore\n\n### ai-agent\n\nPython-based AI worker that:\n- Polls upctl-svc for approved Gitea tickets every 5 minutes\n- Processes tickets using DeepSeek V4 API (OpenAI-compatible SDK)\n- Adds comments and closes tickets automatically\n- Runs in a tmux session for interactive access\n\nRequires `DEEPSEEK_API_KEY` environment variable to be set.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n\n# Enter ai-agent tmux session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n- AI agent workspace: `agent-workspace` volume\n\n## CI Pipeline\n\nGitHub Actions 自动运行:\n1. **lint** — 验证 docker-compose.yml 格式\n2. **build** — 构建所有服务镜像(authcore, upctl-svc, upctl-web, ai-agent)\n3. **integration** — 启动全部服务,运行冒烟测试和 E2E 测试\n\n## E2E Testing\n\n### 后端测试 (tests/e2e_test.py)\n\nPython 脚本,运行在 `ai-agent` 容器内,通过 JWT 认证调用 upctl-svc API:\n\n1. **Authentication** — 未授权请求返回 401\n2. **Gitea API 连通性** — 通过 upctl-svc 代理列出工单和标签\n3. **工单 CRUD** — 创建工单 → 添加 label → 添加评论 → 关闭工单\n4. **DeepSeek API 处理** — 调用 AI 模型并验证响应\n5. **AI Agent 模块** — 导入 poll_worker 模块并列出已批准工单\n6. **全流程管道** — 创建工单 → DeepSeek 处理 → 评论 → 关闭\n\nCI 中自动运行:\n\n```bash\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 前端测试 (tests/playwright/)\n\n使用 Playwright + Chromium 测试前端页面渲染:\n\n1. **登录页渲染** — 标题和表单可见\n2. **未认证重定向** — 访问根路径跳转到 `/login`\n3. **union_id 输入框** — 开发模式表单渲染\n4. **工单列表** — JWT 注入后页面正常渲染\n\nCI 中自动运行:\n\n```bash\ncd tests/playwright\nnpm install\nnpx playwright install chromium --with-deps\nnpx playwright test\n```\n"}, "2cc8239b8f255f2bc45b341cf9981d7a535dd0f1": {"t": 1785766322.9365172, "n": 7583, "h": "78a136455e8ef21a", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **ai-agent** | AI agent: polls Gitea, processes tickets via DeepSeek API | — |\n| **gitea** | Code hosting, CI/CD runner, and issue tracker | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# 1. Clone and enter the project\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 2. (Optional) Set DeepSeek API key for AI agent\necho \"DEEPSEEK_API_KEY=sk-your-key-here\" > .env\n\n# 3. Start all services in background\ndocker compose up -d\n\n# 4. Seed Gitea with org, repo, and labels\n# Wait ~30s for services to be healthy, then:\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n\n# 5. Open in browser\nopen http://localhost:8088\n```\n\n## 本地部署运行指南\n\n### 环境要求\n\n| 要求 | 版本 |\n|------|------|\n| Docker | >= 24.0 |\n| Docker Compose | >= 2.24 (含 `docker compose` 插件) |\n| Git | 任意现代版本 |\n\n### 首次启动\n\n```bash\n# 克隆仓库\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动依赖服务(数据库和 Gitea)\ndocker compose up -d postgres gitea\n\n# 等待数据库就绪(约 10 秒)\nuntil docker compose exec postgres pg_isready -U upctl; do sleep 2; done\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看服务日志确认启动正常\ndocker compose logs --tail=20 authcore upctl-svc upctl-web\n```\n\n### 初始化 Gitea\n\n首次启动需要初始化 Gitea(组织、仓库、标签):\n\n```bash\n# 检测 Gitea 是否就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do\n echo \"等待 Gitea 就绪...\"\n sleep 3\ndone\n\n# 运行初始化脚本(创建 org weli、仓库 tickets、标签)\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化后,访问 `http://localhost:8088` 即可看到工单管理界面。使用 `http://localhost:3001` 访问 Gitea 管理界面(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI 代理(可选)\n\n`ai-agent` 使用 DeepSeek API 自动处理工单。需要在项目根目录创建 `.env` 文件:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-chat\n```\n\n设置后重启 `ai-agent`:\n\n```bash\ndocker compose up -d ai-agent\n```\n\nAI 代理每 5 分钟轮询一次 Gitea,自动处理带 `approved` 标签的工单。\n\n### 验证部署\n\n```bash\n# 检查所有服务运行状态\ndocker compose ps\n\n# 冒烟测试:各服务 API\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\n\n# Gitea API 连通性\ncurl -sf http://localhost:3001/api/v1/version\n\n# 运行 E2E 测试\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 常见问题\n\n| 问题 | 原因 | 解决 |\n|------|------|------|\n| `panic: POOL_SIZE must be set` | authcore 缺少环境变量 | 确保 docker-compose.yml 中 `authcore` 有 `POOL_SIZE: \"10\"` |\n| `JWT_KEY not set` | upctl-svc 缺少 JWT_KEY | 确保 docker-compose.yml 中 `upctl-svc` 有 `JWT_KEY` 环境变量 |\n| Gitea API 返回 404 | API 路径错误 | 使用 `/api/v1/` 根路径,非 `/gitea/api/v1/` |\n| 前端页面白屏 / JS 404 | 前端资源未正确构建 | `docker compose build upctl-web` 重新构建 |\n| `ai-agent` 未连接到 DeepSeek | 缺少 API Key | 配置 `DEEPSEEK_API_KEY` 环境变量后重启 |\n\n### 停止与清理\n\n```bash\n# 停止所有服务(保留数据卷)\ndocker compose down\n\n# 完全清理(删除所有数据)\ndocker compose down -v\n```\n\n## Architecture\n\n```mermaid\ngraph TB\n subgraph External [外部访问]\n User[用户浏览器]\n end\n\n subgraph Compose [upctl-compose 容器网络]\n NGX[nginx :8088]\n WEB[upctl-web
Vue 3 SPA]\n AUTH[authcore :3000
身份认证]\n SVC[upctl-svc :3005
工单 API]\n AI[ai-agent
AI 工单处理]\n GIT[gitea :3000
代码托管 + CI + 工单追踪]\n DB[postgres :5432
数据库]\n end\n\n subgraph ExternalAPI [外部 API]\n DEEPSEEK[DeepSeek API]\n end\n\n User --> NGX\n NGX --> WEB\n NGX --> AUTH\n NGX --> SVC\n NGX --> GIT\n SVC --> GIT\n AI --> SVC\n AI --> DEEPSEEK\n AUTH --> DB\n GIT --> DB\n```\n\n### Request Flow\n\n```mermaid\nsequenceDiagram\n participant User as 浏览器\n participant NGX as nginx :8088\n participant WEB as upctl-web\n participant AUTH as authcore\n participant SVC as upctl-svc\n participant GIT as gitea\n\n User->>NGX: GET /\n NGX->>WEB: 静态文件\n WEB-->>User: Vue SPA\n\n User->>NGX: POST /api/v1/uc/login\n NGX->>AUTH: 转发\n AUTH-->>User: JWT token\n\n User->>NGX: GET /api/v2/upctl/api/tickets\n NGX->>SVC: 转发\n SVC->>GIT: 代理请求\n GIT-->>SVC: 工单数据\n SVC-->>User: JSON 响应\n```\n\n### AI Agent Flow\n\n```mermaid\nsequenceDiagram\n participant AI as ai-agent\n participant SVC as upctl-svc\n participant GIT as gitea\n participant DEEPSEEK as DeepSeek API\n\n loop 每 5 分钟\n AI->>SVC: GET /api/v2/upctl/api/tickets\n SVC->>GIT: 查询已批准工单\n GIT-->>AI: 工单列表\n alt 有已批准的工单\n AI->>GIT: 添加 in_progress 标签\n AI->>DEEPSEEK: 发送工单内容\n DEEPSEEK-->>AI: 处理结果\n AI->>GIT: 提交处理结果评论\n AI->>GIT: 关闭工单\n end\n end\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/upctl/api/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n### upctl-svc\n\nRust Axum service providing:\n- Gitea API proxy for ticket CRUD operations (list, create, update, close, comment)\n- Attachment upload and serving (local storage in `uploads/` volume)\n- JWT authentication via AuthCore\n\n### ai-agent\n\nPython-based AI worker that:\n- Polls upctl-svc for approved Gitea tickets every 5 minutes\n- Processes tickets using DeepSeek V4 API (OpenAI-compatible SDK)\n- Adds comments and closes tickets automatically\n- Runs in a tmux session for interactive access\n\nRequires `DEEPSEEK_API_KEY` environment variable to be set.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n\n# Enter ai-agent tmux session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n- AI agent workspace: `agent-workspace` volume\n\n## CI Pipeline\n\nGitHub Actions 自动运行:\n1. **lint** — 验证 docker-compose.yml 格式\n2. **build** — 构建所有服务镜像(authcore, upctl-svc, upctl-web, ai-agent)\n3. **integration** — 启动全部服务,运行冒烟测试和 E2E 测试\n\n## E2E Testing\n\n### 后端测试 (tests/e2e_test.py)\n\nPython 脚本,运行在 `ai-agent` 容器内,通过 JWT 认证调用 upctl-svc API:\n\n1. **Authentication** — 未授权请求返回 401\n2. **Gitea API 连通性** — 通过 upctl-svc 代理列出工单和标签\n3. **工单 CRUD** — 创建工单 → 添加 label → 添加评论 → 关闭工单\n4. **DeepSeek API 处理** — 调用 AI 模型并验证响应\n5. **AI Agent 模块** — 导入 poll_worker 模块并列出已批准工单\n6. **全流程管道** — 创建工单 → DeepSeek 处理 → 评论 → 关闭\n\nCI 中自动运行:\n\n```bash\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 前端测试 (tests/playwright/)\n\n使用 Playwright + Chromium 测试前端页面渲染:\n\n1. **登录页渲染** — 标题和表单可见\n2. **未认证重定向** — 访问根路径跳转到 `/login`\n3. **union_id 输入框** — 开发模式表单渲染\n4. **工单列表** — JWT 注入后页面正常渲染\n\nCI 中自动运行:\n\n```bash\ncd tests/playwright\nnpm install\nnpx playwright install chromium --with-deps\nnpx playwright test\n```\n"}, "5305e277178fa40a6e395f94108fea06b7b3ee48": {"t": 1785766324.3294926, "n": 7562, "h": "30b565b107fd0e52", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **ai-agent** | AI agent: polls Gitea, processes tickets via DeepSeek API | — |\n| **gitea** | Code hosting, CI/CD runner, and issue tracker | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# 1. Clone and enter the project\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 2. (Optional) Set DeepSeek API key for AI agent\necho \"DEEPSEEK_API_KEY=sk-your-key-here\" > .env\n\n# 3. Start all services in background\ndocker compose up -d\n\n# 4. Seed Gitea with org, repo, and labels\n# Wait ~30s for services to be healthy, then:\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n\n# 5. Open in browser\nopen http://localhost:8088\n```\n\n## 本地部署运行指南\n\n### 环境要求\n\n| 要求 | 版本 |\n|------|------|\n| Docker | >= 24.0 |\n| Docker Compose | >= 2.24 (含 `docker compose` 插件) |\n| Git | 任意现代版本 |\n\n### 首次启动\n\n```bash\n# 克隆仓库\ngit clone https://github.com/alchemy-studio/upctl-compose.git\ncd upctl-compose\n\n# 启动依赖服务(数据库和 Gitea)\ndocker compose up -d postgres gitea\n\n# 等待数据库就绪(约 10 秒)\nuntil docker compose exec postgres pg_isready -U upctl; do sleep 2; done\n\n# 启动全部服务\ndocker compose up -d\n\n# 查看服务日志确认启动正常\ndocker compose logs --tail=20 authcore upctl-svc upctl-web\n```\n\n### 初始化 Gitea\n\n首次启动需要初始化 Gitea(组织、仓库、标签):\n\n```bash\n# 检测 Gitea 是否就绪\nuntil curl -sf http://localhost:3001/api/v1/version > /dev/null 2>&1; do\n echo \"等待 Gitea 就绪...\"\n sleep 3\ndone\n\n# 运行初始化脚本(创建 org weli、仓库 tickets、标签)\ndocker compose exec ai-agent python3 /app/setup-gitea.py\n```\n\n初始化后,访问 `http://localhost:8088` 即可看到工单管理界面。使用 `http://localhost:3001` 访问 Gitea 管理界面(用户 `ai-bot` / 密码 `ai-bot-dev-pass`)。\n\n### 配置 AI 代理(可选)\n\n`ai-agent` 使用 DeepSeek API 自动处理工单。需要在项目根目录创建 `.env` 文件:\n\n```bash\n# .env\nDEEPSEEK_API_KEY=sk-your-deepseek-api-key\nDEEPSEEK_API_BASE=https://api.deepseek.com\nDEFAULT_MODEL=deepseek-chat\n```\n\n设置后重启 `ai-agent`:\n\n```bash\ndocker compose up -d ai-agent\n```\n\nAI 代理每 5 分钟轮询一次 Gitea,自动处理带 `approved` 标签的工单。\n\n### 验证部署\n\n```bash\n# 检查所有服务运行状态\ndocker compose ps\n\n# 冒烟测试:各服务 API\ncurl -sf http://localhost:8088/ | head -c 200 # 前端 HTML\ncurl -sf http://localhost:3005/ # upctl-svc → \"upctl-svc\"\ncurl -sf http://localhost:3000/ # authcore → \"AuthCore\"\n\n# Gitea API 连通性\ncurl -sf http://localhost:3001/api/v1/version\n\n# 运行 E2E 测试\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 常见问题\n\n| 问题 | 原因 | 解决 |\n|------|------|------|\n| `panic: POOL_SIZE must be set` | authcore 缺少环境变量 | 确保 docker-compose.yml 中 `authcore` 有 `POOL_SIZE: \"10\"` |\n| `JWT_KEY not set` | upctl-svc 缺少 JWT_KEY | 确保 docker-compose.yml 中 `upctl-svc` 有 `JWT_KEY` 环境变量 |\n| Gitea API 返回 404 | API 路径错误 | 使用 `/api/v1/` 根路径,非 `/gitea/api/v1/` |\n| 前端页面白屏 / JS 404 | 前端资源未正确构建 | `docker compose build upctl-web` 重新构建 |\n| `ai-agent` 未连接到 DeepSeek | 缺少 API Key | 配置 `DEEPSEEK_API_KEY` 环境变量后重启 |\n\n### 停止与清理\n\n```bash\n# 停止所有服务(保留数据卷)\ndocker compose down\n\n# 完全清理(删除所有数据)\ndocker compose down -v\n```\n\n## Architecture\n\n```mermaid\ngraph TB\n subgraph External [外部访问]\n User[用户浏览器]\n end\n\n subgraph Compose [upctl-compose 容器网络]\n NGX[nginx :8088]\n WEB[upctl-web
Vue 3 SPA]\n AUTH[authcore :3000
身份认证]\n SVC[upctl-svc :3005
工单 API]\n AI[ai-agent
AI 工单处理]\n GIT[gitea :3000
代码托管 + CI + 工单追踪]\n DB[postgres :5432
数据库]\n end\n\n subgraph ExternalAPI [外部 API]\n DEEPSEEK[DeepSeek API]\n end\n\n User --> NGX\n NGX --> WEB\n NGX --> AUTH\n NGX --> SVC\n NGX --> GIT\n SVC --> GIT\n AI --> SVC\n AI --> DEEPSEEK\n AUTH --> DB\n GIT --> DB\n```\n\n### Request Flow\n\n```mermaid\nsequenceDiagram\n participant User as 浏览器\n participant NGX as nginx :8088\n participant WEB as upctl-web\n participant AUTH as authcore\n participant SVC as upctl-svc\n participant GIT as gitea\n\n User->>NGX: GET /\n NGX->>WEB: 静态文件\n WEB-->>User: Vue SPA\n\n User->>NGX: POST /api/v1/uc/login\n NGX->>AUTH: 转发\n AUTH-->>User: JWT token\n\n User->>NGX: GET /api/v2/ts/tickets\n NGX->>SVC: 转发\n SVC->>GIT: 代理请求\n GIT-->>SVC: 工单数据\n SVC-->>User: JSON 响应\n```\n\n### AI Agent Flow\n\n```mermaid\nsequenceDiagram\n participant AI as ai-agent\n participant SVC as upctl-svc\n participant GIT as gitea\n participant DEEPSEEK as DeepSeek API\n\n loop 每 5 分钟\n AI->>SVC: GET /api/v2/ts/tickets\n SVC->>GIT: 查询已批准工单\n GIT-->>AI: 工单列表\n alt 有已批准的工单\n AI->>GIT: 添加 in_progress 标签\n AI->>DEEPSEEK: 发送工单内容\n DEEPSEEK-->>AI: 处理结果\n AI->>GIT: 提交处理结果评论\n AI->>GIT: 关闭工单\n end\n end\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/ts/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n### upctl-svc\n\nRust Axum service providing:\n- Gitea API proxy for ticket CRUD operations (list, create, update, close, comment)\n- Attachment upload and serving (local storage in `uploads/` volume)\n- JWT authentication via AuthCore\n\n### ai-agent\n\nPython-based AI worker that:\n- Polls upctl-svc for approved Gitea tickets every 5 minutes\n- Processes tickets using DeepSeek V4 API (OpenAI-compatible SDK)\n- Adds comments and closes tickets automatically\n- Runs in a tmux session for interactive access\n\nRequires `DEEPSEEK_API_KEY` environment variable to be set.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n\n# Enter ai-agent tmux session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n- AI agent workspace: `agent-workspace` volume\n\n## CI Pipeline\n\nGitHub Actions 自动运行:\n1. **lint** — 验证 docker-compose.yml 格式\n2. **build** — 构建所有服务镜像(authcore, upctl-svc, upctl-web, ai-agent)\n3. **integration** — 启动全部服务,运行冒烟测试和 E2E 测试\n\n## E2E Testing\n\n### 后端测试 (tests/e2e_test.py)\n\nPython 脚本,运行在 `ai-agent` 容器内,通过 JWT 认证调用 upctl-svc API:\n\n1. **Authentication** — 未授权请求返回 401\n2. **Gitea API 连通性** — 通过 upctl-svc 代理列出工单和标签\n3. **工单 CRUD** — 创建工单 → 添加 label → 添加评论 → 关闭工单\n4. **DeepSeek API 处理** — 调用 AI 模型并验证响应\n5. **AI Agent 模块** — 导入 poll_worker 模块并列出已批准工单\n6. **全流程管道** — 创建工单 → DeepSeek 处理 → 评论 → 关闭\n\nCI 中自动运行:\n\n```bash\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n### 前端测试 (tests/playwright/)\n\n使用 Playwright + Chromium 测试前端页面渲染:\n\n1. **登录页渲染** — 标题和表单可见\n2. **未认证重定向** — 访问根路径跳转到 `/login`\n3. **union_id 输入框** — 开发模式表单渲染\n4. **工单列表** — JWT 注入后页面正常渲染\n\nCI 中自动运行:\n\n```bash\ncd tests/playwright\nnpm install\nnpx playwright install chromium --with-deps\nnpx playwright test\n```\n"}, "5e9e1aa19ca2871b08134db94146034c724e5489": {"t": 1785766325.7438548, "n": 4663, "h": "d1cf35177156ac8f", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **ai-agent** | AI agent: polls Gitea, processes tickets via DeepSeek API | — |\n| **gitea** | Issue tracker (self-hosted) | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# Start all services\ndocker compose up -d\n\n# Wait for all services to be healthy, then seed test data\nbash scripts/seed.sh\n```\n\n## Architecture\n\n```mermaid\ngraph TB\n subgraph External [外部访问]\n User[用户浏览器]\n end\n\n subgraph Compose [upctl-compose 容器网络]\n NGX[nginx :8088]\n WEB[upctl-web
Vue 3 SPA]\n AUTH[authcore :3000
身份认证]\n SVC[upctl-svc :3005
工单 API]\n AI[ai-agent
AI 工单处理]\n GIT[gitea :3000
工单追踪]\n DB[postgres :5432
数据库]\n end\n\n subgraph ExternalAPI [外部 API]\n DEEPSEEK[DeepSeek API]\n end\n\n User --> NGX\n NGX --> WEB\n NGX --> AUTH\n NGX --> SVC\n NGX --> GIT\n SVC --> GIT\n AI --> SVC\n AI --> DEEPSEEK\n AUTH --> DB\n GIT --> DB\n```\n\n### Request Flow\n\n```mermaid\nsequenceDiagram\n participant User as 浏览器\n participant NGX as nginx :8088\n participant WEB as upctl-web\n participant AUTH as authcore\n participant SVC as upctl-svc\n participant GIT as gitea\n\n User->>NGX: GET /\n NGX->>WEB: 静态文件\n WEB-->>User: Vue SPA\n\n User->>NGX: POST /api/v1/uc/login\n NGX->>AUTH: 转发\n AUTH-->>User: JWT token\n\n User->>NGX: GET /api/v2/ts/tickets\n NGX->>SVC: 转发\n SVC->>GIT: 代理请求\n GIT-->>SVC: 工单数据\n SVC-->>User: JSON 响应\n```\n\n### AI Agent Flow\n\n```mermaid\nsequenceDiagram\n participant AI as ai-agent\n participant SVC as upctl-svc\n participant GIT as gitea\n participant DEEPSEEK as DeepSeek API\n\n loop 每 5 分钟\n AI->>SVC: GET /api/v2/ts/tickets\n SVC->>GIT: 查询已批准工单\n GIT-->>AI: 工单列表\n alt 有已批准的工单\n AI->>GIT: 添加 in_progress 标签\n AI->>DEEPSEEK: 发送工单内容\n DEEPSEEK-->>AI: 处理结果\n AI->>GIT: 提交处理结果评论\n AI->>GIT: 关闭工单\n end\n end\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/ts/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n### upctl-svc\n\nRust Axum service providing:\n- Gitea API proxy for ticket CRUD operations (list, create, update, close, comment)\n- Attachment upload and serving (local storage in `uploads/` volume)\n- JWT authentication via AuthCore\n\n### ai-agent\n\nPython-based AI worker that:\n- Polls upctl-svc for approved Gitea tickets every 5 minutes\n- Processes tickets using DeepSeek V4 API (OpenAI-compatible SDK)\n- Adds comments and closes tickets automatically\n- Runs in a tmux session for interactive access\n\nRequires `DEEPSEEK_API_KEY` environment variable to be set.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n\n# Enter ai-agent tmux session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n- AI agent workspace: `agent-workspace` volume\n\n## CI Pipeline\n\nGitHub Actions 自动运行:\n1. **lint** — 验证 docker-compose.yml 格式\n2. **build** — 构建所有服务镜像(authcore, upctl-svc, upctl-web, ai-agent)\n3. **integration** — 启动全部服务,运行冒烟测试和 E2E 测试\n\n## E2E Testing\n\n端到端测试脚本 `tests/e2e_test.py` 覆盖完整工单生命周期:\n\n1. **Gitea API 连通性** — 通过 upctl-svc 代理列出工单和标签\n2. **工单 CRUD** — 创建工单 → 添加 label → 添加评论 → 关闭工单\n3. **DeepSeek API 处理** — 调用 AI 模型并验证响应\n4. **AI Agent 模块** — 导入 poll_worker 模块并列出已批准工单\n\nCI 中自动运行:\n\n```bash\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec -T ai-agent python3 /app/e2e_test.py\n```\n\n也可以在本地运行:\n\n```bash\n# 确保所有服务已启动\ndocker compose up -d\n\n# 复制测试脚本到 ai-agent 容器并运行\ndocker compose cp tests/e2e_test.py ai-agent:/app/e2e_test.py\ndocker compose exec ai-agent python3 /app/e2e_test.py\n```\n"}, "e705de305fba8e8c16d6a7aa401416795c13fa29": {"t": 1785766327.2214866, "n": 4076, "h": "16e90ccdc0535f14", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **ai-agent** | AI agent: polls Gitea, processes tickets via DeepSeek API | — |\n| **gitea** | Issue tracker (self-hosted) | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# Start all services\ndocker compose up -d\n\n# Wait for all services to be healthy, then seed test data\nbash scripts/seed.sh\n```\n\n## Architecture\n\n```mermaid\ngraph TB\n subgraph External [外部访问]\n User[用户浏览器]\n end\n\n subgraph Compose [upctl-compose 容器网络]\n NGX[nginx :8088]\n WEB[upctl-web
Vue 3 SPA]\n AUTH[authcore :3000
身份认证]\n SVC[upctl-svc :3005
工单 API]\n AI[ai-agent
AI 工单处理]\n GIT[gitea :3000
工单追踪]\n DB[postgres :5432
数据库]\n end\n\n subgraph ExternalAPI [外部 API]\n DEEPSEEK[DeepSeek API]\n end\n\n User --> NGX\n NGX --> WEB\n NGX --> AUTH\n NGX --> SVC\n NGX --> GIT\n SVC --> GIT\n AI --> SVC\n AI --> DEEPSEEK\n AUTH --> DB\n GIT --> DB\n```\n\n### Request Flow\n\n```mermaid\nsequenceDiagram\n participant User as 浏览器\n participant NGX as nginx :8088\n participant WEB as upctl-web\n participant AUTH as authcore\n participant SVC as upctl-svc\n participant GIT as gitea\n\n User->>NGX: GET /\n NGX->>WEB: 静态文件\n WEB-->>User: Vue SPA\n\n User->>NGX: POST /api/v1/uc/login\n NGX->>AUTH: 转发\n AUTH-->>User: JWT token\n\n User->>NGX: GET /api/v2/ts/tickets\n NGX->>SVC: 转发\n SVC->>GIT: 代理请求\n GIT-->>SVC: 工单数据\n SVC-->>User: JSON 响应\n```\n\n### AI Agent Flow\n\n```mermaid\nsequenceDiagram\n participant AI as ai-agent\n participant SVC as upctl-svc\n participant GIT as gitea\n participant DEEPSEEK as DeepSeek API\n\n loop 每 5 分钟\n AI->>SVC: GET /api/v2/ts/tickets\n SVC->>GIT: 查询已批准工单\n GIT-->>AI: 工单列表\n alt 有已批准的工单\n AI->>GIT: 添加 in_progress 标签\n AI->>DEEPSEEK: 发送工单内容\n DEEPSEEK-->>AI: 处理结果\n AI->>GIT: 提交处理结果评论\n AI->>GIT: 关闭工单\n end\n end\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/ts/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n### upctl-svc\n\nRust Axum service providing:\n- Gitea API proxy for ticket CRUD operations (list, create, update, close, comment)\n- Attachment upload and serving (local storage in `uploads/` volume)\n- JWT authentication via AuthCore\n\n### ai-agent\n\nPython-based AI worker that:\n- Polls upctl-svc for approved Gitea tickets every 5 minutes\n- Processes tickets using DeepSeek V4 API (OpenAI-compatible SDK)\n- Adds comments and closes tickets automatically\n- Runs in a tmux session for interactive access\n\nRequires `DEEPSEEK_API_KEY` environment variable to be set.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n\n# Enter ai-agent tmux session\ndocker compose exec ai-agent tmux attach -t deepseek-agent\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n- AI agent workspace: `agent-workspace` volume\n\n## CI Pipeline\n\nGitHub Actions 自动运行:\n1. **lint** — 验证 docker-compose.yml 格式\n2. **build** — 构建所有服务镜像(authcore, upctl-svc, upctl-web, ai-agent)\n3. **integration** — 启动全部服务,运行冒烟测试\n"}, "531d298c3e670e7518f3500afdfc0dbce5d1618e": {"t": 1785766328.930115, "n": 1853, "h": "7ee5921b11a13ac3", "c": "# upctl-compose\n\nDocker Compose project for `upctl` — ticket management system.\n\n## Services\n\n| Service | Description | Internal Port |\n|---------|-------------|---------------|\n| **nginx** | Reverse proxy (static files + API routing) | 80 → :8088 |\n| **authcore** | AuthCore identity & auth service | 3000 |\n| **upctl-svc** | Ticket management API (Gitea proxy + attachments) | 3005 |\n| **upctl-web** | Vue 3 ticket management frontend (served by nginx) | — |\n| **gitea** | Issue tracker (self-hosted) | 3000/3001 |\n| **postgres** | Database for all services | 5432 |\n\n## Quick Start\n\n```bash\n# Start all services\ndocker compose up -d\n\n# Wait for all services to be healthy, then seed test data\nbash scripts/seed.sh\n```\n\n## Architecture\n\n```\n nginx (:8088)\n ┌──────┴──────┐\n │ │\n ┌──────┴──────┐ │\n upctl-web upctl-svc (:3005)\n (Vue 3 SPA) (Rust Axum)\n │\n gitea (:3000)\n (issue tracker)\n```\n\n### API Routing (nginx)\n\n| Location | Upstream |\n|----------|----------|\n| `/` | Static files (upctl-web dist) |\n| `/api/v1/uc/` | `authcore:3000` |\n| `/api/v2/ts/` | `upctl-svc:3005` |\n| `/gitea/` | `gitea:3000` |\n\n## Services Detail\n\n### upctl-web\n\nVue 3 + Vite SPA. Built with empty `UC_SERVER`/`TS_SERVER` so all API calls\ngo through nginx (same-origin proxy). Login supports username/password via\nAuthCore's global password feature.\n\n## Development\n\n```bash\n# Rebuild a specific service after code changes\ndocker compose build authcore\ndocker compose up -d authcore\n\n# View logs\ndocker compose logs -f upctl-svc\n```\n\n## Data Persistence\n\n- PostgreSQL data: `pgdata` volume\n- Gitea data: `gitea` volume\n- Uploaded attachments: `uploads` volume\n"}}}}