Joplin Server のインストール方法:Docker Compose で作るプライベート同期サーバー

Joplin Server を Docker Compose で構築する実用ガイド。PostgreSQL、APP_BASE_URL、管理者初期設定、一般ユーザーの有効化、クライアント同期、HTTPS リバースプロキシ、バックアップを整理します。

Joplin Server は、Joplin 公式の同期サーバーです。自分で立てれば、ノートデータを自分の VPS、NAS、または家庭用サーバーに置き、デスクトップやスマートフォンのクライアントを第三者のクラウドストレージに頼らず同期できます。

現在いちばん扱いやすい方法は Docker Compose です。PostgreSQL コンテナを 1 つ、Joplin Server コンテナを 1 つ用意し、APP_BASE_URL を正しく設定すれば使い始められます。

この手順は、Ubuntu、Debian、CentOS、Synology、Unraid、OpenMediaVault など、Docker が動く環境を想定しています。

事前準備

始める前に、次を確認してください。

  • 長時間稼働できるサーバーまたは NAS;
  • Docker と Docker Compose がインストール済み;
  • LAN 内だけで同期するなら内部 IP;
  • 外部から同期するなら、ドメイン名と HTTPS リバースプロキシ;
  • データベース用の強いパスワード。サンプルのまま使わないこと。

家の中の数台だけで同期するなら、http://内網IP:22300 のようなアドレスで動かせます。外出先のスマートフォンからも同期したい場合は、Nginx Proxy Manager、Caddy、Traefik などで HTTPS を使ってください。裸の HTTP サービスをそのままインターネットに公開するのは避けたほうが安全です。

Joplin 用の作業ディレクトリを作る

まず、Joplin Server の設定とデータベースデータを置くディレクトリを作ります。

1
2
mkdir -p /data/joplin
cd /data/joplin

パスは /opt/joplin/volume1/docker/joplin など、自分の環境に合わせて構いません。重要なのは、PostgreSQL のデータディレクトリを永続化することです。コンテナを消したときにデータまで消えないようにします。

docker-compose.yml を書く

作業ディレクトリで Compose ファイルを作成します。

1
nano docker-compose.yml

次の設定を貼り付けます。

 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
version: '3.8'

services:
  db:
    image: postgres:16
    container_name: joplin-db
    restart: unless-stopped
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=joplin
      - POSTGRES_PASSWORD=change_this_database_password
      - POSTGRES_DB=joplin

  app:
    image: joplin/server:latest
    container_name: joplin-app
    depends_on:
      - db
    restart: unless-stopped
    ports:
      - "22300:22300"
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=http://your-server-ip:22300
      - DB_CLIENT=pg
      - POSTGRES_USER=joplin
      - POSTGRES_PASSWORD=change_this_database_password
      - POSTGRES_DATABASE=joplin
      - POSTGRES_HOST=db
      - POSTGRES_PORT=5432

特に変更が必要なのは次の 2 つです。

  • POSTGRES_PASSWORD:データベースのパスワード。dbapp の両方で完全に一致させます;
  • APP_BASE_URL:Joplin クライアントがサーバーへアクセスする固定 URL。

APP_BASE_URL は非常に重要です。クライアントが実際に開けるアドレスを指定してください。

  • LAN のみ:http://192.168.1.10:22300
  • 公開 IP:http://your-public-ip:22300
  • ドメインと HTTPS:https://joplin.example.com

あとでアクセス先を変える場合は、APP_BASE_URL も変更してサービスを再起動してください。そうしないと、クライアント同期、Web のリダイレクト、添付ファイルリンクで問題が出ることがあります。

Joplin Server を起動する

docker-compose.yml があるディレクトリで実行します。

1
docker compose up -d

コンテナ状態を確認します。

1
docker compose ps

初回起動に時間がかかる場合はログを見ます。

1
docker compose logs -f

通常、Joplin Server は 22300 ポートで待ち受けます。ブラウザーで設定した APP_BASE_URL を開き、ログインページが表示されれば基本的なデプロイは成功です。

初回管理者ログイン

Joplin Server の初期管理者アカウントは次のとおりです。

1
admin@localhost

初期パスワードは次のとおりです。

1
admin

初回ログイン後、最初に必ず管理者パスワードを変更してください。特にインターネットからアクセスできる場合、初期パスワードを残すのは危険です。

管理画面にログインしたら、Change Password ページで admin を強いパスワードに変更します。

普段使いの同期アカウントを作る

日常のノート同期に管理者アカウントを直接使うのはおすすめしません。一般ユーザーを作成し、PC やスマートフォンではそのアカウントを使うほうが安全です。

管理画面での手順は次のとおりです。

  1. Users を開く;
  2. Add user をクリックする;
  3. 普段使うメールアドレスとパスワードを入力する;
  4. ユーザーを作成する。

ここでよくある落とし穴があります。SMTP メールサーバーを設定していない場合、Joplin Server は有効化メールを送ったと表示しますが、実際には受信できません。

回避方法は簡単です。

  1. 管理画面に戻る;
  2. Emails メニューを開く;
  3. 未送信の有効化メールを見つける;
  4. 中の有効化リンクをコピーする;
  5. ブラウザーの新しいタブで開き、アカウントを有効化する。

有効化後、この一般ユーザーでクライアント同期ができます。

Joplin クライアントの同期設定

デスクトップ版またはモバイル版の Joplin App で設定します。

  1. 設定 または Options を開く;
  2. 同期 または Synchronization に入る;
  3. 同期先として Joplin Server を選ぶ;
  4. Joplin Server URLAPP_BASE_URL を入力する;
  5. Email / Username に、有効化した一般ユーザーのメールアドレスを入力する;
  6. Password にそのユーザーのパスワードを入力する;
  7. Check sync configuration を実行する。

チェックが通れば保存して同期を開始できます。

失敗する場合は、まず次を確認します。

  • クライアントから APP_BASE_URL をブラウザーで開けるか;
  • APP_BASE_URL が Compose ファイルと一致しているか;
  • 一般ユーザーが作成済みだけでなく、有効化済みか。

外部アクセスには HTTPS を使う

家庭内 Wi-Fi や LAN だけで使うなら HTTP でも通常は問題ありません。外部から同期するなら、リバースプロキシと HTTPS を使うのがおすすめです。

よく使われる方法は次のとおりです。

  • Nginx Proxy Manager;
  • Caddy;
  • Traefik;
  • 手動の Nginx 設定。

リバースプロキシを使う場合、APP_BASE_URL はクライアントが最終的にアクセスする HTTPS アドレスにします。

1
- APP_BASE_URL=https://joplin.example.com

Nginx を手動で設定する場合、少なくとも次の 2 点に注意します。

  • アップロード上限を上げる。例:client_max_body_size 100M;。大きな添付ファイル付きノートの同期失敗を避けるためです;
  • HostX-Forwarded-ForX-Forwarded-Proto などの header を正しく転送し、Joplin Server が URL やプロトコルを誤判定しないようにする。

簡単な Nginx リバースプロキシ例です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
    listen 443 ssl http2;
    server_name joplin.example.com;

    client_max_body_size 100M;

    location / {
        proxy_pass http://127.0.0.1:22300;
        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;
    }
}

Nginx Proxy Manager を使う場合は、通常ドメインをサーバーの 22300 ポートへプロキシし、SSL 証明書を有効にするだけで済みます。Compose の APP_BASE_URL も HTTPS ドメインに変更するのを忘れないでください。

よくある問題

APP_BASE_URL を変更しても反映されない

docker-compose.yml を変更したら、コンテナを再作成します。

1
docker compose up -d

それでもおかしい場合は、コンテナ内の環境変数が本当に更新されているか確認します。ファイルを書き換えただけでサービスを再起動していない、というケースがよくあります。

クライアント同期でネットワークエラーが出る

まず次を確認してください。

  • スマートフォンや PC のブラウザーで Joplin Server を開けるか;
  • リバースプロキシの証明書が正常か;
  • APP_BASE_URL がクライアントから実際にアクセスするアドレスか;
  • ファイアウォールで 22300 または HTTPS ポートが許可されているか;
  • 一般ユーザーが有効化済みか。

大きな添付ファイルの同期に失敗する

Nginx や他のリバースプロキシ経由でアクセスしている場合、まずアップロードサイズ制限を確認してください。Nginx のデフォルト制限は小さいことがあるため、次のように設定します。

1
client_max_body_size 100M;

添付ファイルがさらに大きい場合は、値を上げます。

SMTP なしでも使えるか

使えます。個人や家庭用途なら SMTP なしでも動きます。ユーザー作成後の有効化メールは、管理画面の Emails ページから直接確認し、有効化リンクをコピーできます。

複数人のチームで長期利用するなら、SMTP を設定したほうがユーザー登録、パスワードリセット、通知がきちんと動きます。

バックアップのすすめ

Joplin Server で最も重要なデータは PostgreSQL にあります。今回の例では次の場所です。

1
/data/joplin/data/postgres

このディレクトリを定期的にバックアップするか、PostgreSQL の pg_dump でデータベースバックアップを取ってください。Joplin Server コンテナだけをバックアップしても意味は薄いです。コンテナは再取得できますが、同期データはデータベースにあります。

クライアント側にもノートデータのコピーは残りますが、それだけを唯一のバックアップにしないほうが安全です。サーバーデータベースのバックアップ + クライアント側コピー + 必要に応じた JEX エクスポート、という形が安定します。

参考ソース

Synology DSM 7.x で Joplin Server を運用する

Synology DSM 7.x で Joplin Server をデプロイするなら、Container Manager の「プロジェクト」機能を使うのが最も簡単です。中身は Docker Compose で、PostgreSQL データベースコンテナと Joplin Server コンテナを 1 つずつ用意し、イメージ取得、コンテナ作成、日常的な起動管理は Synology に任せます。

この記事は Synology 専用版です。File Station のディレクトリ、Container Manager のプロジェクト、LAN アクセス、外部同期、リバースプロキシなど、実際の操作に重点を置きます。Linux サーバーで docker-compose.yml を手書きしたことがある人には馴染みのある流れです。Synology の GUI 中心で使っている人も、そのまま進められます。

どんな場面に向いているか

Joplin Server は、ノートの同期データを自分の機器に置きたいユーザーに向いています。Windows、macOS、iOS、Android などの Joplin クライアントを、自分のサーバー経由で同期できます。第三者のクラウドストレージに頼る必要がありません。

Synology にデプロイするのが向いているのは、次のようなケースです。

  • NAS が常時稼働しており、家庭用または個人用の同期サーバーにできる;
  • LAN 内だけで PC とスマートフォンを同期したい;
  • Tailscale、WireGuard、リバースプロキシで外部同期したい;
  • SSH だけでなく、Container Manager の GUI でコンテナを管理したい。

Joplin を一時的に試すだけなら、必ずしも Joplin Server は必要ありません。Joplin は WebDAV、S3、Dropbox などの同期方式もサポートしています。ただし長期的にセルフホストするなら、Joplin Server のほうが機能としてまとまっています。

ステップ 1:File Station でディレクトリを準備する

Synology の File Station を開き、docker 共有フォルダに入ります。

次のディレクトリを作成します。

1
docker/joplin

さらに joplin の中にサブディレクトリを作ります。

1
postgres_data

最終的な構造はおおよそ次のようになります。

1
2
3
docker/
└── joplin/
    └── postgres_data/

postgres_data は PostgreSQL データベースを保存するためのものです。Joplin Server の同期データは主にデータベースに入るため、このディレクトリは永続化が必須です。後でコンテナを更新または再作成しても、このディレクトリが残っていればデータは消えません。

ステップ 2:Container Manager でプロジェクトを作成する

Synology の Container Manager を開きます。

  1. 左側の プロジェクト をクリックする;
  2. 新規作成 または Create をクリックする;
  3. プロジェクト名を joplin-server にする;
  4. 先ほど作成した /docker/joplin をパスに選ぶ;
  5. ソースとして docker-compose.yml を作成 を選ぶ。

次の Compose 設定を貼り付けます。

 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
version: '3'

services:
  db:
    image: postgres:16
    container_name: joplin-db
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD=change_this_database_password
      - POSTGRES_USER=joplin_user
      - POSTGRES_DB=joplin_db

  app:
    image: joplin/server:latest
    container_name: joplin-server
    depends_on:
      - db
    ports:
      - "22300:22300"
    restart: unless-stopped
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=http://192.168.1.100:22300
      - DB_CLIENT=pg
      - POSTGRES_PASSWORD=change_this_database_password
      - POSTGRES_DATABASE=joplin_db
      - POSTGRES_USER=joplin_user
      - POSTGRES_PORT=5432
      - POSTGRES_HOST=db

必ず変更する箇所は 2 つです。

  • POSTGRES_PASSWORD:データベースのパスワード。2 箇所で完全に一致させます;
  • APP_BASE_URL:Joplin クライアントが実際にサーバーへアクセスするアドレス。

LAN 内だけで使う場合は、APP_BASE_URL を Synology の LAN IP にします。

1
- APP_BASE_URL=http://192.168.1.100:22300

HTTPS リバースプロキシを設定済みなら、外部ドメインを直接指定します。

1
- APP_BASE_URL=https://joplin.example.com

APP_BASE_URL は適当に入れてはいけません。Joplin クライアント同期、Web リダイレクト、添付ファイルリンクはすべてこれに依存します。実際にアクセスするアドレスをそのまま書いてください。

問題なければ、次へ進んで完了します。Container Manager が postgres:16joplin/server:latest を自動的にダウンロードし、2 つのコンテナを起動します。

ステップ 3:コンテナ状態を確認する

プロジェクト作成後、Container Manager のプロジェクトページで joplin-server を確認します。

通常は次の 2 つのコンテナがあります。

  • joplin-db
  • joplin-server

どちらも緑色で実行中なら、次へ進めます。

正常に起動しない場合は、まずプロジェクトログを見てください。よくある原因は次のとおりです。

  • データベースパスワードが 2 箇所で一致していない;
  • postgres_data ディレクトリの権限に問題がある;
  • Synology の 22300 ポートが他のサービスに使われている;
  • YAML のインデントが崩れている。

ステップ 4:Joplin Server に初回ログインする

ブラウザーで次を開きます。

1
http://群晖IP:22300

例:

1
http://192.168.1.100:22300

デフォルト管理者アカウントは次のとおりです。

1
admin@localhost

デフォルトパスワードは次のとおりです。

1
admin

初回ログイン後、すぐに管理者パスワードを変更してください。特に外部アクセスを設定する予定がある場合、この手順は絶対に飛ばさないほうがよいです。

管理画面で管理者メールアドレスを変更できる場合は、自分のメールに変えておくと後で識別しやすくなります。

ステップ 5:一般ユーザーを作るべきか

1 人で使うだけなら、変更後の管理者アカウントで同期しても動きます。ただし、より整った運用にするなら、一般ユーザーを作成し、そのユーザーでノートを同期し、管理者は管理画面専用にするのがおすすめです。

管理画面での手順です。

  1. Users に入る;
  2. Add user をクリックする;
  3. メールアドレスとパスワードを入力する;
  4. 保存する。

SMTP を設定していない場合、システムは有効化メールを送信したと表示しますが、実際には受信できません。その場合は管理画面の Emails ページに入り、未送信の有効化メールを見つけ、中の有効化リンクをコピーしてブラウザーで開けばアカウントを有効化できます。

個人利用なら SMTP なしでも問題ありません。複数人で長期利用する場合は、後で SMTP を設定したほうが登録、有効化、パスワードリセットが楽になります。

ステップ 6:Joplin クライアントの同期を設定する

PC またはスマートフォンの Joplin クライアントを開きます。

  1. Options / Settings に入る;
  2. Synchronization を開く;
  3. 同期先に Joplin Server を選ぶ;
  4. Joplin Server URL に、先ほど設定した APP_BASE_URL を入力する;
  5. ユーザー名に管理者メールまたは一般ユーザーのメールを入力する;
  6. 対応するパスワードを入力する;
  7. Check synchronization configuration をクリックする。

チェックが成功したら保存し、同期を開始します。

失敗する場合は、まずクライアントからブラウザーで Joplin Server を開けるか確認します。多くの同期問題は Joplin 本体ではなく、APP_BASE_URL の誤り、未有効化アカウント、リバースプロキシ証明書の異常、スマートフォンが同じネットワークにいないことが原因です。

外部同期案 1:Tailscale または WireGuard

最も安全で扱いやすい外部同期方法は、スマートフォンや PC を VPN で自宅ネットワークに戻すことです。

よく使われる選択肢は次のとおりです。

  • Tailscale;
  • WireGuard;
  • ZeroTier。

この方法の利点は、Joplin Server を直接インターネットに公開しなくてよいことです。Joplin クライアントの URL は、引き続き Synology の LAN アドレスで構いません。

1
http://192.168.1.100:22300

外出先では、まず Tailscale または WireGuard に接続し、その後 Joplin を開いて同期します。

公開 IP、DDNS、証明書、ポート転送を扱いたくないなら、このルートが最も安定しています。欠点は、外部デバイスごとに VPN 接続が必要なことです。

外部同期案 2:Synology リバースプロキシと HTTPS

どのネットワークからでも Joplin を直接同期したい場合は、HTTPS ドメインを設定します。

大まかな流れは次のとおりです。

  1. ドメインまたは DDNS を用意する;
  2. ルーターで 443 ポートを Synology に転送する;
  3. Synology の コントロールパネル -> ログインポータル -> 詳細 -> リバースプロキシサーバー で新しいルールを作成する;
  4. 送信元を https://joplin.example.com:443 にする;
  5. 宛先を http://127.0.0.1:22300 または http://群暉內網IP:22300 にする;
  6. ドメイン用の HTTPS 証明書を取得して割り当てる;
  7. Compose の APP_BASE_URLhttps://joplin.example.com に変更する;
  8. Container Manager でプロジェクトを再デプロイする。

リバースプロキシでは、一般的な転送ヘッダーをカスタムヘッダーに追加しておくとよいです。

1
2
3
4
Host: $host
X-Real-IP: $remote_addr
X-Forwarded-For: $proxy_add_x_forwarded_for
X-Forwarded-Proto: $scheme

Synology 標準のリバースプロキシ画面を使う場合、DSM の小バージョンによって項目名が少し違うことがあります。画面上の「カスタムヘッダー」や「WebSocket」関連の選択肢に従って追加してください。

また、Joplin で大きな添付ファイルを同期すると、アップロードサイズ制限に当たることがあります。Nginx Proxy Manager や手書き Nginx を使う場合は次を設定します。

1
client_max_body_size 100M;

Synology 内蔵リバースプロキシにこの項目がない場合は、まず通常の添付ファイル同期を試してください。大きなファイルを頻繁に同期するなら、Nginx Proxy Manager や Caddy のほうが柔軟です。

APP_BASE_URL を変更したら再デプロイする

最初は LAN IP でテストし、あとから HTTPS ドメインに変える人は多いです。それ自体は問題ありませんが、クライアント側だけを変えてはいけません。

Container Manager プロジェクトの Compose 設定も同時に変更します。

1
- APP_BASE_URL=https://joplin.example.com

その後、プロジェクトを再デプロイして、コンテナの環境変数を反映させます。

APP_BASE_URL が古いままだと、次のような問題が起きることがあります。

  • クライアントの同期チェックが失敗する;
  • ログイン後に間違ったアドレスへリダイレクトされる;
  • 添付ファイルリンクが異常になる;
  • リバースプロキシ配下でプロトコル判定が間違う。

バックアップの要点

Synology 上で最も重要なのはこのディレクトリです。

1
docker/joplin/postgres_data

ここに PostgreSQL データベースが保存されます。つまり Joplin Server の中核となる同期データです。Hyper Backup などのバックアップ計画に含めることをおすすめします。

より安全な運用は次のとおりです。

  • docker/joplin/postgres_data を定期的にバックアップする;
  • Joplin クライアント側にもノートのコピーを残す;
  • 重要なノートは定期的に JEX としてエクスポートする;
  • コンテナ更新前にバックアップが使えることを確認する。

Joplin Server のイメージやコンテナ設定だけをバックアップしても十分ではありません。イメージは再ダウンロードできますが、データベースこそがあなたのデータです。

まとめ

Joplin Server の Docker Compose デプロイは難しくありません。実際に詰まりやすいのは主に次の 3 点です。

  • APP_BASE_URL はクライアントが実際にアクセスするアドレスにする;
  • 初期管理者パスワード admin はすぐ変更する;
  • SMTP がない場合、新規ユーザーは管理画面の Emails ページから有効化リンクをコピーする。

LAN 内で使うなら http://IP:22300 で同期できます。外部から使うなら HTTPS リバースプロキシを用意し、アップロードサイズ制限も調整してください。これらを押さえれば、Joplin Server は安定したプライベートノート同期環境になります。