EC2上にGitLabサーバーを構築する

# EC2上にGitLabサーバーを構築する

## 記事内容

- EC2上にgitlabサーバーを立てる方法
- ユーザーの追加方法
- gitlabからのメールの送信

## モチベーション

コード管理はgithubを使いたいが、環境によっては使用できないプロジェクトもあり、その際のアプローチの一つとしてOSSのgitlabのサーバーを
自前でたてる. 

## 導入環境

AWS EC2をサーバーとしてして使用. 

インスタンスタイプ: t4g.large
OS: Ubuntu20.04 (arm)

## Gitlabインストール

基本gitlab公式サイトの[インストール手順](https://www.gitlab.jp/install/)のページから、ubuntuを選択し表示されるコマンドを上から順番に実行. 

```bash
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
```

メールサーバとしてpostfixを使用する場合は以下を実行. (今回はAWS SESを使用するのでMustではない)
```
sudo apt-get install -y postfix
```

GitLabパッケージをリポジトリに追加
```bash
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
```

gitlab install. `EXTERNAL_URL="https://gitlab.example.com"`を使用しているEC2のipに変更する. 
今回は`http://使用してるEC2のIP`とした. 

```
sudo EXTERNAL_URL="https://gitlab.example.com" apt-get install gitlab-ee
```

実行後、 ``にアクセスすればgitlab　サーバーのweb uiにアクセスできる. このとき、EC2はhttpによるインバウンドが許可されている必要がある. 

uiではユーザー名ろパスワードを要求されるので、
- ユーザー名: `root`
- パスワード: `/etc/gitlab/initial_root_password`に記載されているパスワード

を入力. `/etc/gitlab/initial_root_password`記載のパスワードは24時間で消えてしまうので注意. 

入るとこんな感じ. 

![スクリーンショット 2023-03-26 16.43.17（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/6eac52e1-2b97-70ed-76bf-be170970351f.png)

## メールの設定

このままでは、gitlabからメールを送信することができない. メールはユーザーの追加やパスワード変更、開発時のメンバーへの通知に使用するため
ここで設定する. 

今回は、[公式ドキュメント](https://docs.gitlab.com/omnibus/settings/smtp.html#amazon-simple-email-service-aws-ses)の手順に沿って、SMTPサーバーを使用してメールを送信する設定を実施. 

AWS EC2を使用している場合 AWS SESとSMTPを使用する必要があるため上記方法を採用. 
以下の手順を記載する

- AWS SESの設定
- gitlab serverにSMTPを設定


## AWS SESの設定 

AWSから AWS Simple Mail Serviceを選択. idの作成から、下記画面に遷移するのでメールアドレスを登録. ここでメールアドレスは自身のメールアドレスを使用する必要あり(設定したアドレスにメールが来て承認しなければならないので)

![スクリーンショット 2023-03-26 16.49.33（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/cca4e2cc-2d21-97a6-227f-f2462c946688.png)

メールアドレスを登録・承認したら検証済みIDからメールアドレスを選択し、左メニューのSMTP設定を選択. 

![スクリーンショット 2023-03-26 16.51.21（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/68e76d68-3b49-83b8-6c69-52a5ebfe8e8c.png)

そのから SMTP認証情報の作成を選択しIAMユーザーを作成. 作成するとユーザー名・パスワードが生成されるので、ブラウザで表示されるユーザ名とパスワードを保存 or csvがダウンロードできるので保存しておく。作成時にしか保存できないので注意. 
![スクリーンショット 2023-03-26 16.51.26（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/9940d828-7aa7-8421-cb49-dad4dbaa6c8e.png)

![スクリーンショット 2023-03-26 16.57.41（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/843b062e-fe2d-1754-e1fc-ea2e20862426.png)

### テストメールの送信

上記手順が完了したら、再度検証済みIDからメールアドレスを選択し、テストメールを送信. 


下記画面からテストメールを送信
![スクリーンショット 2023-03-26 16.59.15（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/52a2c47f-0860-a20b-1fbd-fbe456160b58.png)

シナリオは`カスタム`を選択し、カスタム受信者は選択しているメールアドレスと同じものを設定(自身にメールを送信する形になる)

![スクリーンショット 2023-03-26 16.59.40（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/95a7ca19-94b5-5df5-8539-a5ce6d500595.png)

あとはタイトルや本文を適当に設定して送信. 自身のアドレスにメールが送信されているか確認
(迷惑メールに分類されているかも)

無事メールが受信できていればSESの設定は完了

## gitlabのSMTP設定

EC2のターミナルから`/etc/gitlab/gitlab.rb`を編集する. 

例えば

```bash
sudo vi /etc/gitlab/gitlab.rb
```
などでファイルを開き、

```
gitlab_rails['gitlab_email_from'] = 'SESで登録したメールアドレス'
gitlab_rails['gitlab_email_reply_to'] = 'SESで登録したメールアドレス'
```

```
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "SMTP エンドポイントを設定"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "先ほど保存したSMTPのユーザー名"
gitlab_rails['smtp_password'] = "先ほど保存したSMTPのパスワード"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
```

SMTPエンドポイントはSES上で検証済みIDからメールアドレスを選択し、SMTP 設定から表示される. (基本リージョンで決まる)

![スクリーンショット 2023-03-26 17.08.28（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/d410e4a4-e2e2-dac6-50aa-43cda18f2fb9.png)

※ 設定を編集した項目はコメンントアウトを外さないと有効化されないので忘れずに対応

設定が完了したら、


```bash
sudo gitlab-ctl reconfigure

sudo gitlab-ctl restart
```

で設定を反映. restartするとUIが有効化されるまで数分かかるっぽいので待ってからUIに再度アクセス. 

## ユーザーの追加

rootでログインしたら、左上メニューバーからAdminを選択.

![スクリーンショット 2023-03-26 17.13.38（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/1b110518-fa76-74d6-3d77-ed661de69ab7.png)

New Userを選択
![スクリーンショット 2023-03-26 17.13.42（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/475b646c-40e1-aa66-8829-9302594dcef1.png)

各項目を設定するが、ここでEmailは先ほどSESで設定したメールアドレスである必要あり. 
Access Levelで権限を選択. Administatorはroootと同等. ユーザーの作成・削除などができる
![スクリーンショット 2023-03-26 17.14.01（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/7fd56270-51e4-f24a-494a-c8f1fa18f937.png)

登録したらメールが送信されるのでURLをクリックしてパスワードを再設定. これでユーザが追加された. 

### その他のユーザーの追加方法

#### コンソールからの追加 ([手順](http://107.22.119.87/))

ターミナルで`sudo gitlab-rails console`を実行してrailsのコンソールを起動. 起動に結構時間がかかる. 

以下でユーザーを登録. 
```
u = User.new(username: 'test_user', email: 'test@example.com', name: 'Test User', password: 'password', password_confirmation: 'password')
u.skip_confirmation! # Use it only if you wish user to be automatically confirmed. If skipped, user receives confirmation e-mail
u.save!
``` 

#### sign-upから登録

ログイン画面からsign upを選択しユーザーを登録. Adminユーザーのみが登録を承認できるので、承認する. 

## その他

手順は思ったより面倒(特にメールアドレスまわり). docker使用してもメール周りの手順は簡略化されなそうなので、AWSの設定は頑張るしかなさそう. 
gitlabも無料だがそれなりの機能は揃っているので、githubが使用できない環境では有効な選択しになりそう. 

CI/CDとかも試してみたい