菜单

架构概述

相关源文件

本文档提供了 Gitea 架构的高层概述,解释了主要组件及其相互作用。旨在帮助开发者理解代码库的结构组织,以便贡献或定制。有关各个子系统的更具体细节,请参阅专门的页面,例如 仓库系统用户界面数据库系统

系统架构

Gitea 是一个用 Go 编写的综合性 Git 服务管理平台。代码库遵循模块化架构,具有明确的职责分层。

核心架构图

来源:routers/init.gomodules/git/git.gomodels/db/engine.go

架构包含以下主要层次

  1. Web 层:通过各种路由包处理 HTTP 请求和路由。
  2. 服务层:包含诸如仓库、问题和用户等功能的业务逻辑。
  3. 模型层:定义数据结构和数据库交互。
  4. 数据层:管理持久化存储(数据库、Git 仓库、文件存储)。
  5. 基础设施:提供 Git 操作、配置和日志记录等核心功能。

系统初始化

Gitea 遵循一个定义明确的初始化序列,该序列设置了所有核心组件。

来源:routers/init.go:114-180modules/git/git.go:197-222

routers/init.go:InitWebInstalled 中的初始化过程设置了整个应用程序,验证 Git 兼容性,初始化数据库连接,注册模型,并配置 HTTP 路由。

Git 系统

Git 模块是提供 Git 操作安全接口的关键组件。

来源:modules/git/command.gomodules/git/repo.gomodules/git/git.go

Git 模块提供了几个关键组件

  • Command:安全的 Git 命令执行(防止命令注入)。
  • Repository:Git 仓库操作(克隆、抓取、推送)。
  • Commit/Diff:Git 对象操作和差异生成。
  • Features:Git 版本检测和功能兼容性。

modules/git/command.go 中的 Command 结构对于安全执行 Git 命令尤为重要。

数据库系统

Gitea 使用 XORM 作为 ORM,并支持多种数据库后端。

来源:modules/setting/database.gomodels/db/engine.gomodels/db/context.go

数据库系统的关键组件包括

  • DB Context:提供上下文感知数据库操作。
  • XORM Engine:主数据库连接管理器。
  • Transaction Context:处理数据库事务,并在出错时自动回滚。

数据库配置通过 setting 包进行管理。

Web 路由系统

Web 路由系统处理所有 HTTP 请求并将它们路由到相应的处理程序。

来源:routers/init.go:182-220

路由系统建立在 web.Router 包之上,路由按功能进行组织。

  • Web UI 路由:用于用户交互的 HTML 页面。
  • API 路由:用于程序化访问的 RESTful API 端点。
  • 内部 API:由 Git 钩子等内部服务使用的路由。
  • 包注册表:用于包管理(npm、Maven 等)的路由。
  • Actions API:用于 CI/CD 功能的路由。

服务层

服务层包含应用程序的业务逻辑。

来源:routers/init.go:149-165services/mirror/mirror_pull.go

每个服务负责一个特定的领域,并可根据需要与其他服务进行交互。服务在 routers/init.go 中在系统启动期间初始化。

仓库镜像系统

作为服务实现的一个例子,仓库镜像系统处理与远程仓库的同步。

来源:services/mirror/mirror_pull.go:197-369

镜像同步过程

  1. 执行 git fetch 从远程仓库检索更改。
  2. 解析输出以确定新添加、更新和删除的引用。
  3. 更新本地分支和标签以匹配远程仓库。
  4. 将数据库元数据与更新后的仓库状态同步。

存储系统

Gitea 使用模块化存储系统来处理各种类型的内容。

来源:routers/web/base.gomodules/storage

存储系统为存储和检索各种类型的内容提供了一个统一的接口,并支持不同的后端存储选项。

HTTP 缓存

Gitea 实现 HTTP 缓存以提高性能。

来源:modules/httpcache/httpcache.gorouters/api/v1/repo/file.go

HTTP 缓存系统

  1. 检查条件请求头(If-None-MatchIf-Modified-Since)。
  2. 验证缓存内容是否仍然有效。
  3. 如果缓存有效,则返回 304 Not Modified,或处理请求并设置新的缓存头。

文件服务流程

Gitea 实现了一个复杂的文件服务流程,用于从仓库中提供文件。

来源:routers/api/v1/repo/file.go:94-228

此流程展示了 Gitea 如何

  1. 从 Git 仓库检索文件内容。
  2. 检测文件是否为 LFS 指针。
  3. 如果是 LFS 指针,则从 LFS 存储中检索实际内容。
  4. 通过直接重定向到存储或通过应用程序提供服务来优化传递。

结论

此架构概述提供了 Gitea 主要组件及其交互方式的高级理解。模块化设计允许灵活性和扩展性,同时保持应用程序不同层之间的清晰关注点分离。

有关特定组件的更详细信息,请参阅其各自的 wiki 页面。

来源:go.modrouters/init.gomodules/git/git.gomodules/db/context.go