Docker建站(二十)GitLab:自托管 Git 存储库

GitLab

0、前言

首先劝退建议大家,能使用更轻量的替代品尽量使用,例如:Gitea、CodeFever 等,特别是对于英语不是特别好的人,选择 CodeFever 这种国产开源软件,从使用、Bug 反馈、社区交流都能获得不错的体验(毕竟没有语言障碍)。搭建教程参考:

Docker建站(十四)CodeFever:专属于自己的代码托管平台
https://blog.tsinbei.com/tw/archives/832/

劝退的原因主要是:性能限制。来看看 GitLab 的配置要求:

  • CPU:2 核
  • RAM:4 GB
  • 硬盘:25 GB

事实上,这个配置只是最低要求,也就是说满足这个配置只能运行空的 GitLab,一旦你需要在上面托管资源,GitLab将消耗更多算力。目前,我运行 GitLab 的服务器配置为4核8G,在调优后 GitLab 空载情况下恰好占用约 3GB 内存。

如果你和我一样被 GitLab 丰富的功能(其实主要是好看的 UI)吸引,并且准备好了充足的算力,那么就开始自建 GitLab 吧!

1、介绍

GitLab 有在线版本,而在线版类似 GitHub,我们需要自建的其实是 Gitlab CE(社区版),方便起见本文把 GitLab CE 简称 GitLab。

GitLab CE 是 GitLab 开源的版本,它提供了基本的代码管理和协作功能,包括 Git 仓库管理、问题跟踪、Wiki、持续集成等功能。
而 GitLab EE 是商业版,它在 GitLab CE 的基础上增加了许多高级功能,如项目分析、LDAP/AD 集成、高可用性、审计日志、容器注册表等。

对于个人用户或者小团队只需要使用 GitLab CE 即可。

2、安装

其实对于个人或者超小型团队(比如说清北科技)而言,GitLab CE 的部分功能都有些冗余,而这些不需要的功能消耗了大量性能。

如果直接启动 GitLab,使用默认配置,将看到如下进程树:

Text
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
wrapper─┬─gitaly─┬─2*
        │        └─15*[{gitaly}]
        ├─gitlab-ctl───omnibus-ctl───sh───xargs───tail
        └─runsvdir─┬─runsv─┬─sshd
                   │       └─svlogd
                   ├─runsv─┬─gitlab-logrotat───sleep
                   │       └─svlogd
                   ├─runsv─┬─redis-server───4*[{redis-server}]
                   │       └─svlogd
                   ├─runsv─┬─gitaly-wrapper───8*[{gitaly-wrapper}]
                   │       └─svlogd
                   ├─runsv─┬─postgres───17*[postgres]
                   │       └─svlogd
                   ├─runsv─┬─bundle─┬─2*[bundle───14*[{bundle}]]
                   │       │        ├─4*[bundle───13*[{bundle}]]
                   │       │        └─4*[{bundle}]
                   │       └─svlogd
                   ├─runsv─┬─ruby─┬─bundle───72*[{bundle}]
                   │       │      └─{ruby}
                   │       └─svlogd
                   ├─runsv─┬─gitlab-workhors───11*[{gitlab-workhors}]
                   │       └─svlogd
                   ├─runsv─┬─nginx───9*[nginx]
                   │       └─svlogd
                   ├─runsv─┬─gitlab-exporter───4*[{gitlab-exporter}]
                   │       └─svlogd
                   ├─runsv─┬─redis_exporter───10*[{redis_exporter}]
                   │       └─svlogd
                   ├─runsv─┬─prometheus───12*[{prometheus}]
                   │       └─svlogd
                   ├─runsv─┬─alertmanager───10*[{alertmanager}]
                   │       └─svlogd
                   ├─runsv─┬─postgres_export───9*[{postgres_export}]
                   │       └─svlogd
                   └─runsv─┬─grafana-server───12*[{grafana-server}]
                           └─svlogd

可以通过关闭相关功能减少进程数量。

本文将参考:

GitLab 14 轻量化运行方案
https://soulteary.com/2021/07/14/gitlab-14-lightweight-operation-solution.html

搭建轻量化的 GitLab 14,并且配置邮件系统。

使用 Docker Compose 部署,假设目录是/www/wwwroot/gitlab,先创建docker-compose.yml

yml
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
version: "3"


services:
  gitlab:
    restart: always
    image: gitlab/gitlab-ce:14.0.5-ce.0
    container_name: GitLab
    hostname: gitlab.example.com
    ports:
      - "8080:80"
      - "8222:22"
    volumes:
      - /www/wwwroot/gitlab/config:/etc/gitlab
      - /www/wwwroot/gitlab/data:/var/opt/gitlab
    environment:
      TZ: Asia/Shanghai
      GITLAB_OMNIBUS_CONFIG: |
        # 这里可以填 HTTPS 的网址,但是要配置证书
        # 我的方案:是使用 HTTP,然后使用 Nginx 反向代理并配置证书
        # 最后在 Nginx 反向代理中添加文本替换和重定向替换即可完美配置 HTTPS
        external_url 'http://gitlab.example.com'
        gitlab_rails['time_zone'] = 'Asia/Shanghai'

        # 邮件功能
        # 如果不需要可以使用如下配置关闭
        # gitlab_rails['smtp_enable'] = false
        # gitlab_rails['gitlab_email_enabled'] = false
        # gitlab_rails['incoming_email_enabled'] = false
        # 如果需要可以参考如下配置
        gitlab_rails['smtp_enable'] = true
        gitlab_rails['smtp_address'] = "smtp.example.com"
        gitlab_rails['smtp_port'] = 465
        gitlab_rails['smtp_user_name'] = "[email protected]"
        gitlab_rails['smtp_password'] = "ExamplePassword"
        # 注意:如果开启了 SSL,这个域名要和邮件服务器配置的 SSL 证书相匹配
        gitlab_rails['smtp_domain'] = "mail.example.com"
        gitlab_rails['smtp_authentication'] = "login"
        gitlab_rails['smtp_enable_starttls_auto'] = true
        # 如果忽略 SSL 证书错误可以使用如下配置
        # gitlab_rails['smtp_openssl_verify_mode'] = 'none'
        # 否则使用
        gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
        gitlab_rails['smtp_tls'] = true
        # 自定义邮件发件人、回件地址
        gitlab_rails['gitlab_email_from'] = '[email protected]'
        gitlab_rails['gitlab_email_reply_to'] = '[email protected]'

        # 以下功能大部分都不太需要
        # 如果需要,改成 true 或者删除对应行即可
        # Terraform
        gitlab_rails['terraform_state_enabled'] = false

        # Usage Statistics
        gitlab_rails['usage_ping_enabled'] = false
        gitlab_rails['sentry_enabled'] = false
        grafana['reporting_enabled'] = false

        # 关闭容器仓库功能
        gitlab_rails['gitlab_default_projects_features_container_registry'] = false
        gitlab_rails['registry_enabled'] = false
        registry['enable'] = false
        registry_nginx['enable'] = false

        # 包仓库
        gitlab_rails['packages_enabled'] = false
        gitlab_rails['dependency_proxy_enabled'] = false

        # GitLab KAS
        gitlab_kas['enable'] = false
        gitlab_rails['gitlab_kas_enabled'] = false

        # Mattermost
        mattermost['enable'] = false
        mattermost_nginx['enable'] = false

        # Kerberos
        gitlab_rails['kerberos_enabled'] = false
        sentinel['enable'] = false

        # GitLab Pages
        gitlab_pages['enable'] = false
        pages_nginx['enable'] = false

        # 禁用 PUMA 集群模式
        puma['worker_processes'] = 0
        puma['min_threads'] = 1
        puma['max_threads'] = 2

        # 降低后台守护进程并发数
        sidekiq['max_concurrency'] = 5

        gitlab_ci['gitlab_ci_all_broken_builds'] = false
        gitlab_ci['gitlab_ci_add_pusher'] = false

        # 关闭监控
        prometheus_monitoring['enable'] = false
        alertmanager['enable'] = false
        node_exporter['enable'] = false
        redis_exporter['enable'] = false
        postgres_exporter['enable'] = false
        pgbouncer_exporter['enable'] = false
        gitlab_exporter['enable'] = false
        grafana['enable'] = false
        sidekiq['metrics_enabled'] = false        

其中8080是 HTTP 端口,8222是 SSH 端口。如果不需要可以不映射 SSH 端口。

3、启动和调试

配置完成后,在目录下执行:

Bash
1
docker-compose up -d

如果作了更改,可以在容器中执行:

Bash
1
2
gitlab-ctl reconfigure
gitlab-ctl restart

或者在目录下执行:

Bash
1
2
docker-compose down
docker-compose up -d

启动后,在./config/initial_root_password中查看初始密码:

Text
1
2
3
4
5
6
7
8
9
# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.

Password: XmLJuRYrf************hU6PkSe7b

# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.

之后可以使用 Nginx 反向代理,然后自行使用账号root和该密码登录 GitLab 并配置。

4、隐藏菜单项目

如果有不需要的项目,可以自行编辑菜单文件并按照上述方法重新启动 GitLab。

执行:

Bash
1
docker cp gitlab:/opt/gitlab/embedded/service/gitlab-rails/lib/sidebars/projects/menus menus

找到需要修改的菜单,例如menus/monitor_menu.rb,找到其中不需要的菜单项目:

ruby
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
# frozen_string_literal: true

module Sidebars
  module Projects
    module Menus
      class MonitorMenu < ::Sidebars::Menu
        override :configure_menu_items
        def configure_menu_items
          return false unless context.project.feature_available?(:operations, context.current_user)

          add_item(metrics_dashboard_menu_item)
          add_item(logs_menu_item)
          add_item(tracing_menu_item)
          add_item(error_tracking_menu_item)
          add_item(alert_management_menu_item)
          add_item(incidents_menu_item)
          add_item(serverless_menu_item)
          add_item(terraform_menu_item)
          add_item(kubernetes_menu_item)
          add_item(environments_menu_item)
          add_item(feature_flags_menu_item)
          add_item(product_analytics_menu_item)

          true
        end

...

修改为false

ruby
1
2
3
4
5
6
7
8
9
10
11
12
# frozen_string_literal: true

module Sidebars
  module Projects
    module Menus
      class MonitorMenu < ::Sidebars::Menu
        override :configure_menu_items
        def configure_menu_items
          false
        end

...

然后修改docker-compose.yml,将修改后的文件映射到容器中:

yml
1
2
3
4
5
6
...
    volumes:
      - /www/wwwroot/gitlab/config:/etc/gitlab
      - /www/wwwroot/gitlab/data:/var/opt/gitlab
      - /www/wwwroot/gitlab/menus:/opt/gitlab/embedded/service/gitlab-rails/lib/sidebars/projects/menus
...

或者重新封装一个容器。

5、其他方案

其实低版本 GitLab 即可满足轻量、功能齐全的需求,GitLab 8 进程树如下:

Text
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
wrapper─┬─gitlab-ctl───omnibus-ctl───sh───xargs───tail
        └─runsvdir─┬─runsv─┬─sshd
                   │       └─svlogd
                   ├─runsv─┬─postgres───8*[postgres]
                   │       └─svlogd
                   ├─runsv─┬─bundle─┬─bundle───7*[{bundle}]
                   │       │        └─3*[{bundle}]
                   │       └─svlogd
                   ├─runsv─┬─bundle───17*[{bundle}]
                   │       └─svlogd
                   ├─runsv─┬─gitlab-workhors───18*[{gitlab-workhors}]
                   │       └─svlogd
                   ├─runsv─┬─nginx───2*[nginx]
                   │       └─svlogd
                   └─runsv─┬─gitlab-logrotat───sleep
                           └─svlogd

这样就只需要使用简单版的docker-compose.yml

yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3"

services:
  gitlab:
    restart: always
    image: gitlab/gitlab-ce:8.0.0-ce.0
    container_name: GitLab
    hostname: gitlab.example.com
    ports:
      - "8080:80"
      - "8122:22"
    volumes:
      - /www/wwwroot/gitlab/config:/etc/gitlab
      - /www/wwwroot/gitlab/logs:/var/log/gitlab
      - /www/wwwroot/gitlab/data:/var/opt/gitlab

就可以启动一个 GitLab 服务了。其他配置项可参考上文自行配置。

Docker建站(二十)GitLab:自托管 Git 存储库

https://blog.tsinbei.com/tw/archives/1485/

文章作者
Hsukqi Lee
发布于

2024-02-11

修改于

2024-02-11

许可协议

CC BY-NC-ND 4.0

评论

昵称
邮箱
网址
暂无