本記事は生成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 S | 4.2.1 |
| Web サーバ | Apache(apache-fpm) |
| PHP | 8.3 |
| DB | MariaDB 11.8(ddev デフォルト) |
| URL | https://omekas.ddev.site |
ddev が用意するコンテナ構成と Omeka S の位置づけは次のとおりです。ルーターが TLS を終端し、web コンテナ(Apache + PHP)に Omeka S 本体を置き、DB は別コンテナに分かれます。
前提
- 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 に遷移し、作成したアカウントでログインできます。

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

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

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

なお、サイトの作成やアイテムの割り当ては 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 の順に「インストール」をクリックします。導入後は次のようになります。

なお、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 を渡すだけで連携できます。データの流れは次のとおりです。
以下はデフォルト構成(Viewer がポート 9003)の場合の URL です。
http://localhost:9003/viewer/?manifest=https://omekas.ddev.site/iiif/2/1/manifest

いくつか補足します。
- 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 のタイル生成ジョブ(管理画面から一括実行可能)を回すと改善します


コメント
…