From de1796d565798d120f024d53974d623cdecd7927 Mon Sep 17 00:00:00 2001 From: sophia parafina Date: Tue, 1 Sep 2026 16:06:51 -0600 Subject: [PATCH 1/4] Remove connect-vscode-to-geolab.md from guides branch File remains on the vscode branch. --- advanced_topics/connect-vscode-to-geolab.md | 165 -------------------- 1 file changed, 165 deletions(-) delete mode 100644 advanced_topics/connect-vscode-to-geolab.md diff --git a/advanced_topics/connect-vscode-to-geolab.md b/advanced_topics/connect-vscode-to-geolab.md deleted file mode 100644 index 2fe0f98..0000000 --- a/advanced_topics/connect-vscode-to-geolab.md +++ /dev/null @@ -1,165 +0,0 @@ -# Connecting VS Code to a GeoLab Jupyter Instance - -This guide covers both sides of the connection: getting a usable server URL -from inside GeoLab (the **Jupyter side**), and attaching your local VS Code to -that server (the **VS Code side**). - -GeoLab runs on a 2i2c-managed JupyterHub on Kubernetes. Each user gets a pod -with its own single-user Jupyter server behind the Hub proxy. VS Code connects -to that per-user server URL over HTTPS — there is no SSH into the pod, and no -special "proxy" extension is needed. - ---- - -## Prerequisites - -On your laptop: - -- **VS Code** -- **Jupyter extension** (`ms-toolsai.jupyter`) -- **Python extension** (`ms-python.python`) — installed automatically as a dependency of the Jupyter extension - -In GeoLab: - -- A **running server**. Log in at `https://geolab.earthscope.cloud` and start - your server so the pod is alive before you try to connect. If the pod is - culled or stopped, the URL and token become invalid. - ---- - -## Jupyter side: get a connectable URL - -The `url` field reported by Jupyter points at `0.0.0.0:8888`, which is the -pod-internal address and is not reachable from your laptop. You need to rebuild -the URL against the public Hub host and append the server token. - -Open a notebook in your running GeoLab server and run this in a cell: - -```python -from jupyter_server.serverapp import list_running_servers - -data = list(list_running_servers()) - -def to_vscode_url(server_info, hub_host="https://geolab.earthscope.cloud"): - """Convert jupyter_server list output into a VS Code-connectable URL. - - Replaces the internal 0.0.0.0:8888 URL with the public Hub host, - keeping the (already URL-encoded) user path and appending the token. - """ - s = server_info[0] if isinstance(server_info, list) else server_info - base_url = s["base_url"].rstrip("/") - token = s["token"] - return f"{hub_host.rstrip('/')}{base_url}/?token={token}" - -print(to_vscode_url(data)) -``` - -This prints a line like: - -``` -https://geolab.earthscope.cloud/user/google-oauth2%7C112969120435953538875/?token=0f22dabff13f4ad48a45fe1ebebcc105 -``` - -Copy that entire line — you will paste it into VS Code in the next section. - -![Get GeoLab instance URL](../img/geolab_url.png) - -### Notes on the URL - -- The `%7C` in the path is an already-encoded `|` (pipe) from your OAuth2 user - ID. Leave it as-is. Do not re-encode it, or it becomes `%257C` and the path - breaks. -- The token identifies your session. Treat it like a password and do not commit - it or share it. -- If the token comes back empty or VS Code later rejects it, request a Hub API - token instead: go to `https://geolab.earthscope.cloud/hub/token`, click - **Request new API token**, and substitute that value for the `token` in the - URL. - ---- - -## VS Code side: connect to the server - -1. Install the **Jupyter** extension (`ms-toolsai.jupyter`) from the Extensions - view if you have not already. - -![Installing ms-toolsai](../img/add_ms-toolsai_extension.png) - -2. Open or create a notebook file (`.ipynb`) in VS Code. - -3. Click the **kernel picker** in the top-right of the notebook (it may read - "Select Kernel"). - -![Select Kernel](../img/select_kernel_vscode.png) - -4. Choose **Select Another Kernel...** - -![Select anther kernel](../img/select_another_kernel.png) - -5. Choose **Existing Jupyter Server...** - -![Exisiting Jupyter Server](../img/existing_jupyter_server.png) - -6. Choose **Enter the URL of a running Jupyter server**. - -![Enter URL](../img/enter_url_jupyter_server.png) - -7. Paste the full tokenized URL you copied from GeoLab, including the - `?token=...` part, then press Enter. - -8. When prompted, accept or edit the display name for the server. - -![Accept display name](../img/jupyter_server_display_name.png) - -9. Back in the kernel picker, select the kernel exposed by the remote server - (for example, the Python 3 kernel from your GeoLab environment). - -![Select kernel](../img/select_jupyter_kernel.png) - -10. Run a cell to confirm. Execution now happens inside your GeoLab pod, using - the GeoLab environment and compute — not your laptop. - ---- - -## Verifying you are on the remote kernel - -Run this in a cell. It should report the pod's paths and hostname, not your -laptop's: - -```python -import sys, socket, os -print("hostname:", socket.gethostname()) -print("python: ", sys.executable) -print("cwd: ", os.getcwd()) -``` - -On GeoLab you should see something like a `jupyter-...` hostname, a Python -executable under `/srv/conda/` or similar, and a working directory of -`/home/jovyan`. - ---- - -## Troubleshooting - -**"Cannot connect" or the connection times out.** -The most common cause is that your server is not running. Open the URL in a -browser first to spin up / confirm the pod, then retry in VS Code. - -**Token rejected.** -The single-user server token is sometimes empty or not accepted through the Hub -proxy. Use a Hub API token from `https://geolab.earthscope.cloud/hub/token` -instead, and rebuild the URL with it. - -**Path looks wrong (404).** -Confirm the `/user//` segment matches exactly what appears in your browser's -address bar while you are in JupyterLab. Do not manually decode the `%7C`. - -**Connection worked earlier, now fails.** -Hub servers get culled after inactivity. When the pod restarts, the URL and/or -token change. Re-run the snippet on the Jupyter side to get a fresh URL. - -**Looking for a "jupyter-server-proxy" VS Code extension.** -There isn't one, and you do not need it. `jupyter-server-proxy` is a -server-side package for proxying other web apps (like the Dask dashboard) -through the Hub; it plays no role in the VS Code connection. The Jupyter -extension talks to the server URL directly. From c661f962feec07ebb270079ca4a8c4e5922f9298 Mon Sep 17 00:00:00 2001 From: sophia parafina Date: Wed, 9 Sep 2026 14:25:03 -0600 Subject: [PATCH 2/4] renamed doc to creating_temporary_environments, updated myst.yml --- .../creating_temporary_environments.md | 185 ++++++++++++++++++ myst.yml | 2 +- 2 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 advanced_topics/environments/creating_temporary_environments.md diff --git a/advanced_topics/environments/creating_temporary_environments.md b/advanced_topics/environments/creating_temporary_environments.md new file mode 100644 index 0000000..e66c46f --- /dev/null +++ b/advanced_topics/environments/creating_temporary_environments.md @@ -0,0 +1,185 @@ +# Creating Your Own Python Environment in GeoLab + +Python notebooks use packages: collections of reusable code that perform tasks like processing data, making maps, or analyzing signals. A notebook may need packages that aren't available at run time. An **environment** is a way to keep all of those packages organized in one tidy, self-contained workspace. + +When you launch GeoLab, you are in environment with commonly used geophysical packages. This guide shows you how to create your own environment in GeoLab. + +--- + +## What Is a Package Manager? + +GeoLab uses a tool called **conda** to install and manage packages. Think of conda like an app store for Python packages: you tell it what you want, it figures out what else is needed to make it work, and installs everything together. + +> **Heads up:** GeoLab resets when you sign out, so any packages you installed during a session won't be there next time. The solution is to define your environment in a file (explained below) so you can recreate it anytime. + +--- + +## See What's Already Installed + +Open the **terminal** in GeoLab and try these commands to get your bearings. + +**See all available environments:** + +```bash +conda env list +``` + +The one with a `*` is the currently active environment: + +```text +# conda environments: +# +base * /srv/conda +notebook /srv/conda/envs/notebook +custom_environment /home/jovyan/.conda/envs/custom_environment +``` + +**See all packages in the current environment:** + +```bash +conda list +``` + +This prints a long list. Each row shows a package name, its version, and where it came from: + +```text +# Name Version Build Channel +cartopy 0.24.1 py312h78ddc71_0 conda-forge +numpy 2.2.4 py312h7e3fe57_0 conda-forge +obspy 1.4.1 py312h7b8d3f4_0 conda-forge +xarray 2025.3.0 pyhd8ed1ab_0 conda-forge +… +``` + +--- + +## Installing a Package Without Creating a New Environment + +If you just need to add one or several packages, you can install them directly from inside a notebook cell using the line magic `%` command. This installs into the notebook's active environment: + +```python +%conda install -c conda-forge pandas +``` + +Or, for packages only available on PyPI (a different package source): + +```python +%pip install earthscope-sdk +``` + +> **Warning:** Installing with `%conda` inside a notebook can use a lot of memory because it checks for dependency conflicts among packages and selects the correct packages fix conflicts. If your notebook becomes unresponsive or the kernel crashes, use the `environment.yml` approach instead, which is more reliable for larger installs. Installing packages with pip uses less memory but does not fix dependency conflicts. Try installing with conda first, use pip if the package is not available in the conda-forge repository. + +--- + +## Create Your Own Environment + +The best method to create a custom environment is to write a file that lists every package required. Conda reads the file and builds the environment from it. This ensures you can recreate the exact same environment later, and the file can be shared, making the environment reproducible. + +> **IMPORTANT**: This section describes building a new environment that does not include the packages in the default GeoLab environment. + +### Step 1: Write an `environment.yml` File + +Open an editor, create a new file called `environment.yml`, and add the following: + +```yml +name: my_environment +channels: + - conda-forge +dependencies: + - python=3.11 + - ipykernel + - numpy + - matplotlib + # Pip-specific packages + - pip: + - seisbench +``` + +Here's what each part means: + +- **name**: What to call the environment. +- **channels**: Where to download packages from (`conda-forge` is a large, reliable source). +- **dependencies**: The packages to be installed. +- `ipykernel` is required so the environment can be used as a notebook kernel, so always include it. +- `- pip:` installs packages only available in the PyPI repository, such as seisbench. The majority of pip packages will install without a dependency conflict. If a conflict exists when running your code, Python will provide an error message and suggest the versions of packages that do not conflict. You will have manually resolve the conflict by installing the suggested packages. + +Replace `numpy`, `matplotlib`, or `seisbench` with the required packages. + +### Step 2: Build the Environment + +In the **terminal**, run: + +```bash +conda env create -f environment.yml +``` + +Alternatively, if you want to permanently add packages to the default GeoLab environment, you can export `environment.yaml` and edit the file with packages you want to install. + +```bash +conda env export > environment.yml +``` + +Conda will figure out which versions of everything are compatible and download them. This can take a few minutes, which is normal. + +> **If it fails:** Read the error message. Conda usually names the package that's causing the problem. Try removing it from the file or changing its version. + +### Step 3: Activate the Environment + +```bash +conda activate my_environment +``` + +Activating an environment switches the terminal into that workspace, so any Python commands you run use that environment's packages. The terminal prompt will update to show the environment name, confirming it worked. + +### Step 4: Register It as a Notebook Kernel + +A new environment isn't automatically available in Jupyter notebooks. To use the newly created environment, it has to be registered. Run this command **in the terminal** to register it: + +```bash +python -m ipykernel install --user --name my_environment --display-name "Python (my_environment)" +``` + +### Step 5: Switch to Your Environment in a Notebook + +1. Open a notebook and go to **Kernel > Change Kernel…** + + ![Kernel menu showing the Change Kernel option](../../img/select_kernel.png) + +2. Select **Python (my_environment)**. + + ![Kernel selector dialog with custom environment listed](../../img/select_custom.png) + +3. Check the upper-right corner of the notebook to confirm the kernel changed. + + ![Notebook header showing the active custom environment kernel](../../img/custom_env.png) + +> **Note:** This must be done for each notebook separately. There isn't a way to set it as the default for all notebooks. + +--- + +## Quick Reference for Environments + +| What you want to do | Command | +| --- | --- | +| See all environments | `conda env list` | +| See installed packages | `conda list` | +| Activate an environment | `conda activate ` | +| Leave an environment | `conda deactivate` | +| Build from a file | `conda env create -f environment.yml` | +| Register as a kernel | `python -m ipykernel install --user --name --display-name "