私的サーバー構築日誌：GitLabとリバースプロキシと Let's Encrypt

# 能書き

[私的サーバー構築日誌：仕切り直し](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6)からの自宅サーバー構築の続きです。

とても気になっているGitLabとMattermostです。[以前一度インストールした](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5)その後に、[当時使っていたサーバーマシンが壊れてしまう](https://qiita.com/katz_engineer/items/1f21de2bd9072c260ae6#%E8%83%BD%E6%9B%B8%E3%81%8D)という悲劇に見舞われて、そのままになってしまっていました。新しいサーバーでも、ようやくここまで追い付きました。

そのGitLabとMattermostのサーバーですが。私の環境では（そして大多数の方々の環境でも）GitLabとMattermostで1つのグローバルIPアドレスを共有する事になります。その他のサービスでも同じIPアドレスを共有せざるを得ない事も多いでしょう。しかしGitLabサーバーをリバースプロキシの後ろに立てると問題が発生しがちのようで、その解説や解決の記事が巷に氾濫しているようです。

今回の記事はその試行錯誤の結果になります。まずはGitLabが立ち上がったので、その手順についてまとめました。

~~※2023.12.28.追記~~
~~Mattermostは諦めました。~~
~~リバースプロキシの存在下でGitLabと連携させるのが難しい上、MattermostはWebSocketを使用しているのでリバースプロキシでその点も考慮する必要があります。~~
~~心が折れました…~~

※2024.05.06.追記
[Mattermostをリバースプロキシの下で動かす方法を模索しました](https://qiita.com/katz_engineer/items/71128cee634abfad6316)。

# 目標

- GitLabサーバーを立てます。
    - Let's Encrypt の証明書を取得してhttpsアクセスできるようにします。
    - LDAPと連携して、LDAP登録したユーザーでログインできるようにします。
- リバースプロキシを立てます。

# 参考文献

公式ドキュメントです。

- [Omnibus GitLab Documentation - GitLab Docs](https://docs.gitlab.com/16.5/omnibus/)

前回私が立てた際の記録記事です。今回はリバースプロキシを立てる都合で、結構な差異があります。

- [自宅サーバー構築譚：GitLabとMattermostをインストール - Qiita](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5)

GitLabそのものではなく、その周辺の設定について、現在の私の環境です。

- [私的サーバー構築日誌：LAN内DNSサーバー Unbound - Qiita](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e) … 私のサーバーのDNS設定です。
- [私的サーバー構築日誌：LDAPサーバー OpenLDAP over TLS とログ確認](https://qiita.com/katz_engineer/items/7ad51c3a8f1ff98efdd1) … 私の環境のLDAPサーバーです。
- [ユーザー登録 - 私的サーバー構築日誌：LDAPサーバー OpenLDAP・ユーザー登録 - qiita](https://qiita.com/katz_engineer/items/d576dddbe6a4d8b65fca#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2-1) … 私のLDAPサーバーに登録したユーザーです。
- [私的サーバー構築日誌：nginx on docker でリバースプロキシ - Qiita](https://qiita.com/katz_engineer/items/d05537ffd9a8212c59be) … リバースプロキシの基本的な手順です。
- [私的サーバー構築日誌：nginx on docker のリバースプロキシ環境で Let's Encrypt - Qiita](https://qiita.com/katz_engineer/items/f642e447eee38869f3eb) … リバースプロキシ環境で Let's Encrypt する手順です。

その他、参考にさせていただいた各種の設定情報など。

- [Nginxのserver_nameって複数設定できるの？【Apachのエイリアスみたいなものです】 - ハピ部](https://ha2pylife.com/nging-server-name/)
- [Nginx で 80 と 443 ポートアクセスを両方とも受け付けて共存させる設定](https://oki2a24.com/2019/07/01/setting-to-use-both-80-and-443-port-in-nginx/)
- [gitlabをリバースプロキシ下で運用する場合のURL問題の解決 - Qiita](https://qiita.com/Yothuba3/items/676c5fa7d1114a82b719) … リバースプロキシでの```proxy_set_header```設定を参考にしました。
- [GitLabをReverse Proxy越しに利用する設定を確認したら迷走する事案が発生 - 今日もまた踏みました](https://kumakawa.hatenadiary.jp/entry/2022/11/15/GitLab%E3%82%92Reverse_Proxy%E8%B6%8A%E3%81%97%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%82%89%E8%BF%B7%E8%B5%B0%E3%81%99%E3%82%8B)

余談。10080番ポートを使ってはいけないらしい。

- [Web Application開発に10080番ポートは使ってはいけない - Zenn](https://zenn.dev/ota42y/articles/127fee3353bafe)

# 概要

今回はGitLabだけ立てました。

~~※2023.12.28.追記~~
~~Mattermostは諦めました。それを考慮して、文章を少し修正します。~~

- LXDコンテナにGitLab-EE（omnibus版）をインストール
- リバースプロキシを立てて、1つのIPアドレスをGitLabとその他のサービスで共有できるように設定 … この点が[前回](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5)と異なります
- Let's Encrypt でgitlabの証明書を取得（mattermostの証明書は次回） … この点も[前回](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5)と異なります
- LDAPサーバーと連携

DockerコンテナでGitLabサーバーを立てる方法もありますが、細かい設定で不自由したりするようですので、やはりLXDコンテナにomnibus版をインストールする事にしました。

そしてインストールするのはCEではなくEEにします。ライセンスを購入しなければEEはCEと同等との記述があったからです。

# DNS

まず最初にDNSを設定します。外からアクセス可能にする関係で、お金を出して買った独自ドメインを使用して下さい。ここでは仮に```example.com```にしておきますが、このまま設定しないで下さい。

```console:ホスト側
MY_DOMAIN=example.com
```

```console:ホスト側
GITLAB_DOMAIN=gitlab.$MY_DOMAIN
```

そして外部のDNSにこれを設定し、家庭内ルーターのポートフォワードなども設定しておきます。この辺りの手順はそれぞれ異なりますので、各々のマニュアルなどを参照して下さい。

そして[家庭内DNS](https://qiita.com/katz_engineer/items/f2198e5cb7b222d4180e#%E5%86%85%E5%90%91%E3%81%8Ddns)です。Unboundで上記のドメインを設定します。

サーバーの家庭内でのIPアドレスは、私の環境では下記の通りです。

```console:ホスト側
HOST_IPADDR=172.16.1.2
```

CNAMEの設定は面倒なようなので、Aレコードを設定します。

```console:ホスト側
cd /etc/unbound/unbound.conf.d/
cat <<___ | sudo tee -a machines.list >/dev/null
local-data: "$GITLAB_DOMAIN. 3600000 IN A $HOST_IPADDR"
___
```

設定したら文法チェックして、Unboundに読み込みます。

```console:ホスト側
unbound-checkconf
sudo systemctl restart unbound
```

そしてSubversion登録。

```console:ホスト側
sudo svn st /etc
```

```console:ホスト側
sudo svn st /etc | grep "^?" | cut -b9- | sudo xargs -I{} find {} -type f -or -type d -or -type l | sudo xargs -t svn add
sudo svn ci /etc -m"DNS setting for GitLab"
```

# GitLab

## LXDポートフォワードの設定

LXDコンテナに関する設定です。各々の値は他で未使用な事を確認して下さい。

```console:ホスト側
CONTAINER_NAME=gitlab1
CONTAINER_IPADDR=192.168.0.202
CONTAINER_PORT_HTTP=20080
```

```console:ホスト側
lxc network forward port add lxdbr0 $HOST_IPADDR tcp $CONTAINER_PORT_HTTP $CONTAINER_IPADDR 80
```

## LXDコンテナ作成

LXDコンテナを作成します。

```console:ホスト側
lxc init images:ubuntu/jammy/cloud $CONTAINER_NAME --device eth0,ipv4.address=$CONTAINER_IPADDR
```

基本的な初期設定です。インストールするパッケージについては[公式を参照](https://about.gitlab.com/install/#ubuntu)。

```console:ホスト側
lxc config set $CONTAINER_NAME cloud-init.user-data="$(cat <<___
#cloud-config
timezone: Asia/Tokyo
locale: ja_JP.utf8
package_update: true
package_upgrade: true
packages:
  - curl
  - openssh-server
  - ca-certificates
  - tzdata
  - perl
___
)"
```

コンテナ開始。そして開始完了まで待ちましょう。

```console:ホスト側
lxc start $CONTAINER_NAME
lxc exec $CONTAINER_NAME -- cloud-init status --wait
```

## GitLabインストール

いよいよGitLabです。

gitlab-eeのインストール時に環境変数```EXTERNAL_URL```を参照します。これはインストール完了時のURLを表します。上述の環境変数```GITLAB_DOMAIN```を設定しておけば、コンテナ内でそれを参照する手順にしています。

なお、EXTERNAL_URLをhttpsにすると Let's Encrypt から自動的に証明書を取り寄せてしまうとの事。後でリバースプロキシを立てて、そこで証明書を取得するので、ここではhttpにしておきます。

なお、このインストールまで一気にcloud-initで操作しない理由は、このインストールには時間が掛かるからです。そして時々失敗するようです。そのため別操作としました。

これらインストール操作については[公式を参照](https://about.gitlab.com/install/#ubuntu)して下さい。

```console:ホスト側
lxc exec $CONTAINER_NAME --env EXTERNAL_URL="http://$GITLAB_DOMAIN" bash
```

```console:コンテナ内
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | bash
apt install gitlab-ee
```

インストールに成功したら、コンテナを抜けてホストに戻りましょう。

```console:コンテナ内
exit
```

ひとまずここまででGitLabのログイン画面は表示できる筈です。ブラウザで確認してみましょう。ホストマシンで```curl```コマンドでも良いです。なお```curl```コマンドはWindowsにも存在するようです。

```curl```コマンドは```-i```オプションを付けるとレスポンスヘッダも出力してくれます。リダイレクトの様子を見るにはその方が良いかも知れません。

```console:ホスト側
curl -i http://$HOST_IPADDR:$CONTAINER_PORT_HTTP/
```

# リバースプロキシ

## Dockerコンテナ

[Dockerコンテナでリバースプロキシを立てて、Let's Encrypt 証明書発行を仕込みます](https://qiita.com/katz_engineer/items/f642e447eee38869f3eb#%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7)。

```console:ホスト側
cd
mkdir docker-proxy
cd docker-proxy
mkdir -p config/nginx
mkdir -p data/nginx
mkdir -p html/ssl-proof
mkdir letsencrypt
```

```console:ホスト側
cat <<___ >docker-compose.yml
version: "3.9"
services:
  proxy:
    build: .
    container_name: proxy
    restart: unless-stopped
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
      - ./data/nginx:/var/log/nginx
      - ./html:/usr/share/nginx/html
      - ./letsencrypt:/etc/letsencrypt
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: '3'
___
```

```console:ホスト側
cat <<___ >Dockerfile
FROM nginx:latest
RUN apt update \
 && apt install -y certbot \
 && apt -y clean
___
```

```console:ホスト側
cat <<___ >config/nginx/default.conf
server {
    listen        80 default_server;
    server_name   _;
    server_tokens off;

    location / {
        root   /usr/share/nginx/html;
        index  index.html;
    }
}
___
```

```console:ホスト側
cat <<___ >config/nginx/gitlab.conf
server {
    listen        80;
    server_name   $GITLAB_DOMAIN;
    server_tokens off;

    location ^~ /.well-known/acme-challenge/ {
        root   /usr/share/nginx/html/ssl-proof;
    }

    location / {
        proxy_pass http://$HOST_IPADDR:$CONTAINER_PORT_HTTP;
    }
}
___
```

プロキシを起動。

```console:ホスト側
docker compose up -d
```

この段階でブラウザから```http://gitlab.example.com/```を表示できます。リダイレクトされて、サインイン画面が表示されます。

```curl```コマンドを使う場合は下記。

```console:ホスト側
curl -i http://$GITLAB_DOMAIN/
```

## Let's Encrypt 証明書を取得

[Let's Encrypt で証明書を取得](https://qiita.com/katz_engineer/items/f642e447eee38869f3eb#certbot%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%8F%96%E5%BE%97)して[設定](https://qiita.com/katz_engineer/items/f642e447eee38869f3eb#%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AB%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E8%A8%AD%E5%AE%9A)します。

```console:ホスト側
docker compose exec proxy certbot certonly --register-unsafely-without-email --agree-tos --webroot -w /usr/share/nginx/html/ssl-proof -d $GITLAB_DOMAIN
```

```console:ホスト側
cat <<___ >config/nginx/gitlab.conf
server {
    listen        80;
    server_name   $GITLAB_DOMAIN;
    server_tokens off;

    location ^~ /.well-known/acme-challenge/ {
        root /usr/share/nginx/html/ssl-proof;
    }

    location / {
        return 301 https://$GITLAB_DOMAIN;
    }
}
server {
    listen        443 ssl;
    server_name   $GITLAB_DOMAIN;
    server_tokens off;

    ssl_certificate     /etc/letsencrypt/live/$GITLAB_DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$GITLAB_DOMAIN/privkey.pem;

    location / {
        proxy_set_header  Host              \$http_host;
        proxy_set_header  X-Real-IP         \$remote_addr;
        proxy_set_header  X-Forwarded-For   \$proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto https;
        proxy_set_header  X-Frame-Options   SAMEORIGIN;
        proxy_pass http://$HOST_IPADDR:$CONTAINER_PORT_HTTP;
    }
}
___
```

```console:ホスト側
docker compose exec proxy nginx -s reload
```

## external_urlを設定

URL```https://gitlab.example.com/```をGitLabに認識させます。

```console:ホスト側
cd /tmp
mkdir gitlab_url
cd gitlab_url
```

設定ファイル```gitlab.rb```の修正には```patch```を利用しますが、エディタで手作業しても良いです。修正内容は見ればわかるかと。

```console:ホスト側
cat <<___ >gitlab_url.patch
32c32
< external_url 'http://$GITLAB_DOMAIN'
---
> external_url 'https://$GITLAB_DOMAIN'
1661c1661
< # nginx['listen_port'] = nil
---
> nginx['listen_port'] = 80
1665c1665
< # nginx['listen_https'] = nil
---
> nginx['listen_https'] = false
___
```

```console:ホスト側
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_url.patch
```

```console:ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/
```

設定を反映させる為のオマジナイです。

```console:ホスト側
lxc exec $CONTAINER_NAME gitlab-ctl reconfigure
```

```https://gitlab.example.com/```を表示できます。

```console:ホスト側
curl -i https://$GITLAB_DOMAIN/
```

確認できたら後始末。

```console:ホスト側
cd ..
rm -r gitlab_url
```

## Let's Encrypt 証明書を維持

[証明書を維持する為の設定](https://qiita.com/katz_engineer/items/f642e447eee38869f3eb#%E8%87%AA%E5%8B%95%E6%9B%B4%E6%96%B0)です。

```console:ホスト側
cd
cd docker-proxy
cat <<___ >certbot-renew.sh
#!/bin/bash
cd
cd docker-proxy
/usr/bin/date -Iseconds
/usr/bin/docker compose exec proxy certbot renew
/usr/bin/docker compose exec proxy nginx -s reload
echo "====="
___
chmod +x certbot-renew.sh
sudo ln -s $PWD/certbot-renew.sh /usr/local/bin/certbot-renew.sh
```

```console:ホスト側
sudo mkdir /var/log/letsencrypt
```

```console:ホスト側
sudo chown $USER /var/log/letsencrypt
```

```console:ホスト側
cat <<___ | sudo tee /etc/logrotate.d/certbot-renew >/dev/null
/var/log/letsencrypt/certbot-renew.log {
    missingok
    rotate 3
    compress
    monthly
    minsize 1M
}
___
```

```console:ホスト側
cat <<___ | sudo tee /etc/cron.d/certbot-renew >/dev/null
0 3 1,15 * * $USER /usr/local/bin/certbot-renew.sh >>/var/log/letsencrypt/certbot-renew.log 2>&1
___
```

# GitLab設定

メールとLDAP連携を一気に設定しようとしたのですが、修正量が多くなりますので分けます。

## メール

### 設定

公式ドキュメントは[こちら](https://docs.gitlab.com/16.5/omnibus/settings/smtp.html)。基本的には[前回の私の設定](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5#%E3%83%A1%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A)を踏襲します。

[我が家の設定](https://qiita.com/katz_engineer/items/637f6708ed83b58f30ef)だと下記のような感じです。

```console:ホスト側
SMTP_SERVER=primary.home
SMTP_PORT=25
SMTP_DOMAIN=$MY_DOMAIN
GITLAB_EMAIL=gitlab@$SMTP_DOMAIN
GITLAB_REPLY=noreply@$SMTP_DOMAIN
```

```console:ホスト側
cd /tmp
mkdir gitlab_smtp
cd gitlab_smtp
```

```console:ホスト側
cat >gitlab_smtp.patch <<___
85,87c85,87
< # gitlab_rails['smtp_enable'] = true
< # gitlab_rails['smtp_address'] = "smtp.server"
< # gitlab_rails['smtp_port'] = 465
---
> gitlab_rails['smtp_enable'] = true
> gitlab_rails['smtp_address'] = "$SMTP_SERVER"
> gitlab_rails['smtp_port'] = $SMTP_PORT
90c90
< # gitlab_rails['smtp_domain'] = "example.com"
---
> gitlab_rails['smtp_domain'] = "$SMTP_SERVER"
93c93
< # gitlab_rails['smtp_tls'] = false
---
> gitlab_rails['smtp_tls'] = false
98c98
< # gitlab_rails['smtp_openssl_verify_mode'] = 'none'
---
> gitlab_rails['smtp_openssl_verify_mode'] = 'none'
105c105
< # gitlab_rails['gitlab_email_enabled'] = true
---
> gitlab_rails['gitlab_email_enabled'] = true
109,112c109,112
< # gitlab_rails['gitlab_email_from'] = 'example@example.com'
< # gitlab_rails['gitlab_email_display_name'] = 'Example'
< # gitlab_rails['gitlab_email_reply_to'] = 'noreply@example.com'
< # gitlab_rails['gitlab_email_subject_suffix'] = ''
---
> gitlab_rails['gitlab_email_from'] = '$GITLAB_EMAIL'
> gitlab_rails['gitlab_email_display_name'] = 'GitLab'
> gitlab_rails['gitlab_email_reply_to'] = '$GITLAB_REPLY'
> gitlab_rails['gitlab_email_subject_suffix'] = '[GitLab] '
___
```

```console:ホスト側
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_smtp.patch
```

```console:ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/
```

設定を反映させる為のオマジナイ。

```console:ホスト側
lxc exec $CONTAINER_NAME gitlab-ctl reconfigure
```

確認できてないけど後始末。

```console:ホスト側
cd ..
rm -r gitlab_smtp
```

### ブラウザで確認と設定

ここまで来たら、[ブラウザでアクセスして、rootサインインからユーザー作成してメールが飛ぶ事を確認します](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%A7%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E7%94%BB%E9%9D%A2%E3%82%92%E8%A1%A8%E7%A4%BA)。

まずはrootの初期パスワードを確認。

```console:ホスト側
lxc file pull $CONTAINER_NAME/etc/gitlab/initial_root_password -
```

ブラウザで```https://gitlab.example.com/```にアクセスするとログイン画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/b21aa9e4-4129-8ddd-8c20-8cf6050aab3f.png)

Username or primary email 欄は```root```、パスワード欄には確認した初期パスワードを入力し、サインインします。

なにはともあれまずは日本語化です。

サイドバーの右上のアバターをクリックし、ドロップダウンメニューからPreferencesを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/2ab449e4-1c35-60ac-817e-d673ce53a7cb.png)

Preferences画面の下の方にLocalizationがあり、その中にLanguage欄があります。そのドロップダウンリストから Japanese - 日本語 を選択し、Save changes ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/501d502e-0dbc-02bd-a235-73cc87ba74ef.png)

そうしたら一度サインアウトします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/3fde2cdc-6608-169e-f8aa-5d63de60b846.png)

サインイン画面で、```root```の初期パスワードを使用して再度サインインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/d0c7999c-7c77-5f04-a95a-25e0bd91415b.png)

画面が日本語になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/946ca1ed-a058-82f8-eb37-a8b2276396f2.png)

そして、画面上部にドキドキする警告文が表示されています。ここは勧めに従って、サインアップ制限しましょう。

まずは無効化ボタンをクリックします。すると管理者エリア>一般の、ユーザーが新しいアカウントを作成する方法の設定が表示されます。

ここで、私は下記のように設定しました。
- 「サインアップは有効です」 →チェックを外す
- 「新しいサインアップには管理者の承認が必要」 →チェックする
- 「メールの確認設定」 →ハード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/5870ea10-c357-99f4-9978-a4514b63e30f.png)

設定できたら、少し下の方にある 変更を保存 ボタンをクリックします。

次に、```root```ユーザーのパスワードを変更しましょう。アバターをクリックし、ドロップダウンメニューから設定を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/5efe3b84-1a8c-048d-7935-fc1c6e649b64.png)

サイドバー>ユーザー設定>パスワードを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/e9cbbf67-df4e-87bc-0328-67459fc7203e.png)

現在のパスワードと新しいパスワードを入れて、パスワードを保存ボタンをクリックして下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/da09f39f-1405-03bf-ca20-2a6f3a4ace38.png)

するとサインイン画面に遷移し、また、パスワード変更の通知メールも届きますので確認します。[以前設定したPostfixにより、```taro```ユーザーに転送された](https://qiita.com/katz_engineer/items/637f6708ed83b58f30ef#%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9B)筈です。

サインイン画面で新しいパスワードにてサインインしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/2191980d-4997-ffb7-6ddf-4006efbcf8be.png)

そうしたら、```root```のユーザー設定を一通り確認し、必要に応じて変更します。メールアドレスなどもあるので御注意ください。

```root```の設定が一通り終わったら、ユーザー作成の際にメールが飛ぶ事も確認しましょう。

画面左上のタヌキロゴをクリックすると、GitLabへようこそ画面が表示されます。この一番下にある GitLabを調整する をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/04786421-4a75-f530-a42c-2bb09012bd49.png)

管理者エリア>ユーザー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/7d80ca3e-cd19-8030-a633-44c5a05b6e20.png)

ユーザー画面が表示されるので、画面右上の 新しいユーザー ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/a85b1057-b3b0-a869-a11f-5eff2eb0b77e.png)

新しいユーザー画面になります。必要事項を入力してユーザーの作成ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/27e9d1e4-903b-c1b0-5482-734db990e8a6.png)

すると新しく作成したユーザーの画面が表示され、同時に入力したメールアドレスへメールが送信され、[私のPostfixの設定ではtaro@homeに転送されます](https://qiita.com/katz_engineer/items/637f6708ed83b58f30ef#%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E7%9F%A5%E3%82%89%E3%81%AA%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%AE%9B)。

ここまで確認できたら、一旦サインアウトしましょう。そして新しく作成したユーザー```hanako```宛のメールからパスワード変更し、サインインできる事を確認しておきます。

## LDAP

公式ドキュメントは[こちら](https://docs.gitlab.com/16.5/ee/administration/auth/ldap/index.html)。

基本的には、[前回の私の設定](https://qiita.com/katz_engineer/items/4e9331f6f9fcd17f9ae5)を踏襲します。[我が家の設定](https://qiita.com/katz_engineer/items/7ad51c3a8f1ff98efdd1)だと下記のような感じです。

```console:ホスト側
LDAP_SERVER=primary.home
LDAP_PORT=636
```

```console:ホスト側
cd /tmp
mkdir gitlab_ldap
cd gitlab_ldap
```

なお、LDAPサーバーへアクセスする為のユーザー```bind_dn```とそのパスワード```password```はここでは設定しません。ここだと平文になってしまって危険ですので。

```console:ホスト側
cat >gitlab_ldap.patch <<___
502c502
< # gitlab_rails['ldap_enabled'] = false
---
> gitlab_rails['ldap_enabled'] = true
506,511c506,511
< # gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
< #   main: # 'main' is the GitLab 'provider ID' of this LDAP server
< #     label: 'LDAP'
< #     host: '_your_ldap_server'
< #     port: 389
< #     uid: 'sAMAccountName'
---
> gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
>   main: # 'main' is the GitLab 'provider ID' of this LDAP server
>     label: 'LDAP'
>     host: '$LDAP_SERVER'
>     port: $LDAP_PORT
>     uid: 'uid'
514,526c514,526
< #     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
< #     verify_certificates: true
< #     smartcard_auth: false
< #     active_directory: true
< #     allow_username_or_email_login: false
< #     lowercase_usernames: false
< #     block_auto_created_users: false
< #     base: ''
< #     user_filter: ''
< #     ## EE only
< #     group_base: ''
< #     admin_group: ''
< #     sync_ssh_keys: false
---
>     encryption: 'simple_tls' # "start_tls" or "simple_tls" or "plain"
>     verify_certificates: true
>     smartcard_auth: false
>     active_directory: false
>     allow_username_or_email_login: false
>     lowercase_usernames: false
>     block_auto_created_users: false
>     base: 'ou=people,dc=home'
>     user_filter: ''
>     ## EE only
>     group_base: ''
>     admin_group: ''
>     sync_ssh_keys: false
548c548
< # EOS
---
> EOS
___
```

```console:ホスト側
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_ldap.patch
```

```console:ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/
```

次に、[LDAPサーバーにアクセスするユーザー名とパスワードを、暗号化して保存します](https://docs.gitlab.com/ee/administration/auth/ldap/#use-encrypted-credentials)。

```console:ホスト側
lxc shell $CONTAINER_NAME
```

```console:コンテナ内
gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
```

これで```vim```が起動しますので、下記の内容を入力します。
ユーザー名とパスワードは何でもOKです。

今回は、[こういう時の為に用意している（と思われる）ユーザー](https://qiita.com/katz_engineer/items/7ad51c3a8f1ff98efdd1#%E6%BA%96%E5%82%99)を使用します。

```console:コンテナ内:vim
main:
  password: 'readonly_password'
  bind_dn: 'cn=readonly,dc=home'
```

入力したら保存してエディタ終了。コンテナから抜けます。

```console:コンテナ内
exit
```

ところで我が家のLDAPは、オレオレ認証局で証明書を作っているのでした。これを信用させなければなりません。認証局の鍵のありかは下記の通りです。

- 公開鍵 ```/home/cert/demoCA/pki/ca.crt```

```console:ホスト側
sudo -u cert cp -p /home/cert/demoCA/pki/ca.crt /tmp/demoCA.crt
```

```console:ホスト側
sudo chown $USER: /tmp/demoCA.crt
```

```console:ホスト側
chmod 644 /tmp/demoCA.crt
```

```console:ホスト側
lxc file push /tmp/demoCA.crt $CONTAINER_NAME/etc/gitlab/trusted-certs/
rm /tmp/demoCA.crt
```

GitLabへの反映のオマジナイ。

```console:ホスト側
lxc exec $CONTAINER_NAME gitlab-ctl reconfigure
```

これでLDAPと連携するようになりました。ブラウザで```https://gitlab.example.com/```にアクセスしてみて下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107218/a835f956-b636-4fae-b83c-00bdbdad318f.png)

[LDAPユーザー```taro```（パスワード```Ma9H%6jg```）](https://qiita.com/katz_engineer/items/d576dddbe6a4d8b65fca#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2-1)でサインインできる事を確認します。```taro```の設定を確認できたら、一旦サインアウトして、LDAPではなくて標準タブの方から先程のユーザー```hanako```でも引き続きサインインできる事を確認しましょう。

確認できたら後始末。

```console:ホスト側
cd ..
rm -r gitlab_ldap
```

# 仕舞い

これでGitLabの設定が完了しました。我が家のプロジェクト管理はこれで決まり！