Skip to main content

The ngrok Agent SDK for Python

Project description

Python SDK for ngrok

PyPI Supported Versions MIT licensed Apache-2.0 licensed Continuous integration

ngrok-python is the official Python SDK for ngrok that requires no binaries. Quickly enable secure production-ready connectivity to your applications and services directly from your code.

ngrok is a globally distributed gateway that provides secure connectivity for applications and services running in any environment.

Installation

The ngrok-python SDK can be installed from PyPI via pip:

pip install ngrok

Quickstart

  1. Install ngrok-python

  2. Export your authtoken from the ngrok dashboard as NGROK_AUTHTOKEN in your terminal

  3. Add the following code to your application to establish connectivity via the forward method through port 9000 on localhost:

    # import ngrok python sdk
    import ngrok
    
    # Establish connectivity
    listener = ngrok.forward(9000, authtoken_from_env=True)
    
    # Output ngrok url to console
    print(f"Ingress established at {listener.url()}")
    

That's it! Your application should now be available through the url output in your terminal.

Note You can find more examples in the examples directory.

Documentation

A full quickstart guide and API reference can be found in the ngrok-python documentation.

Authentication

To use most of ngrok's features, you'll need an authtoken. To obtain one, sign up for free at ngrok.com and retrieve it from the authtoken page in your ngrok dashboard. Once you have copied your authtoken, you can reference it in several ways.

You can set it in the NGROK_AUTHTOKEN environment variable and pass authtoken_from_env=True to the forward method:

ngrok.forward(authtoken_from_env=True, ...)

Or pass the authtoken directly to the forward method:

ngrok.forward(authtoken=token, ...)

Or set it for all connections with the set_auth_token method:

ngrok.set_auth_token(token)

Connection

The forward method is the easiest way to start an ngrok session and establish a listener to a specified address. If an asynchronous runtime is running, the forward method returns a promise that resolves to the public listener object.

With no arguments, the forward method will start an HTTP listener to localhost port 80:

listener = ngrok.forward()

You can pass the port number to forward on localhost:

listener = ngrok.forward(4242)

Or you can specify the host and port via a string:

listener = ngrok.forward("localhost:4242")

More options can be passed to the forward method to customize the connection:

listener = ngrok.forward(8080, basic_auth="ngrok:online1line"})
listener = ngrok.forward(8080, oauth_provider="google", oauth_allow_domains="example.com")

The second (optional) argument is the listener type, which defaults to http. To create a TCP listener:

listener = ngrok.forward(25565, "tcp")

Since the options are kwargs, you can also use the ** operator to pass a dictionary for configuration:

options = {"authtoken_from_env":True, "response_header_add":"X-Awesome:yes"}
listener = ngrok.forward(8080, **options)

See Full Configuration for the list of possible configuration options.

Disconnection

To close a listener use the disconnect method with the url of the listener to close. If there is an asynchronous runtime running the disconnect method returns a promise that resolves when the call is complete.

ngrok.disconnect(url)

Or omit the url to close all listeners:

ngrok.disconnect()

The close method on a listener will shut it down, and also stop the ngrok session if it is no longer needed. This method returns a promise that resolves when the listener is closed.

await listener.close()

List all Listeners

To list all current non-closed listeners use the get_listeners method. If there is an asynchronous runtime running the get_listeners method returns a promise that resolves to the list of listener objects.

listeners = ngrok.get_listeners()

TLS Backends

As of version 0.10.0 there is backend TLS connection support, validated by a filepath specified in the SSL_CERT_FILE environment variable, or falling back to the host OS installed trusted certificate authorities. So it is now possible to do this to connect:

ngrok.forward("https://127.0.0.1:3000", authtoken_from_env=True)

If the service is using certs not trusted by the OS, such as self-signed certificates, add an environment variable like this before running: SSL_CERT_FILE=/path/to/ca.crt.

Unix Sockets

You may also choose to use Unix Sockets instead of TCP. You can view an example of this here.

A socket address may be passed directly into the listener forward() call as well by prefixing the address with unix:, for example unix:/tmp/socket-123.

Builders

For more control over Sessions and Listeners, the builder classes can be used.

A minimal example using the builder class looks like the following:

async def create_listener():
    session = await ngrok.NgrokSessionBuilder().authtoken_from_env().connect()
    listener = await session.http_endpoint().listen()
    print (f"Ingress established at {listener.url()}")
    listener.forward("localhost:9000")

See here for a Full Configuration Example

Full Configuration

This example shows all the possible configuration items of ngrok.forward:

listener = ngrok.forward(
    # session configuration
    addr="localhost:8080",
    authtoken="<authtoken>",
    authtoken_from_env=True,
    app_protocol="http2",
    session_metadata="Online in One Line",
    # listener configuration
    metadata="example listener metadata from python",
    domain="<domain>",
    schemes=["HTTPS"],
    proto="http",
    proxy_proto="",  # One of: "", "1", "2"
    labels="edge:edghts_2G...",  # Along with proto="labeled"
    # module configuration
    basic_auth=["ngrok:online1line"],
    circuit_breaker=0.1,
    compression=True,
    allow_user_agent="^mozilla.*",
    deny_user_agent="^curl.*",
    allow_cidr="0.0.0.0/0",
    deny_cidr="10.1.1.1/32",
    crt=load_file("crt.pem"),
    key=load_file("key.pem"),
    mutual_tls_cas=load_file("ca.crt"),
    oauth_provider="google",
    oauth_allow_domains=["<domain>"],
    oauth_allow_emails=["<email>"],
    oauth_scopes=["<scope>"],
    oauth_client_id="<id>",
    oauth_client_secret="<id>",
    oidc_issuer_url="<url>",
    oidc_client_id="<id>",
    oidc_client_secret="<secret>",
    oidc_allow_domains=["<domain>"],
    oidc_allow_emails=["<email>"],
    oidc_scopes=["<scope>"],
    policy="<policy_json>",
    request_header_remove="X-Req-Nope",
    response_header_remove="X-Res-Nope",
    request_header_add="X-Req-Yup:true",
    response_header_add="X-Res-Yup:true",
    verify_webhook_provider="twilio",
    verify_webhook_secret="asdf",
    websocket_tcp_converter=True,
)

ASGI Runner

ngrok-python comes bundled with an ASGI (Asynchronous Server Gateway Interface) runner ngrok-asgi that can be used for Uvicorn, Gunicorn, Django and more, with no code.

To use prefix your start up command for a Uvicorn or Gunicorn web server with either ngrok-asgi or python -m ngrok.

Any TCP or Unix Domain Socket arguments will be used to establish connectivity automatically. The ngrok listener can be configured using command flags, for instance adding --basic-auth ngrok online1line will introduce basic authentication to the ingress listener.

Uvicorn

# Basic Usage
ngrok-asgi uvicorn mysite.asgi:application

# With custom host and port
ngrok-asgi uvicorn mysite.asgi:application \
    --host localhost \
    --port 1234

# Using basic auth
ngrok-asgi uvicorn mysite.asgi:application \
    --host localhost \
    --port 1234 \
    --basic-auth ngrok online1line

# Using custom sock file
ngrok-asgi uvicorn mysite.asgi:application \
    --uds /tmp/uvicorn.sock

# Using module name
python -m ngrok uvicorn mysite.asgi:application \
    --oauth-provider google \
    --allow-emails bob@example.com

Gunicorn

# Basic Usage
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker

# With custom host and port
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
    --bind localhost:1234

# Using webhook verifications
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
    --webhook-verification twilio s3cr3t

# Using custom sock file
ngrok-asgi gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker \
    --bind unix:/tmp/gunicorn.sock

# Using module name
python -m ngrok gunicorn mysite.asgi:application -k uvicorn.workers.UvicornWorker --response-header X-Awesome True

Examples

Listeners

Frameworks

Machine Learning

Platform Support

Pre-built binaries are provided on PyPI for the following platforms:

OS i686 x64 aarch64 arm
Windows *
MacOS
Linux
Linux musl
FreeBSD *

Note ngrok-python, and ngrok-rust which it depends on, are open source, so it may be possible to build them for other platforms.

  • Windows-aarch64 will be supported after the next release of Ring.
  • FreeBSD-x64 is built by the release process, but PyPI won't accept BSD flavors.

Dependencies

  • This project relies on PyO3, an excellent system to ease development and building of Rust plugins for Python.
  • Thank you to OpenIoTHub for handing over the ngrok name on PyPI.

Changelog

Changes to ngrok-python are tracked under CHANGELOG.md.

Join the ngrok Community

License

This project is dual-licensed under Apache, Version 2.0 and MIT. You can choose between one of them if you use this work.

Contributions

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in ngrok-python by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Development: Getting Started

Prerequisites:

  • a valid Ngrok authtoken
  • make available in your PATH
  1. Update Cargo.toml with the latest supported ngrok = { version = "=VERSION_HERE" } from ngrok-rust. ngrok-rust is used for the bindings in src/rust_files_here.rs

  2. Run make build (builds the rust bindings / python dependencies)

  3. Happy developing!


Example Commands:

building the project

make develop

running the entire test suite

# running the entire test suite
export NGROK_AUTHTOKEN="YOUR_AUTHTOKEN_HERE"; make test

running an individual test

# running an individual test
export NGROK_AUTHTOKEN="YOUR_AUTHTOKEN_HERE"; make test="-k TEST_CLASS.NAME_OF_TEST" test

See the MakeFile for more examples

HTTP2

The examples include a minimal hypercorn HTTP/2 example if you run make http2. You can curl the endpoint logged with INFO:ngrok.listener:Created and verify the HTTP/2 response from hypercorn.

curl --http2 -v https://<YOUR_LISTENER_URL>
*   Trying <YOUR_IP>:443...
* Connected to a6278d6c07ce.ngrok.app (<YOUR_IP>) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
...
> GET / HTTP/2
> Host: a6278d6c07ce.ngrok.app
> user-agent: curl/7.81.0
> accept: */*
>
...
< HTTP/2 200
< content-type: text/plain
< date: Fri, 01 Mar 2024 18:50:23 GMT
< ngrok-agent-ips: <YOUR_AGENT_IP>
< ngrok-trace-id: ed038ace04876818149cf0769bd43e38
< server: hypercorn-h2
<
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* TLSv1.2 (IN), TLS header, Supplemental data (23):
* Connection #0 to host <YOUR_LISTENER_URL> left intact
hello

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ngrok-1.1.0-cp37-abi3-win_amd64.whl (3.2 MB view details)

Uploaded CPython 3.7+Windows x86-64

ngrok-1.1.0-cp37-abi3-win32.whl (2.6 MB view details)

Uploaded CPython 3.7+Windows x86

ngrok-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ x86-64

ngrok-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl (3.0 MB view details)

Uploaded CPython 3.7+musllinux: musl 1.2+ ARM64

ngrok-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ x86-64

ngrok-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (2.6 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARMv7l

ngrok-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (4.5 MB view details)

Uploaded CPython 3.7+manylinux: glibc 2.17+ ARM64

ngrok-1.1.0-cp37-abi3-macosx_11_0_arm64.whl (2.7 MB view details)

Uploaded CPython 3.7+macOS 11.0+ ARM64

ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl (2.9 MB view details)

Uploaded CPython 3.7+macOS 10.12+ x86-64

ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl (5.6 MB view details)

Uploaded CPython 3.7+macOS 10.12+ universal2 (ARM64, x86-64)macOS 10.12+ x86-64macOS 11.0+ ARM64

File details

Details for the file ngrok-1.1.0-cp37-abi3-win_amd64.whl.

File metadata

  • Download URL: ngrok-1.1.0-cp37-abi3-win_amd64.whl
  • Upload date:
  • Size: 3.2 MB
  • Tags: CPython 3.7+, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.17

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 60d61c628bb6d5f245be210d1024a9f8e9dd5c427d4c1e3a1936cc836e0d246c
MD5 306d45ad2aa5190d4928efe89258e4ed
BLAKE2b-256 da57ec84c4738bbf16783e3f8c299139244799bc5dc0c2f55c6dc468c5e38520

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-win32.whl.

File metadata

  • Download URL: ngrok-1.1.0-cp37-abi3-win32.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: CPython 3.7+, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/0.14.17

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-win32.whl
Algorithm Hash digest
SHA256 dce7ef2810f2b0c3328142e434f782bd246a92881c404c48cf51ae28d45a7a63
MD5 2d70a00785c50f1f4af0454af861c446
BLAKE2b-256 8f571b8d96bd1c424add0405d388e7afa0d8e4a0b49732f4133e5d426ef15aea

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1c7056c5c4ea7cfdb4b3d12a8c6e195d523df388658408822ac57449d3523a2
MD5 4efc3ac379d10c3cc38480a195c71d15
BLAKE2b-256 9448316fc283eedd7c255f7df86b1719d4af12cb92cd2b39b143426b486d273f

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7fffa9c48485b72d18384d29f07d0f86a62f6ed0e88a635f31d5f46f1ef7f655
MD5 326cab355fea89dd0b42f458afbdbc18
BLAKE2b-256 4047abc88a8712260ea6a12ef9ac8861b3e37248b49c1612b6a2e418c7d53a1e

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 47675d6d5bba94ba3be47ac571a6acee22bad1be54b2fd5d07ee82cd8bf02365
MD5 c6d7729c3abb14274f75f1a80b8f3dc8
BLAKE2b-256 1094b279def599c5e7aa34727e75cd005befc9712a64153f2c0bc20861b82156

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 04a3c028322aebce424cff38e381d6f10b6460bd825dbb9b67ca454cdec82bf9
MD5 3a3df676db2f0d7c2190a68534114cd7
BLAKE2b-256 69706b68df85f19b241fcf1b4010bcb6343f3233bd26cd4a5e6d454e804997d8

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 778b00f0089a5b7b3c0cc9924bb7a4278a2aa27b8e4fd2bedbcbbb1baf8af70d
MD5 67458f3b37526ad088489c2d991d7fb5
BLAKE2b-256 68a18b88f44c1210c0155151b26be8b8cd9d1f01d3230b9e62bc4bdddc8837a1

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1a73a9743ba8655d6a40a77b350104856dc8e3570c91cea66d1da36ccc6e990b
MD5 e4de1625f094cbe6bd00803fd7ed0bff
BLAKE2b-256 9c29a356b58bb05ddc93e7de26b7f6b72857bd14756f07e8e4eed54e74e36fa6

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 02e0b5566a2f4736b6c6069da110258236a6e7f94f3c9ad60d2d61d0e2b64fce
MD5 9f9219d9fbcf88581d6eec571827cb9f
BLAKE2b-256 be04700473e952801fdfd8c5858bb4b66cf0ffa06bfd70f95930d9c3e2331c84

See more details on using hashes here.

File details

Details for the file ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl.

File metadata

File hashes

Hashes for ngrok-1.1.0-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl
Algorithm Hash digest
SHA256 2954bf1a6bbe73126e137b8f6d8eff263843e39dde8d075f8933ebe845a29c53
MD5 0e7ce4b9a1162c5a5b7c1ed13171f06a
BLAKE2b-256 a9133ff7779101c82170033e7335cf1eb62c5f09b6888ef41aa48d892b49de88

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page