自编译安装的 GitLab Pages 管理
- 版本:Free, Premium, Ultimate
- 提供:GitLab Self-Managed
在尝试启用 GitLab Pages 之前,请确保您已成功 安装 GitLab。
本文档介绍如何为自编译的 GitLab 安装配置 GitLab Pages。
有关为 Linux 包安装(推荐)配置 GitLab Pages 的更多信息,请参阅 Linux 包文档。
使用 Linux 包安装的优势在于它包含最新支持的 GitLab Pages 版本。
GitLab Pages 工作原理
GitLab Pages 使用 GitLab Pages 守护进程,这是一个轻量级 HTTP 服务器,监听外部 IP 地址并提供自定义域名和证书支持。它通过 SNI 支持动态证书,并默认使用 HTTP2 暴露页面。
我们鼓励您阅读其 README
以全面了解其工作原理。
在 自定义域名 的情况下(但不是
通配符域名),Pages 守护进程需要监听
端口 80 和/或 443。因此,您可以通过以下几种方式灵活设置:
- 在与 GitLab 相同的服务器上运行 Pages 守护进程,监听辅助 IP。
- 在独立服务器上运行 Pages 守护进程。在这种情况下, Pages 路径 也必须存在于安装 Pages 守护进程的服务器上,因此您必须通过网络共享它。
- 在与 GitLab 相同的服务器上运行 Pages 守护进程,监听相同的 IP 但使用不同的端口。在这种情况下,您必须使用负载均衡器代理流量。如果选择此方式,您应该对 HTTPS 使用 TCP 负载均衡。如果您使用 TLS 终止(HTTPS 负载均衡),则无法使用用户提供的证书提供服务。对于 HTTP,您可以使用 HTTP 或 TCP 负载均衡。
在本文档中,我们假设采用第一种方案。如果您不支持自定义域名,则不需要辅助 IP。
先决条件
在进行 Pages 配置之前,请确保:
- 您有一个单独的域名来托管 GitLab Pages。在本文档中,我们假设为
example.io。 - 您已为该域名配置了 通配符 DNS 记录。
- 您已在安装 GitLab 的相同服务器上安装了
zip和unzip包,因为它们需要用于压缩和解压缩 Pages 工件。 - 可选。如果您决定在 HTTPS 下提供 Pages 服务(
*.example.io),则您拥有该 Pages 域名的 通配符证书。 - 可选但推荐。您已配置并启用了 实例运行器,这样您的用户就不需要自己提供。
DNS 配置
GitLab Pages 期望在自己的虚拟主机上运行。在您的 DNS 服务器/提供商中,
您需要添加一个指向 GitLab 运行主机的 通配符 DNS A 记录。例如,条目如下所示:
*.example.io. 1800 IN A 192.0.2.1其中 example.io 是用于托管 GitLab Pages 的域名,
而 192.0.2.1 是您的 GitLab 实例的 IP 地址。
您不应使用 GitLab 域名来托管用户页面。更多信息请参阅 安全部分。
配置
根据您的需求,您可以通过 4 种不同的方式设置 GitLab Pages。 以下选项从最简单的设置到最高级的设置列出。 绝对最低要求是设置通配符 DNS,因为所有配置都需要它。
通配符域名
先决条件:
URL 方案:http://<namespace>.example.io/<project_slug>
这是您可以使用 Pages 的最低设置。它是下面描述的所有其他设置的基础。 NGINX 将所有请求代理到守护进程。Pages 守护进程不监听外部世界。
-
安装 Pages 守护进程:
cd /home/git sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git cd gitlab-pages sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION) sudo -u git -H make -
进入 GitLab 安装目录:
cd /home/git/gitlab -
编辑
gitlab.yml并在pages设置下,将enabled设置为true, 将host设置为用于托管 GitLab Pages 的 FQDN:## GitLab Pages pages: enabled: true # 页面存储的位置(默认:shared/pages)。 # path: shared/pages host: example.io access_control: false port: 8090 https: false artifacts_server: false external_http: ["127.0.0.1:8090"] secret_file: /home/git/gitlab/gitlab-pages-secret -
将以下配置文件添加到
/home/git/gitlab-pages/gitlab-pages.conf,并确保将example.io更改为您想要从其托管 GitLab Pages 的 FQDN, 将gitlab.example.com更改为您的 GitLab 实例的 URL:listen-http=:8090 pages-root=/home/git/gitlab/shared/pages api-secret-key=/home/git/gitlab/gitlab-pages-secret pages-domain=example.io internal-gitlab-server=https://gitlab.example.com当 GitLab Pages 和 GitLab 在同一主机上运行时,您可以使用
http地址。 如果您使用https并使用自签名证书,请确保使您的自定义 CA 对 GitLab Pages 可用。 例如,您可以通过设置SSL_CERT_DIR环境变量来实现。 -
添加秘密 API 密钥:
sudo -u git -H openssl rand -base64 32 > /home/git/gitlab/gitlab-pages-secret -
启用 pages 守护进程:
-
如果您的系统使用 systemd 作为 init,请运行:
sudo systemctl edit gitlab.target在打开的编辑器中,添加以下内容并保存文件:
[Unit] Wants=gitlab-pages.service -
如果您的系统使用 SysV init,请编辑
/etc/default/gitlab并将gitlab_pages_enabled设置为true:gitlab_pages_enabled=true
-
-
复制
gitlab-pagesNGINX 配置文件:sudo cp lib/support/nginx/gitlab-pages /etc/nginx/sites-available/gitlab-pages.conf sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages.conf -
重启 NGINX。
支持 TLS 的通配符域名
先决条件:
- 通配符 DNS 设置
- 通配符 TLS 证书
URL 方案:https://<namespace>.example.io/<project_slug>
NGINX 将所有请求代理到守护进程。Pages 守护进程不监听外部世界。
-
安装 Pages 守护进程:
cd /home/git sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git cd gitlab-pages sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION) sudo -u git -H make -
在
gitlab.yml中,将端口设置为443,将 https 设置为true:## GitLab Pages pages: enabled: true # 页面存储的位置(默认:shared/pages)。 # path: shared/pages host: example.io port: 443 https: true -
编辑
/etc/default/gitlab并将gitlab_pages_enabled设置为true以启用 pages 守护进程。 在gitlab_pages_options中,-pages-domain必须与您之前设置的host值匹配。-root-cert和-root-key设置是example.io域名的通配符 TLS 证书:gitlab_pages_enabled=true gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -root-cert /path/to/example.io.crt -root-key /path/to/example.io.key" -
复制
gitlab-pages-sslNGINX 配置文件:sudo cp lib/support/nginx/gitlab-pages-ssl /etc/nginx/sites-available/gitlab-pages-ssl.conf sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages-ssl.conf -
重启 NGINX。
高级配置
除了通配符域名,您还可以选择配置 GitLab Pages 以与自定义域名一起工作。 同样,这里有两个选项:支持带和不带 TLS 证书的自定义域名。 最简单的设置是不带 TLS 证书的设置。
自定义域名
先决条件:
- 通配符 DNS 设置
- 辅助 IP
URL 方案:http://<namespace>.example.io/<project_slug> 和 http://custom-domain.com
在这种情况下,pages 守护进程正在运行。NGINX 仍然将请求代理到守护进程, 但守护进程也能够接收来自外部世界的请求。支持自定义域名,但不支持 TLS。
-
安装 Pages 守护进程:
cd /home/git sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git cd gitlab-pages sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION) sudo -u git -H make -
编辑
gitlab.yml使其如下所示。您需要将host更改为用于托管 GitLab Pages 的 FQDN。将external_http设置为 pages 守护进程监听连接的辅助 IP:pages: enabled: true # 页面存储的位置(默认:shared/pages)。 # path: shared/pages host: example.io port: 80 https: false external_http: 192.0.2.2:80 -
要启用守护进程,请编辑
/etc/default/gitlab并将gitlab_pages_enabled设置为true。 在gitlab_pages_options中,-pages-domain的值必须与host匹配,-listen-http必须与external_http匹配:gitlab_pages_enabled=true gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -listen-http 192.0.2.2:80" -
复制
gitlab-pages-sslNGINX 配置文件:sudo cp lib/support/nginx/gitlab-pages /etc/nginx/sites-available/gitlab-pages.conf sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages.conf -
编辑
/etc/nginx/site-available/中的所有 GitLab 相关配置,并将0.0.0.0替换为192.0.2.1,其中192.0.2.1是 GitLab 监听的主 IP。 -
重启 NGINX。
支持 TLS 的自定义域名
先决条件:
- 通配符 DNS 设置
- 通配符 TLS 证书
- 辅助 IP
URL 方案:https://<namespace>.example.io/<project_slug> 和 https://custom-domain.com
在这种情况下,pages 守护进程正在运行。NGINX 仍然将请求代理到守护进程, 但守护进程也能够接收来自外部世界的请求。支持自定义域名和 TLS。
-
安装 Pages 守护进程:
cd /home/git sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-pages.git cd gitlab-pages sudo -u git -H git checkout v$(</home/git/gitlab/GITLAB_PAGES_VERSION) sudo -u git -H make -
编辑
gitlab.yml使其如下所示。您需要将host更改为用于托管 GitLab Pages 的 FQDN。将external_http和external_https设置为 pages 守护进程监听连接的辅助 IP:## GitLab Pages pages: enabled: true # 页面存储的位置(默认:shared/pages)。 # path: shared/pages host: example.io port: 443 https: true external_http: 192.0.2.2:80 external_https: 192.0.2.2:443 -
编辑
/etc/default/gitlab并将gitlab_pages_enabled设置为true以启用 pages 守护进程。 在gitlab_pages_options中,您必须将-pages-domain与host匹配,-listen-http与external_http匹配,-listen-https与external_https设置匹配。-root-cert和-root-key设置是example.io域名的通配符 TLS 证书:gitlab_pages_enabled=true gitlab_pages_options="-pages-domain example.io -pages-root $app_root/shared/pages -listen-proxy 127.0.0.1:8090 -listen-http 192.0.2.2:80 -listen-https 192.0.2.2:443 -root-cert /path/to/example.io.crt -root-key /path/to/example.io.key" -
复制
gitlab-pages-sslNGINX 配置文件:sudo cp lib/support/nginx/gitlab-pages-ssl /etc/nginx/sites-available/gitlab-pages-ssl.conf sudo ln -sf /etc/nginx/sites-{available,enabled}/gitlab-pages-ssl.conf -
编辑
/etc/nginx/site-available/中的所有 GitLab 相关配置,并将0.0.0.0替换为192.0.2.1,其中192.0.2.1是 GitLab 监听的主 IP。 -
重启 NGINX。
NGINX 注意事项
以下信息仅适用于自编译安装。
在 NGINX 配置中设置域名时要格外小心。您必须 不要删除反斜杠。
如果您的 GitLab Pages 域名是 example.io,请替换:
server_name ~^.*\.YOUR_GITLAB_PAGES\.DOMAIN$;为:
server_name ~^.*\.example\.io$;如果您使用子域名,请确保用反斜杠 () 转义所有点 (.),除了第一个点。
例如 pages.example.io 将是:
server_name ~^.*\.pages\.example\.io$;访问控制
GitLab Pages 访问控制可以按项目配置。对 Pages 站点的访问可以基于用户在该项目中的成员身份进行控制。
访问控制的工作原理是将 Pages 守护进程注册为 GitLab 的 OAuth 应用程序。 每当未认证用户请求访问私有 Pages 站点时,Pages 守护进程会将用户重定向到 GitLab。 如果认证成功,用户将带着令牌重定向回 Pages,该令牌会持久化在 cookie 中。 Cookie 使用密钥签名,因此可以检测到篡改。
每次查看私有站点中的资源时,Pages 都会使用该令牌进行认证。 对于它收到的每个请求,它会向 GitLab API 发送请求以检查用户是否有权读取该站点。
Pages 的访问控制参数在配置文件中设置,按照惯例该文件名为 gitlab-pages-config。
配置文件通过 -config flag 或 CONFIG 环境变量传递给 pages。
Pages 访问控制默认禁用。要启用它:
-
修改您的
config/gitlab.yml文件:pages: access_control: true -
创建一个新的 系统 OAuth 应用程序。 这应该称为
GitLab Pages,并具有Redirect URL为https://projects.example.io/auth。它不需要是"受信任"的应用程序, 但它需要api范围。 -
通过传递具有以下参数的配置文件启动 Pages 守护进程:
auth-client-id=<GitLab 生成的 OAuth 应用程序 ID> auth-client-secret=<GitLab 生成的 OAuth 代码> auth-redirect-uri='http://projects.example.io/auth' auth-secret=<40 个随机十六进制字符> auth-server=<GitLab 实例的 URL> -
用户现在可以在其 项目设置 中配置它。
更改存储路径
按照以下步骤更改 GitLab Pages 内容的默认存储路径。
-
Pages 默认存储在
/home/git/gitlab/shared/pages。 如果您希望将它们存储在其他位置,您必须在gitlab.yml的pages部分中设置:pages: enabled: true # 页面存储的位置(默认:shared/pages)。 path: /mnt/storage/pages
设置最大 Pages 大小
每个项目解压存档的最大默认大小为 100 MB。
要更改此值:
- 在左侧边栏底部,选择 管理员。
- 选择 设置 > 偏好设置。
- 展开 Pages。
- 更新 页面最大大小 (MB) 的值。
备份
Pages 是 常规备份 的一部分,因此无需额外配置。
安全
您应该强烈考虑在与 GitLab 不同的主机名下运行 GitLab Pages,以防止 XSS 攻击。