Passenger+ApacheのRedmineで、ファイルサイズが大きくなると添付できない対策

状況

  • Redmineの設定パネルから添付ファイルのアップロード上限サイズを設定しても、反映されない。
  • スクリーンショットなど5MB未満のファイルはアップロードできる。
    (そのためアップロード処理/パーミッションには問題がない)

原因

Apacheにmod_security入れてて、デフォルトのリクエスト上限が5MB程度だった。

例)/etc/httpd/conf.d/mod_security.conf

<IfModule mod_security2.c>

..略..
#SecRequestBodyLimit 5242880 #5MBを

SecRequestBodyLimit 52428800 #50MBに

..略..

</IfModule>

バーチャルホスト設定内で上書き定義できるので、
Redmineをサブドメイン運用しておけばよかったと反省するなど。

[さくらvps]yum updateしてからRedmineのメール配信がこなくなったら

結論から言うと、configration.ymlのdelivery_methodを :sendmailにして解決しました。

うっかりyum update実行してRedmine2.0.2/2.0.3からメールが配信されてこなくなってあせった。
メールサーバーの拒否リストにでも乗ったかと思って、違うアドレスで試したけどそちらも×。

メール配信処理はRedmine的には成功してて、(redmineルート)/log/production.logにはこういうのが出てたけど正直よくわからん…

DEPRECATION WARNING: The InstanceMethods module inside ActiveSupport::Concern will be no longer included automatically. Please define instance methods directly in CollectiveIdea::Acts::NestedSet::Model instead. (called from include at /var/lib/redmine/lib/plugins/awesome_nested_set/lib/awesome_nested_set/awesome_nested_set.rb:58)

/var/log/maillogには配信しようとしたログ自体が残ってない。

前までどうだったかは記憶に無いのだけど、一応アップデート後は

$ postconf mail_version
mail_version = 2.6.6

だった。

(redmineルート)/config/configration.ymlでdelivery_methodを :async_smtp(非同期)にしていたので、:smtp(同期)へ変更してみる。

http://(サーバ)/redmine/settingsの右下からテストメール送る。
画面上にエラーが出た。

postfix側の問題かと思って

$ echo "test" | mail -s "test" "hoge@example.jp"

すると問題なく送信&受信できた。

ついでなので、sendmail送信も試してみる。
(ローカルユーザー[user]宛)

$ sendmail user
From: user
To: user
Subject: This is test mail.
test
.

userのメールボックスに届いた。

で。
configration.ymlのdelivery_methodを :sendmailにするととりあえず配信されるようになりました。

原因探らないといかんけど、とりあえずはこのまま動かす。

Redmineで特定プロジェクトのフォーラムに投稿ができないとき

まだPostfix設定編を書いてないのに今日ハマったから先にポストする。


ユーザーのメールアドレスが原因のことがあります。
Ruby on Railsでメール配信する仕組みがどうやらdocomoユーザーに多い、一部の記号系メールアドレス(勝手に命名)に弱いもよう。
特に@直前に.があるやつ。

現象

特定のプロジェクトのフォーラム・ニュースなどに投稿ができない。
ユーザーの違うプロジェクトや、新規で作って自分だけ登録したようなプロジェクトは何も問題が無い

こちらの環境

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-linux]
Rails 3.2.6
Redmine 2.0.3

状況確認

Redmineログ(/var/lib/redmine/log/production.log)によれば

Started POST "/redmine/boards/1/topics/new" for xxx.xxx.xxx.xxx at 2012-07-06 00:00:00 +0900
Processing by MessagesController#new as HTML
(投稿内容中略)
  Rendered mailer/message_posted.text.erb within layouts/mailer (0.7ms)
Completed 500 Internal Server Error in 172ms

NoMethodError (undefined method `encoding' for #<Array:0x000000067dea00>):
  app/models/mailer.rb:420:in `deliver_mail'
  app/models/message_observer.rb:20:in `after_create'
  app/controllers/messages_controller.rb:59:in `new'

Started POST でフォーラムURLへ投稿している行を見つけて結果を見ると、Completed 500 Internal Server Errorって出てたりする。

app/models/mailer.rbを見に行ったら

self.deliver_mail(mail)

としか書いてない。正直、Ruby on Rails初心者には自前かフレームワークのものなのかわからなかったので、安易に

$ cd /var/lib/redmine
$ find . | xargs grep 'deliver_mail'

すると、log/production.logのエラー行と、さっき見たapp/models/mailer.rbしか出てこない。

この時点で、たぶんRedmine独自関数じゃないだろうからすぐ修正するのは無理そうだなぁ、と思い始めていた。

Railsでドットが連続3つ(トリプルドット)以上あるメールアドレスでもActionMailer::Base.deliverを利用してメールを送信する 

ぐはっ。
この内容見ながらやるにしても、RubyもRailsも初心者にはきつい。
時間があればやってみたかったんだけど…。

というわけで、他の方法を考える。

材料
相手のメールアドレスは解っている。
記号系メールアドレスをちゃんと送信できるメールサーバがある。
ついでにSSHログイン不可のRedmine初期登録に使ったテンポラリなアカウントがいくつか作ってある
(Redmineはユーザーのメールアドレスが重複できないうえに、通知するときに適当なローカルメールアドレスだと配信が止まってしまううえに、相手のアドレスもわからなかった)

結論:ローカルアカウントに送信後、メールを転送する

#tmp_user_nameはテンポラリなアカウントのユーザ名
$sudo vim /home/tmp_user_name/.forward

user@example.com

.forwardには転送先だけ書いて保存。

詳細は「Postfix メール転送」とかでぐぐる

Redmineのユーザー設定でメールアドレスを書き換えて、フォーラム投稿できるか確認して、メールログで転送されてるか確認して、ついでにニュースに「○○さんへ 急いでたから適当に処理したんで他のアドレスに書き換えてね(変えたら転送解除するから返信してね)」って投稿しておわり。

感想

実は昨日、数万件の中から明らかに不正確なメールアドレス抽出→削除っていうのをやってたときに、
判定大雑把なのでいいからネットで探してきた正規表現使ったら、@前に.のあるアドレスが結構引っかかったので、今日の事象も解決が早かったと思われます。
(名誉のために言うと、削除前には目視確認してから捨てるので大雑把で良かった)

明らかな入力ミス以外は全部docomoだったので、この形式は一般的ではないんだなあ、と思って。
→RFC準拠してないんですね。

実運用中のメールアドレスの仕様はかなり奥深いようで、以前どこかのサイトで「たいてい間違ってるから安易に正規表現乗せないでください」って詳しい人が怒っていたのを目撃したことがあったような…。(´・∀・`)