• 使用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服务是否开启,都需要添加这个配置

    参考资料

  • 相关阅读:
    [转]Maven 初学+http://mvnrepository.com/
    比较IDEA与Eclipse
    [web] 使用Promise封装fetch实现网络超时,终止请求的功能
    [web] 理解和使用Promise.all和Promise.race
    [Web] How to Test React and MobX with Jest
    [Web 测试] Jest单元测试的几个指标
    [Web] 取消Promise
    [安全分析] 安全分析中的威胁情报(一)
    [Web] 深入理解现代浏览器
    [Web] HTML5新特性history pushState/replaceState解决浏览器刷新缓存
  • 原文地址:https://www.cnblogs.com/mithrilon/p/13985710.html
Copyright © 2020-2023  润新知