xml1<to_translate> 2--- 3stage: none 4group: unassigned 5info: Any user with at least the Maintainer role can merge updates to this content. For details, see <https://gitlab.cn/docs/development/development_processes/#development-guidelines-review>. 6title: 极狐GitLab 架构概览 7--- 8 9## 软件交付 10 11极狐GitLab 有两种软件分发版本: 12 13- 开源[基础版](https://jihulab.com/gitlab-cn/gitlab-foss/)(CE)。 14- 开放核心的[企业版](https://jihulab.com/gitlab-cn/gitlab/)(EE)。 15 16EE 仓库已归档。极狐GitLab 现在[采用单一代码库](https://gitlab.cn/blog/a-single-codebase-for-gitlab-community-and-enterprise-edition/)运作。 17 18极狐GitLab 提供[不同订阅方案](https://gitlab.cn/pricing/)。 19 20极狐GitLab 的新版本从稳定分支发布,而 `main` 分支用于前沿开发。 21 22详情请参阅[极狐GitLab 发布流程](https://handbook.gitlab.com/handbook/engineering/releases/)。 23 24两种分发版本均需要额外的组件。这些组件在[组件详情](#components)部分有描述,且各自拥有独立的代码仓库。 25每个依赖组件的新版本通常以标签形式发布,但基于极狐GitLab 代码 `main` 分支进行开发可让你获得这些组件的最新稳定版本。新版本通常与极狐GitLab 发布周期同步,但紧急安全更新除外。 26 27## 组件 28 29极狐GitLab 典型安装在 GNU/Linux 上,但越来越多的部署也使用 Kubernetes 平台。已知最大的极狐GitLab 实例是 GitLab.com,它通过我们[官方极狐GitLab Helm Chart](https://gitlab.cn/docs/charts) 和[官方 Linux 软件包](https://gitlab.cn/install/) 进行部署。 30 31典型安装使用 NGINX 或 Apache 作为 Web 服务器,代理请求至[极狐GitLab Workhorse](https://jihulab.com/gitlab-cn/gitlab/tree/master/workhorse),并传入 [Puma](https://puma.io) 应用服务器。极狐GitLab 通过 Puma 应用服务器提供网页和[极狐GitLab API](../api/rest/_index.md) 服务。它使用 Sidekiq 作为任务队列,而 Sidekiq 又使用 Redis 作为非持久化数据库后端,用于存储任务信息、元数据和传入任务。 32 33默认情况下,Puma 与 Workhorse 之间通过 Unix 域套接字通信,但也支持通过 TCP 转发请求。Workhorse 直接访问 `gitlab/public` 目录,绕过 Puma 应用服务器来提供静态页面、上传文件(例如头像或附件)以及预编译的静态资源。 34 35极狐GitLab 应用使用 PostgreSQL 存储持久化数据库信息(例如用户、权限、议题或其他元数据)。极狐GitLab 将裸 Git 仓库存储于[配置文件 `repositories:` 部分](https://jihulab.com/gitlab-cn/gitlab/-/blob/master/config/gitlab.yml.example) 定义的位置。同时,它也将默认分支和钩子信息与裸仓库一起保存。 36 37当通过 HTTP/HTTPS 提供仓库服务时,极狐GitLab 使用极狐GitLab API 解析授权和访问控制,并提供 Git 对象。 38 39附加组件极狐GitLab Shell 通过 SSH 提供仓库服务。它管理位于[配置文件 `GitLab Shell` 部分](https://jihulab.com/gitlab-cn/gitlab/-/blob/master/config/gitlab.yml.example)定义位置的 SSH 密钥。该位置中的文件绝不应手动编辑。极狐GitLab Shell 通过 Gitaly 访问裸仓库来提供 Git 对象,并与 Redis 通信以向 Sidekiq 提交任务供极狐GitLab 处理。极狐GitLab Shell 查询极狐GitLab API 来确定授权和访问权限。 40 41Gitaly 从极狐GitLab Shell 和极狐GitLab Web 应用执行 Git 操作,并向极狐GitLab Web 应用提供 API 以获取 Git 属性(例如标题、分支、标签或其他元数据)和 blobs(例如差异、提交或文件)。 42 43你可能也对 [GitLab.com 的生产环境架构](https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/production/architecture/) 感兴趣。 44 45## 适配现有组件与引入新组件 46 47当极狐GitLab 安装在传统 Linux 机器上或安装在容器化平台(如 Kubernetes)上时,其应用行为存在根本性差异。 48 49相比于[我们的官方安装方法](https://gitlab.cn/install/),一些显著区别包括: 50 51- 官方 Linux 软件包可以让不同服务访问同一文件系统上的文件。[共享文件](shared_files.md)对于在 Kubernetes 平台上运行的应用而言并不可行。 52- 官方 Linux 软件包默认配置下,各服务可以访问共享配置和网络。而在 Kubernetes 中运行的服务则不同,它们可能在完全隔离的环境中运行,或仅能通过特定端口访问。 53 54换句话说,在设计新功能和添加新组件时,必须仔细考虑服务间的共享状态。需要访问相同文件的服务,应能够通过适当的 API 交换信息。只要可能,就不应通过文件来实现。 55 56由于遵循 API 优先理念编写的组件能够兼容两种部署方式,所有新功能和服务都必须**首先**考虑 Kubernetes 兼容性。 57 58确保兼容的最简单方法是,为你功能或服务添加[官方极狐GitLab Helm Chart](https://gitlab.cn/docs/charts) 的支持,或联系[交付团队](https://handbook.gitlab.com/handbook/engineering/infrastructure-platforms/gitlab-delivery/distribution/#how-to-work-with-distribution)。 59 60有关详情,请参考[添加新服务组件的流程](adding_service_component.md)。 61 62### 简化组件概览 63 64这是可用于理解极狐GitLab 架构的简化架构图。 65 66完整架构图详见下方的[组件图](#component-diagram)。 67 68```mermaid 69%%{init: {"flowchart": { "useMaxWidth": false } }}%% 70graph TB 71 %% Component declarations and formatting 72 HTTP((HTTP/HTTPS)) 73 SSH((SSH)) 74 GitLabPages(GitLab Pages) 75 GitLabWorkhorse(GitLab Workhorse) 76 GitLabShell(GitLab Shell) 77 Gitaly(Gitaly) 78 Puma("Puma (Gitlab Rails)") 79 Sidekiq("Sidekiq (GitLab Rails)") 80 PostgreSQL(PostgreSQL) 81 Redis(Redis) 82 83 HTTP -- TCP 80,443 --> NGINX 84 SSH -- TCP 22 --> GitLabShell 85 86 NGINX -- TCP 8090 --> GitLabPages 87 NGINX --> GitLabWorkhorse 88 89 GitLabShell --> Gitaly 90 GitLabShell --> GitLabWorkhorse 91 92 GitLabWorkhorse --> Gitaly 93 GitLabWorkhorse --> Puma 94 GitLabWorkhorse --> Redis 95 96 Sidekiq --> PostgreSQL 97 Sidekiq --> Redis 98 99 Puma --> PostgreSQL 100 Puma --> Redis 101 Puma --> Gitaly 102 103 Gitaly --> GitLabWorkhorse
所有连接除非另外注明,均使用 Unix 套接字。
组件图
Rendering chart...
组件图例
- ✅ - 默认安装
- ⚙ - 需要额外配置
- ⤓ - 需要手动安装
- ❌ - 不支持或没有说明
- N/A - 不适用
组件状态已链接至各个组件的配置文档。
组件列表
| 组件 | 描述 | Omnibus GitLab | GitLab Environment Toolkit (GET) | GitLab chart | minikube Minimal | GitLab.com | 源码 | GDK | CE/EE |
|---|---|---|---|---|---|---|---|---|---|
| AI 网关 | 极狐GitLab AI 原生功能 | ⤓ | ❌ | ✅ | ❌ | ✅ | ⤓ | ✅ | 仅企业版 |
| GitLab Duo Workflow Service | 极狐GitLab AI 原生功能 | ⤓ | ❌ | ✅ | ❌ | ✅ | ⤓ | ✅ | 仅企业版 |
| 证书管理 | TLS 设置、Let's Encrypt | ✅ | ✅ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | 基础版 & 企业版 |
| Consul | 数据库节点发现、故障转移 | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | 仅企业版 |
| 数据库迁移 | 数据库迁移 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | 基础版 & 企业版 |
| Elasticsearch | 改进极狐GitLab 内搜索 | ⤓ | ⚙ | ⤓ | ⤓ | ✅ | ⤓ | ⚙ | 仅企业版 |
| Gitaly | 用于处理所有极狐GitLab 发出的 Git 调用的 Git RPC 服务 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | 基础版 & 企业版 |
| GitLab Exporter | 生成多种极狐GitLab 指标 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| GitLab Geo | 地理分布式极狐GitLab 站点 | ⚙ | ⚙ | ❌ | ❌ | ✅ | ❌ | ⚙ | 仅企业版 |
| GitLab Pages | 托管静态网站 | ⚙ | ⚙ | ⚙ | ❌ | ✅ | ⚙ | ⚙ | 基础版 & 企业版 |
| 极狐GitLab agent for Kubernetes | 以云原生方式集成 Kubernetes 集群 | ⚙ | ⚙ | ⚙ | ❌ | ❌ | ⤓ | ⚙ | 仅企业版 |
| 极狐GitLab 自监控:Alertmanager | 去重、分组并路由来自 Prometheus 的告警 | ⚙ | ⚙ | ✅ | ⚙ | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| 极狐GitLab 自监控:Grafana | 指标仪表盘 | ✅ | ✅ | ⚙ | ⤓ | ✅ | ❌ | ⚙ | 基础版 & 企业版 |
| 极狐GitLab 自监控:Jaeger | 查看极狐GitLab 实例生成的追踪信息 | ❌ | ⚙ | ⚙ | ❌ | ❌ | ⤓ | ⚙ | 基础版 & 企业版 |
| 极狐GitLab 自监控:Prometheus | 时序数据库、指标采集和查询服务 | ✅ | ✅ | ✅ | ⚙ | ✅ | ❌ | ⚙ | 基础版 & 企业版 |
| 极狐GitLab 自监控:Sentry | 追踪极狐GitLab 实例产生的错误 | ⤓ | ⤓ | ⤓ | ❌ | ✅ | ⤓ | ⤓ | 基础版 & 企业版 |
| GitLab Shell | 通过 SSH 会话处理 git 操作 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | 基础版 & 企业版 |
| GitLab Workhorse | 智能反向代理,处理大型 HTTP 请求 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | 基础版 & 企业版 |
| 接收邮件 (SMTP) | 接收消息以更新议题 | ⤓ | ⤓ | ⚙ | ⤓ | ✅ | ⤓ | ⤓ | 基础版 & 企业版 |
| Jaeger 集成 | 已部署应用的分布式追踪 | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | ⚙ | 仅企业版 |
| LDAP 认证 | 基于集中式 LDAP 目录对用户进行认证 | ⤓ | ⤓ | ⤓ | ⤓ | ❌ | ⤓ | ⚙ | 基础版 & 企业版 |
| Mattermost | 开源 Slack 替代方案 | ⚙ | ⚙ | ⤓ | ⤓ | ⤓ | ❌ | ⚙ | 基础版 & 企业版 |
| 对象存储 | 兼容 S3 的对象存储服务 | ⤓ | ⤓ | ✅ | ✅ | ✅ | ❌ | ⚙ | 基础版 & 企业版 |
| NGINX | 将请求路由至相应组件,终止 SSL | ✅ | ✅ | ✅ | ⚙ | ✅ | ⤓ | ⚙ | 基础版 & 企业版 |
| Node Exporter | 提供系统指标的 Prometheus 端点 | ✅ | ✅ | N/A | N/A | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| 发送邮件 (SMTP) | 向用户发送邮件 | ⤓ | ⤓ | ⚙ | ⤓ | ✅ | ⤓ | ⤓ | 基础版 & 企业版 |
| Patroni | 管理 PostgreSQL HA 集群领导者选举和复制 | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | 仅企业版 |
| PgBouncer Exporter | 提供 PgBouncer 指标的 Prometheus 端点 | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| PgBouncer | 数据库连接池、故障转移 | ⚙ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | 仅企业版 |
| PostgreSQL Exporter | 提供 PostgreSQL 指标的 Prometheus 端点 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| PostgreSQL | 数据库 | ✅ | ✅ | ✅ | ✅ | ✅ | ⤓ | ✅ | 基础版 & 企业版 |
| Praefect | 任何 Git 客户端与 Gitaly 存储节点之间的透明代理。 | ✅ | ✅ | ⚙ | ❌ | ❌ | ⚙ | ✅ | 基础版 & 企业版 |
| Puma (GitLab Rails) | 处理 Web 界面和 API 请求 | ✅ | ✅ | ✅ | ✅ | ✅ | ⚙ | ✅ | 基础版 & 企业版 |
| Redis Exporter | 提供 Redis 指标的 Prometheus 端点 | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | 基础版 & 企业版 |
| Redis | 缓存服务 | ✅ | ✅ | ✅ | ✅ | ✅ | ⤓ | ✅ | 基础版 & 企业版 |
| Registry | 容器镜像仓库,允许推送和拉取镜像 | ⚙ | ⚙ | ✅ | ✅ | ✅ | ⤓ | ⚙ | 基础版 & 企业版 |
| Runner | 执行极狐GitLab CI/CD 作业 | ⤓ | ⤓ | ✅ | ⚙ | ✅ | ⚙ | ⚙ | 基础版 & 企业版 |
| Sentry 集成 | 已部署应用的错误追踪 | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | ⤓ | 基础版 & 企业版 |
| Sidekiq | 后台作业处理器 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | 基础版 & 企业版 |
| Token 吊销 API | 接收并吊销泄露的密钥 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | ❌ | 仅企业版 |
组件详情
本文档旨在让系统管理员和极狐GitLab 支持工程师更深入地了解极狐GitLab 的内部构成及其协同工作方式。
部署后,极狐GitLab 应视为以下各个进程的集合。在进行故障排查或调试时,请尽可能明确指出所涉及的组件,这有助于提高清晰度并减少混淆。
分层
从进程角度来看,极狐GitLab 可划分为两层:
- 监控层:该层的任何组件并非极狐GitLab 应用所必需,但能让管理员更深入地洞察其基础设施和整体服务运行状况。
- 核心层:任何对极狐GitLab 平台交付至关重要的进程。一旦这些进程中的任何一个停止,都会导致极狐GitLab 服务中断。对于核心层,可进一步划分为:
- 处理器:这些进程负责实际执行操作并提供服务。
- 数据层:这些服务为极狐GitLab 服务存储/暴露结构化数据。
Alertmanager
</to_translate>
- 项目页面
- 配置:
- 层级:监控
- 进程:alertmanager
- JihuLab.com:JihuLab.com 的监控
告警管理器是 Prometheus 提供的一个工具,“负责处理客户端应用(如 Prometheus 服务器)发送的告警。它负责去除重复、分组,并将告警路由到正确的接收器集成,例如电子邮件、PagerDuty 或 Opsgenie。它还负责告警的静默和抑制。”你可以在议题 #45740 中了解更多关于我们告警的内容。
AI 网关
- 项目页面:
- 配置:
- JihuLab.com:JihuLab.com 的监控
极狐GitLab AI 网关是一个独立服务,它将为所有极狐GitLab 用户提供 AI 功能访问,无论他们使用的是哪种实例:私有化部署还是 JihuLab.com。
你可以阅读更多信息:
- 在该项目的 README 中。
- 在安装说明中。
极狐GitLab Duo Workflow 服务
- 项目页面:
- 配置:
- JihuLab.com:JihuLab.com 的监控
极狐GitLab Duo Workflow 服务是我们的 Agentic AI 功能,它通过我们的 Runway 服务部署。
你可以阅读更多信息:
- 在设计文档中。
证书管理
Consul
Consul 是一个用于服务发现和配置的工具。Consul 具有分布式、高可用和极高的可扩展性。
数据库迁移
Elasticsearch
Elasticsearch 是一个基于 RESTful 的分布式搜索引擎,专为云环境构建。
Gitaly
Gitaly 是极狐GitLab 设计的一个服务,旨在消除在分布式部署极狐GitLab(如 JihuLab.com 或高可用部署)时对 NFS 存储 Git 的需求。从 11.3.0 版本开始,此服务处理极狐GitLab 中所有 Git 级别的访问。你可以在该项目的 README 中了解更多关于该项目的信息。
Praefect
Praefect 是每个 Git 客户端与 Gitaly 之间的透明代理,用于协调仓库更新到辅助节点的复制。
极狐GitLab Geo
Geo 是一个专业版功能,旨在通过提供主极狐GitLab 实例的一个或多个只读镜像,加快分布式团队的开发速度。此镜像(Geo 辅助站点)可减少克隆或获取大型仓库和项目的时间,或作为灾难恢复解决方案的一部分。
极狐GitLab 导出器
- 项目页面
- 配置:
- 层级:监控
- 进程:gitlab-exporter
- JihuLab.com:JihuLab.com 的监控
极狐GitLab 导出器是一个内部设计的进程,允许我们将极狐GitLab 应用程序内部的指标导出到 Prometheus。你可以在该项目的 README 中了解更多信息。
针对 Kubernetes 的极狐GitLab 代理
针对 Kubernetes 的极狐GitLab 代理是一个活跃的集群内组件,以安全、云原生的方式解决极狐GitLab 与 Kubernetes 的集成任务。
你可以使用它将部署同步到你的 Kubernetes 集群。
极狐GitLab Pages
- 配置:
- 层级:核心服务(处理器)
- JihuLab.com:极狐GitLab Pages
极狐GitLab Pages 是一个允许你直接从极狐GitLab 仓库发布静态网站的功能。
你可以将其用于个人或商业网站,例如作品集、文档、宣言和业务演示。你也可以为你的内容指定任意许可证。
极狐GitLab Runner
极狐GitLab Runner 运行作业并将结果发送给极狐GitLab。
极狐GitLab CI/CD 是包含在极狐GitLab 中的开源持续集成服务,用于协调测试。该项目的旧称是 GitLab CI Multi Runner,但你现在应该使用 GitLab Runner(不带 CI)。
极狐GitLab Shell
极狐GitLab Shell是极狐GitLab 设计的一个程序,用于处理基于 SSH 的 git 会话,并修改授权密钥列表。极狐GitLab Shell 不是一个 Unix shell,也不是 Bash 或 Zsh 的替代品。
极狐GitLab Workhorse
极狐GitLab Workhorse是极狐GitLab 设计的一个程序,旨在帮助减轻 Puma 的压力。你可以阅读更多关于开发 Workhorse 的历史原因。它被设计为一个智能反向代理,以帮助加速整个极狐GitLab。
Grafana
- 项目页面
- 配置:
- 层级:监控
- JihuLab.com:极狐GitLab 分类 Grafana 仪表板
Grafana 是一个开源的、功能丰富的指标仪表板和图形编辑器,适用于 Graphite、Elasticsearch、OpenTSDB、Prometheus 和 InfluxDB。
Jaeger
Jaeger 是一个受 Dapper 和 OpenZipkin 启发的分布式追踪系统。 它可用于监控基于微服务的分布式系统。
Logrotate
极狐GitLab 由大量服务组成,这些服务都会产生日志。我们捆绑了自己的 Logrotate,以确保我们负责任地进行日志记录。这仅仅是常见开源产品的打包版本。
Mattermost
- 项目页面
- 配置:
- 层级:核心服务(处理器)
- JihuLab.com:Mattermost
Mattermost 是一个开源、私有云、来自 https://mattermost.com 的 Slack 替代品。
对象存储
极狐GitLab 需要一个兼容 S3 的对象存储来存储数据,例如 CI 产物、LFS 对象、上传内容以及容器镜像仓库镜像。极狐GitLab 与任何提供完整 S3 API 兼容性的对象存储提供商兼容。提供商的选择由你负责。常用的有云托管服务如 Amazon S3、Google Cloud Storage 和 Azure Blob Storage,以及任何私有化部署的 S3 兼容解决方案。
NGINX
NGINX 为所有 HTTP 请求提供入口端口,并将它们路由到极狐GitLab 中的相应子系统。我们捆绑了流行开源 Web 服务器的未修改版本。
Node Exporter
- 项目页面
- 配置:
- 层级:监控
- 进程:node-exporter
- JihuLab.com:JihuLab.com 的监控
Node Exporter是 Prometheus 的一个工具,为我们提供底层机器(如 CPU / 磁盘 / 负载)的指标。它只是 Prometheus 项目中常见开源产品的打包版本。
Patroni
PgBouncer
适用于 PostgreSQL 的轻量级连接池。
PgBouncer Exporter
- 项目页面
- 配置:
- 层级:监控
- JihuLab.com:JihuLab.com 的监控
用于 PgBouncer 的 Prometheus exporter。在 9127/metrics 处导出指标。
PostgreSQL
- 项目页面
- 配置:
- 层级:核心服务(数据)
- 进程:postgresql
- JihuLab.com:PostgreSQL
极狐GitLab 集成了流行的数据库,为应用程序元数据和用户信息提供存储。
PostgreSQL Exporter
- 项目页面
- 配置:
- 层级:监控
- 进程:postgres-exporter
- JihuLab.com:JihuLab.com 的监控
postgres_exporter是社区提供的 Prometheus exporter,将 PostgreSQL 数据传递给 Prometheus,以便在 Grafana 仪表板中使用。
Prometheus
- 项目页面
- 配置:
- 层级:监控
- 进程:prometheus
- JihuLab.com:Prometheus
Prometheus 是一个时间序列工具,帮助极狐GitLab 管理员暴露有关用于提供极狐GitLab 服务的各个进程的指标。
Redis
Redis 被集成以提供存储:
- 会话数据
- 临时缓存信息
- 后台作业队列
有关极狐GitLab 如何使用 Redis 的更多信息,请参阅我们的 Redis 指南。
Redis Exporter
- 项目页面
- 配置:
- 层级:监控
- 进程:redis-exporter
- JihuLab.com:JihuLab.com 的监控
Redis Exporter旨在向 Prometheus 提供有关 Redis 进程的特定指标,以便我们可以在 Grafana 中绘制这些指标。
容器镜像仓库
容器镜像仓库是用户用来存储自己的 Docker 镜像的。集成的镜像仓库使用 NGINX 作为负载均衡器,并使用极狐GitLab 作为认证管理器。每当客户端请求从仓库拉取或推送镜像时,它都会返回一个 401 响应以及一个标头,详细说明从何处获取认证令牌,在本例中就是极狐GitLab 实例。然后,客户端从极狐GitLab 请求拉取或推送认证令牌,并重试对仓库的原始请求。更多信息,请参阅令牌认证。
也可以配置外部仓库使用极狐GitLab 作为认证端点。
Sentry
Sentry 本质上是一项帮助你实时监控和修复崩溃的服务。服务器端用 Python 编写,但它包含一个完整的 API,用于从任何语言的任何应用程序发送事件。
有关监控已部署应用的更多信息,请参阅 Sentry 集成文档
Sidekiq
Sidekiq 是一个 Ruby 后台作业处理器,从 Redis 队列中拉取作业并进行处理。后台作业使极狐GitLab 能够通过将工作移至后台来提供更快的请求 / 响应周期。
Puma
从极狐GitLab 13.0 开始,Puma 是默认的 Web 服务器。
Puma是一个 Ruby 应用程序服务器,用于运行核心 Rails 应用程序,该程序提供极狐GitLab 中面向用户的功能。根据极狐GitLab 版本的不同,此程序经常在进程输出中显示为 bundle 或 config.ru。
LDAP 认证
外发邮件
接收邮件
按请求类型划分的极狐GitLab
极狐GitLab 为最终用户提供了两种“接口”来访问服务:
- Web HTTP 请求(查看 UI / API)
- Git HTTP / SSH 请求(推送 / 拉取 Git 数据)
理解这一区别很重要,因为某些进程在这两种请求类型中都会使用,而其他进程则专用于特定请求类型。
极狐GitLab Web HTTP 请求周期
当向 HTTP 端点发出请求时(例如 /users/sign_in),该请求在极狐GitLab 服务中经过以下路径:
- NGINX - 充当我们的第一层反向代理。
- 极狐GitLab Workhorse - 确定是否需要转到 Rails 应用程序或转到其他地方,以减轻 Puma 的负载。
- Puma - 由于这是一个 Web 请求,并且需要访问应用程序,因此将其路由到 Puma。
- PostgreSQL / Gitaly / Redis - 根据请求类型,可能会访问这些服务以存储或检索数据。
极狐GitLab Git 请求周期
下面我们描述 HTTP 与 SSH Git 请求所经过的不同路径。与 Web 请求周期有一些重叠,但也存在一些差异。
Web 请求 (80/443)
通过 HTTP 的 Git 操作使用 Git 文档中描述的无状态“智能”协议,但处理这些操作的职责由几个极狐GitLab 组件分担。
以下是 git fetch 的序列图。所有请求都经过 NGINX 和任何其他 HTTP 负载均衡器,但不会以任何方式被它们转换。所有路径都相对于 /namespace/project.git URL 呈现。
Rendering chart...
git push 的顺序类似,只是使用 git-receive-pack 而不是 git-upload-pack。
SSH 请求 (22)
通过 SSH 的 Git 操作可以使用 Git 文档中描述的有状态协议,但处理它们的职责由几个极狐GitLab 组件分担。
没有极狐GitLab 组件直接使用 SSH 通信——所有 SSH 连接都是在客户端机器上的 Git 与 SSH 服务器之间建立的,该服务器终止连接。对于 SSH 服务器,所有连接均以 git 用户身份进行认证;极狐GitLab 用户通过客户端提供的 SSH 密钥进行区分。
以下是启用了快速 SSH 密钥查找时的 git fetch 序列图。AuthorizedKeysCommand 是由极狐GitLab Shell 提供的一个可执行文件:
Rendering chart...
git push 操作非常相似,只是使用 git receive-pack 而不是 git upload-pack。
如果未启用快速 SSH 密钥查找,SSH 服务器将从 ~git/.ssh/authorized_keys 文件中读取,以确定针对给定 SSH 会话要运行的命令。该文件由 Rails 中的 AuthorizedKeysWorker 保持最新,计划在用户修改 SSH 密钥时运行。
可以使用 SSH 证书 代替密钥。在这种情况下,AuthorizedKeysCommand 将被替换为 AuthorizedPrincipalsCommand。这会从证书中提取用户名,而无需使用 Rails 内部 API,该用户名会在后续的 /api/internal/allowed 调用中用于代替 key_id。
极狐GitLab Shell 还有一些不涉及 Gitaly 的操作,例如重置双因素认证码。这些操作以相同的方式处理,只是无需与 Gitaly 进行往返——Rails 作为内部 API 调用的一部分执行操作,而极狐GitLab Shell 直接将响应流式传输回用户。
系统布局
图片中提到的 ~git 指的是 Git 用户的主目录,通常是 /home/git。
极狐GitLab 主要安装在 /home/git 用户主目录下,以 git 用户身份运行。在该主目录中,既有极狐GitLab 服务器软件,也有代码仓库(尽管代码仓库位置是可配置的)。
裸仓库位于 /home/git/repositories。极狐GitLab 是一个 Ruby on Rails 应用,因此可以通过研究 Ruby on Rails 应用的工作原理来了解其内部细节。
为了通过 SSH 提供代码仓库服务,有一个叫做极狐GitLab Shell 的附加应用,安装在 /home/git/gitlab-shell。
安装文件夹摘要
总结一下,这里是 git 用户主目录的目录结构。
进程
shellps aux | grep '^git'
极狐GitLab 需要多个组件才能运行。它需要一个持久化数据库(PostgreSQL)和 Redis 数据库,并使用 Apache httpd 或 NGINX 来 proxypass Puma。所有这些组件都应以与极狐GitLab 不同的系统用户身份运行(例如,postgres、redis 和 www-data,而不是 git)。
以 git 用户身份,它会启动 Sidekiq 和 Puma(一个简单的 Ruby HTTP 服务器,默认在 8080 端口运行)。在 GitLab 用户下,通常有 4 个进程:puma master(1 个进程)、puma cluster worker(2 个进程)、sidekiq(1 个进程)。
代码仓库访问
代码仓库通过 HTTP 或 SSH 进行访问。HTTP 克隆/推送/拉取使用极狐GitLab API,SSH 克隆由极狐GitLab Shell(之前已解释)处理。
故障排除
有关更多信息,请参阅自述文件。
服务的初始化脚本
极狐GitLab 初始化脚本用于启动和停止 Puma 和 Sidekiq:
plaintext/etc/init.d/gitlab 用法:service gitlab {start|stop|restart|reload|status}
Redis(键值存储/非持久化数据库):
plaintext/etc/init.d/redis 用法:/etc/init.d/redis {start|stop|status|restart|condrestart|try-restart}
SSH 守护进程:
plaintext/etc/init.d/sshd 用法:/etc/init.d/sshd {start|stop|restart|reload|force-reload|condrestart|try-restart|status}
Web 服务器(以下之一):
plaintext/etc/init.d/httpd 用法:httpd {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest} $ /etc/init.d/nginx 用法:nginx {start|stop|restart|reload|force-reload|status|configtest}
持久化数据库:
plaintext$ /etc/init.d/postgresql 用法:/etc/init.d/postgresql {start|stop|restart|reload|force-reload|status} [version ..]
服务的日志位置
极狐GitLab(包括 Puma 和 Sidekiq 日志):
- /home/git/gitlab/log/ 通常包含 application.log、production.log、sidekiq.log、puma.stdout.log、git_json.log 和 puma.stderr.log。
极狐GitLab Shell:
- /home/git/gitlab-shell/gitlab-shell.log
SSH:
- /var/log/auth.log 认证日志(在 Ubuntu 上)。
- /var/log/secure 认证日志(在 RHEL 上)。
NGINX:
- /var/log/nginx/ 包含错误和访问日志。
Apache httpd:
- Apache 日志说明。
- /var/log/apache2/ 包含错误和输出日志(在 Ubuntu 上)。
- /var/log/httpd/ 包含错误和输出日志(在 RHEL 上)。
Redis:
- /var/log/redis/redis.log 那里也有日志轮转文件。
PostgreSQL:
- /var/log/postgresql/*
极狐GitLab 特定配置文件
极狐GitLab 的配置文件位于 /home/git/gitlab/config/*。常被引用的配置文件包括:
- gitlab.yml:极狐GitLab Rails 配置
- puma.rb:Puma Web 服务器设置
- database.yml:数据库连接设置
极狐GitLab Shell 的配置文件位于 /home/git/gitlab-shell/config.yml。
在极狐GitLab Rails 中添加新设置
属于 gitlab.yml 的设置包括与以下相关的设置:
- 应用程序如何跨多个服务连接。例如,Gitaly 地址、Redis 地址、Postgres 地址和 Consul 地址。
- 分布式追踪配置,以及一些可观测性配置。例如,直方图桶边界。
- 任何需要在 Rails 初始化期间配置的内容,可能是在建立 Postgres 连接之前。
许多其他设置更适合放在应用程序本身的 ApplicationSetting 中。在 UI 中管理设置通常比管理配置文件具有更好的用户体验。就开发成本而言,修改 gitlab.yml 通常看起来迭代更快,但当你考虑以下所有部署方法时,这可能是一个糟糕的权衡。
在 gitlab.yml 中添加设置时:
- 确保它也添加到 Omnibus 中。
- 确保如果需要,也添加到 Charts 中。
- 确保它也添加到 GDK 中。
维护任务
极狐GitLab 提供了 Rake 任务,你可以使用这些任务查看版本信息并对配置进行快速检查,以确保它在应用程序中正确配置。请参阅维护 Rake 任务。 简而言之,请执行以下操作:
shellsudo -i -u git cd gitlab bundle exec rake gitlab:env:info RAILS_ENV=production bundle exec rake gitlab:check RAILS_ENV=production
建议使用 sudo -i -u git 或 sudo su - git 登录到 git 用户。尽管极狐GitLab 提供的 sudo 命令在 Ubuntu 中有效,但它们在 RHEL 中并不总是有效。
JihuLab.com
JihuLab.com 架构 详细说明了以供参考,但此架构仅在你拥有数百万用户时才有用。
AI 架构
一个 SaaS 模型网关 可用于启用 AI 原生功能。