sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
添加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
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker
sudo systemctl enable docker
docker version
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 证书文件(例如 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
使用 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 的最新版本。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
878788361f54 gitlab/gitlab-ee:16.11.4-ee.0 "/assets/wrapper" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp gitlab
sudo docker exec -t gitlab gitlab-backup create
备份文件存放在 /data/gitlab/data/backups 目录下。
将备份文件复制到指定目录,并恢复:
sudo docker cp /path/to/backup.tar gitlab:/var/opt/gitlab/backups/
sudo docker exec -t gitlab gitlab-backup restore BACKUP=
拉取最新稳定版本的镜像并重启容器:
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
准备 PEM 证书文件,分别需要crt和key文件
sudo mkdir -p /data/gitlab/ssl
将 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
编辑 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"
sudo docker exec -it gitlab gitlab-ctl reconfigure
sudo docker restart gitlab
注:通过上述步骤,我们可以将 GitLab 从 HTTP 升级到 HTTPS 访问。如果在配置过程中遇到问题,可以查看 GitLab 和 Nginx 的日志以获取更多调试信息。
如果在 Cloudflare 中生成的证书只有 PEM 格式的文件而没有私钥文件,可能您使用的是 Cloudflare 提供的“Origin CA”证书。这个证书是用来在 Cloudflare 和您的服务器之间建立安全连接的。在这种情况下,您需要使用 Cloudflare 的 Origin CA 来生成证书和私钥文件。
生成后,您会得到两个文件:
下载生成的证书和私钥文件,并将它们保存到您的服务器上。例如:
默认密码会存储在容器内的文件中,可以通过以下命令获取:
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:
如果我们在 gitlab.rb 文件中设置了自定义的初始密码,可以通过以下配置进行设置:
gitlab_rails['initial_root_password'] = '密码'
然后重新配置 GitLab:
sudo docker exec -it gitlab gitlab-ctl reconfigure
Name: 用户的全名,如 “John Doe”。
Username: 用户的唯一标识符,如 “johndoe”。
Email: 用户的电子邮件地址。
Password: 用户的密码(如果需要,可以暂时留空,用户可以通过邮件设置密码)。
注:
Name 是用户的全名,用于显示在界面上的人类可读的名字。
Username 是用户的唯一标识符,用于登录、URL 和命令行操作。
我们还可以使用 GitLab API 创建用户。以下是一个示例命令:
curl --request POST "https://gitlab.example.com/api/v4/users" \
--header "PRIVATE-TOKEN: " \
--data "email=new_user@example.com&username=new_user&name=New User&password=password1234"
将
填写完所有信息后,点击 Create project 按钮。
我们也可以使用 GitLab API 创建项目。以下是一个示例命令:
curl --request POST "https://gitlab.example.com/api/v4/projects" \
--header "PRIVATE-TOKEN: " \
--data "name=new_project&visibility=private"
将
在 GitLab 中,用户角色通常通过项目或组权限分配。常见的角色包括:Guest、Reporter、Developer、Maintainer 和 Owner。
只要用户被分配了适当的角色(如 Developer 或以上),他们就可以在项目中进行代码上传和下载。
用户可以使用 Git 命令行工具将代码推送到项目中:
git clone https://gitlab.example.com/group/project.git
cd project
# 做出一些更改
git add .
git commit -m "Add new feature"
git push origin main
用户可以通过 Git 克隆项目:
git clone https://gitlab.example.com/group/project.git
错误信息:
docker: Error response from daemon: driver failed programming external connectivity on endpoint gitlab
解决方法
确保端口未被其他服务占用。例如,22 端口可能已经被 SSH 服务占用。
访问报错:Connection timed out Error code 522
错误代码 522 通常表示 Cloudflare 无法连接到您的服务器。以下是可能的解决方案:
确保防火墙允许 HTTP(80)、HTTPS(443)和新的 SSH(2222)端口的访问。
确保服务器在正确的端口上监听。您可以使用 netstat 或 ss 工具进行检查:
sudo netstat -tuln | grep ':80'
sudo netstat -tuln | grep ':443'
sudo netstat -tuln | grep ':2222'
确保这些命令返回监听状态。
检查 Docker 容器的端口映射是否正确:
docker ps
确保 GitLab 容器内的 NGINX 正常运行并监听正确的端口。进入容器内部检查 NGINX 状态:
sudo docker exec -it gitlab gitlab-ctl status
检查 NGINX 日志:
sudo docker exec -it gitlab gitlab-ctl tail nginx
确保 NGINX 正常启动且没有错误。
报错信息:Cloudflare 报错Web server is down Error code 521
错误代码 521 表示 Cloudflare 无法连接到您的服务器。这通常是因为服务器没有响应,或者阻止了来自 Cloudflare 的请求。以下是一些可能的解决方案:
确保 GitLab 容器内的 NGINX 服务正在运行。
进入 GitLab 容器内部:
sudo docker exec -it gitlab bash
然后检查 NGINX 服务状态:
gitlab-ctl status nginx
如果 NGINX 没有运行,可以尝试重新启动:
gitlab-ctl restart nginx
查看 NGINX 的日志文件,查找任何错误信息:
gitlab-ctl tail nginx
确保 Docker 容器正确映射了 HTTP 和 HTTPS 端口。
运行以下命令来检查容器的端口映射:
docker ps
确保防火墙允许 HTTP(80)、HTTPS(443)和新的 SSH(2222)端口的访问。
确保 Cloudflare SSL/TLS 配置正确。推荐使用“Full”或“Full (strict)”模式:
注意:如果更改 Cloudflare 的 SSL/TLS 模式可能会影响该域名其他网站的访问,我们可以尝试以下几个步骤来解决 GitLab 的连接问题,而不影响其他网站的正常访问:
确认 Cloudflare 的 SSL/TLS 配置,推荐使用“Full”或“Full (strict)”模式。为了不影响其他网站,可以为 GitLab 设置单独的 Page Rule。
URL: *gitlab.example.com/*
Settings: SSL -> Full (strict)
gitlab-ctl 是 GitLab Omnibus 版本中的一个命令行工具,用于管理和配置 GitLab 服务。即使使用 Docker 部署 GitLab,您仍然可以通过在 Docker 容器中执行 gitlab-ctl 命令来管理 GitLab 实例。
gitlab-ctl start
gitlab-ctl stop
gitlab-ctl restart
gitlab-ctl status
当我们修改了配置文件 /etc/gitlab/gitlab.rb 后,需要重新加载配置:
gitlab-ctl reconfigure
gitlab-ctl reconfigure --dry-run
gitlab-ctl tail
gitlab-ctl tail nginx
在进行升级前,您可以创建备份:
gitlab-rake gitlab:backup:create
gitlab-rake gitlab:backup:restore
gitlab-rake cache:clear