GitLab Cookbook with SSL


[GitLab](https://about.gitlab.com/)のインストールは簡単になりました。その[GitLab Omnibus](https://about.gitlab.com/downloads/)でも利用されている
[Cookbook](https://gitlab.com/gitlab-org/cookbook-gitlab/)は簡単にSSLが設定されたGitLabをインストールすることができます。

# Prepare

最初に`マシン`と`ドメイン`と`証明書`を準備します。

## Machne

[AWS](http://aws.amazon.com/jp/)や[さくらのVPS](http://vps.sakura.ad.jp/)等でパブリックにマシンを作ります。
(今回の`OS`は`Ubuntu 12.04`を利用します。)

### SSH

ローカルとリモートのSSHの設定をします。リモートのパスワード認証を禁止するには
`sshd_config`の`PasswordAuthentication`を`no`に編集します。

```bash
$ ssh ubuntu@example.com mkdir .ssh
$ scp ~/.ssh/id_rsa.pub ubuntu@example.com:.ssh/authorized_keys
$ cat << __EOS__ >> ~/.ssh/config
Host example.com
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
__EOS__
$ ssh example.com
ubuntu@example:~$ sudo editor /etc/ssh/sshd_config
ubuntu@example:~$ sudo service ssh restart
```

## Domain

[お名前.com](http://www.onamae.com/)や[Doレジ](http://do-reg.jp/)等でドメインを取得します。
(`DNS`の設定で[SPFレコード](http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/)を登録しましょう。)

### Sender Policy Framework

`nslookup`コマンドでTXTレコードを確認します。

```bash
$ nslookup -q=txt example.com
Server:   192.168.0.1
Address:  192.168.0.1#53

Non-authoritative answer:
example.com text = "v=spf1 ip4:93.184.216.119 -all"
```

## Certificate

[サイバートラスト](https://www.cybertrust.ne.jp/)や[BIZCERT](http://www.fsv.jp/function/ssl/bizcert/)等でサーバ証明書を取得します。
(今回は自己署名証明書を利用します。)

### Self-signed certificate

`openssl`コマンドで自己署名証明(オレオレ証明書)を作成します。

```bash
$ openssl genrsa -out server.key 2048
$ openssl req -new -key server.key -out server.csr
$ openssl rsa -in server.key -out server.key
$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
```

`秘密鍵`と`証明書`のファイルは後ほど利用します。

| Files      | 内容                | 補足           |
|:----------:|:--------------------|:---------------|
| server.key | RSA PRIVATE KEY     | 秘密鍵         |
| server.csr | CERTIFICATE REQUEST | 証明書署名要求 |
| server.crt | CERTIFICATE         | 証明書         |

# Delivered

## Chef Solo

次は[Chef](http://www.getchef.com/)のツールでGitLabをインストールします。

### Download

インストールには[knife-solo](http://matschaffer.github.io/knife-solo/)と[Berkshelf](http://berkshelf.com/)を利用します。

```bash
$ gem install berkshelf
$ gem install knife-solo
$ knife configure
$ knife solo init ./gitlab_chef
$ cd ./gitlab_chef/
$ curl -o Berksfile https://gitlab.com/gitlab-org/cookbook-gitlab/raw/master/Berksfile
$ sed -i.bak '/^metadata$/d' Berksfile
$ echo "cookbook 'gitlab', git: 'https://gitlab.com/gitlab-org/cookbook-gitlab.git'" >> Berksfile
$ berks vendor
```

### Provision

`ssl_certificate`と`ssl_certificate_key`に`証明書`と`秘密鍵`の内容を編集します。(改行は`\n`です。)
`knife solo`コマンドでGitLabがインストールされます。

```json
$ cat << __EOS__ > ./nodes/example.com.json
{
  "gitlab": {
    "host": "example.com",
    "port": "443",
    "email_from": "gitlab@example.com",
    "url": "https://git.example.com/",
    "ssl_certificate": "-----BEGIN CERTIFICATE-----\nfoo\nbar\nbaz\n-----END CERTIFICATE-----",
    "ssl_certificate_key": "-----BEGIN RSA PRIVATE KEY-----\nqux\nquux\ncorge\n-----END RSA PRIVATE KEY-----"
  }
  "run_list": [
    "gitlab::default"
  ]
}
__EOS__
$ knife solo prepare example.com --bootstrap-version 11.4.4
$ knife solo cook example.com
```

### Self-signed certificate

自己署名証明は`config.yml`の`self_signed_cert`を`true`に編集します。

```bash
$ ssh example.com
ubuntu@example:~$ sudo editor /home/git/gitlab-shell/config.yml
```

### Mail(SMTP)

#### Postfix

メールの送信に`Postfix`を利用します。`main.cf`を編集してリスタートします。

```bash
$ ssh example.com
ubuntu@example:~$ sudo apt-get install postfix
ubuntu@example:~$ sudo editor /etc/postfix/main.cf
ubuntu@example:~$ sudo service postfix restart
```

#### Gitlab

`production.rb`の`config.action_mailer.delivery_method = :sendmail`の
次行に下記の`config.action_mailer.sendmail_settings`を追加します。

```yml
config.action_mailer.sendmail_settings = {
  location: '/usr/sbin/sendmail',
  arguments: '-i -t'
}
```

`production.rb`を編集してリスタートします。

```bash
$ ssh example.com
ubuntu@example:~$ sudo editor /home/git/gitlab/config/environments/production.rb
ubuntu@example:~$ sudo service gitlab restart
```

# Inspect

新しいユーザを作成して、プロジェクトを作成します。
さらに公開鍵を追加すると3通のメールが受信されます。

| Actions     | Mail Subject                      |
|:------------|:----------------------------------|
| New User    | Account was created for you       |
| New project | Access to project was granted     |
| Add SSH Key | SSH key was added to your account |

これで **オレオレGitLab** が完成です。

![logo-black](https://raw.githubusercontent.com/gitlabhq/gitlabhq/master/app/assets/images/logo-black.png)

# Tips

## Vagrant

[Vagrant](http://www.vagrantup.com/)と[Amazon EC2](http://aws.amazon.com/jp/ec2/)ではもっとに簡単にGitLabがインストールできます。

### Download

`Vagrantfile`の`access_key_id`、`secret_access_key`や`private_key_path`、`keypair_name`を編集します。

```bash
$ gem install berkshelf
$ vagrant plugin install vagrant-berkshelf
$ vagrant plugin install vagrant-omnibus
$ vagrant plugin install vagrant-aws
$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
$ git clone https://gitlab.com/gitlab-org/cookbook-gitlab.git ./gitlab
$ cd ./gitlab/
$ cp ./example/Vagrantfile_aws ./Vagrantfile
$ editor ./Vagrantfile
```

### Provision

`Vagrantfile`の`chef.json`や`chef.run_list`を`Chef Solo`と同じように編集します。
`vagrant provision`コマンドでGitLabがインストールされます。

```bash
$ vagrant up --provider=aws
$ eval $(vagrant ssh-config | awk '/HostName/ {print "HostName=" $2}')
$ sed -i.bak "s/example.com/$HostName/g" Vagrantfile
$ sed -i.bak 's/chef.run_list = \[\]/chef.run_list = \["gitlab::default"\]/g' Vagrantfile
$ vagrant provision
```

GitLab.orgの[Production](https://gitlab.com/gitlab-org/cookbook-gitlab/blob/master/doc/production.md)も参考にしてください。