
DockerとTREKで旅行プランをセルフホスト:日程、予約、旅費、持ち物リストを完全統合する究極のガイド
Dockerを使用してオープンソースの旅行プランナー「TREK」をデプロイし、CaddyリバースプロキシやCloudflare R2と連携させてセキュアに運用する方法を徹底解説。さらに、MCP経由でAIエージェントと接続し、自然言語で旅行の予約、旅費、持ち物リストを自動整理・一元管理してスマートに旅を計画しましょう。
目次
旅行計画の面倒なところは、航空券予約のPDF、ホテルの確認書、旅行仲間とのチャット履歴、訪れたい場所のリストなどが、あちこちに散らばってしまうことです。いざ合計支出を計算したり割り勘をしようとすると、膨大な旅行データの中からそれらを探し出すだけで大変な労力がかかります。
TREKは、セルフホスト可能なオープンソースの旅行プランナーであり、旅程、予約、予算、持ち物リストを一元管理できます。さらに、内蔵されているMCP(Model Context Protocol)サーバーを使用することで、AIエージェント(Claude Desktopなど)から旅行データを直接操作することが可能です。
本ガイドでは、デプロイ手順から、実際の旅行計画を最初から最後まで完全に管理する方法までをステップバイステップで詳しく解説します。
1. Dockerを使用して旅行プランナー「TREK」をデプロイする方法
Ubuntu VPSにDockerをインストールする
# Add Docker's official GPG key and set up the Docker repository
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Add the official Docker repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Update package list
sudo apt update
# Install Docker Engine, Docker Community Edition, and containerd runtime
sudo apt install docker-ce docker-ce-cli containerd.io -y
# Verify docker is installed
docker --version
# Starts automatically when your system boots
sudo systemctl enable docker
暗号化キーの生成
TREKは機密データの暗号化にキーを使用します。以下のコマンドまたはこちらのオンラインツールを使用して、暗号化キーを生成してください:
openssl rand -hex 32
生成したキーは安全な場所に保管してください。キーを紛失すると、暗号化されたデータへのアクセス手段が失われます。
コンテナの起動
docker run -d \
--name trek \
-p 3000:3000 \
-e ENCRYPTION_KEY="<generated_key>" \
-e APP_URL="https://trek.pafor.me" \
-v ./data:/app/data \
-v ./uploads:/app/uploads \
--restart unless-stopped \
mauriceboe/trek:latest
APP_URLを正しく設定する必要があります — MCPサーバーのOAuthディスカバリーフローは、このURLに依存しています。デプロイの初期段階から、最終的な公開HTTPSアドレスを設定してください。
初回起動時はイメージのプルに少し時間がかかります:

起動状態を確認します:
docker ps

2. CaddyリバースプロキシによるドメインルーティングとSSLの設定
パスキーやMCP用のOAuthを利用するには、HTTPSの導入が必須です。ドメインは、無料のSSL証明書とDDoS保護機能を提供するCloudflareでホストされています。
ポート3000を指すセキュアなリバースプロキシサーバーとして、Caddyをセットアップします。Caddyfileの記述例は以下の通りです:
{$TREK_DOMAIN} {
encode zstd gzip
reverse_proxy host.docker.internal:3000
}
3. 初期設定と管理者アカウントのセキュアなセットアップ
管理者アカウントを作成する方法は2つあります:
- **環境変数
ADMIN_EMAILとADMIN_PASSWORD**を直接指定して、その値でアカウントを作成する。 - TREKが自動でメールアドレス
admin@trek.local、ユーザー名adminを作成し、コンテナログにランダム生成されたパスワードを出力する。docker logs trekを実行してパスワードを確認します。
もしログからパスワードが見つからない場合は、以下のコマンドでリセットしてください:
docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server/reset-admin.js
初回のログイン時にパスワードの変更を求められます。

Admin(管理)をクリックし、メールアドレスを更新します:
3.1 バックアップ
管理画面で保存期間ポリシーを設定し、自動バックアップを有効にします:

3.2 アップロードされたファイルをCloudflare R2に保存する
アップロードしたファイルや写真、バックアップをCloudflare R2に格納することで、VPSのディスク領域をクリーンかつ軽量に保てます。TREKはS3互換のバックエンドをサポートしており、Cloudflare R2はこれに完璧に適合します。
- 「
trek」という名前のR2バケットを作成します。 - Account Details(アカウント詳細)セクションで、あなたのアカウントIDを確認します:

- Manage API Tokens(APIトークンの管理)をクリックします:

- バケットに対する読み取り/書き込み権限を持つCreate Account API token(アカウントAPIトークンの作成)をクリックします:

- 管理画面のADMINISTRATION(管理)パネルでStorage(ストレージ)をクリックします:

- Add Backend(バックエンドの追加)ボタンをクリックし、エンドポイント、バケット名、クレデンシャル情報を入力します:

- Apply(適用)をクリックした後、Test(テスト)のリンクボタンをクリックします。「Connection OK」と表示されることを確認してください:

- すべてのストレージカテゴリをCloudflare R2に切り替え、Save changes(変更を保存)をクリックします:

3.3 パスキーログイン
TREKはパスキー、2要素認証(2FA)、およびOIDCによるシングルサインオンをサポートしています。パスキーを有効にするには、設定画面でドメイン名と許可されたオリジン(Allowed Origins)を入力し、Save(保存)をクリックします:

許可されたオリジンを正しく設定しないと、パスキーの登録が失敗します。
3.4 Google Maps APIキー
Google MapsのAPIキーを登録すると、場所の検索時に評価、営業時間、写真などの情報が自動的に追加されます。キーを登録しない場合、TREKは自動的にOpenStreetMapを使用します(その場合、評価や写真は表示されません)。
こちらのリンクからGet demo keyをクリックしてキーを取得します: 
キーを設定画面に貼り付け、Test(テスト)をクリックして接続を確認します:

3.5 AI統合
AIモデルは、予約確認メールやPDFを解析し、構造化された予約データに変換するために使用されます。
左メニューのAddons(アドオン)をクリックし、AI Parsingを有効にします。「OpenAI」(またはその他の互換プロバイダー)を選択し、プロバイダーの詳細情報を入力します:

3.6 MCPアクセス
Addons(アドオン)の配下で、MCPを有効にします:

3.7 プラグイン
以下の推奨プラグインを有効にすることをお勧めします:

3.8 普段使い用ユーザーの作成
旅行計画は、管理者アカウントではなく一般ユーザーアカウントで行うのが基本です。通常のユーザーを作成し、そちらでログインし直します:

ログインしたら、パスキーを追加するか、2要素認証(2FA)を設定してセキュリティを強化しましょう:

- Add a passkeyをクリックし、現在のパスワードを入力して認証します:

4. デプロイのテスト:過去の旅行データのインポート
TREKを使いこなすには、過去の旅行データを登録してみるのが一番の近道です。
4.1 旅行プランの作成
- New Tripをクリックし、旅行の実際の過去の期間に合わせてStart Date(開始日)とEnd Date(終了日)を設定します:

カバー画像をアップロード(ドラッグ&ドロップ、またはクリップボードから貼り付け)し、Create New Tripをクリックします:

4.2 予約情報のインポート
飛行機、電車、その他の交通機関の予約確認書などのファイルをここにドロップします:


AIモデルが有効になっていると、予約確認書のPDFが解析され、構造化された予約データが抽出されます。
抽出された結果を確認し、Add(追加)をクリックして予約詳細を確定します:

予約情報がメール本文にしかない場合は、メールをPDFとして書き出してアップロードすれば、同様に自動抽出パイプラインが適用されます。
以下のスクリーンショットは、インポートされた予約情報の表示例です:


Plan(計画)ページでは、すべての宿泊施設が地図上に表示されます:

トップメニューのAtlasをクリックすると、これまでに訪れた国のリストと地図が表示されます:

4.3 同行者の追加
Share(共有)ボタンをクリックします:

ダイアログの下部でゲストを追加できます:

4.4 経費の記録
海外旅行保険、現地交通費、SIMカード代など、予約確認書以外の支出を記録するには、Add expense(経費を追加)をクリックします:


4.5 旅行セグメント(行程の分割)
この機能を使用するには、「Trip Segment」プラグインがインストールされている必要があります。
長期の旅行をいくつかのセグメントに分割することで、各期間の予約、訪れる場所、経費が整理され、見やすくなります:



4.6 ジャーニーの作成とアトラスの確認
複数の旅行を「Journey(ジャーニー)」としてまとめ、ストーリーを書いて友人たちに冒険を共有できます:




5. カスタム旅程と持ち物リストの設計
- New Tripをクリックし、旅行名と日程を入力します:

**日程がまだ未定の場合は、日付欄を空欄のままにしてください。**代わりに「日数(最大365日)」を指定するフィールドが表示されます。まずは計画を立て、日程は後から決定することができます。
5.1 場所(スポット)の追加
旅行計画の中で最も時間がかかるのがスポットの追加ですが、TREKにはいくつかの効率的な方法が用意されています:

1. 地図上を右クリックして、その地点に直接スポットを作成する。住所は自動的に逆ジオコーディング(住所の自動取得)されます:


2. + Add Place/Activityをクリックして、名称で検索する



3. Googleマップの共有URL(maps.app.goo.gl/… または maps.google.com/…)を検索窓に貼り付ける。TREKがスポット名、住所、座標を自動で解析・抽出します:


4. 一括インポート — これが最も簡単な方法です。Googleマップでお気に入りのリスト(「行きたい場所」など)を作成している場合、それを.gpx(.kmlや.kmzも対応)としてエクスポートし、右側パネル of Import fileをクリックしてアップロードすれば、すべての場所を一度にインポートできます:

日程に収まるかどうかを気にする必要はありません。まずは興味のある場所をすべて追加し、日程への割り当ては後から行います。
5.2 日ごとの計画とメモ
「Day Plan」では、スポットを日ごとに整理し、訪問順を設定できます。折りたたみ可能な日別のリストになっており、すべてドラッグ&ドロップで操作可能です:

以下の便利な詳細機能が備わっています:
- スポット間の移動手段: 日次プランの左上にあるバスのアイコンをクリックすると、その日の移動手段(電車、バス、フライトなど)を追加できます:

- デイメモ(日ごとのメモ): 日次プランの左下にあるノートのアイコンから、アイコン付きのメモを添付できます(例:「今日は早めに出発する」「この美術館は要予約」):

- タイムスロットの設定: 右側のパネルから場所をドラッグして日付にドロップし、時間を割り当てます。時間が設定された場所は、地図上で自動的に経路接続されます:

- ルートの最適化(Route optimisation)および天気(Weather)については、Day Plans and NotesのWikiページを参照してください。
5.3 コレクション:再利用可能なスポットリスト
コレクション機能を使用すると、特定の旅行とは無関係に、お気に入りのスポットリストを保存・管理できます。友人と共有したり、次回の旅行にそのまま活用したりできます。スポットは旅行プランにコピーされるため、旅行内の情報を編集しても元のコレクションには影響しません(その逆も同様です)。
上部メニューのCollections(コレクション)をクリックします:

- New listをクリックして、新しいリストを作成します:

- Add a placeをクリックし、詳細を入力します:

注意: 「Add a place」ダイアログ内の検索機能は、うまく機能しない場合があるため、その際は詳細を手動で入力する必要があります。
場所のジオ座標が利用可能な場合、それらは地図上に表示されます:

スポットをラベルで整理するには、チェックボックスのアイコンをクリックします:

グループ化したいスポットを選択し、Assign label(ラベルを割り当て)をクリックします:

事前にラベルを作成するには、Manage labels(ラベルの管理)をクリックします:

ラベルを選択して、Assign labelをクリックします:

5.4 費用と予算
旅行中のその他の費用は、「Costs」(費用)ページから追加できます。

同じページで、同行者が支払った金額を追加し、割り勘を設定することができます。
精算(Settlement)パネルは、グリーディー・マッチング(貪欲法)アルゴリズムを実行して、誰が誰にいくら支払うべきかを計算し、送金回数が最小限になる精算方法を提案します。
6. Model Context Protocol (MCP)を活用したAI駆動の旅行計画
TREKにはMCP(Model Context Protocol)サーバーが内蔵されています。これにより、AIエージェントがあなたの旅行データに直接アクセスして、読み書きすることができます。旅行、スポット、予算、持ち物、予約、コラボレーションなど、150以上のツールと30の主要なリソースをカバーしています。
6.1 Cloudflare Zero Trust
TREKをCloudflare Zero Trust環境の配下で運用している場合、ドメインをスプリットトンネル(Split Tunnels)のインクルージョンリスト(除外・バイパスリスト)に追加する必要があります。そうしないと、OAuth認証時に問題が発生する可能性があります。詳細については、こちらのGitHub Issueを参照してください:GitHub Issue

関連ガイド
Cloudflare WARPでHermes Agentをプライベートネットワークに公開する方法
ファイアウォールのインバウンドポートを開くことなく、Cloudflare WARPとZero Trustを使用してグローバルかつ安全にHermes Agentへアクセスし、プライベートネットワークに公開する方法を詳しく解説します。
5分で読める
6.2 Claude Desktop
- New Client(新規クライアント)をクリックして、AIエージェントクライアントを作成します:

Claude Desktopタブを選択し、Register Client(クライアントを登録)をクリックします:

クライアントIDとクライアントシークレットのペアが表示されます。これらを安全な場所に保存してください。次に、Client Configuration(クライアント設定)をクリックして、MCP設定を表示します:

Claude DesktopでEdit Configをクリックし、ローカルのMCPサーバー設定ファイルを開きます:

TREKの設定を貼り付け、プレースホルダー部分をご自身の情報に置き換えます:
"mcpServers": {
"trek": {
"command": "npx",
"args": [
"mcp-remote",
"https://trek.pafor.me/mcp",
"--static-oauth-client-info",
"{\"client_id\": \"<your_client_id>\", \"client_secret\": \"<your_client_secret>\"}"
]
}
},
Claude Desktopを再起動すると、ローカルMCPサーバー(Local MCP servers)に接続されたTREKサーバーが表示されます:

これで、自然言語プロンプトを実行できます:

自然言語で支出を追加してみましょう:
For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26/4/2025. Please add it as an expense without split to the trip.

「Costs」ページを確認すると、支払人が言及されなかったため、「まだ誰も支払っていません(No one paid yet)」という状態で支出が作成されます:

持ち物リストへの追加も同様に行うことができます:

「Packing List」ページを更新すると、3つのアイテムが追加されています:

6.3 Gemini CLI(動的登録)
Gemini CLIは動的登録(Dynamic Registration)をサポートしているため、事前にクライアントを登録する必要はありません。.gemini/settings.jsonに以下を追加してください:
"trek": {
"httpUrl": "https://trek.pafor.me/mcp",
"oauth": {
"enabled": true
}
}
ターミナルでgeminiを実行し、認証プロンプトが表示されたらApprove(承認)をクリックします:

シンプルなプロンプトから始めてみましょう:


6.4 Kimi CLI(動的登録)
やり方は同様です。/Users/<user>/.kimi/フォルダにあるmcp.jsonに以下を追加します:
"trek": {
"type": "http",
"url": "https://trek.pafor.me/mcp",
"auth": "oauth"
}
ターミナルでkimi mcp auth trekを実行し、Approveをクリックします:

認証されると、利用可能なツールが一覧表示されます:

7. モバイルでの利用体験
TREKは、モバイルデバイスではPWA(Progressive Web App)として動作します。サービスワーカーがマップタイルやAPIデータをキャッシュするため、オフライン環境でも旅程を確認することができます。ただし、ネイティブアプリと比較すると、プッシュ通知に多少の遅延が発生する場合があります。
おわりに
MCPを介してAIエージェントを接続することで、フライトや宿泊施設の予約データを手動で入力する手間を大幅に削減できます。また、AIエージェントは旅行日程や季節に応じたお勧めの観光スポットを提案することも可能です。AIエージェントとの一度の対話で、リサーチや旅程の作成から、予算管理、持ち物リストの整理まで、旅行計画のすべてのステップをカバーできます。
ただし、いくつか軽微な不具合も見受けられます。例えば、PDFから予約をインポートする際、実際に支払った通貨ではなく、旅行の基本通貨(デフォルト通貨)に自動設定されてしまうことがあります。また、「Collections」で新しいリストを作成する際、作成時に入力したカバー画像が保存後に消えてしまうことがあります(ただし、編集画面から手動で再追加することは可能です)。
また、ご自身のサーバーにこれをホストする必要があるため、導入には多少の技術的なハードルがあります。TREKは主に、頻繁に旅行に行き、旅のデータをこだわりを持って整理したい方向けに設計されています。セルフホストを検討する前に、demo.liketrek.comで公式デモを試してみることをお勧めします。
参考リンク:
関連記事

コラボレーション
Block製Buzzを自己ホスト:人とAIエージェントが自律的に協働する次世代共有ワークスペースの構築
Blockが開発したAI協働スペース「Buzz」のNostrリレーを、Cloudflare DNSを介してUbuntu VPS上に自己ホストする方法を解説します。暗号鍵による安全な認証のもと、人間と各種AIエージェントがチャンネルやプロジェクトの履歴を共有し、自律的に連携するセキュアな作業環境を構築しましょう。
9分で読める
Cloudflare
CloudflareとModel Context Protocolによる永続的自己ホスト型AIメモリシステム
CloudflareとSecond Brain、MCPを使用して、永続的で自己ホスト型のAIメモリシステムを構築する方法を学びます。ClaudeやGemini、Obsidianでコンテキストを共有しましょう。
38分で読める
AIとエージェント
Nuxtアプリの環境構築・初期化を自動化:AIエージェントのスキルが従来のシェルスクリプトに代わる理由
Cloudflare Workers上にNuxtアプリを自動構築する方法を徹底解説。従来の壊れやすいシェルスクリプトを、開発者の意図を組んで柔軟に判断・動作するインテリジェントなAIエージェントのスキルに置き換えるメリットや、npx skillsコマンドを用いた実用的なセットアップ手順を紹介します。
2分で読める
前の記事
Nuxtアプリの環境構築・初期化を自動化:AIエージェントのスキルが従来のシェルスクリプトに代わる理由
Cloudflare Workers上にNuxtアプリを自動構築する方法を徹底解説。従来の壊れやすいシェルスクリプトを、開発者の意図を組んで柔軟に判断・動作するインテリジェントなAIエージェントのスキルに置き換えるメリットや、npx skillsコマンドを用いた実用的なセットアップ手順を紹介します。

次の記事
Block製Buzzを自己ホスト:人とAIエージェントが自律的に協働する次世代共有ワークスペースの構築
Blockが開発したAI協働スペース「Buzz」のNostrリレーを、Cloudflare DNSを介してUbuntu VPS上に自己ホストする方法を解説します。暗号鍵による安全な認証のもと、人間と各種AIエージェントがチャンネルやプロジェクトの履歴を共有し、自律的に連携するセキュアな作業環境を構築しましょう。