Development
26 min read
27 views

Exposing Jupyter & Model APIs: PythonデータサイエンスワークフローとPagekite

IT
InstaTunnel Team
Published by the InstaTunnel team | Editorial policy
Exposing Jupyter & Model APIs: PythonデータサイエンスワークフローとPagekite

Quick answer

Pagekite: Pythonによるローカルホストトンネル for データサイエンス: webhook testing answer

For local webhook testing, run your app locally, expose it with a public HTTPS tunnel, and paste the stable callback URL into the provider dashboard.

How do I test webhooks on localhost?

Start your local server, open a public HTTPS tunnel to that port, configure the provider webhook URL, and inspect events in your local logs.

Why does a stable webhook URL matter?

Stable URLs prevent provider dashboards from needing manual callback updates every time you restart a tunnel.

Data science and machine learning development happens predominantly on local machines or dedicated GPU workstations. Whether you’re iterating on exploratory analysis inside a Jupyter notebook, building a prototype with Streamlit, or serving predictions via FastAPI, your local environment is the primary workbench.

A recurring challenge shows up the moment you need to share that work. Demonstrating an interactive model to a remote stakeholder, testing an inbound webhook from a payment gateway, or letting a mobile app hit an endpoint running on your laptop usually means deploying to a remote server — and cloud deployment introduces friction: containerization overhead, cost, deployment delay, and configuration drift between environments.

This is the gap a localhost tunnel is built to close. While ngrok dominates general web development, Pagekite is a much older, still-maintained project worth knowing about specifically because its reference client is a single, dependency-light Python script rather than a compiled binary — a property that matters more than it sounds like it should in regulated or security-conscious environments.

Modern Data Scienceのローカル開発の摩擦

+-----------------------------------------------------------------------+
|                         ローカルワークステーション                     |
|                                                                       |
|  +-------------------+    +--------------------+    +--------------+  |
|  | JupyterLab / Notebook | | Streamlit / Gradio | | FastAPI / ML |  |
|  |   (Port 8888)     |    |    (Port 8501)     |    | (Port 8000)  |  |
|  +---------+---------+    +---------+----------+    +-------+------+  |
|            |                        |                   |             |
+------------+------------------------+-------------------+-------------+
                                      |
                           ( NAT / Firewall にブロック )
                                      |
                                      x
                          [ パブリックインターネット / クライアント ]

常に現れる3つの共有のボトルネック:

  • インタラクティブなノートブックのデモ。 .ipynbファイルをメールやGitHubで共有しても静的出力しか表示されない。クライアントやPMにライブのインタラクティブセッションを提供するには、Jupyterサーバーを公開する必要がある。
  • Webhookや外部コールバックのテスト。 Slackボット、GitHubトリガー、Stripe/Twilioの連携には、インバウンドPOSTリクエストを直接あなたのマシンにルーティングする公開URLが必要。
  • リモートAPI統合。 ローカルホストのモデルエンドポイントに対してフロントエンドエンジニアが構築する場合、モデルがステージングされる前にアクセス可能なURLが必要。

EC2インスタンスの手動設定、SSHリバーストンネルの手作業、または企業のアプリケーションホワイトリストに引っかかるコンパイル済みバイナリのインストールは、すべてトンネルが解決すべき実際の摩擦点です。

Pagekiteとは?Pythonを使ったトンネルのアーキテクチャ

Pagekiteは、もともとBjarni Rúnar Einarssonによって書かれ、アイスランドの企業The Beanstalks Project ehf.の下でメンテナンスされているオープンソースのトンネリングプロジェクトです。2010年頃から運用されており、ngrokの公開リリースよりも古いツールの一つです。パブリックリレーサーバ(一般的にpagekite.netにホスト)から、NATや制限されたファイアウォールの背後で動作するローカルサービスへのトンネルを作成します。

                                PAGEKITE ARCHITECTURE

 +------------------------+              +------------------------+
 |   ローカルマシン       |              |  Pagekite パブリックリレー |
 |                        |              |   (フロントエンド / クラウド) |
 | +--------------------+ |              |                        |
 | | ローカルアプリ       | |              |                        |
 | | (Jupyter/FastAPI)   | |              |                        |
 | +---------+----------+ |              |                        |
 |           | ローカルHTTP |              |                        |
 | +---------v----------+ |  暗号化      |                        |
 | | Pagekiteクライアント |<==============>| パブリックHTTP/HTTPS |
 | | (pagekite.py)      | |  トンネル    | フロントエンドリスナー |
 | +--------------------+ |              +-----------+------------+
 +------------------------+                          |
                                                     |
                                            +--------v--------+
                                            | リモートクライアント / |
                                            | Webブラウザ        |
                                            +-----------------+

主要なアーキテクチャの特徴

  • リファレンスクライアントは純粋なPython。 pagekite.pyは単一のPythonスクリプトで、コンパイル済みのC拡張やRust、Goのランタイムは不要です。自前のフロントエンドリレーを運用する場合、TLS終端にはOpenSSLとPython 3またはpyOpenSSLモジュールが必要になることに注意。つまり、「依存関係ゼロ」は一般的なクライアント用途には本当にゼロです。
  • Python 3対応済み。 現在のpagekite.netのホームページではpython3 pagekite.py 80 yourname.pagekite.meと記載されています。古いWikiページではPython 2.xを推奨しているものもありますが、これは古い情報であり、Python 3対応はPyPagekiteリリースで正式に行われています。
  • プロトコルの多様性。 HTTP/HTTPS以外に、Pagekiteは生のTCP、SSH、その他のTCPベースのサービスもトンネリング可能です。
  • セルフホスティングは実用的かつネイティブ。 pagekite.netのリレーを使うことも、自前のフロントエンド(pagekitefront)をインフラ内に立てることも可能です。リレーコードは無料のオープンソースで、ライセンスキーによる制限はありません。
  • 動的DNS対応。 クライアントはdyndns.orgやno-ip.com、カスタムHTTP(S)エンドポイントに対応し、IPアドレスの変化に合わせて公開名を更新します。
  • エコシステムの拡張性。 pagekite.py以外に、パフォーマンス重視や組み込み用途向けのC実装libpagekiteや、ESP32向けのMicroPythonポートupagekiteも開発されています。センサーやIoTデバイス向けのローカルサービスに適しています。

ライセンスの訂正:AGPLでありGPLv2/Apacheではない

pagekite.pyGNU Affero General Public License (AGPL)の下でリリースされています。著作権はBjarni Rúnar EinarssonとThe Beanstalks Project ehf.に帰属。ドキュメントはCC BY-SA 3.0、サンプル設定ファイルはパブリックドメインです。libpagekiteは別のCライブラリで、Apache-2.0とAGPLのデュアルライセンスです。Pythonクライアントには適用されません。セキュリティレビューの観点からも、AGPLのネットワーク利用条項は緩いApacheライセンスより厳格です。

Pythonネイティブスタックの利点

特徴 ML / データチームへのメリット
コンパイル済みランタイム不要 .pyファイル一つを仮想環境やDockerに置くだけで済む
コードの監査性 Pythonソースコードのため、InfoSecが内容を確認しやすい
サブプロセス連携 Pythonの標準ライブラリでトンネルを起動・管理
仮想環境対応 既存のPython 3環境にそのまま置いて使える

注意点:pip install pagekiteは存在しない

このドキュメントの初稿やWeb上の多くの解説ではpip install pagekiteを推奨していますが、実際にはPyPIにこのツールのアクティブなパッケージは存在しません。最も近い名前のパッケージはpagekitという静的サイト向けの別物です。公式ドキュメントでは次の方法を推奨しています:

# 公式ドキュメント通りにスクリプトを直接ダウンロード
curl -O https://pagekite.net/pk/pagekite.py
chmod +x pagekite.py

# Debian/Ubuntuの場合、公式のaptリポジトリから
echo "deb http://pagekite.net/pk/deb/ pagekite main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update && sudo apt-get install pagekite

なお、DebianやUbuntuの公式リポジトリにはpagekiteパッケージもありますが、こちらはより新しいリリースを提供していることが多いです。

PagekiteでJupyter Notebookを公開する方法

リモートコラボレーターにインタラクティブなJupyter環境を公開するには、接続性とアクセス制御の両方が必要です。未認証のJupyterセッションに公開URLを与えると、誰でもコード実行権限を持つことになるため注意。

                  セキュアなJUPYTERトンネルワークフロー

+----------------------+     +----------------------+     +----------------------+
| 1. Jupyter設定      |     | 2. ローカルサーバー起動 |  | 3. Pagekite作成      |
| 強力なトークン設定  |----| 127.0.0.1にバインド |----| 暗号化トンネル      |
| パスワード設定      |     | ポート8888          |     | https://...        |
+----------------------+     +----------------------+     +----------------------+

ステップ1:Pagekiteクライアントを取得

curl -O https://pagekite.net/pk/pagekite.py
chmod +x pagekite.py

ステップ2:Jupyterをセキュアに設定

jupyter notebook --generate-config
jupyter notebook password

もしくは、トークンを明示的に設定し、ループバックのみにバインド:

jupyter lab --ip=127.0.0.1 --port=8888 --NotebookApp.token='長くて安全なランダムトークン'

ステップ3:トンネルを起動

python3 pagekite.py 8888 yourname.pagekite.me

最初の実行では、無料アカウント作成やサインインを案内され、認証キーが~/.pagekite.rcに保存されます。成功すれば、https://yourname.pagekite.me/でアクセス可能になる旨の出力が表示されます。

ステップ4:アクセス制御を強化

以前のガイドでは--allow=<ip>--opt/basicauth=user:passといったフラグを紹介していましたが、これらはPagekiteの実際のオプションではありません。正しいアクセス制御は、+フラグを kite 定義に追加することです:

# 特定のIPまたは/24サブネットのみ許可
python3 pagekite.py 8888 yourname.pagekite.me +ip/203.0.113.45=ok

# Jupyterのトークンに加え、HTTP Basic認証を設定
python3 pagekite.py 8888 yourname.pagekite.me +password/admin=ComplexPassword123!

複数の+ip/+password/フラグを重ねて設定可能です。pagekite.pyはバージョン0.5以降、標準でリクエストファイアウォールを搭載し、/wp-admin/などの攻撃パスをブロックします。--insecure+insecureで無効化可能で、+password/+ip/のアクセス制御設定がある場合は自動的にオフになります。

FastAPI & Streamlitモデルエンドポイントの公開

シナリオA:Streamlitダッシュボード

streamlit run app.py --server.port 8501 --server.address 127.0.0.1

公開側でHTTPSを強制したい場合は、プロトコルをkite名に付加します — --service=httpsフラグはありません:

python3 pagekite.py 8501 https:your-analytics.pagekite.me

シナリオB:FastAPI推論エンドポイントをプログラムから起動

ターミナルウィンドウを2つ開く代わりに、ASGIサーバと並行してトンネルを子プロセスとして起動:

import subprocess
import time
import uvicorn
from fastapi import FastAPI

app = FastAPI(title="ローカル機械学習推論API")

@app.get("/")
def read_root():
    return {"status": "online", "model": "RandomForestClassifier_v2"}

@app.post("/predict")
def predict(features: dict):
    processed_val = sum(features.values()) if features else 0
    return {"prediction": processed_val * 1.5, "confidence": 0.94}

def start_pagekite_tunnel(port: int, subdomain: str):
    """pagekite.pyをバックグラウンドで起動し、ローカルポートに紐付ける"""
    cmd = ["python3", "pagekite.py", str(port), f"https:{subdomain}.pagekite.me"]
    print(f"[*] Pagekiteトンネルをポート{port}で起動中...")
    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    time.sleep(2)  # トンネルの確立を待つ
    print(f"[+] トンネルオンライン: https://{subdomain}.pagekite.me")
    return process

if __name__ == "__main__":
    PORT = 8000
    SUBDOMAIN = "my-ml-model-api"

    tunnel_process = start_pagekite_tunnel(port=PORT, subdomain=SUBDOMAIN)
    try:
        uvicorn.run(app, host="127.0.0.1", port=PORT)
    finally:
        print("[*] Pagekiteプロセスを終了します...")
        tunnel_process.terminate()

この例は、プロセスマネジメントであり、公式のPythonクライアントライブラリではありません。PagekiteはCLIスクリプトとは別にインポート可能な公式Pythonクライアントライブラリを提供していません。したがって、「プログラムからの統合」とは、手動で実行しているのと同じスクリプトを起動・監督することを意味します。

Pagekiteとngrokの比較:データサイエンス向け

指標 Pagekite ngrok
クライアント言語 純粋Python(クライアント役) Go
ライセンス GNU AGPL (pagekite.py) クローズドソース、SaaS
インストール curlまたはapt/rpmパッケージ 事前にコンパイルされたバイナリ
セルフホスティング ネイティブ — 自前のフロントエンド運用可能 一部プランのみ
カスタムドメイン CNAMEベースのカスタムドメイン対応(エイペックス未明示) サブドメインのCNAME対応、エイペックスは非対応
プロトコルサポート HTTP, HTTPS, TCP, SSH HTTP, HTTPS, TCP, TLSトンネル
価格モデル Pay-what-you-want(推奨$3/月)、無料枠あり、サブスクリプション$5.99/月、ホワイトラベル$199.95/月(最大500デバイス) 無料枠あり、趣味向け$10/月(年払い$8/月)から

実用的な比較ポイント

バイナリ vs. スクリプト。 ngrokはGoでコンパイル済みバイナリを提供しますが、Pagekiteのクライアントは検査可能なPythonスクリプトです。アプリホワイトリストで未署名実行ファイルをブロックする環境では、これは実質的な違いです。

セルフホスティング。 PIIや規制対象の医療・金融記録を扱う場合、Pagekiteは自前のリレーをインフラ内で動かすことが可能で、これはドキュメント化された機能です。これは有料の追加機能ではなく、オープンソースのリレーコードをそのまま使います。

価格の構造。 ngrokの無料・趣味向けプランは帯域やエンドポイント数で課金されますが、Pagekiteは「Pay-what-you-want」モデルに最低額の提案と、GB単位の超過料金ではなく定額の月額サブスクリプションを採用しています。価格の哲学が異なるため、「安い」や「高い」の判断は一概にできません。

Pagekiteを用いたリバースプロキシのセキュリティベストプラクティス

+-------------------------------------------------------------------+
|                  トンネルセキュリティ層戦略                         |
|                                                                   |
|  [ パブリックインターネット ]                                    |
|         |                                                         |
|         v                                                         |
|  +-------------------------------------------------------------+  |
|  | レイヤー1:Transport Encryption (https:でプレフィックス) |  |
|  +------------------------------+------------------------------+  |
|                                 |                                 |
|                                 v                                 |
|  +-------------------------------------------------------------+  |
|  | レイヤー2:アクセス制御 (+ip/と+password/フラグ)             |  |
|  +------------------------------+------------------------------+  |
|                                 |                                 |
|                                 v                                 |
|  +-------------------------------------------------------------+  |
|  | レイヤー3:アプリケーション認証 (Jupyter Token / API Keys)     |  |
|  +------------------------------+------------------------------+  |
|                                 |                                 |
|                                 v                                 |
|  [ ローカルアプリ / ノートブック / FastAPI ]                     |
  1. HTTPSを強制。 kite名にhttps:をプレフィックスします:python3 pagekite.py 8888 https:yournotebook.pagekite.me
  2. IP制限をできるだけ行う。 +ip/203.0.113.45=ok(単一アドレス)または+ip/203.0.113=ok(/24ネットブロック)
  3. トンネル層にHTTP Basic認証を追加。 +password/admin=ComplexPassword123! — 弱い認証や自動認証の代わりに有効
  4. ローカルサービスを非特権ユーザで実行。 JupyterやFastAPIはroot以外で動かし、.envやSSHキーを含むディレクトリからも分離。Pagekiteはローカルポートの内容を転送するだけなので、プロセスの衛生状態も重要です。

大容量データペイロードの取り扱い

FastAPIが大きなJSONや画像ペイロードを返す場合、トンネル越しにレスポンス圧縮を有効にしましょう:

from fastapi import FastAPI
from fastapi.middleware.gzip import GZipMiddleware

app = FastAPI()

# GZipMiddlewareは大文字
app.add_middleware(GZipMiddleware, minimum_size=500)

永続的なバックグラウンドトンネルの維持

nohup python3 pagekite.py --logfile=/var/log/pagekite.log 8888 yournotebook.pagekite.me &

再起動後も動作させたい場合は、systemdユニットにラップしてください。

一般的な接続問題のトラブルシューティング

症状 可能な原因 対策
“Connection Refused” ローカルサービスが指定ポートで待ち受けていない curl http://127.0.0.1:PORTnetstatで確認
“Subdomain Unavailable” name.pagekite.meが既に使用中 別のプレフィックスを選ぶ、または既存のkite資格情報を~/.pagekite.rcに確認
応答遅延 ペイロードサイズやNAT/MTUの不一致 レスポンス圧縮を有効化(上記参照)やペイロード縮小

PagekiteをMLOpsパイプラインに統合

                        MLOps INTEGRATION PIPELINE

 +-------------------+     +--------------------+     +---------------------+
 | GitHub Actions /  |     | 一時的モデルコンテナ |  | Pagekiteトンネル作成 |
 | ローカルCI実行者  |----|                    |----| Webhook公開用        |
 +-------------------+     +--------------------+     +----------+----------+
                                                                 |
                                                                 v
 +-------------------+     +--------------------+     +---------------------+
 | トンネル破棄        |     | Webhook検証        |----| 外部サービス呼び出し |
 | & 結果報告        |     | ペイロード配信   |     | テスト             |
 +-------------------+     +--------------------+     +---------------------+

外部サービスが内部Webhookを確実に呼び出せるか検証するエンドツーエンドのテストでは、test-run-$GITHUB_RUN_ID.pagekite.meのような一意の名前のkiteをテストランナー内に一時的に立て、外部呼び出しをトリガーし、ペイロードの到達を確認し、トンネルを破棄します。これにより、Webhook検証だけのために永続的なステージング環境を用意する必要がなくなります。

Pythonクライアント以外のPagekite:libpagekiteとupagekite

Pagekiteのあまり知られていない部分として、ノートブックやAPIを超えた組み込みやリソース制約のあるデバイス向けに役立つ2つのコンポーネントがあります:

  • libpagekiteは、同じプロトコルのC実装で、高性能や組み込み用途を想定。Pythonインタプリタを使わずに動作します。
  • upagekiteは、ESP32クラスのマイクロコントローラ向けMicroPythonポート。センサーやIoTデバイスが自分のkiteを飛ばすことが可能です。

すでにPagekiteをデータサイエンスAPIに使っていて、後からESP32ボードからテレメトリを取得したい場合も、同じインフラを利用できます。

2026年現在もPagekiteは適切か?

正直に言えば、pagekite.netの公式ブログは2021年10月以降更新されておらず、GitHubのPythonクライアントも「積極的に開発中」「不安定な場合もある」との注意書きがあります。ngrokやzrok、Pinggyのような新興ツールは定期的にアップデートされているのに対し、Pagekiteはやや遅いペースです。

それでも、現状はサービスが稼働し、ダウンロードやサインアップも問題なく、Python 3対応も明記されており、価格やFAQも最新です。これは、放置されたプロジェクトではなく、小規模チームによる成熟したインフラの維持と考えられます。企業環境で監査可能でセルフホスト可能なスクリプトベースのトンネルが必要な場合、その安定性は合理的なトレードオフです。サポートやダッシュボード、頻繁な新機能リリースを求めるチームには、他の新しいツールが適しています。

Pythonトンネリングスタックの効率化

ローカルホストのトンネルは、ローカル開発とパブリックWebを橋渡しする実質的なボトルネックを解決します。Pagekiteの特徴は、スクリプトベースでセルフホスト可能なAGPLライセンスのクライアントであり、2010年から運用されているアイスランドの運営者によるものです。これはngrokのクローズドソースSaaSモデルとは本質的に異なり、具体的な違いもあります。適切なツールは、監査性とセルフホスティングを重視するか、機能の速さと洗練さを重視するかによります。


編集履歴(2026年9月6日確認)

  • ライセンスpagekite.pyは実在のGNU AGPLでリリースされている(Apache-2.0/AGPLデュアルライセンスはlibpagekiteのみ適用)
  • インストールpip install pagekiteは存在しないため削除。実際のインストール方法はスクリプト直接ダウンロードや公式リポジトリ、ディストリビューションパッケージ
  • Pythonバージョン:古いWikiページではPython 2.xを推奨しているが、公式はPython 3対応を明記
  • HTTPSのCLIフラグ--service=httpsは削除し、https:のプレフィックスをkite名に付加
  • セキュリティフラグ--allow=<ip>--opt/basicauth=user:passは削除し、+ip/+password/を使用。--insecure+insecureは自動的にオフに
  • コード修正GzipMiddlewareGZipMiddlewareに修正
  • 価格情報追加:Pagekiteの実際の料金体系を記載し、ngrokとの比較を強化
  • 運営者情報追加:Bjarni Rúnar EinarssonとThe Beanstalks Project ehf.(アイスランド)を明記
  • エコシステム紹介:libpagekite(C)、upagekite(MicroPython/ESP32)を紹介
  • 運用状況の正直な評価:ブログは2021年10月以降静止、GitHubの注意書きもありつつ、サービスは継続中と確認
  • 未検証の主張の修正:エイペックス/ルートドメインのサポートについて、ドキュメント未確認のため「明示されていない」と記載
  • メタディスクリプションは省略(このシリーズの標準フォーマットに従う)

Continue from this article into the most relevant product guides and workflows.

Related Topics

#Python localhost tunnel, Pagekite vs ngrok, data science reverse proxy, expose Jupyter notebook localhost, machine learning localhost, FastAPI tunnel, Python reverse proxy, local dev environment Python, expose local server, data science tools, Python data engineering, pagekite python 3, pagekite alternative, ngrok alternative python, open source reverse proxy python, expose FastAPI localhost, Jupyter notebook remote access, secure tunnel python, localhost to internet python, data scientist workflow, MLOps local testing, machine learning webhook testing, python web server expose, route localhost internet, Pagekite tutorial data science, Pagekite configuration, bypass NAT python, expose machine learning API, local python API public URL, ngrok vs pagekite performance, Jupyter notebook public IP, python developer tools, reverse proxy for data engineers, self-hosted frontend pagekite, python tunneling solution, data science local environment, fastAPI public endpoint, testing local python API, pagekite python package, pagekite frontend backend, local web server public url, python localhost forward, machine learning dev environment, data science webhooks, pagekite proxy server, expose ML model localhost, Jupyter notebook port forward, python proxy tunnel, data engineering workflow, python backend tunnel, local API internet access, python localhost reverse proxy, remote access to Jupyter notebook, test FastAPI online, Pagekite machine learning

Keep building with InstaTunnel

Read the docs for implementation details or compare plans before you ship.

Share this article

More InstaTunnel Insights

Discover more tutorials, tips, and updates to help you build better with localhost tunneling.

Browse All Articles