daybreaksnow's diary

私を私と呼びたい

[Redmine]同一PCで二つRedmineを動かす

同一マシンでRedmineを二つ動かした。
しかし、単純にpassenger.confに二つ目のRedmineへのパスを通すだけだと、複数のRedmineに同時にログインできない。

以下の通り書き換える。
参考:http://qiita.com/yteraoka/items/72b111e69511f254f97e

redmine/config/application.rb
修正前:config.session_store :cookie_store, :key => '_redmine_session'
修正後:config.session_store :cookie_store, :key => '_redmine_session', :path => config.relative_url_root

redmine/config/configuration.yml
修正前:autologin_cookie_path:
修正後:autologin_cookie_path: Redmine::Utils.relative_url_root


それ以外の既存の手順

[Linux]さくらVPSのCentOSにRedmineをインストール - daybreaksnow's diaryのものと同じ。

・DBの用意
create database db_redmine_2 default character set utf8;
grant all on db_redmine_2.* to user_redmine_2 identified by 'パスワード';
flush privileges;

Redmineのインストール
tarballを解凍して、一つ目とはredmineとは別のディレクトリ名にして、/var/libに配置

・DB、メール設定を適当に設定する
/var/lib/redmine_2/config/database.yml
/var/lib/redmine_2/config/configuration.yml

・必要ライブラリのインストール
bundle install

秘密鍵作成
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

・権限付与
chown -R apache:apache /var/lib/redmine_2

・アクセス可能に
ln -s /var/lib/redmine_2/public /var/www/html/redmine_2

・/etc/httpd/conf.d/passenger.confに以下を追記
RackBaseURI /redmine_2

[Redmine]タグ付けを可能にするプラグインを入れる

Redmineのバージョン:2.4.3 (2014-02-08)
Ruby:2.0.0
Rails:3.2.16

プラグインURL:friflaj/redmine_tagging · GitHub

プラグインのインストール

HPの手順だと以下の通りだが、これは古い。(rails3だと、redmine/script/pluginは存在しない)

script/plugin install git://github.com/friflaj/redmine_tagging.git
bundle install

代わりに、redmineのインストールディレクトリで、以下を実行する。

./script/rails plugin install git://github.com/friflaj/redmine_tagging.git

ここで、以下のようなDB接続エラーが出た。

/usr/local/lib/ruby/gems/2.0.0/gems/mysql2-0.3.15/lib/mysql2/client.rb:67:in `connect': Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)


どうやら、database.ymlのdevelopmentモードの設定を使っているので、MySQLに接続できないようだ。
開発モード用にDBをコピーし、database.ymlをdevelopment時はそちらに接続するように書き換える。

create database db_redmine_dev default character set utf8;
grant all on db_redmine_dev.* to user_redmine;
flush privileges;

mysqldump -u root -p db_redmine | mysql -u root -p db_redmine_dev

再度rails pluginを実行、正常終了。

Initialized empty Git repository in /var/lib/redmine-comp/vendor/plugins/redmine_tagging/.git/
remote: Counting objects: 74, done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 74 (delta 4), reused 53 (delta 3)
Unpacking objects: 100% (74/74), done.
From git://github.com/friflaj/redmine_tagging
 * branch            HEAD       -> FETCH_HEAD

上記をよく見ると、プラグインredmine/pluginsではなく、redmine/vendor/pluginsに展開されてしまっている。
これではプラグインとして認識されないので、redmine/pluginsに移動する

その後、redmineのインストールディレクトリで、bundle installを実行。
ここでもエラーが出た。

Updating git://github.com/Undev/rails_sql_views.git
Fetching gem metadata from https://rubygems.org/.......
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "rake":
  In snapshot (Gemfile.lock):
    rake (10.2.2)

  In Gemfile:
    rails_sql_views (>= 0) ruby depends on
      rake (~> 0.9.2) ruby

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.

よく分からんがbundle updateしろと言われているので、その通りにする。


タグ利用のmigrationファイルの生成

HPの手順

rails generate acts_as_taggable_on:migration

正常終了した。

      create  db/migrate/20140408024608_acts_as_taggable_on_migration.rb
DBのマイグレーション

HPの手順。

rake db:migrate RAILS_ENV=production
rake db:migrate_plugins RAILS_ENV=production

rakeだと共通ライブラリを使ってしまうので、bundle exec rakeを使う。

一行目。

# bundle exec rake db:migrate RAILS_ENV=production
==  ActsAsTaggableOnMigration: migrating ======================================
-- create_table(:tags)
   -> 0.0106s
-- create_table(:taggings)
   -> 0.0038s
-- add_index(:taggings, :tag_id)
   -> 0.0098s
-- add_index(:taggings, [:taggable_id, :taggable_type, :context])
   -> 0.0212s
==  ActsAsTaggableOnMigration: migrated (0.0458s) =============================

二行目。

Migrating redmine_tagging (Redmine Tagging plugin)...
==  CreateViews: migrating ====================================================
-- create_view(:issue_tags, "select taggings.id, tags.name as tag, taggings.taggable_id as issue_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'Issue'")
   -> 0.0149s
-- create_view(:wiki_page_tags, "select taggings.id, tags.name as tag, taggings.taggable_id as wiki_page_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'WikiPage'")
   -> 0.0035s
==  CreateViews: migrated (0.0187s) ===========================================

==  ScrubBody: migrating ======================================================
==  ScrubBody: migrated (0.0049s) =============================================

==  RecreateViews: migrating ==================================================
-- drop_view(:issue_tags)
   -> 0.0010s
-- drop_view(:wiki_page_tags)
   -> 0.0004s
-- create_view(:issue_tags, "select taggings.id as id, tags.name as tag, taggings.taggable_id as issue_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'Issue'")
   -> 0.0021s
-- create_view(:wiki_page_tags, "select taggings.id as id, tags.name as tag, taggings.taggable_id as wiki_page_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'WikiPage'")
   -> 0.0016s
==  RecreateViews: migrated (0.0054s) =========================================

==  FixTaggingContexts: migrating =============================================
==  FixTaggingContexts: migrated (0.0053s) ====================================

==  FixBrokenIssueAndWikiContexts: migrating ==================================
==  FixBrokenIssueAndWikiContexts: migrated (0.0022s) =========================

==  FixTagsWithBackslash: migrating ===========================================
==  FixTagsWithBackslash: migrated (0.0016s) ==================================


Note: The rake task db:migrate_plugins has been deprecated, please use the replacement version redmine:plugins:migrate
redmineの起動

手順が終わったので、httpdを再起動し、redmineにアクセス。
ここで、エラーが出てページが表示できなかった。

It looks like Bundler could not find a gem. Maybe you didn't install all the gems that this application needs. To install your gems, please run:

bundle install
If that didn't work, then the problem is probably caused by your application being run under a different environment than it's supposed to. Please check the following:

Is this app supposed to be run as the apache user?
Is this app being run on the correct Ruby interpreter? Below you will see which Ruby interpreter Phusion Passenger attempted to use.
-------- The exception is as follows: -------

git://github.com/Undev/rails_sql_views.git (at master) is not yet checked out. Run `bundle install` first. (Bundler::GitError)
  /usr/local/lib/ruby/gems/2.0.0/gems/bundler-1.5.3/lib/bundler/source/git.rb:179:in `rescue in load_spec_files'

エラーメッセージでググったところ、bundle installをrootでやっていると、redmineを起動しているユーザ(apache)で使えないようだ。
参考:http://stackoverflow.com/questions/6648870/is-not-checked-out-bundle-install-does-not-fix-help

以下のように、deploymentを付けて、再度bundle installを実行する。

bundle install --deployment

httpdを再起動して、アクセスすると、正常に表示され、タグの追加も可能となった。

[Redmine]チケットの変更履歴を非表示にするプラグインのインストール

※2016/12/10 追記
Redmine3.2.4に下記プラグインを入れたところ、Redmineの言語が英語になってしまった


Redmineのバージョン:2.4.3 (2014-02-08)
Ruby:2.0.0
Rails:3.2.16

1.以下のサイトからDownloadZipでzipを落とす
 プラグインURL:GitHub - vividtone/redmine_comment_only: This is a plugin for redmine. Only comments are displayed at issue's history.
2.転送、解凍
3.redmineのインストールディレクトリのplugin以下に置く。
 /var/lib/radmine/plugin/redmine_comment_only/appのような階層になる。
 プラグインディレクトリ名は、init.rb内のPlugin.registerの名前に合わせる。
4.apacheの再起動をして反映。




・履歴非表示時
f:id:daybreaksnow:20140326175204p:plain

・履歴表示時
f:id:daybreaksnow:20140326175212p:plain

[Linux]RedmineのDBのバックアップを取る

参考:
データのバックアップ方法 — Redmine.JP

添付ファイル以外のデータはすべてDBに入っている。
添付ファイルはRedmineインストールディレクトリのfiles以下にある。
(今回は/var/lib/redmine/files)

添付ファイルバックアップスクリプト(attach_file_backup.sh)

#!/bin/sh
SRC=/var/lib/redmine
BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
BACKUP_FILE=files

cp -ar ${SRC}/${BACKUP_FILE} ${BACKUP_DIR}
tar cvzf ${BACKUP_DIR}/${BACKUP_FILE}.tar.gz -C $BACKUP_DIR $BACKUP_FILE
rm -r ${BACKUP_DIR}/${BACKUP_FILE}

DBバックアップスクリプト(db_backup.sh)

#!/bin/sh
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
DUMP_FILE=db_redmine.dump
DB_USER_NAME=hoge
DB_PASSWORD=piyo

mysqldump -u ${DB_USER_NAME} -p{DB_PASSWORD} db_redmine > ${DAILY_BACKUP_DIR}/${DUMP_FILE}

日次バックアップスクリプト(daily_backup.sh)

#!/bin/sh
#このシェルのパスを取得
DIR=$(cd $(dirname $0); pwd)
#echo $DIR

#DBのバックアップ取得
${DIR}/db_backup.sh
#添付ファイルのバックアップ取得
${DIR}/attach_file_backup.sh

月次バックアップスクリプト(monthly_backup.sh)

#!/bin/sh
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
MONTHLY_BACKUP_DIR_BASE=/home/hoge/backup/redmine/monthly_backup
MONTHLY_BACKUP_DIR=${MONTHLY_BACKUP_DIR_BASE}`date +\%y\%m\%d`

#echo  ${MONTHLY_BACKUP_DIR}
mkdir ${MONTHLY_BACKUP_DIR}
cp -ar ${DAILY_BACKUP_DIR} ${MONTHLY_BACKUP_DIR}

cronの設定

MAILTO=''
#redmineのバックアップ(毎日午前3時)
0 3 * * * /home/hoge/backup/redmine/sh/daily_backup.sh
#redmineのバックアップのコピー(毎月1日午前5時)
0 5 1 * * /home/hoge/backup/redmine/sh/monthly_backup.sh

DBのリストア

db_redmine_restoreに復元する例

SQL(create_db_restore.sql)

drop database db_redmine_restore;
create database db_redmine_restore default character set utf8;
grant all on db_redmine_restore.* to user_redmine;

・シェル

#!/bin/sh
#このシェルのパスを取得
DIR=$(cd $(dirname $0); pwd)
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
DUMP_FILE=db_redmine.dump
DB_ROOT_USER=root
DB_ROOT_PASSWORD=fuga
DB_USER=user_redmine
DB_PASSWORD=piyo
RESTORE_DB=db_redmine_restore

mysql -u ${DB_ROOT_USER} -p${DB_ROOT_PASSWORD} < ${DIR}/create_db_restore.sql
mysql -u  ${DB_USER} -p${DB_PASSWORD} ${RESTORE_DB} < ${DAILY_BACKUP_DIR}/${DUMP_FILE}

リストア

添付ファイルの復旧後は、filesのオーナーをapacheに戻す。

sudo chown -R apache:apahce files

操作ユーザになっていると、ファイルアップロード時にpermission deniedが発生し、Internal Server Errorが表示される。

[Linux]tarで圧縮元に絶対パスを指定する時、指定のディレクトリのみを圧縮する

以下のようにtarの第二引数に絶対パスを指定すると、以下のメッセージが表示される。

tar cvzf /home/hoge/files.tar.gz /home/hoge/files

tar: メンバ名から先頭の `/' を取り除きます

上記のfile.tar.gzを展開すると、home/hoge/filesというディレクトリ構造まで復元されてしまう。

files以下のみが展開されるようにするには、以下のように-Cを使う。

tar cvzf /home/hoge/files.tar.gz -C /home/hoge files
  • Cオプションをつけることにより、そのパスからの相対指定ができる。これにより、filesディレクトリのみを圧縮できる。

[Linux]さくらVPSのCentOSにRedmineをインストール

前回の続き
[Linux]さくらVPSのCentOSにApacheをインストール - daybreaksnow's diary


Redmineの公式サイトを参考にした。

Redmine 2.4をCentOS 6.4にインストールする手順 | Redmine.JP Blog

SELinuxを無効にする

セキュリティ管理用のモジュールらしい。
http://itpro.nikkeibp.co.jp/article/COLUMN/20070827/280414/

無効にしないでもインストールできるらしい(http://h2np.net/docs/redmine-selinux.html)が、さくらのデフォルトでdisabledになっていたので修正なし

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

EPEL:エンタープライズ Linux 用の拡張パッケージ

以下から最新のパッケージのパスを確認
http://dl.fedoraproject.org/pub/epel/6/x86_64/repoview/epel-release.html

最新のパッケージのパス
http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

インストール

#rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

さくらのデフォルトではインストール済みだった。

開発ツール(Cコンパイラ等)のインストール
yum groupinstall "Development Tools"

以下のメッセージが出た。メッセージを見る限り引数が不正なようだが、このまま進んでも問題なかった。

Warning: Group development does not have any packages.
No packages in any requested group available to install or update

※2014/8/29追記
日本語化している(/etc/sysconfig/i18nでLANG=ja_JP.UTF-8としている)場合、「開発ツール」としなければならない。

RubyとPassengerのビルドに必要なヘッダファイルなどをインストール
yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel

Is this ok?と聞かれるので、y。
再度にComplete!と出て完了。

MySQLとヘッダファイルのインストール
yum install mysql-server mysql-devel
Apacheとヘッダファイルのインストール
yum install httpd httpd-devel
ImageMagickとヘッダファイル・日本語フォントのインストール

これは任意だが、ImageMagickは添付ファイルのサムネイル表示に使うということなので、入れておく。

yum install ImageMagick ImageMagick-devel
yum install ipa-pgothic-fonts

ipa-pgothic-fontsはデフォルトで入っているようだ。

Package ipa-pgothic-fonts-003.02-4.1.el6.noarch already installed and latest version
Nothing to do

Rubyのインストール

最新のtarballを落とす
http://www.ruby-lang.org/ja/downloads/

前世代の安定版: Ruby 2.0.0-p353 を落とした。
http://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p353.tar.gz

ビルド、インストール
tar zxvf ruby-2.0.0-p353.tar.gz 
cd ruby-2.0.0-p353
./configure --disable-install-doc
make
sudo make install
バージョン確認
$ruby -v
ruby 2.0.0p353 (2013-11-22 revision 43784) [x86_64-linux]
bundlerのインストール

bundlerとは:RubyGemの依存関係管理ツール
RubyGemとは:Rubyのライブラリ

#gem install bundler --no-rdoc --no-ri
Fetching: bundler-1.5.2.gem (100%)
Successfully installed bundler-1.5.2
1 gem installed

MySQLの設定

デフォルトキャラクタセットをutf8に設定
  • 編集対象
/etc/my.cnf
  • 修正内容
[mysqld]
default-character-set=utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

MySQLを起動、自動起動ON

service mysqld start
chkconfig mysqld on

ここでmsqldの起動でエラーとなった。

ログを見てみる

  • コマンド
less /var/log/mysqld.log
  • 中身
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

上記エラーメッセージでググってみると、mysql_install_dbコマンドを実行すればよいらしい。
root権限で実行、再度mysqldをstartすると、今度は起動に成功した。

rootにパスワード設定

このままだとmysql -u rootでパスワードなしでログインできてしまう。
rootにパスワードを設定する。

sudo mysqladmin -u root password [パスワード]

エンコード確認

mysqlにログイン後、以下のコマンドを実行

show variables like 'character_set%';

以下のように全てUTF-8になっていればOK。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

不要なユーザを除去

  • ユーザ確認SQL
use mysql;
select user from user;
  • 実行結果

以下のように名前なしユーザが二人いた。

mysql> select user from user;
+------+
| user |
+------+
| root |
|      |
| root |
|      |
| root |
+------+
5 rows in set (0.00 sec)

匿名のユーザを削除する。

delete from user where user = '';

Redmine用データベースとユーザーの作成

create database db_redmine default character set utf8;
grant all on db_redmine.* to user_redmine identified by 'パスワード';
flush privileges;

Redmineのインストール

以下からRedmineのtarballをダウンロード
http://www.redmine.org/projects/redmine/wiki/Download

解凍したらRedmineの配置先に移動する。

mv redmine-2.4.3 /var/lib/redmine

データベースへの接続設定

/var/lib/redmine/config/database.ymlを作成。
database.yml.sampleをコピーして、以下を修正した。

production:
  database: db_redmine
  username: user_redmine
  password: パスワード (Redmine用データベースとユーザーの作成で設定したもの)

configuration.ymlの設定

/var/lib/redmine/config/configuration.ymlを作成。
configuration.yml.sampleをコピーして、以下を修正した。

production:
    smtp_settings:
      address: "localhost"
      domain: 'サーバのIPアドレス'

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf

ここで:の後の半角スペースがないと、後でrake db:migrateの実行時にエラーとなるので注意。

サーバのIPアドレスと書いたところは、サーバのFQDNとなっているが、ドメインを取っていないのでIPアドレスにした。これでいいかは不明。
SMTPの設定なので、メール通知を使わないなら適当でもOK?

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

redmineが必要とするライブラリを入れる。
redmineのインストールディレクトリ(/var/lib/redmine)で以下を実行

# bundle install --without development test

実行後、以下のメッセージが出た
rubyのバージョンは2.0.0のため、nothing to doに当てはまり、追加のインストールは必要ない。

Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!

Redmineの初期設定とデータベースのテーブル作成

セッションデータ改竄防止用鍵の生成とテーブル作成

Redmineのインストールディレクトリで以下のコマンドを実行

bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

RAILS_ENV=productionは単に環境変数にproductionを入れるだけ。
rubyではこの環境変数でdevelopment、test、productionなどのモードを切り替えるとのこと。

rakeはrubyのビルドツール。Ant的なものか?

db:migrateはその名前の通りDBのマイグレーションを行う。あらかじめ定義したDDLを実行する感じか?

bundle execと、直接rakeを呼ぶのでは、以下のような違いがある。

rake:Railsの共通のライブラリ保存場所から読みだす
bundle exec:プロジェクトのライブラリ保存場所から読み出す

参考:http://ka-zoo.net/2013/07/difference-of-rake-xxx-and-bundle-exec-rake-xxx/

Passengerのインストール

Passengerとは:apacherubyアプリを動かすためのapacheモジュール

gem install passenger --no-rdoc --no-ri
passenger-install-apache2-module

rdocとはJavaDoc的なものか。


文字化けが出たがそのままエンターで進んだ。

  • 出力結果
   LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.37
     PassengerDefaultRuby /usr/local/bin/ruby
   </IfModule>

Passengerの設定

  • 作成ファイル
/etc/httpd/conf.d/passenger.conf
  • 記述内容
# Passengerの基本設定。
# passenger-install-apache2-module --snippet を実行して表示される設定を使用。
#
 LoadModule passenger_module /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so
   <IfModule mod_passenger.c>
     PassengerRoot /usr/local/lib/ruby/gems/2.0.0/gems/passenger-4.0.37
     PassengerDefaultRuby /usr/local/bin/ruby
   </IfModule>

# Passengerが追加するHTTPヘッダを削除するための設定(任意)。
#
Header always unset "X-Powered-By"
Header always unset "X-Rack-Cache"
Header always unset "X-Content-Digest"
Header always unset "X-Runtime"

# Passengerのチューニング。
# TODO Phusion Passenger users guide(http://www.modrails.com/documentation/Users%20guide%20Apache.html)を参照。
PassengerMaxPoolSize 20
PassengerMaxInstancesPerApp 4
PassengerPoolIdleTime 3600
PassengerHighPerformance on
PassengerStatThrottleRate 10
PassengerSpawnMethod smart
RailsAppSpawnerIdleTime 86400
RailsFrameworkSpawnerIdleTime 0

apacheredmineを触れるようにする

chown -R apache:apache /var/lib/redmine

apacheは上記の通りapacheというユーザで操作するらしい。

Redmineを公開する(サブディレクトリでRedmineを実行)

redmineのインストールディレクトリへのシンボリックリンクを作成

ln -s /var/lib/redmine/public /var/www/html/redmine

/etc/httpd/conf.d/passenger.confに以下を追記。

RackBaseURI /redmine

apacheを再起動。

service httpd graceful

restartはhttpd プロセスを完全に停止してから再起動する。
gracefulは httpd プロセスの通信が終わるのを待って、順次新しい設定を反映した httpd を起動させる。

[PostgreSQL]パスワード入力無しでバッチファイルからコマンドを実行する

参考:
http://www.postgresql.jp/document/9.3/html/libpq-pgpass.html

Windowsの場合
  • 編集対象
%APPDATA%\postgresql\pgpass.conf
  • 編集内容

形式

[ホスト名]:[ポート番号]:[DB名]:[ユーザ名]:[パスワード]

ワイルドカードとして*も使える。

記述例

localhost:5432:*:hogeUser:hogePassword

DB名を決め打ちだと、以下のようなコマンドでパスワードが必要になってしまう。

dropdb -U postgres hoge

DB名の指定を*にしておけば、上記のようにpsqlでないコマンドでもパスワード無しで実行できる。