セルフコンパイルインストールにおける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は、外部IPアドレスをリッスンし、カスタムドメインと証明書をサポートする軽量HTTPサーバーであるGitLab Pagesデーモンを利用します。SNIを介して動的証明書をサポートし、デフォルトでHTTP2を使用してページを公開します。この仕組みを十分に理解するために、READMEを読むことをおすすめします。
カスタムドメイン (ワイルドカードドメインではない)の場合、Pagesデーモンは80または443ポートをリッスンする必要があります。そのため、設定方法にはある程度の柔軟性があります:
- GitLabと同じサーバーでPagesデーモンを実行し、セカンダリIPでリッスンします。
- 別のサーバーでPagesデーモンを実行します。この場合、PagesデーモンをインストールしたサーバーにもPagesのパスが存在する必要があるため、ネットワーク経由で共有する必要があります。
- GitLabと同じサーバーでPagesデーモンを実行し、同じIP上の別のポートでリッスンする。その場合、ロードバランサーによるトラフィックのプロキシ処理が必要になります。このルートを選択する場合、HTTPSではTCPロードバランシングを使用する必要があります。TLS終端(HTTPSロードバランシング)を使用する場合、ユーザーが提供する証明書ではページを配信できません。HTTPの場合、HTTPまたはTCPTCP負荷分散を使用できます。
このドキュメントでは、最初のオプションを前提として説明を進めます。カスタムドメインをサポートしていない場合、セカンダリIPは必要ありません。
前提要件
Pagesの設定に進む前に、以下を確認してください:
- GitLab Pagesの提供に使用する別のドメインが必要です。このドキュメントでは、それが
example.ioであると想定しています。 - そのドメインのwildcard DNS record(ワイルドカードDNSレコード)を設定している必要があります。
- Pagesのアーティファクトを圧縮および解凍するために必要なため、GitLabがインストールされている同じサーバーに
zipおよびunzipパッケージがインストールされている必要があります。 - オプション。HTTPSでPagesを提供する場合は、そのドメインのwildcard certificate(ワイルドカード証明書)(
*.example.io)を用意します。 - オプション(推奨): ユーザーが独自のものを持ち込む必要がないように、インスタンスRunnerを設定して有効にしている必要があります。
DNS設定
GitLab Pagesは、独自の仮想ホストで実行されることを想定しています。DNSサーバー/プロバイダーで、GitLabを実行しているホストを指すワイルドカードDNS Aレコードを追加する必要があります。たとえば、次のようなエントリになります:
*.example.io. 1800 IN A 192.0.2.1example.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 makeGitLabインストールディレクトリに移動します:
cd /home/git/gitlabgitlab.ymlを編集し、pages設定で、enabledをtrueに、hostをGitLab Pagesの提供元となるFQDNに設定します:## GitLab Pages pages: enabled: true # The location where pages are stored (default: 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.comGitLab PagesとGitLabを同じホストで実行する場合は、
httpアドレスを使用できます。httpsを使用し、自己署名証明書を使用する場合は、カスタム認証局をGitLab Pagesで使用できるようにしてください。たとえば、SSL_CERT_DIR環境変数を設定することで、これを行うことができます。シークレットAPIキーを追加します:
sudo -u git -H openssl rand -base64 32 > /home/git/gitlab/gitlab-pages-secretpagesデーモンを有効にするには:
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.confNGINXを再起動します。
GitLabを再起動します。
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 makegitlab.ymlで、ポートを443に、httpsをtrueに設定します:## GitLab Pages pages: enabled: true # The location where pages are stored (default: 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.confNGINXを再起動します。
GitLabを再起動します。
高度な設定
ワイルドカードドメインに加えて、GitLab Pagesがカスタムドメインで動作するように設定することもできます。この場合も、カスタムドメインでTLS証明書を使用する、使用しないの2つのオプションがあります。最も簡単なセットアップは、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を編集します。GitLab Pagesの提供元となるFQDNにhostを変更する必要があります。pagesデーモンが接続をリッスンするセカンダリIPにexternal_httpを設定します:pages: enabled: true # The location where pages are stored (default: 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を再起動します。
GitLabを再起動します。
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を編集します。GitLab Pagesの提供元となるFQDNにhostを変更する必要があります。pagesデーモンが接続をリッスンするセカンダリIPにexternal_httpとexternal_httpsを設定します:## GitLab Pages pages: enabled: true # The location where pages are stored (default: 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を再起動します。
GitLabを再起動します。
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によって認証されます。Pagesは受信したリクエストごとにGitLab APIにリクエストを送り、ユーザーにそのサイトを閲覧する権限があるかどうかを確認します。
Pagesのアクセス制御パラメータは設定ファイルで設定され、慣例によりgitlab-pages-configという名前が付けられます。この設定ファイルは、-config flagまたはCONFIG環境変数を使用してページに渡されます。
Pagesへのアクセス制御はデフォルトで無効になっています。有効にするには、次の手順に従います:
config/gitlab.ymlファイルを変更します:pages: access_control: trueGitLabを再起動します。
新しいシステムOAuthアプリケーションを作成します。これは
GitLab Pagesと呼ばれ、Redirect URLはhttps://projects.example.io/authである必要があります。これは「信頼できる」アプリケーションである必要はありませんが、apiスコープが必要です。次の引数を使用して設定ファイルを渡して、Pagesデーモンを起動します:
auth-client-id=<OAuth Application ID generated by GitLab> auth-client-secret=<OAuth code generated by GitLab> auth-redirect-uri='http://projects.example.io/auth' auth-secret=<40 random hex characters> auth-server=<URL of the GitLab instance>これで、ユーザーはプロジェクトの設定からアクセス制御を設定できるようになります。
ストレージパスを変更する
GitLab Pagesのコンテンツを保存するデフォルトのパスを変更するには、次の手順に従います。
ページはデフォルトで
/home/git/gitlab/shared/pagesに保存されます。別の場所に保存する場合は、gitlab.ymlのpagesセクションで設定する必要があります:pages: enabled: true # The location where pages are stored (default: shared/pages). path: /mnt/storage/pagesGitLabを再起動します。
Pagesの最大サイズを設定する
プロジェクトごとの解凍されたアーカイブの最大サイズのデフォルトは100 MBです。
この値を変更するには:
- 左側のサイドバーの下部で、管理者を選択します。
- 設定 > 設定を選択します。
- Pagesを展開します。
- Maximum size of pages (MB)(Pagesの最大サイズ(MB))の値を更新します。
バックアップ
ページは通常のバックアップの一部であるため、設定するものはありません。
セキュリティ
クロスサイトスクリプティング攻撃を防ぐために、GitLab PagesをGitLabとは異なるホスト名で実行することを強くおすすめします。