さくっとDockerでEC2にGitLabを構築する

## はじめに

新規サービスの開発プロジェクトに参加しています。プロジェクト発足当初はGitレポジトリをホスティングするシステムがありませんでした。そのためDockerを使用してAWSのEC2でGItLabを構築したときの記録です！

本構成は[Reference architecture: up to 1,000 users](
https://docs.gitlab.com/ee/administration/reference_architectures/1k_users.html)を参考にしており、多くのユーザ利用を想定しません。
(プロジェクトの関係者のみの利用を想定)

考慮する点としては
>If you need to serve up to 1,000 users and you don’t have strict availability requirements, a single-node solution with frequent backups is appropriate for many organizations.

のため冗長構成にせず、バックアップを頻繁に取得することで障害に対応する方針です。

## 構築

EC2の設定とDockerの設定をメインで記述します。

### 構成図

![aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639315/efd089d1-7531-1ab6-d6d9-c58cd662b852.png)

* ユーザはGitLabの`https://gitlab.example.com`にhttps通信
* ALBとEC2間はhttp通信

### 環境

|項目|値|
|---|---|
|インスタンスタイプ|c5.xlarge|
|OS|Amazon Linux 2|

### Docker, Docker Composeのインストール

[Docker のインストール](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html#install_docker)を参考にEC2に`Docker`をインストールします。

```bash
sudo yum update -y
sudo amazon-linux-extras install docker
sudo service docker start
sudo usermod -a -G docker ec2-user
docker info
# サーバ再起動後も自動でDockerが起動
sudo systemclt enable docker
```

`docker info`で権限エラーが発生する場合は、インスタンスに再接続してみてください！

続いて[Install Docker Compose](https://docs.docker.com/compose/install/)のLinuxのタブを参考に`Docker Compose`をインストールします。

```bash
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
```

### GitLabのdocker-compose.ymlを作成

`Docker Compose`の選定理由として
公式ドキュメントの[Install GitLab using Docker Compose](https://docs.gitlab.com/ee/install/docker.html#install-gitlab-using-docker-compose)で

>With Docker Compose you can easily configure, install, and upgrade your Docker-based GitLab installation:

の記載があり、さくっと構築するのにピッタリと思い使用しています！

```yml
version: '3.6'
services:
  web:
    image: 'gitlab/gitlab-ce:14.9.1-ce.0'
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
        gitlab_rails['initial_root_password'] = 'password'
        gitlab_rails['time_zone'] = 'Asia/Tokyo'
        nginx['listen_port'] = 80
        nginx['listen_https'] = false
        nginx['proxy_set_headers'] = {
          "X-Forwarded-Proto" => "https",
          "X-Forwarded-Ssl" => "on"
        }
        letsencrypt['enable'] = false
    ports:
      - '80:80'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
```

主な変更点として

* イメージのタグを明示的に指定してバージョンを固定
  * `latest`→`14.9.1-ce.0`
* `external_url`にブラウザでアクセスしたいURLを記載
* ポート80のみホストにマッピング
  * 443, 22は使用しないため削除
* SSLの無効化
  * SSLの終端がALBのため、GitLabのコンテナ内ではSSLの処理は行わない
  * [External, proxy, and load balancer SSL termination](https://docs.gitlab.com/omnibus/settings/nginx.html#external-proxy-and-load-balancer-ssl-termination)

### 起動

[上記](#GitLabのdocker-compose.ymlを作成)の`docker-compose.yml`を使用してEC2内でGitLabのコンテナを起動します。

```bash
# docker-compose.ymlと同じ階層でコマンドを実行
export GITLAB_HOME="/path/to/gitlab"
docker-compose up -d
```

### ALBの設定

上記で設定したEC2のポート80をターゲットとするターゲットグループを作成し、ALBに紐付けます。

Route53やACMの設定方法は他の記事で詳しく説明されているので割愛させてください！

* [ELB（Elastic Load Balancing）を調べて使ってみた。](https://dev.classmethod.jp/articles/elb-explanation-try/)
* [Route53+ACM+ALB+EC2でHTTPS接続するまで](https://qiita.com/m-kazu/items/aa44789f9183f5a61104)

### 終わりに

お役に立てれば幸いです！