使用Docker安装配置GitLab CE

本文介绍使用Docker在本地安装GitLab CE。写作本文时,使用的GitLab版本是13.5.4。

基本安装

使用Docker安装GitLab最基本的命令如下:

  docker run --name "my-gitlab"               \
    --hostname "my-gitlab"                  \
    -p 80:80                                \
    --restart unless-stopped                \
    -d gitlab/gitlab-ce:latest

上例中,容器名和容器系统的 hostname 都设置为 my-gitlab。后续示例中,也基本会使用这个配置。容器这里只映射了 80 端口,其他的端口配置会在后续示例中说明。

容器启动成功后,可以在浏览器中通过 http://localhost 地址访问。在第一次访问里,会提示设置 root 密码:

映射目录

GitLab中主要三个目录需要被映射出来,分别是

  • /etc/gitlab : 配置文件目录。GitLab的主要配置文件 gitlab.rb 保存在这个目录
  • /var/opt/gitlab :GitLab的运行目录和数据保存目录
  • /var/log/gitlab : GitLab的日志目录

如下例将这三个目录映射到宿主机:

  docker run --name "my-gitlab"               \
            --hostname "my-gitlab"                  \
            -p 80:80                                \
            -v ${GITLAB_HOME}/config:/etc/gitlab    \
            -v ${GITLAB_HOME}/data:/var/opt/gitlab  \
            -v ${GITLAB_HOME}/log:/var/log/gitlab   \
            --restart unless-stopped                \
          -d gitlab/gitlab-ce:latest

配置域名

GitLab的外部域名配置会影响URL生成和其他多个方面。例如在使用前文中的方式启动GitLab容器后,生成的clone URL如下图:

这个URL很可能使用的不是期望的对外域名。本节会介绍两种调整的方式。

指定容器hostname

在启动GitLab容器时,指定 hostname

  docker run --name "my-gitlab"               \
      --hostname "my-gitlab.com"              \
      -p 80:80                                \
      -v ${GITLAB_HOME}/config:/etc/gitlab    \
      -v ${GITLAB_HOME}/data:/var/opt/gitlab  \
      -v ${GITLAB_HOME}/log:/var/log/gitlab   \
      --restart unless-stopped                \
      -d gitlab/gitlab-ce:latest

当没有在配置文件 config/gitlab.rb 中配置 external_url 时,GitLab会读取系统的 hostname 作为域名:

修改配置

更可靠的方式是修改 config/gitlab.rb 中的 external_url

  external_url 'http://my-gitlab.com'

保存后可以在GitLab容器中执行以下命令来查看配置变更:

  # docker exec -it my-gitlab gitlab-ctl diff-config
  diff --git a/etc/gitlab/gitlab.rb b/opt/gitlab/etc/gitlab.rb.template
  index 5f49511..c322a57 100644
  --- a/etc/gitlab/gitlab.rb
  +++ b/opt/gitlab/etc/gitlab.rb.template
  @@ -30,7 +30,6 @@
   ##! address from AWS. For more details, see:
   ##! https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html
   # external_url 'GENERATED_EXTERNAL_URL'
  -external_url 'http://my-gitlab.com'

   ## Roles for multi-instance GitLab
   ##! The default is to have no roles enabled, which results in GitLab running as an all-in-one instance.

接下来可以执行以下命令使配置变更生效:

  docker exec -it my-gitlab gitlab-ctl reconfigure

命令执行成功后,可以看到和设置容器hostname同样的效果。

创建新项目

创建新项目时显示的项目URL前缀只和浏览器当前host有关,和其他配置没有关系,也不会影响其他地方的URL。比如修改本地 hosts 文件将域名设置为一个任意值后,访问GitLab:

开启HTTPS

如果要在GitLab自带的Nginx上开启HTTPS, 需要进行以下配置。

首先,在启动容器时需要添加443端口映射,例如:

  docker run --name "my-gitlab"               \
      --hostname "my-gitlab"                  \
      -p 80:80                                \
      -p 443:443                              \
      -v ${GITLAB_HOME}/config:/etc/gitlab    \
      -v ${GITLAB_HOME}/data:/var/opt/gitlab  \
      -v ${GITLAB_HOME}/log:/var/log/gitlab   \
      --restart unless-stopped                \
      -d gitlab/gitlab-ce:latest

然后修改 config/gitlab.rb 中的 external_url ,使用HTTPS:

  external_url 'https://my-gitlab.com'

执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使变更生效。gitlab会在 config/ssl 目录下生成自签名证书,但因为没有CA认证,所以重配置命令最后会报证书检查错误,不过不影响配置生效。

现在可以使用浏览器访问 https://my-gitlab.com 了。同样由于证书没有CA认证,浏览器会有安全警告,需要手动接受证书或者访问会被阻止。

配置证书

如果有CA认证证书,可以按照以下步骤安装和配置。

首先将认证证书和密钥文件放置在 config/ssl 目录下,然后修改NGINX的SSL证书配置。例如:

  nginx['ssl_certificate'] = "/etc/gitlab/ssl/my-gitlab.com.pem"
  nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/my-gitlab.com.key"

这里假设已经按照上文的方式将 /etc/gitlab 目录映射到宿主机上。当然,证书和密钥也可以放在其他容器可以访问到的目录下,对应修改配置中的目录地址就可以了。

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使变更生效。接下来就可以完全正常的通过浏览器访问安全地址了。

注意,必须要将 external_url 配置为HTTPS地址,GitLab才会开启HTTPS,只配置证书不会开启HTTPS。

配置HTTP跳转

当HTTPS开启之后,GitLab会关闭HTTP访问。此时可以配置GitLab将HTTP请求转发到HTTPS,但不能只以HTTP方式访问。

修改 config/gitlab.rb 添加以下配置:

  nginx['redirect_http_to_https'] = true
  nginx['redirect_http_to_https_port'] = 80

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使变更生效。此时,再访问HTTP地址,就会跳转到HTTPS。

配置SSH端口

使用Docker部署GitLab,由于一般22端口已经被宿主服务器使用了,需要将GitLab SSH服务的22端口映射到其他端口。接下来以使用8122端口为例。

在创建GitLab容器里,将22端口映射到8122端口:

  docker run --name "my-gitlab"               \
            --hostname "my-gitlab"                  \
            -p 80:80                                \
            -p 8122:22                                \
            -v ${GITLAB_HOME}/config:/etc/gitlab    \
            -v ${GITLAB_HOME}/data:/var/opt/gitlab  \
            -v ${GITLAB_HOME}/log:/var/log/gitlab   \
            --restart unless-stopped                \
          -d gitlab/gitlab-ce:latest

然后在 config/gitlab.rb 中添加以下配置:

  gitlab_rails['gitlab_shell_ssh_port'] = 8122

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使变更生效。此时,可以看到项目中的clone URL发生了变化:

注意,这个配置只会使页面上显示的URL发生变化,并不会使GitLab容器里的SSH服务监听的端口发生变化。

关闭自带NGINX

GitLab自带的NGINX可以关闭,但此时需要配置Workhorse服务,因为默认情况下Workhorse只监听Unix Socket。

config/gitlab.rb 中添加以下配置:

  nginx['enable'] = false
  gitlab_workhorse['listen_network'] = "tcp"
  gitlab_workhorse['listen_addr'] = "0.0.0.0:8181"

上例中的配置将使Workhorse监听8181端口。保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使变更生效。

注意:在启动容器时需要将Workhorse监听的端口映射出来。

使用外部PostgreSQL数据库

GitLab默认使用自带的PostgreSQL数据库,但在正式环境中会希望使用外部的数据库。可以按照以下步骤进行配置。

注意:要使用GitLab对应的数据库版本,此文使用的是PostgreSQL 11.10。可以查考官方文档PostgreSQL Requirements,最好使用Minimum version。

创建数据库role

建议给GitLab创建单独的role用来访问数据库。这个role需要有创建数据库的权限,因为GitLab在初始化数据库时需要创建新库。例如,创建名为 gitlab 的role:

  CREATE ROLE gitlab WITH LOGIN PASSWORD 'mypassword' SUPERUSER;

GitLab在初始化数据库的时候,需要superuser权限去执行一些操作。

配置GitLab并初始化数据库

GitLab在默认配置下使用自带的PostgreSQL数据库。如果要使用外部数据库,需要在 config/gitlab.rb 中添加以下配置:

  postgresql['enable'] = false
  gitlab_rails['db_adapter'] = "postgresql"
  gitlab_rails['db_encoding'] = "unicode"
  gitlab_rails['db_database'] = "gitlabhq_production"
  gitlab_rails['db_username'] = "gitlab"
  gitlab_rails['db_password'] = "mypassword"
  gitlab_rails['db_host'] = "192.168.1.18"
  gitlab_rails['db_port'] = 5432

这里的配置使用了前一小节中创建的role。 db_hostdb_port 根据环境做对应的调整。

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使配置生效。但此时重载配置的命令最后会报错,如果错误内容是提示PostrgreSQL中数据库不存在,这是正常现象,可以继续执行下一步操作。如果报错内容是其他错误,则需要根据错误内容调整环境配置。

接下来需要对数据库进行初始化,执行以下命令:

  docker exec -it my-gitlab gitlab-rake gitlab:setup

注意:这个操作会将配置文件中指定数据库中的数据清空,如果数据库已经存在,请根据自身情况备份数据。

操作正常完成后,GitLab已经开始使用外部数据库了。

建议此时去掉数据库账号的superuser权限:

  ALTER ROLE gitlab NOSUPERUSER;

使用外部Redis

GitLab默认使用自带的Redis。如果需要使用外部Redis,需要在 config/gitlab.rb 中添加以下配置:

  redis['enable'] = false
  gitlab_rails['redis_host'] = "192.168.1.18"
  gitlab_rails['redis_port'] = 6379
  gitlab_rails['redis_password'] = "mypass"
  gitlab_rails['redis_database'] = 0

以上配置中,redis_hostredis_portredis_database根据环境指定。如果Redis没有设置密码,则不需要 gitlab_rails['redis_password'] 项。

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使配置生效。

关闭自带监控报警

GitLab自带prometheus,altermanger,node_exporter和gitlab_exporter,可以通过添加以下配置将这些服务全部关闭:

  prometheus_monitoring['enable'] = false

保存配置修改后,执行 docker exec -it my-gitlab gitlab-ctl reconfigure 使配置生效。

配置Nginx反向代理

通常情况下都会在GitLab前放置一个Nginx做为服务的反向代理。这时,需要对Nginx和GitLab的配置都做出调整。

例如,首先在用来做反向代理的Nginx中,添加以下服务配置:

  upstream gitlab-workhorse {
      server 192.168.1.18:8181;
  }

  server {
    listen *:80;

    server_name my-gitlab;
    server_tokens off; 

    gzip on;

    proxy_set_header Host $http_host_with_default;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    location / {
      proxy_cache off;
      proxy_pass  http://gitlab-workhorse;
    }
  }

以上配置中,假设GitLab服务监听的是 192.168.1.18 上的 8181 端口。X-Real-IPX-Forwarded-For两个Header用来向GitLab服务传递客户端的真实IP。

为了让GitLab后端能够正常从从X-Real-IPX-Forwarded-For 中读取客户端的IP,需要在 config/gitlab.rb 添加以下配置:

  nginx['real_ip_trusted_addresses'] = ['192.168.1.0/24', '172.17.0.0/24']

当Nginx代理也是Docker容器时,其IP有可能是172.17.0.0网段,所以这里也在配置中添加了这个网段。

注意:无论GitLab自带的Nginx服务是否开启,都需要添加这个配置

参考资料

posted @ 2020-11-16 19:26  不写日记  阅读(9065)  评论(0编辑  收藏  举报