• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 在 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

    安装 gitlab 必须具备 SSH 功能,还需要在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。

    # 查看当前防火墙是否在运行
    firewall-cmd --state
    
    # 查看所有打开的端口。SSH 默认端口:22/tcp、HTTP 默认端口:80/tcp、HTTPS 默认端口:443/tcp
    firewall-cmd --zone=public --list-ports
    
    # 查看开机服务项自启动
    systemctl list-unit-files | grep  enabled
    


    安装 Postfix 以发送电子邮件通知。如果您想使用其他解决方案发送电子邮件,请跳过此步骤。

    dnf -y install postfix
    systemctl enable postfix
    systemctl start postfix
    


    下载 centOS 8 版本:gitlab-ce-15.7.0-ce.0.el8.x86_64.rpm,GitLal 自带有简体中文,安装成功后,登录设置以下语言即可。

    cd /tmp
    wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.7.0-ce.0.el8.x86_64.rpm/download.rpm
    rpm -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/data
    mkdir -p  /usr/wwwgit/gitlab/upload
    
    cd /etc/gitlab
    
    # 备份配置文件
    cp /etc/gitlab/gitlab.rb   /etc/gitlab/gitlab.rb.bak
    vim /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 reconfigure
    gitlab-ctl restart
    
    # 查看内容占用
    free -h
    free -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 -t
    systemctl restart nginx
    


    GitLab 显示中文

    登录自己的 GitLab,比如网址是:https://gitlab.example.com

    查看密码cat /etc/gitlab/initial_root_password复制,用root账号登录,黏贴密码,即可登录。首次登录默认是英文版本。

    登录后----setting----preferences----language---简体中文。最后刷新网页即可。


    设置新的密码


    设置新密码后,刷新网页,密码会生效,退出登录,然后用新密码登录即可。


    GitLab 成员权限

    Gitlab中的组和项目有三种访问权限
    角色权限
    Private只有组成员才能看到
    Internal只要登录的用户就能看到
    Public所有人都能看到

    说明:开源项目和组设置的是 Internal,一般工作中,我们用的最多的还是 Private。

    Gitlab用户在组中有五种权限
    用户角色权限
    Guest可以创建新问题(issue)、发表评论、能够在项目墙上写内容,不能读写版本库
    Reporter可以克隆代码,不能提交。QA、PM 可以赋予这个权限
    Developer可以克隆代码、开发、提交、push。RD 可以赋予这个权限
    Maintainers可以创建项目、添加tag、保护分支、添加项目成员、编辑项目。核心 RD 负责人可以赋予这个权限
    Owner可以设置项目访问权限- Visibility Level、删除项目、迁移项目、管理组成员。开发组 leader 可以赋予这个权限


    用户的可用权限级别
    编号GuestReporterDeveloperMaster
    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 postfix
    groupdel postfix
    
    userdel postdrop
    groupdel 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 -rf      
    find / -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 git
    userdel gitlab-www
    userdel gitlab-redis
    userdel gitlab-psql
    userdel gitlab-prometheus
    
    groupdel git
    groupdel gitlab-www
    groupdel gitlab-redis
    groupdel gitlab-psql
    groupdel gitlab-prometheus
    
    # 查看用户列表文件:
    cat /etc/passwd
    
    # 用户组列表文件:
    cat /etc/group