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 应用程序提供持久性磁盘存储。卷可以是 1GB 或更大,并且 Fly 免费套餐包含 3GB 的卷空间。
Datasette 插件,例如 datasette-uploads-csvs 和 datasette-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
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-
为前缀的应用程序,然后在运行结束时将其删除。