在Docker上部署Gitlab-CE私有云环境
应用环境
Ubuntu 20.04.6 LTS (GNU/Linux 5.15.0-139-generic x86_64)
Docker version 28.1.1, build 4eba377
文章目录
-
- 拉取容器镜像
- 生成Run脚本
-
- 参数解读
- 实例脚本
- 环境配置
- 管理员密码遗忘
- 服务邮箱配置
-
- 邮件测试
- 运维问题集锦
-
- (1) 端口映射关系
- (2) 服务日志
- (3) 分支受保护
- 项目操作
-
- (1) 建立群组
- (2) 创建项目
- (3) 项目的版本控制
拉取容器镜像
sudo apt-get update## gitlab-ce:17.9.6-ce.0docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.9.6-ce.0## gitlab-ce:17.10.4-ce.0docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0## 添加标签名Tagdocker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0 docker.io/gitlab/gitlab-ce:17.10.4-ce.0## 移除标签名Tagdocker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/gitlab/gitlab-ce:17.10.4-ce.0
国内镜像参考:
渡渡鸟镜像
清华大学开源软件镜像
生成Run脚本
可参考:渡渡鸟-Run助手
参数解读
# 将镜像进实例化成容器并运行docker run# 【i】保持STDIN(标准输入)开放,即使没有附加任何东西。这通常用于让容器的进程保持运行,即使没有附加到终端。例如,你可以在容器内部运行一个交互式shell# 【t】分配一个伪终端(pseudo-TTY),这对于交互式shell非常重要,比如当你想要在容器中运行bash或sh时。# 【d】后台运行,即所谓的“detached”模式。容器会在后台启动,并且你会得到容器的ID或名称-itd# 容器命名--name gitlab-ce# 重启策略## no:不自动重启,缺省时默认## always:始终重启## unless-stopped:Docker 服务重启后自动启动容器,除非容器被手动停止。可指定最大重试次数,例如 --restart=on-failure:3(最多重启3次)。## on-failure:仅在容器非正常退出(退出状态码非0)时重启。--restart=always \\# 【p】映射策略,:## 比如gitlab,22为ssh协议;80为http协议;443为https协议-p 1022:22 \\-p 81:80 \\-p 10443:443 \\# 使用本地时区-e TimeZone=\'Asia/Shanghai\' \\-e TZ=\'Asia/Shanghai\' \\-v /etc/localtime:/etc/localtime \\# Host域名映射--add-host=gitlab.oh.com:172.10.3.200 \\# 挂载卷映射(宿主:容器)## /etc/gitlab:配置文件## /var/log/gitlab:日志数据## /var/opt/gitlab:应用数据-v /gitlab-ce/config:/etc/gitlab \\-v /gitlab-ce/logs:/var/log/gitlab \\-v /gitlab-ce/data:/var/opt/gitlab \\# 让容器获取宿主机root权限--privileged=true \\# 最后一行所引用的docker镜像源
实例脚本
建议http服务,不要使用默认的80端口。很容易与其它docker容器服务或宿主机其它服务冲突,比如宿主机安装的nginx、apache服务。
docker run -itd \\--name gitlab-ce \\--restart=always \\-p 1022:22 \\-p 81:80 \\-p 10443:443 \\-e TimeZone=\'Asia/Shanghai\' \\-e TZ=\'Asia/Shanghai\' \\-v /etc/localtime:/etc/localtime \\-v /gitlab-ce/config:/etc/gitlab \\-v /gitlab-ce/logs:/var/log/gitlab \\-v /gitlab-ce/data:/var/opt/gitlab \\--privileged=true \\docker.io/gitlab/gitlab-ce:17.10.4-ce.0
环境配置
# 打开配置文件sudo vim /gitlab-ce/config/gitlab.rb
编辑内容如下
## GitLab URLexternal_url \'http://192.168.1.50\'## GitLab SSHgitlab_rails[\'gitlab_ssh_host\'] = \'192.168.1.50\'gitlab_rails[\'time_zone\'] = \'Asia/Shanghai\'### GitLab Shell settings for GitLabgitlab_rails[\'gitlab_shell_ssh_port\'] = 1022# gitlab_rails[\'gitlab_shell_git_timeout\'] = 800
输入:wq
保存退出后,进入Gitlab bash控制台
sudo docker exec -it gitlab-ce bash# 更新配置gitlab-ctl reconfigure#修改gitlab.ymlvi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
内容如下
提示
如果不在Gitlab bash控制台中打开,则在宿主机/gitlab-ce/data/gitlab-rails/etc/gitlab.yml
打开编辑
sudo vim /gitlab-ce/data/gitlab-rails/etc/gitlab.yml
重启服务
sudo docker restart gitlab-ce
输入:wq!
保存退出后,重启容器
gitlab-ctl restart
执行结果如下
当成功执行后,会生成容器ID(docker后端会直接开始运行该容器)。通过portainer-ce WEB端查看,就能看到当前运行状态
当运行状态呈现绿色时,就可以直接访问容器Web端了。在访问前,需要先查看Gitlab实例化时随机生成的root密码(注意密码仅24小时内有效)
# 先退出Gitlab控制台exit# 查看root初始化密码sudo cat initial_root_password
内容如下
登录到Web端后,先修改显示语言:
- 左侧导航栏右上角头像,进入【Preferences】偏好设置。
- 拉到最下面【Localization】本地化,将【Language】语言,设置为【Chinese, Simplified】中文。
- 再拉到底,直接【Save changes】保存。
保存成功后,直接刷新页面或直接按F5即可。之后再进入左侧导航栏【密码】,修改root密码即可。
提示
如果宿主机是虚拟机环境(比如Ubuntu Sublinux with WSL),那仍需将GitLab私有服做物理网络穿透。否则宿主机所在局域中其它计算机仍无法访问该Gitlab服务。
管理员密码遗忘
直接进入Gitlab bash控制台
sudo docker exec -it gitlab-ce bash--连接gitlab数据库(#号前缀是控制台提示符状态)gitlab-rails console -e production## 执行结果-------------------------------------------------------------------------------- Ruby: ruby 3.2.5 (2024-07-26 revision 31d0f1a2e7) [x86_64-linux] GitLab: 17.6.1 (8a31863db02) FOSS PostgreSQL: 14.11------------------------------------------------------------[ booted in 32.61s ]Loading production environment (Rails 7.0.8.4)irb(main):001:0>--修改root密码# 查找并指向到root账号irb(main):005:0> user = User.find_by(username: \'root\')=> ## 修改root密码(注意第2遍为确认密码),user.save即为保存irb(main):006:0> user.password = \'S87fdj@&yhkk\'irb(main):007:0> user.password_confirmation = \'S87fdj@&yhkk\'irb(main):008:0> user.save!=> trueirb(main):009:0> exit# 退出Gitlab bash控制台root@2a11f26e011d:/# exit
服务邮箱配置
# 打开配置文件sudo vim /gitlab-ce/config/gitlab.rb
追加内容如下
### GitLab email server settings###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html###! **Use smtp instead of sendmail/postfix.**gitlab_rails[\'smtp_enable\'] = truegitlab_rails[\'smtp_address\'] = \"smtp.qq.com\"gitlab_rails[\'smtp_port\'] = 465gitlab_rails[\'smtp_user_name\'] = \"admin@smtp.com\"gitlab_rails[\'smtp_password\'] = \"S87fdj@&yhkk\"gitlab_rails[\'smtp_domain\'] = \"qq.com\"gitlab_rails[\'smtp_authentication\'] = \"login\"gitlab_rails[\'smtp_enable_starttls_auto\'] = falsegitlab_rails[\'smtp_tls\'] = true# gitlab_rails[\'smtp_pool\'] = false###! **Can be: \'none\', \'peer\', \'client_once\', \'fail_if_no_peer_cert\'**###! Docs: http://api.rubyonrails.org/classes/ActionMailer/Base.htmlgitlab_rails[\'smtp_openssl_verify_mode\'] = \'none\'# gitlab_rails[\'smtp_ca_path\'] = \"/etc/ssl/certs\"# gitlab_rails[\'smtp_ca_file\'] = \"/etc/ssl/certs/ca-certificates.crt\"### Email Settingsgitlab_rails[\'gitlab_email_enabled\'] = true##! If your SMTP server does not like the default \'From: gitlab@gitlab.example.com\'##! can change the \'From\' with this setting.gitlab_rails[\'gitlab_email_from\'] = \'master@gitlab.com\'gitlab_rails[\'gitlab_email_display_name\'] = \'GitLab CE\'gitlab_rails[\'gitlab_email_reply_to\'] = \'master@gitlab.com\'# gitlab_rails[\'gitlab_email_subject_suffix\'] = \'\'# gitlab_rails[\'gitlab_email_smime_enabled\'] = false# gitlab_rails[\'gitlab_email_smime_key_file\'] = \'/etc/gitlab/ssl/gitlab_smime.key\'# gitlab_rails[\'gitlab_email_smime_cert_file\'] = \'/etc/gitlab/ssl/gitlab_smime.crt\'# gitlab_rails[\'gitlab_email_smime_ca_certs_file\'] = \'/etc/gitlab/ssl/gitlab_smime_cas.crt\'
邮件测试
输入:wq
保存退出后,进入Gitlab bash控制台
sudo docker exec -it gitlab-ce bash# 更新配置gitlab-ctl reconfigure# 重启gitlab-ctl服务gitlab-ctl restart# 邮件测试gitlab-rails console -e productionNotify.test_email(\'admin@smtp.com\', \'Subject\', \'Body\').deliver_now
邮箱有收到邮件,就表示配置成功!
运维问题集锦
(1) 端口映射关系
# 登录gitlab控制台sudo docker exec -it gitlab-ce bash# 查看运行进程netstat -ltwen# 查看宿主机运行进程sudo netstat -tunlpsudo netstat -aptn##查看指定端口占用情况sudo ps aux | grep \'xrdp*\'sudo netstat -tunlp | grep 端口号
(2) 服务日志
# 宿主机docker跟踪## 参数:--tail 10表示实时跟踪最新的10条记录sudo docker logs -f gitlab-ce --tail 10# 直接进入如下路径,Gitlab容器内相关子服务进程日志都在这里,比如nginx、redis、reconfigure重载配置实例化记录等等cd /gitlab-ce/logs/# 将地址解析添加到hosts列表echo \"192.168.1.50 gitlab.local\" | sudo tee -a /etc/hosts# 查看配置内容, 仅输出有效的配置项sudo cat gitlab.rb | grep -vE \'^#|^$\'
(3) 分支受保护
错误信息【IntelliJ Idea or WebStorm】
remote: GitLab: You are not allowed to push code to protected branches on this project.
不允许将代码推送到此项目的受保护分支。
错误信息【Visual Sutdio】
Git failed with a fatal error.Unencrypted HTTP is not recommended for Gitlab. Ensure the repository remote URL is using HTTPS.
Git失败并出现致命错误。不建议对Gitlab使用未加密的HTTP。确保存储库远程URL使用HTTPS。该错误也是因为支分保护的问题,本身极狐官方不推荐在http协议下进行远程操作代码。推荐是采用
https或SSH
代码操作方案。
打开项目【设置】-【仓库】-【受保护分支】一栏
将允许推送和合并角色调整为如图(含开发角色),或者直接取消保护也可以(选项是立即生效的)。
项目操作
(1) 建立群组
(2) 创建项目
(3) 项目的版本控制
在解决方案中,经常会存在多个项目和项目目录,经常需要处理忽略对某个项目、项目里某个文件夹、文件的版本跟踪控制。
忽略某个项目版本控制,在解决方案根下的.gitignore文件,按下图添加该目录路径即可。
忽略文件夹版本控制(含子目录及文件),编辑项目根下的.gitignore文件,按下图添加该目录路径即可。
忽略某个文件,在上图中# Editor directories and files
一切直接放入文件名就可以了。当然主文件名或扩展名是支持通配符的。