在 centOS 上搭建 GitLab 远程仓库(使用独立 Nginx)
GitLab是一个用于仓库管理系统的开源项目,实现一个自托管的Git项目仓库,可通过 Web 界面进行访问公开的或者私有的项目。GitLab 由乌克兰程序员 DmitriyZaporozhets 和 ValerySizov 开发,它由 Ruby 语言写成。后来,部分代码用 Go 语言重写,现今在国内外大中型互联网公司广泛使用。GitLab 拥有与 Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
git、gitlab、GitHub 的区别如下:
- git 是一种基于命令的版本控制系统,全命令操作,没有可视化界面。
- gitlab 是一个基于 git 实现的在线代码仓库软件,提供 web 可视化管理界面,通常用于企业团队内部协作开发。
- github 是一个基于 git 实现的在线代码托管仓库,亦提供可视化管理界面,同时提供免费账户和付费账户,提供开放和私有的仓库,大部分的开源项目都选择 github 作为代码托管仓库。
GitLab 有三个不同的版本可用:
- Community Edition(CE):开源免费的社区版,gitlab-ce。
- Enterprise Edition(EE):收费企业版,gitlab-ee。
- GitLab 托管版本:gitlab-runner。
- 镜像:清华大学开源软件镜像站
- 社区:gitlab-ce
安装 GitLab
安装 gitlab 必须具备 SSH 功能,还需要在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。
# 查看当前防火墙是否在运行firewall-cmd --state # 查看所有打开的端口。SSH 默认端口:22/tcp、HTTP 默认端口:80/tcp、HTTPS 默认端口:443/tcpfirewall-cmd --zone=public --list-ports # 查看开机服务项自启动systemctl list-unit-files | grep enabled
安装 Postfix 以发送电子邮件通知。如果您想使用其他解决方案发送电子邮件,请跳过此步骤。
dnf -y install postfixsystemctl enable postfixsystemctl start postfix
下载 centOS 8 版本:gitlab-ce-15.7.0-ce.0.el8.x86_64.rpm,GitLal 自带有简体中文,安装成功后,登录设置以下语言即可。
cd /tmpwget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.7.0-ce.0.el8.x86_64.rpm/download.rpmrpm -ivh gitlab-ce-15.7.0-ce.0.el8.x86_64.rpm
GitLab 默认使用 HTTP 协议,80 端口。文件位置:
- 程序文件:/opt/gitlab
- 配置文件:/etc/gitlab/gitlab.rb
- 日志文件:/var/log/gitlab
配置 GitLab
默认情况下,GitLab 使用自带的 Nginx,占用 80 端口。若另外安装有 Nginx 服务器,那么两者同时启动,会造成冲突,导致其中一个 nginx 无法启动。解决方案:
- 方案一:修改 GitLab 端口解决冲突。
- 方案二:禁用 gitlab 自带 Nginx,使用外部 Nginx 与 UNIX 套接字连接。
GitLab 利用 Nginx 将前端的 http/https 请求代理至 gitlab-workhorse,gitlab-workhorse 再将请求转发至 Unicorn Web 服务器。默认情况下 gitlab-workhorse 与前端之间的通信是使用 unix domain socket 进行的,但也支持 TCP 转发请求;GitLab 使用 Unicorn Web 服务器提供动态网页和 API 接口。
GitLab 的智能反向代理服务器,用于处理负载量较大的 HTTP 请求,诸如文件上传/下载、Git push/pull 以及 Git 归档下载等。
mkdir -p /usr/wwwgit/gitlab/datamkdir -p /usr/wwwgit/gitlab/upload
cd /etc/gitlab # 备份配置文件cp /etc/gitlab/gitlab.rb /etc/gitlab/gitlab.rb.bakvim /etc/gitlab/gitlab.rb
# 访问域名 external_url 'https://gitlab.example.com' 禁用自带 nginx nginx['enable'] = false # 修改成与 nginx 运行时的用户一致 web_server['external_users'] = ['www'] # gitlab 数据存放位置,默认是 /mnt/nfs-01/git-data git_data_dirs({ "default" => { "path" => "/usr/wwwgit/gitlab/data" } }) # gitlab 附件上传位置,默认是 /var/opt/gitlab/gitlab-rails/uploads gitlab_rails['uploads_directory'] = "/usr/wwwgit/gitlab/upload" # 设置时区,默认 UTC gitlab_rails['time_zone'] = 'Asia/Shanghai'
解决 GitLab 内存消耗大的问题:
官网建议,安装 gitlab 最小的机器配置就是 2 核 4G 内存。官方建议是 CPU 核心数+ 1,可以提高服务器的响应速度。另外,这个参数最小值是 2,设为 1 服务器可能会卡死。gitlab 配置文件/etc/gitlab/gitlab.rb里,进程数
puma['worker_processes']= 2
(旧版设置项是unicorn['worker_processes']= 2
),他们默认是被注释掉的,然后按着被安装服务器的内核数来开启进程数,假设 cpu 有 30 核会开启 30 个进程。每个进程需要 500MB 内存占用内存,那么它们将需要 30 * 500MB = 15GB 内存。所以需要减少 gitlab 进程数。
物理服务器为 4 核 8G 内存,进行调优:
# 开启 puma['enable'] = true # 减少超时时间 puma['worker_timeout'] = 30 # GitLab 进程数 puma['worker_processes'] = 2 # GitLab 最大线程数数 puma['max_threads'] = 4 # 将 worker 进程占用最大内存 puma['per_worker_max_memory_mb'] = 64 # sidekiq 并发数,最大并发默认值20 sidekiq['max_concurrency'] = 8 # 减少数据库缓存,默认为 256MB postgresql['shared_buffers'] = "64MB" # 减少数据库并发数,默认为 8 postgresql['max_worker_processes'] = 4
# 使配置生效gitlab-ctl reconfiguregitlab-ctl restart
# 查看内容占用free -hfree -m # 查看占用内存最高的进程ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head # 或者 top (然后按大写 P)top
gitlab 命令:
# 查看启动状态gitlab-ctl status # 启动gitlab-ctl start # 停止gitlab-ctl stop # 重启gitlab-ctl restart
安装初始化后,默认账户名是 root,密码存放在配置文件。首次执行gitlab-ctl reconfigure
,24小时后自动删除:
cat /etc/gitlab/initial_root_password
将 Password 内容复制去登录界面即可。
配置 Nginx
# 编辑 ngixn 配置文件vim /usr/local/nginx/conf/nginx.conf
upstream gitlab-workhorse { server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket fail_timeout=0; } server { listen 80; server_name example.com; rewrite ^(.*)$ https://gitlab.example.com$1 permanent; } server { listen 80; server_name gitlab.example.com; rewrite ^(.*)$ https://gitlab.example.com$1 permanent; } server { listen 443 ssl; server_name gitlab.example.com; server_tokens off; root /opt/gitlab/embedded/service/gitlab-rails/public; charset utf-8; add_header X-Frame-Options "SAMEORIGIN"; add_header X-XSS-Protection "1; mode=block"; add_header X-Content-Type-Options "nosniff"; ssl_certificate "/usr/local/nginx/cert/gitlab.example.com_bundle.crt"; ssl_certificate_key "/usr/local/nginx/cert/gitlab.example.com.key"; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; access_log /var/log/nginx/gitlab_access.log; error_log /var/log/nginx/gitlab_error.log; location / { client_max_body_size 0; gzip off; proxy_read_timeout 300; proxy_connect_timeout 300; proxy_redirect off; proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Ssl on; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://gitlab-workhorse; } }
配置完毕 Nginx 服务器后,重启
nginx -tsystemctl restart nginx
GitLab 显示中文
登录自己的 GitLab,比如网址是:https://gitlab.example.com
查看密码cat /etc/gitlab/initial_root_password
复制,用root账号登录,黏贴密码,即可登录。首次登录默认是英文版本。
登录后----setting----preferences----language---简体中文。最后刷新网页即可。
设置新的密码
设置新密码后,刷新网页,密码会生效,退出登录,然后用新密码登录即可。
GitLab 成员权限
角色 | 权限 |
---|---|
Private | 只有组成员才能看到 |
Internal | 只要登录的用户就能看到 |
Public | 所有人都能看到 |
说明:开源项目和组设置的是 Internal,一般工作中,我们用的最多的还是 Private。
用户角色 | 权限 |
---|---|
Guest | 可以创建新问题(issue)、发表评论、能够在项目墙上写内容,不能读写版本库 |
Reporter | 可以克隆代码,不能提交。QA、PM 可以赋予这个权限 |
Developer | 可以克隆代码、开发、提交、push。RD 可以赋予这个权限 |
Maintainers | 可以创建项目、添加tag、保护分支、添加项目成员、编辑项目。核心 RD 负责人可以赋予这个权限 |
Owner | 可以设置项目访问权限- Visibility Level、删除项目、迁移项目、管理组成员。开发组 leader 可以赋予这个权限 |
编号 | Guest | Reporter | Developer | Master |
---|---|---|---|---|
1 | 创建新问题 | 创建新问题 | 创建新问题 | 创建新问题 |
2 | 可发表评论 | 可发表评论 | 可发表评论 | 可发表评论 |
3 | 能够在项目墙上写内容 | 能够在项目墙上写内容 | 能够在项目墙上写内容 | 能够在项目墙上写内容 |
4 | — | 能够拉取项目代码 | 能够拉取项目代码 | 能够拉取项目代码 |
5 | — | 可下载项目 | 可下载项目 | 可下载项目 |
6 | — | 能够编写代码片段 | 能够编写代码片段 | 能够编写代码片段 |
7 | — | — | 创建新的合并请求 | 创建新的合并请求 |
8 | — | — | 创建新的分支 | 创建新的分支 |
9 | — | — | 推送并移除不受保护的分支 | 推送并移除不受保护的分支 |
10 | — | — | 包含标签 | 包含标签 |
11 | — | — | 可创建,编辑,删除项目里程碑 | 可以创建,编辑,删除项目里程碑 |
12 | — | — | 可创建或更新提交状态 | 可创建或更新提交状态 |
13 | — | — | 写一个维基 | 写一个维基 |
14 | — | — | 创建新的环境 | 创建新的环境 |
15 | — | — | 取消并重试作业 | 取消并重试作业 |
16 | — | — | 更新并删除注册表映像 | 更新并删除注册表映像 |
17 | — | — | — | 可添加新的团队成员 |
18 | — | — | — | 推动并移除受保护的分支 |
19 | — | — | — | 可编辑项目 |
20 | — | — | — | 可以管理runner,runner触发器和变量 |
21 | — | — | — | 将部署密钥添加到项目 |
22 | — | — | — | 能够管理群集 |
23 | — | — | — | 配置项目钩件 |
24 | — | — | — | 可以启用/禁用分支保护 |
25 | — | — | — | 能够重写或删除Git标签 |
完全卸载 Postfix
# 查看 postfix 是否 enable:systemctl list-unit-files | grep postfix # 查看 postfix 进程的侦听端口:netstat -tulp # 关闭 postfix 服务:systemctl stop postfix # 在CentOS中彻底删除 postfix 相关文件:dnf remove postfix -y
删除 Postfix 创建的用户以及用户组。postdrop 是用来实现 MDA 投递邮件的用户
userdel postfixgroupdel postfixuserdel postdropgroupdel postdrop
# 查看用户列表文件:cat /etc/passwd # 用户组列表文件:cat /etc/group
完全卸载 GitLab
第一步:停止 GitLab
gitlab-ctl stop
第二步:卸载 gitlab-ce
# 参数 -e 是卸载 --nodeps 是忽略依赖rpm -e --nodeps gitlab-ce
第三步:查看 GitLab 进程,杀掉 gitlab service 进程,该进程与 runsvdir 相关
ps -ef | grep gitlab # 显示如下: root 1516 1 0 18:48 ? 00:00:00 runsvdir -P /opt/gitlab/service log: ................ root 1519 1516 0 18:48 ? 00:00:00 runsv gitlab-exporter root 1522 1516 0 18:48 ? 00:00:00 runsv gitlab-workhorse root 1528 1516 0 18:48 ? 00:00:00 runsv gitlab-kas ................... # 杀掉第一个守护进程(runsvdir -P /opt/gitlab/service log):kill -9 1516 # 再次查看 gitlab 进程是否存在ps -ef | grep gitlab
第四步:删除 GitLab 文件。
# 删除所有包含 gitlab 的文件及目录find / -name *gitlab* | xargs rm -rffind / -name gitlab | xargs rm -rf
gitlab-ctl uninstall
时自动在 root 下备份的配置文件,若有也删除。
# 查看,若有也删除ls -l /root/gitlab*
查看所有包含 GitLab 的遗留文件,若有也删除。
find / -name gitlab
查看哪些为开机启动服务
systemctl list-unit-files | grep enable
第五步:删除 GitLab 创建的用户以及用户组。
userdel gituserdel gitlab-wwwuserdel gitlab-redisuserdel gitlab-psqluserdel gitlab-prometheusgroupdel gitgroupdel gitlab-wwwgroupdel gitlab-redisgroupdel gitlab-psqlgroupdel gitlab-prometheus
# 查看用户列表文件:cat /etc/passwd # 用户组列表文件:cat /etc/group