LoginSignup
0
1

能書き

Ubuntu22.04LTSインストールその2以降続けていたサーバーの構築ですが。自宅サーバー構築譚:基本構想での計画とは違いますが、ここらでGitLabをインストールします。一緒にMattermostも使えるようにします。最近気になってるんですよ、GitLabとMattermost。

目標

参考文献

GitLabそのものではなく、その周辺の設定について。私の環境では下記のようになっています。

GitLabとOpenLDAPも連携させますが、その手順はこちら。

Mattermostの設定について。

GitLab

まずは GitLab-EE Omnibus版 (という呼び方で合ってますか?)をインストールします。CEでなくてEEなのは、ライセンスを購入しなければEEはCEと同等との記述があったからです。

LXDコンテナ作成とインストール

コンテナ作成の準備です。

ホスト側
CONTAINER_NAME=gitlab1
CONTAINER_IPADDR=192.168.0.5
GITLAB_DOMAIN=gitlab.example.com
ホスト側
lxc init images:ubuntu/jammy/cloud $CONTAINER_NAME --device eth0,ipv4.address=$CONTAINER_IPADDR

GitLabインストール前にコンテナ内での準備が少しありますが、以前学んだcloud-initを利用して、手間を省きます。

ホスト側
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
___
)"

コンテナを作成します。

ホスト側
lxc start $CONTAINER_NAME

必要なインストールが完了するまで待ちましょう。

ホスト側
lxc exec $CONTAINER_NAME -- cloud-init status --wait

いよいよGitLabです。

gitlab-eeのインストール時に環境変数EXTERNAL_URLを参照します。これはインストール完了時のURLを表します。ここでは http://gitlab.example.com にしていますが、皆さんのドメインに合わせて設定して下さい。上述の環境変数GITLAB_DOMAINを設定しておけば、コンテナ内でそれを参照する手順になってます。

なお、EXTERNAL_URLをhttpsにすると Let's Encrypt から自動的に証明書を取り寄せてしまうようです。私の環境ではオレオレ認証局による証明書を使用するので、ここではhttpにしておきます。

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

ホスト側
lxc exec $CONTAINER_NAME --env EXTERNAL_URL="http://$GITLAB_DOMAIN" bash
コンテナ内
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | bash
apt install gitlab-ee

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

コンテナ内
exit

ホスト名を参照してログイン

LXDコンテナのネットワーク設定です。httpの80番ポートを設定します。なお172.16.1.3は私のホストマシンのIPアドレスです。

ホスト側
GITLAB_IPADDR=172.16.1.3
ホスト側
lxc network forward port add lxdbr0 $GITLAB_IPADDR tcp 80 $CONTAINER_IPADDR 80

家庭内DNSを設定します

Unboundでgitlab.example.comを設定します。

CNAMEはきちんと設定しないと上手くいかないようなので、Aレコードを設定します。
Unboundのそういった仕様については、後日、きちっと勉強しないといけないですね……

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

設定したらUnboundに読み込みます。

ホスト側
sudo systemctl restart unbound

メール設定

メールについてはLXDコンテナ内の設定ファイルを修正します。修正量が多いのでsedではなくpatchを利用しますが、エディタで手作業しても良いです。そこはお好みで。

ホスト側
cd
mkdir gitlab_smtp
cd gitlab_smtp

我が家の設定だとこんな感じ。secondary.homeはIPアドレス172.16.1.3の我が家サーバーです。

ホスト側
SMTP_SERVER=secondary.home
SMTP_PORT=25
SMTP_DOMAIN=secondary.home
GITLAB_EMAIL=gitlab@example.com
GITLAB_REPLY=noreply@example.com
ホスト側
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] '
___
ホスト側
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_smtp.patch
ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/

ここまで出来れば設定完了です。

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

ブラウザでログイン画面を表示

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

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

ブラウザで http://gitlab.example.com/ にアクセスするとログイン画面が表示されます。但し、gitlab-ctl reconfigureコマンドを実行してから安定してアクセス可能になるまで、若干の時間が必要なようです。502エラーが発生したら少し間を置いて再アクセスしましょう。

確認した初期パスワードでログインし、rootパスワードを変更します。
ユーザー作成の際にメールが飛ぶ事も確認しましょう。

パスワード変更やユーザー作成の手順については適当に調べて下さい。GUIなので、一通り画面を表示させていけば理解できるでしょう。英語ですが……

ついでに。デフォルトで「誰でもサインアップ可能」な設定になっているみたいなので、この機能はオフにしておきます。

SSL化

ホスト側
sudo /opt/CA/demoCA/easyrsa --pki-dir=/opt/CA/demoCA/pki build-server-full $GITLAB_DOMAIN nopass

認証局demoCAのパスフレーズを求められるので入力します。

生成された各ファイルは、pkiディレクトリ内の各サブディレクトリに格納されます。

  • 秘密鍵: pki/private
  • 証明書要求: pki/reqs
  • 証明書: pki/issued

確認します。

ホスト側
sudo ls -l /opt/CA/demoCA/pki/{issued/$GITLAB_DOMAIN.crt,private/$GITLAB_DOMAIN.key,reqs/$GITLAB_DOMAIN.req}

LXDコンテナgitlab1の所定の場所に配置します。

ホスト側
lxc exec $CONTAINER_NAME mkdir /etc/gitlab/ssl
ホスト側
lxc exec $CONTAINER_NAME chmod 755 /etc/gitlab/ssl
ホスト側
sudo lxc file push /opt/CA/demoCA/pki/private/$GITLAB_DOMAIN.key $CONTAINER_NAME/etc/gitlab/ssl/
ホスト側
sudo lxc file push /opt/CA/demoCA/pki/issued/$GITLAB_DOMAIN.crt $CONTAINER_NAME/etc/gitlab/ssl/
ホスト側
cd
mkdir gitlab_https
cd gitlab_https

パッチを用意して当てます。

ホスト側
cat >gitlab_https.patch <<___
32c32
< external_url 'http://$GITLAB_DOMAIN'
---
> external_url 'https://$GITLAB_DOMAIN'
1530c1530
< # nginx['redirect_http_to_https'] = false
---
> nginx['redirect_http_to_https'] = true
2090a2091,2092
> mattermost_nginx['redirect_http_to_https'] = true
> 
2115a2118,2119
> 
> registry_nginx['redirect_http_to_https'] = true
___
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_https.patch
ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/
ホスト側
lxc exec $CONTAINER_NAME gitlab-ctl reconfigure

ネットワーク設定です。

ホスト側
lxc network forward port add lxdbr0 $GITLAB_IPADDR tcp 443 $CONTAINER_IPADDR 443

後は、普段使いのブラウザで、オレオレ認証局を信頼します。手順はそれぞれのブラウザによるので各々調べて下さい。
私のオレオレ認証局の公開鍵は/opt/CA/demoCA/pki/ca.crtなので、これを信頼するようにします。

ここまで出来ればSSL化完了です。ブラウザで https://gitlab.example.com/ にアクセスしてみて下さい。

LDAP連携

GitLabはLDAPと連携できるようですので、設定してみました。

まず、コンテナ内の/etc/gitlab/trusted-certsにオレオレ認証局の公開鍵ca.crtを置きます。

ホスト側
sudo lxc file push /opt/CA/demoCA/pki/ca.crt $CONTAINER_NAME/etc/gitlab/trusted-certs/

それからgitlab.rbを修正。ここではLDAPサーバーへアクセスする為のユーザーbind_dnとパスワードpasswordは設定しません。ここだと平文になってしまって危険ですので。

ホスト側
cd
mkdir gitlab_ldap
cd gitlab_ldap
ホスト側
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: 'secondary.home'
>     port: 636
>     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
___
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_ldap.patch
ホスト側
lxc file push gitlab.rb $CONTAINER_NAME/etc/gitlab/

そしてLDAPサーバーにアクセスするユーザー名とパスワードを、暗号化して保存します

ホスト側
lxc shell $CONTAINER_NAME
コンテナ内
gitlab-rake gitlab:ldap:secret:edit EDITOR=vim

これでvimが起動しますので、下記の内容を入力します。
ユーザー名とパスワードは何でもOKです。管理者でも構いませんが、一般ユーザーで十分のようです。

なおMa9H%6jgは、私のLDAPユーザーtaroに設定したLDAPパスワードです

main:
  password: 'Ma9H%6jg'
  bind_dn: 'uid=taro,ou=people,dc=home'

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

コンテナ内
exit

最後にgitlab-ctl reconfigureを実行。

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

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

image.png

Mattermost

Mattermostについてはhttps化やその他の設定も一気に行きます!

注意。
ポート番号をデフォルトから変更すると、アカウント認証でGitLabと連携する際に失敗します。素直にデフォルトを使いましょう(httpなら80番、httpsなら443番)

SSL証明書を作成

ホスト側
MATTERMOST_DOMAIN=mattermost.example.com
ホスト側
sudo /opt/CA/demoCA/easyrsa --pki-dir=/opt/CA/demoCA/pki build-server-full $MATTERMOST_DOMAIN nopass

認証局demoCAのパスフレーズを求められるので入力します。

生成された各ファイルは、pkiディレクトリ内の各サブディレクトリに格納されます。

  • 秘密鍵: pki/private
  • 証明書要求: pki/reqs
  • 証明書: pki/issued

確認します。

ホスト側
sudo ls -l /opt/CA/demoCA/pki/{issued/$MATTERMOST_DOMAIN.crt,private/$MATTERMOST_DOMAIN.key,reqs/$MATTERMOST_DOMAIN.req}

LXDコンテナgitlab1の所定の場所に配置します。所定の場所/etc/gitlab/sslはGitLabのSSL化の際に作成したので、そこに置くだけです。

ホスト側
sudo lxc file push /opt/CA/demoCA/pki/private/$MATTERMOST_DOMAIN.key $CONTAINER_NAME/etc/gitlab/ssl/
ホスト側
sudo lxc file push /opt/CA/demoCA/pki/issued/$MATTERMOST_DOMAIN.crt $CONTAINER_NAME/etc/gitlab/ssl/

家庭内DNS

家庭内DNSを設定します

Unboundでmattermost.example.comを設定します。

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

設定したらUnboundに読み込みます。

ホスト側
sudo systemctl restart unbound

GitLabでMattermost用のアプリケーションキーを発行

GitLabをMattermostと連携させる為、アプリケーションキーを発行します。これはGUIで設定しなければなりません。

まずはGitLabで、LDAPではなくStandardタブでrootログインします。

image.png

サイドバーから Admin Area を選択。

image.png

またサイドバーから、今度はApplicationsを選択します。

image.png

Instance OAuth applications 画面が表示されますので、New application ボタンをクリックします。

image.png

Name欄には適当に分かり易い名前を入力(例えばMattermost)
Redirect URI 欄には下記2行を入力します。なお mattermost.example.com は設定したドメインに置き換えて下さい。

Scopes欄はapiにチェックを入れます。それ以外の箇所はデフォルトのままにしておきます。

image.png

そして Save application ボタンをクリック。

Application ID と Secret が表示されるので、これをコピーしておきます。

image.png

コピーできたらContinueボタンをクリックします。

image.png

有効化

手順の都合で、前節で取得した Application ID と Secret を変数に格納。

ホスト側
MATTERMOST_APPID=6f291922281501fa1bcb82bb67bd749977d9ee00f5363925837b612fcaeb70d2
MATTERMOST_SECRET=11897af983d7d560d2a33fc0a5f33abd7b4a0892250c89b9b2af44a071139fec

gitlab.rbを取得します。

ホスト側
cd
mkdir gitlab_mattermost
cd gitlab_mattermost

例によって変更点をパッチにしました。これをgitlab.rbに当てます。

ホスト側
cat >gitlab_mattermost.patch <<___
2034c2034
< # mattermost_external_url 'http://mattermost.example.com'
---
> mattermost_external_url 'https://$MATTERMOST_DOMAIN'
2055,2061c2055,2061
< # mattermost['gitlab_enable'] = false
< # mattermost['gitlab_id'] = "12345656"
< # mattermost['gitlab_secret'] = "123456789"
< # mattermost['gitlab_scope'] = ""
< # mattermost['gitlab_auth_endpoint'] = "http://gitlab.example.com/oauth/authorize"
< # mattermost['gitlab_token_endpoint'] = "http://gitlab.example.com/oauth/token"
< # mattermost['gitlab_user_api_endpoint'] = "http://gitlab.example.com/api/v4/user"
---
> mattermost['gitlab_enable'] = true
> mattermost['gitlab_id'] = "$MATTERMOST_APPID"
> mattermost['gitlab_secret'] = "$MATTERMOST_SECRET"
> mattermost['gitlab_scope'] = "api"
> mattermost['gitlab_auth_endpoint'] = "https://$GITLAB_DOMAIN/oauth/authorize"
> mattermost['gitlab_token_endpoint'] = "https://$GITLAB_DOMAIN/oauth/token"
> mattermost['gitlab_user_api_endpoint'] = "https://$GITLAB_DOMAIN/api/v4/user"
___
lxc file pull $CONTAINER_NAME/etc/gitlab/gitlab.rb .
patch gitlab.rb <gitlab_mattermost.patch

gitlab.rbを書き戻します。

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

gitlab-ctl reconfigureの実行を忘れずに。

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

これでMattermostが起動してGitLabと連携する筈です。

ブラウザで https://mattermost.example.com/ にアクセスしてみて下さい。

image.png

上記のような画面が表示されます。画面下方のGitLabボタンをクリックします。そうすると下記のようなGitLabサインイン画面になります。

image.png

そこでLDAPユーザーtaroを入力して Sign in ボタンをクリック。そうするとこんな画面になるのでAuthorizeボタンをクリックします。

image.png

Mattermostが始まります。

image.png

仕舞い

GitLabとMattermostのサーバーを起動しました。ブラウザでのアクセスも確認できて、GitLabアカウントでのMattermostサインインも確認できました。

実は、iPhoneアプリのMattermostでも確認できてます。ポイントはオレオレ認証局ca.crtをiPhoneで信頼すること。それさえ出来れば、操作自体はブラウザアクセスと同じでした。

これで少しはおうちクラウドっぽい事が出来るようになりました。やったね:thumbsup_tone1:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1