Gitlab Install

2021-04-04 约 1941 字 预计阅读 4 分钟

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里的configssecrets修改为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的使用最好是单独给一个物理机器, 这样配置起来会比较简单

TAG: git scm gitlab
文章作者 : Cocding