Skip to content

This is a web server for Gitlab pages or Gitlab review apps.

License

Notifications You must be signed in to change notification settings

m3dev/gitlab-access-controlled-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gitlab-access-controlled simple web server

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.htmlhttp://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フォルダ下のファイルを参照してください。

About

This is a web server for Gitlab pages or Gitlab review apps.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published