安装
我们采用 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