背景

Gitlab是一个Git仓库系统,分CE和EE版本,其中CE作为社区版,是开源免费的,用来替代github上要钱才能用私有库是非常不错的选择。

安装

Gitlab-ce安装有多种方法,而且Ubuntu有直接的package可以用,但是坑有点多,装过一个晚上完全跑不起来,差点要放弃了。

然后尝试了一下这种完全自己安装的方法,虽然坑也不少,但是总算成功了。

这篇基本算半翻译半除坑地过一遍安装方法,会跳过一下原帖上我服务器上用不到的部分。
因为是Ubuntu是默认有sudo的,所以可以跳过相关部分。

更新软件源

1
2
$ sudo apt update -y
$ sudo apt upgrade -y

设置默认的文本编辑器

这一步完全可以跳过,后面有editor命令的全部换成想要文本编辑器即可,如Nano,vim等。
PS: 后面会以vi代替原文中的editor命令,做了这一步的需要继续使用editor命令。

1
2
3
# Install vim and set as default editor
$ sudo apt-get install -y vim
$ sudo update-alternatives --set editor /usr/bin/vim.basic

安装依赖

1
$ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate python-docutils pkg-config cmake nodejs

这里的nodejs如果需要最新版可能需要看一下怎样安装最新版的NodeJS,但是原文没有提要多少的版本,所以不知道有没有版本要求。可以先继续,如果有什么问题在补上。

一些说明
  • Kerberos,我这里不用,所以直接跳过。正如原文所说,你如果不知道这是什么,那么就可以认为是不需要的。

Git

需要Git版本是2.7.4或者更高。Ubuntu的package下载下来的是符合要求的,所以直接使用即可。

1
2
3
$ sudo apt-get install -y git-core git
# 确认git版本符合要求
$ git --version

postfix

然后是安装邮件服务,这个是给用户发邮件用的。

1
$ sudo apt-get install -y postfix

安装时选择Internet Site,其他随意。邮件部分配置好点的话,然后可以让Gitlab登录自己邮箱,这样发送的邮件不容易被归到垃圾邮件,这里跳过。

Ruby

推荐2.3.x,而Ubuntu的包管理带的就是2.3.1版本,所以可以直接简单的安装上。

1
2
3
$ sudo apt install ruby
# 确认一下
$ ruby -v

Gem
1
$ sudo gem install bundler --no-ri --no-rdoc

这里使用gem命令下载感觉不开VPN超慢,建议开启VPN,或者使用tsocks之类的工具来做wrapper使用代理下载。

Go

安装GO

Git配置

给Gitlab添加一个git用户,

1
$ sudo adduser --disabled-login --gecos 'GitLab' git

PostgreSQL

然后安装数据库,推荐PostgreSQL数据库,没用过也没关系,除非是想contribute。想用MySQL也是可以的,但是一切从简的原则,毕竟被坑得不行过,所以跟着使用PostgreSQL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装包
$ sudo apt-get install -y postgresql postgresql-client libpq-dev postgresql-contrib
# 建一个用户
$ sudo -u postgres psql -d template1 -c "CREATE USER git CREATEDB;"
# 建立数据库并授权
$ sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"
# 安装一个扩展,不是很懂有什么用
$ sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"
# 链接一下数据库
$ sudo -u git -H psql -d gitlabhq_production
# 检查刚刚那个扩展有没有安装
SELECT true AS enabled
FROM pg\_available\_extensions
WHERE name = 'pg_trgm'
AND installed_version IS NOT NULL;
# 原文说会输出
enabled
---------
(1 row)

然而,我并没有这个输出,但是可以运行,只是有一个monitor的功能返回500错误,个人认为可能和这个扩展有关,先不管。

1
2
# 退出sql环境
gitlabhq_production> \q

Redis

需要至少2.8版本,而Ubuntu 16.04的包管理提供的是3.0.6版本,Ubuntu大法好。

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
# 安装包
$ sudo apt-get install redis-server

# 配置redis
$ sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.orig

# 设置port为0来禁用Redis对TCP的监听
$ sed 's/^port .*/port 0/' /etc/redis/redis.conf.orig | sudo tee /etc/redis/redis.conf

# 使用Ubuntu的sock文件,这个后面会用到,如果自己改了路径需要注意
$ echo 'unixsocket /var/run/redis/redis.sock' | sudo tee -a /etc/redis/redis.conf

# 给所有redis组成员权限
$ echo 'unixsocketperm 770' | sudo tee -a /etc/redis/redis.conf

# 创建sock所在的文件夹
$ mkdir /var/run/redis
$ chown redis:redis /var/run/redis
$ chmod 755 /var/run/redis

# shell弱鸡表示不懂这段干嘛,直接copy & paste
$ if [ -d /etc/tmpfiles.d ]; then
> echo 'd /var/run/redis 0755 redis redis 10d -' | sudo tee -a /etc/tmpfiles.d/redis.conf
> fi

# 重启redis让配置生效
$ sudo service redis-server restart

# 把git用户添加到redis组
$ sudo usermod -aG redis git

安装主体

Gitlab默认是安装在/home/git目录下,就是git用的home目录下。

1
2
3
$ cd /home/git
# clone一下代码
$ sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 8-14-stable gitlab

这里有坑,我安装的时候没有在这个git里面找到8-14-stable的分支,所以用的是8-13-stable,安装的时候需要自己去找最新的分支。

可以使用这个地址,已经使用关键字stable和按最新更新排列了,想要最新的使用master分支也可以,但是稳定性不一定有stable的好。

而且直接clone的话不用VPN或者代理的话非常慢,而且文件有将近200M,很痛苦,直接去网址下载zip包到时候再解压会比较好一点。

配置Gitlab主体

clone好了以后需要配置一下

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
# 打开源文件目录,这里是Gitlab的主目录
$ cd /home/git/gitlab

# 复制一份配置文件
$ sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

# 根据文件修改一下自己的配置,后面说
$ sudo -u git -H editor config/gitlab.yml

# 复制一下secret配置文件,这个不用改,后面会有一步程序会自动生成
$ sudo -u git -H cp config/secrets.yml.example config/secrets.yml
$ sudo -u git -H chmod 0600 config/secrets.yml

# 修改权限,让git用户有必须的权限
$ sudo chown -R git log/
$ sudo chown -R git tmp/
$ sudo chmod -R u+rwX,go-w log/
$ sudo chmod -R u+rwX tmp/
$ sudo chmod -R u+rwX tmp/pids/
$ sudo chmod -R u+rwX tmp/sockets/

# 建目录
$ sudo -u git -H mkdir public/uploads/

# 确保只有Gitlab可以使用uploads目录,这个目录由Gitlab-workhorse使用
$ sudo chmod 0700 public/uploads

# 改变CI目录的权限
$ sudo chmod -R u+rwX builds/

# 改变CI的artifacts目录的权限
$ sudo chmod -R u+rwX shared/artifacts/

# 复制一份Unicorn的配置
$ sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

# 看一下CPU的core数
$ nproc

# 需要高性能就要启用族群模式,设置这个Unicorn.rb的worker数目不小于core数,其他的后面讲
$ sudo -u git -H editor config/unicorn.rb

# 复制一份Rack attack的配置,这个不需要修改
$ sudo -u git -H cp config/initializers/rack\_attack.rb.example config/initializers/rack\_attack.rb

# 配置git,copy直接运行
$ sudo -u git -H git config --global core.autocrlf input
$ sudo -u git -H git config --global gc.auto 0
$ sudo -u git -H git config --global repack.writeBitmaps true

# 复制一份Redis设置
$ sudo -u git -H cp config/resque.yml.example config/resque.yml

# 这里如果是按照上面redis安装过程一路过来的话是不需要修改的,否则就要根据自己的设置修改
$ sudo -u git -H editor config/resque.yml

讲一下2个配置文件,config/gitlab.yml和config/unicorn.rb。所有文件都只需要修改production的部分就行了,因为后面是直接运行production的。
config/gitlab.yml修改配置,

1
2
3
host: orzorc.space
port: 8088
https: false

这里主要配置服务器的,必须和nginx的配置一样,我因为主要运行的Apache服务器占用了80和443端口,所以nginx使用的是8088。
注意8080是默认被Unicorn占用掉的,之前好几次没运行起来估计就是因为我nginx配置了8080端口,然后早于Unicorn服务启动,导致Unicorn服务启动失败。

config/unicorn.rb修改配置,

1
2
working_directory "/home/git/gitlab"
listen "127.0.0.1:8080", :tcp_nopush => true

主要是这2项,注意端口,务必不要被占用了。

这些配置文件看清楚自己的路径,如果根据上面一步一步下来的话,是不需要任何修改的。

然后是Gitlab的数据库配置,使用PostgreSQL和MySQL不一样的,要去原文看,这里是PostgreSQL的,

1
2
$ sudo -u git cp config/database.yml.postgresql config/database.yml
$ sudo -u git -H chmod o-rwx config/database.yml

如果是一步一步过来的,这里配置不需要做任何修改,建议不熟悉PostgreSQL的话就直接一步一步过来。 然后Gem安装依赖,

1
$ sudo -u git -H bundle install --deployment --without development test mysql aws kerberos

kerberos就是前面提到不知道就不要装的那个,如果你用了,就去掉最后那个。

安装Gitlab-shell

1
$ sudo -u git -H bundle exec rake gitlab:shell:install REDIS_URL=unix:/var/run/redis/redis.sock RAILS_ENV=production SKIP_STORAGE_VALIDATION=true

REDIS_URL就是之前配置redis的sock路径,然后会有一个文件生成/home/git/gitlab-shell/config.yml,这个文件里面有一项

1
gitlab_url: http://localhost:8088/

这一项默认是你的在gitlab.yml里面配置的网站地址,但是我发现会在后面的check中无法通过,具体表现为Gitlab shell check 里面的API check 502错误。
可以先留着默认,如果出现了这个情况,再改为localhost试试。

安装Gitlab-workhorse

1
2
3
4
5
$ cd /home/git
$ sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
$ cd gitlab-workhorse
$ sudo -u git -H git checkout v1.0.0
$ sudo -u git -H make

这里git clone也是比较慢,但是好在文件不大。

初始化数据库,

1
2
3
4
$ cd /home/git/gitlab
$ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production
# 直接输入yes
# 成功的话应该可以看到'Administrator account created'的字样

这里的设置的admin密码可以不用管,第一次登陆的时候系统会直接要求改密码。

设置初始化脚本

1
2
3
4
5
6
$ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
# 如果不是按照上面的步骤的话,需要执行下面这个命令,并且按照自己的配置修改
$ sudo cp lib/support/init.d/gitlab.default.example /etc/default/gitlab

# 设置为开机启动
$ sudo update-rc.d gitlab defaults 21

设置Logrotate

1
2
# 不知道什么用,直接copy
$ sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

环境检查

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
$ sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production

# 这是我的输出
System information
System: Ubuntu 16.04
Current User: git
Using RVM: no
Ruby Version: 2.3.1p112
Gem Version: 2.5.1
Bundler Version:1.13.6
Rake Version: 10.5.0
Sidekiq Version:4.2.1

GitLab information
Version: 8.13.3
Revision: 8c8cd86
Directory: /home/git/gitlab
DB Adapter: postgresql
URL: http://git.orzorc.space
HTTP Clone URL: http://git.orzorc.space/some-group/some-project.git
SSH Clone URL: git@git.orzorc.space:some-group/some-project.git
Using LDAP: no
Using Omniauth: no

GitLab Shell
Version: 3.6.6
Repository storage paths:
- default: /home/git/repositories/
Hooks: /home/git/gitlab-shell/hooks/
Git: /usr/bin/git

生成网站静态文件

1
$ sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production

启动Gitlab服务

1
$ sudo service gitlab start

nginx

1
$ sudo apt-get install -y nginx

把网站配置文件复制过去

1
2
$ sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab
$ sudo ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab

配置文件里面修改一下监听的端口和hostname就行了,和之前配置的gitlab.yml里面一样就行了

1
2
3
4
# 测试一下配置文件syntax
$ sudo nginx -t
# 重启nginx
$ sudo service nginx restart

最后完成

1
$ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

如果没有红色的提示,那就是没有问题了,有红色提示的部分按照提示的建议做一遍基本也能成功,还有一些前面已经提过了,要是还不行,

1
$ sudo service gitlab restart

也不行,重启电脑再试试,如果是按照这篇文章一路下来的应该这时候就可以了。

直接打开网站首页,去设置root密码吧。