0、前言
首先劝退建议大家,能使用更轻量的替代品尽量使用,例如:Gitea、CodeFever 等,特别是对于英语不是特别好的人,选择 CodeFever 这种国产开源软件,从使用、Bug 反馈、社区交流都能获得不错的体验(毕竟没有语言障碍)。搭建教程参考:
Docker建站(十四)CodeFever:专属于自己的代码托管平台
https://blog.tsinbei.com/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,使用默认配置,将看到如下进程树:
1 | 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
:
1 | 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、启动和调试
配置完成后,在目录下执行:
1 | docker-compose up -d |
如果作了更改,可以在容器中执行:
1 | gitlab-ctl reconfigure gitlab-ctl restart |
或者在目录下执行:
1 | docker-compose down docker-compose up -d |
启动后,在./config/initial_root_password
中查看初始密码:
1 | # 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。
执行:
1 | docker cp gitlab:/opt/gitlab/embedded/service/gitlab-rails/lib/sidebars/projects/menus menus |
找到需要修改的菜单,例如menus/monitor_menu.rb
,找到其中不需要的菜单项目:
1 | # 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
:
1 | # 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
,将修改后的文件映射到容器中:
1 | ... 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 进程树如下:
1 | 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
:
1 | 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 存储库
评论