Heroku環境でフォントを追加する

Heroku で動かしている環境にフォントを追加する方法について。日本語を含む PDF を生成する場合などに必要になる情報です。

Heroku の環境では、fontconfig という、システム全体のフォントの設定を管理するためのライブラリが利用されています。この設定により、システムがフォントを参照するディレクトリの1つとして、~/.fonts が設定されています (※fontconfig 的にはこのディレクトリは非推奨とありますが)。

この ~/.fonts ディレクトリ以下にフォントファイルを配置することで、システムがフォントを参照できるようになります。フォントファイルというのは、例えば TrueType 形式のフォントの場合、*.ttf のような拡張子のファイルのことです。例えば前述した日本語の PDF 用途だと、IPA フォントや Noto フォントが利用されているケースをよく見かけます。

さて、フォントのインストール先としてこのディレクトリを利用する場合、Heroku の場合、ホームディレクトリは /app なので、/app/.fonts ディレクトリ以下にフォントファイルを配置することになります。また、Heroku では Push した Git リポジトリが /app 以下に展開されることから、Git リポジトリ内にフォントファイルを含めて管理する場合には、そのルートディレクトリに .fonts ディレクトリを用意しておけば、システムが参照するパスに上手くフォントファイルが配置されることになります。

しかし注意点として、どのフォントがインストールされているかという情報はキャッシュされて管理されているため、フォントファイルを変更した場合には、このキャッシュを明示的に更新する必要があります。このキャッシュの更新には、fc-cacheコマンドが利用できます。

例えば、アプリケーションを作成したときにキャッシュを更新する戦略 (Review-Apps 等の用途ではこれで十分) を取るとすると、Heroku では app.json の scripts postdeploy を利用してこれを実現できます。

{
  "scripts": {
    "postdeploy": "fc-cache -fv"
  }
}

ちなみに、Docker で同じようなことをやる場合、ホームディレクトリが /root であることから、~/.fonts は /root/.fonts に展開されるため、例えば以下のように、フォントファイルを適切に配置した上でキャッシュを更新する必要があります。

COPY .fonts /root/.fonts

RUN fc-cache -fv