Gitlab是一个开源的代码托管平台基本上可以看做是一个开源的Github平台,主要用来做私有的仓库管理和issues管理,在公司内部或者个人使用.
需要注意的地方:如果是用docker来部署22端口要留给Gitlab,host上的ssh端口可以修改成别的
1. 介绍
实际的配置过程还是遇到了不少问题, 比如SSL证书, 和原有的nginx容器冲突,gitlab-runner运行不起来等等,这里做一下记录和总结.
安装方式为docker, 版本为 Gitlab 13.11.1-ee
, 服务器环境为一个Swarm
模式的Docker集群, 由portainer
进行管理
2. 准备
2.1. SSL证书获取
本来这个版本的gitlab是可以自动获取ssl证书的(通过letsencrypt),但是前提条件是你的80端口留给acme.sh
和gitlab,
因为获取证书的过程中需要验证你的域名的所有权,如果想自动更新证书,那么所有权的验证就是走web验证这种方式,这种方式
就是acme.sh
在知道本机80端口没有使用的情况下启动一个web服务器,并把验证文件放到域名下,验证完以后删除.
如果这个服务器(物理)的80端口就是留给gitlab使用,就可以用这套机制,但是我的机器上是有nginx的,就不方便用gitlab的
自动生成和更新,所以改用手动生成.
安装cron
1
2
|
sudo apt install cron
|
安装acme.sh
1
2
3
4
5
6
|
git clone git@github.com:acmesh-official/acme.sh.git
# or 国内镜像
git clone https://hub.fastgit.org/acmesh-official/acme.sh.git
# or 原始安装脚本
curl https://get.acme.sh | sh
|
生成证书
1
2
3
4
|
cd acme.sh
# 这里的webroot一定是此域名的htdocs的root目录,域名验证文件会放到这里
acme.sh --issue -d gitlab.example.com --webroot /app/docker/data/www/gitlab.example.com/htdocs/
|
注意: 正式安装成功以后,bashrc里会多一个初始化语句. "/root/.acme.sh/acme.sh.env"
,
crontab也会多一个任务17 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
安装的时候如果下载不了,或者下载慢,可以手动下载master.tar.gz到安装目录下,然后再执行一次curl https://get.acme.sh | sh
这样就生成成功了,此步骤中会去验证网站的所属,所以要先在nginx配置好域名和指向到相应的目录,
脚本会到此目录下生成验证文件,验证完成以后会自动删除.另外证书会在60天以后自动更新
安装证书到nginx
这里是docker里的挂载的host的目录
1
2
3
|
acme.sh --install-cert -d gitlab.example.com \
--key-file /app/docker/data/gitlab/config/ssl/gitlab.example.com.key \
--fullchain-file /app/docker/data/gitlab/config/ssl/gitlab.example.com.crt
|
之后不要关闭机器上nginx的这个域名的服务,因为3个月以后会更新证书,还需要再次验证域名,
至此证书制作基本完成,配置gitlab的时候,nginx的ssl路径就是上面指定的目录和文件名
2.2. 创建目录
1
2
3
4
|
mkdir -p /app/docker/data/gitlab/logs
mkdir -p /app/docker/data/gitlab/data
mkdir -p /app/docker/data/gitlab/config
mkdir -p /app/docker/data/gitlab/config/ssl
|
2.3. 配置文件和密码文件
创建配置文件gitlab.rb
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
38
39
40
41
42
43
44
|
external_url "https://gitlab.example.com" # Must use https protocol
gitlab_rails['initial_root_password'] = File.read('/run/secrets/gitlab_root_password')
# 后来改用手动创建证书,所以这里就去掉了
letsencrypt['enable'] = false # GitLab 10.5 and 10.6 require this option
# letsencrypt['enable'] = true # GitLab 10.5 and 10.6 require this option
# letsencrypt['contact_emails'] = ['ohergal@gmail.com'] # Optional
# letsencrypt['auto_renew'] = true # Auto renew ssl cert
# This example renews every 7th day at 12:30
# Default installations schedule renewals after midnight on every 4th day
# letsencrypt['auto_renew_hour'] = "12"
# letsencrypt['auto_renew_minute'] = "30"
# letsencrypt['auto_renew_day_of_month'] = "*/7"
# registry_external_url "https://registry.example.com" # container registry, must use https protocol
# mattermost_external_url "https://mattermost.example.com" # mattermost, must use https protocol
# registry_nginx['ssl_certificate'] = "path/to/cert" # Must be absent or commented out
# nginx和ssl配置
nginx['enable'] = true
nginx['client_max_body_size'] = '10240m'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"
nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
nginx['ssl_prefer_server_ciphers'] = "on"
nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
nginx['ssl_session_cache'] = "builtin:1000 shared:SSL:10m"
nginx['listen_addresses'] = ["0.0.0.0"]
nginx['http2_enabled'] = true
# 邮箱配置部分
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.ym.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "noreply-gitlab@example.com"
gitlab_rails['smtp_password'] = "xxxxxxxxxxxxx"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = 'noreply-gitlab@example.com'
gitlab_rails['smtp_domain'] = "smtp.ym.163.com"
gitlab_rails['gitlab_email_from'] = 'noreply-gitlab@example.com'
gitlab_rails['gitlab_email_reply_to'] = 'noreply-gitlab@example.com'
|
创建密码文件root_password.txt
1
|
MySuperSecretAndSecurePass0rd!
|
注意
这一步也可以不在compose-file
里,如果是用集成管理系统,比如portainer
,可以直接在系统里定义
然后在compose-file
里的configs
和secrets
修改为external: true
2.4. compose file
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
38
39
40
41
42
43
44
45
46
47
48
|
version: "3.6"
services:
gitlab-server:
image: gitlab/gitlab-ee:latest
ports:
- "22:22"
# - "80:80"
- "443:443"
volumes:
- '/etc/localtime:/etc/localtime:rw'
- /app/docker/data/gitlab/data:/var/opt/gitlab
- /app/docker/data/gitlab/logs:/var/log/gitlab
- /app/docker/data/gitlab/config:/etc/gitlab
environment:
GITLAB_OMNIBUS_CONFIG: "from_file('/omnibus_config.rb')"
configs:
- source: gitlab
target: /omnibus_config.rb
secrets:
- gitlab_root_password
networks:
xsudo-network-app:
aliases:
- gitlab-server
# gitlab-runner:
# image: gitlab/gitlab-runner:alpine
# deploy:
# mode: replicated
# replicas: 1
networks:
xsudo-network-app:
name: xsudo-network-app
external: true
configs:
gitlab:
external: true
secrets:
gitlab_root_password:
external: true
# configs:
# gitlab:
# file: ./gitlab.rb
# secrets:
# gitlab_root_password:
# file: ./root_password.txt
|
2.5. 尝试代理gitlab的443
尝试了很多方法, 具体可以去issue上查看整个过程
生成ssl证书给前端和gitlab服务器之间通信使用
1
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout gitlab.key -out gitlab.crt
|
用stream的方式不成功,因为stream类似tcp协议层的转发,所以相当于443端口就全部转发到后端,没办法定义server_name
所以还是尝试ssl协议转发
2.6. 测试邮件服务器
1
2
3
4
5
6
|
gitlab-ctl reconfigure
#打开gitlab控制台
gitlab-rails console
#发送邮件测试
Notify.test_email('xxxxxx@163.com','gitlab邮件配置','测试邮件内容').deliver_now
|
3. reference
4. conclusion
gitlab的使用最好是单独给一个物理机器, 这样配置起来会比较简单