docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
性能测试 PTS,5000VUM额度
简介: docker 搭建 最新版本的 gitlab,使用HTTPS访问,以及gitlab的基础使用讲解

一、环境准备

1.1 docker 安装

  • 卸载旧版本的Docker(如果已安装)
    sudo apt-get remove docker docker-engine docker.io containerd runc
    
  • 更新Ubuntu的软件包列表:
sudo apt update
  • 安装Docker所需的依赖包

    sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
    
  • 添加Docker的官方GPG密钥:

添加Docker的官方GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加Docker的APT存储库:

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 再次更新软件包列表,并安装Docker引擎
sudo apt update  
sudo apt install docker-ce docker-ce-cli containerd.io -y
  • 启动Docker服务并设置为开机自启:
sudo systemctl start docker  
sudo systemctl enable docker
  • 验证Docker安装是否成功
    docker version
    

    二、gitlab 搭建

    2.1 环境准备

  • 镜像下载
    docker pull gitlab/gitlab-ee:16.11.4-ee.0
    
  • 创建持久化数据目录

创建目录用于持久化存储配置(config)、日志(logs)、数据(data)和证书(SSL):

sudo mkdir -p /data/gitlab/config /data/gitlab/logs /data/gitlab/data /data/gitlab/ssl
  • 复制 SSL 证书

将SSL 证书文件(例如 gitlab.example.com.crt 和 gitlab.example.com.key)复制到 /data/gitlab/ssl 目录:

sudo cp /path/to/your/gitlab.example.com.crt /data/gitlab/ssl/
sudo cp /path/to/your/gitlab.example.com.key /data/gitlab/ssl/
  • 确保文件权限正确:
    sudo chmod 600 /data/gitlab/ssl/gitlab.example.com.crt
    sudo chmod 600 /data/gitlab/ssl/gitlab.example.com.key
    

    2.2 启动gitlab容器

使用 Docker 启动 GitLab 容器,配置 HTTPS 和持久化存储:

  sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 80:80 --publish 443:443 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume /data/gitlab/config:/etc/gitlab \
  --volume /data/gitlab/logs:/var/log/gitlab \
  --volume /data/gitlab/data:/var/opt/gitlab \
  --volume /data/gitlab/ssl:/etc/gitlab/ssl \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'https://gitlab.example.com'; nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.example.com.crt'; nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.example.com.key';" \
  gitlab/gitlab-ee:16.11.4-ee.0

例如:

docker run --detach \
  --hostname gitlab.book.com \
  --publish 80:80 --publish 443:443 --publish 2222:22 \
  --name gitlab \
  --restart always \
  --volume /data/gitlab/config:/etc/gitlab \
  --volume /data/gitlab/logs:/var/log/gitlab \
  --volume /data/gitlab/data:/var/opt/gitlab \
  --volume /data/gitlab/ssl:/etc/gitlab/ssl \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'https://gitlab.cashbook.cc'; nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.book.com.crt'; nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.book.com.key';" \
  gitlab/gitlab-ee:16.11.4-ee.0

参数解释及作用

1、docker run --detach:

docker run: 启动一个新的 Docker 容器。
--detach: 以分离模式运行容器,即在后台运行。

2、--hostname gitlab.example.com:

设置容器的主机名,这将是 GitLab 实例在网络上的标识。

3、--publish 80:80 --publish 443:443 --publish 2222:22:

--publish (或 -p): 映射主机端口到容器端口。
80:80: 将主机的 80 端口映射到容器的 80 端口,用于 HTTP 访问。
443:443: 将主机的 443 端口映射到容器的 443 端口,用于 HTTPS 访问。
2222:22: 将主机的 2222 端口映射到容器的 22 端口,用于 SSH 访问。

4、--name gitlab:

指定容器的名称为 gitlab。
--restart always:

设置容器的重启策略为总是重启,即使容器崩溃或 Docker 服务重启后,容器也会自动重启。

5、--volume /srv/gitlab/config:/etc/gitlab:

挂载主机的 /srv/gitlab/config 目录到容器的 /etc/gitlab 目录,用于存储 GitLab 配置文件。

6、--volume /srv/gitlab/logs:/var/log/gitlab:

挂载主机的 /srv/gitlab/logs 目录到容器的 /var/log/gitlab 目录,用于存储 GitLab 日志文件。

7、--volume /srv/gitlab/data:/var/opt/gitlab:

挂载主机的 /srv/gitlab/data 目录到容器的 /var/opt/gitlab 目录,用于存储 GitLab 数据。

8、--volume /srv/gitlab/ssl:/etc/gitlab/ssl:

挂载主机的 /srv/gitlab/ssl 目录到容器的 /etc/gitlab/ssl 目录,用于存储 SSL 证书文件。

9、--env GITLAB_OMNIBUS_CONFIG=...:

设置环境变量 GITLAB_OMNIBUS_CONFIG,用于配置 GitLab。

10、external_url 'https://gitlab.example.com': 配置 GitLab 的外部访问 URL 为 https://gitlab.example.com。

11、nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.example.com.crt': 配置 Nginx 使用的 SSL 证书路径。

12、nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.example.com.key': 配置 Nginx 使用的 SSL 证书密钥路径。
gitlab_rails['gitlab_shell_ssh_port'] = 2222: 配置 GitLab 使用的 SSH 端口为 2222。

13、gitlab/gitlab-ee:latest:

指定使用的 Docker 镜像为 gitlab/gitlab-ee 的最新版本。

2.3 验证 GitLab 启动

2.4 备份和恢复

  • 备份 GitLab 数据
    sudo docker exec -t gitlab gitlab-backup create
    
    备份文件存放在 /data/gitlab/data/backups 目录下。
  • 恢复 GitLab 数据

将备份文件复制到指定目录,并恢复:

sudo docker cp /path/to/backup.tar gitlab:/var/opt/gitlab/backups/
sudo docker exec -t gitlab gitlab-backup restore BACKUP=<timestamp_of_backup>

2.5 升级 GitLab

拉取最新稳定版本的镜像并重启容器:

sudo docker pull gitlab/gitlab-ee:latest
sudo docker stop gitlab
sudo docker rm gitlab
sudo docker run --detach \
  --hostname gitlab.example.com \
  --publish 80:80 --publish 443:443 --publish 22:22 \
  --name gitlab \
  --restart always \
  --volume /srv/gitlab/config:/etc/gitlab \
  --volume /srv/gitlab/logs:/var/log/gitlab \
  --volume /srv/gitlab/data:/var/opt/gitlab \
  --volume /srv/gitlab/ssl:/etc/gitlab/ssl \
  --env GITLAB_OMNIBUS_CONFIG="external_url 'https://gitlab.example.com'; nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.example.com.crt'; nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.example.com.key';" \
  gitlab/gitlab-ee:latest

三、已搭建的gitlab升级为HTTPS访问

3.1 准备 SSL 证书

准备 PEM 证书文件,分别需要crt和key文件

3.2 创建目录

sudo mkdir -p /data/gitlab/ssl

3.3 复制证书

将 PEM 证书文件复制到该目录,并命名为 gitlab.example.com.crt 和 gitlab.example.com.key。例如:

sudo cp /path/to/your/cloudflare_certificate.pem /data/gitlab/ssl/gitlab.example.com.crt
sudo cp /path/to/your/cloudflare_private_key.key /data/gitlab/ssl/gitlab.example.com.key

3.4 修改 GitLab 配置

编辑 GitLab 配置文件 gitlab.rb 以启用 HTTPS 并指定 SSL 证书和密钥路径。

1、打开 gitlab.rb 文件进行编辑:
vim /data/gitlab/config/gitlab.rb


2、添加或修改以下配置:
external_url 'https://gitlab.example.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab.example.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab.example.com.key"

3.5 重新配置并重启 GitLab

  • 重新配置 GitLab:
sudo docker exec -it gitlab gitlab-ctl reconfigure

3.6 重启 GitLab 容器:

sudo docker restart gitlab

注:通过上述步骤,我们可以将 GitLab 从 HTTP 升级到 HTTPS 访问。如果在配置过程中遇到问题,可以查看 GitLab 和 Nginx 的日志以获取更多调试信息。

四、生成 Cloudflare Origin CA 证书和私钥

如果在 Cloudflare 中生成的证书只有 PEM 格式的文件而没有私钥文件,可能您使用的是 Cloudflare 提供的“Origin CA”证书。这个证书是用来在 Cloudflare 和您的服务器之间建立安全连接的。在这种情况下,您需要使用 Cloudflare 的 Origin CA 来生成证书和私钥文件。

4.1 Cloudflare 如何获取SSL 证书和私钥

  1. 登录 Cloudflare 控制台。
  2. 选择您的域名。
  3. 导航到 SSL/TLS -> Origin Server。
  4. 点击 Create Certificate。
  5. 选择 Let Cloudflare generate a private key and a CSR。
  6. 点击 Next。
  7. 选择 PEM 格式并点击 Create.

生成后,您会得到两个文件:

  • Origin Certificate(证书文件,通常为 .pem 格式)。
  • Private Key(私钥文件,通常为 .key 格式)。

4.2 下载并保存证书和私钥文件

下载生成的证书和私钥文件,并将它们保存到您的服务器上。例如:

  • origin-cert.pem(证书文件)
  • origin-key.pem(私钥文件)

五、gitlab浏览器使用

5.1 修改初始密码

  • 默认用户名和密码
    默认用户名: root
    默认密码: 在 GitLab 的 Docker 容器首次启动时,默认密码会在日志中生成,或者使用在 gitlab.rb 文件中设置的密码。

5.1.1 获取默认密码

默认密码会存储在容器内的文件中,可以通过以下命令获取:

sudo docker exec -it gitlab cat /etc/gitlab/initial_root_password

输出内容会包含类似如下的信息:

# WARNING: This value is valid only in the following conditions
# 1. You access the account via the web interface.
# 2. You have not already changed the password.
#
Password: <your_initial_password>

5.1.2 修改初始密码

  1. 通过Web页面设置
  • 登录后,点击右上角的头像,然后选择 Edit Profile
  • 在左侧菜单中选择 Password
  • 输入当前密码和新密码,然后点击 Save password
  1. 通过文件设置

如果我们在 gitlab.rb 文件中设置了自定义的初始密码,可以通过以下配置进行设置:

gitlab_rails['initial_root_password'] = '密码'

然后重新配置 GitLab:

sudo docker exec -it gitlab gitlab-ctl reconfigure

5.2 创建新用户

5.2.1 使用 Web 界面

  • 登录到 GitLab 管理界面(以管理员身份)。
  • 在左侧导航栏中,点击 Admin Area。
  • 在顶部导航栏中,选择 Users。
  • 点击 New user 按钮。
  • 填写用户的详细信息(如姓名、用户名、邮箱地址等)。
    Name: 用户的全名,如 “John Doe”。
    Username: 用户的唯一标识符,如 “johndoe”。
    Email: 用户的电子邮件地址。
    Password: 用户的密码(如果需要,可以暂时留空,用户可以通过邮件设置密码)。
    
  • 设置用户密码(如果需要)。
  • 点击 Create user 按钮。

注:
Name 是用户的全名,用于显示在界面上的人类可读的名字。
Username 是用户的唯一标识符,用于登录、URL 和命令行操作。

5.2.2 使用命令行(API)

我们还可以使用 GitLab API 创建用户。以下是一个示例命令:

curl --request POST "https://gitlab.example.com/api/v4/users" \
--header "PRIVATE-TOKEN: <your_access_token>" \
--data "email=new_user@example.com&username=new_user&name=New User&password=password1234"

将 替换为管理员访问令牌。

5.3 创建新项目

5.3.1 通过 Web 界面创建项目

  1. 进入新项目创建页面:
  • 登录后,在页面的右上角,点击 + 按钮。
  • 从下拉菜单中选择 New project。
  1. 选择项目类型:
  • Create blank project:从头开始创建一个空项目。
  • Create from template:使用 GitLab 提供的模板创建项目。
  • Import project:从外部源(如 GitHub、Bitbucket)导入项目。
  1. 填写项目详细信息:
  • Project name:输入项目名称。这将自动生成项目的 URL 路径(可以手动修改)。
  • Project slug:这是项目的 URL 路径(如果未手动修改,将基于项目名称自动生成)。
  • Project description(可选):输入项目的描述信息。
  • Project visibility:选择项目的可见性级别:
    • Private:只有项目成员可以访问。
    • Internal:所有登录的用户可以访问。
  1. 设置其他选项(可选):
  • Initialize repository with a README:初始化项目时添加一个 README 文件。
  • Add .gitignore:选择一个适合项目的 .gitignore 模板。
  • Add a license:选择一个适合项目的许可证。
  1. 创建项目:

填写完所有信息后,点击 Create project 按钮。

5.3.2 通过命令行使用 API 创建项目

我们也可以使用 GitLab API 创建项目。以下是一个示例命令:

curl --request POST "https://gitlab.example.com/api/v4/projects" \
--header "PRIVATE-TOKEN: <your_access_token>" \
--data "name=new_project&visibility=private"

将 替换为您的访问令牌,并根据实际情况修改 name 和 visibility 参数。

5.4 分配角色

在 GitLab 中,用户角色通常通过项目或组权限分配。常见的角色包括:Guest、Reporter、Developer、Maintainer 和 Owner。

5.4.1 分配项目角色

  • 登录到 GitLab 管理界面。
  • 选择一个项目。
  • 在左侧导航栏中,点击 Members。
  • 点击 Invite members 按钮。
  • 输入新用户的用户名或邮箱地址。
  • 选择用户的角色(如 Developer)。
  • 点击 Invite 按钮。

5.4.2 分配组角色

  • 登录到 GitLab 管理界面。
  • 选择一个组。
  • 在左侧导航栏中,点击 Members。
  • 点击 Invite members 按钮。
  • 输入新用户的用户名或邮箱地址。
  • 选择用户的角色(如 Developer)。
  • 点击 Invite 按钮。

5.5 允许用户上传和下载代码

只要用户被分配了适当的角色(如 Developer 或以上),他们就可以在项目中进行代码上传和下载。

5.5.1 上传代码

用户可以使用 Git 命令行工具将代码推送到项目中:

git clone https://gitlab.example.com/group/project.git
cd project
# 做出一些更改
git add .
git commit -m "Add new feature"
git push origin main

5.5.2 下载代码

用户可以通过 Git 克隆项目:

git clone https://gitlab.example.com/group/project.git

六、常见错误处理

6.1 端口被占用

错误信息:

docker: Error response from daemon: driver failed programming external connectivity on endpoint gitlab

解决方法

确保端口未被其他服务占用。例如,22 端口可能已经被 SSH 服务占用。

6.2 浏览器访问时显示 Error code 522

访问报错:Connection timed out Error code 522

错误代码 522 通常表示 Cloudflare 无法连接到您的服务器。以下是可能的解决方案:

6.2.1 检查服务器防火墙配置(云厂商安全组)

确保防火墙允许 HTTP(80)、HTTPS(443)和新的 SSH(2222)端口的访问。

6.2.2 确认服务器端口开放

确保服务器在正确的端口上监听。您可以使用 netstat 或 ss 工具进行检查:

sudo netstat -tuln | grep ':80'
sudo netstat -tuln | grep ':443'
sudo netstat -tuln | grep ':2222'

确保这些命令返回监听状态。

6.2.3 确认 Docker 容器端口映射

检查 Docker 容器的端口映射是否正确:

docker ps

6.2.4 检查服务器上的 GitLab 配置

确保 GitLab 容器内的 NGINX 正常运行并监听正确的端口。进入容器内部检查 NGINX 状态:

sudo docker exec -it gitlab gitlab-ctl status

检查 NGINX 日志:

sudo docker exec -it gitlab gitlab-ctl tail nginx

确保 NGINX 正常启动且没有错误。

6.3 浏览器访问时显示 Error code 521

报错信息:Cloudflare 报错Web server is down Error code 521

错误代码 521 表示 Cloudflare 无法连接到您的服务器。这通常是因为服务器没有响应,或者阻止了来自 Cloudflare 的请求。以下是一些可能的解决方案:

6.3.1 确认 Web 服务器正在运行

确保 GitLab 容器内的 NGINX 服务正在运行。

进入 GitLab 容器内部:

sudo docker exec -it gitlab bash

然后检查 NGINX 服务状态:

gitlab-ctl status nginx

如果 NGINX 没有运行,可以尝试重新启动:

gitlab-ctl restart nginx

6.3.2 检查 Web 服务器日志

查看 NGINX 的日志文件,查找任何错误信息:

gitlab-ctl tail nginx

6.3.3 检查 Docker 容器端口映射

确保 Docker 容器正确映射了 HTTP 和 HTTPS 端口。

运行以下命令来检查容器的端口映射:

docker ps

6.3.4 检查服务器防火墙配置(云厂商安全组)

确保防火墙允许 HTTP(80)、HTTPS(443)和新的 SSH(2222)端口的访问。

6.3.5 确认 Cloudflare 的 SSL/TLS 配置

确保 Cloudflare SSL/TLS 配置正确。推荐使用“Full”或“Full (strict)”模式:

  1. 登录 Cloudflare 控制台。
  2. 选择您的域名。
  3. 导航到 SSL/TLS 选项卡。
  4. 确保 SSL/TLS 模式设置为 Full 或 Full (strict)。

注意:如果更改 Cloudflare 的 SSL/TLS 模式可能会影响该域名其他网站的访问,我们可以尝试以下几个步骤来解决 GitLab 的连接问题,而不影响其他网站的正常访问:

6.3.6 为 GitLab 设置单独的 Page Rule

确认 Cloudflare 的 SSL/TLS 配置,推荐使用“Full”或“Full (strict)”模式。为了不影响其他网站,可以为 GitLab 设置单独的 Page Rule。

  1. 登录 Cloudflare 控制台。
  2. 选择您的域名。
  3. 导航到 Page Rules 选项卡。
  4. 创建一个新的 Page Rule,规则如下:
URL: *gitlab.example.com/*
Settings: SSL -> Full (strict)

七、常见的 gitlab-ctl 命令

gitlab-ctl 是 GitLab Omnibus 版本中的一个命令行工具,用于管理和配置 GitLab 服务。即使使用 Docker 部署 GitLab,您仍然可以通过在 Docker 容器中执行 gitlab-ctl 命令来管理 GitLab 实例。

7.1 基本操作

  • 启动 GitLab:
    gitlab-ctl start
    
  • 停止 GitLab 服务:
    gitlab-ctl stop
    
  • 重启 GitLab 服务:
    gitlab-ctl restart
    
  • 检查所有 GitLab 组件的运行状态:
    gitlab-ctl status
    

    7.2 配置管理

  • 重新配置 GitLab:

当我们修改了配置文件 /etc/gitlab/gitlab.rb 后,需要重新加载配置:

gitlab-ctl reconfigure
  • 测试配置:
    gitlab-ctl reconfigure --dry-run
    

7.3 日志管理

  • 查看所有服务日志:
    gitlab-ctl tail
    
  • 查看指定特定服务的日志,例如查看 Nginx 的日志

    gitlab-ctl tail nginx
    

    7.4 备份与恢复

  • 创建备份:

在进行升级前,您可以创建备份:

gitlab-rake gitlab:backup:create
  • 从备份恢复:
gitlab-rake gitlab:backup:restore

7.5 缓存管理

  • 清除 Redis 缓存:
gitlab-rake cache:clear
相关文章
|
1月前
|
Docker 容器
Docker部署minio-arm64版本,阿里官方推荐
Docker部署minio-arm64版本,阿里官方推荐
|
6天前
|
Cloud Native 安全 Docker
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
|
1月前
|
Docker 容器
docker部署omni_usdt 0.8.0版本私有链集群环境
docker部署omni_usdt 0.8.0版本私有链集群环境
|
21天前
|
Docker 容器
docker 部署gitlab
docker 部署gitlab
10 0
|
28天前
|
Java Maven 流计算
在Docker跑通Flink分布式版本的WordCount
在Docker跑通Flink分布式版本的WordCount
27 0
|
1月前
|
Linux 应用服务中间件 网络安全
linux安装Gitlab
linux安装Gitlab
114 0
|
1月前
|
缓存 数据安全/隐私保护 Docker
安装gitlab
安装gitlab
218 0
|
7月前
|
网络安全 开发工具 数据安全/隐私保护
Gitlab的安装
Gitlab的安装
96 0
|
1月前
|
存储 网络安全 数据安全/隐私保护
docker 安装gitlab,配置邮件,备份全流程
docker 安装gitlab,配置邮件,备份全流程
172 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
centos7安装gitlab-ce社区版全过程,详细到爆炸,这些面试官常问的开发面试题你都掌握好了吗
centos7安装gitlab-ce社区版全过程,详细到爆炸,这些面试官常问的开发面试题你都掌握好了吗