ubuntu14.04上にredmine2.5+nginx+unicorn環境をセットアップ


redmineをubuntuにインストールする事が良くあるので、常にこの内容を最新化するようにします。現状の投稿内容はクリーンインストールしたUbuntu14.04 LTS上にredmine + gitの環境をセットアップしています。

なお、動作確認としては、redmineとgitを連携させた後に、開発用ユーザーにrbenvを使って最新版のruby2.1.2をインストールした上で、インフラの構成管理(Infrastructure as Code)で有名なchefのコードをgitにコミットし、redmine上でプロジェクト管理できるようにしてみます。

初版作成:2014/6/28

  • ubuntu14.04
  • nginx
  • redmine2.5
  • git
  • unicorn

Ubuntuインストール後の初期設定。IPv6の無効化とSSHのUseDNSの無効化

sudo apt-get update
sudo apt-get upgrade
sudo apt-get ssh

echo "net.ipv6.conf.all.disable_ipv6 = 1" sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" sudo tee -a /etc/sysctl.conf
echo "UseDNS no" sudo tee -a /etc/ssh/sshd_config

sudo vi /etc/network/interfaces

IPは固定にしておく。/etc/network/interfacesは必要に応じて修正して下さい。

auto eth0
iface eth0 inet static
       address 172.20.1.240
       netmask 255.255.255.0
       network 172.20.1.0
       broadcast 172.20.1.255
       gateway 172.20.1.1
       dns-nameservers 172.20.1.230

上記までで一旦再起動

sudo reboot

インストール中に使う環境変数のセット。セットアップ途中で再起動やログアウトした場合にはその都度セットしてください。

export MYSQL_ROOT_PASS="mysql_root_pass"
export REDMINE_DBPASS="redmine_db_pass"
export REDMINE_INSTALL_TO='/var/www/redmine'

必要なパッケージをまとめて導入。

  • MySQLのROOTパスワードは上記でセットしていたMYSQL_ROOT_PASSを指定する事
  • postfixはインターネットサイトを選択
sudo apt-get install ruby2.0 ruby2.0-dev build-essential libssl-dev \
  zlib1g-dev  subversion git rails3 nginx unicorn \
  mysql-server mysql-client libmysqlclient-dev postfix \
  imagemagick libmagickcore-dev libmagickwand-dev ruby-rmagick

MySQLのロケールを変更してredmine用のDBを作る

sudo sed -i "s/\[client\]/[client]\ndefault-character-set=utf8/g" \
  /etc/mysql/my.cnf
sudo sed -i "s/\[mysqld\]/[mysqld]\ncharacter-set-server=utf8/g" \
  /etc/mysql/my.cnf
sudo service mysql restart

mysql -uroot -p$MYSQL_ROOT_PASS -e \
  "drop database if exists redmine;"
mysql -uroot -p$MYSQL_ROOT_PASS -e \
  "CREATE DATABASE redmine character set utf8;"
mysql -uroot -p$MYSQL_ROOT_PASS -e \
  "grant all privileges on redmine.* to 'redmine'@'localhost' identified by '$REDMINE_DBPASS';"
mysql -uroot -p$MYSQL_ROOT_PASS \
  -e "flush privileges;"

redmineをインストールする。途中で、下記のエラーが出たので、本投稿中で対策をしています。

# これはただの参考情報。こんなエラーが出たので対策しましたと言う事で。
rake aborted!
Gem::LoadError: You have already activated rake 10.3.2, but your Gemfile requires rake 10.1.1. Using bundle exec may solve this.
/var/www/redmine/config/boot.rb:6:in `<top (required)>'
/var/www/redmine/config/application.rb:1:in `<top (required)>'
/var/www/redmine/Rakefile:5:in `<top (required)>'
(See full trace by running task with --trace)

上記エラーに対策する形で、redmineのセットアップを行う。

sudo mkdir -m $REDMINE_INSTALL_TO

# 一時的にセットアップ中のユーザーでアクセスできるようにしてセットアップしている。
sudo chown `id -u -n` $REDMINE_INSTALL_TO
cd $REDMINE_INSTALL_TO
svn checkout http://svn.redmine.org/redmine/branches/2.5-stable ./

# rake 10.1.1のままだとエラーが出たので、10.3.2にした。
sed -i 's/gem "rake", "~> 10.1.1"/gem "rake", "~> 10.3.2"/g' Gemfile

# unicornをGemfileに追記
echo "gem 'unicorn'" >> Gemfile

# unicorn.conf.rbから、unicorn.rbへ変更
sed -i 's/unicorn.conf.rb/unicorn.rb/g' Gemfile

mv config/database.yml.example config/database.yml
vi config/database.yml

config/database.ymlは下記のような感じに。testやdevelopmentは全部コメントアウトしてしまっても問題ない。

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "redmine_db_pass"
  encoding: utf8

/var/www/redmine/config/unicorn.rbを作成して、下記のように編集。

worker_processes 2

working_directory("/var/www/redmine")

listen File.expand_path("tmp/unicorn.sock", ENV['RAILS_ROOT'])
pid File.expand_path("tmp/unicorn.pid", ENV['RAILS_ROOT'])

preload_app true

stdout_path "/var/www/redmine/log/unicorn.stdout.log"
stderr_path "/var/www/redmine/log/unicorn.stderr.log"

GC.respond_to?(:copy_on_write_friendly=) and GC.copy_on_write_friendly = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

/etc/default/unicornの設定

sudo cp /etc/default/unicorn /etc/default/unicorn.bak
sudo sed -i "s/^CONFIGURED=no/CONFIGURED=yes/g" /etc/default/unicorn

# APP_ROOTは環境変数ではなくべた書きなので注意。
# /var/www/redmine以外にインストールする場合には、修正してください。
sudo sed -i "s/^APP_ROOT.*/APP_ROOT=\/var\/www\/redmine/g" /etc/default/unicorn
sudo sed -i "s/\$CONFIG_RB/\$CONFIG_RB -E production/g" /etc/default/unicorn
diff /etc/default/unicorn /etc/default/unicorn.bak

sedがミスっていたら面倒なので、/etc/default/unicornの内容を貼り付けておく。

# Change paramentres below to appropriate values and set CONFIGURED to yes.
CONFIGURED=yes

# Default timeout until child process is killed during server upgrade,
# it has *no* relation to option "timeout" in server's config.rb.
TIMEOUT=60

# Path to your web application, sh'ld be also set in server's config.rb,
# option "working_directory". Rack's config.ru is located here.
APP_ROOT=/var/www/redmine

# Server's config.rb, it's not a rack's config.ru
CONFIG_RB="$APP_ROOT/config/unicorn.rb"

# Where to store PID, sh'ld be also set in server's config.rb, option "pid".
PID=/run/unicorn.pid

# Additional arguments passed to unicorn, see man (1) unicorn.
UNICORN_OPTS="-E production -c /var/www/redmine/config/unicorn.rb -D"

redmineの初期設定を行う

cd $REDMINE_INSTALL_TO
bundle install
rake generate_secret_token
RAILS_ENV=production rake db:migrate
 
# 基本データの投入。途中の質問はjaを選択。
RAILS_ENV=production rake redmine:load_default_data

nginxの初期設定を行う

sudo  vi /etc/nginx/sites-available/default

/etc/nginx/sites-available/defaultには、下記を追加。server_nameをredmineにしているので、クライアント側で、hostsファイルにredmineの名前とIPアドレスの対応を書いてアクセスすればOK。今回はローカル環境だったので、最低限動く環境としてセットアップしています。

upstream redmine {
  server unix:/var/www/redmine/tmp/unicorn.sock;
}

server {
  server_name redmine;
  root /var/www/redmine;
  location / {
    proxy_pass http://redmine;
  }
}

unicornとnginxの起動。unicornの起動に失敗する場合には、sudo unicorn等として、エラーメッセージを表示させ、問題の対策を行う。エラーメッセージからは推測しにくいが、パスがずれていたり、パーミッションが合っていない問題で起動できない事が多いので、起動失敗する場合にはその辺を見直す。

sudo service unicorn start
sudo service nginx start

redmineと連携する共有リポジトリを用意する。今回は外部公開ではないので、redmine上のディレクトリにリポジトリを置きましたが、パーミッションさえ適切であれば/var/git等、好きな場所に置けます。

sudo mkdir -p $REDMINE_INSTALL_TO/git-repo/chef.git
cd $REDMINE_INSTALL_TO/git-repo/chef.git
sudo git init --bare
sudo chown -R www-data:www-data $REDMINE_INSTALL_TO
sudo chmod 774 -R $REDMINE_INSTALL_TO

# 作業しているユーザーをwww-dataグループに加えて、
# gitリポジトリにコミットできるようにしておく
sudo gpasswd -a `id -u -n` www-data

chefのプロジェクトを作成する。

sudo mkdir -p $REDMINE_INSTALL_TO/git-repo/chef.git
cd $REDMINE_INSTALL_TO/git-repo/chef.git
sudo git init --bare
sudo chown -R www-data:www-data $REDMINE_INSTALL_TO
sudo chmod 774 -R $REDMINE_INSTALL_TO

# 作業しているユーザーをwww-dataグループに加えて、
# gitリポジトリにコミットできるようにしておく
sudo usermod `id -u -n` -G www-data

上記まででredmineの環境構築は終了です。ここから先は冒頭で明言したとおり、chefによるインフラ管理のプロジェクトを作成し、そのコードをredmine+gitで管理するようにします。ユーザーは、普段使いの一般ユーザーでOKです。

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
source ~/.bash_profile
 
# インストール可能なrubyのバージョンを調べて、最新版を入れる。
rbenv install -l
rbenv install 2.1.2
rbenv global 2.1.2
 
# バージョンやインストール先を確認しておく。
ruby -v
which ruby
which gem
 
gem install chef
gem install knife-solo

gitの基本設定。

git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git config --global push.default simple

chefプロジェクトの作成。好きな所でプロジェクトを作成してください。ここでは、ホームディレクトリ直下に作成しています。

cd ~
knife solo init chef-repo
cd chef-repo
git init
git add .
git commit -m 'first commit'
vi .git/config

.git/configを編集する。下記のような感じで。

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
[remote "origin"]
  url = file:///var/www/redmine/git-repo/chef.git/
  fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
  remote = origin
  merge = refs/heads/master

pushして、redmineと連携しているリモート(と言っても今回は同一サーバ内ですが)サーバにテストpushしてみる。

# 取りあえず、適当なファイルを作成してcommit、pushして動作確認する。
touch test.txt
git add test.txt
git commit -a -m 'commit test.txt'
git push

最後に、redmine上から、chefのリポジトリを指定して終わりです。hostsファイルで、redmineと、redmineをインストールしたサーバのIPを記載した上で、ウェブブラウザでhttp://redmineにアクセスしてredmineの設定を進めます。

redmine03

プロジェクト>新しいプロジェクトを選択。

redmine10

名称にchefと入れる。識別子は勝手にchefと指定されるはず。それで作成ボタンを押下。

redmine11

作成したchefプロジェクトの設定画面で、新しいリポジトリを選択して、上記のように指定。

リポジトリのパスはgit pushされる場所を指定する事。

redmine12

上記まで終わったら、chefプロジェクトのリポジトリをクリックしてみます。コミットされていますね。

 

タグ付けされた , , , . ブックマークする へのパーマリンク.

コメントを残す

メールアドレスが公開されることはありません。