Perforce P4 / P4 DAMをAWS上にDockerで構築してみた

Perforce P4 / P4 DAMをAWS上にDockerで構築してみた

2026.05.25

こんにちは、ゲームソリューション部のsoraです。
今回は、Perforceのデジタルアセット管理サービスであるP4 DAMを、無料枠の範囲でAWS上にDockerで構築して触ってみました。

SaaS版のトライアル環境で触ってみた記事は以下にあります。
https://dev.classmethod.jp/articles/perforce-p4-dam-trial/

セルフホストの構築方法

セルフホストでP4 / P4 DAMを構築する方法はいくつかパターンがあります。

今回は後者のDocker Compose構成をベースに、AWS側はTerraformで全自動構築する形にしました。
P4側もDockerで動かすために、p4d用のコンテナイメージを自前で組んで立てています。

構成

今回構築した構成は以下です。
P4 DAMとP4を別EC2に分離しています。

sr-perforce-docker-01

  • P4 DAM用EC2はCloudFront(HTTPS 443)経由
  • P4用EC2はインターネット向けNLB(TCP 1666)経由
    • P4プロトコルはHTTPではないのでNLBを使用

構築はTerraformで行い、EC2のブートストラップまで含めて起動できる状態にしました。
ただし、本記事ではTerraformのコード部分の説明は割愛して、P4 / P4 DAMの構築で使ったDockerイメージとEC2のユーザーデータで実行したコマンドの中身をメインに記載します。

構築 - P4

P4用EC2のユーザーデータで実行している処理を抜粋して説明します。

Dockerでp4dを動かす

今回はP4のサーバプロセスであるp4dをDockerコンテナで動かしました。
ベースイメージはamazonlinux:2023で、Perforce公式のバイナリ配布元ftp.perforce.comからp4d / p4を取得してインストールしています。

FROM amazonlinux:2023
RUN dnf install -y shadow-utils openssl ca-certificates && dnf clean all
RUN curl -fsSL -o /usr/local/bin/p4d https://ftp.perforce.com/perforce/r26.1/bin.linux26x86_64/p4d && \
    curl -fsSL -o /usr/local/bin/p4  https://ftp.perforce.com/perforce/r26.1/bin.linux26x86_64/p4  && \
    chmod 755 /usr/local/bin/p4d /usr/local/bin/p4
ENV P4ROOT=/data/p4root P4SSLDIR=/data/p4ssl P4PORT=ssl:1666 P4USER=super P4CHARSET=utf8
EXPOSE 1666
ENTRYPOINT ["/entrypoint.sh"]

データディレクトリはホストの/opt/p4d-dataをボリュームマウントして永続化します。

初回起動時のsuperユーザー作成

p4d 2024.1以降はsecurity / dm.user.noautocreate / run.users.authorizeなどのセキュリティ既定値が厳しくなっていて、新規DBの状態だとp4 user -iがユーザー0件でfailed authentication checkに弾かれます。
そのため、標準手順ではないですが、初回ブートストラップ時にこれらの設定を一時的に緩めてsuperを作成 → 厳格に戻す、という流れにしています。

設定値の詳細は以下の公式リファレンスを参照してください。
https://help.perforce.com/helix-core/server-apps/cmdref/current/Content/CmdRef/configurables.alphabetical.html

構築 - P4 DAM

P4 DAM側のユーザーデータは公式リポジトリperforce/p4damをクローンしてDocker Composeで起動する流れです。

Docker Compose一式とESイメージ

docker compose pullで取得するイメージは公式のものをそのまま使います。
おおまかには下記の構成です。

  • perforce/p4dam-nginx (リバースプロキシ + フロントエンド配信)
  • perforce/p4dam-backend (Rails)
  • perforce/p4dam-workers / scheduler / streamer / moonshine (各種ワーカー)
  • anycable/anycable-go (WebSocket)
  • perforce/p4search (検索)
  • perforce/p4render (Blenderベースのプレビュー生成)
  • mongo / redis (依存DB)
  • elasticsearch

elasticsearchは、公式のDockerfileがpackage.perforce.comからhelix-plugin-filterプラグインを取得してインストールしてイメージをビルドする作りになっています。
今回はこの外部依存を減らすため、すでにperforce/p4searchイメージに同梱されているプラグインのzipを取り出して、それをそのままインストールする形にDockerfileを書き換えました。

# perforce/p4searchイメージから.zipを抜き出してビルドコンテキストに置く
docker run --rm --entrypoint cat perforce/p4search:r26.2 \
  /opt/perforce/helix-p4search/lib/p4search-filter-8.19.14-2026.2.2953718.zip \
  > elasticsearch/plugins/helix-plugin-filter.zip

# Dockerfileを書き換え
cat > elasticsearch/Dockerfile <<'EOF'
FROM docker.elastic.co/elasticsearch/elasticsearch:8.19.14
COPY --chown=elasticsearch:root plugins/helix-plugin-filter.zip /tmp/helix-plugin-filter.zip
RUN bin/elasticsearch-plugin install --batch file:///tmp/helix-plugin-filter.zip
EOF

なお、nginxはデフォルトでHTTP(80)からHTTPS(443)へのリダイレクト設定が入っています。

本来であればCloudFrontとオリジン間もHTTPSで通すべきところですが、そのためにはオリジン側(EC2のnginx)に有効な証明書を持たせる必要があります。

今回は検証用途のためCloudFrontとオリジン間はHTTPで通すことにし、nginx.confrewrite行をコメントアウトしてHTTPSへのリダイレクトを無効化しました。

マルチホスト構成でのindexer設定

P4とP4 DAMを別EC2に分離していると、P4にインストールされるhelix-core-search-indexer extensionが参照するp4searchのURL / Token / TenantIDが自動でセットされません。
そのままだとサブミットを検知してもESに何もインデックスされないので、ユーザーデータでp4 propertyに手動でセットしています。
あわせて、P4 DAM側EC2のセキュリティグループでVPC内からの1601/TCPを開放しています。

初期セットアップ

最後に、backendコンテナ上で初期セットアップタスクとマイグレーションを流します。

docker compose exec -T backend bin/rails hth:first_time_dam_setup
docker compose exec -T backend bin/rails hth:migrations:all

hth:first_time_dam_setupが会社ID(dam) / superユーザー / 初期パスワードなどをセットアップしてくれます。

動作確認

CloudFront経由でログイン

ブラウザでCloudFrontのドメイン(独自ドメイン)にアクセスすると、P4 DAMのログイン画面が出ます。
WAFで許可IP以外は403になるようにしています。

sr-perforce-docker-02

会社ID dam、ユーザー super、構築時に発行されたsuperユーザーのパスワードでログインできました。

sr-perforce-docker-03

p4 CLIでP4に直接接続

P4はNLB経由でインターネットから直接p4 CLIで叩けます。
ローカルMacからは、Perforceポータルからp4バイナリをダウンロードして/usr/local/bin/に置けば使えます。

$ export P4PORT=ssl:p4.example.com:1666
$ export P4USER=super
$ export P4CHARSET=utf8

$ p4 trust -y
The fingerprint of the server of your P4PORT setting
'ssl:p4.example.com:1666' is not known.
That fingerprint is 65:3F:93:0B:03:A8:5E:1B:EE:8E:13:35:95:0B:7E:E6:A1:17:FA:93
Added trust for P4PORT 'ssl:p4.example.com:1666'

$ p4 login
Enter password:
User super logged in.

$ p4 info
User name: super
Server version: P4D/LINUX26X86_64/2026.1/2951233 (2026/05/19)
Server encryption: encrypted
ServerID: master
Server services: commit-server

ちなみにインターネット向けNLBは2AZで2つのIPを持ち、p4 trustはIP単位で信頼を登録するので、必要に応じて両方信頼させてください。

p4 depotsp4 changesでも、デポやチェンジリストの確認ができます。

$ p4 depots
Depot depot       2026/05/22 local  depot/...       'Default depot'
Depot spec        2026/05/22 spec   spec/...        'Created by super. '
Depot test_stream 2026/05/22 stream test_stream/... 'Created by super. '
Depot unload      2026/05/22 unload unload/...      'Created by super. '

$ p4 changes -m 5
Change 4 on 2026/05/22 by super@hth-01fbd0e6... 'Edited 6 files'
Change 3 on 2026/05/22 by super@____CLIENT_UNSET____ 'Stream //test_stream/test/main'
Change 2 on 2026/05/22 by super@____CLIENT_UNSET____ 'Installing extension: hth-exten'
Change 1 on 2026/05/22 by super@____CLIENT_UNSET____ 'Installing Extension certificat'

アセットアップロードとP4側からの裏取り

P4 DAMのWeb UIで.glb(3Dモデル)を6個アップロードしました。
アップロード後、P4 CLI側から見ると、ちゃんとストリームデポにバージョン管理されて入っています。

$ p4 describe -s 4
Change 4 by super@hth-01fbd0e6... on 2026/05/22 08:46:41

    Edited 6 files

Affected files ...
... //test_stream/test/mainline/assets/Avocado.glb#1 add
... //test_stream/test/mainline/assets/BoomBox.glb#1 add
... //test_stream/test/mainline/assets/DamagedHelmet.glb#1 add
... //test_stream/test/mainline/assets/Duck.glb#1 add
... //test_stream/test/mainline/assets/Fox.glb#1 add
... //test_stream/test/mainline/assets/Lantern.glb#1 add

hth-始まりのクライアントはP4 DAMが裏で作ったものです。
「P4 DAMはアセット管理のUI、ストレージとバージョン管理の実体はP4」という関係をP4側から確認できました。

ちなみに、一覧画面のプレビューサムネイルは生成されませんでした。
DAMライセンスが必要な機能のようで、無料枠では出ないようでした。

ファイル詳細画面のプレビュー

一覧サムネイルは出ませんでしたが、ファイルをクリックして詳細画面に行くと、.glb(3Dモデル)のプレビューが表示できました。

sr-perforce-docker-04

ロックの相互認識

P4 CLIからp4 editp4 lockでファイルをロックすると、P4 DAM側もロック状態を認識します。

$ p4 client -S //test_stream/test/mainline -o p4lock-test | p4 client -i
Client p4lock-test saved.

$ p4 sync //test_stream/test/mainline/assets/Duck.glb
//test_stream/test/mainline/assets/Duck.glb#1 - added as .../p4lock-test/assets/Duck.glb

$ p4 edit //test_stream/test/mainline/assets/Duck.glb
//test_stream/test/mainline/assets/Duck.glb#1 - opened for edit

$ p4 lock //test_stream/test/mainline/assets/Duck.glb
//test_stream/test/mainline/assets/Duck.glb - locking

$ p4 opened
//test_stream/test/mainline/assets/Duck.glb#1 - edit default change (binary) *locked*

sr-perforce-docker-05

この状態でP4 DAMのWeb UIから同じアセットに新バージョンをアップロードしようとすると、ロック中のため不可というエラーが出ます。
P4とP4 DAMでロック状態が共有されている、ということが確認できました。

コレクション(リポジトリ)の削除

P4 DAMで作成したコレクション(リポジトリ)は、P4 DAMのUI上では削除できず、Perforce TeamHub側の管理画面から削除する仕様です。

P4 DAMからGo To Perforce TeamHubでTeamHubへ進みます。

sr-perforce-docker-06

TeamHubにてプロジェクトやリポジトリが確認できます。

sr-perforce-docker-07

sr-perforce-docker-08

今回はtestリポジトリ(コレクション)の削除を試してみます。

sr-perforce-docker-09

P4 DAM側でも確認してみると、コレクションが無くなっていることが確認できました。

sr-perforce-docker-10

ただし、TeamHubから削除されるのはTeamHubのメタデータだけで、P4側のデポ / ストリーム / ファイルは残ります。
完全に消したい場合はP4 CLIでobliterateする必要があります。
今回はTeamHub UIで削除したあと、P4 CLI側で以下のように後片付けしました。

# 1. ストリームを参照するクライアントを削除
$ p4 client -d hth-xxxxxxx

# 2. ファイル本体を物理削除
$ p4 obliterate -y //test_stream/test/...
Deleted 18 revision record(s).

# 3. ストリームのspec削除
$ p4 stream -d //test_stream/test/mainline

# 4. ストリームのDBレコードも削除
$ p4 stream --obliterate -y //test_stream/test/mainline

逆順でP4側から先に消すと、P4 DAMのmy projects画面に該当プロジェクトが残ったままで、開くとOops! Something went wrong, please try again.のエラーが出ます。
ログアウト / ログインしても解消しません。

公式ドキュメントでは、プロジェクト・コレクションの削除はTeamHubで実施するもので、その操作はP4のデポ・ストリーム・ファイルには影響しないと明記されています。

... does not delete depots, streams, or files from P4 Server.

https://help.perforce.com/helix-core/helix-dam/current/Content/HelixDAM-User/deleting-projects.html

最後に

今回は、PerforceのP4 DAMをAWS上に構築し、無料枠(DAMライセンスなし)でアセットアップロード・バージョン管理・ロック・削除挙動まで確認してみました。
この記事がどなたかの参考になれば幸いです。


ゲーム開発・運用環境の効率化を支援します

Classmethodの専門家による包括的なクラウド活用とデジタル化支援で、ゲーム開発の効率を最大化しましょう。AWSの導入から運用、最適化まで、最新技術と豊富な経験であらゆる課題を解決します。株式会社CAPCOM様、株式会社SNK様などの事例もご覧いただけます。

ゲーム業界のサービス詳細を見る

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事