さくらVPSのUbuntuにGitLabを入れて初期設定するまで

# はじめに

[さくらのVPS](https://vps.sakura.ad.jp/)にカスタムOSインストールでUbuntu 18.04を入れた環境に、[GitLab](https://about.gitlab.com/)をインストールするために必要な初期設定についてまとめました。

さくらのVPSは、[スタートアップスクリプト機能でGitLabをインストールする機能](https://vps-news.sakura.ad.jp/2017/08/29/startup-gitlab/)がありますが、これを使ってGitLabをインストールした場合、OSがCentOSになります。今回はOSにUbuntuを使いたかったので、手順をまとめました。

# ポイントだけ書くと

1. インストール前にデフォルトの LANG を `en_US.UTF-8` にしておく
2. インストール後alertmanagerが再起動を繰り返すのが気になるようなら設定をする

# 環境

* さくらのVPS 8Gプラン（メモリ8GB、SSD 200GB）
* カスタムOSインストールで、Ubuntu 18.04 amd64をインストール済み

# 初期設定の流れ

## etckeeper入れる（任意）

etckeeperを入れておくと、/etcの変更履歴を記録できて便利です。

```shell-session
$ sudo apt install git etckeeper
```

## ufw有効（任意）

ufwで最低限のファイアウォールの設定をしておくと安心です。
（私はここでTCP Wrappersの設定もしています。）

```shell-session
$ sudo ufw enable
$ sudo ufw allow 22/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
```

## NTP入れる

NTPを使って時間を合わせておくのは大切です。

```shell-session
$ sudo apt install ntp
$ sudo vi /etc/ntp.conf
```

/etc/ntp.confは以下のように編集しました。

```conf:/etc/ntp.conf
# デフォルトで有効になっているpoolはコメントアウトして、さくらのNTPサーバーを追加
server ntp1.sakura.ad.jp iburst
```

編集後、ntpを再起動します。

```shell-session
$ sudo systemctl restart ntp
```

## デフォルトのLANGを変える

デフォルトのLANGがen_USになっているのを、en_US.UTF-8に変更します。
これをやらないと、GitLabのインストーラーで止まってしまいます。

```shell-session
$ sudo dpkg-reconfigure locales
```

1. `Locales to be generated:` で、 `en_US.UTF-8` にチェックを入れます。
2. `Default locale for the system environment:` で、`en_US.UTF-8` を選択します。
3. 念のため、一回再起動します。


### 参考情報

* [Error in installing gitlab 10.6.2 on ubuntu & debian systems](https://gitlab.com/gitlab-org/gitlab-ce/issues/44869)
* [Install on fresh Ubuntu 16.04 fails](https://forum.gitlab.com/t/install-on-fresh-ubuntu-16-04-fails/15652)


## 前提ソフト入れる

ここから、[GitLabのインストール手順](https://about.gitlab.com/installation/#ubuntu)に従っていきます。

最初に、インストールの前提となるソフトをインストールします。

```shell-session
$ sudo apt-get install -y curl openssh-server ca-certificates
$ sudo apt-get install -y postfix
```

## GitLab入れる

[GitLabのインストール手順](https://about.gitlab.com/installation/#ubuntu)に従って、GitLabのリポジトリ追加とパッケージをインストールします。

```shell-session
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
# EXTERNAL_URLのところは、GitLabを動かすURLにします
$ sudo EXTERNAL_URL="http://gitlab.example.com" apt-get install gitlab-ee
```

インストールが終わったら、URLを開いてrootパスワードをセットしましょう。

## SSLを設定する

インストールが終わってrootパスワードもセットしたら、まずはLetsEncryptでSSL化します。
[公式ドキュメントの設定手順はこちらです](https://docs.gitlab.com/omnibus/settings/ssl.html#let-s-encrypt-integration)。


```shell-session
$ sudo vi /etc/gitlab/gitlab.rb
```

/etc/gitlab/gitlab.rbを以下のように編集します。

```conf:/etc/gitlab/gitlab.rb
external_url 'https://gitlab.example.com' # SSLでアクセスするURL
letsencrypt['contact_emails'] = ['user@example.com'] # 連絡先のメールアドレス
```

編集が終わったら、GitLabに設定を反映します。

```shell-session
$ sudo gitlab-ctl reconfigure
```

## alertmanagerがdownにならないよう設定する

ここまでの手順で、GitLabを使う上では全く問題ない状況になったのですが、 `gitlab-ctl status` を実行すると、alertmanagerが動いていません。

```shell-session
$ sudo gitlab-ctl status
down: alertmanager: 0s, normally up, want up; run: log: (pid 19719) 2592s
run: crond: (pid 13672) 705s; run: log: (pid 13665) 705s
run: gitaly: (pid 19371) 2602s; run: log: (pid 19476) 2601s
run: gitlab-monitor: (pid 19404) 2602s; run: log: (pid 19427) 2601s
run: gitlab-workhorse: (pid 19351) 2603s; run: log: (pid 19437) 2601s
run: logrotate: (pid 18548) 2668s; run: log: (pid 19439) 2601s
run: nginx: (pid 13625) 707s; run: log: (pid 19438) 2601s
run: node-exporter: (pid 18707) 2656s; run: log: (pid 19477) 2601s
run: postgres-exporter: (pid 19701) 2593s; run: log: (pid 19860) 2592s
run: postgresql: (pid 18236) 2744s; run: log: (pid 19407) 2602s
run: prometheus: (pid 19441) 2601s; run: log: (pid 19566) 2600s
run: redis: (pid 18171) 2750s; run: log: (pid 19406) 2602s
run: redis-exporter: (pid 18816) 2643s; run: log: (pid 19428) 2601s
run: sidekiq: (pid 13327) 726s; run: log: (pid 19409) 2602s
run: unicorn: (pid 13933) 691s; run: log: (pid 19408) 2602s
```

alertmanagerのログを見ると、advertise addressを設定するために、サーバーに割り当てられたプライベートアドレスを取得しようとして、失敗して再起動を繰り返しています。

```shell-session
$ sudo gitlab-ctl tail alertmanager
2018-08-13_11:20:00.37489 level=info ts=2018-08-13T11:20:00.374687126Z caller=main.go:174 msg="Starting Alertmanager" version="(version=0.15.0, branch=master, revision=91e87a5dd46b21a585f1a83ba5bb2127531b46a6)"
2018-08-13_11:20:00.37492 level=info ts=2018-08-13T11:20:00.374810584Z caller=main.go:175 build_context="(go=go1.10.3, user=GitLab-Omnibus, date=2018-07-31T00:11:18+00:00)"
2018-08-13_11:20:00.39205 level=info ts=2018-08-13T11:20:00.391898083Z caller=cluster.go:155 component=cluster msg="setting advertise address explicitly" addr=<nil> port=9094
2018-08-13_11:20:00.39285 level=error ts=2018-08-13T11:20:00.392764543Z caller=main.go:201 msg="Unable to initialize gossip mesh" err="create memberlist: Failed to get final advertise address: Failed to parse advertise address \"<nil>\""
```

さくらVPSだとプライベートアドレスは割り振られませんし、VPSの１台だけの環境でクラスタを組むことはないので、ここはadvertise addressに127.0.0.1(localhost)を指定してとりあえず回避します。

```shell-session
$ sudo vi /etc/gitlab/gitlab.rb
```

/etc/gitlab/gitlab.rbを以下のように編集し、alertmanagerの起動オプションに、 `--cluster.advertise-address=127.0.0.1:9094` を追加します。

```conf:/etc/gitlab/gitlab.rb
alertmanager['flags'] = {
    'cluster.advertise-address' => '127.0.0.1:9094'
}
```

編集が終わったら、GitLabに設定を反映します。

```shell-session
$ sudo gitlab-ctl reconfigure
```


これで、alertmanagerもrunになりました。（意味があるかは別問題ですが）

```
$ sudo gitlab-ctl status
run: alertmanager: (pid 27012) 298s; run: log: (pid 19719) 7802s
run: crond: (pid 13672) 5915s; run: log: (pid 13665) 5915s
run: gitaly: (pid 19371) 7812s; run: log: (pid 19476) 7811s
run: gitlab-monitor: (pid 19404) 7812s; run: log: (pid 19427) 7811s
run: gitlab-workhorse: (pid 19351) 7813s; run: log: (pid 19437) 7811s
run: logrotate: (pid 20568) 678s; run: log: (pid 19439) 7811s
run: nginx: (pid 13625) 5917s; run: log: (pid 19438) 7811s
run: node-exporter: (pid 18707) 7866s; run: log: (pid 19477) 7811s
run: postgres-exporter: (pid 19701) 7803s; run: log: (pid 19860) 7802s
run: postgresql: (pid 18236) 7954s; run: log: (pid 19407) 7812s
run: prometheus: (pid 19441) 7811s; run: log: (pid 19566) 7810s
run: redis: (pid 18171) 7960s; run: log: (pid 19406) 7812s
run: redis-exporter: (pid 18816) 7853s; run: log: (pid 19428) 7811s
run: sidekiq: (pid 13327) 5936s; run: log: (pid 19409) 7812s
run: unicorn: (pid 13933) 5901s; run: log: (pid 19408) 7812s
```

# enjoy!

これで、さくらVPS + Ubuntu 18.04 + GitLabを動かすための基本的設定は完了です。