DockerでのGitLab構築時に自動で日本語化パッチをあてる

# GitLabって全部英語
社内で使おうと用意していたんですが、GitLabを起動してみると全部英語。開発速度を犠牲にしたくないという方針らしいですが・・・。
自分だけとか、小さいグループで使う分には慣れればいいけど、いろんな人が気軽に使えるようにという方針で構築する場合は日本語でないと使う人が増えない。
でも、重要なシステムではないのでこれのために時間は大きく割けない。


# 日本語化パッチを当てる
じゃあどうしているかというと、@ksoichiroさんの[gitlab-i18n-patch](https://github.com/ksoichiro/gitlab-i18n-patch)を使わせて頂いてます。
すべてではありませんが基本的な部分は翻訳されていて、さらに、基本的に新バージョンが出て数日で(！)パッチをリリースされています。
したがって、定期的にバージョンアップをするくらいであれば全く問題ありません。


# 方針
docker-composeという簡単に構築・再構築が可能なものがあるのでこちらを使います。
バージョンアップも構成ファイルのバージョンを書き換えてupするだけです。
あと、せっかくdocker-composeを使うので、リバースプロキシを使って80番ポート+サブディレクトリからアクセス出来るようにしようと思います。
他にもMediaWikiとか、Redmineとか、同じサーバー・ポート番号で使用する場合に便利です。(検証してない)
(リバースプロキシはついでなのでhttpsは割愛します。あと、SSHは検証していないのですが、多分GitLabのポートを公開すれば大丈夫じゃないかなと思います。)


# docker-composeを使って構築
環境は Ubuntu 16.04 LTS を使用しています。最小限の設定しか行いませんので(特にnginx)、必要な設定は追加でお願いします。
あと、導入する前に必ず検証をお願いします。(一応動くことは確認していますが、念のため。)

ファイル構成は以下の通りです。(ボリュームはホストからマウントするため、実行すると実データが各ディレクトリ配下に出来ます。)

```text
gitlab
│  docker-compose.yml
│
├─gitlab
│      dockerfile
│
└─nginx
       default.conf
```

## dockerの環境構築をする
こちらはインストールするだけです。

```bash
sudo apt-get -y install docker.io docker-compose
```

## dockerfileを作成する
続いてGitLabのdockerfileです。今回のメインとなります。
ポートとか、ボリュームとか、環境変数とかは変更しやすいようにdocker-compose.ymlに定義しているのでイメージとパッチ適用処理のみとなります。
イメージのバージョンはここで定義する必要があるので、パッチもここで定義するようにしています。
パッチのバージョンは[こちら](https://github.com/ksoichiro/gitlab-i18n-patch/tree/master/patches)から確認できますので、最新または必要なバージョンを下記のdockerfileに記載します。

```bash:gitlab/dockerfile
#イメージのバージョン(パッチに合わせること)
FROM gitlab/gitlab-ce:9.1.1-ce.0

# patchとcurlをインストールする
RUN apt-get update && apt-get -y install patch curl
# パッチをcurlを使ってダウンロードする。(バージョンはv9.1.1の部分を変える)
RUN curl https://raw.githubusercontent.com/ksoichiro/gitlab-i18n-patch/master/patches/v9.1.1/app_ja.patch -o /tmp/app_ja.patch
#パッチの適用
RUN cd /opt/gitlab/embedded/service/gitlab-rails && patch -p1 < /tmp/app_ja.patch

```


## docker-compose.ymlを作成する
すべてのコンテナの定義を行います。
ボリュームコンテナを作成していますが、これはマウントするフォルダをまとめて管理するために置いています。(バックアップとかしないので、起動もしていません。)
`links`はnginxからアクセスするために必要な記載です。この名前がhostsに登録されるらしいです。
`example.com`は環境に合わせて変更してください。
`restart: always`を指定していますので、再起動後も自動で起動します。
`GITLAB_OMNIBUS_CONFIG`に設定を追加することで反映されていきます。

```yaml:docker-compose.yml
version: "2"

services:
# GitLabのデータボリュームコンテナ
  gitlab-data:
    image: library/busybox:latest
    volumes:
      - ./gitlab/config:/etc/gitlab
      - ./gitlab/logs:/var/log/gitlab
      - ./gitlab/data:/var/opt/gitlab

# GitLab本体
  gitlab:
    build: gitlab
    restart: always
    volumes_from:
      - gitlab-data
    expose:
      - "80"
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://example.com/gitlab/'

# リバースプロキシのデータボリュームコンテナ
  reverseproxy-data:
    image: library/busybox:latest
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx/logs:/var/log/nginx

# リバースプロキシ本体
  reverseproxy:
    image: library/nginx:latest
    restart: always
    volumes_from:
      - reverseproxy-data
    links:
      - gitlab
    ports:
      - "80:80"

```


## リバースプロキシのconfファイルを作成する
最後にリバースプロキシのファイルを作成します。
サーバー名はdocker-compose.ymlのlinksに指定した名前を使用します。
注意すべきは`/asset`へのアクセスを転送をする必要があるというところでしょうか。(他の連携で地味に困ったりします。)

```nginx:nginx/default.conf
server {
    listen 80;
    server_name localhost;

    location /gitlab {
        proxy_pass http://gitlab;

        access_log /var/log/nginx/gitlab_access.log;
        error_log /var/log/nginx/gitlab_error.log;
    }

    location /asset {
        proxy_pass http://gitlab/gitlab/asset/;

        access_log /var/log/nginx/gitlab_access.log;
        error_log /var/log/nginx/gitlab_error.log;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location / {
        root /usr/share/nginx/html;
        index index.html;
    }
}

```

## 起動する
後は起動するだけです。

```bash
sudo docker-compose build
sudo docker-compose up -d
```

http://example.com/gitlab/ にアクセスすることでGitLabが使用できます。


## バージョンアップ
なんと、バージョンアップはdockerfileを書き換えて再度ビルド・起動するだけという簡単さ。
(もちろん実環境では実行前に検証してください。)


# 終わりに
GitLabって、以前は構築がややこしくて挫折したのと、どうしてもアイコンが好きになれなかったので使ってなかったのですが、改善された上に、検証していくうちにこんなことまで出来るの！？という驚きもあり、導入に踏み切りました。(実はまだ本稼働はしていません。)
日本語化だけがネックだったのですが、@ksoichiroさんのおかげで使いやすくなりました。ありがとうございます。

あと、初めてdockerで構築しましたが、やっぱり構成ファイルの書き方になれるまでが壁かなと。
ちなみに、Container Linux(旧CoreOS)も考えてはいますが、新規インストール→ログインまでが大きな壁なのと、メンテナンスが要検討なのでまだまだ先ですね。

ではでは、よいオープンソースライフを！

# 参考
* [gitlab-i18n-patch](https://github.com/ksoichiro/gitlab-i18n-patch)
* [GitHubクローン「GitLab」を日本語化して使う方法 - Qiita](http://qiita.com/ksoichiro/items/f63196aa0a7f07c1862d)
* [NGINX settings - GitLab Documentation](https://docs.gitlab.com/omnibus/settings/nginx.html)