Docker版Gitlabのインストール(メール設定含む)

# 環境
ホストマシン: CentOS Linux release 7.4.1708 (Core)
Docker: Docker version 17.12.1-ce
gitlab: GitLab Community Edition 10.5.3

# インストール
インストール方法やコンテナ版の注意点など
https://docs.gitlab.com/omnibus/docker/

公式イメージをそのまま使用して起動。

```shell-session
[root@ddauto ~]# docker run --detach \
    --hostname xxx.xxx.xxx.xxx \
    --publish 443:443 --publish 80:80 --publish 10022:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

# 起動にかなり時間がかかるので、以下のコマンドでウォッチ
[root@ddauto ~]# docker logs -f gitlab
```

起動後、ブラウザからhttp://ホストマシンのIPにアクセスして確認。

# メール通知設定
この状態では、新規ユーザがRegisterした際に、メールでConfirmしてくださいと言われるがメールが来ないので、その設定を行う。
※rootでログインして、Admin画面からユーザのConfirmを行うことで暫定的には回避できるが、面倒なのできちんと設定する。

始めはGitlabがコンテナなので、SMTPもコンテナで構築したかったが、SMTPのコンテナとしてよいものが見つからず、自分で作るとCentOS丸ごとになって重いので、ホストマシンにデフォルトで入っているpostfixを使用する。

## postfix設定

```shell_session
# postfixがインストール、起動されていることの確認
[root@ddauto ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-03-09 19:19:54 JST; 1 weeks 4 days ago
# 他のMTAが存在しない、もしくはpostfixがMTAとして使用される設定になっていることの確認
[root@ddauto ~]# alternatives --config mta

There is 1 program that provides 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number:
# メールが送れることの確認
[root@ddauto ~]# sendmail <宛先メールアドレス>
From bar@bar.com
To <宛先メールアドレス>
Subject Test
Test mail for postfix
.
#
# tail -f /var/log/maillog
Mar 21 12:46:32 ddauto postfix/pickup[17124]: A732941A0688: uid=0 from=<root>
Mar 21 12:46:32 ddauto postfix/cleanup[19859]: A732941A0688: message-id=<20180321034632.A732941A0688@ddauto.brs.local>
Mar 21 12:46:32 ddauto postfix/qmgr[17125]: A732941A0688: from=<root@ddauto.brs.local>, size=307, nrcpt=1 (queue active)
Mar 21 12:46:37 ddauto postfix/smtp[19861]: A732941A0688: to=<宛先メールアドレス>, relay=<リレー先のメールサーバ>:25, delay=24, delays=20/0.01/4.1/0.55, dsn=2.0.0, status=sent (250 2.0.0 w2L3kVDS014160 Message accepted for delivery)
Mar 21 12:46:37 ddauto postfix/qmgr[17125]: A732941A0688: removed
```

これでMTAとしてはメールが送信できることが確認できた。
次に転送用の設定を行う。

```txt:/etc/postfix/main.cf
myhostname = xxx.yyy.com <メールサーバーのホスト名>
mydomain = yyy.com <メールアドレスのアットマーク以降に現れるドメイン名>
myorigin = $mydomain <このメールサーバーから送信されるメールで利用されるドメイン名>
inet_interfaces = all <メールを受信するネットワークインターフェース>
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain <送られてきた(受信した)メールのうち、このサーバーで受け取るべきドメイン>
```

mydestinationは、ここに指定した宛先のメールはホストマシンが受け取る(転送しない)という設定なので、最終の宛先メールアドレスのドメインをここに指定してはいけない(ここで少しハマった)
編集後、postfixの再起動が必要

```shell-session
[root@ddauto ~]# systemctl restart postfix
```


## gitlabの設定

```shell-session
root@gitlab:/# vi /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "ホストマシンのIPアドレス"
gitlab_rails['smtp_port'] = 25
root@gitlab:/# gitlab-ctl reconfigure
```

gitlabからのテスト。gitlabのイメージはtelnetはおろかpingすら使用不可なので、以下の方法で確認した。
[参考](https://docs.gitlab.com/ce/administration/troubleshooting/debug.html)

```shell-session
root@gitlab:/# gitlab-rails console production
irb(main):002:0* ActionMailer::Base.smtp_settings
=> {:address=>"10.32.7.40", :port=>25, :openssl_verify_mode=>"none", :ca_file=>"/opt/gitlab/embedded/ssl/certs/cacert.pem"}
irb(main):003:0> Notify.test_email('送信したいメールアドレス', 'Hello', 'test message').deliver_now

Errno::EHOSTUNREACH: No route to host - connect(2) for "10.32.7.40" port 25
```

失敗。CentOS7でFirewallが有効になっているため。Firewall自体を無効化すると、gitlabコンテナが起動しなくなるので、25ポートだけ空ける。

```shell-session
[root@ddauto ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: dhcpv6-client ssh
  ports: 
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
# zoneにどのポートやサービスを許可、拒否するか定義し、それをインターフェースに当てはめるという仕組みらしい

[root@ddauto ~]# firewall-cmd --permanent --zone=public --add-port=25/tcp
[root@ddauto ~]# firewall-cmd --reload
# permanentオプションをつけると再起動でも保持されるが、reloadは必要になる。
[root@ddauto ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: dhcpv6-client ssh
  ports: 25/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

最後にコンテナイメージを再起動。これをしないとなぜかメールが送れなかったので。

```
[root@ddauto ~]# docker restart gitlab
```

# 改善点
gitlabからホストマシンへは外部IPアドレスを使っているので、内部IPアドレスの方がよさそう。
リソースに余裕があれば、SMTPもコンテナ化したい。