🦊

Running GitLab on Docker - シリーズ投稿6/7

2022/12/26に公開

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は多機能すぎてマシン要件が若干高いです。以下の公式ドキュメントを参照してください。

https://docs.gitlab.com/ee/install/requirements.html

数年前私が初めて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

利用するイメージはこちらです。

https://hub.docker.com/r/gitlab/gitlab-ce

下がdocker-compose.ymlファイルとなります。サービスはgitlab.mylan.localとしており、rpdnsは後ほど更新していきます。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つ紹介しておきます。

https://docs.gitlab.com/ee/administration/get_started.html

https://docs.gitlab.com/ee/install/next_steps.html

本シリーズでは、あとは GitLab RunnerGitLab 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ファイルが作られている新規プロジェクトが作成されます。

https://docs.gitlab.com/ee/gitlab-basics/start-using-git.html#convert-a-local-directory-into-a-repository

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について触れていきます。

next: GitLab Runner and GitLab Pages

Discussion