Blog.name = " 名前はまだない "

ITだったりそれ以外だったり

Docker-composeでGitLabをぱぱっと構築する

唐突ですが身の回りでこんなファイルがありませんか?

hogehoge_20211009.txt
hogehoge_20211009_old.txt
hogehoge_20211012.txt
hogehoge_20211012(佐藤確認済).txt

現代ではドキュメントのバージョン管理が必須の時代になりました。 それでも往々にして上記のようなクソ管理が横行しています。 これを駆逐するためにバージョン管理ツールを使用するわけですが、 WordやExcelで作られた非プレーンテキストな文章を無理やりGitで管理しようと思うと GitHubのようにWebからぽいっと更新できたほうが便利です。
(むしろ上のような管理をする人はこれぐらい手軽じゃないとやってくれません)

セキュリティ上、クラウドサービスにデータを置きたくないという場合もあると思います。 そこで自身でホスティングできるGitHubクローンのGitLabを Docker-composeを使ってお手軽スピード構築していきます。 *1


準備

今回はLinux (Ubuntu)で環境構築を前提に進めていきます。 GitLabは結構リソースを喰うのである程度のスペックのマシンを用意してください。 起動時点で消費RAMは4GBを超えます。

Docker, Docker-composeの導入

これらの導入は公式を参照してください。

docs.docker.com docs.docker.com

docker-compose.yml の作成

参考: https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/docker/docker-compose.yml

GitLabが公開してるファイルを少しいじります。 適当な場所に以下の内容でdocker-compose.ymlを作成します。

gitlab:
  image: 'gitlab/gitlab-ee:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://192.168.xxx.zzz:8085'
      nginx['listen_port'] = 80
  ports:
    - '8080:80'
    - '2222:22'
  volumes:
    - GITLAB_config:/etc/gitlab
    - GITLAB_logs:/var/log/gitlab
    - GITLAB_data:/var/opt/gitlab

IPアドレスやポートフォワードの設定は各自自由に設定してください。 ボリュームに関しては次で紹介します。

ここではGITLAB_OMNIBUS_CONFIG: に nginx[listen] = 80 を追加しています。 これがないとブラウザからアクセスできません。

データの永続化を行う

バージョンアップなどでコンテナの再生成が必要になった際、リポジトリデータを消すわけには行かないので データの永続化を行います。

永続化には大まかに

  • ボリュームを作成するボリュームマウント
  • ホストのディレクトリを直接バインドするバインドマウント

がありますが、今回はできる限りホスト側での管理をなくしたいので ボリュームマウントを使用します。

先程docker-compose.ymlで指定したボリューム3つ (今回は GITLAB_config, GITLAB_logs, GITLAB_data)を作成します。

$ docker volume create GITLAB_config
GITLAB_config
$ docker volume create GITLAB_logs
GITLAB_logs
$ docker volume create GITLAB_data
GITLAB_data

実行

コンテナの生成、起動

起動は docker-compose up するだけです。(バックグラウンドオプション -d はお好みで)

manace@ubuntu-srv:~$ docker-compose up -d
gitlab_gitlab_1 ... DONE

初回はGitLabコンテナ(1GB超え)のダウンロードがはいるのでいっそう時間がかかります。

冒頭で紹介した通りGitLabは結構重いWebアプリケーションです。 コンテナのup直後に docker ps でSTATUSを見ると
Up 5 minutes (health: starting) となってまだ起動中であることがわかります。

第4世代i3程度の性能だと途中で STATUSがunhealthyとなるぐらいには重いです。 healthyになるまで待ちましょう。

GitLabの設定

rootパスワードの設定

早速docker-compose.ymlで設定したアドレス http://192.168.xxx.zzz:8080 にアクセスすると

f:id:manace:20211118153949p:plain

本来は初回アクセス時にrootパスワードの設定画面が出るようですが、私の環境下では出ませんでした。
ネット上ではrailsのコンソールから強制的にDBに登録されたパスワードを変更するという手法が紹介されていますが /etc/gitlab/initial_root_password にrootの初期パスワードが記載されていることが判明したので、 コンテナに入りパスワードを確認します。 *2

manace@ubuntu-srv:~$ docker exec -it gitlab_gitlab_1 bash
root@gitlab:/etc/gitlab#
root@gitlab:/# cd /etc/gitlab/
root@gitlab:/etc/gitlab# ls
gitlab-secrets.json  initial_root_password  ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
gitlab.rb            ssh_host_ecdsa_key     ssh_host_ed25519_key    ssh_host_rsa_key          trusted-certs
root@gitlab:/etc/gitlab#
root@gitlab:/etc/gitlab# cat initial_root_password
# WARNING: This value is valid only in the following conditions
#          1. If provided manually (either via `GITLAB_ROOT_PASSWORD` environment variable or via `gitlab_rails['initial_root_password']` setting in `gitlab.rb`, it was provided before database was seeded for the first time (usually, the first reconfigure run).
#          2. Password hasn't been changed manually, either via UI or via command line.
#
#          If the password shown here doesn't work, you must reset the admin password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.

Password: onh3cCPyUZBt+1yb2aY7og6TUqpQYKJ2fLJQ5zjbE18=

# NOTE: This file will be automatically deleted in the first reconfigure run after 24 hours.
root@gitlab:/etc/gitlab# exit

ここでは Password: onh3cCPyUZBt+1yb2aY7og6TUqpQYKJ2fLJQ5zjbE18= がパスワード部分です。 こちらを入力すると

f:id:manace:20211118152536p:plain

無事GitLabが使用できるようになりました!

あとは設定からrootパスワードを変更してお好みに設定してください。
いちおうGitLabは日本語を選べますが翻訳率は40%弱程度なので、 日本語欲しさにGitBucketではなくGitLabを選んだ方はご注意を。

*1:個人用、検証目的レベルでの構築ですので、本格的に運用する場合は 公式のリファレンスを読んでしっかりチューニングしてください。

*2:docker-compose.ymlで先に設定する方法もあります