やりたいこと
Node.jsのwebアプリで、アップロードされたaiファイルやpsdファイルをjpgに変換して表示する機能を作ったのですが、Herokuへのデプロイでハマったので解決方法と共にメモします。
画像変換にはImageMagickを、imagemagickというライブラリを経由して利用しました。
(今回の問題はNode関係なくどの言語でも共通だと思います)
開発環境では
ローカルの開発環境 (macOS) では、
brew install imagemagick
でImageMagickをインストールし、またaiファイルを変換するためにGhostscriptをインストールしました。
brew install ghostscript
ターミナルで convert sample.ai sample.jpg
を実行すると画像が変換できたことが確認できます。
psdファイルの場合は、flattenオプションをつけないと各レイヤーごとのファイルが出力されてしまいます。
convert sample.psd -flatten sample.jpg
簡単。
Herokuにデプロイ
さて、デプロイです。
HerokuのサーバーでもImageMagickとGhostscriptをインストールする必要があります。Herokuではdynoが起動するたびにインスタンスがリセットされてしまうので、build packsという仕組みで必要なツールをビルドのたびにインストールします。
ImageMagick
ImageMagickのビルドパックは公式からは提供されていませんが、カスタムビルドパックを作ってる人がいるのでこれを利用します。
heroku buildpacks:add https://github.com/ello/heroku-buildpack-imagemagick
これでImageMagickのカスタムビルドパックの追加が完了です。これでHeroku上でImageMagickが使えるはず・・・と思いきや、デプロイしてheroku run magick -version
を実行してみると、
bash: magick: command not found
とエラーが帰ってきます。ImageMagickがインストールされていない・・・?
散々情報を集めたり試行錯誤を繰り返す中、convertコマンドを使った時には別のエラーが吐かれていることに気づきました。曰く、
convert: error while loading shared libraries: libgvc.so.6: cannot open shared object file: No such file or directory
このlibgvc.so.6というのを調べてみると、Graphbizというプログラムに関わるものらしい。Graphbizのビルドパックも追加してみます。
heroku buildpacks:add https://github.com/weibeld/heroku-buildpack-graphviz.git
デプロイし直して再度heroku run magick -version
を実行すると、ちゃんとバージョン情報が返ってきました。convertコマンドも使えました。これでImageMagickの基本的な機能は使えるはずです。
Ghostscript
aiファイルの変換には、Ghotstscriptのインストールが必要なので、これもビルドパックでインストールします。
ここでまたハマりました。
nurvetemamのheroku-buildpack-ghostscript を入れてconvertを実行したところ、
Unrecognized switch
云々というエラーが。ググっても手がかりがないので難儀しましたが、bvirletのheroku-buildpack-ghostscriptを使うようにしたら直りました。
heroku buildpacks:add https://github.com/bvirlet/heroku-buildpack-ghostscript.git
感想
herokuは便利だけど、デバッグが大変。ImageMagick関連は意外と情報が少ない。