部署 Datasette

在互联网上部署 Datasette 实例最快捷的方法是使用 datasette publish 命令,在 发布数据 中描述。这可以用于快速将 Datasette 部署到多个托管服务提供商,包括 Heroku、Google Cloud Run 和 Vercel。

您可以使用此页面上的说明将 Datasette 部署到其他托管服务提供商。

部署基础

Datasette 可以作为一个监听某个端口的独立 datasette 进程来部署。Datasette 不应以 root 用户运行,因此该进程应监听更高的端口,例如 8000 端口。

如果您想在 80 端口(HTTP 默认端口)或 443 端口(用于 HTTPS)提供 Datasette 服务,您应该在代理服务器(如 nginx、Apache 或 HAProxy)后运行它。代理服务器可以监听 80/443 端口并将流量转发给 Datasette。

使用 systemd 运行 Datasette

您可以在 Ubuntu 或 Debian 系统上使用 systemd 运行 Datasette。

首先,确保您安装了 Python 3 和 pip。在 Ubuntu 上,您可以使用 sudo apt-get install python3 python3-pip

您可以将 Datasette 安装到虚拟环境中,或进行系统范围安装。要进行系统范围安装,请使用 sudo pip3 install datasette

现在为您的 Datasette 数据库创建一个文件夹,例如使用 mkdir /home/ubuntu/datasette-root

您可以像这样将一个测试数据库复制到该文件夹中

cd /home/ubuntu/datasette-root
curl -O https://latest.datasette.io/fixtures.db

/etc/systemd/system/datasette.service 创建一个文件,内容如下

[Unit]
Description=Datasette
After=network.target

[Service]
Type=simple
User=ubuntu
Environment=DATASETTE_SECRET=
WorkingDirectory=/home/ubuntu/datasette-root
ExecStart=datasette serve . -h 127.0.0.1 -p 8000
Restart=on-failure

[Install]
WantedBy=multi-user.target

DATASETTE_SECRET 添加一个随机值 - 这将用于对 Datasette 的 cookie 进行签名,例如 CSRF token cookie。您可以像这样生成一个合适的值

$ python3 -c 'import secrets; print(secrets.token_hex(32))'

此配置将针对 /home/ubuntu/datasette-root 目录中包含的所有数据库文件运行 Datasette。如果该目录包含 metadata.yml(或 .json)文件,或 templates/plugins/ 子目录,Datasette 将自动加载它们 - 有关详细信息,请参阅 配置目录模式

您可以使用以下命令启动 Datasette 进程

sudo systemctl daemon-reload
sudo systemctl start datasette.service

在修改 Datasette 的 metadata.json 配置或向该目录添加新的数据库文件后,您需要重新启动 Datasette 服务。您可以使用以下命令执行此操作

sudo systemctl restart datasette.service

服务启动后,您可以像这样确认 Datasette 正在 8000 端口运行

curl 127.0.0.1:8000/-/versions.json
# Should output JSON showing the installed version

Datasette 将无法从服务器外部访问,因为它正在监听 127.0.0.1。您可以改为监听 0.0.0.0 来暴露它,但更好的方法是设置代理,例如 nginx - 请参阅 在代理后运行 Datasette

使用 OpenRC 运行 Datasette

OpenRC 是非 systemd Linux 发行版(如 Alpine LinuxGentoo)上的服务管理器。

/etc/init.d/datasette 创建一个 init 脚本,内容如下

#!/sbin/openrc-run

name="datasette"
command="datasette"
command_args="serve -h 0.0.0.0 /path/to/db.db"
command_background=true
pidfile="/run/${RC_SVCNAME}.pid"

然后您需要配置服务在启动时运行并启动它

rc-update add datasette
rc-service datasette start

使用 buildpacks 部署

一些托管服务提供商,例如 HerokuDigitalOcean App PlatformScalingo,支持 Buildpacks 标准来部署 Python Web 应用程序。

在这些平台上部署 Datasette 需要两个文件:requirements.txtProcfile

requirements.txt 文件告知平台应该安装哪些 Python 包。它至少应包含 datasette,但也可以列出您希望安装的任何 Datasette 插件 - 例如

datasette
datasette-vega

Procfile 告知托管平台如何运行提供 Web 流量的命令。它应该看起来像这样

web: datasette . -h 0.0.0.0 -p $PORT --cors

$PORT 环境变量由托管平台提供。--cors 允许来自其他网站上运行的 JavaScript 对您的域进行 CORS 请求 - 如果您不想允许 CORS,请省略此项。您还可以在此处添加其他 Datasette 设置 选项。

这两个文件足以在任何支持 buildpacks 的主机上部署 Datasette。Datasette 将提供包含在应用程序根目录中的所有 SQLite 文件。

如果您想构建 SQLite 文件或作为部署过程的一部分下载它们,您可以使用 bin/post_compile 文件来实现。例如,以下 bin/post_compile 将下载一个示例数据库,然后由 Datasette 提供服务

wget https://fivethirtyeight.datasettes.com/fivethirtyeight.db

simonw/buildpack-datasette-demo 是一个示例 GitHub 仓库,展示了可以部署到支持 buildpack 的主机的 Datasette 配置。

在代理后运行 Datasette

您可能希望在 Apache 或 nginx 代理后运行 Datasette,使用您现有站点中的路径。

您可以使用 base_url 配置设置告诉 Datasette 使用特定的 URL 前缀提供流量。例如,您可以像这样运行 Datasette

datasette my-database.db --setting base_url /my-datasette/ -p 8009

这将使 Datasette 通过以下 URL 运行

  • http://127.0.0.1:8009/my-datasette/ - Datasette 主页

  • http://127.0.0.1:8009/my-datasette/my-database - my-database.db 数据库的页面

  • http://127.0.0.1:8009/my-datasette/my-database/some_table - some_table 表的页面

您现在可以设置您的 nginx 或 Apache 服务器将 /my-datasette/ 路径代理到此 Datasette 实例。

Nginx 代理配置

这里是一个 nginx 配置文件示例,它将流量代理到 Datasette

daemon off;

events {
  worker_connections  1024;
}
http {
  server {
    listen 80;
    location /my-datasette {
      proxy_pass http://127.0.0.1:8009/my-datasette;
      proxy_set_header Host $host;
    }
  }
}

您还可以使用 Datasette 的 --uds 选项来监听 Unix 域套接字而不是端口,并像这样配置 nginx 上游代理

daemon off;
events {
  worker_connections  1024;
}
http {
  server {
    listen 80;
    location /my-datasette {
      proxy_pass http://datasette/my-datasette;
      proxy_set_header Host $host;
    }
  }
  upstream datasette {
    server unix:/tmp/datasette.sock;
  }
}

然后使用 datasette --uds /tmp/datasette.sock path/to/database.db --setting base_url /my-datasette/ 运行 Datasette。

Apache 代理配置

对于 Apache,您可以使用 ProxyPass 指令。首先确保以下行未被注释

LoadModule proxy_module lib/httpd/modules/mod_proxy.so
LoadModule proxy_http_module lib/httpd/modules/mod_proxy_http.so

然后添加这些指令来代理流量

ProxyPass /my-datasette/ http://127.0.0.1:8009/my-datasette/
ProxyPreserveHost On

Datasette 在 Apache 后使用此代理设置运行的实时演示可在 datasette-apache-proxy-demo.datasette.io/prefix/ 查看。该演示的代码可在 demos/apache-proxy 目录中找到。

使用 --uds,您可以像 nginx 示例一样使用 Unix 域套接字

ProxyPass /my-datasette/ unix:/tmp/datasette.sock|http://localhost/my-datasette/

ProxyPreserveHost On 指令确保传入请求中的原始 Host: 头部传递给 Datasette。Datasette 需要此信息才能使用 .absolute_url(request, path) 方法正确组装到其他页面的链接。