本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。

概要

ddev を使って、Omeka S をローカル環境(macOS)に構築する手順をまとめます。ddev は Docker ベースの開発環境ツールで、PHP バージョン・Web サーバ・データベース・HTTPS 証明書までコマンド数回で揃うため、Omeka S のように Apache + PHP + MySQL 系を前提とするアプリケーションのローカル検証に向いています。

あわせて、IIIF(International Image Interoperability Framework)対応のモジュールである IIIF Server / Image Server を導入してマニフェストを配信し、IIIF Curation Platform(ICP)の Curation Viewer から読み込むところまで確認します。

構築後の構成は以下のとおりです。

項目内容
Omeka S4.2.1
Web サーバApache(apache-fpm)
PHP8.3
DBMariaDB 11.8(ddev デフォルト)
URLhttps://omekas.ddev.site

ddev が用意するコンテナ構成と Omeka S の位置づけは次のとおりです。ルーターが TLS を終端し、web コンテナ(Apache + PHP)に Omeka S 本体を置き、DB は別コンテナに分かれます。

構成図。macOS ホストのブラウザから https://omekas.ddev.site で ddev-router(TLS 終端)に接続し、その先の web コンテナ(Apache + PHP 8.3 上の Omeka S 4.2.1 と IIIF モジュール)がホスト名・ユーザー・パスワード・DB 名すべて db の設定で db コンテナ(MariaDB 11.8)に接続する。router・web・db の 3 コンテナは ddev が自動で用意する

前提

  • macOS(Apple Silicon / Intel どちらでも可)
  • Docker Desktop などの Docker 環境が起動していること
  • Homebrew がインストール済みであること

ddev のインストール

brew install ddev/ddev/ddev

依存として mkcert も一緒にインストールされます。mkcert はローカル用の TLS 証明書を発行するツールで、これにより https://xxx.ddev.site にブラウザ警告なしでアクセスできるようになります。

CA(認証局)が未登録の場合は一度だけ以下を実行しておきます(キーチェーン登録のためパスワードを求められます)。

mkcert -install

Omeka S のダウンロードと展開

プロジェクト用のディレクトリを作り、Omeka S のリリースページから最新版を取得して展開します。本記事の執筆時点では 4.2.1 が最新でした。

mkdir -p ~/git/omeka-s
cd ~/git/omeka-s
curl -sL -o omeka-s.zip https://github.com/omeka/omeka-s/releases/download/v4.2.1/omeka-s-4.2.1.zip
unzip -q omeka-s.zip
ditto omeka-s . && rm -rf omeka-s omeka-s.zip

展開後、直下に index.php / application/ / config/ / modules/ などが並んでいれば問題ありません。

ddev プロジェクトの設定

Omeka S は .htaccess によるリライトを前提としているため、Web サーバは nginx(ddev デフォルト)ではなく apache-fpm を指定します。docroot はパッケージ直下(.)です。

cd ~/git/omeka-s
ddev config --project-name=omekas --project-type=php --webserver-type=apache-fpm --php-version=8.3 --docroot=.

データベース接続設定

ddev は DB コンテナを自動で用意し、接続情報はホスト名・ユーザー・パスワード・DB 名すべて db に固定されています。これを Omeka S の config/database.ini に書きます。

user     = "db"
password = "db"
dbname   = "db"
host     = "db"

起動

ddev start -y

初回は Docker イメージの取得が入るため数分かかります。成功すると次のように表示されます。

Successfully started omekas
Your project can be reached at https://omekas.ddev.site

初回の ddev start は利用統計の送信可否を尋ねる対話プロンプトを出すことがあります。スクリプトやパイプ越しに実行すると入力待ちのまま止まって見えるので、-y を付けるか、事前に以下で無効化しておくと安全です。

ddev config global --instrumentation-opt-in=false

Omeka S のインストール

ブラウザで https://omekas.ddev.site を開くと /install にリダイレクトされ、初期セットアップ画面が表示されます。以下を入力して送信します。

  • 最初のユーザーの Email / 表示名 / パスワード
  • インストールのタイトル
  • タイムゾーン(Asia/Tokyo)・ロケール(ja)

完了すると /login に遷移し、作成したアカウントでログインできます。

Omeka S のログイン画面

ログイン後の管理画面(https://omekas.ddev.site/admin)は次のとおりです。ロケールに ja を選んでいれば日本語で表示されます。

Omeka S の管理画面ダッシュボード

サイトの作成

Omeka S では、登録したアイテムは「サイト」という単位で一般公開されます。インストール直後はサイトが存在しないため、管理画面の「サイト一覧」→「サイトの追加」からタイトルとスラッグ(URL の一部)を設定して作成します。アイテムは既定ではどのサイトにも属さないので、アイテム編集画面の「サイト」タブ(複数件なら一括編集)で公開したいサイトに割り当てます。

サイトのスラッグを main とした場合、公開側は次の URL になります。

https://omekas.ddev.site/s/main/

アイテム一覧(/s/main/item)は次のように表示されます。

公開サイトのアイテム一覧ページ。サイト名の下に登録したテストアイテムがサムネイル付きで 1 件表示されている

アイテムの詳細ページでは、アップロードした画像とメタデータが表示されます。

公開サイトのアイテム詳細ページ。タイトルの下にアップロードした画像が大きく表示されている

なお、サイトの作成やアイテムの割り当ては REST API からも行えます(サイトは POST /api/sites、割り当てはアイテムの o:site プロパティの更新)。

IIIF モジュールの導入

IIIF マニフェスト配信(Presentation API)と画像配信(Image API)のために、Daniel Berthereau 氏の以下 3 モジュールを入れます。IIIF Server は Common に依存するため、3 つセットで導入します。バージョンは執筆時点のものです。

cd ~/git/omeka-s/modules
curl -sL -O https://github.com/Daniel-KM/Omeka-S-module-Common/releases/download/3.4.87/Common-3.4.87.zip
curl -sL -O https://github.com/Daniel-KM/Omeka-S-module-IiifServer/releases/download/3.6.32/IiifServer-3.6.32.zip
curl -sL -O https://github.com/Daniel-KM/Omeka-S-module-ImageServer/releases/download/3.6.25/ImageServer-3.6.25.zip
for z in *.zip; do unzip -qo "$z" && rm "$z"; done

管理画面の「モジュール」ページ(https://omekas.ddev.site/admin/module)を開き、Common → IIIF Server → Image Server の順に「インストール」をクリックします。導入後は次のようになります。

モジュール一覧で Common / IIIF Server / Image Server が有効になっている状態

なお、Image Server が使う画像処理ライブラリ(GD / Imagick / ImageMagick)は ddev の web イメージに最初から入っているため、追加設定は不要でした。

動作確認

画像付きのアイテムを 1 件登録します(ここではアイテム ID を 1 とします)。

テストアイテムの管理画面

すると以下の URL が利用できるようになります。

内容URL
マニフェスト(Presentation API v2)https://omekas.ddev.site/iiif/2/1/manifest
マニフェスト(Presentation API v3)https://omekas.ddev.site/iiif/3/1/manifest
画像の info.json(Image API level2)https://omekas.ddev.site/iiif/2/{mediaId}/info.json

curl でヘッダを見ると、外部ビューアからの読み込みに必要な CORS(cross-origin resource sharing)ヘッダがデフォルトで付いていることが確認できます。

curl -skI https://omekas.ddev.site/iiif/2/1/manifest | grep -i access-control
access-control-allow-origin: *

IIIF Curation Platform から読み込む

ICP をローカルの Docker(公式の iiif-curation-platform-docker 等)で動かしている場合、Curation Viewer に Omeka S のマニフェスト URL を渡すだけで連携できます。データの流れは次のとおりです。

ICP 連携のデータフロー図。ブラウザ上で動く IIIF Curation Viewer(localhost:9003)が、①Omeka S からマニフェストと画像を取得(CORS ヘッダが必要)、②作成したキュレーションを JSONkeeper(ポート 9001)に保存、③JSONkeeper の内容が Canvas Indexer(ポート 9002)でインデックス化され検索対象になる、という 3 ステップで連携する以下はデフォルト構成(Viewer がポート 9003)の場合の URL です。

http://localhost:9003/viewer/?manifest=https://omekas.ddev.site/iiif/2/1/manifest

Curation Viewer で Omeka S のマニフェストを表示した状態

いくつか補足します。

  • Viewer は HTTP ページですが、HTTPS リソースの読み込みは mixed content に該当しないためブロックされません
  • マニフェストの取得はブラウザ側で行われるため、*.ddev.site のようなローカル URL でも同一マシンのブラウザなら読めます(mkcert の CA が信頼済みであることが前提)
  • ICP は Presentation API v2 前提の箇所が多いようなので、/iiif/2/... の方を渡すのが無難です

Viewer 上で範囲を選択してキュレーションを作成すれば、JSONkeeper に保存され、Canvas Indexer の検索対象になります。

日常の操作

ddev stop          # 停止
ddev start         # 再開
ddev describe      # URL・ポート等の確認
ddev exec <cmd>    # web コンテナ内でコマンド実行
ddev ssh           # web コンテナに入る
ddev delete -Oy    # プロジェクト削除(DB も消える)

つまずきやすい点

  • ddev start が無反応になる場合は、前述の対話プロンプト待ちの可能性があります。-y を付けて再実行します
  • HTTPS でブラウザ警告が出る場合は、mkcert -install が未実行です
  • REST API の書き込みが 403 になる場合、セッション Cookie では API の書き込み権限が付かないためです。管理画面のユーザー編集ページ「API キー」タブでキーを発行し、?key_identity=...&key_credential=... を付けてリクエストします
  • 大判画像の表示が遅い場合は、Image Server のタイル生成ジョブ(管理画面から一括実行可能)を回すと改善します