Files

1 line
124 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**工单列表**\n---\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单详情**\n---\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n\n**登录页**\n\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n\n**工单列表**\n\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n**登录页**\n\n<img src=\"userguide/screenshots/05-ticket-list-with-data.png\" width=\"680\" alt=\"工单列表\"/>\n**工单列表**\n\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<img src=\"userguide/screenshots/01-login-page.png\" width=\"680\" alt=\"登录页\"/>\n**登录页**\n\n<img src=\"userguide/screenshots/02-ticket-list.png\" width=\"680\" alt=\"工单列表\"/>\n**工单列表**\n\n<img src=\"userguide/screenshots/03-ticket-detail.png\" width=\"680\" alt=\"工单详情\"/>\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<br/>Vue 3 SPA]\n AUTH[authcore :3000<br/>身份认证]\n SVC[upctl-svc :3005<br/>工单 API]\n AI[ai-agent<br/>AI 工单处理]\n GIT[gitea :3000<br/>代码托管 + CI + 工单追踪]\n DB[postgres :5432<br/>数据库]\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<br/>Vue 3 SPA]\n AUTH[authcore :3000<br/>身份认证]\n SVC[upctl-svc :3005<br/>工单 API]\n AI[ai-agent<br/>AI 工单处理]\n GIT[gitea :3000<br/>代码托管 + CI + 工单追踪]\n DB[postgres :5432<br/>数据库]\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<br/>Vue 3 SPA]\n AUTH[authcore :3000<br/>身份认证]\n SVC[upctl-svc :3005<br/>工单 API]\n AI[ai-agent<br/>AI 工单处理]\n GIT[gitea :3000<br/>代码托管 + CI + 工单追踪]\n DB[postgres :5432<br/>数据库]\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<br/>Vue 3 SPA]\n AUTH[authcore :3000<br/>身份认证]\n SVC[upctl-svc :3005<br/>工单 API]\n AI[ai-agent<br/>AI 工单处理]\n GIT[gitea :3000<br/>工单追踪]\n DB[postgres :5432<br/>数据库]\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<br/>Vue 3 SPA]\n AUTH[authcore :3000<br/>身份认证]\n SVC[upctl-svc :3005<br/>工单 API]\n AI[ai-agent<br/>AI 工单处理]\n GIT[gitea :3000<br/>工单追踪]\n DB[postgres :5432<br/>数据库]\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"}}}}