This is a web server for Gitlab pages or Gitlab review apps.
これはGitlabのアクセス権限設定に対応して静的コンテンツを提供するサーバーです。
Gitlab PagesやReview Appにアクセス制御を追加することを目的にしています。
このサーバーは、nginx + oauth2_proxy + 本アプリ の構成で利用します。
nginx
↓
oauth2_proxy ーoauth2 ー→ Gitlab
↓ |
server ー API ー┘
GitlabサーバーのOAuth2機能を使ってoauth2_proxyで認証を行い、
そこで取得したaccess tokenを本アプリに渡します。
本アプリでは受け取ったaccess tokenを使ってGitlab APIへアクセスし、
対象コンテンツのへアクセス可能かどうかを判定しています。
このサーバーが提供するコンテンツは、実行しているカレントディレクトリのファイルになります。
/srv/nginx/pagesというディレクトリで実行したのであれば、その中にある/srv/nginx/pages/file.htmlにhttp://example.com/file.htmlでアクセスできます。
アクセス可否の判定をするにあたって表示するコンテンツがどのプロジェクトに属しているかが問題になります。
これは、表示対象ディレクトリにプロジェクトIDを記入した.gitlab-info.jsonというファイルを配置して判断します。
.gitlab-info.jsonのフォーマットは以下の通りです。
{
"project_id": 1,
"requires_access_to_code": false
}project_idはGitlabのプロジェクトID(数値)です。requires_access_to_codeがfalseであれば対象のプロジェクトにアクセス可能であればコンテンツを返答します(実質的にGuest権限以上)。逆にtrueにするとgitリポジトリのファイルにアクセス可能な権限がなければアクセスを拒否します(実質的にReporter権限以上)。
表示対象のURLのパスの直下にこの.gitlab-info.jsonファイルがなければその上位ディレクトリを順番に探索して最初にみつけたものを使います。
例えばhttp://example.com/path/to/index.htmlにアクセスしたときに、/srv/nginx/pages/path/to/.gitlab-info.jsonにファイルがなければ/srv/nginx/pages/path/.gitlab-info.jsonを、それもなければ/srv/pages/.gitlab-info.jsonを探します。
実際に利用するときのセットアップ方法の例として、nginx + oauth2_proxy + 本サーバーの構成をDockerで起動できるようにしています。
docker-compose.yml ファイルの各環境変数を書き換えた上で起動してください。
このサーバーはGitlab Pages用のサーバーとして、http://myproj.example.com/myfile.htmlにアクセスしたら$PWD/pages/myproj/myfile.htmlの内容を返答します。
実際にGitlab PagesのコンテンツをGitlab-CIで生成するときは、以下のようにして.gitlab-info.jsonを作成してください。
# .gitlab-ci.yml
pages:
script:
# コンテンツ生成
- make some contents
- mv build public
# .gitlab-info.json生成
- echo "{\"project_id\": $CI_PROJECT_ID, \"requires_access_to_code\": false}" > public/.gitlab-info.json
artifacts:
paths:
- public具体的なnginxやoauth2_proxyの設定方法については、dockerフォルダ下のファイルを参照してください。