GitHub クローンな GitLab をインストールする

Software Configuration Management (SCM)

自分だけで使う Git リポジトリを GitHub で管理してみたくなりましたが、非公開にしたいリポジトリの数が多くて GitHub だと費用がかさみ現実的ではありませんでした。

そんな中、GitLab という GitHub クローンなオープンソースの Git リポジトリマネージャーがあると知り、試しに使ってみることにしました。


GitLab とは

GitLab というのは、GitHub と同じ勝手で利用出来る GitHub クローンな Git リポジトリマネージャーです。

オープンソースで開発されていて、自由にインストールして運用できるようになっています。

この頃、自作の iOS アプリのプロジェクトを GitHub で運用してみたくなったのですが、非公開にしたいプロジェクトの数が多くて GitHub だと料金がかさんでしまうのがネックでした。

GitHub と比べて機能に制限があるものの、GitHub のような使い勝手で、非公開プロジェクトも無料でいくつでも運用できます。

GitLab のインストール

今回は GitLab を、 ConoHa VPS 上で稼働している Fedora 20 にインストールします。

GitLab のダウンロードページ

まず、GitLab | Omnibus package downloads for GitLab CE にあるダウンロードページを開くと、インストール予定の OS を選択する画面が表示されます。

今回は Fedora 20 にインストールする予定なので、それにいちばん近い「CentOS 7 (and RedHat/Oracle/Scientific Linux)」を選択します。

そうすると、GitLab のダウンロードからインストール方法までが、その下のDownload the Omnibus package and install everything の欄に表示されます。

GitLab をインストールするにあたって

ここの、特にcurl で始まる行に注意して、インストールを進めます。

今回はcurl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm という表示になってましたが、GitLab の新しいバージョンが出ると変わるはずなので、そのときの最新のものをダウンロードするようにします。

また、インストール方法の説明の中ではopenssh-serverpostfix のインストールについても触れられていますが、必ずしもこれらは必要ありません。

パッケージ 扱い
openssh-server SSH サーバーです。Fedora 20 では標準でインストールされているので、これらに関するインストールは必要ありませんでした。
postfix GitLab はさまざまな通知をメール送信しますが、そのときに SMTP サーバーが必要になります。送信用の SMTP サーバーが既にどこかにあれば Postfix のインストールは必要ない様子でした。今回は別に用意されている SMTP サーバーを使うため、インストールは行いません。

これらの他にも、GitLab をセットアップしたときに、関係する次のサービスが GitLab 用のディレクトリ (/opt/gitlab/sv/ ) に暗黙的にインストールされます。

ちなみにこれらのサービスは、Fedora 20 で一般的なパッケージ管理システムのyum では管理されない様子です。

サービス 場所 内容
logrotate /opt/gitlab/sv/logrotate 運用する中で収集されるログが肥大しないようにログファイルを自動でローテーションするサービスです。
nginx /opt/gitlab/sv/nginx 軽量、高速性をウリにした Web サーバーです。GitLab の Web インターフェイスを提供するのに使われます。
postgresql /opt/gitlab/sv/postgresql データベースサーバーです。
redis /opt/gitlab/sv/redis Key-Value 型のデータストアサーバーです。
sidekiq /opt/gitlab/sv/sidekiq Ruby で非同期処理を効率良く実装するための仕組みだそうです。
unicorn /opt/gitlab/sv/unicorn Nginx で Ruby On Rails フレームワークを稼働させる機能を提供するようです。

これらのサービスはシステム全般とは別の専用のディレクトリにインストールされて稼働されるようですが、Web サーバーは一般的に TCP の 80 番ポートが使われるので、既に Web サーバーが稼働しているシステムに GitLab をインストールしたいときは衝突しないよう調整が必要そうです。

GitLab のダウンロード

GitLab のダウンロードは、先ほどのダウンロードページに記載されていたとおりのcurl を使って行います。

curl -O https://downloads-packages.s3.amazonaws.com/centos-7.0.1406/gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm

このようにすることで、このコマンドを実行したときのカレントディレクトリに GitLab の RPM パッケージがダウンロードされます。

どのディレクトリへダウンロードしても大丈夫です。今回は ~/src ディレクトリにダウンロードすることにしました。

GitLab をインストールする

次のようにしてダウンロードした RPM パッケージをインストールすれば、GitLab のセットアップに必要な機能がインストールされます。

sudo rpm -i gitlab-7.6.2_omnibus.5.3.0.ci.1-1.el7.x86_64.rpm

こうすることで、GitLab の管理を行うためのgitlab-ctl コマンドや、GitLab の設定を行う/etc/gitlab/gitlab.rb がインストールされます。

GitLab のセットアップ

GitLab の運用に必要な機能をインストールしたら、基本設定の調整と、最終的なセットアップを行います。

基本設定を調整する

GitLab の基本設定は/etc/gitlab/gitlab.rb で行います。

設定項目がたくさんありますが、気になったのは次のあたりでした。

GitLab の URL を設定

GitLab の Web インターフェイスや Git リポジトリへアクセスするときに使う URL を、設定ファイルの最初にあるexternal_url で指定します。

external_url 'http://gitlab.xx.jp'

メール送信で使う SMTP を設定

GitLab が通知メールを送信するときに使う SMTP サーバーをGitLab email server settings のところで行います。

################################
# GitLab email server settings #
################################
# see https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/doc/settings/smtp.md#smtp-settings
# Use smtp instead of sendmail/postfix.

# gitlab_rails['smtp_enable'] = true
# gitlab_rails['smtp_address'] = "smtp.server"
# gitlab_rails['smtp_port'] = 456
# gitlab_rails['smtp_user_name'] = "smtp user"
# gitlab_rails['smtp_password'] = "smtp password"
# gitlab_rails['smtp_domain'] = "example.com"
# gitlab_rails['smtp_authentication'] = "login"
# gitlab_rails['smtp_enable_starttls_auto'] = true
# gitlab_rails['smtp_tls'] = false
# gitlab_rails['smtp_openssl_verify_mode'] = false

GitLab をインストールした直後は、上記のように設定が全て # でコメントアウトされているので、この中のgitlab_rails['smtp_enable'] = true のコメントを外して有効化し、その他の必要な項目を有効化しつつ調整します。

GitLab を運用するアカウントの設定

GitLab を運用する Linux アカウントに関する設定がModify default git user のところで行なえるようです。

既定ではアカウント名とグループ名がともにgit が使われるようで、今回もそれを用意するのでこの設定は調整しませんでしたが、別のアカウントで GitLab を運用したい場合には、この辺りを調整すると良さそうです。

## Modify default git user.

# user['username'] = "git"
# user['group'] = "git"
# user['uid'] = nil
# user['gid'] = nil
# # The shell for the git user
# user['shell'] = "/bin/sh"
# # The home directory for the git user
# user['home'] = "/var/opt/gitlab"
# user['git_user_name'] = "GitLab"
# user['git_user_email'] = "gitlab@#{node['fqdn']}"

データの保存場所に関係する設定

今回は調整しませんでしたが、GitLab のデータを保存する場所に関すると思われる設定もありました。

設定項目 設定パス 用途
gitlabrails['backuppath'] /var/opt/gitlab/backups GitLab のバックアップデータが保存される場所のようです。
gitdatadir /var/opt/gitlab/git-data GitLab で作成した Git リポジトリが保存される場所です。
postgresql['datadir'] /var/opt/gitlab/postgresql/data GitLab システムのデータベースが保存される場所です。
gitlabrails['uploads_directory'] /var/opt/gitlab/gitlab-rails/uploads GitLab の Web インターフェイスから登録したアバター画像などのデータがアップロードされる場所です。

これらを調整することで変更できるかは試していませんが、保存場所を変更したい場合はこの辺りを中心に探ってみると良いかもしれません。

運用に必要なアカウントを登録する

今回はあらかじめ追加してあった "git" アカウントを使って GitLab を運用することにしました。

既に登録してあったため、GitLab のインストールでこのアカウントが自動作成されるか分からなかったのですが、必要であれば次のようにしてアカウントを作成できます。

useradd git

セットアップを実行する

設定の調整が終わったら、次のようにして GitLab のセットアップを行います。

sudo gitlab-ctl reconfigure

こうすることで、先ほど編集した設定ファイルの内容に従って GitLab がセットアップされます。このとき、データベースや Web サーバーなど、先ほど挙げたサーバー群もインストールされるので、最初は数分ほどの時間がかかります。

設定を再調整したときにもこのコマンドを実行します。その場合はデータベース等はセットアップなどは省かれ、現行のデータが引き続き利用できます。

セキュリティ設定を調整する

これで GitLab のセットアップは終わりましたが、アクセスするには Fedora 20 のセキュリティ設定を調整する必要があります。

Web へのアクセスを許可する

Fedora 20 では標準で Web サービスへのアクセスが禁止されているので、次のようにしてファイアーウォールを通過できるようにします。

sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld

SSH Key を登録できるようにする

GitLab の Web インターフェイスから SSH キーの登録操作を行えるように、SELinux のセキュリティ設定を調整します。

module gitlab 1.0;

require {
        type ssh_keygen_t;
        type init_tmp_t;
        class file open;
}

allow ssh_keygen_t init_tmp_t:file open;

このようなType Enforcement ファイルをgitlab.te として作成したら、次のコマンドを実行して、Policy Package ファイルgitlab.pp を作成します。

checkmodule -M -m -o gitlab.mod gitlab.te
semodule_package -o gitlab.pp -m gitlab.mod

こうしてgitlab.pp が出来上がったら、それを次のようにしてSELinux に組み込みます。

sudo semodule -i gitlab.pp

こうすることで、GitLab の Web インターフェイスを使用して SSH キーを登録できるようになります。

この設定を行わなかった場合、Web インターフェイスで SSH キーを登録しようとするとFingerprint cannot be generated というエラーメッセージが表示されます。

GitLab の Web インターフェイスにアクセスする

これで、ブラウザで GitLab のセットアップのときに設定ファイルに指定したexternal_url にアクセスして、GitLab の Web インターフェイスを使い始められます。

初期パスワードの設定

ここのSign in のところに、GitLab の公式ページに記載されていた初期アカウントを入力すると、GitLab にサインインできます。

項目 初期値
Username or Email root
Password 5iveL!fe

初期アカウントでサインインすると、最初に、パスワードの変更画面が表示されます。

ここでCurrent password に初期パスワードを入力して、PasswordPassword confirmation に新しく設定したいパスワードを入力します。

そしてSet new passwordボタン を押せば、サインイン用のパスワードの設定は完了です。

SSH キーを登録する

GitLab の Git リポジトリを SSH 接続で扱いたい場合には、プロフィール設定にSSH 公開鍵 を登録する必要があります。

最初、SSH キーが未登録の状態だと『SSH のキーを追加しないと、SSH 経由で pull や push ができない』という旨のメッセージがProject 管理ページの上側に表示されています。

Mac で秘密鍵と公開鍵を作成する

まず、接続したい Mac でターミナルを開いて、次のコマンドを実行し、公開鍵と秘密鍵を作成します。

ssh-keygen -t rsa -b 4096

このコマンドを実行した最後にEnter file in which to save the key: と表示されるので、作成した秘密鍵を保存するファイル名を入力します。何も指定しないとid_rsa というファイル名になり、ホームディレクトリの.ssh ディレクトリに保存されます。

そして、秘密鍵のファイル名と同じ名前で、拡張子.pub がつけられたファイルが公開鍵です。

GitLab に公開鍵を登録する

この公開鍵ファイルに保存されているテキストをコピーして、GitLab のProfile 設定画面にあるSSH Keys の中のKey の入力欄に貼り付けます。

ここにはTitle という入力欄もありますが、これはこの公開鍵が何か(どのホスト用のものかなど)を記録するメモのようなものです。

これらの情報を入力したらAdd Keyボタン を押せば、公開鍵が登録され、秘密鍵を使ってこの GitLab へ SSH 接続できるようになります。

Title 欄は自分で自由に入力することもできますが、公開鍵の末尾にはそういった情報が含まれていて、先にKey 欄に公開鍵を張り付ければ、自動的にTitle も入力されるようになっていました。

準備完了

これで GitLab を使ってひととおりの操作を行う準備ができました。

Appendix

上記までで GitLab の設定は完了です。

以下ではその他の、運用する中で必要になるかもしれないちょっとしたことを記しておきます。

GitLab の起動と停止

GitLab を停止させたい場合は、稼働しているサーバー上で次のコマンドを入力します。

sudo gitlab-ctl stop

このコマンドを実行すると、画面には次のようなメッセージが表示され、GitLab に関連するすべてのサービスが停止されます。

ok: down: logrotate: 0s, normally up
ok: down: nginx: 0s, normally up
ok: down: postgresql: 0s, normally up
ok: down: redis: 0s, normally up
ok: down: sidekiq: 1s, normally up
ok: down: unicorn: 0s, normally up

GitLab を稼働させたい場合は、次のコマンドを使用します。

sudo gitlab-ctl start

sudo gitlab-ctl startsudo gitlab-ctl stop に続けて、たとえばpostgresql などのサービス名を指定すると、そのサービスだけを起動したり終了させたりできます。

GitLab の設定を変更したい場合

たとえば運用するホスト名や使用する SMTP サーバーなど、GitLab の設定を変更したい場合は、設定ファイル (/etc/gitlab/gitlab.rb ) を調整して、最初にセットアップしたのと同じコマンドを再度実行します。

sudo gitlab-ctl reconfigure

こうすることで、新しい設定内容が GitLab に反映されます。現在のリポジトリやデータベースなどはそのまま引き続き利用できます。


ただし、たとえばリポジトリの保存先 (data_dir ) を新しいディレクトリに変更した場合は、新しい場所が空のまま用意されるだけで以前のリポジトリは移動されないので、GitLab がリポジトリを見失います。

その場合、以前に使っていたリポジトリをProject 管理画面でインポートできる様子でした。

各種サービスが使用するファイル

GitLab を構成する各種サービスに関係する設定やデータなどのファイルは、既定では次の場所に保存するように設定されている様子でした。

サービス 内容 パス
Git リポジトリ /var/opt/gitlab/git-data/repositories
PostgreSQL 実行ファイル /opt/gitlab/embedded/bin/postgres
PostgreSQL データベースのデータ /var/opt/gitlab/postgresql/data
Nginx 実行ファイル /opt/gitlab/embedded/sbin/nginx
Nginx 設定ファイル /var/opt/gitlab/nginx/conf/gitlab-http.conf
Nginx ルートディレクトリ /opt/gitlab/embedded/service/gitlab-rails/public
Nginx アクセスログ /var/log/gitlab/nginx/gitlabaccess.log
Nginx エラーログ /var/log/gitlab/nginx/gitlaberror.log
logrotate 実行ファイル /opt/gitlab/embedded/sbin/logrotate
logrotate 設定ファイル /var/opt/gitlab/logrotate/logrotate.conf
redis 実行ファイル /opt/gitlab/embedded/bin/redis-server
redis 設定ファイル /var/opt/gitlab/redis/redis.conf

設定ファイルの更新は、通常は/etc/gitlab/gitlab.rb の内容を更新してgitlab-ctl reconfigure 有効化する流れになるようです。そのとき上記の各種設定ファイルが上書き更新されるらしいので、直接変更する際は注意が必要そうです。