GitHub/CircleCI/Slack/Docker Hub/DatadogをまとめたようなOSS、Omnibus GitLabのインストール（8,9,10対応）


__※ GitLab 9対応を確認しました。__
__※ GitLab 10対応を確認しました。__

[アップグレード記事はこちら](http://qiita.com/boiyaa/items/eb5f67064e3855393012)

## 対象
* なんらかの理由でGitHubやGitHub Enterpriseを使えない方
* タダで似たようなツールを使いたい方

## Omnibus GitLabとは
GitLabシリーズとそれらに必要なミドルウェアを同梱したパッケージです。

元々GitLabはその名の雰囲気通りGitHubのクローンで、Gitリポジトリマネージャだったそうなのですが、その範囲を超えて他のモダンな開発ツールの機能をどんどん取り込んでいて、今や開発コラボレーションプラットフォームになっています。
![gitlab_features.png](https://qiita-image-store.s3.amazonaws.com/0/142668/7078f094-9b42-4a90-b835-6da688689951.png "gitlab_features.png")

GitLabのサービスとそれに相当する巷のサービスをまとめてみました。※完全に機能が一致するわけではありません。

| GitLabサービス              | 巷のサービス  | 用途                |
| ------------------------- | ------------ | ------------------ |
| GitLab                    | GitHub       | Git管理、プルリク     |
| GitLab Snippets           | GitHub Gist  | コードスニペット共有   |
| GitLab Pages              | GitHub Pages | 静的サイトホスティング |
| GitLab Board              | ZenHub       | タスク管理           |
| GitLab CI                 | CircleCI     | CI                 |
| GitLab Container Registry | Docker Hub   | Dockerイメージ管理    |
| GitLab Mattermost         | Slack        | チームチャット        |
| GitLab Prometheus <font color="Red">NEW</font> | Datadog | コンテナ監視 |


## システム要件

* 2コア4GB推奨
* ストレージはソフトウェアだけで10GBほど
* 対応OSはLinuxのみ


## インストール
インストールもアップデートも簡単にできるDocker Composeでのインストール方法を採用します。

### 事前準備
Docker1.10.0+, Docker Compose1.6.0+がインストールされている環境を用意してください。
Docker for Windowsには非対応ですので、Windowsの場合は、[Docker Toolbox](https://www.docker.com/products/docker-toolbox)や、Vagrant（[サンプル](http://qiita.com/boiyaa/items/7b14551d973e0cdded04)）などでLinux仮想マシン上にDocker環境を用意してください。


### Step 1. docker-compose.ymlを作成する
以下のコードを`docker-compose.yml`という名前で保存してください。

```yml:docker-compose.yml
version: '2'
services:
  gitlab:
    container_name: gitlab
    image: gitlab/gitlab-ce:latest
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        ## GitLab configuration settings
        ##! Check out the latest version of this file to know about the different
        ##! settings that can be configured by this file, which may be found at:
        ##! https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/files/gitlab-config-template/gitlab.rb.template

        ## GitLab URL
        ##! URL on which GitLab will be reachable.
        ##! For more details on configuring external_url see:
        ##! https://docs.gitlab.com/omnibus/settings/configuration.html#configuring-the-external-url-for-gitlab
        external_url 'http://gitlab.example.com'

        ################################################################################
        ## gitlab.yml configuration
        ##! Docs: https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/gitlab.yml.md
        ################################################################################

        gitlab_rails['gitlab_ssh_host'] = 'ssh.gitlab.example.com'
        gitlab_rails['time_zone'] = 'UTC'

        ################################################################################
        ## Container Registry settings
        ##! Docs: https://docs.gitlab.com/ce/administration/container_registry.html
        ################################################################################

        registry_external_url 'http://registry.gitlab.example.com'

        ################################################################################
        ## GitLab Pages
        ##! Docs: https://docs.gitlab.com/ce/pages/administration.html
        ################################################################################

        pages_external_url 'http://pages.example.com/'

        ################################################################################
        ## GitLab Mattermost
        ##! Docs: https://docs.gitlab.com/omnibus/gitlab-mattermost
        ################################################################################

        mattermost_external_url 'http://mattermost.example.com'
    volumes_from:
      - gitlab-data
    ports:
      - "80:80"
      - "2222:22"

  gitlab-data:
    image: busybox
    volumes:
      - /etc/gitlab
      - /var/log/gitlab
      - /var/opt/gitlab

  gitlab-runner:
    container_name: gitlab-runner
    image: gitlab/gitlab-runner:alpine
    restart: always
    volumes_from:
      - gitlab-runner-data
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "$HOME/.docker/config.json:/root/.docker/config.json"

  gitlab-runner-data:
    image: busybox
    volumes:
      - /etc/gitlab-runner
```

上記では各サービスに以下のドメインが指定されています。

| サービス            | ドメイン名                    |
| ------------------ | --------------------------- |
| GitLab             | gitlab.example.com          |
| Git SSH            | ssh.gitlab.example.com      |
| Container Registry | registry.gitlab.example.com |
| GitLab Pages       | pages.example.com           |
| Mattermost         | mattermost.example.com      |

`GITLAB_OMNIBUS_CONFIG`の部分で設定されているので、適宜変更してください。


### Step 2. サービスを起動する
さきほど作った`docker-compose.yml`のディレクトリ上で

```sh
$ docker-compose up -d
```

と実行すると、GitLabなど各種Dockerイメージのダウンロードが始まり、最終的に各種Dockerコンテナが作成され、起動します。
何かと時間のかかる処理が続くので、しばしお待ち下さい。（数分〜数十分）
各サービスの起動状況を確認するには以下を実行してください。

```shell-session
user@host ~ $ docker-compose ps
Name               Command               State                Ports        
---------------------------------------------------------------------------------
gitlab               /assets/wrapper      Up                   0.0.0.0:2222->22/t 
                                                        cp, 443/tcp,       
                                                        0.0.0.0:80->80/tcp 
gitlab-data          sh                   Exit 0                                  
gitlab-runner        /usr/bin/dumb-init   Up                                      
              /entryp ...                                                  
gitlab-runner-data   sh                   Exit 0                                  
```

上記のようにgitlabがUpになっていれば起動成功です。ポート80と、GitのSSH接続用ポート2222が開いている状態です。


### Step 3. ドメインを設定する

`docker-compose.yml`で指定したドメインをレコード設定してください。
GitLab Pagesは他と違い、例えば`docker-compose.yml`で`pages.example.com`と設定した場合、レコードは`*.pages.example.com`とワイルドカードで設定する必要があります。


### 以上
* ブラウザで`http://<GitLab URL>`にアクセスし、画面が表示されたらGitLabのインストール成功です。パスワード設定後、Usernameにroot、Passwordに先ほどのパスワードでログインできると思います。can't be reachedや502 Bad Gatewayの場合はまだ起動処理中なので、しばらく待ってからアクセスしてみてください。
![gitlab_init.png](https://qiita-image-store.s3.amazonaws.com/0/142668/0db90ead-ea56-ef70-4ce9-3ae726ed0d30.png "gitlab_init.png")

* `http://<Mattermost URL>`にアクセスし、画面が表示されたらGitLab Mattermostのインストール成功です。can't be reachedや502 Bad Gatewayの場合はまだ起動処理中なので、しばらく待ってからアクセスしてみてください。
![mattermost_init.png](https://qiita-image-store.s3.amazonaws.com/0/142668/b1792c4c-69c4-b2b5-cb82-df4f724e84fb.png "mattermost_init.png")

これで、GitHub, ZenHub, Slack, Docker Hub相当の機能（Git/Dockerリポジトリ管理、プルリク、カンバン、チームチャット等）が用意できました。



## おまけ

### CIを使う
GitLabのCI機能は、リポジトリ内の`.gitlab-ci.yml`のジョブをRunnerに投げる、という仕組みになっているので、
別サービスとして動いているGitLab RunnerサービスにRunnerを登録する必要があります。

* GitLabの`Admin Area` > `Runners`にアクセスし、`registration token`を確認する

* Runnerを登録する（registration-tokenパラメータを置き換える）

```shell-session
$ docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --name shared-runner \
  --url http://gitlab/ \
  --registration-token XXXXXXXXXXXXXXXXXXXX \
  --executor docker \
  --limit 2 \
  --docker-image docker:1.10 \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock
```


### GitLab Mattermostのビデオ通話を有効にする
プレビュー版ですが、WebRTCを利用したビデオ通話機能があり、Chrome/Firefox/Desktop Appに対応しているそうですが、私の環境ではFirefoxでしか動作しませんでした。

* `docker-compose.yml`の`GITLAB_OMNIBUS_CONFIG`に以下を追記する

```yml
        mattermost['webrtc_enable'] = true
        mattermost['webrtc_gateway_websocket_url'] = 'ws://mattermost.example.com:8188'
        mattermost['webrtc_gateway_admin_url'] = 'http://mattermost.example.com:7088/admin'
        mattermost['webrtc_gateway_admin_secret'] = 'janusoverlord'
```

* `docker-compose.yml`の`services`に以下を追記する

```yml
  mattermost-webrtc:
    container_name: mattermost-webrtc
    image: mattermost/webrtc:latest
    restart: always
    ports:
      - "7088:7088"
      - "8188:8188"
```

追記したymlは[こちら](https://gist.github.com/boiyaa/393cf873dc08bc74332ef3a145d41e23)

* `docker-compose up -d`を実行してサービスを再構築する

* Mattermostの`Account Settings` > `Advanced` > `Preview pre-release features`を開き、`Enable the ability to make and receive one-on-one WebRTC calls`を選択して保存する

* チャットのユーザー名をクリックしてユーザープロフィールを開いた時、有効にしたユーザー同士であればビデオボタンが表示されるので、ビデオ通話ができれば成功
![mattermost_video.png](https://qiita-image-store.s3.amazonaws.com/0/142668/809d68e6-033e-16a7-7d2b-64a1a769fafa.png "mattermost_video.png")


### 他色々使いそうなオプションを詰め込んだdocker-compose.yml
[docker-compose.yml configuring GitLab with Container Registry, Pages, CI, Mattermost (enabled WebRTC), and some other options](https://gist.github.com/boiyaa/c5109dc2d8c2d83ac5f8365daf8e3921)



## 参考
[Omnibus GitLab documentation](https://docs.gitlab.com/omnibus/)
[GitLab Community Edition documentation](https://docs.gitlab.com/ce/)
[Mattermost documentation](https://docs.mattermost.com/)