使用Docker部署GitLabEE

准备

Docker环境

已支持docker compose插件(当然,也可以转为直接docker run的指令)

(可选)SSL证书

如果需要外网HTTPS访问,则需要准备好相关SSL证书

免费的证书获取方式很多,自行搜索,这里不展开讨论

使用Compose方式部署

  1. 编写compose.yml脚本

    文件内的宿主机部分路径请根据实际情况修改,这里假定都Gitlab配置挂载到宿主机的/data/docker/mnt/gitlab目录

    映射的端口部分也请根据你的实际端口占用情况做修改

    yml 复制代码
    name: gitlab
    
    services:
    
      gitlab:
        container_name: gitlab
        image: gitlab/gitlab-ee
        privileged: true
        ports:
          # HTTP访问端口
          - "33880:80"
          # SSH端口,可以通过该端口进行sshclone
          - "33222:22"
          # HTTPS访问端口,如需HTTPS访问可开启
          # - "33443:443"
        volumes:
          - '/data/docker/mnt/gitlab/config:/etc/gitlab'
          - '/data/docker/mnt/gitlab/logs:/var/log/gitlab'
          - '/data/docker/mnt/gitlab/data:/var/opt/gitlab'
          # 如果需要配置开启HTTPS,则需要将SSL证书挂载进容器
          # - '/data/docker/mnt/ssl/ssl.crt:/ssl/ssl.crt'
          # - '/data/docker/mnt/ssl/ssl.key:/ssl/ssl.key'
        restart: always
  • Tips:如果网络环境不具备拉取Docker镜像的条件,可以通过以下两种方式解决

    1. 可以在有条件的环境下拉取镜像后将镜像进行docker save为文件后,将其上传至服务器内解压
    2. 配置docker代理

修改密码

bash 复制代码
# 进入容器内部
docker exec -it gitlab /bin/bash

# 进入控制台
gitlab-rails console -e production

# 查询id为1的用户,id为1的用户是超级管理员
user = User.where(id:1).first
# 修改密码为1234566
user.password='1234566'
# 保存
user.save!
# 退出Gitlab控制台
exit
# 退出容器
exit

(可选)配置HTTPS

本质上就是Gitlab会自行内置一个Nginx,如果不开启HTTPS,这个内置的Nginx是不会开启的

这里假设你的域名地址为gitlab.xxx.com

  1. 修改/etc/gitlab/gitlab.rb文件 (这里指容器内的路径,也可以直接修改挂载到宿主机的文件,这里配置的是/data/docker/mnt/gitlab/config/gitlab.rb;如果是二进制部署,则为/etc/gitlab/gitlab.rb)

    bash 复制代码
    # 进入容器内部
    docker exec -it gitlab /bin/bash
    
    # 编辑gitlab配置文件
    vi /etc/gitlab/gitlab.rb

    加入下面的内容

    rb 复制代码
    # 填写外部访问地址,其实写内网IP也无所谓
    external_url 'https://gitlab.xxx.com:33443'
    # 因为external_url指定的端口非443,如果不指定则会变成监听33443,而容器内应该监听443端口
    nginx['listen_port'] = 443
    # 开启强制HTTPS,即HTTP时自动重定向到HTTPS
    nginx['redirect_http_to_https'] = true
    # `/ssl`是容器内的路径,保持和DockerCompose文件内容器挂载目录一致,可以自定义
    nginx['ssl_certificate'] = "/ssl/ssl.crt"
    nginx['ssl_certificate_key'] = "/ssl/ssl.key"
    
    # 由于配置了域名,要把Gitlab内的SSH的地址做出响应修改,不然会显示未内网地址
    gitlab_rails['gitlab_ssh_host'] = 'gitlab.xxx.com'
    # SSH端口默认是22,但是我们在DockerCompose文件已经将22映射到宿主机的33222端口,其实这里也只是影响了Gitlab网页上默认显示的使用SSH方式clone的端口而已
    gitlab_rails['gitlab_shell_ssh_port'] = 33222
    # 时区配置
    gitlab_rails['time_zone'] = 'Asia/Shanghai'
  2. 使配置生效

    bash 复制代码
    # Reload配置 (有时候仅重载配置无效,必须重启,很奇怪)
    gitlab-ctl reconfigure
    
    # 或者直接重启
    gitlab-ctl restart
  • 踩坑日志
    1. 如果修改了默认的Gitlab端口,并且在external_url指定了非80或者443端口,最好一定要配置nginx['listen_port'] = 443,这个配置决定了容器内部的Nginx监听的地址,如果不配置,会变成监听external_url指定的端口,这里是33443,然而在容器内它应该监听的是443,除非在compose文件就就直接将端口映射写成33443:33443(其实感觉写成一个还更好,可以不用配置nginx['listen_port']了)
    2. 配置了域名,一定要记得修改gitlab_rails['gitlab_ssh_host']配置,否则Gitlab上默认会让你用内网IP的方式进行SSH,ssh端口同理
    3. 如果配置后无法访问,可以看看容器内的/var/opt/gitlab/nginx/conf/gitlab-http.conf文件配置是否正确,这个文件是根据gitlab.orb自动生成的

(可选)配置SMTP

前面我们已经将Gitlab的配置挂载到宿主机,所以可以直接在宿主机上修改Gitlab的配置文件,当然你也可以进入容器内修改原文件,由于大家宿主机可能各不相同,所以以进入容器内修改为例

bash 复制代码
# 进入容器内部
docker exec -it gitlab /bin/bash

# 编辑gitlab配置文件
vi /etc/gitlab/gitlab.rb
rb 复制代码
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 587
# 替换为你自己的邮箱地址
gitlab_rails['smtp_user_name'] = "[email protected]"
# 在QQ邮箱账号管理内生成一个授权码
gitlab_rails['smtp_password'] = "*********afw"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_pool'] = false
# 替换为你自己的邮箱地址
gitlab_rails['gitlab_email_from'] = "[email protected]"
gitlab_rails['gitlab_email_enabled'] = true
  • 踩坑日志

    1. gitlab_rails['smtp_enable_starttls_auto']gitlab_rails['smtp_tls']不能同时为true,但是必须开启一个
    2. gitlab_rails['smtp_enable_starttls_auto']=true时,gitlab_rails['smtp_port']端口必须为587,不能为465;
    3. 同样的,如果gitlab_rails['smtp_tls'] = true,端口应为465

生成License

参考:github.com/Lakr233/Git...

我本来尝试直接把这个写到docker compose文件内一起部署的,但是一直尝试都是报错无权限,就放弃这个方式了。。。

  1. 生成

    bash 复制代码
    docker run --rm -it \
      -v "./license:/license-generator/build" \
      -e LICENSE_NAME="Tim Cook" \
      -e LICENSE_COMPANY="Apple Computer, Inc." \
      -e LICENSE_EMAIL="[email protected]" \
      -e LICENSE_PLAN="ultimate" \
      -e LICENSE_USER_COUNT="2147483647" \
      -e LICENSE_EXPIRE_YEAR="2500" \
      ghcr.io/lakr233/gitlab-license-generator:main

    容器会自动生成两个文件

    1. license_key.pub
    2. GitLabBV.gitlab-license
  2. 拷贝

    将生成license_key.key的内容,拷贝至Gitlab容器内/opt/gitlab/embedded/service/gitlab-rails/.license_encryption_key.pub

  3. 禁ping (可选)

    修改gitlab.orb文件,追加下面这行内容

    bash 复制代码
    gitlab_rails['usage_ping_enabled'] = false
  4. 重启Gitlab

    bash 复制代码
    sudo gitlab-ctl reconfigure
    sudo gitlab-ctl restart
  5. 配置License

    1. 等待Gitlab重启后使用管理员账户登录

    2. 进入管理员模式

    3. 设置-通用-添加许可证

    4. GitLabBV.gitlab-license的内容填写到Gitlab

相关推荐
一袋米扛几楼988 小时前
【Devops】DevOps and CI/CD Pipelines
运维·ci/cd·devops
龙仔7251 天前
打造独一无二的 CI/CD 工厂:Java 应用的自动化之旅
java·spring cloud·ci/cd·自动化·devops
蜡笔小新星2 天前
DevOps实践:持续集成与持续部署完全指南
运维·开发语言·经验分享·ci/cd·devops
测试渣4 天前
如何通过自动化测试提升DevOps效率?
ci/cd·自动化·gitlab·devops
zhangpeng4555479404 天前
DevOps工具链
运维·devops
意海还念か4 天前
使用DeepSeek对Prometheus告警进行自动解析并生成处理建议发送至飞书/钉钉
飞书·prometheus·devops·deepseek
小涵5 天前
【DevOps】Backstage介绍及如何在Azure Kubernetes Service上进行部署
docker·容器·kubernetes·azure·devops·backstage
Ashmcracker6 天前
Jenkins链接私有仓库Failed to connect to repository,stderr: No ECDSA...的问题
运维·jenkins·devops
思考的Joey6 天前
Docker入门:手把手教你前端容器化部署全流程
前端·docker·devops