在 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扩展程序,支持的操作系统版本以控制台界面为准。

扩展程序状态显示为成功后,远程连接 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 容器已正常启动。

进入容器进一步检查 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_passwordDocker 安装方式:
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
回显信息类似如下所示,在
Password字段后即为 GitLab 的初始登录密码。
重要出于安全原因,24 小时后该文件会被自动删除。建议安装成功首次登录后立即修改 GitLab 的初始密码,操作步骤参见 reset_user_password。

进入 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 保持默认。回显信息类似如下所示。

查看并复制公钥文件
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 添加完成后,如下图所示。

创建项目并托管代码
创建新项目
在 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
进入到项目目录。
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 仓库后,其他用户也可以查看新建的分支。

合并更改
将本地example 分支的更改合并到主分支 main,然后将合并后的主分支 main推送到远程仓库。
切换到主分支
main。git checkout main将新建分支
example合并到主分支main。git merge example将合并后的主分支推送到 GitLab 仓库。
git push变更已同步到 GitLab 仓库的主分支
main中。













