brunoandClaude 64e953ec74 feat: 添加 Nginx 反向代理解决前后端连接问题
- 添加 plane-proxy 服务 (Nginx) 统一前后端访问入口
- 创建 nginx.conf 配置文件,代理 /api/ 和 /auth/ 请求到后端
- 移除 plane-web 和 plane-api 的端口暴露,只通过代理访问
- 更新 CORS 配置,添加 plane-proxy 到允许列表
- 解决 NEXT_PUBLIC_API_BASE_URL 构建时注入的问题

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
2025-11-25 20:19:19 +08:00

Plane + Gitea + GitHub 全链路集成系统

完整的任务管理、代码托管、CI/CD 和 AI 辅助开发解决方案

License Docker Kubernetes Status


🚀 当前部署状态

部署时间: 2025-11-25 | 环境: macOS Development | 状态: ✅ 运行中

快速访问

服务 地址 状态 说明
Gitea http://192.168.1.83:33000 ✅ 运行中 Git 代码托管
同步服务 http://localhost:8828/health ✅ 健康 Gitea ↔ GitHub 自动同步
Plane DB localhost:5432 ✅ 健康 PostgreSQL 数据库
Plane Redis localhost:6379 ✅ 健康 缓存服务
Plane MinIO http://localhost:9000 ✅ 健康 对象存储

核心功能状态

  • ✅ Gitea → GitHub 镜像同步: 已部署,5分钟自动同步
  • ✅ 用户名自动检测: GitHub (BrunoGao) / Gitea (gao)
  • ⚠️ Plane 完整部署: 基础设施就绪,需配置 API Token
  • 📝 Webhook 集成: 待配置

详细状态: 查看 DEPLOYMENT-STATUS.md


📋 目录


系统概述

这是一个生产级、企业级的全链路 DevOps 集成系统,整合了:

  • Plane: 现代化任务管理平台 (类似 Jira/Linear)
  • Gitea: 轻量级 Git 服务器 (自托管 GitHub)
  • GitHub: 公开镜像仓库 (可选)
  • Claude AI: AI 辅助开发 (代码生成、Review、测试)

核心价值

✅ 统一工作流: 任务 → 代码 → CI/CD → 部署 → 反馈,全流程打通 ✅ AI 增强: Claude AI 辅助需求分析、代码实现、测试生成 ✅ 双向同步: Plane ↔ Gitea ↔ GitHub 实时同步 ✅ 质量保证: 自动化测试、代码审查、安全扫描 ✅ 自托管: 完全掌控数据,无依赖外部服务


架构图

总体架构

graph TB
    subgraph "任务管理层"
        P[Plane<br/>任务管理]
    end

    subgraph "代码管理层"
        G[Gitea<br/>Git 服务器]
        GH[GitHub<br/>公开镜像]
    end

    subgraph "同步服务层"
        PS[Plane-Gitea<br/>Sync]
        PGH[Plane-GitHub<br/>Sync]
        GS[Gitea-GitHub<br/>Mirror]
    end

    subgraph "CI/CD 层"
        GA[Gitea Actions]
        GHA[GitHub Actions]
    end

    subgraph "容器平台"
        H[Harbor<br/>镜像仓库]
        K[K3s<br/>Kubernetes]
    end

    subgraph "AI 层"
        C[Claude AI<br/>开发助手]
    end

    P <--> PS <--> G
    P <--> PGH <--> GH
    G <--> GS <--> GH
    G --> GA
    GH --> GHA
    GA --> H
    GHA --> H
    H --> K
    C -.辅助.-> P
    C -.辅助.-> G
    C -.辅助.-> GH

    style P fill:#6366f1
    style G fill:#609926
    style GH fill:#24292e
    style C fill:#d4a574
    style K fill:#326ce5

数据流图

sequenceDiagram
    actor User
    participant Plane
    participant Claude
    participant Gitea
    participant GitHub
    participant CI/CD
    participant K8s

    User->>Plane: 1. 创建 Issue
    Plane-->>Claude: 2. 触发分析
    Claude->>Claude: 3. 生成技术方案
    Claude->>Gitea: 4. 创建分支 & 提交代码
    Gitea-->>GitHub: 5. 镜像同步
    Gitea->>CI/CD: 6. 触发 Pipeline
    CI/CD->>CI/CD: 7. 测试 & 构建
    CI/CD->>K8s: 8. 部署应用
    K8s-->>Plane: 9. 更新 Issue 状态
    Plane-->>User: 10. 通知完成

网络拓扑

┌─────────────────────────────────────────────────────────┐
│                     Host Network                        │
│                   192.168.1.83                          │
└─────────────────────────────────────────────────────────┘
                           │
           ┌───────────────┼───────────────┐
           │               │               │
    ┌──────▼─────┐  ┌──────▼─────┐  ┌──────▼─────┐
    │   Plane    │  │   Gitea    │  │   Harbor   │
    │  :8000     │  │  :33000    │  │   :8080    │
    │            │  │  SSH:32222 │  │            │
    └────────────┘  └────────────┘  └────────────┘
           │               │               │
           └───────────────┼───────────────┘
                           │
                  ┌────────▼────────┐
                  │   Sync Services │
                  │   :8001, :8002  │
                  └─────────────────┘
                           │
                  ┌────────▼────────┐
                  │  K3s Cluster    │
                  │  Applications   │
                  └─────────────────┘

核心功能

1. 任务管理 (Plane)

  • ✅ Epic / Feature / Task / Bug 管理
  • ✅ Sprint 计划和跟踪
  • ✅ 看板视图 (Kanban)
  • ✅ 甘特图 (Gantt)
  • ✅ 团队协作
  • ✅ 自定义字段和工作流

2. 代码托管 (Gitea + GitHub)

  • ✅ Git 仓库管理
  • ✅ Pull Request / Code Review
  • ✅ Issue 跟踪
  • ✅ Wiki 文档
  • ✅ Gitea ↔ GitHub 双向镜像
  • ✅ Webhook 集成

3. 双向同步

源 目标 触发方式 同步内容
Plane Gitea Webhook / 定时 Issue → Gitea Issue
Gitea Plane Webhook PR/Commit → Plane Activity
Plane GitHub Webhook / 定时 Issue → GitHub Issue
GitHub Plane Webhook PR/Commit → Plane Activity
Gitea GitHub Push / 定时 代码镜像
GitHub Gitea Webhook 反向同步 (可选)

4. CI/CD 流水线

  • ✅ Gitea Actions (GitOps)
  • ✅ 自动化测试
  • ✅ 代码质量检查
  • ✅ 安全扫描
  • ✅ Docker 镜像构建
  • ✅ 自动部署到 K3s

5. AI 辅助开发 (Claude)

  • ✅ 需求分析和技术方案生成
  • ✅ 代码实现 (支持多语言)
  • ✅ 单元测试和集成测试生成
  • ✅ Code Review 辅助
  • ✅ Bug 分析和修复建议
  • ✅ 文档生成

快速开始

前置条件

  • Docker 20.10+
  • Docker Compose 2.0+
  • Git 2.30+
  • kubectl (可选,用于 K8s 部署)
  • 8GB+ RAM 推荐

5 分钟快速部署

# 1. 克隆仓库
git clone https://github.com/your-repo/plane-gitea-github-infra.git
cd plane-gitea-github-infra

# 2. 配置环境变量
cp plane/env.example plane/.env
# 编辑 plane/.env,填入你的 Token

# 3. 启动 Plane
cd plane
docker-compose up -d

# 4. 访问 Plane
open http://localhost:8000

# 5. 配置 Gitea 集成 (见下文)

验证部署

# 检查服务状态
docker ps

# 应该看到:
# - plane-web
# - plane-api
# - plane-worker
# - plane-db
# - plane-redis
# - plane-minio

完整部署

部署选项

部署方式 适用场景 复杂度
Docker Compose 本地开发、小团队 ⭐ 简单
K3s 生产环境、多节点 ⭐⭐⭐ 中等
K8s (完整) 大型企业、高可用 ⭐⭐⭐⭐⭐ 复杂

方式 1: Docker Compose 部署 (推荐新手)

1.1 部署 Plane

cd plane
docker-compose up -d

# 初始化 Plane
docker-compose exec plane-api python manage.py migrate
docker-compose exec plane-api python manage.py createsuperuser

1.2 部署 Gitea (如已有,跳过)

cd ../gitea
# 编辑 docker-compose.yaml 配置
docker-compose up -d

1.3 部署同步服务

# Gitea ↔ GitHub 同步
cd ../gitea-to-github-sync
docker build -t gitea-github-sync .
docker-compose up -d

# Plane ↔ Gitea 同步
cd ../plane-integration/gitea-sync
docker build -t plane-gitea-sync .
docker-compose up -d

# Plane ↔ GitHub 同步
cd ../github-sync
docker build -t plane-github-sync .
docker-compose up -d

1.4 验证

# 检查所有服务健康状态
curl http://localhost:8000/api/health/
curl http://192.168.1.83:33000/api/v1/version
curl http://localhost:8828/health   # Gitea-GitHub sync
curl http://localhost:8001/health   # Plane-Gitea sync
curl http://localhost:8002/health   # Plane-GitHub sync

方式 2: K3s 部署 (生产环境)

2.1 安装 K3s

# 安装 K3s
curl -sfL https://get.k3s.io | sh -

# 验证安装
kubectl get nodes

2.2 部署应用

# 部署 Plane
kubectl apply -f k3s/plane.yaml

# 检查状态
kubectl get pods -n plane-system

# 等待所有 Pod 就绪
kubectl wait --for=condition=ready pod -l app=plane-web -n plane-system --timeout=300s

2.3 配置 Ingress

# 安装 Traefik (如果需要)
kubectl apply -f k3s/gateway.yaml

# 配置域名解析
echo "127.0.0.1 plane.local" | sudo tee -a /etc/hosts

2.4 配置同步服务

# 部署 Gitea-GitHub 同步 CronJob
kubectl apply -f gitea-to-github-sync/cronjob.yaml

# 查看 CronJob
kubectl get cronjobs

配置指南

1. 获取 API Tokens

Plane API Token

# 方式 1: 通过 UI
1. 登录 Plane: http://localhost:8000
2. Settings → API Tokens
3. Create New Token
4. 复制 Token

# 方式 2: 通过 API
curl -X POST http://localhost:8000/api/v1/auth/api-tokens/ \
  -H "Authorization: Bearer <your-auth-token>" \
  -H "Content-Type: application/json" \
  -d '{"label": "Sync Service"}'

Gitea Token

# 通过 UI
1. 登录 Gitea: http://192.168.1.83:33000
2. Settings → Applications
3. Generate New Token
4. 选择权限: repo, admin:org, write:issue
5. 复制 Token

# 通过 API
curl -X POST http://192.168.1.83:33000/api/v1/users/<username>/tokens \
  -u "<username>:<password>" \
  -H "Content-Type: application/json" \
  -d '{"name": "sync-service"}'

GitHub Token

# 通过 GitHub UI
1. Settings → Developer settings → Personal access tokens
2. Generate new token (classic)
3. 选择权限: repo, workflow, admin:repo_hook
4. Generate token
5. 复制 Token

2. 配置环境变量

编辑 plane/.env:

# Plane
PLANE_API_TOKEN=plane_your_token_here

# Gitea
GITEA_URL=http://192.168.1.83:33000
GITEA_TOKEN=your_gitea_token

# GitHub
GITHUB_TOKEN=ghp_your_github_token

# Webhook Secret (自己生成)
WEBHOOK_SECRET=$(openssl rand -hex 32)

3. 配置 Webhooks

3.1 Gitea Webhook

# 在 Gitea 仓库中配置
Repository Settings → Webhooks → Add Webhook

URL: http://plane-gitea-sync:8001/webhook/gitea
Content Type: application/json
Secret: <your-webhook-secret>

Events:
☑ Push
☑ Pull Request
☑ Issues
☑ Issue Comment

3.2 GitHub Webhook

# 在 GitHub 仓库中配置
Repository Settings → Webhooks → Add webhook

Payload URL: http://your-domain:8002/webhook/github
Content type: application/json
Secret: <your-webhook-secret>

Events:
☑ Pull requests
☑ Pushes
☑ Issues
☑ Issue comments
☑ Pull request reviews

4. 配置 Plane 项目

在 Plane 项目中添加自定义字段:

# 项目描述或自定义属性
gitea_integration:
  owner: your-username
  repo: your-repo
  sync_enabled: true

github_integration:
  owner: your-username
  repo: your-repo
  sync_enabled: true

使用文档

完整文档链接

典型工作流程

# 1. 在 Plane 创建 Feature Issue
→ 使用 Feature 模板
→ 填写需求和验收标准
→ 添加标签和优先级

# 2. Claude 分析需求
→ Claude 读取 Issue
→ 生成技术方案
→ 创建 Git 分支

# 3. 开发实现
→ Claude 生成代码
→ 自动提交到 Gitea
→ 镜像同步到 GitHub

# 4. 创建 PR
→ Claude 生成 PR 描述
→ 自动触发 CI/CD
→ 代码质量检查

# 5. Code Review & 合并
→ 团队 Review 代码
→ CI 检查通过
→ 合并到主分支

# 6. 自动部署
→ 构建 Docker 镜像
→ 推送到 Harbor
→ 部署到 K3s

# 7. 验证 & 更新
→ 部署验证
→ Plane Issue 自动更新为 Done
→ 通知团队

故障排查

常见问题

1. Plane 无法访问

# 检查容器状态
docker ps -a | grep plane

# 查看日志
docker logs plane-web
docker logs plane-api

# 重启服务
docker-compose restart

2. Webhook 未触发

# 检查 webhook URL 是否可访问
curl -X POST http://plane-gitea-sync:8001/health

# 检查 webhook secret
# 在 Gitea/GitHub webhook 页面查看 Recent Deliveries

# 查看同步服务日志
docker logs plane-gitea-sync
docker logs plane-github-sync

3. 同步失败

# 测试 API 连接
curl -H "Authorization: token $GITEA_TOKEN" \
  http://192.168.1.83:33000/api/v1/user

curl -H "Authorization: Bearer $PLANE_API_TOKEN" \
  http://localhost:8000/api/v1/users/me/

# 检查 Token 权限
# 确保 Token 有足够的权限 (repo, issues, etc.)

# 手动触发同步
curl -X POST http://localhost:8001/sync/manual \
  -H "Content-Type: application/json" \
  -d '{"workspace_slug": "my-workspace", "project_id": "proj_123", ...}'

4. CI/CD 失败

# 查看 Gitea Actions 日志
# Gitea → Repository → Actions → Workflows

# 查看 Runner 状态
docker ps | grep gitea-runner

# 重启 Runner
docker restart gitea-runner-docker

日志收集

# 收集所有日志用于排查
mkdir -p logs

docker logs plane-web > logs/plane-web.log 2>&1
docker logs plane-api > logs/plane-api.log 2>&1
docker logs plane-gitea-sync > logs/sync-gitea.log 2>&1
docker logs plane-github-sync > logs/sync-github.log 2>&1
docker logs gitea-github-mirror > logs/mirror.log 2>&1

# 打包日志
tar -czf logs-$(date +%Y%m%d-%H%M%S).tar.gz logs/

项目结构

plane-gitea-github-infra/
├── README.md                          # 本文件
├── plane/                             # Plane 部署
│   ├── docker-compose.yaml
│   └── env.example
├── gitea/                             # Gitea 配置
│   ├── docker-compose.yaml
│   ├── app.ini
│   └── gitea-mirror.sh
├── gitea-to-github-sync/             # Gitea ↔ GitHub 同步
│   ├── sync.py
│   ├── Dockerfile
│   ├── requirements.txt
│   └── cronjob.yaml
├── plane-integration/                 # Plane 集成
│   ├── gitea-sync/                   # Plane ↔ Gitea
│   │   ├── sync_service.py
│   │   ├── Dockerfile
│   │   └── requirements.txt
│   ├── github-sync/                  # Plane ↔ GitHub
│   │   ├── sync_service.py
│   │   ├── Dockerfile
│   │   └── requirements.txt
│   ├── gitea-webhook.md
│   └── github-webhook.md
├── k3s/                               # Kubernetes 部署
│   ├── plane.yaml
│   ├── gitea.yaml
│   └── gateway.yaml
├── docs/                              # 文档
│   ├── plane-templates.md            # Plane 模板
│   └── claude-dev-workflow.md        # Claude 工作流
└── examples/                          # 示例项目
    ├── health-platform/
    └── stock-ai-recommender/

系统要求

开发环境

  • CPU: 2 cores+
  • RAM: 4GB+
  • Disk: 20GB+
  • OS: macOS / Linux / Windows (WSL2)

生产环境

  • CPU: 4 cores+
  • RAM: 8GB+
  • Disk: 50GB+ SSD
  • OS: Ubuntu 20.04+ / Debian 11+

性能指标

响应时间

  • Plane API: < 200ms (P95)
  • Gitea API: < 150ms (P95)
  • Sync Service: < 500ms (P95)

吞吐量

  • Webhook 处理: 100+ req/s
  • Concurrent Users: 50+
  • Repository Sync: 10+ repos/min

资源使用

  • Plane: ~1GB RAM
  • Gitea: ~500MB RAM
  • Sync Services: ~200MB RAM each
  • Total: ~2GB RAM

安全建议

  1. ✅ 使用强密码和 Token
  2. ✅ 启用 HTTPS (生产环境)
  3. ✅ 配置防火墙规则
  4. ✅ 定期备份数据
  5. ✅ 更新依赖和镜像
  6. ✅ 监控异常活动
  7. ✅ 使用 Webhook Secret验证
  8. ✅ 限制 API 访问权限

备份与恢复

备份

# 备份 Plane 数据库
docker exec plane-db pg_dump -U plane plane > plane-backup.sql

# 备份 Gitea 数据
cd ~/ops/gitea
./gitea-backup.sh

# 备份配置文件
tar -czf config-backup.tar.gz \
  plane/.env \
  gitea/app.ini \
  k3s/*.yaml

恢复

# 恢复 Plane 数据库
docker exec -i plane-db psql -U plane plane < plane-backup.sql

# 恢复 Gitea
cd ~/ops/gitea
./gitea-restore.sh backup-20251124-220000

贡献指南

欢迎贡献! 请查看 CONTRIBUTING.md


许可证

MIT License - 详见 LICENSE


致谢


联系方式


🎉 Happy Coding with Plane + Gitea + GitHub + Claude! 🎉

Last Updated: 2025-11-24 Version: 1.0.0

S
Description
No description provided
Readme
139 KiB
Languages
Python 74.1%
Shell 23.6%
Dockerfile 2.3%