422.md 34.1 KB
Newer Older
Lab机器人's avatar
readme  
Lab机器人 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
# Reference architecture: up to 2,000 users

> 原文:[https://docs.gitlab.com/ee/administration/reference_architectures/2k_users.html](https://docs.gitlab.com/ee/administration/reference_architectures/2k_users.html)

*   [Setup components](#setup-components)
*   [Configure the load balancer](#configure-the-load-balancer)
    *   [Application node terminates SSL](#application-node-terminates-ssl)
    *   [Load balancer terminates SSL without backend SSL](#load-balancer-terminates-ssl-without-backend-ssl)
    *   [Load balancer terminates SSL with backend SSL](#load-balancer-terminates-ssl-with-backend-ssl)
    *   [Ports](#ports)
        *   [Alternate SSH Port](#alternate-ssh-port)
*   [Configure PostgreSQL](#configure-postgresql)
    *   [Provide your own PostgreSQL instance](#provide-your-own-postgresql-instance)
    *   [Standalone PostgreSQL using Omnibus GitLab](#standalone-postgresql-using-omnibus-gitlab)
*   [Configure Redis](#configure-redis)
    *   [Provide your own Redis instance](#provide-your-own-redis-instance)
    *   [Standalone Redis using Omnibus GitLab](#standalone-redis-using-omnibus-gitlab)
*   [Configure Gitaly](#configure-gitaly)
    *   [Gitaly TLS support](#gitaly-tls-support)
*   [Configure GitLab Rails](#configure-gitlab-rails)
*   [Configure Prometheus](#configure-prometheus)
*   [Configure the object storage](#configure-the-object-storage)
*   [Configure NFS (optional)](#configure-nfs-optional)
*   [Troubleshooting](#troubleshooting)

# Reference architecture: up to 2,000 users[](#reference-architecture-up-to-2000-users "Permalink")

该页面描述了最多可容纳 2,000 位用户的 GitLab 参考架构. 有关参考架构的完整列表,请参见[可用参考架构](index.html#available-reference-architectures) .

> *   **支持的用户(大约):** 2,000
> *   **高可用性:** False
> *   **每秒测试请求(RPS)速率:** API:40 RPS,Web:4 RPS,Git:4 RPS

| Service | Nodes | Configuration | GCP | AWS | Azure |
| --- | --- | --- | --- | --- | --- |
| 负载均衡器 | 1 | 2 个 vCPU,1.8GB 内存 | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| PostgreSQL | 1 | 2 个 vCPU,7.5GB 内存 | `n1-standard-2` | `m5.large` | `D2s v3` |
| Redis | 1 | 1 个 vCPU,3.75GB 内存 | `n1-standard-1` | `m5.large` | `D2s v3` |
| Gitaly | 1 | 4 个 vCPU,15GB 内存 | `n1-standard-4` | `m5.xlarge` | `D4s v3` |
| 亚搏体育 app Rails | 2 | 8 个 vCPU,7.2GB 内存 | `n1-highcpu-8` | `c5.2xlarge` | `F8s v2` |
| 监控节点 | 1 | 2 个 vCPU,1.8GB 内存 | `n1-highcpu-2` | `c5.large` | `F2s v2` |
| 对象存储 | n/a | n/a | n/a | n/a | n/a |
| NFS 服务器(可选,不推荐) | 1 | 4 个 vCPU,3.6GB 内存 | `n1-highcpu-4` | `c5.xlarge` | `F4s v2` |

Google Cloud Platform(GCP)架构是使用[Intel Xeon E5 v3(Haswell)](https://cloud.google.com/compute/docs/cpu-platforms) CPU 平台构建和测试的. 在不同的硬件上,您可能会发现需要对 CPU 或节点数进行更低或更高的调整. 有关更多信息,请参见我们基于[Sysbench](https://github.com/akopytov/sysbench)[CPU 基准测试](https://gitlab.com/gitlab-org/quality/performance/-/wikis/Reference-Architectures/GCP-CPU-Benchmarks) .

由于具有更好的性能和可用性,对于数据对象(例如 LFS,上载或工件),建议使用[对象存储服务](#configure-the-object-storage)而不是 NFS. 使用对象存储服务也不需要您配置和维护节点.

## Setup components[](#setup-components "Permalink")

设置 GitLab 及其组件以容纳多达 2,000 个用户:

1.  [配置外部负载平衡节点](#configure-the-load-balancer)以处理两个 GitLab 应用程序服务节点的负载平衡.
2.  [配置 PostgreSQL](#configure-postgresql) (GitLab 的数据库).
3.  [Configure Redis](#configure-redis).
4.  [配置 Gitaly](#configure-gitaly) ,它提供对 Git 存储库的访问.
5.  [配置主要的 GitLab Rails 应用程序](#configure-gitlab-rails)以运行 Puma / Unicorn,Workhorse,GitLab Shell,并满足所有前端请求(包括 UI,API 和基于 HTTP / SSH 的 Git).
6.  [配置 Prometheus](#configure-prometheus)来监视您的 GitLab 环境.
7.  [配置](#configure-the-object-storage)用于共享数据对象[的对象存储](#configure-the-object-storage) .
8.  [配置 NFS](#configure-nfs-optional) (可选,不建议使用)以具有共享磁盘存储服务,以替代 Gitaly 或对象存储. 如果您不使用 GitLab 页面(需要 NFS),则可以跳过此步骤.

## Configure the load balancer[](#configure-the-load-balancer "Permalink")

**注意:**此体系结构已经过[HAProxy 的](https://www.haproxy.org/)测试和验证. 尽管您可以使用具有类似功能的负载均衡器,但 GitLab 尚未验证其他负载均衡器.

在主动/主动 GitLab 配置中,您需要一个负载平衡器才能将流量路由到应用程序服务器. GitLab 文档超出了使用负载平衡器或其确切配置的详细信息. 如果要管理多节点系统(包括 GitLab),则可能已经选择了负载均衡器. 一些示例包括 HAProxy(开源),F5 Big-IP LTM 和 Citrix Net Scaler. 本文档包括与 GitLab 一起使用的端口和协议.

下一个问题是如何在环境中处理 SSL. 有几种不同的选择:

*   [The application node terminates SSL](#application-node-terminates-ssl).
*   [负载平衡器终止没有后端 SSL 的 SSL,](#load-balancer-terminates-ssl-without-backend-ssl)并且负载平衡器与应用程序节点之间的通信不安全.
*   [负载均衡器使用后端 SSL 终止 SSL,](#load-balancer-terminates-ssl-with-backend-ssl)并且负载均衡器与应用程序节点之间的通信是*安全*的.

### Application node terminates SSL[](#application-node-terminates-ssl "Permalink")

配置您的负载均衡器以将端口 443 上的连接作为`TCP`而不是`HTTP(S)`传递. 这会将连接保持不变地传递到应用程序节点的 NGINX 服务,该服务具有 SSL 证书并侦听端口 443.

有关管理 SSL 证书和配置 NGINX 的详细信息,请参见[NGINX HTTPS 文档](https://docs.gitlab.com/omnibus/settings/nginx.html) .

### Load balancer terminates SSL without backend SSL[](#load-balancer-terminates-ssl-without-backend-ssl "Permalink")

将负载平衡器配置为使用`HTTP(S)`协议而不是`TCP` . 负载平衡器将负责管理 SSL 证书和终止 SSL.

由于负载平衡器和 GitLab 之间的通信不安全,因此您需要完成一些其他配置. 有关详细信息,请参见[NGINX 代理的 SSL 文档](https://docs.gitlab.com/omnibus/settings/nginx.html) .

### Load balancer terminates SSL with backend SSL[](#load-balancer-terminates-ssl-with-backend-ssl "Permalink")

配置您的负载平衡器(如果只有一个,则为单个平衡器)以使用`HTTP(S)`协议而不是`TCP` . 负载平衡器将负责为最终用户管理 SSL 证书.

在这种情况下,负载平衡器和 NGINX 之间的流量将是安全的,并且无需为代理 SSL 添加配置. 但是,您需要向 GitLab 添加配置以配置 SSL 证书. 有关管理 SSL 证书和配置 NGINX 的详细信息,请参见[NGINX HTTPS 文档](https://docs.gitlab.com/omnibus/settings/nginx.html) .

### Ports[](#ports "Permalink")

The basic load balancer ports you should use are described in the following table:

| Port | 后端端口 | Protocol |
| --- | --- | --- |
| 80 | 80 | HTTP( *1* ) |
| 443 | 443 | TCP 或 HTTPS( *1* )( *2* ) |
| 22 | 22 | TCP |

**1* ): [Web 终端](../../ci/environments/index.html#web-terminals)支持要求您的负载平衡器正确处理 WebSocket 连接. 当使用 HTTP 或 HTTPS 代理,负载平衡器必须被配置为通过`Connection``Upgrade`逐跳头. 有关详细信息,请参见[Web 终端](../integration/terminal.html)集成指南.
**2* ):在端口 443 上使用 HTTPS 协议时,您需要向负载均衡器添加 SSL 证书. 如果需要在 GitLab 应用程序服务器上终止 SSL,请使用 TCP 协议.

如果您使用具有自定义域支持的 GitLab 页面,则将需要一些其他端口配置. GitLab 页面需要一个单独的虚拟 IP 地址. 配置 DNS,以将`pages_external_url``/etc/gitlab/gitlab.rb`指向新的虚拟 IP 地址. 有关更多信息,请参见[GitLab 页面文档](../pages/index.html) .

| Port | 后端端口 | Protocol |
| --- | --- | --- |
| 80 | 变化( *1* ) | HTTP |
| 443 | 变化( *1* ) | TCP( *2* ) |

**1* ):GitLab 页面的后端端口取决于`gitlab_pages['external_http']``gitlab_pages['external_https']`设置. 有关详细信息,请参见[GitLab 页面文档](../pages/index.html) .
**2* ):GitLab 页面的端口 443 必须使用 TCP 协议. 用户可以使用自定义 SSL 配置自定义域,如果 SSL 在负载均衡器处终止,则无法实现.

#### Alternate SSH Port[](#alternate-ssh-port "Permalink")

某些组织有禁止打开 SSH 端口 22 的策略.在这种情况下,配置备用 SSH 主机名可能会有所帮助,该主机名改为允许用户通过端口 443 使用 SSH.与先前描述的相比,备用 SSH 主机名需要新的虚拟 IP 地址. GitLab HTTP 配置.

为备用 SSH 主机名配置 DNS,例如`altssh.gitlab.example.com`

| LB 端口 | 后端端口 | Protocol |
| --- | --- | --- |
| 443 | 22 | TCP |

[Back to setup components](#setup-components)

## Configure PostgreSQL[](#configure-postgresql "Permalink")

在本节中,将指导您配置与 GitLab 一起使用的外部 PostgreSQL 数据库.

### Provide your own PostgreSQL instance[](#provide-your-own-postgresql-instance "Permalink")

如果您将 GitLab 托管在云提供商上,则可以选择将托管服务用于 PostgreSQL. 例如,AWS 提供了运行 PostgreSQL 的托管关系数据库服务(RDS).

如果您使用云托管服务,或提供自己的 PostgreSQL:

1.  根据[数据库要求文档](../../install/requirements.html#database)设置 PostgreSQL.
2.  使用您选择的密码创建一个`gitlab`用户名. `gitlab`用户需要特权才能创建`gitlabhq_production`数据库.
3.  使用适当的详细信息配置 GitLab 应用程序服务器. [配置 GitLab Rails 应用程序](#configure-gitlab-rails)涵盖了此步骤.

### Standalone PostgreSQL using Omnibus GitLab[](#standalone-postgresql-using-omnibus-gitlab "Permalink")

1.  SSH 进入 PostgreSQL 服务器.
2.  从 GitLab 下载页面使用**步骤 1 和 2** [下载/安装](https://about.gitlab.com/install/)所需的 Omnibus GitLab 软件包.
    *   不要完成下载页面上的任何其他步骤.
3.  为 PostgreSQL 生成密码哈希. 假设您将使用默认用户名`gitlab` (推荐). 该命令将要求输入密码和确认. 将此命令在下一步中输出的值用作`POSTGRESQL_PASSWORD_HASH`的值.

    ```
    sudo gitlab-ctl pg-password-md5 gitlab 
    ```

4.  编辑`/etc/gitlab/gitlab.rb`并添加以下内容,以适当地更新占位符值.

    *   `POSTGRESQL_PASSWORD_HASH`上一步的输出值
    *   `APPLICATION_SERVER_IP_BLOCKS`将连接到数据库的 GitLab 应用程序服务器的 IP 子网或 IP 地址的空格分隔列表. 示例: `%w(123.123.123.123/32 123.123.123.234/32)`

    ```
    # Disable all components except PostgreSQL
    roles ['postgres_role']
    repmgr['enable'] = false
    consul['enable'] = false
    prometheus['enable'] = false
    alertmanager['enable'] = false
    pgbouncer_exporter['enable'] = false
    redis_exporter['enable'] = false
    gitlab_exporter['enable'] = false

    # Set the network addresses that the exporters used for monitoring will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100'
    postgres_exporter['listen_address'] = '0.0.0.0:9187'
    postgres_exporter['dbname'] = 'gitlabhq_production'
    postgres_exporter['password'] = 'POSTGRESQL_PASSWORD_HASH'

    # Set the PostgreSQL address and port
    postgresql['listen_address'] = '0.0.0.0'
    postgresql['port'] = 5432

    # Replace POSTGRESQL_PASSWORD_HASH with a generated md5 value
    postgresql['sql_user_password'] = 'POSTGRESQL_PASSWORD_HASH'

    # Replace APPLICATION_SERVER_IP_BLOCK with the CIDR address of the application node
    postgresql['trust_auth_cidr_addresses'] = %w(127.0.0.1/32 APPLICATION_SERVER_IP_BLOCK)

    # Disable automatic database migrations
    gitlab_rails['auto_migrate'] = false 
    ```

5.  [重新配置 GitLab,](../restart_gitlab.html#omnibus-gitlab-reconfigure)以使更改生效.
6.  注意 PostgreSQL 节点的 IP 地址或主机名,端口和纯文本密码. 这些在以后配置[GitLab 应用程序服务器](#configure-gitlab-rails)时是必需的.

支持高级[配置选项](https://docs.gitlab.com/omnibus/settings/database.html) ,可以根据需要添加.

[Back to setup components](#setup-components)

## Configure Redis[](#configure-redis "Permalink")

在本节中,将指导您配置与 GitLab 一起使用的外部 Redis 实例.

### Provide your own Redis instance[](#provide-your-own-redis-instance "Permalink")

需要 Redis 5.0 或更高版本,因为这是从 GitLab 13.0 开始的 Omnibus GitLab 软件包附带的版本. 较旧的 Redis 版本不支持 SPOP 的可选 count 参数,这对于[合并火车](../../ci/merge_request_pipelines/pipelines_for_merged_results/merge_trains/index.html)现在是必需的.

此外,GitLab 还利用了某些命令,例如`UNLINK``USAGE` ,这些命令仅在 Redis 4 中引入.

来自云提供商(例如 AWS ElastiCache)的托管 Redis 将可以使用. 如果这些服务支持高可用性,请确保它不是 Redis 群集类型.

注意 Redis 节点的 IP 地址或主机名,端口和密码(如果需要). 这些在以后配置[GitLab 应用程序服务器](#configure-gitlab-rails)时是必需的.

### Standalone Redis using Omnibus GitLab[](#standalone-redis-using-omnibus-gitlab "Permalink")

Omnibus GitLab 软件包可用于配置独立的 Redis 服务器. 以下步骤是使用 Omnibus 配置 Redis 服务器的最低必需步骤:

1.  SSH 进入 Redis 服务器.
2.  从 GitLab 下载页面使用**步骤 1 和 2** [下载/安装](https://about.gitlab.com/install/)所需的 Omnibus GitLab 软件包.
    *   不要完成下载页面上的任何其他步骤.
3.  编辑`/etc/gitlab/gitlab.rb`并添加内容:

    ```
    ## Enable Redis
    redis['enable'] = true

    ## Disable all other services
    sidekiq['enable'] = false
    gitlab_workhorse['enable'] = false
    puma['enable'] = false
    unicorn['enable'] = false
    postgresql['enable'] = false
    nginx['enable'] = false
    prometheus['enable'] = false
    alertmanager['enable'] = false
    pgbouncer_exporter['enable'] = false
    gitlab_exporter['enable'] = false
    gitaly['enable'] = false
    grafana['enable'] = false

    redis['bind'] = '0.0.0.0'
    redis['port'] = 6379
    redis['password'] = 'SECRET_PASSWORD_HERE'

    gitlab_rails['enable'] = false

    # Set the network addresses that the exporters used for monitoring will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100'
    redis_exporter['listen_address'] = '0.0.0.0:9121'
    redis_exporter['flags'] = {
          'redis.addr' => 'redis://0.0.0.0:6379',
          'redis.password' => 'SECRET_PASSWORD_HERE',
    } 
    ```

4.  [重新配置 Omnibus GitLab,](../restart_gitlab.html#omnibus-gitlab-reconfigure)以使更改生效.
5.  注意 Redis 节点的 IP 地址或主机名,端口和 Redis 密码. 这些在以后[配置 GitLab 应用程序服务器](#configure-gitlab-rails)时是必需的.

支持高级[配置选项](https://docs.gitlab.com/omnibus/settings/redis.html) ,可以根据需要添加.

[Back to setup components](#setup-components)

## Configure Gitaly[](#configure-gitaly "Permalink")

在自己的服务器上部署 Gitaly 可以使大于单个计算机的 GitLab 安装受益. Gitaly 节点的要求取决于数据,特别是项目的数量及其大小. 建议每个 Gitaly 节点存储的数据量不得超过 5TB. 您的 2K 设置可能需要一个或多个节点,具体取决于您的存储库存储要求.

我们强烈建议所有 Gitaly 节点都安装 SSD 磁盘,因为 Gitaly I / O 繁重,因此其读取操作的吞吐量至少为 8,000 IOPS,写入操作的吞吐量至少为 2,000 IOPS. 这些 IOPS 值仅建议作为启动器使用,因为随着时间的推移,它们可能会根据环境工作负载的规模而调整得更高或更低. 如果您正在 Cloud provider 上运行环境,则可能需要参考其文档以了解如何正确配置 IOPS.

Some things to note:

*   GitLab Rails 应用程序将[存储库分](../repository_storage_paths.html)片到[存储库中](../repository_storage_paths.html) .
*   A Gitaly server can host one or more storages.
*   一个 GitLab 服务器可以使用一个或多个 Gitaly 服务器.
*   必须以对所有 Gitaly 客户端正确解析的方式指定 Gitaly 地址.
*   Gitaly 服务器一定不能暴露在公共互联网上,因为默认情况下,Gitaly 的网络流量是未加密的. 强烈建议使用防火墙以限制对 Gitaly 服务器的访问. 另一种选择是[使用 TLS](#gitaly-tls-support) .

**提示:**有关 Gitaly 历史和网络体系结构的更多信息,请参见[独立的 Gitaly 文档](../gitaly/index.html) .

注意: **注意:** Gitaly 文档中引用的令牌只是管理员选择的任意密码. 它与为 GitLab API 创建的令牌或其他类似的 Web API 令牌无关.

下面我们将介绍如何配置一个 Gitaly 服务器`gitaly1.internal`与秘密令牌`gitalysecret` . 我们假设您的 GitLab 安装有两个存储库存储: `default``storage1` .

要配置 Gitaly 服务器:

1.  从 GitLab 下载页面使用**步骤 1 和 2** [下载/安装](https://about.gitlab.com/install/)所需的 Omnibus GitLab 软件包,但**不**提供`EXTERNAL_URL`值.
2.  编辑`/etc/gitlab/gitlab.rb`以配置存储路径,启用网络侦听器并配置令牌:

    ```
    # /etc/gitlab/gitlab.rb

    # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
    # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
    # The following two values must be the same as their respective values
    # of the GitLab Rails application setup
    gitaly['auth_token'] = 'gitlaysecret'
    gitlab_shell['secret_token'] = 'shellsecret'

    # Avoid running unnecessary services on the Gitaly server
    postgresql['enable'] = false
    redis['enable'] = false
    nginx['enable'] = false
    puma['enable'] = false
    unicorn['enable'] = false
    sidekiq['enable'] = false
    gitlab_workhorse['enable'] = false
    grafana['enable'] = false

    # If you run a seperate monitoring node you can disable these services
    alertmanager['enable'] = false
    prometheus['enable'] = false

    # Prevent database connections during 'gitlab-ctl reconfigure'
    gitlab_rails['rake_cache_clear'] = false
    gitlab_rails['auto_migrate'] = false

    # Configure the gitlab-shell API callback URL. Without this, `git push` will
    # fail. This can be your 'front door' GitLab URL or an internal load
    # balancer.
    # Don't forget to copy `/etc/gitlab/gitlab-secrets.json` from web server to Gitaly server.
    gitlab_rails['internal_api_url'] = 'https://gitlab.example.com'

    # Make Gitaly accept connections on all network interfaces. You must use
    # firewalls to restrict access to this address/port.
    # Comment out following line if you only want to support TLS connections
    gitaly['listen_addr'] = "0.0.0.0:8075"
    gitaly['prometheus_listen_addr'] = "0.0.0.0:9236"

    # Set the network addresses that the exporters used for monitoring will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100' 
    ```

3.  将以下内容添加到`/etc/gitlab/gitlab.rb`上的`gitaly1.internal`

    ```
    git_data_dirs({
      'default' => {
        'path' => '/var/opt/gitlab/git-data'
      },
      'storage1' => {
        'path' => '/mnt/gitlab/git-data'
      },
    }) 
    ```

4.  保存文件并[重新配置 GitLab](../restart_gitlab.html#omnibus-gitlab-reconfigure) .
5.  确认 Gitaly 可以执行对内部 API 的回调:

    ```
    sudo /opt/gitlab/embedded/service/gitlab-shell/bin/check -config /opt/gitlab/embedded/service/gitlab-shell/config.yml 
    ```

### Gitaly TLS support[](#gitaly-tls-support "Permalink")

Gitaly 支持 TLS 加密. 为了能够与侦听安全连接的 Gitaly 实例进行通信,您将需要在 GitLab 配置中相应存储条目的`gitaly_address`中使用`tls://` URL 方案.

您将需要携带自己的证书,因为该证书不会自动提供. 证书或其证书颁发机构必须按照[GitLab 自定义证书配置中](https://docs.gitlab.com/omnibus/settings/ssl.html)所述的步骤,安装在所有 Gitaly 节点(包括使用证书的 Gitaly 节点)上,以及与之通信的所有客户端节点上.

**注意:**自签名证书必须指定用于访问 Gitaly 服务器的地址. 如果要通过主机名寻址 Gitaly 服务器,则可以为此使用"公用名"字段,也可以将其添加为"使用者备用名". 如果要通过 Gitaly 服务器的 IP 地址对其进行寻址,则必须将其作为主题备用名称添加到证书中. [gRPC 不支持在证书中使用 IP 地址作为公用名](https://github.com/grpc/grpc/issues/2691) .**注意:**可以同时为 Gitaly 服务器配置未加密的侦听地址`listen_addr`和已加密的侦听地址`tls_listen_addr` . 如果需要,这使您可以从未加密的流量逐渐过渡到加密的流量.

要使用 TLS 配置 Gitaly:

1.  创建`/etc/gitlab/ssl`目录,并在其中复制密钥和证书:

    ```
    sudo mkdir -p /etc/gitlab/ssl
    sudo chmod 755 /etc/gitlab/ssl
    sudo cp key.pem cert.pem /etc/gitlab/ssl/
    sudo chmod 644 key.pem cert.pem 
    ```

2.  将证书复制到`/etc/gitlab/trusted-certs`以便 Gitaly 在调用自身时信任该证书:

    ```
    sudo cp /etc/gitlab/ssl/cert.pem /etc/gitlab/trusted-certs/ 
    ```

3.  编辑`/etc/gitlab/gitlab.rb`并添加:

    ```
    gitaly['tls_listen_addr'] = "0.0.0.0:9999"
    gitaly['certificate_path'] = "/etc/gitlab/ssl/cert.pem"
    gitaly['key_path'] = "/etc/gitlab/ssl/key.pem" 
    ```

4.  Delete `gitaly['listen_addr']` to allow only encrypted connections.
5.  保存文件并[重新配置 GitLab](../restart_gitlab.html#omnibus-gitlab-reconfigure) .

[Back to setup components](#setup-components)

## Configure GitLab Rails[](#configure-gitlab-rails "Permalink")

**注意:**在我们的体系结构中,我们使用 Puma Web 服务器运行每个 GitLab Rails 节点,并将其工作程序数设置为可用 CPU 的 90%以及四个线程. 对于运行带有其他组件的 Rails 的节点,应该相应地降低 worker 的值,我们发现 50%达到了很好的平衡,但这取决于工作量.

本节介绍如何配置 GitLab 应用程序(Rails)组件. 在每个节点上执行以下操作:

1.  如果您[使用的是 NFS](#configure-nfs-optional)

    1.  如有必要,请使用以下命令安装 NFS 客户端实用程序软件包:

        ```
        # Ubuntu/Debian
        apt-get install nfs-common

        # CentOS/Red Hat
        yum install nfs-utils nfs-utils-lib 
        ```

    2.  在`/etc/fstab`指定必要的 NFS 挂载. `/etc/fstab`的确切内容取决于您选择配置 NFS 服务器的方式. 有关示例和各种选项,请参见[NFS 文档](../high_availability/nfs.html) .

    3.  创建共享目录. 这些可能会有所不同,具体取决于您的 NFS 安装位置.

        ```
        mkdir -p /var/opt/gitlab/.ssh /var/opt/gitlab/gitlab-rails/uploads /var/opt/gitlab/gitlab-rails/shared /var/opt/gitlab/gitlab-ci/builds /var/opt/gitlab/git-data 
        ```

2.  使用[GitLab 下载中的](https://about.gitlab.com/install/) **步骤 1 和 2**下载/安装 Omnibus GitLab. 不要完成下载页面上的其他步骤.
3.  创建/编辑`/etc/gitlab/gitlab.rb`并使用以下配置. 为了保持整个节点的链接均匀性, `external_url`在应用服务器上应指向外部 URL,用户将用来访问 GitLab. 这将是[负载均衡器](#configure-the-load-balancer)的 URL,它将把流量路由到 GitLab 应用程序服务器:

    ```
    external_url 'https://gitlab.example.com'

    # Gitaly and GitLab use two shared secrets for authentication, one to authenticate gRPC requests
    # to Gitaly, and a second for authentication callbacks from GitLab-Shell to the GitLab internal API.
    # The following two values must be the same as their respective values
    # of the Gitaly setup
    gitlab_rails['gitaly_token'] = 'gitalyecret'
    gitlab_shell['secret_token'] = 'shellsecret'

    git_data_dirs({
      'default' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
      'storage1' => { 'gitaly_address' => 'tcp://gitaly1.internal:8075' },
      'storage2' => { 'gitaly_address' => 'tcp://gitaly2.internal:8075' },
    })

    ## Disable components that will not be on the GitLab application server
    roles ['application_role']
    gitaly['enable'] = false
    nginx['enable'] = true

    ## PostgreSQL connection details
    gitlab_rails['db_adapter'] = 'postgresql'
    gitlab_rails['db_encoding'] = 'unicode'
    gitlab_rails['db_host'] = '10.1.0.5' # IP/hostname of database server
    gitlab_rails['db_password'] = 'DB password'

    ## Redis connection details
    gitlab_rails['redis_port'] = '6379'
    gitlab_rails['redis_host'] = '10.1.0.6' # IP/hostname of Redis server
    gitlab_rails['redis_password'] = 'Redis Password'

    # Set the network addresses that the exporters used for monitoring will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100'
    gitlab_workhorse['prometheus_listen_addr'] = '0.0.0.0:9229'
    sidekiq['listen_address'] = "0.0.0.0"
    puma['listen'] = '0.0.0.0'

    # Add the monitoring node's IP address to the monitoring whitelist and allow it to
    # scrape the NGINX metrics. Replace placeholder `monitoring.gitlab.example.com` with
    # the address and/or subnets gathered from the monitoring node
    gitlab_rails['monitoring_whitelist'] = ['<MONITOR NODE IP>/32', '127.0.0.0/8']
    nginx['status']['options']['allow'] = ['<MONITOR NODE IP>/32', '127.0.0.0/8']

    ## Uncomment and edit the following options if you have set up NFS
    ##
    ## Prevent GitLab from starting if NFS data mounts are not available
    ##
    #high_availability['mountpoint'] = '/var/opt/gitlab/git-data'
    ##
    ## Ensure UIDs and GIDs match between servers for permissions via NFS
    ##
    #user['uid'] = 9000
    #user['gid'] = 9000
    #web_server['uid'] = 9001
    #web_server['gid'] = 9001
    #registry['uid'] = 9002
    #registry['gid'] = 9002 
    ```

4.  如果您正在使用[具有 TLS 支持](#gitaly-tls-support)`git_data_dirs` ,请确保`git_data_dirs`条目配置了`tls`而不是`tcp`

    ```
    git_data_dirs({
      'default' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage1' => { 'gitaly_address' => 'tls://gitaly1.internal:9999' },
      'storage2' => { 'gitaly_address' => 'tls://gitaly2.internal:9999' },
    }) 
    ```

    1.  将证书复制到`/etc/gitlab/trusted-certs` :

        ```
        sudo cp cert.pem /etc/gitlab/trusted-certs/ 
        ```

5.  保存文件并[重新配置 GitLab](../restart_gitlab.html#omnibus-gitlab-reconfigure) .
6.  运行`sudo gitlab-rake gitlab:gitaly:check`确认节点可以连接到 Gitaly.
7.  拖尾日志以查看请求:

    ```
    sudo gitlab-ctl tail gitaly 
    ```

**注意:**如上例所示,当在`external_url`指定`https`时,GitLab 会假定您在`/etc/gitlab/ssl/`具有 SSL 证书. 如果没有证书,NGINX 将无法启动. 有关更多信息,请参见[NGINX 文档](https://docs.gitlab.com/omnibus/settings/nginx.html) .[Back to setup components](#setup-components)

## Configure Prometheus[](#configure-prometheus "Permalink")

The Omnibus GitLab package can be used to configure a standalone Monitoring node running [Prometheus](../monitoring/prometheus/index.html) and [Grafana](../monitoring/performance/grafana_configuration.html):

1.  SSH 进入"监视"节点.
2.  从 GitLab 下载页面使用**步骤 1 和 2** [下载/安装](https://about.gitlab.com/install/)所需的 Omnibus GitLab 软件包. 不要完成下载页面上的任何其他步骤.
3.  编辑`/etc/gitlab/gitlab.rb`并添加内容:

    ```
    external_url 'http://gitlab.example.com'

    # Enable Prometheus
    prometheus['enable'] = true
    prometheus['listen_address'] = '0.0.0.0:9090'
    prometheus['monitor_kubernetes'] = false

    # Enable Login form
    grafana['disable_login_form'] = false

    # Enable Grafana
    grafana['enable'] = true
    grafana['admin_password'] = 'toomanysecrets'

    # Disable all other services
    gitlab_rails['auto_migrate'] = false
    alertmanager['enable'] = false
    gitaly['enable'] = false
    gitlab_exporter['enable'] = false
    gitlab_workhorse['enable'] = false
    nginx['enable'] = true
    postgres_exporter['enable'] = false
    postgresql['enable'] = false
    redis['enable'] = false
    redis_exporter['enable'] = false
    sidekiq['enable'] = false
    puma['enable'] = false
    unicorn['enable'] = false
    node_exporter['enable'] = false
    gitlab_exporter['enable'] = false 
    ```

4.  Prometheus 还需要一些抓取配置,以从我们配置了导出器的各个节点中提取所有数据. 假设您节点的 IP 为:

    ```
    1.1.1.1: postgres
    1.1.1.2: redis
    1.1.1.3: gitaly1
    1.1.1.4: rails1
    1.1.1.5: rails2 
    ```

    将以下内容添加到`/etc/gitlab/gitlab.rb` :

    ```
    prometheus['scrape_configs'] = [
      {
         'job_name': 'postgres',
         'static_configs' => [
         'targets' => ['1.1.1.1:9187'],
         ],
      },
      {
         'job_name': 'redis',
         'static_configs' => [
         'targets' => ['1.1.1.2:9121'],
         ],
      },
      {
         'job_name': 'gitaly',
         'static_configs' => [
         'targets' => ['1.1.1.3:9236'],
         ],
      },
      {
         'job_name': 'gitlab-nginx',
         'static_configs' => [
         'targets' => ['1.1.1.4:8060', '1.1.1.5:8060'],
         ],
      },
      {
         'job_name': 'gitlab-workhorse',
         'static_configs' => [
         'targets' => ['1.1.1.4:9229', '1.1.1.5:9229'],
         ],
      },
      {
         'job_name': 'gitlab-rails',
         'metrics_path': '/-/metrics',
         'static_configs' => [
         'targets' => ['1.1.1.4:8080', '1.1.1.5:8080'],
         ],
      },
      {
         'job_name': 'gitlab-sidekiq',
         'static_configs' => [
         'targets' => ['1.1.1.4:8082', '1.1.1.5:8082'],
         ],
      },
      {
         'job_name': 'node',
         'static_configs' => [
         'targets' => ['1.1.1.1:9100', '1.1.1.2:9100', '1.1.1.3:9100', '1.1.1.4:9100', '1.1.1.5:9100'],
         ],
      },
    ] 
    ```

5.  保存文件并[重新配置 GitLab](../restart_gitlab.html#omnibus-gitlab-reconfigure) .
6.  在 GitLab 用户界面中,将`admin/application_settings/metrics_and_profiling` >指标-Grafana 设置为`/-/grafana``http[s]://<MONITOR NODE>/-/grafana`

[Back to setup components](#setup-components)

## Configure the object storage[](#configure-the-object-storage "Permalink")

GitLab 支持使用对象存储服务来保存多种类型的数据,建议在[NFS 上使用](#configure-nfs-optional) . 通常,对象存储服务更适合较大的环境,因为对象存储通常具有更高的性能,可靠性和可伸缩性.

GitLab 已测试或了解客户使用的对象存储选项包括:

*   SaaS / Cloud 解决方案(例如[Amazon S3](https://aws.amazon.com/s3/)[Google Cloud Storage](https://cloud.google.com/storage) ).
*   来自各种存储供应商的本地硬件和设备.
*   MinIO( [部署指南](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) ).

要将 GitLab 配置为使用对象存储,请根据要使用的功能参考以下指南:

1.  [Object storage for backups](../../raketasks/backup_restore.html#uploading-backups-to-a-remote-cloud-storage).
2.  [Object storage for job artifacts](../job_artifacts.html#using-object-storage) including [incremental logging](../job_logs.html#new-incremental-logging-architecture).
3.  [Object storage for LFS objects](../lfs/index.html#storing-lfs-objects-in-remote-object-storage).
4.  [Object storage for uploads](../uploads.html#using-object-storage-core-only).
5.  [Object storage for merge request diffs](../merge_request_diffs.html#using-object-storage).
6.  [容器注册表的对象存储](../packages/container_registry.html#use-object-storage) (可选功能).
7.  [Mattermost 的对象存储](https://docs.mattermost.com/administration/config-settings.html#file-storage) (可选功能).
8.  [包的对象存储](../packages/index.html#using-object-storage) (可选功能).
9.  [依赖代理的对象存储](../packages/dependency_proxy.html#using-object-storage) (可选功能).
10.  [Pseudonymizer 的对象存储](../pseudonymizer.html#configuration) (可选功能).
11.  [用于自动缩放 Runner 缓存的对象存储](https://docs.gitlab.com/runner/configuration/autoscale.html) (可选,以提高性能).
12.  [Object storage for Terraform state files](../terraform_state.html#using-object-storage-core-only).

对于 GitLab,建议为每种数据类型使用单独的存储桶.

我们的配置的局限性是对象存储的每次使用都是单独配置的. 我们有一个[问题](https://gitlab.com/gitlab-org/gitlab/-/issues/23345)需要改进,那就是允许一个存储桶具有单独的文件夹.

在通过 Helm 图表部署 GitLab 时使用单个存储桶会导致从备份还原[无法正常运行](https://docs.gitlab.com/charts/advanced/external-object-storage/) . 尽管您可能暂时不使用 Helm 部署,但是如果稍后将 GitLab 迁移到 Helm 部署,GitLab 仍然可以工作,但是您可能不会意识到备份无法正常工作,直到遇到对备份起作用的关键要求.

[Back to setup components](#setup-components)

## Configure NFS (optional)[](#configure-nfs-optional "Permalink")

为了提高性能,建议尽可能使用[对象存储](#configure-the-object-storage)以及[Gitaly](#configure-gitaly) ,而不是使用 NFS. 但是,如果您打算使用 GitLab 页面,则[必须使用 NFS](troubleshooting.html#gitlab-pages-requires-nfs) .

有关配置 NFS 的信息,请参阅[NFS 文档页面](../high_availability/nfs.html) .

[Back to setup components](#setup-components)

## Troubleshooting[](#troubleshooting "Permalink")

请参阅[故障排除文档](troubleshooting.html) .

[Back to setup components](#setup-components)