こんにちは。小宮です。先輩から要望されていそうな気がしたのでgitlab導入時のメモです。。
やたらめったら長いし手順が複雑でこのとおりやって再現できるかはお使いの環境に依存する可能性があり保障できかねます。 この手順で再現した環境はOSはCentOS6.5でした。 postgresを許容できるのであれば自動的に入れられるオムニバス版があるのでそちらをお使いいただくのがよろしいかと。 個人的にpostgresの運用の知見が心もとなかったのと、RDSに逃げられなくなるのがアレだったのでmysqlで頑張りました。
自分で自動化する時は、passengerとgitlab:setup時の対話処理をなんとか自動化するオプションを付けるとこがキモかと思いました。 この手順自体は部分的にchefがでてきますがほぼ手動です。自動化オプションは最後のほうにちょろっと書いときます。
1.このへんからmysqlをなんとかして入れとく
$ wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-5.6.17-1.linux_glibc2.5.x86_64.rpm-bundle.tar -P site-cookbooks/mysqld/files/default/usr/local/src/
2.rbenv等でrubyをなんとかして入れておく
(chefでなにもせずにやるとchefgemに寄るので注意がひつよう) rubyのバージョンが低いとGemfileのシンタックスチェックでエラー出てmysql2とかが入らないことも。
3.Gitのインストール
# yum -y install libcurl-devel libxslt-devel libxml2-devel expat-devel gettext openssl-devel zlib-devel
Installed:
libcurl-devel.x86_64 0:7.19.7-37.el6_4 libxml2-devel.x86_64 0:2.7.6-14.el6
libxslt-devel.x86_64 0:1.1.26-2.el6_3.1
Dependency Installed:
libgcrypt-devel.x86_64 0:1.4.5-11.el6_4 libgpg-error-devel.x86_64 0:1.7-4.el6
# su - chef;cd infra-chef-repo/
$ knife cookbook create git -o site-cookbooks
$ knife cookbook create redis -o site-cookbooks
$ vi site-cookbooks/git/recipes/default.rb
#
# Cookbook Name:: git
# Recipe:: default
#
# Copyright 2014, YOUR_COMPANY_NAME
#
# All rights reserved - Do Not Redistribute
#
%W{libcurl-devel
libxslt-devel
libxml2-devel
expat-devel
gettext
openssl-devel
zlib-devel
libgcrypt-devel
libgpg-error-devel}.each do |pkg|
package pkg do
not_if "rpm -qa|grep #{pkg}"
action :install
end
end
bash "bash-install-git" do
not_if "ls -d /usr/local/src/git-1.9.0"
code <<-EOC
wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz -P /usr/local/src
cd /usr/local/src/
tar zxf git-1.9.0.tar.gz
cd /usr/local/src/git-1.9.0
./configure --prefix=/usr/local/git
make all
make install
ln -sf /usr/local/git/bin/git* /usr/local/bin/
EOC
end
$ knife solo cook localhost -o git
# wget https://git-core.googlecode.com/files/git-1.9.0.tar.gz -P /usr/local/src
# cd /usr/local/src/
# tar zxf git-1.9.0.tar.gz
# cd /usr/local/src/git-1.9.0
# ./configure --prefix=/usr/local/git
# make all
# make install
# ln -s /usr/local/git/bin/git* /usr/local/bin/
# which git
/usr/local/bin/git
# git --version
git version 1.9.0
4.redisのインストール
# yum install -y --enablerepo=remi redis
Installed:
redis.x86_64 0:2.8.9-1.el6.remi
Dependency Installed:
gperftools-libs.x86_64 0:2.0-11.el6.3 libunwind.x86_64 0:1.1-2.el6
# /etc/init.d/redis start
# chkconfig redis on
# redis-cli ping
PONG
$ vi site-cookbooks/redis/recipes/default.rb
bash "yum-install-redis-from-remi" do
not_if "which redis-cli"
code <<-EOC
yum install -y --enablerepo=remi redis
EOC
end
service "redis" do
supports :status => true, :restart => true
action [ :enable, :start ]
end
$ knife cookbook test redis
$ knife solo cook localhost -o redis
5.ユーザ作成
# useradd -c 'GitLab' git
# chmod 755 /home/git
# su - git -s /bin/bash
$ mkdir .ssh
$ touch .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys
$ chmod 700 .ssh
$ git config --global user.name "GitLab"
$ git config --global user.email "gitlab@localhost"
##### 6.gitlab-shellのインストール
$ git clone https://github.com/gitlabhq/gitlab-shell.git -b v1.9.4
$ cp -a /home/git/gitlab-shell/config.yml{.example,}
$ /home/git/gitlab-shell/bin/install
install失敗する場合は、gitユーザの.bashrcか/etc/profile.d/の下あたりに環境変数を追加し読み込みしてから再実行
export PATH=/path-to-ruby:$PATH
8.gitlabインストール
$ git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 6-8-stable gitlab
$ cp -a /home/git/gitlab/config/gitlab.yml{.example,}
不要っぽい
--------------------------
$ chmod -R u+rwX /home/git/gitlab/log/
$ chmod -R u+rwX /home/git/gitlab/tmp/
$ mkdir /home/git/gitlab/tmp/pids/
$ mkdir /home/git/gitlab/tmp/sockets/
$ chmod -R u+rwX /home/git/gitlab/tmp/pids/
$ chmod -R u+rwX /home/git/gitlab/tmp/sockets/
$ mkdir /home/git/gitlab/public/uploads
$ chmod -R u+rwX /home/git/gitlab/public/uploads
--------------------------
$ mkdir /home/git/gitlab-satellites
$ ll -d /home/git/gitlab-satellites
drwxrwxr-x 2 git git 4096 5月 19 12:20 2014 /home/git/gitlab-satellites
$
$ ll -d /home/git/gitlab-satellites
drwxr-x--- 2 git git 4096 5月 19 12:20 2014 /home/git/gitlab-satellites
$ cp -a /home/git/gitlab/config/unicorn.rb{.example,}
$ cp -a /home/git/gitlab/config/initializers/rack_attack.rb{.example,}
$ cd /home/git/gitlab
$ git config --global user.name "GitLab"
$ git config --global user.email "gitlab@localhost"
$ git config --global core.autocrlf input
9.DB設定
$ cp -a /home/git/gitlab/config/database.yml{.mysql,}
$ vi /home/git/gitlab/config/database.yml
$ diff /home/git/gitlab/config/database.yml{.mysql,}
10,12c10,12
< username: git
< password: "secure password"
< # host: localhost
---
> username: gitxxxxx
> password: "xxxxxxxx"
> host: localhost
$ ls -al /home/git/gitlab/config/database.yml
-rw-rw-r-- 1 git git 777 5月 19 12:32 2014 /home/git/gitlab/config/database.yml
$ chmod o-rwx /home/git/gitlab/config/database.yml
$ ls -al /home/git/gitlab/config/database.yml
-rw-rw---- 1 git git 777 5月 19 12:32 2014 /home/git/gitlab/config/database.yml
$ vi /home/git/gitlab/config/gitlab.yml
$ diff /home/git/gitlab/config/gitlab.yml{,.example}
227c227
< bin_path: /usr/local/bin/git
---
> bin_path: /usr/bin/git
ローカル等てきとうなところ(database.ymlに指定したところ)にDBをなんとかしていれる
# rpm -ivh /usr/local/src/MySQL-shared-5.6.17-1.linux_glibc2.5.x86_64.rpm
MySQL-develとshared-compatもひつようかもしれない rubyのバージョンが1.8とか1.9とかだとGemfileのシンタックスがどうとかで入らなくて直にmysql2をいれてたけどたぶんbundleで普通にはいるはず # gem install mysql2 -v '0.3.11'
10.Gemパッケージインストール
$ exit
# yum -y install libicu-devel.x86_64
Installed:
libicu-devel.x86_64 0:4.2.1-9.1.el6_2
Dependency Installed:
libicu.x86_64 0:4.2.1-9.1.el6_2
※引っかかる場合は、MySQL-develが足りない
# su - git -s /bin/bash
$ cd /home/git/gitlab
$ bundle install --deployment --without development test postgres aws
11.データベース初期化&セットアップ
ここはdbのテーブルが新規に作成される処理なので、間違って既存のデータ消さないように対話になってたりします。
$ bundle exec rake gitlab:setup RAILS_ENV=production
This will create the necessary database tables and seed the database.
You will lose any previous data stored in the database.
Do you want to continue (yes/no)? yes
Administrator account created:
login.........admin@local.host
password......xxxxxxxxx
$ bundle exec rake assets:precompile RAILS_ENV=production
$ exit
12.起動スクリプト、ログローテ設定コピー
# cp -a /home/git/gitlab/lib/support/init.d/gitlab /etc/rc.d/init.d/
# cp -a /home/git/gitlab/lib/support/logrotate/gitlab /etc/logrotate.d/
# chkconfig gitlab on
# chkconfig --list gitlab
gitlab 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# /etc/init.d/gitlab start
13.Passengerのインストール&Proxy設定
# yum -y install httpd-devel
Installed:
httpd-devel.x86_64 0:2.2.15-30.el6.centos
Dependency Installed:
apr-devel.x86_64 0:1.3.9-5.el6_2 apr-util-devel.x86_64 0:1.3.9-3.el6_0.1
apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 httpd.x86_64 0:2.2.15-30.el6.centos
httpd-tools.x86_64 0:2.2.15-30.el6.centos
Complete!
Specが低いとcompileに失敗するので、Swapを1GB作成
# dd if=/dev/zero of=/swap bs=1M count=1024
# mkswap /swap
# swapon /swap
# gem install passenger --no-rdoc --no-ri
# passenger-install-apache2-module
Config作成(rubyのバージョンごとに違うので要注意)
# cat <<EOF >/etc/httpd/conf.d/passenger.conf
> LoadModule passenger_module /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/passenger-4.0.42/buildout/apache2/mod_passenger.so
> <IfModule mod_passenger.c>
> PassengerRoot /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/passenger-4.0.42
> PassengerDefaultRuby /opt/chef/embedded/bin/ruby
> </IfModule>
> EOF
Vhostは必要ないので、defaultに書込み
# cat <<EOF >>/etc/httpd/conf/httpd.conf
> ProxyPass / http://localhost:8080/
> ProxyPassReverse / http://localhost:8080/
> EOF
# /etc/init.d/httpd start
# chkconfig httpd on
# su - git -s /bin/bash
$ cd /home/git/gitlab
$ bundle exec rake gitlab:env:info RAILS_ENV=production
RAILS_ENV=production
System information
System:
Current User: git
Using RVM: no
~略~
Redis version >= 2.0.0? ... yes
Your git bin path is "/usr/local/bin/git"
Git version >= 1.7.10 ? ... yes (1.9.0)
Checking GitLab ... Finished
ブラウザからログインしてパスワードを変更 http://123.123.123.123/users/sign_in admin@local.host xxxxxxxx
プロジェクトを作成などなど http://123.123.123.123/root/test
自動化オプションについて 正直、自動化したい処理にchefとかdockerとか適当(ほどよくという意味)につけてググれば だいたいやってる人がいてわかるとは思いますが念の為書いておきます。
・passenger
bash "passenger-install-apache2-module" do
not_if "find /opt/chef/embedded/lib -print|grep mod_passenger.so"
code <<-EOC
passenger-install-apache2-module install --auto
EOC
end
・gitlab
bash "db_initialize,precompile" do
user "git"
not_if "mysql -u #{dbuser} -p#{rootpass} -h #{dbhost} -e 'use gitlabhq_production;show tables;'|grep users_projects"
code <<-EOC
cd /home/git/gitlab
export PATH=/opt/chef/embedded/bin:$PATH
/opt/chef/embedded/bin/bundle install --deployment --without development test postgres aws
/opt/chef/embedded/bin/bundle exec rake gitlab:setup force=yes RAILS_ENV=production
/opt/chef/embedded/bin/bundle exec rake assets:precompile RAILS_ENV=production
EOC
end
自動化するにあたり他にも色々地雷があったわけですが、、 mysql2を入れるにあたり、公式のmysqlだとmysql_libは消してsharedとshared-compatとdevelいれないといけない等々。 あとはssl化したりdbを外出ししたり色々やったような記憶はありますが長くなるので省略します。 あとchefgemに寄ってるレシピは適宜変えたほうがよさそうです。
14.バックアップとリストアについて
mysqlの場合はDBサーバに以下のようなgrantをしないとダメです(user@host等固有の値は適宜ご指定ください)
mysql> GRANT LOCK TABLES ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> show grants for 'gitlab'@'localhost' ;
バックアップはユーザはgitで場所は$HOME/gitlabでやらないとだめみたいな感じです。(cron登録しとくのが良いかと思います)
#!/bin/bash
export PATH=/opt/chef/embedded/bin:$PATH
export LD_LIBRARY_PATH=/opt/chef/embedded/lib:$LD_LIBRARY_PATH
cd /home/git/gitlab
bundle exec rake gitlab:backup:create RAILS_ENV=production
w
echo "rake backup end."
リストアする場合、 gitlab.ymlでbackupディレクトリとして指定してる(ext:$HOME/gitlab/tmp/backups)場所にtarアーカイブを設置
bundle exec rake RAILS_ENV=production gitlab:backup:restore BACKUP=tmp/backups/1425914208 --trace
こんなかんじでtarアーカイブの先頭に自動でついてる数値文字列をbackupのpathの後ろに指定。
とりあえずこんなところで失礼します。長々みていただいた方はありがとうございました。