介绍

  • 本文介绍了在docker下搭建Gitlab并使用的流程以及部分注意细节
  • 教程搭建环境基于Ubuntu24.04环境搭建
  • 整个组网是nginx反向代理docker中的Gitlab服务

部署Gitlab

拉起docker

1
2
3
4
5
6
7
8
9
docker run -d \
--name gitlab \
--restart unless-stopped \
-p 127.0.0.1:5000:80/tcp \
-p 127.0.0.1:5100:22/tcp \
-v ./etc:/etc/gitlab \
-v ./opt:/var/opt/gitlab \
-v ./log:/var/log/gitlab \
gitlab/gitlab-ce:latest
  • 这里拉起docker映射出来两个端口,5000对应内部80,走http;5100对应内部22,走ssh,也就是git方式;
  • 有一点需要注意,这里的5000和5100两个口并不是实际使用的端口,后面通过nginx反向代理监听的才是真正使用的端口
  • 将配置目录、数据目录、日志目录映射出来,方便使用和数据持久化

修改配置

docker将gitlab服务拉起后会生成所有配置文件和数据
gitlab的配置文件是在/etc/gitlab目录下,我们映射出来后就是当前目录下的etc,主要修改的配置文件是etc/gitlab.rb
这里只列出需要修改的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置外部URL,这个值会出现在gitlab的界面上,当你创建或者克隆仓库时生成地址使用的就是这个
# 我这里配置的是ssl,也可以写ip或者http
external_url 'https://yourdomain.com'

# 配置git的地址,当使用ssh来提交或者下载代码时使用的域名或者ip
gitlab_rails['gitlab_ssh_host'] = 'git.yourdomain.com'
# 该参数配置对外显示的git的地址端口号,注意该值仅仅只是界面生成信息的内容,内部真正监听的还是22端口
gitlab_rails['gitlab_shell_ssh_port'] = 2222

# 配置时区
gitlab_rails['time_zone'] = 'Asia/Shanghai'

# 关闭内部自带nginx模块,因为这里不需要,有外部的nginx
nginx['enable'] = false
# 修改服务监听方式
gitlab_workhorse['listen_network'] = "tcp"
# 修改服务监听端口
gitlab_workhorse['listen_addr'] = "0.0.0.0:80"

# 将nginx的服务器ip添加到信任列表中
gitlab_rails['trusted_proxies'] = ['192.168.0.10']

修改完配置文件后docker restart gitlab重启镜像以生效配置

登陆和密码

在配置目录下还有个文件initial_root_password这里记录着root的初始密码,该文件只生成一次,一定时间后会自动删除,也可以手动删除
首次登陆时输入用户名root和密码即可登陆成功!

修改密码

如果想要修改密码,一种方式是直接登陆进去在设置中修改
但是如果还没有登陆或者密码忘记了,则需要进入gitlab镜像中命令行进行修改(未实操,完全抄录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 进入容器内部
docker exec -it gitlab /bin/bash

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

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

nginx的配置

这里使用nginx统一进行ssl认证和代理,配置有两部分:

  • 代理https
    该配置写在http中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
    }
    server {
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name yourdomain.com;
    charset utf-8;

    ssl_certificate /your/cert/path;
    ssl_certificate_key /your/key/path;

    location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:5000;
    client_max_body_size 20480m;
    }
    }
  • 代理ssh
    这里注意以下配置和http模块同级别,不要写在http中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    stream {
    upstream gitlab {
    server 127.0.0.1:5100;
    }
    server {
    listen 2222;
    proxy_pass gitlab;
    proxy_connect_timeout 600s;
    proxy_timeout 600s;
    }
    }

ssh key的配置

通过将对应环境的ssh key配置到gitlab上,就可以不需要手动认证进行拉取和提交项目

通用配置

  1. 首先需要在环境上生成公私密钥对
    1
    ssh-keygen -t rsa -C 'xxx@xxx.com'   # -C 参数是你的邮箱地址
    然后所有选项全部回车就行
  2. 然后需要将生成的~/.ssh/id_rsa.pub文件的内容复制
  3. 打开gitlab,点击以下路径进行设置:(版本之间存在差异,当前版本:18.3)
    头像 -> Preferences -> SSH Keys -> Add new key
    在key里填写第二步复制的公钥,然后设置好标题,权限和过期时间后点击添加即可

配置多个ssh key

常见的一种场景,github和gitlab都需要配置ssh key,主要由于使用的不同邮箱,否则设置一个即可
此时就需要给两个邮箱分别生成一对密钥进行配置

  1. 创建密钥:
    1
    2
    ssh-keygen -t rsa -C 'email@xx.com' -f ~/.ssh/gitlab_id-rsa
    ssh-keygen -t rsa -C 'email@xx.com' -f ~/.ssh/github_id-rsa
  2. 因为自己设置的名字,所以需要通过配置文件进行指定平台登陆时用哪对密钥
    创建~/.ssh/config文件进行配置,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # github
    Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id-rsa

    # gitlab
    Host gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab_id-rsa
  3. 按通用配置相同的方法在对应平台上添加对应的公钥,就可以使用了

排错:一般情况下因为HostHostName配置的有问题

  • 错误一,因为Host配置有问题导致的没有匹配到本地正确的私钥导致的权限报错

    1
    2
    3
    4
    5
    6
    Cloning into 'xxx'...
    git@git.github.com: Permission denied (publickey).
    fatal: Could not read from remote repository.

    Please make sure you have the correct access rights
    and the repository exists.
  • 错误二,因为HostName配置有问题导致的报错

    1
    2
    3
    4
    5
    6
    Cloning into 'xxx'...
    ssh: Could not resolve hostname xxxx: nodename nor servname provided, or not known
    fatal: Could not read from remote repository.

    Please make sure you have the correct access rights
    and the repository exists.

参考