CentOS7に構築したGitLab8をSSL対応

# [概要]
SSLが無料で手に入る時代になったので、GitLabをSSL対応させる。

下記のQiitaの記事が参考にしてます。
[Let's encrypt運用のベストプラクティス](http://qiita.com/tkyk@github/items/9b6ba55bb2a6a5d90963?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items)

[GitLab Omnibus package の SSL 証明書を Let's Encrypt で取得する](http://qiita.com/yuuAn/items/09a434d3f6cffa31101e)

# [事前準備]
下記で構築したものを使います。
[CentOS7にGitLab8を構築](http://qiita.com/sabakan7/items/2faa6fc5f11e0410fc51)

# [作業内容]
## Let's Encrypt クライアントをクローン
### gitが必要なので、インストール
```bash
$ sudo yum install git
```

```bash
$ cd /opt
$ sudo git clone https://github.com/certbot/certbot
```

### Let's Encrypt クライアントで必要なパッケージをインストール
```bash
$ cd certbot/
$ sudo ./certbot-auto
```

### Let's Encrypt 用の設定を読み込むNginxファイルを用意
```bash
sudo vi /etc/gitlab/gitlab.rb
```

下記を追加すると、 `include` 設定をNginxに加えてくれるようになります。

```bash
nginx['custom_gitlab_server_config'] = "include /opt/letsencrypt/etc/nginx.conf;"
```
include 設定は、下記のファイルに追記されるようになります。
`/var/opt/gitlab/nginx/conf/gitlab-http.conf`

### Let's Encrypt 用の設定ファイル作成
```bash
### 設定ファイル置き場
$ sudo mkdir -p /opt/letsencrypt/etc

### ドキュメントルート作成
$ sudo mkdir /opt/letsencrypt/var

### Nginx の設定ファイル作成
$ sudo vi /opt/letsencrypt/etc/nginx.conf
```

```/opt/letsencrypt/etc/nginx.conf
location ^~ /.well-known {
    alias /opt/letsencrypt/var/.well-known;
}
```

### GitLabに設定を反映
```bash
$ sudo gitlab-ctl reconfigure
```

### 証明書取得のためのスクリプトを作成 [^1]

下記を参考に適宜変更してください。

```bash
$ sudo vim /opt/letsencrypt.sh
```

```bash
#!/bin/bash

#証明書のドメイン（,区切りで複数のドメインも指定可能）
DOMAIN=example.com

#ドキュメントルート（上のドメインで接続可能である必要がある）
WEBROOT=/var/www/example.com/public_html

#メールアドレス（トラブル時にメールが届く）
EMAIL=info@example.com

/opt/certbot/certbot-auto certonly --webroot -w $WEBROOT -d $DOMAIN -m $EMAIL --agree-tos --non-interactive $*
```

### スクリプトに実行権限付与
```bash
$ sudo chmod 755 letsencrypt.sh 
```

### テスト実行
```bash
sudo ./letsencrypt.sh --test-cert
### --test-cert は、SSL/TLS サーバ証明書の取得時に、ステージングサーバを使用して、無効な証明書を取得します。
```

下記のように表示されれば OK です。

```bash
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/gitlab/fullchain.pem. Your cert
   will expire on 2016-12-25. To obtain a new or tweaked version of
   this certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
```

### 本実行
下記のコマンドで、本番用の証明書ファイルを取得する。
```bash
$ sudo ./letsencrypt.sh --force-renewal
```

### SSL設定
```bash
$ sudo vim /etc/gitlab/gitlab.rb
```

下記のように `http://` の部分を `https://` に変更

```/etc/gitlab/gitlab.rb
external_url 'https://{ドメイン名}'
```

HTTPへのアクセスをHTTPSにリダイレクトする設定の有効化

```/etc/gitlab/gitlab.rb
# nginx['redirect_http_to_https'] = true
```

証明書のファイルパスを設定する

```/etc/gitlab/gitlab.rb
nginx['ssl_certificate'] = "/etc/letsencrypt/live/{ドメイン名}/fullchain.pem"
nginx['ssl_certificate_key'] = "/etc/letsencrypt/live/{ドメイン名}/privkey.pem"
```

### 設定を反映
```bash
$ sudo gitlab-ctl reconfigure
```

## [事後確認・作業]

# [参考サイト]
[^1]: [Let's encrypt運用のベストプラクティス](http://qiita.com/tkyk@github/items/9b6ba55bb2a6a5d90963?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items)

[^2]: [GitLab Omnibus package の SSL 証明書を Let's Encrypt で取得する](http://qiita.com/yuuAn/items/09a434d3f6cffa31101e)