gitlab安装教程

这是一片关于GitLab的安装教程以及踩过的坑

浪费了一个下午的时间,终于把Gitlab搭建完成,搭建环境如下:

  • 系统(虚拟机)

    Distributor ID: Ubuntu

    Description: Ubuntu 18.04 LTS

    Release: 18.04

    Codename: bionic

  • gitlab V11.0.1

安装Gitlab

这里有一个问题,gitlab官方源太慢了,一个gitlab安装包要500M+如果直接下载,很容易挂掉,或者等很久,所以这里要替换源。不过似乎在阿里云上搭载的话,会很快,不用更换。

这里推荐 清华大学开源软件镜像站 里面有不少的镜像源,其中就包括了gitlab的。

具体地址是

deb http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu bionic main

注意其中 bionic 是系统代号,比如我的ubuntu 18 代号就是 bionic 其他的系统可以使用 lsb_relase 命令自行查询。

使用方法 参考

  1. 信任 GitLab 的 GPG 公钥:

    1
    curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null
  2. 设置源

    1
    2
    cd /etc/apt/sources.list.d
    vim gitlab-ce.list
  3. 编辑gitlab-ce.list 输入以下内容

    1
    deb https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ubuntu/ bionic main
  4. 更新并安装

    1
    2
    sudo apt-get update
    sudo apt-get install gitlab-ce
  5. 配置gitlab

    由于gitlab要用到域名,所以需要准备好域名。由于我是用虚拟机搭建,所以公共域名用不了,所以我就自己搭建了一个域名服务。可以参考可选步骤,搭建私有DNS服务器。

    配置文件是 /etc/gitlab/gitlab.rb 文件,因为文件内容过多,就简单的把会用到的配置列出来

    1. 域名,这个设计到了gitlab系统自动生成的链接,所以必须修改为自己的域名

      1
      2
      # external_url 'http://gitlab.explme.com'
      external_url 'http://kirno.com'
    2. 配置时区,由于默认是UTC,导致使用的时候时间不正确,所以需要修改为本地的时区

      1
      2
      # gitlab_rails['time_zone'] = 'UTC'
      gitlab_rails['time_zone'] = 'Asia/Shanghai'
    3. 邮件,由于gitlab会通过邮箱找回密码或者认证,所以需要配置。原本是使用系统自己的邮件系统,但是我不会配置,所以就是用了QQ邮箱作为发送方

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      gitlab_rails['smtp_enable'] = true
      gitlab_rails['smtp_address'] = "smtp.qq.com"
      gitlab_rails['smtp_port'] = 465
      # 发送方的邮箱完整地址 xx@qq.com
      gitlab_rails['smtp_user_name'] = "XXX"
      # 这里是发送方的QQ邮箱地址,也就是和上面的一样
      gitlab_rails['gitlab_email_from'] = 'XXX'
      # 密码,注意这里要使用QQ邮箱的 授权码 不是密码,可以在设置,账户处找到
      gitlab_rails['smtp_password'] = "xxx"
      gitlab_rails['smtp_domain'] = "smtp.qq.com"
      gitlab_rails['smtp_authentication'] = "login"
      gitlab_rails['smtp_enable_starttls_auto'] = true
      gitlab_rails['smtp_tls'] = true

配置完成后初始化 gitlab 时间比较久

1
gitlab-ctl reconfigure

可以通过以下命令测试邮件

1
2
3
4
# 进入控制台
gitlab-rails console
# 发送邮件
Notify.test_email("收件人邮箱", "标题", "内容").deliver_now

然后就可以在浏览器通过域名访问了

汉化教程

默认的gitlab是英文,可以选择进行汉化,不过其实汉化并不完整。

  1. 下载汉化文件 文件比较大在 48m+ 左右,而且下载比较慢,所以建议下载完拉上服务器。

    一定要注意版本,已安装的gitlab版本可以通过 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 命令查看

  2. 下载完之后解压,通过 cat gitlab/VERSION 查看是版本是否匹配,如果版本不匹配可能会导致gitlab崩溃,所以小心

  3. 停止gitlab

1
gitlab-ctl stop
  1. 覆盖
1
cp -rf gitlab/* /opt/gitlab/embedded/service/gitlab-rails/
  1. 重新配置gitlab并启动它
1
2
gitlab-ctl reconfigure
gitlab-ctl restart

使用现有的Nginx作为服务器

这个地方巨坑,真的是巨坑,被卡在这里太久了😭。
首先通过apt-get或者从官网下载的nginx,如果没有注意的话都不行,因为他们默认都不支持 Passenger 这是个巨坑啊,多少次因为这个摔鼠标了🖱️。虽然网上有教程通过 passenger-install-nginx-modules 的方式来重新安装nginx,但是这个的编译过程贼慢,我的双核4g云服务器完全卡死在这了,所以不推荐。还有的办法就是通过利用 nginx 1.9 以上的版本的动态模块加载功能来实现。

  1. 安装 ruby 没办法,passenger依赖 ruby
1
sudo apt install ruby
  1. 安装 passenger 安装这个东西最好换源,否则巨慢
1
2
3
4
5
6
7
8
#换源
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
$ gem sources -l
https://gems.ruby-china.com
# 确保只有 gems.ruby-china.com

#
安装
gem install passenger
  1. 下载nginx源码,编译模块,参考
1
2
3
4
5
6
cd /path-to-nginx-source-dir
./configure --prefix=/opt/nginx \
--add-dynamic-module=$(passenger-config --nginx-addon-dir) \
--add-module=/path-to-some-other-nginx-module
make
sudo make install
  1. 配置现有的nginx的配置文件 nginx.conf, 添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#user  nobody;
worker_processes 1;

#============重点================================
load_module modules/ngx_http_passenger_module.so;
#===============================================

events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;

#============重点===如果忘记passenger的目录了,可以通过 passenger-config --root 指令来获取=============================
passenger_root /var/lib/gems/2.3.0/gems/passenger-5.3.3;
#===============================================

sendfile on;

keepalive_timeout 65;
...
  1. 重中之重,这里最坑,配置了好了nginx之后报了一个奇葩🤮的错误
1
2018/07/10 10:44:19 [crit] 28138#0: *3739 connect() to unix:/tmp/passenger.uPSo3Mj/agents.s/core failed (2: No such file or directory) while connecting to upstream, client: 119.127.17.115, server: xxx, request: "GET / HTTP/1.1", upstream: "passenger:unix:/tmp/passenger.uPSo3Mj/agents.s/core:", host: "xxx"

这个地方浪费了我一个下午加半个早上🌞,多次想放弃,网上还找不到资料。其实解决也很简单,就是重启nginx,不能简单的nginx -s reload 或者 nginx -s reopen 的重启,没有效果的,必须要先 kill 了nginx的进程然后再重新运行 nginx 才行😭。为了解决这个问题,我重装了gitlab,各种百度,谷歌,差点就去看gitlab源码了😭。手抖重启ngxin后成功看到/tmp下创建passenger.xxx文件,太开心了。然后刷新页面果然成功

  1. 一定要记住配置 passenger_root /var/lib/gems/2.3.0/gems/passenger-5.3.3; 否则也会出现403错误

成功图

(可选)搭建私有DNS服务器

网上基本都是 bind9 的教程,所以我也就使用它来搭建。

首先安装

1
sudo apt-get install bind9

安装了之后,有几个路径需要了解

  • /etc/bind 用于存放主要的配置文件
  • /var/cache/bind 用于存放域名相关的配置文件

比如我要创建一个 kirno.com 的域名

首先编辑 /etc/bind/named.conf.local 文件

1
2
3
4
5
6
7
// 这里的 kirno.com 就是想要创建的域名
zone "kirno.com" {
type master;

// 这个对应着 /var/cache/bind 里面的解析配置文件的名字
file "db.kirno.com";
};

然后把 /etc/bind 目录下的解析配置模板 db.local 复制到 /var/cache/bind 里面

1
cp /etc/bind/db.local.com /var/cache/bind/db.kirno.com

编辑 /var/cache/bind/db.kirno.com 把其中的

1
@	IN	A	127.0.0.1

改为

1
@	IN	A	192.168.2.100

其中 192.168.2.100 是你想解析的域名对应着的ip

最后编辑 /etc/bind/named.conf.options 文件

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
options {
directory "/var/cache/bind";

// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113

// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.

forwarders {
223.5.5.5;
};

//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;

auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};

其中 223.5.5.5 是阿里云的DNS,这里的意思其实是如果本地找不到相应的域名,就会交给第三方DNS服务器处理,所以改成任意的可使用的第三方域名服务器即可。