Help us understand the problem. What is going on with this article?

HerokuでImageMagickのconvertができるまで

More than 1 year has passed since last update.

やりたいこと

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関連は意外と情報が少ない。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away