分类
技术

部署私有 GitLab

安装

我们采用 docker 来部署 gitlab,因为镜像中打包好了gitlab依赖的所有服务,包括 Nginx、PostgreSQL、redis等,放在容器中运行不会影响系统的服务,而且 docker 容器易升级易卸载,且独立运行,不容易出现环境问题。 首先拉取 gitlab 镜像:

docker pull gitlab/gitlab-ce

然后创建一个名为 gitlab 的目录,在该目录下创建名为 volumes 的子目录用于保存 gitlab 运行时数据,同时创建 start.sh 脚本方便启动容器, start.sh的内容如下:

PWD=$(dirname `realpath $0`)
docker run -d \
  --name gitlab \
  --restart always 
  -p 10080:80 \
  -p 10022:22 \
  -v $PWD/volumes/etc:/etc/gitlab \
  -v $PWD/volumes/log:/var/log/gitlab \
  -v $PWD/volumes/opt:/var/opt/gitlab \
  gitlab/gitlab-ce

为不影响系统的 ssh 登录,我们将系统的 10022 端口映射到容器的 22 端口。执行该脚本即可启动服务。

配置

容器启动后,gitlab 会自动初始化。如果读者按照本文之前的步骤操作,此时便能够在 volumes/etc 目录下找到一个 gitlab.rb 的文件,gitlab 所有的配置都在该文件中,每次修改了该文件后,可以执行

docker exec -it gitlab gitlab-ctl reconfigure

在不重启容器的情况下重新配置 gitlab

配置 SMTP

用户注册、系统通知等都依赖于邮件,所以 SMTP 是比不可少的,我们使用的阿里云的企业邮箱,需要配置以下内容:

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.mxhichina.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "****@boostfield.com"
gitlab_rails['smtp_password'] = "******"
gitlab_rails['smtp_domain'] = "mxhichina.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_ssl'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'

注意不同的邮件服务提供商下配置可能是不同的

配置 SSH

因为我们将系统的 10022 映射到了 gitlab 的 22 端口,当用户使用 ssh 同步代码时,实际访问的是系统的 10022 端口,为了让 gitlab 在 web 页面中能正确显示库的地址,需要配置:

gitlab_rails['gitlab_shell_ssh_port'] = 10022

配置反向代理

之前说过,我们在启动容器的时候将系统的 10080 端口映射到了 gitlab 容器的 80 端口,目的是不影响系统中其它 web 服务。为了对用户屏蔽 10080 端口,还需要在系统中部署 Nginx 来做反向代理。

HTTPS

我们为 gitlab 配置了 HTTPS,以下是 Nginx 的配置:

server {
  listen 443 ssl;ssl_certificate "/path/to/cret.crt";
  ssl_certificate_key "/path/to/key.key";
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout10m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
  server_name git.boostfield.com;
  access_log /var/log/nginx/gitlab/access.log main;
  location / {
    proxy_pass http://127.0.0.1:10080;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host git.boostfield.com;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

我们用 Nginx 代理了 HTTPS,解析后又使用 HTTP 转发给 gitlab,为了能正确代理,需要配置以下参数:

external_url 'https://git.boostfield.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false