datasette-publish-fly 作者 simonw

标星

README 源代码

datasette-publish-fly

PyPI Changelog Tests License

Datasette 插件,用于将 Datasette 实例部署到 Fly.io

项目背景:将 SQLite 和 Datasette 与 Fly Volumes 结合使用

安装

在与 Datasette 相同的环境中安装此插件。

$ datasette install datasette-publish-fly

部署只读数据

首先,通过遵循他们的指示安装 flyctl 命令行工具。

运行 flyctl auth signup 以在那里创建账户,如果你已有账户,则运行 flyctl auth login

你现在可以使用 datasette publish fly 来发布一个或多个 SQLite 数据库文件

datasette publish fly my-database.db --app="my-data-app"

你传递给 --app 的参数将用作你的应用程序的 URL:my-data-app.fly.dev

要更新应用程序,运行发布命令,将相同的应用程序名称传递给 --app 选项。

Fly 提供免费套餐,超出部分将按月为你的每个在线应用程序收费。他们定价的详细信息可以在他们的网站上找到

你的应用程序将部署在 https://your-app-name.fly.io/ - 请注意,首次部署时可能需要几分钟才能开始工作。

使用 Fly Volumes 创建可写数据库

Fly Volumes 为 Fly 应用程序提供持久性磁盘存储。卷可以是 1GB 或更大,并且 Fly 免费套餐包含 3GB 的卷空间。

Datasette 插件,例如 datasette-uploads-csvsdatasette-tiddlywiki,可以部署到 Fly 并将其可变数据存储在卷中。

⚠️ 如果你的数据库接受写入,则应仅运行单个应用程序实例。Fly 对在不同地理区域运行多个实例有出色的支持,但使用 Volumes 的 datasette-publish-fly 尚不兼容该模型。你可能应该改用 Fly PostgreSQL

以下是如何部署 datasette-tiddlywiki,并使用 datasette-auth-passwords 提供的身份验证。

首先,你需要创建一个根密码哈希,用于登录实例。

你可以通过安装插件并运行 datasette hash-password 命令来完成,或者使用这个托管工具

哈希应该看起来像 pbkdf2_sha256$... - 下一步你需要用到它。

在此示例中,我们还部署了一个名为 content.db 的只读数据库。

为你的新应用程序选择一个名称,然后运行以下命令

datasette publish fly \
content.db \
--app your-application-name \
--create-volume 1 \
--create-db tiddlywiki \
--install datasette-auth-passwords \
--install datasette-tiddlywiki \
--plugin-secret datasette-auth-passwords root_password_hash 'pbkdf2_sha256$...'

这将创建新的应用程序,部署 content.db 只读数据库,为该应用程序创建一个 1GB 的卷,在该卷中创建一个名为 tiddlywiki.db 的新数据库,然后安装这两个插件并配置你指定的密码。

更新使用卷的应用程序

一旦你使用卷部署了应用程序,你无需 --create-volume--create-db 选项即可更新该应用程序。要将 datasette-graphq 插件添加到你已部署的应用程序,你将运行以下命令

datasette publish fly \
content.db \
--app your-application-name \
--install datasette-auth-passwords \
--install datasette-tiddlywiki \
--install datasette-graphql \
--plugin-secret datasette-auth-passwords root_password_hash 'pbkdf2_sha256$...' \

由于应用程序名称相同,你不需要 --create-volume--create-db 选项 - 这些在部署之间会自动保留。

你需要指定你想要安装的完整插件列表,以及任何插件密钥。

你还需要包含作为实例一部分的任何只读数据库文件 - 例如本例中的 content.db - 否则新的部署将不包含它们。

高级卷用法

datasette publish fly 会向你的 Fly 应用程序添加一个名为 datasette 的卷。你可以使用 --volume name custom_name 选项自定义名称。

Fly 可以用于扩展应用程序,使其在全球多个区域运行多个实例。这与只读 Datasette 配合得很好,但目前不推荐将 Datasette 与卷一起使用,因为每个 Fly 副本都需要自己的卷,并且存储在一个实例中的数据在其他实例中将不可见。

如果你想使用多个带卷的实例,你需要切换到直接使用 flyctl 命令。下面描述的 --generate-dir 选项可以对此有所帮助。

生成但不部署

使用 --generate-dir 选项生成一个目录,该目录可以部署到 Fly,而不是直接部署

datasette publish fly my-database.db \
  --app="my-generated-app" \
  --generate-dir /tmp/deploy-this

然后你可以使用以下命令手动部署生成的应用程序

cd /tmp/deploy-this
flyctl apps create my-generated-app
flyctl deploy

datasette publish fly --help

... 传递给插件的密钥,例如 --plugin-secret datasette-auth-github client_id xxx --version-note TEXT 在 /-/versions 上显示的附加说明 --secret TEXT 用于签署安全值(如签名 cookie)的密钥 --title TEXT 元数据的标题 --license TEXT 元数据的许可证标签 --license_url TEXT 元数据的许可证 URL --source TEXT 元数据的源标签 --source_url TEXT 元数据的源 URL --about TEXT 元数据的关于标签 --about_url TEXT 元数据的关于 URL --spatialite 启用 SpatialLite 扩展 --region TEXT 要部署到的 Fly 区域,例如 sjc - 参见 https://fly.io/docs/reference/regions/ --create-volume INTEGER RANGE 创建并附加此大小(以 GB 为单位)的卷 [x>=1] --create-db TEXT 要创建的可写数据库文件名 --volume-name TEXT 要使用的卷名称 -a, --app TEXT 要部署的 Fly 应用名称 [必需] -o, --org TEXT 要部署到的 Fly 组织名称 --generate-dir DIRECTORY 输出生成的应用程序文件并停止而不部署 --show-files 输出生成的 Dockerfile、metadata.json 和 fly.toml --setting SETTING... 设置,参见 docs.datasette.io/en/stable/settings.html --crossdb 启用跨数据库 SQL 查询 --help 显示此消息并退出。">
Usage: datasette publish fly [OPTIONS] [FILES]...

  Deploy an application to Fly that runs Datasette against the provided database
  files.

  Usage example:

      datasette publish fly my-database.db --app="my-data-app"

  Full documentation: https://datasette.com.cn/plugins/datasette-publish-fly

Options:
  -m, --metadata FILENAME         Path to JSON/YAML file containing metadata to
                                  publish
  --extra-options TEXT            Extra options to pass to datasette serve
  --branch TEXT                   Install datasette from a GitHub branch e.g.
                                  main
  --template-dir DIRECTORY        Path to directory containing custom templates
  --plugins-dir DIRECTORY         Path to directory containing custom plugins
  --static MOUNT:DIRECTORY        Serve static files from this directory at
                                  /MOUNT/...
  --install TEXT                  Additional packages (e.g. plugins) to install
  --plugin-secret ...
                                  Secrets to pass to plugins, e.g. --plugin-
                                  secret datasette-auth-github client_id xxx
  --version-note TEXT             Additional note to show on /-/versions
  --secret TEXT                   Secret used for signing secure values, such as
                                  signed cookies
  --title TEXT                    Title for metadata
  --license TEXT                  License label for metadata
  --license_url TEXT              License URL for metadata
  --source TEXT                   Source label for metadata
  --source_url TEXT               Source URL for metadata
  --about TEXT                    About label for metadata
  --about_url TEXT                About URL for metadata
  --spatialite                    Enable SpatialLite extension
  --region TEXT                   Fly region to deploy to, e.g sjc - see
                                  https://fly.io/docs/reference/regions/
  --create-volume INTEGER RANGE   Create and attach volume of this size in GB
                                  [x>=1]
  --create-db TEXT                Names of read-write database files to create
  --volume-name TEXT              Volume name to use
  -a, --app TEXT                  Name of Fly app to deploy  [required]
  -o, --org TEXT                  Name of Fly org to deploy to
  --generate-dir DIRECTORY        Output generated application files and stop
                                  without deploying
  --show-files                    Output the generated Dockerfile, metadata.json
                                  and fly.toml
  --setting SETTING...            Setting, see
                                  docs.datasette.io/en/stable/settings.html
  --crossdb                       Enable cross-database SQL queries
  --help                          Show this message and exit.

开发

要为此工具做贡献,首先检出代码。然后创建一个新的虚拟环境

cd datasette-publish-fly
python -m venv venv
source venv/bin/activate

或者如果你正在使用 pipenv

pipenv shell

现在安装依赖项和测试依赖项

pip install -e '.[test]'

要运行测试

pytest

集成测试

位于 tests/test_integration.py 的测试会实际调用 Fly 以部署测试应用程序。

这些测试默认被跳过。如果你已经安装并配置了 flyctl,你可以像这样运行集成测试

pytest --integration -s

这里的 -s 选项确保部署的输出对你可见 - 否则测试可能看起来像是挂起了。

测试将在 Fly 上创建以 publish-fly-temp- 为前缀的应用程序,然后在运行结束时将其删除。