能書き
Ubuntu22.04LTSインストールその2以降続けていたサーバーの構築ですが。自宅サーバー構築譚:基本構想での計画とは違いますが、ここらでGitLabをインストールします。一緒にMattermostも使えるようにします。最近気になってるんですよ、GitLabとMattermost。
目標
- GitLabサーバーを立てます。
- オレオレ認証局が認証した証明書でhttpsアクセスできるようにします。
- LDAPと連携して、LDAP登録したユーザーでログインできるようにします。
- Mattermostサーバーを立てます。
参考文献
- Ubuntu - Official Linux package - Install self-managed GitLab:英語サイトですが、今は自動翻訳できますので問題無いでしょう。
- SMTP settings - Configure - Linux package (Omnibus) - Installation methods - Install - GitLab:これもGitLab公式の英語記事です。自動翻訳で読んで下さい。
- GitLabをインストールしてHTTPS化する手順 - Zenn:SSL化する際の証明書は自分で発行します。その設定手順はこの記事を参考にします。
GitLabそのものではなく、その周辺の設定について。私の環境では下記のようになっています。
- 外部からコンテナ内へ - コンテナ内でコマンド実行 - 自宅サーバー構築譚:LAN内DNSサーバー Unbound・Ubuntu 22.04 - Qiita:LXDコンテナのネットワークフォワードの設定です。
- 自宅サーバー構築譚:LXDでcloud-initによる初期設定の自動化 - Qiita:LXDコンテナの初期設定はcloud-initを利用してみます。
- 設定 - 内向きDNS - 自宅サーバー構築譚:LAN内DNSサーバー Unbound・Ubuntu 22.04 - Qiita:私のサーバーのDNS設定です。
- 自宅サーバー構築譚:オレオレ認証局が認証する証明書 - Qiita
GitLabとOpenLDAPも連携させますが、その手順はこちら。
- GitLabとLDAP(OpenLDAP)連携設定 - Qiita
- Integrate LDAP with GitLab - Authentication and authorization - Configuration your installation - Administrator - GitLab Docs
Mattermostの設定について。
- GitLab Mattermost - Configure - Official Linux package - Installation methods - Install - GitLab
- GitLab で Mattermost を有効化する - Qiita
- Mattermost導入とGitlabの細かな設定 - Qiita
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
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/ にアクセスしてみて下さい。
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
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ログインします。
サイドバーから Admin Area を選択。
またサイドバーから、今度はApplicationsを選択します。
Instance OAuth applications 画面が表示されますので、New application ボタンをクリックします。
Name欄には適当に分かり易い名前を入力(例えばMattermost)
Redirect URI 欄には下記2行を入力します。なお mattermost.example.com は設定したドメインに置き換えて下さい。
- https://mattermost.example.com/signup/gitlab/complete
- https://mattermost.example.com/login/gitlab/complete
Scopes欄はapiにチェックを入れます。それ以外の箇所はデフォルトのままにしておきます。
そして Save application ボタンをクリック。
Application ID と Secret が表示されるので、これをコピーしておきます。
コピーできたらContinueボタンをクリックします。
有効化
手順の都合で、前節で取得した 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/ にアクセスしてみて下さい。
上記のような画面が表示されます。画面下方のGitLabボタンをクリックします。そうすると下記のようなGitLabサインイン画面になります。
そこでLDAPユーザーtaroを入力して Sign in ボタンをクリック。そうするとこんな画面になるのでAuthorizeボタンをクリックします。
Mattermostが始まります。
仕舞い
GitLabとMattermostのサーバーを起動しました。ブラウザでのアクセスも確認できて、GitLabアカウントでのMattermostサインインも確認できました。
実は、iPhoneアプリのMattermostでも確認できてます。ポイントはオレオレ認証局ca.crt
をiPhoneで信頼すること。それさえ出来れば、操作自体はブラウザアクセスと同じでした。
これで少しはおうちクラウドっぽい事が出来るようになりました。やったね