跳转到主要内容

使用Fly发布数据的Datasette插件

项目描述

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卷存储可写数据库

Fly 为Fly应用程序提供持久磁盘存储。卷大小可以是1GB或更大,Fly免费层包括3GB的卷空间。

datasette-uploads-csvsdatasette-tiddlywiki之类的Datasette插件可以部署到Fly,并将它们可变数据存储在卷中。

:警告: 如果您的数据库接受写入,则应仅运行一个应用程序实例。Fly 对在不同地理区域运行多个实例具有出色的支持,但使用卷的 datasette-publish-fly 还不兼容此模式。您可能需要使用 Fly PostgreSQL

以下是使用 datasette-auth-passwords 提供的认证部署 datasette-tiddlywiki 的方法。

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

您可以通过安装插件并运行 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-graphql 插件添加到您的已部署应用程序中,请运行以下命令

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 将添加一个名为 datasette 的卷到您的 Fly 应用程序。您可以使用 --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

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.io/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 <TEXT TEXT TEXT>...
                                  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- 为前缀的应用程序,然后在运行结束时删除它们。

项目详细信息


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

datasette-publish-fly-1.3.1.tar.gz (19.6 kB 查看哈希值)

上传时间 源代码

构建分发

datasette_publish_fly-1.3.1-py3-none-any.whl (13.5 kB 查看哈希值)

上传时间 Python 3

由以下支持