众所周知,拥有独立的版本管理系统对于一个合作开发的团队而言极为重要。然而,在这方面优秀的产品固然不少,比如说万能的GitHub,Gitee等等。然而,试图探索新的可能性的YDJSIR没有这样做。YDJSIR尝试将代码仓库本地化部署以保证隐私性与控制性。

因此,YDJSIR选择了部署GitLab。当前,YDJSIR的GitLab主要是YDJSIR和ABN-Team在使用,使用体验极佳 。但基本来说,还是很好地实现了预期的功能。

image-20200505213853693

内存占用

可以看到GitLab有多吃性能,正常运行时YDJSIR的NPM基本是跑不了的,YDJSIR想做数据库方面的测试都得考虑用别的服务器

考虑到Aliyun的学生机的性能瓶颈与易用性方面的考虑,YDJSIR没有选择GitLab官方镜像,而是选择了宝塔软件商店中的GitLab中文版来进行安装与配置。然后Nightmare开始了(不过现在也算是能用)下面,请允许YDJSIR简要复盘一下YDJSIR的经历。

如果想要看具体的部分,请点击右侧的TOC悬浮菜单。

1. 简要带过的安装步骤

配置环境概要

项目 内容
硬件 阿里云学生机:轻量应用服务器
系统 CentOS 7.6.1810(Py2.7.5)
宝塔版本 免费版 7.2.0

宝塔的保姆式服务已经非常到位了。在下面软件商店中选择GitLab中文社区版 ,点击安装,然后稍等片刻,便可开始享受了。

当然真大佬也可以选择自己手动安装再停用GitLab原生Nginx令其转投宝塔的Nginx的怀抱(反正我是不行)

参考资料:https://www.xeath.cc/2018/05/29/archives-101/

image-20200505114816653

宝塔自身也提供了对GitLab的基础配置修改与各项服务运行状态的监测等功能。然而这里没有上图,因为YDJSIR目前修改过配置文件,宝塔已经无法对它进行管理。(后文会讲到)

第一次进入GitLab系统,你需要填写一些基本参数,如设置Root账号密码,系统初始的秘钥(宝塔的GitLab管理面板提供了生成秘钥的功能,十分实用)等等。

宝塔安装的GitLab中文版 声称不支持占用80/443端口,若需要使用这两端口,用户可以进行反向代理/改用宝塔系统配置的Nginx(前面那个大佬方法就可以如此一步到位)。YDJSIR参阅了各类教程后决心选择反向代理的路子。

参考资料:https://blog.csdn.net/qq_43384381/article/details/100187315?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

如果对下面的内容没有耐心,可以直接跳到反向代理部分

2. 基础配置

1. 配置文件中外链+邮件设置

设置邮件验证部分,YDJSIR第一次用到了GitLab的配置重载功能。这里给一些代码。也许是YDJSIR的搜索能力还不大好,一开始找出来的教程好多都严重过时,导致YDJSIR进行了多次·reconfigure 才最终解决问题。下面是YDJSIR找到的一些常用命令合集。

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
# 重新应用gitlab的配置,每次修改/etc/gitlab/gitlab.rb文件之后执行
sudo gitlab-ctl reconfigure

# 启动gitlab服务
sudo gitlab-ctl start

# 重启gitlab服务
sudo gitlab-ctl restart

# 查看gitlab运行状态,这个在后面十分有用
sudo gitlab-ctl status

#停止gitlab服务
sudo gitlab-ctl stop

# 查看gitlab运行所有日志
sudo gitlab-ctl tail

#查看 nginx 访问日志
sudo gitlab-ctl tail nginx/gitlab_acces.log

#查看 postgresql 日志
sudo gitlab-ctl tail postgresql

# 停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

# 系统信息监测
gitlab-rake gitlab:env:info

配置文件中大多数选项默认都是关掉的。如果你要启用一个功能,请确保你打开了所有配置项。

下面是对部分配置项的详解。

11 - 25 行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
external_url 'https://git.ydjsir.com.cn'
## 该地址是GitLab系统中所有链接所显示的地址,请认真配置!无论是Git的Clone还是push还是项目地址,都是这个!

## Note: configuration settings below are optional.
## Uncomment and change the value.
############################
# gitlab.yml configuration #
############################

# gitlab_rails['gitlab_ssh_host'] = 'ssh.host_example.com'
gitlab_rails['time_zone'] = 'UTC'
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'abn_team@163.com'
gitlab_rails['gitlab_email_display_name'] = 'abn_team@163.com'
gitlab_rails['gitlab_email_reply_to'] = 'abn_team@163.com'
## 这部分是管理者联系方式的部分
294-309行

这里使用的是网易的163邮箱。下面的配置基本少了哪一条都不行,不过很幸运的是基本上都是默认值不用改动。网易邮箱已经默认支持SSL和TLS传输,因此这些选项应该打开。端口应该用465而不是25

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
################################
# GitLab email server settings #
################################
# see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.md#smtp-settings
# Use smtp instead of sendmail/postfix.

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "abn_team@163.com"
gitlab_rails['smtp_password'] = "PASSWORD" ##密码当然是不能给出来的啦
gitlab_rails['smtp_domain'] = "smtp.163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
514-518行

YDJSIR采取的是单独修改GitLab的配置文件的方式,因而这部分设置可以忽略。然而这部分可以看到,YDJSIR在后来的端口转发设置时为了保证安全性,仅仅监听本地的反向代理。然而这也为后面YDJSIR的反向代理实现的时候总是开了证书也不是完全安全留下了伏笔。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nginx['enable'] = true
nginx['client_max_body_size'] = '250m'
nginx['redirect_http_to_https'] = false
nginx['redirect_http_to_https_port'] = 8099
# nginx['ssl_client_certificate'] = "/etc/gitlab/ssl/ca.crt" # Most root CA's are included by default
# nginx['ssl_certificate'] = "/etc/gitlab/ssl/#{node['fqdn']}.crt"
# nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/#{node['fqdn']}.key"
# nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
# nginx['ssl_prefer_server_ciphers'] = "on"
# nginx['ssl_protocols'] = "TLSv1 TLSv1.1 TLSv1.2" # recommended by https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html & https://cipherli.st/
# nginx['ssl_session_cache'] = "builtin:1000 shared:SSL:10m" # recommended in http://nginx.org/en/docs/http/ngx_http_ssl_module.html
# nginx['ssl_session_timeout'] = "5m" # default according to http://nginx.org/en/docs/http/ngx_http_ssl_module.html
# nginx['ssl_dhparam'] = nil # Path to dhparams.pem, eg. /etc/gitlab/ssl/dhparams.pem
nginx['listen_addresses'] = ['127.0.0.1']
nginx['listen_port'] = 8099

下面我们还会回到这里对其进行修改

2. GitLab后台设置

2.1 管理后台简介
  1. 以root身份进入GitLab系统。root用户自身也可以作为一个普通用户使用,但这显然是不推荐的。

image-20200505163433690

image-20200505163618168

  1. 一些基础配置项的详解

其实都到这里了,看提示就可以了。特别注意外观这里。这里可以配置登陆页面的外观展示。

虽然美中不足,单也算是差强人意吧。这个网页的登录效果大家也可以在这里欣赏。

https://git.ydjsir.com.cn/users/sign_in

YDJSIR的GitLab基本上是私有性质,并不对外开放,因而代码可见度基本上为私有。每一个注册用户都会经过YDJSIR的审核。在登录页面和错误页面YDJSIR做了一些小的优化,感觉尚可。

image-20200505163815668

真正具体的设置而非小功能的配置在这里。这里注意下这两项。

image-20200505164605678

主页链接其实完全没必要,系统自然会重定向至此。每次更换域名访问都要重新输入该字段,这一特性为YDJSIR后面配置域名造成了极大困难。

3. 网络方面的设置

下面的内容介绍如何配置反向代理、重定向等等,并最终实现上图所示的访问效果。

3.1 修复Nginx的路径问题

上面的配置搞定之后,你会发现GitLab除了网页没得用,其他一切正常。接下来你会极度气恼。好了,这就是宝塔神经质的一点了。为了防止两个Nginx打架,宝塔在安装的时候改动了一点小小的路径。所以,你也得改下路径才能启动Nginx。当然,自从你reconfigure了GitLab之后,就不能用宝塔自带的界面管理该GitLab了。不过没事,上面都会了你还需要宝塔管理GitLab?所以这里是解决办法。

1
2
3
4
vi /opt/gitlab/sv/nginx/run
# 改
exec chpst -P /opt/gitlab/embedded/sbin/gitlab-web -p /var/opt/gitlab/nginx
# 为

1
exec chpst -P /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx

1
exec chpst -P /opt/gitlab/embedded/sbin/gitlab-web -p /var/opt/gitlab/nginx

然后重启GitLab的Nginx。

1
2
gitlab-ctl stop nginx
gitlab-ctl start nginx

注意不是restartrestart不能重载配置。

看到ok: run: nginx: (pid XXXXX) 0s时,恭喜,你的GitLab网页部分跑起来了!

不就是配置文件地方不对嘛!那我把配置文件复制过去不就好了吗?

参考资料:https://www.syblogs.com/p/21.html

此法不能让宝塔重新识别GitLab

3.2 修改GitLab的Nginx的具体配置

首先,我们找到GitLab独立的Nginx的配置文件。

1
2
cd /var/opt/gitlab/nginx/conf
vim gitlab-http.conf

注意到该文件一旦GitLab发生reconfigure就会被刷新,因此请自己保存一份。

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
upstream gitlab-workhorse {
server unix:/var/opt/gitlab/gitlab-workhorse/socket; ## HTTP/HTTPS方式推送/接受内容时候GitLab需要这一项
}


server {
listen 127.0.0.1:8099; ## 仅仅监听本地


server_name gitlab.ydjsir.com.cn;
if ($host != 'gitlab.ydjsir.com.cn') {
rewrite ^(.*) https://git.ydjsir.com.cn$1 permanent;
}
## 这是一个很奇怪的点,gitlab这个域名仅仅用来核验身份,此处Nginx并不监听公网。这个在后面会声明。下面的if判断,则是将所有非法访问都重定向到对外的git.ydjsir.com.cn上。
server_tokens off; ## Don't show the nginx version number, a security best practice

## Increase this if you want to upload large attachments
## Or if you want to accept large git objects over http
client_max_body_size 250m;


## Real IP Module Config
## http://nginx.org/en/docs/http/ngx_http_realip_module.html

## Individual nginx logs for this GitLab vhost
access_log /var/log/gitlab/nginx/gitlab_access.log gitlab_access;
error_log /var/log/gitlab/nginx/gitlab_error.log; ##以后找错误信息也是去这里找

location / {
## If you use HTTPS make sure you disable gzip compression
## to be safe against BREACH attack.


## https://github.com/gitlabhq/gitlabhq/issues/694
## Some requests take more than 30 seconds.
proxy_read_timeout 300;
proxy_connect_timeout 300;

然后重启GitLab的Nginx。

1
2
gitlab-ctl stop nginx
gitlab-ctl start nginx

注意不是restartrestart不能重载配置。

看到ok: run: nginx: (pid XXXXX) 0s时,恭喜,你的GitLab网页跑起来了!

3.3 在宝塔页面添加反向代理以实现高效访问

众所周知,HTTPS在这个时代格外引人青睐。YDJSIR也不能免俗。下面介绍如何用宝塔实现反代+HTTPS。

3.3.1 SSL证书部分

这部分内容显然就可以在图形化的界面中进行了。为了减少更新频率(一年一度,且为国内环境估计可以更好地战未来)(装AC),我选择的是阿里的免费SSL单域名证书。申请的过程请自行查阅阿里的文档,在此按下不表。

在宝塔的网站页面新建一个网站,PHP啊数据库啊FTP什么的一个都不要,然后绑上你喜欢的域名(前文中我们已经申请了SSL的那个域名),接下来添加你的证书。这一步在宝塔的网站设置里面的SSL一项中完成。你可以选择填入别处的证书,也可以直接用宝塔自带工具申请Let’s Encrypt证书。

SSL配置完成后,如果测试没有问题的话,就请打开强制跳转HTTPS以保障体验吧。宝塔使用的是非443端口一律重写URL重定向去HTTPS访问的链接,实际效果不错。

注意到有了反向代理和301/302重定向的时候Let‘s Encrypt自动续签的文件方式会失效,因此YDJSIR建议你先绑定SSL证书再进行后面的操作。当然,你可以采取域名解析的方式来续签以绝后患。YDJSIR刚刚完成了这一步操作,由于域名验证支持通配符,所以只要启用了一个,宝塔就会把所有的证书都替换成通配符证书,可以说是十分智能的。文件验证的话交给宝塔就好。

添加泛型域名时,请直接对绑定了默认域名前缀(@或者www)的网站进行操作。点击申请之后,宝塔会指引你如何填写DNS修改方式。你可以选择提供AccessKey给宝塔令其自动修改解析记录,也可以手动添加。DNS认证的话YDJSIR对宝塔不放心,因而选择了手动添加。把宝塔要求的DNS记录添加上,点击认证,宝塔便会自动部署证书并开启SSL。

image-20200505163024465

登录后页面访问效果

image-20200505163117033

登录页面访问效果

3.3.2 反向代理部分

注意:此处直接在宝塔的图形界面输入IP地址时宝塔会报错,但是直接修改配置文件则不会出现此问题。建议先搞一个带域名的,然后进配置文件强行拨乱反正。这里只是作为示范。你直接去改文件,这里不一定会更新。

这里所谓的高级功能,是你可以指定一个目录开反向代理。比如说你的首页是https://example.com ,那么你的GitLab可以挂载在https://example.com/gitlab 。你可以根据你的需要自行取舍。

image-20200505194146743

image-20200505194442019

缓存模式不大建议打开,如果你硬是要开,请随便。接下来点击配置文件,进行如下配置(请自行修改)

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
#PROXY-START/
location ~* \.(php|jsp|cgi|asp|aspx)$
{
proxy_pass http://127.0.0.1:8099;## 配置的核心
proxy_set_header Host gitlab.ydjsir.com.cn;## 修改GitLab收到的实际域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
}
## 上面为对动态网页的统一处理。在上下两处都建议添加上对本地的端口转发。该部分配置文件基本上由宝塔格式化生成,只需要修改有备注的项目即可。
location /
{
proxy_pass http://127.0.0.1:8099; ## 配置的核心
proxy_set_header Host gitlab.ydjsir.com.cn;## 修改GitLab收到的实际域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;

add_header X-Cache $upstream_cache_status;

#Set Nginx Cache

add_header Cache-Control no-cache;
expires 12h;
}

#PROXY-END/

至此,你会发现你已经能够以崭新的域名访问你可爱的GitLab了。然而,你会发现你时不时会被抛出到那个GitLab御用Nginx里面写的那个域名那里。然而你那个域名又不监听公网IP,自然是打不开的。(ABN-Team对该问题的反响极大)该问题在网页版提交文件、登录等操作时会发生。虽然说不影响实际数据提交,但是很影响体验。下面YDJSIR提出一个粗浅的解决方案。

3.3.3 重定向部分

首先,我们当然反对一切乱七八糟的域名访问。如果你狠心一点,你可以对于那些从非法域名进来的访问,一律404处理。所以在Nginx的配置文件里,你可以这么写。

1
2
3
4
5
6
7
8
9
10
location /server {
valid_referers servicewechat.com;
if ($invalid_referer) {
return 403;
}
}

if ($host != 'your domain'){
return 403;
}

由于上面做了重定向,这里就不搞这么野蛮了。在反向代理的这个“网站”里,YDJSIR建议你如此设置。YDJSIR之所以不这么设置,是因为YDJSIR的宝塔的Nginx已经有默认的非法域名访问错误页面(SSL错误页面与普通HTTP错误页面各一),这里就不这么配置了。

此后,我们新开一个绑定了GitLab的Nginx里面那个不监听外网的域名的网站(显然这一操 不会 引起冲突,因为是两个Nginx,而另一个Nginx根本不关心外网发生了什么)该操作在宝塔的图形化界面中进行。按照惯例,这个网站不需要PHP,数据库之类的东西。而后在设置处,选择重定向(测试版),而后添加如下重定向方式:

image-20200505214120785

当然,你的DNS设置里当然也要A记录解析到GitLab所在的这台服务器。

3. 未完待续