跳到主要内容

架构设计

整体架构

┌─────────────────────────────────────────────────────┐
│ 浏览器 / Git 客户端 │
└──────────┬──────────────────────┬───────────────────┘
│ HTTP (3001) │ HTTP/SSH (8081/2022)
▼ ▼
┌──────────────────┐ ┌──────────────────────────────┐
│ web (Next.js) │ │ server (Go + Fiber) │
│ ┌────────────┐ │ │ ┌──────────┐ ┌───────────┐ │
│ │ SSR/CSR │──┼────┼─▶│ Router │─▶│ Handler │ │
│ │ Chakra UI │ │ │ │ Middleware│ │ Service │ │
│ └────────────┘ │ │ └──────────┘ └─────┬─────┘ │
└──────────────────┘ │ │ │
│ ┌───────────────────▼──────┐ │
│ │ Repository (GORM) │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ SQLite/MySQL/PG │ │ │
│ │ └─────────────────────┘ │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ Git Service (go-git) │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ repositories/ │ │ │
│ │ │ (bare git repos) │ │ │
│ │ └─────────────────────┘ │ │
│ └───────────────────────────┘ │
└──────────────────────────────┘

后端分层

职责目录
Router路由注册、中间件链internal/router/
HandlerHTTP 请求处理、参数校验、响应序列化internal/handler/
Service业务逻辑、事务编排internal/service/
Repository数据访问、GORM 操作internal/repository/
Model数据模型定义internal/model/
Middleware认证、CORS、限流、日志internal/middleware/
GitGit 操作封装(含输入验证、仓库锁)internal/git/
Container依赖注入容器internal/container/

Git 安全层

internal/git/ 包提供所有 Git 操作,并内置安全机制:

文件职责
validation.go输入验证工具(IsValidRefNameValidateRepoPathIsValidCommitHash
lock.go仓库级并发锁(GetRepoLock
branches.go分支操作(含输入验证和锁)
tags.go标签操作(含输入验证和锁)
files.go文件操作(含路径验证和锁)
commits.go提交查询
diff.go差异对比

依赖注入

所有服务通过 container.Container 统一管理,启动时初始化,handler 通过容器获取 service 实例。

数据库迁移

启动顺序:
InitGORMDB → AutoMigrate(建表)→ RunMigrations(数据回填)
  • AutoMigrate:GORM 自动建表/加列(幂等)
  • RunMigrations:版本化 SQL 迁移(internal/database/migrations/*.up.sql

前端架构

Next.js App Router

web/src/
├── app/ # 页面路由
│ ├── [owner]/[repo]/ # 仓库相关页面
│ ├── projects/[slug]/ # 项目管理页面
│ ├── admin/ # 管理后台
│ └── settings/ # 用户设置
├── components/ # 共享组件
├── contexts/ # React Context(认证、WebSocket、i18n)
├── lib/ # 工具函数、API 客户端
└── api/ # API 请求封装

API 客户端

lib/api.ts 中的 ApiClient 统一处理:

  • 认证 token(localStorage + cookie)
  • 请求/响应拦截
  • 401 自动跳转登录
  • API 基址动态适配(浏览器 hostname)

国际化

使用 I18nContext + JSON locale 文件(src/locales/en.json / zh.json)。