注目の記事

社内 GitHub を実用的に構築! Amazon VPC 環境に GitLab サーバを構築してみた

2013.02.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

先日 GitLab を Mac OS X にインストールするという記事を執筆しました。その用途はあくまで「個人で GitLab を使ってみよう!」というものでしが、やはり本命はクラウド上に構築し、どこからでもアクセスできるようにすることだと思います。しかしながら実際の運用で大切になってくるのはセキュリティです。クラウド上に構築しつつ、ソースはしっかり守る。この点が特に必要ではないでしょうか。というわけで今回は Amazon VPC 上に GitLab サーバを構築してみたので、その手順をまとめておきたいと思います!

gitlab_change_icon

このエントリの効能

このエントリを読んで、試すと、以下のような効能があります。多分。

  • AWS 上に社内で使える Git サーバーが構築できる
  • Amazon VPC 環境 (ミニマム) が構築できるようになる
  • Rails + Unicorn + nginx サーバーが構築できるようになる
  • Ruby on Rails に (ちょっとだけ) 詳しくなる
  • Git に (ちょっとだけ) 詳しくなる
  • コマンドラインが (ちょっとだけ) 怖くなくなる ← 重要

Amazon VPCを使ったミニマム構成のサーバ環境を構築する

まずは VPC 環境づくりです。下記の記事をもとに、ミニマム構成のサーバ環境を構築してみましょう。

Amazon VPCを使ったミニマム構成のサーバ環境を構築する

この手順のうち、今回は nginx を使うので httpd のインストールは飛ばして OK です。 手順通りに構築すると、以下のような構成になると思います。

EC2 (GitLab Server)
Amazon Linux (smallインスタンス)
public サブネットマスク
ElasticIP 付与
ローカルIP 10.0.0.100
RDS (GitLab Database)
MySQL 5.5.8 (microインスタンス)
private サブネットマスク (MultiA-Z)
グローバルIPなし

そんな感じです。また追加で EC2 インスタンスに使う Security Group を HTTP でアクセスできるように設定してください。社内からだけアクセスさせたい場合は社内の CIDR のみに設定しましょう。

gitlab_edit_sc

Amazon Linux に GitLab をインストールする

公式インストールガイドから Amazon Linux 用に修正しました。ここを読んでわからないところは本家も確認しながら進めてください。

  1. パッケージのインストール
  2. ユーザ・グループの作成
  3. Gitolite のインストール
  4. Ruby のインストール
  5. Redis のインストール
  6. nginx のインストール
  7. データベースの作成
  8. GitLab のインストール

パッケージのインストール

まずは以下のように必要なパッケージをインストールしましょう。以下に GitLab 公式のインストールページに記載されているパッケージから Amazon Linux AMI に不要なもの・必要なものをまとめてみました。

sudo su -
yum update
yum install -y \
make \
gcc-c++ \
patch \
libyaml-devel \
libffi-devel \
libicu-devel \
zlib-devel \
readline-devel \
git-core \
postfix \
mysql \
mysql-devel \
perl-Time-HiRes

ユーザ・グループの作成

次に git グループと gitlab ユーザを作成します。

sudo su -
adduser -c 'Git Version Control' git
adduser -c 'GitLab' gitlab
usermod -G git gitlab

Gitolite へのアクセスは GitLab アカウントから行う必要があるので GitLab アカウント用の公開鍵を生成します。パスフレーズはなしで。生成後 git アカウントがアクセスできるよう場所にファイルをコピーしておきます。

su - gitlab
ssh-keygen -q -N '' -t rsa -f ~/.ssh/id_rsa
exit

その後 root に戻り作成した id_rsa.pub ファイルを git ユーザがアクセスできる場所にコピーします。またパーミッションも変更しておきます。

cp /home/gitlab/.ssh/id_rsa.pub /home/git/gitlab.pub
chmod 0444 /home/git/gitlab.pub

Gitolite のインストール

次に Git リポジトリ管理ツールである Gitolite をインストールします。以下は先ほど作成した Git ユーザーで作業します。

su - git

# インストール・セットアップ
mkdir bin
sh -c 'printf "%b\n%b\n" "PATH=\$PATH:/home/git/bin" "export PATH" >> /home/git/.profile'
git clone -b gl-v320 https://github.com/gitlabhq/gitolite.git /home/git/gitolite
gitolite/install -ln /home/git/bin
gitolite setup -pk /home/git/gitlab.pub

# パーミッションの変更
chmod 750 /home/git/.gitolite/
chown -R git:git /home/git/.gitolite/
chmod -R ug+rwX,o-rwx /home/git/repositories/
chmod -R ug-s /home/git/repositories/
chown -R git:git /home/git/repositories/
find /home/git/repositories/ -type d -print0 | sudo xargs -0 chmod g+s
exit

正常に動作するか確認しましょう。 gitlab ユーザでログインして localhost に ssh 接続できたら正常にセットアップできています。

su - gitlab
ssh git@localhost

コンソールに以下のように表示されたら成功です。

PTY allocation request failed on channel 0
hello gitlab, this is git@ip-10-0-0-100 running gitolite3 v3.2-gitlab-patched-0-g2d29cf7 on git 1.7.4.5
R W	gitolite-admin
R W	testing
Connection to localhost closed.

さらに念のため… Gitolite セットアップ後、必ず gitolite-admin というリポジトリが作成されているので、ちゃんと clone できるか試しておきましょう。

git clone git@localhost:gitolite-admin.git /tmp/gitolite-admin
rm -rf /tmp/gitolite-admin

以上で Gitolite のインストール・セットアップは完了です!

Ruby のインストール

Ruby のインストールはやたらと重いので、EC2 インスタンスを一時的に small 以上に変更しておくことを推奨します。Ruby インストール後は元に戻して OK です。

次に Ruby のインストールです。複数バージョンの Ruby をインストールできる rbenv を使いましょう。以下は gitlab ユーザーとして作業してください。

su - gitlab
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 環境変数を反映させるため、再ログイン
exit
su - gitlab

mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
rbenv install 1.9.3-p385
rbenv global 1.9.3-p385
gem install bundler --no-ri --no-rdoc
exit

bundler インストール後も再度ログインしないと bundler が使えなかったので注意してください。

Redis のインストール

次に Redis のインストールです。--enablerepo=epel を付けてインストールします。これは Amazon Linux AMI の Extra Packages for Enterprise Linux (EPEL) へのアクセスがオフになっているためのようです。

yum install -y redis --enablerepo=epel

インストールが完了したら、Redis の自動起動を設定し、起動しておきます。

chkconfig redis on
/etc/init.d/redis start

nginx のインストール

次はリバースプロキシサーバである nginx をインストールします。

sudo su -
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
curl --output /etc/nginx/sites-available/gitlab https://raw.github.com/gitlabhq/gitlab-recipes/4-2-stable/nginx/gitlab
ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab

# 以下のファイルを修正する
vim /etc/nginx/sites-enabled/gitlab
vim /etc/nginx/nginx.conf

/etc/nginx/sites-enabled/gitlab はポート 80 番で GitLab にアクセスできるように修正します。

# GITLAB
# Maintainer: @randx
# App Version: 4.0

upstream gitlab {
  server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket;
}

server {
  listen 80 default_server;         # e.g., listen 192.168.1.1:80;
  server_name gitlab;     # e.g., server_name source.example.com;
  root /home/gitlab/gitlab/public;

  # individual nginx logs for this gitlab vhost
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;

  location / {
    # serve static files from defined root folder;.
    # @gitlab is a named location for the upstream fallback, see below
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

  # if a file, which is not found in the root folder is requested,
  # then the proxy pass the request to the upsteam (gitlab unicorn)
  location @gitlab {
    proxy_read_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
    proxy_connect_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
    proxy_redirect     off;

    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_set_header   Host              $http_host;
    proxy_set_header   X-Real-IP         $remote_addr;

    proxy_pass http://gitlab;
  }
}

また、ここに書かれている障害があるようなので /etc/nginx/nginx.conf は user を gitlab に変更しておきます。また /etc/nginx/sites-enabled/gitlab を include します。

vim /etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  gitlab;
worker_processes  1;

…

    # Load config files from the /etc/nginx/conf.d directory
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

データベースの作成

次に GitLab で使用するデータベースを作成します。データベースは VPC 上に立てた RDS インスタンスを使います。 gitlab@10.0.0.100 というユーザを作成します。IP は EC2 インスタンスのローカル IP を指定してください。また gitlabhq_production というデータベースを作り gitlab@10.0.0.100 ユーザにアクセス権限を設定します。

mysql -h ********.********.ap-northeast-1.rds.amazonaws.com -u user -p
CREATE USER 'gitlab'@'10.0.0.100' IDENTIFIED BY 'password';
CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'10.0.0.100';
\q

gitlab'@'10.0.0.100 ユーザでアクセスできるようになればデータベースの設定は完了です!

mysql -h ********.********.ap-northeast-1.rds.amazonaws.com -u gitlab -p -D gitlabhq_production

GitLab のインストール

いよいよ GitLab のインストールに入ります。まずは GitHub から clone してきましょう。安定版を使用する場合は 4-2-stable ブランチを checkout します。個人的な見解ですと master は頻繁に修正されるので、細かいところで環境設定がうまくいかずハマる確率が高い気がします。そのため stable を使ったほうが無難だと思います。まぁ当たり前のことなんですが。。
また log ディレクトリと tmp ディレクトリのパーミッションを変更します。また設定ファイルである gitlab.yml と database.yml の sample ファイルがあるのでそれをコピーして中身を書き換えます。

# GitHub から clone
su - gitlab
git clone https://github.com/gitlabhq/gitlabhq.git gitlab

# 安定版を使用する
cd /home/gitlab/gitlab
git checkout 4-2-stable

# パーミッションの変更
sudo chown -R gitlab log/
sudo chown -R gitlab tmp/
sudo chmod -R u+rwX  log/
sudo chmod -R u+rwX  tmp/

# gitlab-satellites ディレクトリの作成
mkdir /home/gitlab/gitlab-satellites

# Git ユーザの設定
git config --global user.name  "GitLab"
git config --global user.email "gitlab@localhost"

# 設定ファイルのコピー・修正
cp config/gitlab.yml.example config/gitlab.yml
cp config/database.yml.mysql config/database.yml
vim config/database.yml

gitlab.yml は hook の設定を変更します。

gitlab.yml

# # # # # # # # # # # # # # # # # #
# Gitlab application config file  #
# # # # # # # # # # # # # # # # # #
#
# How to use:
# 1. copy file as gitlab.yml
# 2. Replace gitlab -> host with your domain
# 3. Replace gitlab -> email_from

production: &base
  #
  # 1. GitLab app settings
  # ==========================

  ## GitLab settings
  gitlab:
    ## Web server settings
    host: your_host
    port: 80
    https: false
    # Uncomment and customize to run in non-root path
    # Note that ENV['RAILS_RELATIVE_URL_ROOT'] in config/unicorn.rb may need to be changed
    # relative_url_root: /gitlab
    
    …
    
  #
  # 3. Advanced settings
  # ==========================

  # GitLab Satellites
  satellites:
    # Relative paths are relative to Rails.root (default: tmp/repo_satellites/)
    path: /home/git/gitlab-satellites/

  ## Backup settings
  backup:
    path: "tmp/backups"   # Relative paths are relative to Rails.root (default: tmp/backups/)
    # keep_time: 604800   # default: 0 (forever) (in seconds)

  ## GitLab Shell settings
  gitlab_shell:
    # REPOS_PATH MUST NOT BE A SYMLINK!!!
    repos_path: /home/git/repositories/
    hooks_path: /home/git/.gitolite/hooks/
    
    # Git over HTTP
    upload_pack: true
    receive_pack: true

    # If you use non-standart ssh port you need to specify it
    # ssh_port: 22

database.yml は RDS に繋がるように設定します。

database.yml

#
# PRODUCTION
#
production:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: gitlabhq_production
  pool: 5
  username: user
  password: password
  host: ********.********.ap-northeast-1.rds.amazonaws.com
  socket: /tmp/mysql.sock

次に bundle install を実行してライブラリをインストールします。そしてセットアップ用の Rake タスクを実行してデータベースなどの初期化を行います。

bundle install --deployment --without development test postgres
bundle exec rake gitlab:setup RAILS_ENV=production

テーブルなどのインサートが終わった最後に以下のように管理ユーザのアカウント情報が表示されるのでメモっておきます。

Administrator account created:

login.........admin@local.host
password......5iveL!fe

ここまでで GitLab サーバーのひと通りの構築は終わりです!正常に動作する環境かチェックしてくれる Rake タスクがあるので実行してみましょう。

bundle exec rake gitlab:check RAILS_ENV=production

ここで問題があった場合、詳細な原因が表示されると思うので設定を修正してください。 最後に自動起動を設定して…構築完了です!!

chkconfig gitlab on
/etc/init.d/gitlab start

使いかたは難しいところは特にありません。前回のエントリでプロジェクトの作成と clone と push までやってるのでご覧いただければと思います。詳しい使いかたはまた別のエントリで紹介したいと思います。

おまけ

せっかくの社内 Git サーバーなので、ロゴを変えたいとおもいます。w

# どこからか icon.png を持ってきておく (42px x 42px が良さそう)
cd app/assets/images/
chmod 777 icon.png
chown gitlab:gitlab icon.png
mv logo_white.png logo_white_.png
mv logo_dark.png logo_dark_.png
cp icon.png logo_white.png
cp icon.png logo_dark.png
rm icon.png
cd ~/gitlab/
bundle exec rake assets:precompile RAILS_ENV=production

assets:precompile は相当時間がかかりますが、気長にお待ちください。

gitlab_change_icon

まとめ

GitLab の構築は正直、少々手間がかかります。ですが、最近流行りの環境 (nginx + Unicorn + Rails) をひと通り構築できるので、大変勉強になりました。 「そろそろ社内 GitHub を作りたいな」「最近流行りのサーバー環境の構築を試してみたいな」と思われているかたにうってつけです。 このエントリを参考に、ぜひ構築してみてください!

参考