Running GitLab on Docker - シリーズ投稿6/7
Series Top: Dockerで作るおうちLAN遊び場
この投稿はシリーズ6番目となり、今回はもう一台マシンを導入してGitLabを走らせます。GitLabは機能が豊かすぎて最初の4Gメモリのマシンではスムーズに動作しないかもしれないためです。強力なマシンならばシリーズ通して一台で事足りると思います。
What's on the place so far
シリーズここまで通してきて、現在のセットアップは以下のとおりです。
- Unbound, DNS server
- Nginx, web server, reverse proxy, SSL offloading
- Jupyter Notebook, web service
- Authelia, authentication server
Second physical server
おうちLANということでユーザ数は限定されていますので、一台目のサーバへの負荷は大したことないと思います。ただしGitLabは多機能すぎてマシン要件が若干高いです。以下の公式ドキュメントを参照してください。
数年前私が初めてGitLabを走らせた時は、上記のサービス全てに加えて、同じマシンでGitLabを実行しました。動作したものの、ウェブ上での操作が遅いと感じ、後にセットアップを見直した時に2台目のマシンを導入しました。このシリーズでも同様に、以降は2台目を使っていきます。2台目のマシンのIPアドレスは192.168.1.55
です。
Running GitLab using Docker
DockerでGitLabを走らせる方法は全て公式ドキュメントにある通りとなりますが、毎度のごとく専用のディレクトリを (2台目のマシン上に) 用意してdocker-compose.yml
ファイルを配置しましょう。
https://docs.gitlab.com/ee/install/docker.html#install-gitlab-using-docker-compose
mkdir -p $HOME/mylan/gitlab
cd $HOMEmylan/gitlab
利用するイメージはこちらです。
下がdocker-compose.yml
ファイルとなります。サービスはgitlab.mylan.local
としており、rp
やdns
は後ほど更新していきます。GitLabコンテナは80番ポートのみ露出させます。これまでセットアップした他サービス同様、クライアントからのアクセスはリバースプロキシ目掛けてhttpsアクセスとなりますが、その後ろのリバースプロキシとGitLab間の通信はただのhttpとなるためです。
このコンテナ用のボリュームとしては、ログとデータ用にそれぞれ用意しています。そしてコンテナ内のコンフィグ用のディレクトリ/etc/gitlab
は./config
、つまりホストマシンの$HOME/mylan/gitlab/config
としています。コンテナが走り始めると、/etc/gitlab
のコンフィグを読んで立ち上がります。
services:
gitlab:
image: 'gitlab/gitlab-ce:15.5.1-ce.0'
restart: always
hostname: 'gitlab.mylan.local'
container_name: gitlab
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.mylan.local'
ports:
- '80:80'
volumes:
- type: bind
source: ./config
target: /etc/gitlab
- type: bind
source: mylan_gitlab_log_volume
target: /var/log/gitlab
- type: bind
source: mylan_gitlab_data_volume
target: /var/opt/gitlab
volumes:
mylan_gitlab_log_volume: {}
mylan_gitlab_data_volume: {}
早速サービスは実行してしまいましょう。そしてサービスにgitlab.mylan.local
でアクセスするためにDNSとリバースプロキシを用意していきましょう。
DNS record for gitlab.mylan.local
$HOME/mylan/dns/config/a-records.conf
ファイルに、gitlab.mylan.local
レコード追加用に一行追記します。GitLabを実行しているマシンは192.168.1.55
ですが、クライアントからのアクセスはhttpsでリバースプロキシへ向かいます。従ってクライアントからgitlab.mylan.local
へのアクセスは192.168.1.56
へ向かうよう、DNSレコードもそのように用意します。
ファイルを更新したらDNSコンテナを再起動させておきましょう。
# A Record
#local-data: "somecomputer.local. A 192.168.1.1"
local-data: "jupyter.mylan.local. A 192.168.1.56"
local-data: "login.mylan.local. A 192.168.1.56"
local-data: "gitlab.mylan.local. A 192.168.1.56"
# PTR Record
#local-data-ptr: "192.168.1.1 somecomputer.local."
local-data-ptr: "192.168.1.56 jupyter.mylan.local."
Reverse proxy for GitLab
既存のrp
配下にサーバコンフィグファイルを一つ追加します。一つ前の投稿で既存のサービスに関してはAutheliaのMFAを組み込みましたが、GitLabは自分で2FAを持っているのでAuthelia関連のファイルはincludeせずに用意します。
単純に既存のjupyter.conf
ファイルをコピーし、名前やupstreamを変えて、Authelia関連行を削除すれば完成です。
TLS関連の設定はそのまま残しておきます。用意した証明書はワイルドカード *.mylan.local
で今回追加する新しいサービスもカバーしてくれるからです。
ファイルが用意できたらサービス再起動しておきましょう。
$ cat $HOME/mylan/rp/conf.d/gitlab.conf
server {
listen 443 ssl http2;
server_name gitlab.mylan.local;
# docker resolver
resolver 127.0.0.11 valid=30s;
# tls
include /etc/nginx/tls/tls.conf;
location / {
set $upstream 192.168.1.55:80;
proxy_pass http://$upstream;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
Accessing GitLab
ブラウザを立ち上げ https://gitlab.mylan.local
へアクセスしましょう。GitLabのログインページが表示されます。
Initial login as root
自動的に作成されるユーザはroot
であり、その初期パスワードは/etc/gitlab/initial_root_password
ファイル内に記載されています。以下の通りのdocker exec
コマンドで表示させることができますが、$HOME/mylan/gitlab/config
上にももちろん同じファイルがあることが確認できるでしょう。
$ docker exec gitlab grep 'Password:' /etc/gitlab/initial_root_password
Password: 5EtRD56Y1KX3+fxdSvbaqX5DPaJ5DM9T1wnYBzjSE80=
What to do on my first login?
おめでとうございます!GitLabは立ち上がり、rootとしてログインもできました!パスワードを更新し、あとは思うがままに遊んでみてください。GitLabのチュートリアルやスタートガイドはインターネット上でいくらでも見つかるかと思いますが、ここでは公式ドキュメントのリンクを2つ紹介しておきます。
本シリーズでは、あとは GitLab Runner と GitLab Pages を次回投稿でカバーしていきます。
残りの内容は完全にオプショナルで、シリーズの残りの構築とも関係ないのでやる必要はありません。
本投稿の残りで、私がやっておきたいと思った変更について簡単に触れておきます。いつか外部に公開したときのことを念頭に置いた設定もありますが、シリーズで何回か触れている通り、私はパブリックで通用するドメインを購入しており、おうちでも外出中でも自身のサーバで走らせているGitLabにアクセスできるようにしているためです。
Update root password and profile
すでに触れたとおり、"Edit Password"ページを見つけてrootユーザのパスワードを更新しておきましょう。他にもemails, account, notificationsの設定ページを確認し、必要に応じてメールアドレスや2FA有効化などしておきましょう。
Sign-up restrictions
https://docs.gitlab.com/ee/user/admin_area/settings/sign_up_restrictions.html
知らない人が偶然にでもインターネット越しにアクセスしてきた時のことを考え、私はself sign-up機能を無効化しています。
Create user account
管理者アカウントではなく普段使いのユーザアカウントを一つ作っておきます。
https://docs.gitlab.com/ee/user/profile/account/create_accounts.html
なお手動でユーザアカウントを作ると、UI上でパスワードリセットのリンクが指定のメールアドレスに送られたこと表示されます。このシリーズ内で構築している環境では例として"ghost"という名前のユーザを、"ghost@mylan.local"というメールアドレスで作っているのですが、当然メールはどこにも到達しようがないですし、そもそもSMTP設定もしていません。ではどうするかというと、rootとしてghostユーザを作成し、そのままroot管理者としてこのghostユーザのパスワードを設定してしまいます。そうしてrootからログアウト、ghostユーザとして設定したパスワードでログインすると、GitLabがユーザの初期ログイン時の対応としてパスワード更新させてきますので改めてghostユーザとして使うパスワードを設定します。
First login as user
ようやく通常ユーザアカウントでログインできましたら、私の場合はアバターやcommit emailなどの変更や、2FA有効化をしておきます。
なお2FAを有効にするとパスワード文字列でgit push
などのgit
オペレーションが実行できなくなります。ですので以下のドキュメントを参照してアクセストークンを発行してそれをパスワードに代わり使っていきます。
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html
Creating first project
一つプロジェクトを作って基本的なgitオペレーションを実行してみます。
GitLabのウェブGUI上よりblank project作成し、"mylan"と名付けます。プロジェクト作成時にはInitialize repository with README
というオプションがありますが、それを使って作成しておきます。すると最初からREADME.mdファイルが作られている新規プロジェクトが作成されます。
Configuring git
リバースプロキシなどを実行している1つ目のマシンに戻り、gitを設定し、$HOME/mylan
以下をプロジェクトリポジトリに載せてみます。
まずgitオペレーションで使用するユーザ名とメールアドレスを設定します。GitLabで作成したユーザ名は"ghost"でしたのでその通りのユーザ名で設定します。またメールアドレスは、GitLab上のプロフィール設定で匿名メールアドレスにしているのであればそれを使うよう設定しておきます。
git config --global user.name "ghost"
git config --global user.email "2-ghost@users.noreply.gitlab.mylan.local"
git config --global init.defaultBranch main
パスワードはアクセストークンを用います。スコープは"read_repository"と"write_repository"としておきました。
https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token
Git over HTTPSで動作できるようクレデンシャルを以下のようにファイルに書き込む形で設定します。最後は空行で終えると入力が終了します。
git credential-store --file ~/.git-credentials store
protocol=https
host=gitlab.mylan.local
username=ghost
password={access_token_here}
ブラウザでサービスにアクセスする元の端末にはroot CAを導入したかと思いますが、この一台目のマシンでもgitオペレーション時にCAを信頼させる必要があります。以下の通り実行して追加で信頼すべき自己署名のCAを設定しておきましょう。
cd
cp mylan/openssl/rootCA.crt .
git config --global http."https://gitlab.mylan.local/".sslCAInfo ~/rootCA.crt
Git operation
以上全部設定を終えると、ようやくgitを使う準備ができました。
既存の$HOME/mylan
ディレクトリに移動し、以下をgitレポジトリとして既存ファイルを追加してGitLab上の新規作成したプロジェクトリポジトリを更新します。プロジェクト作成時にREADMEファイルが作られているのでまずはそれをダウンロードしてからローカルにあるファイルをGitLab上のプロジェクト側へアップロードします。
cd $HOME/mylan
# initialize directory as git repo and add all existing files
git init
git branch main
git add -A && git commit -m "init"
# set remote, download/merge from existing repo created on GitLab GUI
# then upload/push
git remote add origin https://gitlab.mylan.local/ghost/mylan.git
git fetch origin
git merge origin/main --allow-unrelated-histories
git push --set-upstream origin main
以後、$HOME/mylan
配下でファイルの追加や更新をし、それらをgit add
してステージし、git commit
で変更をコミットし、GitLab上のプロジェクトとしてトラックしていくことができます。
Closing
2台目のマシンでGitLabを実行するところまでできました。Nginxサーバへのサーバコンフィグ追加、DNSサーバでレコードの追加をしたことでhttps://gitlab.mylan.local
でGitLabに接続できるようにできました。
次の投稿では引き続きGitLabで遊んでいくのですが、GitLab RunnerとGitLab Pagesについて触れていきます。
Discussion