株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

AI素人がGitLab Duo Self-hostedをAzure OpenAIで構成する話

皆様こんにちは。SEの小池と申します。

2025年2月20日にリリースされたGitLab 17.9で、GitLab Duo Self-Hosted がGAされました。
GitLab Duo Self-hostedとは、オンプレミス版のSelf-managed GitLabにてDuoを利用にする場合に、自前で用意したLLMを使う構成です。

今回は GitLab Duo Self-hosted を Azure OpenAIでデプロイしたGTP-4oで構成 してみます。

この構成にはLLMに関する小難しい知識は要りません。検証だけならお金もあまりかからないので、GitLab Duo Self-hostedのお試し構成としてお勧めです。

本記事の対象の方

  • オンプレミス版であるSelf-managed版GitLabをお使いで、AI支援機能についてご興味がおありの方。
  • GitLab Duo Self-hostedの構成について情報収集なさっている方。
  • 具体的にGitLab Duo Self-hostedの検証をなさりたいとお考えの方。

今回のブログのゴール

このブログのゴールはこちらです。

今回のゴール
  • Self-managed GitLabとAzure OpenAIを用いて、Duo Self-hostedを構成する。
  • Self-managed GitLabで、GitLab Duo Chatを使えることを確認する。

事前ご連絡事項

  • 本記事はオンプレミス版である Self-managed GitLab Enterprise Edition v17.10.1-ee における仕様をベースに記載しております。それ以外のエディションやバージョンではこの記事に記載の通りではない可能性がございます。
  • 本記事の操作説明と画面ショットはGitLabのローカライズを日本語にした状態で説明しております。それ以外の言語をご利用の方は適宜読み替えてください。
  • 本記事は 2025年3月28日 時点の情報をもとに記載しております。この日より後に発生した機能の更新や利用可能なプランの変更については言及しておりません。ご了承ください。
  • 本記事に掲載されている情報は正確性・安全性を保証するものではありません。本記事の情報を利用することによって発生した損失や損害については、一切の責任を負いかねます。

GitLab Duo Self-hosted って何だっけか?

GitLab Duo Self-hostedとは、オンプレミス版Self-managed GitLabのDuoにおいて、GitLab社が用意している共用LLMとは異なる独自のLLMを利用できる構成 です。

GitLab Duo Self-hosted に関する概要は前回のブログをご参照ください。
blogs.networld.co.jp

必要なもの

GitLab Duo Self-hosted を Azure OpenAI で構成するときに必要なものは以下の表の通りです。
正直ライセンスさえ用意出来れば、他は何とかなるレベルです。

表1. GitLab DuoSelf-hosted をAzure OpenAIで構成する時に必要なもの
必要なもの 要件
Self-managed GitLab オンプレ or パブリッククラウド上を問わず。
公的な認証局によって署名されたサーバー証明書が適用されていること。
Self-hosted AI Gateway コンテナで起動。
オンプレ or パブリッククラウド上を問わず。
GitLabのOSに同居可。
Azure OpenAIでデプロイしたLLM Duo Self-hostedでサポートされるモデルであること。
ライセンス 下記の両方が必要。
  • GitLab本体のEnterprise Ultimate ライセンス
  • アドオンのGitLab Duo Enterpriseライセンス

GitLabのシステム要件はこちらのGitLab Docsをご参照ください。
参考 : GitLab installation requirements | GitLab Docs

また、Duo Self-hostedでサポートされているLLMはこちらのGitLab Docsをご参照ください。
参考 : Supported GitLab Duo Self-Hosted models and hardware requirements - Supported models | GitLab Docs

このブログで実現する構成

このブログで実現する構成は以下の通りです。
Azure OpenAIを使うということもあり、全体的にAzure上にまとめました。

表2. このブログで実現する構成の概要
構成要素 概要
Self-managed GitLab Azure上の仮想マシンにインストールする。
OSは Ubuntu 22.04.5 LTS
GitLabのバージョンは v17.10.1-ee
マシンサイズは Standard D4s v3 (4 vcpu 数、16 GiB メモリ) 。
Let's Encryptで発行した証明書を適用。
Self-hosted AI Gateway GitLabのOSに同居する。
Docker Engineで起動する。
バージョンは self-hosted-v17.10.1-ee
Azure OpenAIでデプロイしたLLM GPT-4oグローバル標準 でデプロイする。
ライセンス 下記の両方を事前に用意した。
  • GitLab本体のEnterprise Ultimate ライセンス
  • アドオンのGitLab Duo Enterpriseライセンス

構成概要図に関する諸注意
上の構成概要図ではGitLabとAI Gateway間 及び AI GatewayとOpenAI間の通信がインターネットに出ていますが、これは筆者の検証環境の設定によるものであり、実際の構成ではこれらの通信はインターネットに出る必要はありません。
(筆者の検証環境では、GitLabとAI Gateway間の通信でグローバルIPアドレスを使ったためインターネットに出ます。また、gpt-4oのデプロイ設定をグローバル標準にしているため、AI Gatewayとgpt-4o間の通信もインターネットに出ます。)

Azure OpenAIを使ってDuo Self-hostedを構成する

ここからは具体的な構成手順を紹介してまいります。
構成の流れは大まかに以下の通りです。

  1. Self-hosted GitLabを用意する
  2. Self-hosted GitLabでDuoを有効にする
  3. Self-hosted AI Gatewayを用意する
  4. AI Gatewayに関するパラメーターをGitLabに設定する
  5. Azure OpenAIでGPT-4oをデプロイする
  6. デプロイしたGPT-4oをGitLabに登録する

ブログの尺の都合で、GitLabのインストールなどの手順は割愛致します。
割愛した箇所はGitLab Docsの参照先リンクを都度載せておりますので、そちらをご参照ください。

Step1. Self-hosted GitLabを用意する

まずはSelf-hosted版GitLabを用意します。

前述の通り、このブログでは以下の要領で用意いたしました。

  • OSはUbuntu 22.04.5 LTS
  • GitLabはパッケージ版の v17.10.1-ee
  • Let’s Encryptで発行したサーバー証明書を適用。

いきなりで申し訳ありませんが、Self-managed版GitLabの詳細なインストール手順は、本ブログでは割愛致します。 今回検証用に新規でご用意なさる方は、パッケージ版を用いた簡易インストール手順 (こちら) をご参照の上、環境をご用意いただければと存じます。
参考 : Download and install GitLab | GitLab

また、このブログではDuo Self-hostedを構成することが目的のため、Self-hosted GitLabに対してroot以外のユーザーの追加、プロジェクトの作成などは一切実施しておりません。
・・・い、いいんですよ!このブログはGitLab Duo Self-hostedをAzure OpenAIで構成することが目的なので、細かいところはデフォルト値採用!と言い訳しておきます。

Step2. Self-hosted GitLabでDuoを有効にする

Step1で用意したGitLabにライセンスを適用し、Duoを使えるようにします。 GitLab Enterprise 及び Duo Enterpriseのアクティベーションコードを用意出来次第、適用していきましょう。

まずは管理者アカウントでGitLabのGUIからサインインし、画面左下の方にある [管理者] をクリックします。

左側のメニューから [サブスクリプション] を開きます。

[サブスクリプションを有効化] のテキストボックスに用意したアクティベーションコードを入力し、利用規約に関するチェックボックスを有効にし、[アクティブ化] をクリックします。

正常に適用されると、「サブスクリプションが有効になりました。以下の詳細を確認できます。」と表示されます。これでSelf-managed版GitLabにEnterpriseライセンスが適用されました。

続けて、Duoを有効にしていきます。
まず、ブラウザを一度更新します。すると、左側のメニューにDuoに関する項目が増えるので、[GitLab Duo] をクリックします。

[シートをアサイン] をクリックします。

GitLab環境に存在するユーザー一覧が表示されます。
今回Duo Self-hostedをお試しなさる方に対して、[GitLab Duo Enterprise] 列のトグルを有効にします。

この時点のGitLab Duoの設定に関する補足
この時点でGitLab Duoはデフォルトの設定、つまりGitLab社が公開しているAI GatewayとLLMを利用する設定となっています。なので、実はこの時点でGitLab Duo自体は使える状態となっています。
(このブログではDuo Self-hosted を Azure OpenAIで構成することを目的としているため、このままDuo Self-hostedの構成に必要な設定を施します。)

以上でStep2は完了です。

Step3. Self-hosted AI Gatewayを用意する

次に、Self-hosted AI Gatewayを用意します。
2025年3月28日現在、Self-hosted AI Gatewayはコンテナイメージでしか提供されていません。
今回はGitLabをインストールしたUbuntuの仮想マシンにSelf-hosted AI Gatewayを同居 (コンテナとして起動) させます。

本章の作業の流れは以下の通りです。

  1. GitLabをインストールしたUbuntuの仮想マシンに、Docker Engineをインストールします。
  2. Self-hosted AI gatewayをコンテナとして起動させます。
  3. Docker Engineのホストマシン (このブログの場合はGitLabをインストールしたUbuntuの仮想マシン) で、ポート5052を空けます。

まず、Self-hosted AI Gatewayのコンテナを起動するOSにSSHで接続し、Docker Engineをインストールしてください。
申し訳ないのですが具体的なDocker Engineのインストール手順は割愛致します。Dockerの公式ドキュメント (こちら) をご参照の上、Docker Engineをインストールなさってください。
参考 : Install | Docker Docs

Docker Engineのインストールが終わったら、さっそくSelf-hosted AI Gatewayをコンテナで起動しましょう。コマンド書式は以下の通りです。

docker run -d -p 5052:5052 \
 -e AIGW_GITLAB_URL=https://<GitLabのFQDNまたはIPアドレス>/ \
 -e AIGW_GITLAB_API_URL=https://<GitLabのFQDNまたはIPアドレス>/api/v4/ \
 registry.gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/model-gateway:self-hosted-<GitLabと同バージョン文字列>

例えば、Step1で用意したGitLabのバージョンが v17.10.1-ee で、URLが https://gitlab-instance.sample.com なら以下のようなコマンドとなります。

docker run -d -p 5052:5052 \
 -e AIGW_GITLAB_URL=https://gitlab-instance.sample.com/ \
 -e AIGW_GITLAB_API_URL=https://gitlab-instance.sample.com/api/v4/ \
 registry.gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist/model-gateway:self-hosted-v17.10.1-ee

コマンドdocker psを実行し、AI Gatewayのコンテナが起動していることと、AI Gatewayコンテナのポート5052がホストOSのポート5052とマッピングされていることを確認してください。以下は出力例です。

最後に、GitLabからAI Gatewayコンテナのポート5052に対する通信を許可します。以下の図はAzureのネットワークセキュリティグループの設定画面です。

以上でStep3は完了です。

Step4. AI Gatewayに関するパラメーターをGitLabに設定する

Step1で用意したGitLabがStep3で起動したAI Gatewayを利用するように設定します。

本章の作業の流れは以下の通りです。

  1. GitLabの設定ファイルgitlab.rbを編集し、その内容をGitLabに反映させます。
  2. GUIの管理画面から、Self-hosted AI Gatewayを参照させる設定をします。

まず、GitLabをインストールした仮想マシンにSSHで接続し、GitLabの設定ファイル/etc/gitlab/gitlab.rbを編集します。(任意でバックアップを取得なさってください。)
任意の場所に以下の3行を追記します。

gitlab_rails['env'] = {
    'AI_GATEWAY_URL' => 'http://<AI Gatewayのコンテナを起動したホストOSのFQDNかIPアドレス>:5052'
}

本ブログの構成の場合、GitLabとAI Gatewayコンテナは同じOS上にあるため、AI Gatewayのコンテナを起動したホストOSのFQDNは、GitLabがインストールされた仮想マシンのFQDN (例えばgitlab-instance.sample.comなど) と同じとなります。
本ブログと構成と異なる場合は適切な値を設定して下さい。

gitlab_rails['env'] = {
    'AI_GATEWAY_URL' => 'http://gitlab-instance.sample.com:5052'
}

ファイル/etc/gitlab/gitlab.rbに追記が完了したら、コマンドgitlab-ctl reconfigureを実行し、GitLabを再構成します。GUIでログインできるようになるまで結構時間がかかることがありますが、気長にお待ちください。

GitLabの再構成が終わったら、GitLabのGUIに管理者権限を有するユーザーでサインインし、画面左下の [管理者] をクリックします。

左のメニューから [GitLab Duo] を開き、[設定の変更] をクリックします。

[ローカルAIゲートウェイURL] のテキストボックスに、http://<Self-hosted AI Gatewayコンテナを起動したホストOSのFQDN or IP>:5052と入力します。

任意で [Self-hosted beta models and features] > [Use beta models and features in GitLab Duo Self-Hosted] のチェックボックスを有効にします。この項目を有効にすると、GitLab Duo Self-hostedのGAされていないベータ版機能を利用することができます。
このブログでは例として有効にしています。

[変更を保存] をクリックします。

「アプリケーション設定は正常に保存されました。」と表示されます。
なお、この時点でヘルスチェックが失敗していても、気にせず次のステップへ進んでください。

以上でStep4が完了です。

Step5. Azure OpenAIでGPT-4oをデプロイする

AzureポータルからDuo Self-hostedで使うLLMをデプロイします。

Azureポータルにアクセスし、検索ボックスからOpenAIと入力し、候補に表示された [Azure OpenAI] をクリックします。

Azure OpenAIの画面が表示されるので、[+ 作成] をクリックします。

サブスクリプションなどを任意に設定し、[次へ] をクリックします。下図はこのブログでの設定例です。

続けてネットワークセキュリティを任意に設定します。先ほどコンテナで起動したSelf-hosted AI Gatewayからアクセスできるように設定します。下図はこのブログでの設定例です。

タグを任意に設定し、[次へ] をクリックします。

設定内容を確認し、[作成] をクリックします。

作成したAzure OpenAIの概要画面へ移動し、[Go to Azure AI Foundry portal] をクリックします。

別タブで [Azure AI Foundry] という画面が表示されます。
左側のメニューから [デプロイ] を開き、[+ モデルのデプロイ] > [基本モデルをデプロイする] をクリックします。

一覧からGitLab Duo Self-hostedでサポートされているモデルを選択し、[確認] をクリックします。今回は gpt-4o で進めます。
参考 : Supported GitLab Duo Self-Hosted models and hardware requirements - Supported models | GitLab Docs

デプロイの種類などを任意に設定した後、[デプロイ] をクリックします。下図はこのブログでの設定例です。

デプロイが完了後、下の画面の "ターゲットURL" と "キー" と "名前" をメモしておきます。これらの値は次のステップで使います。

以上でStep5は完了です。

Step6. デプロイしたGPT-4oをGitLabに登録する

Step5でデプロイしたLLMをGitLabに登録します。

まずは管理者アカウントでGitLabのGUIからサインインし、画面右下の方にある [管理者] をクリックします。

左側のメニューから [GitLab Duoセルフホスト] を開き、画面右上の [セルフホスト モデルの追加] をクリックします。

以下の表の通り設定します。

表3. セルフホスト モデルの追加
設定項目 設定値
デプロイ名 任意の文字列を指定します。
このブログでは例としてAzure OpenAI gpt-4oと設定します。
プラットフォーム プルダウンからAPIを選択します。
モデルファミリー プルダウンからGPTを選択します。
エンドポイント Step4の最後でメモしたターゲットURLを設定します。
モデルの識別子 "プロバイダ/Step4の最後でメモしたモデルの名前"の形式で設定します。
このブログの場合は、azure/gpt-4oと設定します。
APIキー(オプション) Step4の最後でメモしたキーを設定します。

[接続をテスト] をクリックします。
接続がうまく行くと画面上部に「セルフホストモデルへの接続に成功しました。」と表示されます。

接続が成功することを確認後、[セルフホストモデルの作成] をクリックします。

続けて、[AI搭載機能] タブを開きます。

AI支援を利用できる機能一覧が表示されます。
各機能の行の右側にプルダウンがあります。このプルダウンで登録済のセルフホストLLMを指定選択することができます。このブログでは例として、表示されているすべての機能について先ほど登録したセルフホストLLMを指定します。

続けて左のメニューの [GitLab Duo] を開きます。

[ヘルスチェックを実行する] をクリックし、すべての項目に緑のチェックが表示されていることを確認します。

これで、GitLab Duo Self-hosted を Azure OpenAI で構成する全ての手順が完了しました。

GitLab Duo Chatを使って動作確認

構成は出来た (と思う) ので、実際に GitLab Duo Chat の General Chat (とどのつまり普通のチャット機能) を使って動作確認してみましょう。念のため、今回作成したSelf-hosted AI Gatewayを経由していること、今回Azure OpenAIにデプロイしたGPT-4oから応答をもらっていることも併せて確認します。

下準備としてまず、Self-hosted AI Gatewayのログを表示するようにします。
Self-hosted AI Gatewayコンテナが実行されているホストOS上で、コマンドdocker logs --follow <AI gatewayのコンテナID>を実行します。これでSelf-hosted AI Gatewayコンテナのログ出力をフォローし続けます。
この画面はそのままにして、次の手順を進めてください。

GitLabのGUIに任意のユーザーでログインし、任意のグループに移動します。このブログでは検証用としてグループ "GRP" を作成しました。
このグループページの右上にある [GitLab Duo Chat] をクリックします。

画面右側にチャット画面が表示されるので、適当な質問を入力して送信します。
ここでは例として以下の文章を入力しました。

GitLabのCI/CDパイプラインを試したいので、サンプルのyamlファイルを作成してください。
ステージとジョブは任意に設定し、処理内容はechoのみとしてください。

応答が返ってくることを確認します。

コマンドdocker logs --follow <AI gatewayのコンテナID>を実行したターミナル画面を表示してください。
先ほどのチャットがSelf-hosted AI Gatewayを経由していれば、ログが出力されているはずです。以下の画像は出力例です。

また、Azure AI Foundry ポータル画面から今回デプロイしたLLMを利用しているかを確認することができます。 Azure AI Foundry ポータルにアクセスし、今回デプロイしたLLM名をクリックします。

[メトリック] タブを開くと、"トークンの使用状況" と "1 分あたりの要求数" が表示されます。
このグラフから、LLMにリクエストが来ているのか否かを判断することができます。

うまく動作しないときに確認するところ

チャットの応答がない場合、以下の点をご確認いただき切り分けていただければと存じます。

AI Gatewayコンテナの確認ポイント

  • AI Gatewayのコンテナが起動しているか。
  • AI GatewayのコンテナイメージのバージョンはGitLabと同じか。
  • 5052でホストOSとポートマッピングされているか。
  • 起動時の変数AIGW_GITLAB_URLAIGW_GITLAB_API_URLの設定値が正しいか。
  • AI Gatewayコンテナが起動するホストOSのポート5052に対して通信可能か。
  • ブラウザでhttp://<AI GatewayコンテナのホストOSのFQDN or IP>:5052にアクセスしたときに{"error":"No authorization header presented"}と表示されるか。
  • GitLab Duo Chatでプロンプトを投げたとき、コンテナのログに出力があるか。
  • 起動しているAI Gatewayコンテナを停止・削除し、新しくAI Gatewayのコンテナを起動させる。

GitLabの確認ポイント

  • GitLab Duoのヘルススチェックにエラーは出ていないか。
  • [ローカルAIゲートウェイURL] に設定したURLは正しいか。
  • セルフホストLLM登録画面の [接続をテスト] をクリックしたとき、エラーが出ていないか。
  • GitLab Duo ChatのGeneral Chatに対して、セルフホストLLMを利用するように設定しているか。

Azureの確認ポイント

  • GitLab Duo Chatからプロンプトを投げた際に、LLM側のメトリクスグラフに変化があるか。
  • 任意の端末からデプロイしたLLMに対してリクエストを投げ、応答を得られるか。
  • デプロイしたLLMのレート制限を超過していないか。

ちなみに筆者はGitLab Duo Chatできちんと応答が返ってきたことに喜び、どうでもいいことを短時間に質問しまくった結果、デプロイしたLLMのレート制限を超過しました。
レート制限は1分あたりの総トークン数 (プロンプトトークンと完了トークンの合計) で設定されていることが多いです。もし「たまに失敗するがしばらくするとちゃんと動く」というような挙動の場合は1分あたりの総トークン数を超過していないかご確認ください。

最後に

この度は AI素人が GitLab Duo Self-hosted を Azure OpenAI で構成する話 をお読みいただき、誠にありがとうございます。
このブログの目標は以下のとおりでしたが、皆さまはいかがでしたでしょうか。


今回のゴール
  • Self-managed GitLabとAzure OpenAIを用いて、Duo Self-hostedを構成する。
  • Self-managed GitLabで、GitLab Duo Chatを使えることを確認する。

GitLab Duo Self-hostedがGAされたことにより、AI支援機能を利用するための構成の選択肢が大きく広がりました。

今回はLLMのデプロイ設定を "グローバル標準" にしましたが、これを自国のリージョンにデプロイすることで、「データを国外に出してはいけない」といった厳しいコンプライアンスがある開発現場でもAI支援機能を使うことができます。

会社の方針や取り扱うデータの観点でAI支援機能を諦めていた開発者の方は、是非GitLab Duo Self-hostedをご検討いただけますと幸いにございます。

この記事がGitLabを触り始めた方の一助となれば幸いにございます。