一、需求分析
不论是开发还是运维还是管理者一般都熟悉github,github主要用于开源项目的维护,同时实现代码文本界面的管理,但是对于一般的企业而言,因商业机密代码是不能公开的,虽然github提供了私有仓库,但是还是无法满足全球的用户(因地理位置性、费用、网络传输速度等),所以即为了速度又为了保密性,公司有必要建立自己的github类似功能。这里有很多方法实现,这里我推荐Gitlab实现。Gitlab是利用 Ruby on Rails 一个开源的版本管理系统实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。
gitlab官方提供的软件包,对软件基本要求:仅支持ubuntu、debian、centos、red hat、oracle linux、scientific linux这几种linux衍生操作系统,自8.13版本开始不再支持Ruby 2.3以下版本(不含2.3);对硬件基本要求:存储:基于git的代码大小,gitlab瓶颈是磁盘的寻道,官方最低标配的CPU是2核(支持500),最好是4核(支持用户2000)或8核(支持用户5000),内存:物理内存4G以上(官方标配,支持100用户),交换分区要在2G以上。
二、简单逻辑图
这里也可以考虑不用备份。
三、详细规划
软件 | 版本 |
操作系统 | CentOS Linux release 7.2_3.10.0-327.18.2.el7.x86_64 |
Gitlab | gitlab-ce-8.9.9(开源)和ee版(收费) |
用户 | 权限 |
管理员 | all |
普通用户 | push、pull、创建分支、当前项目的代码 |
经理 | 查看所有项目代码及普通用户的权限 |
四、项目实施
1.安装gitlab
官网已经出gitlab的rpm包,可以直接安装(当然也可以采用源码包安装,不建议,太繁琐了,各种配置问题,本人忙乎了两天时间才安装完毕,结果启动后有些二级web页面打不开),如修改git存储及web的url等问题(可以修改/etc/gitlab/gitlab.rb文件),后文有对配置文件的详细描述。
官网下载(使用脚本下载源)
curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh|bash
yum install gitlab-ce -y
这里(自己搭建了yum源,使用公司自己的yum源,公司的提供gitlab-ce-8.9和gitlab-ce-8.6两种版本)
安装过程参考文档出处:http://www.xuliangwei.com/xubusi/385.html中的gitlab安装部分。
cat /etc/redhat-release
uname -r
#这里仅测试了centos7.2和7.3
#安装和配置必要的依赖关系
#打开HTTP和SSH访问
yum install curl openssh-server postfix -y
systemctl enable sshd postfix
systemctl start sshd postfix
#防火墙如果开启,则需要打开HTTP和SSH访问(如果不开启,则忽略下面两条命令)
firewall-cmd --permanent --add-service=http
systemctl reload firewalld
#安装gitlab
yum install gitlab*.rpm < == 指定版本号
#配置并启动gitlab
gitlab-ctl reconfigure
gitlab-ctl start
#如果修改gitlab的配置文件/etc/gitlab/gitlab.rb的内容,需要重新gitlab-ctlreconfigure(先停掉),再启动gitlab
2.关于gitlab的相关配置
(配置文件默认路径/etc/gitlab/gitlab.rb),官方网址的配置有详细说明,详见:
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/configuration.md
我这里介绍几点常用的配置修改:
1、gitlab的URL修改
external_url
可以是ip也可以是域名。
注意:也可以设置成相关的URL,例如:https://example.com/gitlab,但是设置成relativeURL的时候对gitlab的版本有要求,8.17版本开始之后,就不用重新编译(编译安装的),之后的需要重新执行gitlab-ctl reconfigure和gitlab-ctl restart命令。
2、git提交代码路径修改
git_data_dir
这里使用绝对路径,此路径不能是软链接。
同时也可以有多个git代码路径,如下实例:
git_data_dirs({
"default" => "/var/opt/gitlab/git-data",
"alternative" => "/mnt/nas/git-data"
})
#如果在/var/opt/gitlab/git-data下存在git仓库,想要增加或改变路径,可以进行如下操作:
gitlab-ctl stop
rsync -av /var/opt/gitlab/git-data/repositories/mnt/nas/git-data/
#这里需要注意/,repositories后面没有/,而/mnt/nas/git-data/需要跟/
gitlab-ctl upgrade #< ==主要是更新修改的配置,如果必要的话需要gitlab-ctl reconfigure.
#查看/mnt/nas/git-data/下是否有repositories.
ls /mnt/nas/git-data/
gitlab-ctl start
注意:这个目录如果是nfs或者其他方式挂载的,需要关闭如下(默认是关闭的)
manage_storage_directories['enable'] =false
挂载的仓库目录有一个问题:就是比如启动时,nginx、redis、unicorn需要在挂载之后才能启动,所以需要增加一条配置如下:
# wait for /var/opt/gitlab to be mounted
high_availability['mountpoint'] ='/var/opt/gitlab'
#在进行gitlab-ctlreconfigure,然后启动即可。
3、git用户或组的修改
gitlab-shell 登录的默认的用户是git,官网说不建议更改,会产生意向不到的后果,如果非要更改用户,则做如下操作:修改成了gitlab
## Modify default git user.
user['username'] = "gitlab"
user['group'] = "gitlab"
#用户或组可以指定uid和gid号
user['uid'] = 1234
user['gid'] = 1234
# # The shell for the git user
# user['shell'] = "/bin/sh"
##这里有一个安全问题,git的用户应当禁止bash登录,更改为/opt/gitlab/embedded/bin/git-shell (这里由于是gitlab集成的git所以文件目录是这样。),我暂时没有更改,因为还不确定是否成功,通过服务器禁止了无密码登录来保证安全。
# # The home directory for the git user
# user['home'] = "/var/opt/gitlab"
# user['git_user_name'] ="GitLab"
# user['git_user_email'] ="gitlab@#{node['fqdn']}"
注意:是否管理用户和用户组(这里默认是不管理)
manage_accounts['enable'] = false,可以考虑使用其他的工具管理。比如LDAP.
4、防止用户滥用gitlab导致gitlab损坏,
首先开启Rack Attack功能(默认是开启的),它起到保护的作用。
gitlab_rails['rack_attack_git_basic_auth']= {
'enabled' => true, # Enable/Disable Rack Attack
'ip_whitelist' => ["127.0.0.1"], # Whitelisted urls
'maxretry' => 10, # Limit the number of Git HTTP authenticationattempts per IP
'findtime' => 60, # Reset the auth attempt counter per IP after 60seconds
'bantime' => 3600 # Ban an IP for one hour (3600s) after too manyauth attempts
}
再者加入要保护的路径,加入到gitlab_rails['rack_attack_protected_paths']中。
例如:
gitlab_rails['rack_attack_protected_paths']= [
'/users/password',
'/users/sign_in',
'/api/#{API::API.version}/session.json',
'/api/#{API::API.version}/session',
'/users',
'/users/confirmation',
'/unsubscribes/',
'/import/github/personal_access_token'
]
注意:路径的问题,最好用绝对路径。
其他配置:比如LDAP、HTTPS、Redirect HTTP requests to HTTPS、Change the defaultport and the ssl certificate locations、Use non-packagedweb-server、Using a non-packaged Redis instance、Adding ENV Vars tothe GitLab Runtime Environment、Changing GitLab.yml settings、Sending applicationemail via SMTP、Omniauth (Google, Twitter, GitHub login)、Setting theNGINX listen address or addresses、Inserting custom NGINX settings into the GitLab server block、Insertingcustom settings into the NGINX config、Enable nginx_status
请详见gitlab官方网址
https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/configuration.md。
五、Gitlab组件
官网中都有分离的组件包,详见官网https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/architecture.md#physical-office-analogy
1.Nginx
作为前端提供web页面以及git工具是走http协议还是https协议。
2.Ruby on Rails
后端gitlab服务是采用Ruby on Rails框架,通过unicorn实现后台服务和进程。
3.SSHD:
开启sshd服务,用于用户上传ssh key进行版本克隆及上传。注:用户上传的ssh key是保存到git账户中
4.数据库:
目前仅支持MySQL/MariaDB和PostgreSQL,官方建议使用PostgreSQL
使用PostgreSQL必须确认GitLab使用的数据库安装了pg_trgm扩展。这个扩展需要PostgreSQL使用 root 用户在GitLab每个数据库里面执行下面的命令:
CREATE EXTENSION pg_trgm;
5.Redis:
Redis存储每个客户端的sessions和后台任务队列,任务包括新建仓库、发送邮件等等
6.Sidekiq:
Rails框架自带的,查看redis中的任务并执行,使用多线程处理后台任务。这个进程启动的时候会使用整个Rails堆栈(200MB+),但是它会在内存泄漏的情况下增加。一个用户非常活跃的服务器上(10,000个活跃用户)Sidekiq进程会占用1GB+的内存。
六、优化
1.硬件层优化:
能用ssd最好,或者使用转速高7200的,缓存高的sata盘,最好做raid10,数据库的原因导致的。CPU和内存前面已经叙述。
2.软件层优化:
1)安全方面这里不赘述,单独一台服务器安装gitlab,没有其他服务是最好的
2)gitlab的高可用性参考官网:https://www.gitlab.cc/high-availability/
3)gitlab-Runner不建议安装到gitlab服务器上,工作时会消耗大量内存,可以考虑使用docker启动一个(也不建议安装到其他服务器,如果你要讲shell作为gitlab-Runner的执行器时,有安全问题,可以查看官网https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/security/index.md)
gitlab-Runner是一个执行软件集成的脚本,通常配合gitlab-CI集成工具使用。Runner可以分布到不同的机器上。
下图是Gitlab-CI的简单逻辑拓扑图:
4)gitlab自身优化
Unicorn优化:
增加unicorn的workers数量,可以减少应用的响应时间并提高处理并发请求的能力,官方建议使用这样的配置:CPU 核心数 + 1 = unicorn workers数
对于只有2GB内存的机器,官方建议至少配置3个unicorn workers;使用1GB内存加一个机械硬盘上的swap分区,建议只配置2个Unicron workers;至少配两个,如果只使用一个unicorn workers,git只能通过ssh协议工作,因为HTTP访问需要两个workers(一个用来处理用户请求,一个用来处理身份验证) 如果你使用512MB内存加一个固态硬盘(SSD)上的swap分区,你可以用2个unicorn workers,git就可以通过HTTP方式访问GitLab。
修改方法如下:在gitlab的配置文件/etc/gitlab/gitlab.rb中:
unicorn['worker_processes'] = 3
unicorn['worker_timeout'] = 60
nginx、数据库、redis的优化:一般不优化,基本已经优化好
用户的优化:没有试过,官方不建议,有可能出问题。