PlaneをDockerでセルフホスト|Jira・Asana代替OSSはメモリ約1.1GB・初回起動約4分。日本語化とポート公開の注意点【2026年版】

※2026年11月1日時点の情報です。弊社のサーバーで Plane v1.4.3(Community Edition)を動かして確認しています。設定項目や画面は版によって変わるため、最新の内容は公式ドキュメントでご確認ください。

Jira や Asana に代わる「自分のサーバーで動かせるプロジェクト管理ツール」を探すと、候補に入るのが Plane です。導入を判断するには、必要なメモリの量、起動までの待ち時間、画面が日本語になる範囲を把握しておきたいところでしょう。そこで弊社の検証サーバーに Docker で構築し、それぞれを確かめました。

結論:PlaneはDockerで初回起動に約4分・メモリ約1.07GB。日本語化は一部

  • 初回起動では、up -d の実行開始から API の応答まで237秒(約4分)かかった。空のデータベースの準備(migrator)が完了するまで待つ必要がある。イメージの取得(60秒)は含めておらず、2回目以降の起動は未計測
  • 起動後に増えたメモリは約1.07GB(1,071MB。タイトルの「約1.1GB」はこの値を丸めたもの)。稼働中のコンテナは12個で、ディスクの増分は約4.5GB だった
  • 公式の compose では80番と443番がサーバーの全アドレスで開く。弊社では公開範囲を 127.0.0.1 に限定した
  • 最初の管理者を作る場所は /god-mode/。利用状況の送信(テレメトリ)は既定でオンになっている。メールの確認は求められなかった
  • 利用者の画面で言語を日本語にすると、メニューの多くが日本語に切り替わる。一方、管理画面は開いた範囲(General など)では英語のみで、状態名(Backlog など)も英語のまま
  • タイムゾーンは既定で UTC になっている。日本で利用する場合は、最初に Asia/Tokyo へ変更する

検証で使用したのは、架空のテスト用アカウント(example.com のメールアドレス)と、Plane が自動作成するデモの作業項目だけです。実際の業務データは登録していません。

Planeとは:Jira・Asanaの代わりになるプロジェクト管理OSS

Plane は、作業項目(課題・タスク)やサイクル(スプリント)、モジュール、ページ(文書)を1つにまとめて扱うプロジェクト管理ツールです。公開先は GitHub の makeplane/plane です。

公式ドキュメントを読む際は、「Docker Compose」のページが冒頭で Commercial Edition の手順を紹介している点に注意が必要です。こちらは Free プラン(ワークスペースごとに12席)から利用でき、ライセンスキーによって有料機能が有効になります。Community Edition の手順は同じページの下のほうに掲載されている setup.sh 方式です。今回検証したのはこちらです。

PlaneをDockerでセルフホストする手順と実測値

検証には、さくらのクラウドの2コア・メモリ8GB・SSD 40GB(Ubuntu 22.04.5、Docker 29.8.2)を使用しました。測定中はほかのコンテナを停止しています。公式ドキュメントに記載された前提は、Commercial Edition の欄では CPU 2コア・メモリ 4GB(本番は 8GB 推奨)。Community Edition の欄では、AWS の EC2 を使う場合は t3.medium/t3a.medium 以上とされています(Docker Desktop を使う選択肢もあり)。今回のサーバーは、Commercial Edition の欄にある推奨にちょうど当たります。

公式の setup.sh では、対話式のメニューを通じて、v1.4.3 のリリースに添付された docker-compose.yml と variables.env を取得します。今回はこの2ファイルを直接取得して compose を書き換え、その後に起動しました(理由は次の節)。.env では、主に以下の値を変更しています。

APP_RELEASE=v1.4.3            # 既定は stable(動くタグ)。版を固定する
LISTEN_HTTP_PORT=19003        # 既定は 80
LISTEN_HTTPS_PORT=19443       # 既定は 443(使わないが空き番号へ)
WEB_URL=http://localhost:19003          # ポートまで書く
CORS_ALLOWED_ORIGINS=http://localhost:19003,http://127.0.0.1:19003
SECRET_KEY=(openssl rand -hex 32 で作った値)        # 既定は change-this-key-on-deployment
LIVE_SERVER_SECRET_KEY=(openssl rand -hex 32 で作った値)  # 既定は change-this-key-on-deployment
AWS_ACCESS_KEY_ID=(ランダムな値)       # 既定は access-key(ファイル置き場)
AWS_SECRET_ACCESS_KEY=(ランダムな値)   # 既定は secret-key
POSTGRES_PASSWORD=(ランダムな値)
DATABASE_URL=postgresql://plane:(同じ値)@plane-db:5432/plane
RABBITMQ_PASSWORD=(ランダムな値)
AMQP_URL=amqp://plane:(同じ値)@plane-mq:5672/plane
項目 実測値
イメージの取得 60秒。10種類(容量が大きいのは plane-live 1.72GB・plane-space 1.5GB)
起動(初回) up -d の実行開始を基準に、コマンドが戻るまで10秒、/api/instances/ が200を返すまで237秒
メモリ(サーバー全体の増分) API が応答してから60秒後で1,071MB
コンテナ 稼働数は12個(13サービスから初期化用の migrator を除いた数)
ディスクの増加 約4.5GB(4,561MB)

起動した直後に API が応答しないのは、api のコンテナがデータベースの準備(migrator)の完了を待っているためです。今回の待ち時間は約4分でした。起動が完了したかどうかは、/api/instances/ が200を返すことを基準に判断しています。この測定値は、空のデータベースを準備する時間も含めた初回の起動のもので、イメージの取得(60秒)は含めていません。2回目以降の起動時間は未計測です。

各コンテナのメモリは、以下の表にまとめました。最も大きな worker でも250MB に収まりますが、コンテナの数が多く、合計では1GB を超えます。api・worker・beat-worker の起動に使われるのは、いずれも plane-backend イメージです。なお、表は docker stats で確認したコンテナごとの値であり、その合計はサーバー全体の増分(1,071MB)とは一致しません。

コンテナ イメージ メモリ
worker plane-backend 250MB
plane-mq rabbitmq 3.13.6 165MB
api plane-backend 151MB
beat-worker plane-backend 149MB
live plane-live 147MB
plane-db postgres 15.7 81MB
plane-minio pgsty/silo(ファイル置き場) 78MB
space・plane-redis・web・proxy・admin plane-space・valkey 7.2.11・plane-frontend・plane-proxy・plane-admin 5個の合計122MB

ファイル置き場のイメージは、v1.4.3 で変更されています。リリースノートでは、Docker Hub から minio の組織が消えて取得できなくなったことを理由に、同梱のストレージを pgsty/silo(タグ固定)へ切り替えたと説明されています(サービス名は plane-minio のまま)。古い版の compose は使い回さないようにしてください。

Planeの公式composeで先に直したい3か所

公式の compose と variables.env(v1.4.3)では、次の3点が気になりました。

1つ目がポートの公開範囲です。前段の proxy のポートには host_ip が指定されていません。そのため、既定では80番と443番がサーバーのすべてのアドレスで開きます。弊社では proxy の2つのポートに以下の1行を加え、公開範囲を 127.0.0.1 に限定しました。

    ports:
      - target: 80
        published: ${LISTEN_HTTP_PORT:-80}
        host_ip: 127.0.0.1     # 追加
        protocol: tcp
        mode: host

Docker Compose の統合の規則では、ポートの「IP・コンテナ側・公開側・プロトコル」の組が異なると、追加として扱われます。compose.override.yaml に 127.0.0.1 付きのポートを記述しても、通常の統合では全アドレス側の設定が残るのはこのためです。ports: !override(Docker Compose 2.24.4 以降)による丸ごとの置き換えも可能ですが、公式 setup.sh は -f でファイルを指定して compose を呼び出すため、compose.override.yaml は読み込みません。こうした理由から、今回は公式ファイルを直接書き換えています。また、公式 setup.sh の Upgrade は compose を取得し直し、古いファイルを archive フォルダに移す仕組みです。したがって、更新のたびに host_ip を書き換え直す必要があります。

2つ目はパスワードの既定値です。variables.env の設定は POSTGRES_PASSWORD=plane、RABBITMQ_PASSWORD=plane で、DATABASE_URL= と AMQP_URL= は空になっています。空の場合は compose 側の既定値 postgresql://plane:plane@plane-db/plane が使われますが、この URL にはパスワード「plane」が直接記述されています。パスワードだけを変更しても URL 内の plane は変わらないため、URL にも同じパスワードを記述します。また、ファイル置き場の資格情報には、既定で access-key/secret-key が使われています。

3つ目に確認したいのが WEB_URL です。variables.env の設定は WEB_URL=http://${APP_DOMAIN}(APP_DOMAIN の既定は localhost)で、compose 側も既定は http://localhost となっています。公式ドキュメントでは、既定の http://localhost を、利用する FQDN に LISTEN_HTTP_PORT を付けた形に変更するよう案内しています。80番以外を使う場合は、ポート番号まで記述します。

このほかに、SECRET_KEY と、api と live で同じ値を使う LIVE_SERVER_SECRET_KEY も確認が必要です。variables.env では、どちらも既定値が change-this-key-on-deployment になっています。ファイル置き場の AWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEY(既定 access-key/secret-key)も含め、すべてランダムな値へ変更しました。

最初の管理者は/god-mode/で作る:テレメトリは既定でオン

起動後はブラウザで /god-mode/ にアクセスし、インスタンス全体を管理する管理者(Instance admin)を作成します。入力項目は名・姓・メールアドレス・会社名・パスワードです。パスワードには、「8文字以上・大文字・小文字・数字・記号を各1文字以上」という5つの条件が設けられています。

Planeの「Setup your Plane Instance」画面。名・姓・メール・会社名・パスワードの入力欄と5つのパスワード条件があり、下の「Allow Plane to anonymously collect usage events.」にチェックが入っている
/god-mode/ の管理者作成フォーム。利用状況の送信(テレメトリ)は最初からチェックが入っている(Plane v1.4.3、2026年11月1日に弊社で撮影)

フォーム下部の「Allow Plane to anonymously collect usage events.」(匿名の利用状況の送信)には、あらかじめチェックが入っています。今回はチェックを外して送信しました。その後はすぐに管理画面へ移り、メールの確認は求められませんでした(SMTP は未設定)。

管理画面に並ぶのは、General・Email・Authentication・Workspaces・Artificial intelligence・Images in Plane の6項目です。開いて確認した範囲(General など)では、表示は英語のみでした。テレメトリの設定は、あとから General の画面でも切り替えられます。

Planeの管理画面(Instance admin)の General settings。左にGeneral・Email・Authentication・Workspaces・Artificial intelligence・Images in Planeが並び、テレメトリのスイッチはオフになっている
管理画面(General)は英語のみ。テレメトリは送信前に外したのでオフ(Plane v1.4.3、2026年11月1日に弊社で撮影)

招待メールを送るため、公式ドキュメントでは god-mode で早めに SMTP を設定することを勧めています。なお、今回メンバーの招待は試していません。

Planeの画面は日本語? 既定は英語、切り替えても一部は英語

利用者の画面(/)へは、管理者と同じメールアドレスでログインしました(メール → パスワードの2段階)。その後はプロフィール、ワークスペースの作成(URL 用の名前と人数の選択が必須)、メンバーの招待(後回し可)の順に進みます。

ブラウザの言語設定は日本語でしたが、最初に表示された画面は英語でした。ホームに表示された「Sunday, Nov 1 13:54」は日本時間22時54分に当たり、9時間のずれがあります(タイムゾーンの既定が UTC)。ワークスペースの作成時には、作業項目7件を含むデモプロジェクトも自動で作成されました。

Planeに初めてログインした後のホーム画面。「Welcome to Plane, Edel Test」のダイアログが出ており、背景に「Sunday, Nov 1 13:54」と英語の左メニューが見える
最初は英語で始まり、時刻は UTC(日本時間22時54分に「13:54」)。左にデモプロジェクトが作られている(Plane v1.4.3、2026年11月1日に弊社で撮影)

言語の変更は、設定 → 環境設定 → 言語から行います。選択肢は19言語あり、日本語に切り替えるとメニュー・ボタン・設定画面の多くが日本語で表示されました。日本で利用するなら、同じ画面にあるタイムゾーン(既定 UTC)も Asia/Tokyo に変更しておきます。

Planeの環境設定画面。言語を日本語に切り替え、テーマ・タイムゾーン(UTC)・言語(日本語)が並ぶ。「Your Profile」「Developer」「First day of the week」は英語のまま
環境設定で言語を日本語に変えた直後。タイムゾーンは UTC のまま、一部の見出しは英語(Plane v1.4.3、2026年11月1日に弊社で撮影)

一方で、「Your Profile」「Developer」「First day of the week」、左側の「Projects」「More」、検索欄の「Search commands…」、一覧の見出しである「Work Items」などは、英語の表示が残りました。

作業項目の一覧でも、状態名(Backlog・Todo・In Progress・Done・Cancelled)は英語のままです。デモの作業項目の名前(「1. Create Projects」など)も英語でした。v1.4.3 のソースコードを見ると、状態名は state.py の DEFAULT_STATES に英語名で固定して記述されており、プロジェクトの作成時にその名前で作られます。自動作成されるデモプロジェクトの場合も、別の初期データ(states.json)から同じ英語名が作られます。いずれもプロジェクトのデータとして保存されるため、UI の言語を変更しても名前は変わりませんでした。公式ドキュメントによれば、プロジェクトの設定にある States からいつでも名前を変更(rename)できますが、今回は確認していません。

Planeの作業項目一覧。左メニューやボタンは日本語だが、状態名のBacklog・Todo・In Progress・Done・Cancelledとデモの作業項目名は英語
日本語に切り替えても、状態名(Backlog など)とデモの作業項目は英語のまま(Plane v1.4.3、2026年11月1日に弊社で撮影)

社内で導入する場合は、英語を読める人が管理画面を担当することに加え、状態名を日本語に付け直すかどうかも、あらかじめ決めておく必要があります。

Planeを使い始める前に決めたい設定

設定 既定と弊社での確認内容 やること
ポート 80・443 を全アドレスに公開 proxy のポートに host_ip: 127.0.0.1 を加え、外部からの接続は前段のリバースプロキシで受ける。更新のたびに確認する
DB・キューのパスワード 既定値は plane。URL の既定値にも plane が含まれる POSTGRES_PASSWORD と DATABASE_URL、RABBITMQ_PASSWORD と AMQP_URL をそれぞれセットで変更する
SECRET_KEY・LIVE_SERVER_SECRET_KEY・ファイル置き場の鍵(AWS_ACCESS_KEY_ID・AWS_SECRET_ACCESS_KEY) change-this-key-on-deployment(2つとも)/access-key/secret-key ランダムな値へ変更する(公式では openssl rand -hex 32 などを案内)
WEB_URL variables.env の設定は http://${APP_DOMAIN}(APP_DOMAIN=localhost) ポートを含め、実際に開く URL に合わせる
テレメトリ 管理者作成フォームでは既定でオン 送信を希望しない場合はチェックを外す。管理画面の General からあとで変更することもできる
新規登録 ログイン画面の右上に「Sign up」が表示された。ソースコードでも ENABLE_SIGNUP の既定は 1(招待なしで誰でも登録できる) 外部に公開する場合は、管理画面の Authentication にある「Allow anyone to sign up without an invite」をオフにするか検討する(今回は未確認)
タイムゾーン・言語 初期状態は UTC・英語 各利用者が環境設定で Asia/Tokyo・日本語に変更する

また、v1.4.3 のリリースノートには、アクセス制御の問題をまとめて修正したことに加え、セルフホストの環境は更新すべきだとの記載があります。構築後も定期的にリリースを確認する前提で、運用を計画してください。

まとめ:PlaneのセルフホストはメモリとUTC・英語の既定に注意

  • Plane v1.4.3(Community Edition)は、コンテナ12個でメモリ増分約1.07GB(約1.1GB)。初回起動時は API の応答まで237秒(up -d の実行開始から)かかった
  • 公式の compose では80・443が全アドレスで開く。127.0.0.1 に限定し、リバースプロキシを通じて公開する
  • DB・キューのパスワードは URL とあわせて変更する。SECRET_KEY・LIVE_SERVER_SECRET_KEY・ファイル置き場の鍵にもランダムな値を使う
  • 最初の管理者は /god-mode/ で作成する。テレメトリは既定でオンになっており、メール確認はなかった
  • 日本語へ切り替えるとメニューの多くが日本語になる。管理画面(開いた範囲)と状態名は英語のままで、タイムゾーンの初期設定は UTC
  • メンバーの招待(SMTP)、状態名の変更、バックアップと復元、多人数での運用は検証していない

OSSMatch では、Plane の概要と、Jira・Asana の代わりになるほかの OSS をまとめています。Jira・Asana の料金やプランは変わることがあるため、比較時には各社の公式サイトをご確認ください。

「タスク管理を自前のサーバーに移したい」「メモリ1GB 超の構成を載せるサーバーを決めたい」とお考えの方は、合同会社Edel Hearts のOSS導入支援へご相談ください。弊社で実際に構築した際に気づいた、ポートの公開範囲や日本語化の範囲に関する点も含め、率直にお伝えします。

出典