3
3
# Spawning and proxying a web service from JupyterHub
4
4
5
5
The ` standalone ` feature of Jupyter Server Proxy enables JupyterHub Admins to launch and proxy arbitrary web services
6
- directly, in place of the JupyterLab or Notebook. You can use Jupyter Server Proxy to spawn a single proxy,
6
+ directly, instead of JupyterLab or Notebook. You can use Jupyter Server Proxy to spawn a single proxy,
7
7
without it being attached to a Jupyter server. The proxy securely authenticates and restricts access to authorized
8
- users through JupyterHub, giving a unified way to securely provide arbitrary applications.
8
+ users through JupyterHub, providing a unified way to access arbitrary applications securely .
9
9
10
- This works similar to {ref}` proxying Server Processes <server-process> ` , where a server process is started and proxied.
10
+ This works similarly to {ref}` proxying Server Processes <server-process> ` , where a server process is started and proxied.
11
11
The Proxy is usually started from the command line, often by modifying the ` Spawner.cmd ` in your
12
12
[ JupyterHub Configuration] ( https://jupyterhub.readthedocs.io/en/stable/tutorial/getting-started/spawners-basics.html ) .
13
13
@@ -16,7 +16,7 @@ This feature builds upon the work of [Dan Lester](https://github.com/danlester),
16
16
17
17
## Installation
18
18
19
- This feature has a dependency to JupyterHub and must be explicitly installed via an optional dependency:
19
+ This feature has a dependency on JupyterHub and must be explicitly installed via an optional dependency:
20
20
21
21
``` shell
22
22
pip install jupyter-server-proxy[standalone]
@@ -32,17 +32,17 @@ The standalone proxy is controlled with the `jupyter standaloneproxy` command. Y
32
32
jupyter standaloneproxy -- voila --no-browser --port={port} /path/to/some/Notebook.ipynb
33
33
```
34
34
35
- Executing this command will spawn a new HTTP Server, which will spawn the voilà dashboard and render the notebook.
35
+ Executing this command will spawn a new HTTP Server, creating the voilà dashboard and rendering the notebook.
36
36
Any template strings (like the ` --port={port} ` ) inside the command will be automatically replaced when the command is
37
37
executed.
38
38
39
- The CLI has multiple advanced options to customize the behavior of the proxy. Execute ` jupyter standaloneproxy --help `
39
+ The CLI has multiple advanced options to customize the proxy behavior . Execute ` jupyter standaloneproxy --help `
40
40
to get a complete list of all arguments.
41
41
42
- ### Specify address and port
42
+ ### Specify the address and port
43
43
44
- The proxy will try to extract the address and port from the ` JUPYTERHUB_SERVICE_URL ` environment variable, which is
45
- set if an application is launched by JupyterHub. Otherwise, it will be launched on ` 127.0.0.1:8888 ` .
44
+ The proxy will try to extract the address and port from the ` JUPYTERHUB_SERVICE_URL ` environment variable. This variable
45
+ will be set by JupyterHub. Otherwise, the server will be launched on ` 127.0.0.1:8888 ` .
46
46
You can also explicitly overwrite these values:
47
47
48
48
``` shell
@@ -52,7 +52,7 @@ jupyter standaloneproxy --address=localhost --port=8000 ...
52
52
### Disable Authentication
53
53
54
54
For testing, it can be useful to disable the authentication with JupyterHub. Passing ` --skip-authentication ` will
55
- not triggering the login process when accessing the application.
55
+ not trigger the login process when accessing the application.
56
56
57
57
``` {warning} Disabling authentication will leave the application open to anyone! Be careful with it,
58
58
especially on multi-user systems.
@@ -61,15 +61,15 @@ especially on multi-user systems.
61
61
## Usage with JupyterHub
62
62
63
63
To launch a standalone proxy with JupyterHub, you need to customize the ` Spawner ` inside the configuration
64
- using traitlets:
64
+ using ` traitlets ` :
65
65
66
66
``` python
67
67
c.Spawner.cmd = " jupyter-standaloneproxy"
68
68
c.Spawner.args = [" --" , " voila" , " --no-browser" , " --port={port} " , " /path/to/some/Notebook.ipynb" ]
69
69
```
70
70
71
71
This will hard-code JupyterHub to launch voilà instead of ` jupyterhub-singleuser ` . In case you want to give the users
72
- of the JupyterHub the ability to select which application to launch (like selecting either JupyterLab or voilà),
72
+ of JupyterHub the ability to select which application to launch (like selecting either JupyterLab or voilà),
73
73
you will want to make this configuration optional:
74
74
75
75
``` python
@@ -108,15 +108,14 @@ This executable is usually a wrapper around the `JupyterLab` or `Notebook` appli
108
108
additions regarding authentication and multi-user systems.
109
109
In the standalone feature, we try to mimic these additions, but instead of using ` JupyterLab ` or ` Notebook ` , we
110
110
will wrap them around an arbitrary web application.
111
- This will ensure only authenticated access to the application, while providing direct access to the application
112
- without needing a Jupyter server to be running in the background.
113
- The different additions will be discussed in more detail below.
111
+ This will ensure direct, authenticated access to the application, without needing a Jupyter server to be running
112
+ in the background. The different additions will be discussed in more detail below.
114
113
115
114
### Structure
116
115
117
116
The standalone feature is built on top of the ` SuperviseAndProxyhandler ` , which will spawn a process and proxy
118
- requests to this server. While this process is called _ Server_ in the documentation, I will call it _ Application _
119
- here, to avoid confusion with the other server where the ` SuperviseAndProxyhandler ` is attached to.
117
+ requests to this server. While this process is called _ Server_ in the documentation, the term _ Application _ will be
118
+ used here, to avoid confusion with the other server where the ` SuperviseAndProxyhandler ` is attached to.
120
119
When using jupyter-server-proxy, the proxies are attached to the Jupyter server and will proxy requests
121
120
to the application.
122
121
Since we do not want to use the Jupyter server here, we instead require an alternative server, which will be used
@@ -127,9 +126,9 @@ For that, we use tornado `HTTPServer`.
127
126
128
127
One central component is the authentication with the JupyterHub Server.
129
128
Any client accessing the application will need to authenticate with the JupyterHub API, which will ensure only
130
- the user themselves (or otherwise allowed users, e.g., admins) can access the application.
129
+ users themselves (or otherwise allowed users, e.g., admins) can access the application.
131
130
The Login process is started by deriving our ` StandaloneProxyHandler ` from
132
- [ jupyterub .services.auth.HubOAuthenticated] ( https://github.com/jupyterhub/jupyterhub/blob/5.0.0/jupyterhub/services/auth.py#L1541 )
131
+ [ jupyterhub .services.auth.HubOAuthenticated] ( https://github.com/jupyterhub/jupyterhub/blob/5.0.0/jupyterhub/services/auth.py#L1541 )
133
132
and decorating any methods we want to authenticate with ` tornado.web.authenticated ` .
134
133
For the proxy, we just decorate the ` proxy ` method with ` web.authenticated ` , which will authenticate all routes on all HTTP Methods.
135
134
` HubOAuthenticated ` will automatically provide the login URL for the authentication process and any
@@ -140,21 +139,21 @@ This redirect will be received on the `/oauth_callback` path, from where we need
140
139
root of the application.
141
140
We use the [ HubOAuthCallbackHander] ( https://github.com/jupyterhub/jupyterhub/blob/5.0.0/jupyterhub/services/auth.py#L1547 ) ,
142
141
another handler from the JupyterHub package, for this.
143
- It will also cache the received OAuth state from the login, so that we can skip authentication for the next requests
142
+ It will also cache the received OAuth state from the login so that we can skip authentication for the next requests
144
143
and do not need to go through the whole login process for each request.
145
144
146
145
### SSL certificates
147
146
148
- In some JupyterHub configurations, the launched application will be configured to use an SSL certificate for request
147
+ In some JupyterHub configurations, the launched application will be configured to use an SSL certificate for requests
149
148
between the JupyterLab / Notebook and the JupyterHub API. The path of the certificate is given in the
150
149
` JUPYTERHUB_SSL_* ` environment variables. We use these variables to create a new SSL Context for both
151
150
the ` AsyncHTTPClient ` (used for Activity Notification, see below) and the ` HTTPServer ` .
152
151
153
152
### Activity Notifications
154
153
155
154
The ` jupyterhub-singleuser ` will periodically send an activity notification to the JupyterHub API and inform it that
156
- the currently running application is still active. Whether this information is actually used or not depends on the
157
- specific configuration of this JupyterHub.
155
+ the currently running application is still active. Whether this information is used or not depends on the specific
156
+ configuration of this JupyterHub.
158
157
159
158
### Environment Variables
160
159
0 commit comments