記事

Plane.so Docker 自架|Nginx反向代理設定とバックアップ手順まとめ

Plane.soをDockerで自架し、Nginxでドメイン反向代理を設定。バックアップと復元の具体的手順で安定運用を実現し、トラブルを未然に防ぎます。

Plane.so Docker 自架|Nginx反向代理設定とバックアップ手順まとめ

本記事は AI による翻訳をもとに作成されています。表現が不自然な箇所がありましたら、ぜひコメントでお知らせください。

記事一覧


Plane.so Docker Self-Hosted 自己ホスト記録

Plane セルフホスト Docker 自己構築、バックアップ、復元、Nginx ドメインリバースプロキシ設定チュートリアル

️⚠️️️️⚠️️️️⚠️️️️2025年アップデート️ ⚠️️️️⚠️️️️⚠️️️️

Plane.so の使用は推奨されません。理由は、Plane.so は初期にオープンソースプロジェクトとセルフホスティングのサポートで成長しましたが、後のバージョンでは多くの機能を有料プランに移行しました。セルフホスティングでも機能を有効にするには証明書の購入が必要で、ユーザー数にも制限があります。これは当初の期待とは異なります。また、料金プランが非常に複雑で、永続ライセンス、Pro、Business などがあり、たとえ購入しても新しいプランが追加され、新機能が新プラン限定になる可能性があります。

はじめに

Plane.so は無料でオープンソースの、Asana、Jira、Clickup に似たセルフホスト型のプロジェクト管理ツールです。2022年に設立され、最初のバージョンは2023年にリリースされましたが、現在も開発段階にあります。

詳細な使用方法と開発プロセスの紹介については、前回の記事「Plane.so 無料オープンソースでセルフホスト対応のAsana/Jira類似プロジェクト管理ツール」をご参照ください。本記事では Plane.so を Docker でセルフホストする手順のみを記録します。

セルフホスト版 Plane

  • Docker、K8s / クラウド、プライベートローカルインストールをサポート

  • Self-Hosted は Community Edition(公式略称 CE)版です

  • Self-Hosted は必ずしもすべてのクラウド版機能を含むわけではありません

  • Self-Hosted版の機能はデフォルトでCloud無料版と同等です。その他の機能を使用するには有料版へのアップグレードが必要です

  • 本文は Docker + プライベートローカルインストールの例です

  • 現在、公式には Cloud からのエクスポートおよび Self-Hosted バージョンへのインポートは提供されておらず、API を使って自分で連携する必要があります

  • 公式の案内:50人以上のユーザーの場合はマシン性能を向上させてください
    We have seen performance degradation beyond 50 users on our recommended 4 GB, 2vCPU infra. Increased infra will help with more users.

  • AGPL-3.0 license でオープンソース化されており、初版は2023年1月にリリースされました。現在も開発段階で、正式なリリース版はまだ提供されていません。

  • オープンソースであり、セルフホスト対応だからといって無料ではありません。

  • 文末には完全な設定例のリポジトリが添付されています。

Docker インストール

本文では詳しい説明は省略し、公式の Docker インストール方法 を参照して、ローカルの Docker 環境のインストールと設定を完了してください。以下は macOS の Docker を例とします。

Plane @ Docker インストール

参考 公式マニュアル

  1. ディレクトリ作成&インストールスクリプトのダウンロード
1
2
3
4
5
6
7
mkdir plane-selfhost

cd plane-selfhost

curl -fsSL -o setup.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh

chmod +x setup.sh
  1. Docker 環境がインストールされており、Docker が起動していることを確認してから、スクリプトを実行します。
1
./setup.sh

  • 1 を入力してインストール(イメージをダウンロード)します

  • Plane が使用するイメージのプル完了を待つ

  • Images Pulled 完了後、./plane-app フォルダに入り、.env 設定ファイルを開きます
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
APP_RELEASE=stable

WEB_REPLICAS=1
SPACE_REPLICAS=1
ADMIN_REPLICAS=1
API_REPLICAS=1

NGINX_PORT=80
WEB_URL=http://localhost
DEBUG=0
SENTRY_DSN=
SENTRY_ENVIRONMENT=production
CORS_ALLOWED_ORIGINS=http://localhost

# DB設定
PGHOST=plane-db
PGDATABASE=plane
POSTGRES_USER=plane
POSTGRES_PASSWORD=plane
POSTGRES_DB=plane
POSTGRES_PORT=5432
PGDATA=/var/lib/postgresql/data
DATABASE_URL=

# Redis設定
REDIS_HOST=plane-redis
REDIS_PORT=6379
REDIS_URL=

# シークレットキー
SECRET_KEY=60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5

# データストア設定
USE_MINIO=1
AWS_REGION=
AWS_ACCESS_KEY_ID=access-key
AWS_SECRET_ACCESS_KEY=secret-key
AWS_S3_ENDPOINT_URL=http://plane-minio:9000
AWS_S3_BUCKET_NAME=uploads
MINIO_ROOT_USER=access-key
MINIO_ROOT_PASSWORD=secret-key
BUCKET_NAME=uploads
FILE_SIZE_LIMIT=5242880

# Gunicornワーカー数
GUNICORN_WORKERS=1

# `ARM64`環境で対応する`APP_RELEASE`のDockerイメージがない場合は `DOCKER_PLATFORM` のコメントを外してください
# DOCKER_PLATFORM=linux/amd64
  • デフォルトでは :80 ポートで Plane サービスを起動します。ポートが競合する場合は変更してください。

  • 設定の調整を完了する(docker-compose.yml を直接変更することは推奨しません。将来的な Plane の更新でこのファイルが上書きされるためです)

Plane @ Docker 起動

  • 再度 ./setup.sh を実行する

  • 2 を入力して Plane を起動:

  • 起動が完了し、すべて正常に起動したことを確認したら、URL /god-mode/ を開いて初期設定を行います:

  • ここで設定するアカウントとパスワードは最高管理権限(God/Adminモード)です。

  • セキュリティ上の理由から、パスワードには特殊文字を含め、8文字以上で数字と大文字・小文字の英字を含める必要があります。そうでないと送信できません。

  • この手順を設定しないと、ホームページのログイン時に「Instance not configured. Please contact your administrator.」と表示されます。

Plane God/Admin Mode 管理バックエンド

Plane の URL の /god-mode/ からアクセスでき、ここで Plane サービス全体の環境設定ができます。

一般設定:

一般設定。

Email:

  • Email 通知の SMTP 設定

SMTPサーバーを自分で構築するのが面倒な場合は、GMAIL SMTPを直接使用してメールを送信できます:

もう一つのアイデアとして、Plane は現時点で Slack 通知をサポートしていないため、SMTP サーバーを立てて、Python スクリプトでメール通知を Slack 通知に変換する方法もあります。

認証

Plane サービスのログイン認証方法について、Google 組織内のメールアカウントのみを使用可能にしたい場合は、「Password based login」を無効にして「Google」ログイン機能のみを有効にします。その後、Google ログインから組織アカウント限定のログイン用アプリを生成してください。

人工知能

AI 関連の設定は、現在あまり機能していません。Key を設定すると、Issue 上で AI による Issue Description の作成支援が利用できます。

Planeのイメージ

同様に現在はあまり機能しませんが、Unsplash Key を設定すると、プロジェクトのカバー画像選択時に Unsplash API を使って画像を取得し適用できます。

⚠️⚠️声明⚠️⚠️

以上は 2024–05–25 v0.20-Dev 版の使用紹介です。公式は引き続き新機能の開発とユーザー体験の改善に取り組んでいるため、最新版の設定を優先してください。

God/Adminモードを設定すれば、ほぼCloud版と同じように使用できます。

詳細な使用方法と開発プロセスの紹介については、前回の記事「Plane.so 無料オープンソースかつセルフホスト対応の Asana/Jira 類似プロジェクト管理ツール」をご覧ください。

Plane @ Docker アップグレード

前述の通り、Plane はまだ開発段階にあり、約2〜3週間ごとに新バージョンがリリースされます。変更内容が大きいこともあるため、Release Note をよく確認し、必要な設定変更を確認して問題がなければアップグレードを行ってください。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後はバックアップスクリプトが正常に動作するか必ず確認してください。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後は必ずバックアップスクリプトが正常に動作するか確認してください。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後はバックアップスクリプトが正常に動作するか必ず確認してください。

Planeは開発中で不安定なため、アップグレード時にデータが失われる可能性があります。操作前に必ずバックアップを行うことを推奨します。バックアップ方法は以下で説明します。

アップグレード方法:

  • 再度 ./setup.sh に入る

  • 5 を入力して Plane をアップグレードします(実際には新しいイメージを取得して再起動するだけです)

  • Images Pulled 完了後、サービスを再起動できます

  • アップグレード後、.env ファイルが変更される可能性があります。リリースノートを参照して調整してください。

Plane @ Docker バックアップ

0.20-dev から ./setup.sh に Backup Data コマンドが追加されましたが、公式マニュアル では Backup Data を彼らの One 有料サービスにリストアする方法のみが記載されています。そのため、ここでは自分でアップロードファイル、Redis、Postgresql Docker コンテナをバックアップする方法を使います。

バックアップスクリプト

./plane-backup.sh :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash

# Planeのデータをバックアップ
# Author: zhgchgli (https://zhgchg.li)

##### 実行方法
# ./plane-backup.sh [バックアップ先フォルダパス] [PlaneのDockerプロジェクト名] [バックアップファイルの最大保存数、超過したら古いバックアップを削除]
# 例: ./plane-backup.sh /backup/plane plane-app 14
###### 設定

# バックアップ先フォルダ
backup_dir=${1:-.}

# PlaneのDockerプロジェクト名
docker_project_name=${2:-"plane-app"}

# バックアップファイルの最大保存数、超過したら古いバックアップを削除
keep_count=${3:-7}

######

# ディレクトリの存在確認
if [ ! -d "$backup_dir" ]; then
  echo "バックアップ失敗、ディレクトリが存在しません:$backup_dir"
  exit;
fi

# 古いものを削除
count=$(find "$backup_dir" -mindepth 1 -type d \\| wc -l)

while [ "$count" -ge $keep_count ]; do
    oldest_dir=$(find "$backup_dir" -mindepth 1 -maxdepth 1 -type d \\| while read dir; do
        # statコマンドで更新時間を取得
        if [[ "$OSTYPE" == "darwin"* ]]; then
            # macOSの場合
            echo "$(stat -f %m "$dir") $dir"
        else
            # Linuxの場合
            echo "$(stat -c %Y "$dir") $dir"
        fi
    done \\| sort -n \\| head -n 1 \\| cut -d ' ' -f 2-)
    
    echo "最も古いバックアップを削除します: $oldest_dir"
    rm -rf "$oldest_dir"

    count=$(find "$backup_dir" -mindepth 1 -type d \\| wc -l)
done
#

# 新規バックアップ
date_dir=$(date "+%Y_%m_%d_%H_%M_%S")
target_dir="$backup_dir/$date_dir"

mkdir -p "$target_dir"

echo "バックアップ先: $target_dir"

# PlaneのPostgresql .SQLダンプ
docker exec -i $docker_project_name-plane-db-1 pg_dump --dbname=postgresql://plane:plane@plane-db/plane -c > $target_dir/dump.sql

# Planeのredis
docker run --rm -v $docker_project_name-redis-1:/volume -v $target_dir:/backup ubuntu tar cvf /backup/plane-app_redis.tar /volume > /dev/null 2>&1

# Planeのアップロードファイル
docker run --rm -v ${docker_project_name}_uploads:/volume -v $target_dir:/backup ubuntu tar cvf /backup/plane-app_uploads.tar /volume > /dev/null 2>&1

echo "バックアップ成功!"

初めてスクリプトファイルを作成する際は、必ず先に以下を実行してください: chmod +x ./plane-backup.sh

実行方法:

1
./plane-backup.sh [バックアップ先フォルダのパス] [Plane の Docker プロジェクト名] [Plane バックアップファイルの最大保持数、超過したら最も古いバックアップを削除]
  • バックアップ先のフォルダパス例: /backup/plane/ または ./

  • Plane の Docker プロジェクト名: Plane Docker Compose プロジェクト名

  • Plane のバックアップファイル最大保持数、超過した場合は最も古いバックアップを削除:デフォルトは7件

実行例:

1
./plane-backup.sh /backup/plane plane-app 14

  • 実行時には Plane が起動していることを確認してください。

上記のコマンドを Crontab に追加するだけで、Plane の定期自動バックアップが可能です。

実行エラーでコンテナが見つからない場合は、Plane の Docker Compose プロジェクト名を確認するか、スクリプトと Docker コンテナ名(公式で名前が変更されている可能性があります)をチェックしてください。

復元スクリプト

./plane-restore.sh :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/bin/bash

# Planeのバックアップデータを復元する
# Author: zhgchgli (https://zhgchg.li)

##### 実行方法
# ./plane-restore.sh

# 
inputBackupDir() {
    read -p "復元するPlaneのバックアップフォルダを入力してください (例: /backup/plane/2024_05_25_19_14_12): " backup_dir
}
inputBackupDir

if [[ -z $backup_dir ]]; then
    echo "バックアップフォルダを指定してください (例: sh /backup/docker/plane/2024_04_09_17_46_39)"
    exit;
fi

inputDockerProjectName() {
    read -p "PlaneのDockerプロジェクト名を入力してください(空欄でデフォルトの plane-app を使用): " input_docker_project_name
}
inputDockerProjectName
 
docker_project_name=${input_docker_project_name:-"plane-app"}

confirm() {
    read -p "Plane.soのデータを復元してもよろしいですか? [y/N] " response
    
    # 応答を確認
    case "$response" in
        [yY][eE][sS]\\|[yY]) 
            true
            ;;
        *)
            false
            ;;
    esac
}

if ! confirm; then
    echo "操作がキャンセルされました。"
    exit
fi

# 復元処理

echo "復元中..."

docker cp $backup_dir/dump.sql $docker_project_name-plane-db-1:/dump.sql && docker exec -i $docker_project_name-plane-db-1 psql postgresql://plane:plane@plane-db/plane -f /dump.sql

# Redisの復元
docker run --rm -v ${docker_project_name}-redis-1:/volume -v $backup_dir:/backup alpine tar xf /backup/plane-app_redis.tar --strip-component=1 -C /volume

# アップロードファイルの復元
docker run --rm -v ${docker_project_name}_uploads:/volume -v $backup_dir:/backup alpine tar xf /backup/plane-app_uploads.tar --strip-component=1 -C /volume

echo "復元に成功しました!"

初めてスクリプトファイルを作成する際は、必ず先に以下を実行してください:chmod +x ./plane-restore.sh

実行方法:

1
2
3
4
 ./plane-restore.sh
入力:復元したい Plane バックアップフォルダ (例: /backup/plane/2024_05_25_19_14_12)
入力:Plane の Docker プロジェクト名(空欄の場合はデフォルトの plane-app を使用)
入力:本当に Plane.so のデータを復元しますか? [y/N] y

Restore Success! が表示された後、Plane を再起動する必要があります。

Plane の ./setup.sh4 を入力して再起動:

サイトに戻り、リロードして Workspace にログインし、復元が成功したか確認してください:

完了!

⚠️バックアップとリストアの手順は定期的にテストし、トラブル時にバックアップが役立つことを確認してください。

Plane @ Docker アップグレード

前述の通り、Plane はまだ開発段階にあり、約2〜3週間ごとに新バージョンがリリースされます。変更内容も大きい場合があるため、Release Note をよく確認し、設定の変更点を把握した上で問題がなければアップグレードを行うことをおすすめします。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後はバックアップスクリプトが正常に動作するか必ず確認してください。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後は、バックアップスクリプトが正常に動作するか必ず確認してください。

⚠️アップグレード前に必ずバックアップを取ってください!⚠️ アップグレード後は、バックアップスクリプトが正常に動作するか必ず確認してください。

Planeは開発中のため不安定であり、アップグレードによるデータ損失を保証できません。操作前に必ずバックアップを取ってください。

アップグレード方法:

  • 再度 ./setup.sh に入る

  • 5 を入力して Plane をアップグレードします(実際には新しいイメージをプルして再起動するだけです)

  • 画像のプルが完了したらサービスを再起動できます

  • アップグレード後、.env ファイルが変更されている可能性があります。リリースノートを参照して調整してください。

  • アップグレード完了後は、必ずスケジュールされたバックアップスクリプトが正常に動作しているか確認してください。

  • コンテナ名が変更された場合は、バックアップ、リストア、および以下で紹介する Nginx リバースプロキシスクリプトも変更する必要があります。

Nginx + Plane を使ったリバースプロキシ設定

私たちは同時に複数の Web サービスを提供する必要がある場合があります。例えば、Self-Hosted LibreChat (ChatGPT)Self-Hosted Wiki.jsSelf-Hosted Bitwardenなどです。各サービスはデフォルトで 80 ポートを使用しますが、利用時に URL でポートを指定したくない場合は、Docker 上で Nginx を起動し、Web サービスのリバースプロキシとして利用する必要があります。

効果は以下の通りです:

1
2
3
4
5
chat.zhgchg.li -> LibreChat :8082
wiki.zhgchg.li -> Wiki.js :8083
pwd.zhgchg.li -> Bitwarden :8084

plane.zhgchg.li -> Plane.so :8081

上記の効果を達成するには、まず ./plane-selfhost ディレクトリを統一ディレクトリに移動する必要があります。ここでは webServices と名付けます。

最終ディレクトリ構成プレビュー:

webServices/plane-selfhost/plane-app/.env 環境設定ファイルの調整:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
APP_RELEASE=stable

WEB_REPLICAS=1
SPACE_REPLICAS=1
ADMIN_REPLICAS=1
API_REPLICAS=1

NGINX_PORT=8081
WEB_URL=http://plane.zhgchg.li
DEBUG=0
SENTRY_DSN=
SENTRY_ENVIRONMENT=production
CORS_ALLOWED_ORIGINS=http://plane.zhgchg.li

# DB設定
PGHOST=plane-db
PGDATABASE=plane
POSTGRES_USER=plane
POSTGRES_PASSWORD=plane
POSTGRES_DB=plane
POSTGRES_PORT=5432
PGDATA=/var/lib/postgresql/data
DATABASE_URL=

# Redis設定
REDIS_HOST=plane-redis
REDIS_PORT=6379
REDIS_URL=

# シークレットキー
SECRET_KEY=60gp0byfz2dvffa45cxl20p1scy9xbpf6d8c5y0geejgkyp1b5

# データストア設定
USE_MINIO=1
AWS_REGION=
AWS_ACCESS_KEY_ID=access-key
AWS_SECRET_ACCESS_KEY=secret-key
AWS_S3_ENDPOINT_URL=http://plane-minio:9000
AWS_S3_BUCKET_NAME=uploads
MINIO_ROOT_USER=access-key
MINIO_ROOT_PASSWORD=secret-key
BUCKET_NAME=uploads
FILE_SIZE_LIMIT=5242880

# Gunicorn ワーカー数
GUNICORN_WORKERS=1

# `ARM64`環境で対応する`APP_RELEASE`のDockerイメージがない場合は`DOCKER_PLATFORM`のコメントを外してください
# DOCKER_PLATFORM=linux/amd64
  • URLを希望のものに置き換えます。例として plane.zhgchg.li を使用します。

  • NGINX_PORT を 8081 に変更し、元の 80 ポートをリバースプロキシ用の Nginx に変更する

webServices/ に Nginx 用の docker-compose.yml ファイルを作成します:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
version: '3.8'

services:
  webServices-nginx:
    image: nginx
    restart: unless-stopped
    volumes:
      - ./nginx/conf.d/plane.zhgchg.li.conf:/etc/nginx/conf.d/plane.zhgchg.li.conf

    ports:
      - 80:80
      - 443:443

    networks:
      - plane-app_default # plane が使用するネットワーク
networks:
  plane-app_default:
    external: true
  • PlaneアプリのネットワークをNginxに追加する必要があります

webServices/ 以下に /conf.d ディレクトリと plane.zhgchg.li.conf ファイルを作成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# plane.zhgchg.li 用

# http の例:
server {
    listen 80;
    server_name plane.zhgchg.li;

    client_max_body_size 0;

    location / {
        proxy_pass http://plane-app-proxy-1; # plane proxy-1 サービス名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}


# https & http の例:
# server {
#     listen 443 ssl;
#     server_name plane.zhgchg.li;

#     # ssl
#     ssl_certificate             /etc/nginx/conf/ssl/zhgchgli.crt; # ご自身のドメインの crt に置き換え & key を docker-compose.yml の volumes にマウントするのを忘れずに
#     ssl_certificate_key         /etc/nginx/conf/ssl/zhgchgli.key; # ご自身のドメインの key に置き換え & key を docker-compose.yml の volumes にマウントするのを忘れずに
#     ssl_prefer_server_ciphers   on;
#     ssl_protocols               TLSv1.1 TLSv1.2;
#     ssl_ciphers                 "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
#     ssl_ecdh_curve              secp384r1; # nginx >= 1.1.0 が必要
#     ssl_session_timeout         10m;
#     ssl_session_cache           shared:SSL:10m;
#     add_header                  Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

#     client_max_body_size 0;

#     location / {
#         proxy_pass http://plane-app-proxy-1; # plane proxy-1 サービス名
#         proxy_set_header Host $host;
#         proxy_set_header X-Real-IP $remote_addr;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header X-Forwarded-Proto $scheme;
#     }
# }

# server {
#     listen 80;
#     server_name plane.zhgchg.li;
#     return 301 https://plane.zhgchg.li$request_uri;
# }
  • proxy_pass に Plane ネットワーク内のサービス入口を入力する

  • ここでは HTTP を例として示しています。HTTPS をサポートする場合は、自己署名証明書 の作成方法を参考にしてください。

複数の docker-compose.yml を個別に起動し、その後 Nginx のリバースプロキシを起動するため、すべての起動スクリプトを一つのシェルスクリプトにまとめることができます。

webServices/ /start.sh ファイルを作成:

1
2
3
4
5
6
7
8
9
10
#!/bin/sh

# 起動スクリプトのパッケージ化

# まず Plane などの他のサービスを起動
docker compose -f ./plane-selfhost/plane-app/docker-compose.yaml --env-file ./plane-selfhost/plane-app/.env up -d


# 最後に Nginx を起動
docker compose -f ./docker-compose.yml --env-file ./.env up -d

初めてスクリプトファイルを作成する際は、必ず先に: chmod +x ./start.sh を実行してください。

停止サービス用のスクリプトも作成できます。webServices/ ディレクトリに /stop.sh ファイルを作成:

1
2
3
4
5
6
7
#!/bin/sh

# 停止スクリプトのパッケージ化

docker compose -f ./plane-selfhost/plane-app/docker-compose.yaml --env-file ./plane-selfhost/plane-app/.env down

docker compose -f ./docker-compose.yml --env-file ./.env down

初めてスクリプトファイルを作成するときは、必ず先に以下を実行してください: chmod +x ./stop.sh

起動

  • Nginxリバースプロキシ+Planeサービス+その他をパッケージ化した後、./start.sh を実行してすべてのサービスを起動できます。
1
./start.sh

DNS 設定

社内ネットワークに構築する場合、IT部門に依頼して社内DNSに plane.zhgchg.li → サーバーのIPアドレスのDNSレコードを追加してください。

1
plane.zhgchg.li サーバーのIPアドレス

もし自分のパソコンでローカルテストをする場合は、/private/etc/hosts ファイルに以下を追加してください:

1
127.0.0.1 plane.zhgchg.li

DNS設定が完了したら plane.zhgchg.li にアクセスして Plane を開けます!

よくある質問

  1. Nginx が起動に失敗し、再起動を繰り返している場合、ログに nginx: [emerg] host not found in upstream と表示されます。これは Nginx のリバースプロキシが Plane サービスを見つけられないことを意味します。http://plane-app-proxy-1 の名前が正しいか、Nginx の docker-compose.yml のネットワーク設定が正しいかを確認してください。

  2. 502 Bad Gateway が表示される
    起動順序が間違っている可能性があります(Nginx のリバースプロキシは最後に起動してください)または Plane プロセスが再起動された場合、再起動を試みると解決することが多いです。

  3. Nginx のデフォルトホームページ welcome to nginx! が表示される場合、リバースプロキシを使用すると元の IP:80 で Plane にアクセスできなくなり、URL を使ってアクセスする必要があります。

  4. URLが解決できず、ホストが見つかりません。DNSやネットワーク設定が正常かご確認ください。

⚠️⚠️セキュリティ問題⚠️⚠️

Plane プロジェクトは現在開発中のオープンソースであり、深刻なシステム脆弱性が存在する可能性が否定できません。最悪の場合、侵入経路となる恐れがあります。そのため、Plane.so Self-Hosted を公開ネットワーク上に構築することは推奨しません。接続にはトンネル、証明書、VPN などの追加のセキュリティ認証を設けることを推奨します。社内ネットワークに設置する場合も、なるべく分離して運用してください。

開発中のプロジェクトにはバグや体験、安全上の問題があることがあります。Plane.so チームにどうかご理解とご協力をお願いいたします。問題があれば下記でご報告ください:

完全なセルフホスト用リポジトリ例のダウンロード

Plane.so の使用と Scrum プロセス統合ガイド

ご質問やご意見がありましたら、こちらからご連絡ください

PostZMediumToMarkdown によって Medium から変換されました。


🍺 Buy me a beer on PayPal

👉👉👉 Follow Me On Medium! (1,053+ Followers) 👈👈👈

本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。

Improve this page on Github.

本記事は著者により CC BY 4.0 に基づき公開されています。

© ZhgChgLi. All rights reserved.
閲覧数: 802,415+, 最終更新日時: 2026-01-15 11:14:58 +08:00

本サイトは Chirpy テーマを使用し、Jekyll 上で構築されています。
Medium の記事は ZMediumToMarkdown により変換されています。