GitLab Server 安装配置

作者 huhamhire,暂无评论,2014年2月16日 20:49 折腾历程

去年折腾 VPS 的时候,自己就尝试用 Gitlist, GitWeb 做了在线的 Git 管理工具,实现了一些很简单的功能。

但是如果对于在线版本管理如果有更高的要求,上面的这些简易的方案显然无法满足基本要求,更不用说后续的 CI 方面了。所以这周抽了点时间捣鼓了一下 GitLab 以及 GitLab-CI 的安装部署。以后有时间,考虑再加上 Code Review 系统来进一步完善自己的 CI 系统。

这一篇文章先来说说 GitLab Server 社区版的生产部署。

0. 开始之前

GitLab 是一个基于 Ruby on Rails 并且开源的项目管理平台,说明白一点就是山寨版本的 Github,不过其最大的好处是可以部署在自己的服务器上,利于代码实现私有化。

我这里的配置过程大体上照着官方的流程进行,增加了 SSL 配置的部分(使用的是 StartSSL 签的证书),不过数据库部分只有 PostgreSQL 部分。

GitLab 官方给出了详尽的安装配置流程,可以访问 ://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md <https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/installation.md>`_

然后介绍下我用的系统环境。因为去年正好收了台 HP 的二手双路服务器(可惜一直木有时间写捣腾这台服务器的文章,罪过了 :-P),所以这次果断直接 Clone 了一个服务器上最小化安装的 Debian Wheezy 7.4 来折腾。家里不可能存在大量并发的情况,即使做了外网的端口转发,可能有时会有小流量的外网访问,不太可能给 Gitlab 服务器造成较高的符合,我设置了 2G 内存加双核 CPU 就绰绰有余了。虚拟机最大的好处是可以快照,设置好 Gitlab Server 以后,后续部署 Gitlab-CI Server 会方便很多。

接下来是 GitLab 版本的情况。本文中安装涉及的 GitLab 版本为 6.5.1 stable,鉴于 GitLab 每月 22 日都会发布一次更新,安装后续版本的流程可能有所不同,本文仅供参考。

不多说了,下面开始这一回的折腾。

1. 准备工作

1.1 安装依赖软件包

检查软件包更新。另外由于 Debian 现在默认的最简化安装方式并没有自带 sudo,所以还需要安装 sudo:


1 apt-get update -y
2 apt-get upgrade -y
3 apt-get install sudo -y

安装需要使用的软件包:


1 sudo apt-get install -y build-essential zlib1g-dev libyaml-dev \
2 libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev \
3 curl openssh-server redis-server checkinstall libxml2-dev \
4 libxslt-dev libcurl4-openssl-dev libicu-dev logrotate

安装用于支持 reStructuredText 文档格式的 python-docutils 软件包:


sudo apt-get install -y python-docutils

1.2 编译安装 Git

目前 Gitlab 需要使用 Git 1.7.10 或更高版本的 git 来实现版本库管理,目前 Debian Wheezy 官方库中提供的的 git 版本应该可以满足要求。不过出于想装新版本的原因,我还是选择自己编译了 1.8.5 版本,貌似这两天 1.9 已经发布了,Git 的发布速度好快的说。

安装编译安装过程需要使用的软件包:


sudo apt-get install -y libcurl4-openssl-dev libexpat1-dev gettext \
libz-dev libssl-dev build-essential

获取并编译 Git 源代码:


1 cd /tmp
2 curl --progress http://git-core.googlecode.com/files/git-1.8.5.4.tar.gz | tar xz
3 cd git-1.8.5.4/
4 make prefix=/usr/local all

安装编译好的 Git:


sudo make prefix=/usr/local install
按照这里的设置自己编译安装了 Git 以后,在后续配置 Gitlab 中的 config/gitlab.yml 文件时需要设置 Git 的路径指向 /usr/local/bin/git

1.3 配置邮件服务器(可选)

如果要就收 Gitlab 的邮件通知的话,还需要安装邮件服务器。当然,如果只是主要给自己在局域网环境下使用的话,不使用邮件功能也无所谓。除此以外,也可以使用 SMTP 的方式来发送邮件,所以安装邮件服务器与否理论上也是可选的。

默认情况下 Debian 已经自带了 exim4,不过官方推荐还是使用 postfix。Ubuntu 没有自带邮件服务器,因而如需使用的话需要单独安装。


sudo apt-get install -y postfix

在菜单中选择配置 Internet 服务器,然后设置邮件服务器主机名:


gitlab.huhamhire.com

1.4 设置默认的文本编辑器(可选)

因为 Gitlab 安装过程需要修改部分配置文件,如果需要使用 vim,可以安装并修改系统默认的编辑器。一般 Debian 自带了 nano。


sudo apt-get install -y vim
sudo update-alternatives --set editor /usr/bin/vim.basic

2. 安装 Ruby

Gitlab 是基于 Ruby on Rails 开发的工具,要跑起来的话自然少不了安装 Ruby。

Gitlab 对于 Ruby 版本的要求比较新,如果系统中已经装了老版本的 Ruby 需要先卸载:


sudo apt-get remove ruby1.8

然后下载 Ruby 2.0.0 的源代码编译安装。PS: 可能国内访问 Ruby 的 FTP 服务器速度会很慢,也可以提前选择把代码包提前下载好以后上传到服务器直接解包使用。


1 mkdir /tmp/ruby && cd /tmp/ruby
2 curl --progress ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p353.tar.gz | tar xz
3 cd ruby-2.0.0-p353
4 ./configure --disable-install-rdoc
5 make
6 sudo make install

如果是在国内环境的话,建议安装完成后修改 Ruby 默认的 gem source 到淘宝镜像:


gem source -r https://rubygems.org/
gem source -a http://ruby.taobao.org/

安装 Bundler:


sudo gem install bundler --no-ri --no-rdoc
到这里,Gitlab 的环境配置阶段算是初步完成了。建议如果是虚拟机的话,可以在这一步完成后选择快照一次,因为如需后续配置 Gitlab-CI 服务器以及 Gitlab-CI-Runner 的话,可以直接使用这里的快照 Clone。

3. 添加系统用户

这一步很简单,只要新建一个给 Gitlab 使用的系统用户即可,出于安全上的考虑,设置了禁止该用户直接登录当前系统:


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

4. 安装 GitLab shell

Gitlab 使用自有的 gitlab-shell 来对版本库的 ssh 访问进行管理而非直接使用 open-ssh,这一步就来安装 gitlab-shell。

切换至 git 用户主目录:


cd /home/git

获取 gitlab-shell 代码:


1 sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-shell.git -b v1.8.0
2 cd gitlab-shell
3 sudo -u git -H cp config.yml.example config.yml

修改 gitlab-shell 配置文件:

sudo -u git -H editor config.yml

如果只使用普通 HTTP 方式访问的话,只需设置 Gitlab 站点的 URL 即可:


gitlab_url: "http://gitlab.huhamhire.com/"

如果想使用 HTTPS 的方式访问,还需要需要额外设置 ssl 证书链:


1 gitlab_url: "https://gitlab.huhamhire.com/"
2 http_settings:
3   ca_file: /etc/ssl/ca_ssl.crt

我使用的是 StartSSL 签发的证书,注意这里的证书链应该要按照“CA 根证书 >> CA 服务器证书 >> 签发的域名证书”的顺序来配置,将各个证书的内容按序合并成一个文本文件即可。

如果仅使用签发的证书或者配置不正确,可能会造成无法正常使用 HTTPS 的方式来获取或提交代码。

除了使用 CA 签发的证书,理论上也可以用自签名证书。如果使用自签名证书,还需要额外设置 self_signed_cert 的参数,以禁用服务端对证书的认证检查:


self_signed_cert: true

当然,如果是用于生产环境,建议还是使用 CA 的证书为好,毕竟谁也不想每次访问页面都看到浏览器的警告提示。

配置完成 gitlab-shell 以后,执行安装脚本:


sudo -u git -H ./bin/install

5. 数据库安装配置(PostgreSQL)

Gitlab 对 MySQL 以及 PostgreSQL 都提供了良好的支持,因为本人更倾向于 PostgreSQL 的简洁,所以本文中仅对 PostgreSQL 的配置进行说明,如需要 MySQL 的配置流程,请查阅官方安装说明。

安装 PostgreSQL 相关的软件包:


sudo apt-get install -y postgresql-9.1 postgresql-client libpq-dev

登录 PostgreSQL 数据库进行初始设置:


sudo -u postgres psql -d template1

建立 Gitlab 需要使用的数据库用户:


CREATE USER git;

建立 Gitlab 对应的数据库:


CREATE DATABASE gitlabhq_production OWNER git;

设置完成后 q 退出 PostgreSQL。

6. 安装配置 GitLab

其实之前的这些理论上都是为 Gitlab 安装做准备,饭前甜点而已,这一部分才是整个安装过程的主食。

首先回到 git 用户的主目录:


cd /home/git

6.1 获取 GitLab 的代码

通过 git 获取代码库:


sudo -u git -H git clone https://github.com/gitlabhq/gitlabhq.git -b 6-5-stable gitlab
cd gitlab
由于国内访问 Gitlab 官网的速度可能会比较慢,我这里使用的是官方在 Github 上的镜像(虽然速度也不是很快,不过也要比官网来的好一点)。另外,因为牵涉到后续的升级问题,不建议直接下载打包的 Gitlab 代码,以免给后续升级带来麻烦。

6.2 配置 GitLab

设置 Gitlab 的配置文件:


sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml
sudo -u git -H editor config/gitlab.yml

同样,如果只是普通 HTTP 方式访问,修改一下主机域名、邮件信息即可,注意不要忘记修改 git 的默认位置,因为使用了自己编译的 git。另外提醒一下,主机名一定要配置正确,不然在使用的时候可能会出现诡异的问题,希望保存前务必检查一遍。


1 host: gitlab.huhamhire.com
2 email_from: gitlab@huhamhire.com
3 support_mail: gitlab@huhamhire.com
4 bin_path: /usr/local/bin/git

如果是 HTTP 方式访问,除了上面的那些设置,还需要配置默认的访问端口,以及 https 选项。


1 host: gitlab.huhamhire.com
2 port: 443
3 https: true
4 email_from: gitlab@huhamhire.com
5 support_mail: gitlab@huhamhire.com
6 bin_path: /usr/local/bin/git

配置 git 用户对日志及临时目录的权限:


sudo chown -R git log/
sudo chown -R git tmp/
sudo chmod -R u+rwX  log/
sudo chmod -R u+rwX  tmp/

建立 gitlab-satellites 目录:


sudo -u git -H mkdir /home/git/gitlab-satellites

建立 pids/sockets 目录,并设置访问权限:


sudo -u git -H mkdir tmp/pids/
sudo -u git -H mkdir tmp/sockets/
sudo chmod -R u+rwX  tmp/pids/
sudo chmod -R u+rwX  tmp/sockets/

建立上传文件目录,并设置访问权限:


sudo -u git -H mkdir public/uploads
sudo chmod -R u+rwX  public/uploads

复制 unicorn 模板配置文件:


sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

修改 unicorn 配置文件(可选),如果需要配置集群或者高性能服务器的话,建议对 unicorn 进行设置,常规配置可以直接忽略这一步。


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 的全局参数:


sudo -u git -H git config --global user.name "GitLab"
sudo -u git -H git config --global user.email "gitlab@huhamhire.com"
sudo -u git -H git config --global core.autocrlf input

6.3 配置 GitLab 数据库设置(PostgreSQL)

复制用于 PostgreSQL 数据库的模板配置文件:


sudo -u git cp config/database.yml.postgresql config/database.yml

修改数据库配置文件权限:


sudo -u git -H chmod o-rwx config/database.yml

修改生产部署使用的配置文件:


sudo -u git -H editor config/environments/production.rb

6.4 配置邮件功能(可选)

如果需要以 SMTP 方式发信,可以做类似下面的配置,这里以 Outlook.com 的服务器为例:


 1 config.action_mailer.delivery_method = :smtp
 2 config.action_mailer.smtp_settings = {
 3   :address              => "smtp-mail.outlook.com",
 4   :port                 => 587,
 5   :domain               => 'huhamhire.com',
 6   :user_name            => 'gitlab@huhamhire.com',
 7   :password             => 'password',
 8   :authentication       =>  :plain,
 9   :enable_starttls_auto => true
10 }

另外还有一种使用 SMTP 发邮件的方式,可以保留这里的 delivery_method 继续为 sendmail,然后修改系统 mail 的参数,来实现通过 SMTP 服务器的方式发邮件。

当然如果像我一样想取消邮件提醒功能,也可以直接修改参数关闭。


config.action_mailer.perform_deliveries = false

实话说,国内民用宽带一般都是动态 IP,甚至是可能更多的是内网 IP,一般即使是通过 SMTP 服务器转发的邮件,像 Gmail, outlook.com 这样的国外邮件服务器,大部分都会因为发信 IP 的问题直接退信。虽然我家里经过了像电信申诉后拿到了公网 IP,但是要在家里建邮件服务器的话,还是会有问题,而且国内法律似乎是明确禁止私人未经登记私自建立邮件服务器的,因为暂时还不想找邮件代理,所以邮件的问题我也只能作罢。

6.5 安装 Gem 包

如果是国内部署的话,建议修改 Gitlab 的 Gem 配置文件:


sudo -u git -H editor Gemfile

设置 Gem 源为淘宝镜像:


source "http://ruby.taobao.org/"

然后安装 Gitlab 的 Gem 包,注意因为使用了 PostgreSQL 数据库,这里的参数应该有“--without mysql”的配置:


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

按照生产环境初始化数据库,并且进行初步设置:


sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production

安装过程中出现询问是否建立数据库表格时,输入 yes 即可。配置自动执行完成后会看到初始的管理员账户及默认密码。

6.6 安装 GitLab 启动脚本

复制默认的启动脚本到系统目录:


sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

设置 Gitlab 自动启动:


sudo update-rc.d gitlab defaults 21

6.7 收尾操作

设置 logrotate,复制 logrotate 的模板配置文件


sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

检查当前状态:


sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production

启动 Gitlab 服务:


sudo service gitlab start

编译静态内容以提高访问效率:


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

7. Nginx 服务器安装配置

Gitlab 官方推荐使用 Nginx 作为 Web 服务器,并且给出了模板配置文件。Nginx 是个好东西,当然也没啥特别的理由来拒绝。

安装 nginx 软件包:


sudo apt-get install -y nginx

复制 nginx 模板配置文件,并建立软链接:


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

修改配置文件:


sudo editor /etc/nginx/sites-available/gitlab

如果仅使用 HTTP 访问,只需对域名部分进行修改。


server_name gitlab.huhamhire.com;

如需使用 HTTPS 方式访问,可以参考我这里给出的 server 配置段进行设置(注:下面提供的并非完整配置文件)。


 1 server {
 2   listen *:80 default_server;
 3   server_name gitlab.huhamhire.com;
 4   server_tokens off;
 5   root /nowhere;
 6   rewrite ^ https://$server_name$request_uri permanent;
 7 }
 8 
 9 server {
10   listen *:443 default_server;         # e.g., listen 192.168.1.1:80; In most cases *:80 is a good idea
11   server_name gitlab.huhamhire.com;     # e.g., server_name source.example.com;
12   server_tokens off;     # don't show the version number, a security best practice
13   root /home/git/gitlab/public;
14 
15   ssl                     on;
16   ssl_certificate         /etc/nginx/ssl/ssl_nginx.crt;
17   ssl_certificate_key     /etc/nginx/ssl/ssl_decrypted.key;
18   ssl_protocols           SSLv3 TLSv1 TLSv1.2;
19   ssl_ciphers             AES:HIGH:!ADH:!MD5;
20   ssl_prefer_server_ciphers on;
21 
22   # Set value of client_max_body_size to at least the value of git.max_size in gitlab.yml
23   client_max_body_size 5m;
24 
25   # individual nginx logs for this gitlab vhost
26   access_log  /var/log/nginx/gitlab_access.log;
27   error_log   /var/log/nginx/gitlab_error.log;
28 
29   location / {
30     # serve static files from defined root folder;.
31     # @gitlab is a named location for the upstream fallback, see below
32     try_files $uri $uri/index.html $uri.html @gitlab;
33   }
34 
35   # if a file, which is not found in the root folder is requested,
36   # then the proxy pass the request to the upsteam (gitlab unicorn)
37   location @gitlab {
38     proxy_read_timeout 300; # Some requests take more than 30 seconds.
39     proxy_connect_timeout 300; # Some requests take more than 30 seconds.
40     proxy_redirect     off;
41 
42     proxy_set_header   X-Forwarded-Proto $scheme;
43     proxy_set_header   X-Forwarded-Ssl   on;
44     proxy_set_header   Host              $http_host;
45     proxy_set_header   X-Real-IP         $remote_addr;
46 
47     proxy_pass http://gitlab;
48   }
49 }

上面的配置中已经将默认的 80 端口请求自动重新指向至 443 端口。

另外,这里的证书链配置与前面 Gitlab 组合顺序不同。在 nginx 中需要将域名对应的证书置于第一位,因为要配合私钥使用,后面的证书理论上是无所谓顺序的,不过我建议按照“签发的域名证书 >> CA 根证书 >> CA 服务器证书”的顺序来组合。

做好证书配置以后,不要忘记将组合好的证书链以及域名证书解密后的私钥放到设置的目录来使用。

在我做完上面的配置,启动 nginx 的时候,遇到了提示 proxy_headers_hash 太小的错误提示,可能还需要修改 nginx 设置。


sudo editor /etc/nginx/nginx.conf

在 http 段中加入下面的内容:


proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 128;

重启 nginx 服务:


sudo service nginx restart

安装完成

安装配置完成 Gitlab 的主要部分后,建议在服务器的 hosts 文件中增加 gitlab 使用的域名 IP。


sudo editor /etc/hosts

可以直接使用回环地址,加上这条主要是为了防止本地对服务器访问异常的情况:


127.0.0.1 gitlab.huhamhire.com

然后执行一遍 Gitlab 服务器本地测试:


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

检查一切正常后,就可以访问配置好的服务器了。如果是局域网没有域名解析的话,可以改下本地的 hosts 文件。

初次登录使用默认的管理员用户名及密码,登录后可进行进一步的设置。


admin@local.host
5iveL!fe
gitlab

至此,整个 Gitlab 服务器部分的生产部署基本上就配置完成了 :-P

关键词:git , GitLab
登录后进行评论