社内 GitHub を実用的に構築! Amazon VPC 環境に GitLab サーバを構築してみた
はじめに
先日 GitLab を Mac OS X にインストールするという記事を執筆しました。その用途はあくまで「個人で GitLab を使ってみよう!」というものでしが、やはり本命はクラウド上に構築し、どこからでもアクセスできるようにすることだと思います。しかしながら実際の運用で大切になってくるのはセキュリティです。クラウド上に構築しつつ、ソースはしっかり守る。この点が特に必要ではないでしょうか。というわけで今回は Amazon VPC 上に GitLab サーバを構築してみたので、その手順をまとめておきたいと思います!
このエントリの効能
このエントリを読んで、試すと、以下のような効能があります。多分。
- 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 のみに設定しましょう。
Amazon Linux に GitLab をインストールする
公式インストールガイドから Amazon Linux 用に修正しました。ここを読んでわからないところは本家も確認しながら進めてください。
- パッケージのインストール
- ユーザ・グループの作成
- Gitolite のインストール
- Ruby のインストール
- Redis のインストール
- nginx のインストール
- データベースの作成
- 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 の構築は正直、少々手間がかかります。ですが、最近流行りの環境 (nginx + Unicorn + Rails) をひと通り構築できるので、大変勉強になりました。 「そろそろ社内 GitHub を作りたいな」「最近流行りのサーバー環境の構築を試してみたいな」と思われているかたにうってつけです。 このエントリを参考に、ぜひ構築してみてください!