在 Vercel 和 Netlify 上部署#

VercelNetlify 是用于部署静态网站的流行托管平台。

它们使从现有 Git 存储库托管静态网站变得简单方便,并通过其 CDN 使其广泛可用。

Netlify#

要在 Netlify 上部署您自己的 JupyterLite,您可以从 JupyterLite 演示开始,通过模板生成一个新的存储库。

然后添加一个内容为 3.9runtime.txt 文件,以指定 Python 3.9 作为依赖项。

最后,将 jupyter lite build --contents content --output-dir dist 指定为“构建命令”,并将 dist 指定为“发布目录”。

netlify-build

您可能还想指定 --debug 标志以获取额外的日志消息。

deploy-logs

Vercel#

就像 Netlify 一样,Vercel 可以连接到现有的 Git 存储库,并在推送和 PR 事件(预览)上无缝部署静态文件。

这里的配置与 Netlify 非常相似。您可以指定相同的 jupyter lite build --contents content --output-dir dist 构建命令,并将 dist 配置为发布目录。

使用 micromamba 创建构建环境#

像 Netlify 和 Vercel 这样的托管平台的构建环境通常对构建机器上安装的 Python 版本有有限的控制。

在他们的构建镜像只包含 Python 3.6 而 JupyterLite 需要 Python 3.9+ 的一段时间内就是如此。这在某些情况下可能会受到限制,特别是当您想对构建有更多控制时。

幸运的是,可以运行任意 bash 脚本,这提供了一个方便的逃生口。

requirements-deploy.txt 文件中指定 Python 包,如果需要可以添加额外的依赖项。

jupyterlab~=3.4
jupyterlite-core
jupyterlite-pyodide-kernel

然后创建一个包含以下内容的新 deploy.sh 文件。

#!/bin/bash
set -e

# Install wget
# yum is not available on netlify, but it´s not a problem because wget is already installed, this validation is just to avoid errors on build step.
if command -v yum &> /dev/null; then
    yum install wget -y
fi

# Download and extract Micromamba
wget -qO- https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -xvj bin/micromamba

# Set up environment variables
export MAMBA_ROOT_PREFIX="$PWD/micromamba"
export PATH="$PWD/bin:$PATH"

# Create the environment
micromamba create -n jupyterenv python=3.12 -c conda-forge -y

# Install dependencies via pip in the micromamba environment
micromamba run -n jupyterenv python -m pip install -r requirements-deploy.txt

# Build JupyterLite
micromamba run -n jupyterenv jupyter lite --version
micromamba run -n jupyterenv jupyter lite build --contents content --output-dir dist

Micromamba 创建一个新的自包含环境,这使得安装任何所需的包变得非常方便,而不受构建镜像的限制。

然后配置构建命令和输出目录,例如在 Vercel 上。

image

您可能还想指定 --debug 标志以获取额外的日志消息。

jupyter lite build --debug

配置 HTTP 标头#

从 JupyterLite 0.4.0 开始,通过使用 SharedArrayBuffer 浏览器功能与内核进行同步通信,可以更可靠地从内核访问文件系统。有关更多信息,请参阅内容指南

但是,这需要为 SharedArrayBuffer 在页面上启用设置两个 HTTP 标头。

将标头添加到 Netlify#

在仓库的根目录下创建一个 netlify.toml 文件,内容如下。

[[headers]]
for = "/*"
  [headers.values]
    Cross-Origin-Opener-Policy = "same-origin"
    Cross-Origin-Embedder-Policy = "require-corp"

将标头添加到 Vercel#

在仓库的根目录下创建一个 vercel.json 文件,内容如下。

{
  "headers": [
    {
      "source": "/(.*)",
      "headers": [
        {
          "key": "Cross-Origin-Embedder-Policy",
          "value": "require-corp"
        },
        {
          "key": "Cross-Origin-Opener-Policy",
          "value": "same-origin"
        }
      ]
    }
  ]
}