在 ECS 实例上部署 GitLab,可获得自主可控的代码托管和 CI/CD 平台,支持私有化访问与数据本地化存储。本文介绍在 Linux 系统的 ECS 实例上通过安装包、Docker 镜像或 ECS 扩展程序部署 GitLab 的完整步骤。
准备工作
请确保 ECS 实例满足以下条件:
-
实例规格:安装 GitLab 所需的实例规格与项目规模和团队规模有关,建议最小规格为 4 vCPU、8 GiB。更多信息,请参见 Installation system requirements 和 Running GitLab in a memory-constrained environment。
重要低于 4 vCPU、8 GiB 会因规格过小,导致长时间处于 Installing 状态或安装失败。请升级规格以后再安装,升级规格操作,请参见升降配方式概述。
-
操作系统:Linux 系统。具体支持的系统说明,请参见 Supported OSes。
-
实例已分配固定公网IP地址或绑定弹性公网IP(EIP)。如您不清楚如何开通公网,请参见开通公网。
-
安全组:入方向规则放行 80、443、22 端口。请参见添加安全组规则。
安装 GitLab
GitLab 版本包括企业版(EE)、社区版(CE)。其中极狐 GitLab 是在中国内地与中国香港、中国澳门发行的企业级 GitLab 版本,服务器位于中国境内,访问速度更快。版本对比详情参见 极狐 GitLab 安装与版本说明。
安装包(推荐)
在中国内地优先选择极狐 GitLab,下载和访问速度更快;当团队需要与海外环境协同,或要求保持与 GitLab 社区版完全一致的代码与文档体系时,再选择 GitLab 社区版。
极狐 GitLab
极狐 GitLab 支持的操作系统参见 supported_os。
Alibaba Cloud Linux 3
-
下载最新 RPM 安装包到本地临时目录。命令先从
repomd.xml动态读取当前 primary.xml.gz 文件名(仓库每次 reindex 后该 hash 都会变化),再从中解析最新 RPM 的相对路径并下载。cd /tmp && \ ARCH=$(uname -m) && \ PRIMARY=$(curl -s https://packages.gitlab.cn/repository/el/8/repodata/repomd.xml \ | grep -oE "[a-f0-9]{64}-primary\.xml\.gz" | head -1) && \ URL=$(curl -s "https://packages.gitlab.cn/repository/el/8/repodata/${PRIMARY}" \ | gunzip \ | grep -oE "href=\"[^\"]*gitlab-jh[^\"]*${ARCH}\.rpm\"" \ | sed 's/href="//;s/"$//' \ | sort -V \ | tail -1) && \ wget -c "https://packages.gitlab.cn/repository/el/8/${URL}" -
安装上一步下载的 RPM 包。命令通过 glob 通配符匹配实际下载的版本,避免与上一步的最新版本脱节。末尾输出
Complete!表示 RPM 安装成功。RPM=$(ls /tmp/gitlab-jh-*.x86_64.rpm | sort -V | tail -1) && \ sudo yum localinstall -y --disablerepo=gitlab-jh "$RPM" && rm -f "$RPM"--disablerepo=gitlab-jh参数表示安装本地 RPM 时,禁止 yum 去刷新 gitlab-jh 这个远程仓库的元数据,避免因解析仓库元数据异常触发 OOM 导致安装失败。 -
配置外部访问地址并启动 GitLab。
将
ECS_PUBLIC_IP替换为 ECS 实例的公网 IP 地址。sudo EXTERNAL_URL="http://ECS_PUBLIC_IP" gitlab-ctl reconfigure首次执行约耗时 5~10 分钟。
-
验证服务状态。
sudo gitlab-ctl status输出 puma、sidekiq、nginx、postgresql、redis、prometheus 等进程均为
run状态,表示 GitLab 已成功启动。
Alibaba Cloud Linux 4
-
创建仓库文件。
sudo tee /etc/yum.repos.d/gitlab-jh.repo > /dev/null << 'EOF' [gitlab-jh] name=JiHu GitLab baseurl=https://packages.gitlab.cn/repository/el/9/ gpgcheck=1 gpgkey=https://packages.gitlab.cn/repository/raw/gpg/public.gpg.key priority=1 enabled=1 EOF -
安装 GitLab。末尾输出
Complete!表示安装成功。sudo yum install -y gitlab-jh -
配置外部访问地址并启动 GitLab。
将
ECS_PUBLIC_IP替换为 ECS 实例的公网 IP 地址。sudo EXTERNAL_URL="http://ECS_PUBLIC_IP" gitlab-ctl reconfigure首次执行约耗时 5~10 分钟。
-
验证服务状态。
sudo gitlab-ctl status输出 puma、sidekiq、nginx、postgresql、redis、prometheus 等进程均为
run状态,表示 GitLab 已成功启动。
CentOS 7.x
-
安装 GitLab 所需的依赖包。
sudo yum install -y curl policycoreutils-python openssh-server -
添加 GitLab 软件包仓库。
curl -fsSL https://get.gitlab.cn | sudo /bin/bash由于网络原因,可能会出现无法添加 GitLab 软件源镜像的问题,建议多次重试。
当输出中包含关键字
Successfully added gitlab-jh repo,表示 GitLab 软件包仓库已安装。 -
安装并启动GitLab。
将
ECS_PUBLIC_IP替换成安装 GitLab 的实例公网 IP 地址后执行:sudo EXTERNAL_URL="http://ECS_PUBLIC_IP" yum install -y gitlab-jh首次执行约耗时 5~10 分钟。
-
验证服务状态。
sudo gitlab-ctl status输出 puma、sidekiq、nginx、postgresql、redis、prometheus 等进程均为
run状态,表示 GitLab 已成功启动。
Ubuntu
-
安装 GitLab 所需的依赖包。
sudo apt-get update sudo apt-get install -y curl openssh-server ca-certificates tzdata perl -
配置安装极狐 GitLab 的软件源镜像。
curl -L get.gitlab.cn | bash当输出中包含关键字
Successfully added gitlab-jh repo,表示 GitLab 软件包仓库已安装。 -
安装并启动 GitLab。
将
ECS_PUBLIC_IP替换成安装 GitLab 的实例公网 IP 地址。sudo EXTERNAL_URL="http://ECS_PUBLIC_IP" apt-get install -y gitlab-jh -
验证服务状态。
sudo gitlab-ctl status输出 puma、sidekiq、nginx、postgresql、redis 等进程均为
run状态,表示 GitLab 已成功启动。
GitLab 社区版
ECS 扩展程序
ECS 扩展程序是用于增强和扩展 ECS 实例功能的插件。Alibaba Cloud Linux 3 系统默认安装极狐 GitLab,其他系统默认安装 GitLab 社区版。
-
登录 ECS 控制台,进入目标实例的扩展程序页签。
-
在扩展程序列表中找到 GitLab 类扩展程序并完成安装,操作步骤参见OOS扩展程序,支持的操作系统版本以控制台界面为准。
当前支持的操作系统版本包括 Ubuntu 24.04、Ubuntu 22.04、Ubuntu 20.04、CentOS 7.9、CentOS 7.8、CentOS 7.7 和 Aliyun 3.2(Aliyun 3.2 的 GitLab 版本使用极狐GitLab)。可在左侧导航栏选择服务器管理 > 扩展程序进入扩展程序列表,单击 GitLab 进入详情页后单击安装扩展程序完成安装。
-
扩展程序状态显示为成功后,远程连接 ECS 实例,执行以下命令验证 GitLab 服务状态。
sudo gitlab-ctl status输出 puma、sidekiq、nginx、postgresql、redis 等进程均为
run状态,表示 GitLab 已成功启动。
Docker 镜像
-
无需安装Docker Compose。
-
创建 Docker 容器的挂载数据目录,该目录会作为 GitLab 配置、日志和数据文件所在的目录。
sudo mkdir -p /srv/gitlab -
设置环境变量
$GITLAB_HOME。export GITLAB_HOME=/srv/gitlab -
执行如下命令,安装 GitLab 容器镜像。
重要由于运营商网络原因,会导致您拉取Docker Hub镜像变慢,甚至下载失败。您可以使用阿里云容器镜像服务ACR提供的官方镜像加速器,加速官方镜像的下载。具体操作,请参见官方镜像加速。
GitLab 社区版
sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 2222:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ gitlab/gitlab-ce:latest容器参数
主机参数说明
hostname
指定的主机名,建议修改为当前 ECS 实例的公网 IP 地址。
publish 443:443
将主机的 443 端口映射到容器的 443 端口,使用 HTTPS 访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,如
publish 8443:443。说明如替换成非标端口,需要为安全组添加放行对应端口的入方向规则,例如 8443,请参见为安全组配置安全组规则。安全组规则为有状态规则,只需配置入方向,系统自动放行对应出方向响应流量。常用端口与授权建议见下表,完整示例见安全组应用指导和案例。。
publish 80:80
将主机的 80 端口映射到容器的 80 端口,使用 HTTP 访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,例如
publish 8080:80。说明如替换成非标端口,需要为安全组添加放行对应端口的入方向规则,例如 8080,请参见为安全组配置安全组规则。安全组规则为有状态规则,只需配置入方向,系统自动放行对应出方向响应流量。常用端口与授权建议见下表,完整示例见安全组应用指导和案例。。
publish 2222:22
将主机的 2222 端口映射到容器的 22 端口,Git 克隆、推送、拉取代码时通过 SSH 服务使用该端口。
说明-
ECS 实例默认启动 SSH 服务,会占用 22 端口。
-
替换成非标端口例如 2222 后,需要先为安全组添加放行对应端口的入方向规则,然后修改 gitlab.rb 文件中的 SSH 端口号。
ECS 实例的路径和容器路径的对应关系如下:
ECS 路径
容器路径
说明
$GITLAB_HOME/data/var/opt/gitlab存储应用程序数据。
$GITLAB_HOME/logs/var/log/gitlab存储 GitLab 日志文件。
$GITLAB_HOME/config/etc/gitlab存储 GitLab 配置文件。
极狐 GitLab
sudo docker run --detach \ --hostname gitlab.example.com \ --publish 443:443 --publish 80:80 --publish 2222:22 \ --name gitlab \ --restart always \ --volume $GITLAB_HOME/config:/etc/gitlab \ --volume $GITLAB_HOME/logs:/var/log/gitlab \ --volume $GITLAB_HOME/data:/var/opt/gitlab \ --shm-size 256m \ registry.gitlab.cn/omnibus/gitlab-jh:latest容器参数
主机参数说明
hostname
指定的主机名,建议修改为当前 ECS 实例的公网 IP 地址。
publish 443:443
将主机的 443 端口映射到容器的 443 端口,使用 HTTPS 访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,如
publish 8443:443。说明如替换成非标端口,需要为安全组添加放行对应端口的入方向规则,例如 8443,请参见为安全组配置安全组规则。安全组规则为有状态规则,只需配置入方向,系统自动放行对应出方向响应流量。常用端口与授权建议见下表,完整示例见安全组应用指导和案例。。
publish 80:80
将主机的 80 端口映射到容器的 80 端口,使用 HTTP 访问需要的端口。如果出现端口被主机端口已经被占用的报错时,请替换为非标准端口,例如
publish 8080:80。说明如替换成非标端口,需要为安全组添加放行对应端口的入方向规则,例如 8080,请参见为安全组配置安全组规则。安全组规则为有状态规则,只需配置入方向,系统自动放行对应出方向响应流量。常用端口与授权建议见下表,完整示例见安全组应用指导和案例。。
publish 2222:22
将主机的 2222 端口映射到容器的 22 端口,Git 克隆、推送、拉取代码时通过 SSH 服务使用该端口。
说明-
ECS 实例默认启动 SSH 服务,会占用 22 端口。
-
替换成非标端口例如 2222 后,需要先为安全组添加放行对应端口的入方向规则,然后修改 gitlab.rb 文件中的 SSH 端口号。
ECS 实例的路径和容器路径的对应关系如下:
ECS 路径
容器路径
说明
$GITLAB_HOME/data/var/opt/gitlab存储应用程序数据。
$GITLAB_HOME/logs/var/log/gitlab存储 GitLab 日志文件。
$GITLAB_HOME/config/etc/gitlab存储 GitLab 配置文件。
-
-
查看容器状态。
sudo docker ps -aSTATUS 列显示 (healthy) 时,说明 GitLab 容器已正常启动。
[ecs-user@iZ2zeee22a96g ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 75b3bc5de483 gitlab/gitlab-ce:latest "/assets/wrapper" 2 hours ago Up 2 hours (healthy) 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:5000->22/tcp, :::5000->22/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp gitlab进入容器进一步检查 GitLab 各内部进程:
sudo docker exec gitlab gitlab-ctl status期望 puma、sidekiq、nginx、postgresql、redis 等进程均为
run状态,表示容器内 GitLab 服务已成功启动。
进入 GitLab 管理页面
-
在浏览器输入网址。访问网址:
http://${ECS的公网IP}。重要如果使用 Docker 镜像方式安装,并将 HTTP 的默认端口 80 映射成非标准端口,请在访问链接后添加该端口号。
-
首次登录使用用户名
root,通过如下方式获取密码。获取 GitLab 的登录密码。在 ECS 实例执行以下命令:
-
Linux 安装包方式:
sudo cat /etc/gitlab/initial_root_password -
Docker 安装方式:
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
回显信息类似如下,在
Password字段后即为 GitLab 的初始登录密码。[test@iZuf63zs0dn0cxxx ~]$ sudo cat /etc/gitlab/initial_root_password # WARNING: This value is valid only in the following conditions # 1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`), it was provided before database was seeded for the first time (usually, the first reconfigure run). # 2. Password hasn't been changed manually, either via UI or via command line. # # If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password. Password: nB9P+4UUY2yx8Gp3BYgwQpKSfdo4wh11DpQH_ # NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.重要出于安全原因,24 小时后该文件会被自动删除。建议安装成功首次登录后立即修改 GitLab 的初始密码,操作步骤参见 reset_user_password。
-
-
进入 Admin 页面。
单击页面顶部的 Menu 按钮,在下拉菜单中选择 Admin。
-
在 Users>Pending approval 页面审批新用户的申请。其他操作例如管理项目、管理用户等,请参见 admin_area。
本示例介绍将文件上传到 GitLab 仓库的步骤。如需了解更多 GitLab 操作(例如常用命令、数据备份、配置选项、用户管理、与其他服务集成、故障排除等),请参见 极狐 GitLab 和 GitLab 社区版。
注册用户并设置免密访问
-
访问GitLab页面。单击Sign in按钮下的Register now,创建一个新用户。等待GitLab管理员通过申请后,使用新创建的用户登录GitLab。
-
在本地生成密钥对文件。
ssh-keygen生成密钥对的过程中,系统会提示输入密钥对存放目录(默认为当前用户目录下的
.ssh/id_rsa,例如/home/test/.ssh/id_rsa)和密钥对密码,可以手动输入,也可以按 Enter 保持默认。回显信息类似如下所示。
[test@iZuf63zs0dn0qxxx : ~]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/test/.ssh/id_rsa): Created directory '/home/test/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/test/.ssh/id_rsa. Your public key has been saved in /home/test/.ssh/id_rsa.pub. The key fingerprint is: SHA256:c8wCYK16ByqC8jEWaL9G/2gkWVe3lQUaens xxx test@iZuf63zs0dn0xxx The key's randomart image is: +---[RSA 2048]----+ | o. .+o.| | . .. ...0+.. | | . . ...oo.+ .| |... o. o o..oE.o | |o .+o.. S +..oo | |= *=... + .+ | |o+.+=. . | | .o o. | | .... | +----[SHA256]-----+ -
查看并复制公钥文件
id_rsa.pub中的内容,便于后续步骤使用。cat ~/.ssh/id_rsa.pub回显信息类似如下所示。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQVwWjF3KXmI549jDI0fuCgl+syJjjn55iMUDRRiCd/B+9TwUda3l9WXH5i7RU53QGRCsDVFZxixLOlmXr9E3VSqkf8xXBnHs/5E2z5PIOCN0nxfB9xeA1db/QxPwK4gkHisep+eNHRn9x+DpCYDoSoYQN0nBg+H3uqfOqL42mJ+tqSfkyqbhjBf1kjtDTlBfVCWtI0siu7owm+c65+8KNyPlj5/0AyJ4Aqk1OX2jv+YE4nTipucn7rHwWuowasPU86l+uBsLNwOSb+H7loJvQyhEINX2FS1KnpRU+ld20t07n+N3ErfX5xBAGfxXpoN9BKKSP+RT7rvTeXTVE**** test@iZuf63zs0dn0qccsisy**** -
添加 SSH key。将获取的公钥添加到 GitLab 账户中,以便实现免密身份验证。
-
单击页面右上角的头像,然后单击 Profile。
GitLab 旧版本菜单条目为 Edit profile。
-
在左侧导航栏,单击 SSH Keys。将公钥文件
id_rsa.pub中的内容粘贴到Key所在的文本框中,然后单击 Add key。 -
SSH Key 添加完成后,页面将显示 SSH Key 详情,包括密钥内容、指纹信息(MD5 和 SHA256)以及创建时间、过期时间等元数据。
-
创建项目并托管代码
创建新项目
-
在 GitLab 主页,单击页面右侧的 New Project 按钮,然后单击 Create blank project。
-
单击 Create blank project,设置 Project name 和 Project URL,然后单击页面底部的 Create project。本文以 mywork 项目为例说明。
-
回到项目页面,复制 SSH 克隆地址,该地址在克隆时使用。
重要项目页面显示的 SSH 克隆 URL 默认使用
gitlab.example.com作为 host(GitLab 内置默认 hostname),直接克隆会因 DNS 解析失败而报错。请在克隆前手动将 host 替换为 ECS 实例的公网 IP 或自定义域名。如需让项目页面直接显示正确的 host,可在
/etc/gitlab/gitlab.rb中配置gitlab_rails['gitlab_shell_ssh_host'],然后执行sudo gitlab-ctl reconfigure,详情参见 Configuring the external URL for GitLab。
克隆远程仓库
-
sudo yum install git -
在本地配置使用 Git 仓库的人员信息。
-
配置使用 Git 仓库的用户名。
git config --global user.name "testname" -
配置使用 Git 仓库的人员邮箱。
git config --global user.email "abc@example.com"
-
-
克隆已创建的项目到本地。
-
输入
git clone并粘贴 SSH 克隆地址,Git 会自动创建一个以仓库名称命名的文件夹并下载文件。git clone ${SSH URL}如果使用 Docker 镜像安装,需要为链接添加
ssh://前缀并指定 docker run 命令中映射的端口,例如:重要如果不想修改 SSH 链接,需要修改
gitlab_rails['gitlab_shell_ssh_port']参数,以便 GitLab 页面正确显示,请参见使用 Docker 方式启动时,提示 22 端口被占用。git clone ssh://git@{IP域名}:{SSH端口}/root/mywork[ecs-user@iZ2zefuyca xxx ~]$ git clone git@59.xxx.xxx.xxx:root/mywork.git Cloning into 'mywork'... The authenticity of host '59.xxx.xxx.xxx (59.xxx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256:I4eX9gjdR2dwOBmI5xerO+dTnJOZ/xxx. ECDSA key fingerprint is MD5:18:54:b5:be:b2:6d:e9:25:c1:4d:84:89:2f:b5:13:d1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '59.xxx.xxx.xxx' (ECDSA) to the list of known hosts. remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (3/3), done. -
进入到项目目录。
cd mywork/ -
查看当前分支的名称,默认为主分支
main。git branch
-
新建分支并修改文件
在本地创建新的分支,便于更改文件。
-
新建一个分支
example。git checkout -b example -
新建需要上传到 GitLab 中的目标文件
test.txt,并写入内容Hello World!。echo "Hello world!" > test.txt
提交并推送更改
将新分支 example 推送到远程仓库保存。
-
将
test.txt文件添加到暂存区。git add test.txt -
确认变更的文件。
git status获得以下输出:
On branch example Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: test.txt -
提交暂存文件
test.txt。git commit -m "测试用" -
example分支目前只在本地可用。将分支推送到 GitLab 仓库,便于其他人访问。git push origin example -
推送到 GitLab 仓库后,其他用户也可以查看新建的分支。
在代码仓库页面,单击左上角的分支选择器,可以在 Branches 列表中看到已推送的 example 分支。
合并更改
将本地example 分支的更改合并到主分支 main,然后将合并后的主分支 main推送到远程仓库。
-
切换到主分支
main。git checkout main -
将新建分支
example合并到主分支main。git merge example -
将合并后的主分支推送到 GitLab 仓库。
git push -
变更已同步到 GitLab 仓库的主分支
main中。在 main 分支中,test.txt 文件内容显示为
Hello world!。