docker-composeによる GitLabの実行と運用

## GitLab環境作成
 2018年内のGitHub買収が決まりました。ここでGitLabへのインポートが突如スパイクした訳なのですが、GitLab環境をローカルに構築した事もあって、GitLab環境の整備の仕方や、DR方法を書いていきたいと思います。何だかんだでアジャイル人間なので徐々にこの項も更新していきます。
※因みにあまり知らなくても良いですがGitLabはRuby On Railsで出来ています。

## DockerとDocker-compose
 Dockerはコンテナ環境ですが、複数コンテナによるアプリケーションを素早く立ち上げるコマンドに `docker-compose`というものがあります。今回この`docker-compose`を使用してGitlabとそのデータベースであるPostgresql、キャッシュのRedisを導入します。
  
 まずDocker環境ですが、詳しくは述べません。CentOSやUbuntu辺りを入れて、Docker社のページを参考に環境構築します。
 yumやyast、apt-get 等で簡単にインストール可能です。  

 docker-composeに関しては、多少厄介です。Docker社の出しているインストラクションが古かった為、私はバイナリを落とし、パスを通して使いました。
　※この辺ですかね…
 https://github.com/docker/compose/releases

## Gitlab用のdocker-compose.yml
　docker-composeは、基本的にdocker-compose.yml という設定ファイルを使用してコンテナを起動します。  
  GitLab用には、　　https://github.com/sameersbn/docker-gitlab があります。このリポジトリをクローンするか、あるいはdocker-compose.yml のみをダウンロードして使用します。
　Gitlabの頻繁なupgradeと共に、このdocker-compose.yml ファイルも頻繁にUpdateされていきます。したがって、この記事の正確性は保証できません…
　基本的に、このファイルで変更すべき部分は外部開放のポート、タイムゾーン、ホスト名、バックアップ、LDAP、Proxy設定でしょうか。参考までに私が設定した項目を記述します。ADと同期したのでLDAP設定をしていますが、これはオプションです。使用しない場合はLDAPで始まる環境変数は無視してください。

|項目  |値  |概要  |
|---|---|---|
|gitlab:image  |sameersbn/gitlab:10.7.4  |GitLabのバージョン  |
|gitlab:ports  |4080:80  |外部開放するポート番号（http）  |
|gitlab:ports  |4022:22  |外部開放するポート番号（ssh）  |
|TZ・GITLAB_TIMEZONE  |Asia/Tokyo・Tokyo  |タイムゾーン  |
|GITLAB_HOST  |該当ホストのホスト名又はIP  |同左  |
|GITLAB_PORT  |4080  |外部開放するポート番号（http）  |
|GITLAB_SSH_PORT  |4022  |外部開放するポート番号（ssh）  |
|GITLAB_BACKUP_SCHEDULE  |daily  |バックアップの頻度  |
|GITLAB_BACKUP_TIME  |1:00  |バックアップの時間  |
|GITLAB_BACKUP_EXPIRY  |259200  |バックアップの保存期間（秒）  |
|GITLAB_ROOT_PASSWORD  |password  |管理者パスワード！！  |
|LDAP_ENABLED  |true  |LDAP（AD）を有効にするかどうか  |
|LDAP_HOST  |ADのドメインコントローラ  |同左  |
|LDAP_PORT  |389  |ADのポート番号  |
|LDAP_UID  |ADのユーザーID  |同左  |
|LDAP_METHOD  |plain  |同左  |
|LDAP_BIND_DN  |バインドするドメイン名称  |同左  |
|LDAP_PASS  |パスワード  |同左  |
|LDAP_ACTIVE_DIRECTORY  |true  |LDAPがADであるかどうか  |
|LDAP_BASE |コモンネーム  |同左  |
|http_proxy  |  |GitLabから外にでる場合のプロキシ設定  |
|https_proxy  |  |同上  |

※AWS等のオブジェクトストレージに自動でバックアップする機能もありますが、色々はまったので設定していません…

## 起動・停止
基本的に起動は`docker-compose up -d`、停止は`docker-compose down`
です。初回はコンテナのイメージダウンロード等で時間が長く取られる事でしょう。
Postgres（DB）、Redis（Cache）、Gitlab　の３つのコンテナが起動します。

起動したら別段何にも考えずにVM のIP、設定したポートにアクセスします。
ログインは最初管理者ですので root 、設定したパスワードです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/192988/027a98fe-24f5-6508-1470-fa949f4e522a.png)

## バックアップ
docker-compose.yml に記述した設定に従って自動的にバックアップが取得されます。バックアップ取得先はホストと共有したディスクエリア`/srv/docker/gitlab/gitlab/backups/`に3世代（259200は三日です）取得されます。GITLAB_BACKUP_EXPIRYを指定しないと7日分取得されます。
GitLab自身に他のWEBストレージ（AWS S3など）へのバックアップ機能があります。
私の場合は自前でawsコマンドでS3とsyncするバッチを作成し、S3にバックアップを取得しました。
大体こんな感じです。

```sh
[root@S-Gitlab backups]# ls -lrt
合計 911880
-rw------- 1 1000 1000 311214080  6月  5 01:00 1528128033_2018_06_04_10.7.4_gitlab_backup.tar
-rw------- 1 1000 1000 311275520  6月  6 01:00 1528214443_2018_06_05_10.7.4_gitlab_backup.tar
-rw------- 1 1000 1000 311275520  6月  7 01:00 1528300834_2018_06_06_10.7.4_gitlab_backup.tar
[root@S-Gitlab backups]#
```

## リストア
リストア時にコンテナ側でgitaly というRPC用の口が上がっている必要があります。  
という事でGitLabのコンテナを上げたまま内部のGitlabのコマンドでリストアしましょう。
この時、`BACKUP`に該当バックアップのファイル名接頭辞を与えます。
ご丁寧にバージョン番号がついており、これが合わないとリストアできません。

```sh
docker exec -it gitlab_gitlab_1 /sbin/entrypoint.sh app:rake gitlab:backup:restore BACKUP=1526572830_2018_05_17_10.7.4
```

別マシンにリストアする場合は、URLの最後に`/users/sign_in`を付けないと元のサイトにリダイレクトされてしまう事があります。  
これは、GitLabが内部的にGITLAB_HOSTで指定されたURLを保持する為です。このURLは、管理者でログインし、Admin area（上部メニューのスパナ）のSettings（歯車）のメニューから、Sign-in restrictions の Home page URL と After sign out path を変更する事で変更可能です。  

※因みにですが個別バックアップもリストアと同じ理屈で実施可能です。バックアップ後はrestartしましょう。

```sh
docker exec -it gitlab_gitlab_1 /sbin/entrypoint.sh app:rake gitlab:backup:create
```

## バージョンアップ
３つのコンテナの内、Gitlabのコンテナだけ落として消します。これをしないと、致命的な場合がありました。
何故かは聞かないで下さい…
例えばこんな感じです。

```
docker stop gitlab_gitlab_1
docker rm gitlab_gitlab_1
docker-compose down 
vi docker-compose.yml
image: sameersbn/gitlab:10.6.2 -> 
image: sameersbn/gitlab:10.7.4
docker-compose up -d
```

## 備えあれば憂いなし
おすすめは、二つVMを用意し、二つdocker-compose を上げておき、一個のGitLabでバックアップを取得して二個目のGitlabでリストアしておく事です。まあリスクヘッジで基本ですが。頻繁にバージョンアップされると不安ですよね…
何が起きるかわからないので、2個目のVMで色々試します。

## 自己署名の証明書によるTLS化
HTTPSにする場合、自己署名の証明書でも良ければ、下記のように秘密鍵、証明書（公開鍵）と鍵交換用のパラメータを作成し、GitLabのディレクトリに格納してTLSに関連するパラメータを変更する事によりTLSにすることができます。

秘密鍵、証明書、DH（鍵交換パラメータ）の作成

```sh
sh-4.2$ openssl genrsa -out gitlab.key 2048
sh-4.2$ openssl req -new -key gitlab.key -out gitlab.csr # 証明書作成要求の作成のため、証明書作成にかかわる組織の情報を聞かれます
sh-4.2$ openssl x509 -req -days 3650 -in gitlab.csr -signkey gitlab.key -out gitlab.crt # 10年後に期限が切れます
sh-4.2$ openssl dhparam -out dhparam.pem 2048
```

作成した秘密鍵、証明書、DH（鍵交換パラメータ）を /srv/docker/gitlab/gitlab/certs に移します。秘密鍵のみパーミッションは400 にしておきます。

TLS関連パラメータの変更

|項目  |値  |概要  |
|---|---|---|
|gitlab:ports  |4443:443  |外部開放するポート番号（https）  |
|GITLAB_PORT  |4443  |外部開放するポート（http→https）  |
|GITLAB_HTTPS  |true  |SSL/TLSを有効にするか  |
|SSL_SELF_SIGNED  |true  |証明書が自己署名の証明書か  |

上記パラメータをTLS用にして起動（再作成）すると、https で4443 ポートにアクセスすることができます。


## ファイルのGitlabでの管理
Qiitaなので、下記の記事を参考にTourtoiseGitを導入しました。
Windowsの右クリックでGitが使え、尚且つファイルにリポジトリ状況を示すアイコンが付くので、重宝しています。世の中的にはVSCodeの Git Extentionがデファクトですかね。  
https://qiita.com/SkyLaptor/items/6347f38c8c010f4d5bd2

![2018-06-06 15_58_35-C__Users_O020151_Desktop_Knowledge.png](https://qiita-image-store.s3.amazonaws.com/0/192988/3584dc77-4474-3e33-ea4b-f3823ab6e1c0.png)