Cover Image for Docker版NextcloudでHEIC画像の表示に対応する方法

Docker版NextcloudでHEIC画像の表示に対応する方法

iPhoneで撮ったHEIC画像をNextcloudでプレビュー表示する方法を解説します。Docker環境での設定手順も紹介!

akaaku
akaaku

今回は、最近取り組んで無事に解決した「Docker版NextcloudでHEIC画像を表示する」というテーマです。iPhoneで撮った写真はデフォルトだとHEIC形式で、Nextcloudにアップロードしても、そのままではプレビューが表示されなくて困っていたので、インターネットの情報を参考にしながら、Docker環境での設定を行いました。[1]

何が問題だったのか?

NextcloudがHEIC画像をプレビューするには、サーバー側でImageMagickという画像処理ツールと、PHPからImageMagickを使うためのPHP Imagick拡張が必要です。さらに、ImageMagickがHEIC形式を理解するためには、libheifというライブラリも必要になります。

Nextcloudの公式Dockerイメージは、シンプルさを重視しているためか、これらのライブラリや設定がデフォルトでは不足していることが多いんです。特に、最新のiOSで撮影されたHEICファイルは、古いlibheifのバージョンだと対応できないことがあって、それがまた厄介でした。

試行錯誤

最初は、NextcloudのDockerイメージに直接これらのライブラリを組み込もうとしました。Dockerfileを書いてビルドするわけですが、これがなかなかうまくい来ません。「imagick拡張が既にロードされている」みたいなエラーが出て、ビルドがこけてしまいました。

試行錯誤の末、Dockerイメージのビルドには成功!ポイントは、PECLを使わずに、apt-getで必要なパッケージをインストールする方法でした。以下がそのDockerfileの内容です。

FROM nextcloud:latest

# aptパッケージリストを更新し、必要なパッケージをインストール
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
    imagemagick \
    libmagickwand-dev \
    libheif-dev \
    pkg-config && \
    rm -rf /var/lib/apt/lists/*

このドッカーファイルを使ってビルドに成功しました。

docker build -t nextcloud-heic .

これでカスタムイメージの準備は済んだので、次にdocker-compose.ymlを更新して、この新しいイメージを使うようにしました。

services:
  db:
    image: mariadb:10.11
    restart: always
    command: --transaction-isolation=READ-COMMITTED
    volumes:
      - /home/cli/nextcloud/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=xxxxxxxxxxxx
      - MYSQL_PASSWORD=xxxxxxxxxxxx
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    networks:
      - nextcloud_network

  redis:
    image: redis:alpine
    restart: always
    container_name : redis-nextcloud
    ports:
      - 16379:6379
    volumes:
      - redis.d:/data
    networks:
      - nextcloud_network

  app:
    image: my-nextcloud-heic:latest
    # image: nextcloud
    restart: always
    ports:
      - 8080:80
    depends_on:
      - redis
      - db
    volumes:
      - /home/hogehoge/nextcloud/data:/var/www/html
    environment:
      - MYSQL_PASSWORD=xxxxxxxxxxxx
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db
      - REDIS_HOST=redis-nextcloud
      - REDIS_PORT=6379
    networks:
      - nextcloud_network

networks:
  nextcloud_network:

volumes:
  nextcloud:
  db:
  redis.d:

ここで、HEICプレビューを有効にする設定をconfig.phpに追記しました。

既存のファイルもバッチリ表示!

設定を終えてNextcloudを再起動すると、アップロード済みのHEICファイルはまだプレビューが表示されない状態でした。新しいHEICファイルをアップロードしてみると、こちらはちゃんとプレビューされます。

既存のファイルもプレビューさせるには、Nextcloudの「Preview Generator」というアプリがあるので、早速インストール。そして、以下のコマンドを実行しました。

docker exec -it --user www-data nextcloud-app-1 php occ preview:generate-all

このコマンドは時間がかかりましたが、実行が完了すると、既存のHEICファイルもすべてプレビューが表示されるようになりました!

まとめ

Docker版NextcloudでHEIC画像のプレビュー表示を実現するための手順を紹介しました。ImageMagickとPHP Imagick拡張、さらにlibheifライブラリを組み込むことで、iPhoneで撮影したHEIC画像も問題なく表示できるようになりました。
これで、iPhoneを使う人でも、気軽にHEICをアップロードできるようになりました。

もし同じようにHEIC画像のプレビューで困っている方がいたら、ぜひ参考にしてみてください。

脚注
  1. https://www.ampspeed.com/2022/10/nextcloud-with-heif.html ↩︎