0.为什么不用rpm包安装gitlab

gitlab rpm包需要依赖 openssh-server,而suse系统自带openssh(含client和server端)。

  1. 虽然suse自带openssh,但是rpm安装还会报错找不到依赖openssh-server
  2. 尝试网上找openssh-server的rpm包安装后会有更多依赖报错,放弃;
  3. rpm安装时尾部追加参数--nodeps --force强制跳过依赖,能正常安装完毕。但是本人在公司内网机器环境下gitlab-ctl status命令有些服务是down,查日志无果。放弃
  4. 上述更换机器、确保内存free足够的情况下,仍然不行,放弃rpm

1. 内网下以docker安装gitlab

我们准备两台Linux机器

  • 内网服务器待安装gitlab 为A(suse)
  • 可连接外网的服务器为B
1.1 安装docker
  • 自行下载匹配docker tar包,传入A。x86_64/docker-20.10.6.tgz
  • tar -xzvf docker-20.10.6.tgz
  • cp docker/* /usr/bin/
  • dockerd &
  • docker -v 有信息说明成功
    两台机器均要安装
1.2 获取镜像和配置

B机器执行

  • docker pull gitlab/gitlab-ce:latest
  • docker save gitlab/gitlab-ce:latest -o gitlab.tar
  • 下载生成的tar到本地,把tar上传到A

A机器安装镜像(参考官网文档 https://docs.gitlab.cn/jh/install/docker.html)

  • docker load < gitlab.tar
mkdir -p /data04/gitlab/config
 mkdir -p /data04/gitlab/logs
 mkdir -p /data04/gitlab/datachmod 777 /data04/gitlab/config
 chmod 777 /data04/gitlab/logs
 chmod 777 /data04/gitlab/datadocker run --detach \
 –publish 8443:443 --publish 8888:80 --publish 8222:22 \
 –name gitlab --restart unless-stopped \
 –volume /data04/gitlab/config:/etc/gitlab \
 –volume /data04/gitlab/logs:/var/log/gitlab \
 –volume /data04/gitlab/data:/var/opt/gitlab \
 –privileged=true \
 gitlab/gitlab-ce:latest

记得带上–privileged=true,让容器获取宿主机root权限。不写之后会有权限相关错误

#进入容器:
docker exec -it gitlab /bin/bash
#修改gitlab.rb:
vi /etc/gitlab/gitlab.rb

#加入如下
#gitlab访问地址,可以写域名。如果端口不写的话默认为80端口,端口和docker -p参数要对应
external_url 'http://B机器的IP'
#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '192.168.124.194'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 9922
# 让配置生效
gitlab-ctl reconfigure
# 重启
gitlab-ctl restart

启动前请参考 https://zhuanlan.zhihu.com/p/546533347 文章调小puma 核数,否则会按你机器的核数不断加线程吃内存,导致前端浏览器概率爆500、502错误,但是刷新几次又可以正常使用的情况!

注意:在修改配置文件中的external_url时,如果你的url前缀是http,则GitLab容器会在80端口提供web服务;如果你的url前缀是https,则GitLab容器会在443端口提供web服务;如果你的这个url后面带了端口,则会在相应的端口提供web服务。

注意弄好容器的端口映射关系

1.3 访问
#启动
gitlab-ctl restart

前端浏览器访问:http://B机器的IP:8888

第一次用root账号登录
root密码在
cat /data04/gitlab/etc/initial_root_password
文件中,24h该文件会被 gitlab-ctl reconfigure 删除

2.相关命令

docker stats #查看docker容器的性能消耗
docker exec -it 容器名 /bin/bash 浸入容器

3.测试ssh git clone 命令

4. 关于external_url

external_url 要不要写成 'ip:port’带端口的形式?
上述安装启动容器时--publish 8888:80参数会导致一个问题:
在external_url设置ip+port却无法访问到GitLab,如果直接设置成ip地址可以访问但是在项目的checkout地址一栏,其git地址却不包含端口号,导致http的checkout地址不可用。在用http方式clone项目需要手动补上端口号8888。
解决办法:https://zhuanlan.zhihu.com/p/46275204

  1. 首先gitlab的nginx默认监听的http访问端口是80端口,nginx conf文件在docker容器内的位置是 /var/opt/gitlab/nginx/conf/gitlab-http.conf
  2. 不考虑防火墙映射等等外部规则:我们docker run命令启动容器时--publish 8888:80参数的意思是,将容器端口80映射到宿主机8888。也就是说,我们没有改gitlab容器的默认http端口80,只是在docker映射时改到了对外宿主机的端口到8888。80到8888 是docker在“容器外”做的映射。
  3. 此时对于容器内的gitlab,是没有影响的,默认http的80端口没有改变。所以external_url的写法不需要带端口,直接ip就行了。对于docker容器外的访客来说,则需要在浏览器带端口ip:8888去访问

参考:https://www.hash070.top/archives/gitlab-withdocker.html

上述说了一大堆,总结下

  1. docker run启动镜像时,如果关于http端口的参数是--publish 80:80,那么一切正常,external_url只需要填写http://ip即可。前端浏览器访问http://ip即可;
  2. 如果关于http端口的参数是--publish 你自定义非80的端口:80external_url填写http://ip 不能带端口,前端浏览器访问http://ip:你自定义非80的端口。这样会导致一个问题:你在用http的方式clone项目的时候,http url会不带端口,导致clone失败!需要手动补充端口,例如:http://ip:你自定义非80的端口/XXX/项目名.git。(ssh clone是正常带端口的,前面在gitlab.rb配置了gitlab_shell_ssh_port)
  3. 解决2的办法来自官网:将参数改为--publish 你自定义非80的端口:你自定义非80的端口并将external_url改为http://ip:你自定义非80的端口官网这里的的例子就是--publish 8989:8989,external_url改为http://ip:8989
  4. docker 限制jvm_gitlab

  5. 已经建立容器的,就先停止容器再删除容器。但是不要将映射的配置文件删除(gitlab.rb文件),docker在删除容器的时候不会将映射的文件删除。
    当然也可以不管它……反正ssh配置好了够用……