GitLab を docker-compose で動かしてみる

ネットで調べてみると、[sameersbn/gitlab](https://hub.docker.com/r/sameersbn/gitlab/) を使用しているものが多いですが、GitLab には[公式の Docker イメージ](https://hub.docker.com/u/gitlab/)があるみたいなので、それを使用します。
英語ですが、[公式のドキュメント](https://docs.gitlab.com/omnibus/docker/)もあります。

Docker は触り始めたばかりの初心者ですが、とりあえず動作するところまではいきました。

# 環境

ホスト OS は CentOS7 です。
会社の自チーム内のLANに環境を構築するため、プロキシ環境下で動作するように設定します。
メール通知やLDAP認証も全てプロキシ経由で行っています。

# docker-compose.yml の内容

使用する Docker イメージは１つですが、設定などを簡単に行えるようにするため、docker-compose を使用します。
結果的に作成した docker-compose.yml は以下になりました。

```yaml:docker-compose.yml
gitlab:
  image: gitlab/gitlab-ce
  volumes:
    - /srv/docker/gitlab/data:/var/opt/gitlab
    - /srv/docker/gitlab/config:/etc/gitlab
    - /srv/docker/gitlab/logs:/var/log/gitlab
  ports:
    - "10080:10080"
    - "10443:443"
    - "10022:22"
  restart: always
  hostname: 'xxx.xxx.xxx.xxx' # ホストPCのローカルアドレス
  dns:
    - xxx.xxx.xxx.xxx # 後述しますが、これだと解決していないです。
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      gitlab_rails['gravatar_enabled'] = false
      gitlab_rails['time_zone'] = 'Asia/Tokyo'
      gitlab_rails['gitlab_ssh_host'] = 'xxx.xxx.xxx.xxx:10022'
      gitlab_rails['gitlab_email_from'] = 'gitlab@example.com'
      gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
      gitlab_rails['smtp_enable'] = true
      gitlab_rails['smtp_address'] = "xxx.xxx.xxx.xxx" # プロキシサーバーのIPアドレス
      gitlab_rails['smtp_port'] = 8025 # プロキシサーバーのポート
      gitlab_rails['smtp_domain'] = "xxx.xxx.xxx.xxx" # プロキシサーバーのIPアドレス
      gitlab_rails['smtp_tls'] = false
      gitlab_rails['smtp_enable_starttls_auto'] = false
      gitlab_rails['ldap_enabled'] = true
      gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' # remember to close thise this block with 'EOS' below
        main: # 'main' is the GitLab 'provider ID' of this LDAP server
          label: 'LDAP'
          host: 'xxx.xxx.xxx.xxx' # プロキシサーバーのIPアドレス
          port: 389 # プロキシサーバーのポート
          uid: 'sAMAccountName'
          method: 'plain' # "tls" or "ssl" or "plain"
          bind_dn: 'hoge@domain.org'
          password: 'password'
          active_directory: true
          allow_username_or_email_login: false
          base: 'dc=domain,dc=org'
      EOS
```

# 解決していないこと

## Gravatar からのアイコン取得が無効にならない

`gitlab_rails['gravatar_enabled'] = false` を指定しているにも関わらず、Gravatar からアイコンを取得してしまいます。
仕方ないので、GitLab に root でログインし、Admin Area から無効に設定しました。

## 名前解決できない

プロジェクト作成時に他のリポジトリからインポートしようとすると、名前解決できずに失敗してしまいます。
DNS の設定がきちんとできていないのかよくわかりませんが、解決できていません。
おそらくこれのせいで Push をフックして Jenkins に通知することもできていません。

何かわかる方がいらっしゃれば教えていただきたいです。

# はまったところ

## アバターの画像をアップロードしても反映されない

最初、ホスト側のポートを 10080 にし、コンテナ側のポートは 80 にしていたのですが、画像のパスを見てみると、URLがコンテナ側のポートになっていました。
解決方法がわからなかったので、コンテナ側のポートも 10080 にし、ホスト側と同じポートにすることで解決させました。

## SSH で接続できない

上記で http のポートを合わせたので、SSH のポートもホスト側とコンテナ側で 10022 に合わせてみたのですが、接続できなかったので、ホスト側のポートは 10022 にし、コンテナ側は 22 にしました。
これで一応接続できるようにはなったのですが、GitLab に表示される Clone の URL が正しく表示されませんでした。
これは一応、以下の設定を追加することで正しく表示されるようになりました。

```rb
gitlab_rails['gitlab_ssh_host'] = 'xxx.xxx.xxx.xxx:10022'
```

# 参考URL

以下のサイトを参考にさせていただきました。

- http://hatman62.hatenablog.com/entry/2016/06/28/235458
- https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/doc/settings/smtp.md