# Fly Fly 是一个托管平台,支持运行服务器应用程序和数据库,专注于边缘计算。更多信息请参阅[官网](https://fly.io/)。 !!! note "注意" 本文档指定的命令受 [Fly 价格](https://fly.io/docs/about/pricing/)约束,继续之前确保你已经了解它。 ## 注册 如果你没有账号,你需要[注册](https://fly.io/app/sign-up)一个。 ## 安装 flyctl 你与 Fly 的主要交互方式是使用专用的 CLI 工具 `flyctl`,你需要安装该工具。 ### macOS ```bash brew install flyctl ``` ### Linux ```bash curl -L https://fly.io/install.sh | sh ``` ### 其它安装选项 有关更多选项和详细信息,请参阅 [flyctl 文档](https://fly.io/docs/flyctl/install/)。 ## 登录 通过终端登录,运行如下命令: ```bash fly auth login ``` ## 配置你的 Vapor 项目 在部署到 Fly 之前,确保你的 Vapor 项目包含一个配置好的 Dockerfile 文件。因为 Fly 需要使用它来构建你的应用程序。在大多数情况下,这很容易,因为默认的 Vapor 模板已经包含了一个 Dockerfile 文件 。 ### 创建新的 Vapor 项目 创建新项目的最简单方式是使用模板。你可以使用 GitHub 模板或 Vapor 工具箱创建模板。如果你需要一个数据库,推荐使用 Fluent 和 Postgres;Fly 可以轻松创建一个 Postgres 数据库,以便连接你的应用程序(请参阅下面的[具体章节](#postgres))。 #### 使用 Vapor 工具箱 首先,确保你已安装了 Vapor 工具箱(请参见 [macOS](../install/macos.zh.md#install-toolbox) 或 [Linux](../install/linux.zh.md#install-toolbox) 的安装说明)。使用以下命令创建新应用程序,替换 `app-name` 为所需的应用程序名称: ```bash vapor new app-name ``` 该命令将显示一个交互式提示,让你配置 Vapor 项目,如果需要,你可以在此选择 Fluent 和 Postgres 。 #### 使用 GitHub 模板 在以下列表中选择最适合你需求的模板。你可以使用 Git 将其克隆到本地,也可以使用“使用此模板”按钮创建一个 GitHub 项目。 - [Barebones template](https://github.com/vapor/template-bare) - [Fluent/Postgres template](https://github.com/vapor/template-fluent-postgres) - [Fluent/Postgres + Leaf template](https://github.com/vapor/template-fluent-postgres-leaf) ### 已有的 Vapor 项目 如果你有一个现有的 Vapor 项目,请确保项目的根目录中有一个正确配置的 `Dockerfile` 文件;[Vapor 文档中关于使用 Docker](../deploy/docker.zh.md) 和 [Fly 文档中关于通过 Dockerfile 部署应用程序](https://fly.io/docs/languages-and-frameworks/dockerfile/)可能会对你有所帮助。 ## 在 Fly 上启动应用 一旦你的 Vapor 项目准备就绪,就可以在 Fly 上启动它。 首先,确保你的当前目录设置为 Vapor 应用程序的根目录,并运行以下命令: ```bash fly launch ``` 这将启动一个交互式提示,以配置你的 Fly 应用程序设置: - **Name:** 你可以输入一个名称,或保留空白以获取自动生成的名称。 - **Region:** 默认情况下,为用户当前所在区域。你可以选择使用它或列表中的任何其他区域。后期可以更改。 - **Database:** 你可以要求 Fly 创建一个数据库与应用程序一起使用。如果你愿意,你始终可以使用 `fly pg create` 和 `fly pg attach` 命令进行相同的操作(详细信息,请参阅[配置 Postgres 部分](#postgres)。 `fly launch` 命令会自动创建一个 `fly.toml` 文件。它包含私有/公共端口映射、健康检查参数等设置。如果你刚刚使用 `vapor new` 从头开始创建了一个新项目,则默认的 `fly.toml` 文件不需要更改。如果你有一个现有的项目,则 `fly.toml` 可能只需要进行轻微的更改。你可以在 [fly.toml 文档](https://fly.io/docs/reference/configuration/)中找到更多信息。 请注意,如果你请求 Fly 创建一个数据库,则必须等待一段时间才能创建并通过健康检查。 在退出之前,`fly launch` 命令将询问你是否要立即部署应用程序。你可以接受或稍后使用 `fly deploy` 进行部署。 !!! tip "建议" 当前目录在你的应用程序根目录中时,fly CLI 工具会自动检测到 `fly.toml` 文件的存在,从而让 Fly 知道命令作用于哪个应用程序。如果你想无论在哪个目录都能针对特定的应用程序,请在大多数 Fly 命令后面附加 `-a 你的应用程序名称`。 ## 部署 每当你部署新更改到 Fly 时,运行 `fly deploy` 命令。 Fly 会读取你的目录中的 `Dockerfile` 和 `fly.toml` 文件来确定如何构建和运行你的 Vapor 项目。 一旦你的容器构建完成,Fly 会启动一个实例。它将运行各种健康检查,确保你的应用程序正常运行并且你的服务器响应请求。如果健康检查失败,`fly deploy` 命令将退出并显示错误消息。 默认情况下,如果新版本健康检查失败,Fly 会回滚到最新的可用版本。 ## 配置 Postgres ### 在 Fly 上创建一个 Postgres 数据库 如果你在第一次启动应用时没有创建数据库应用,你可以使用以下命令创建: ```bash fly pg create ``` 这个命令创建了一个 Fly 应用程序,可以为其他 Fly 上的应用程序提供数据库服务,详情请参阅 [Fly 文档](https://fly.io/docs/postgres/)。 创建完数据库应用之后,进入你的 Vapor 应用程序的根目录,运行以下命令: ```bash fly pg attach name-of-your-postgres-app ``` 如果你不知道你的 Postgres 应用程序的名称,可以使用 `fly pg list` 命令查找。 `fly pg attach` 命令创建了一个数据库和一个专门针对你的应用程序的用户,然后通过 `DATABASE_URL` 环境变量将其暴露给你的应用程序。 !!! note "注意" `fly pg create` 和 `fly pg attach` 的区别在于前者分配和配置了一个能够托管 Postgres 数据库的 Fly 应用程序,而后者则创建了一个实际的数据库和用户,以供你选择的应用程序使用。只要符合你的要求,单个 Postgres Fly 应用程序就可以托管多个由不同应用程序使用的数据库。当你在 `fly launch` 中请求 Fly 创建一个数据库应用程序时,Fly 会执行相当于调用 `fly pg create` 和 `fly pg attach` 两个命令的操作。 ### 连接 Vapor 应用程序到数据库 一旦你的应用程序已连接到数据库,Fly 会将 `DATABASE_URL` 环境变量设置为包含你的凭据的连接 URL(它应该被视为敏感信息)。 对于大多数常见的 Vapor 项目设置,你可以在 `configure.swift` 文件中配置你的数据库。下面是你可能想要执行的操作: ```swift if let databaseURL = Environment.get("DATABASE_URL") { try app.databases.use(.postgres(url: databaseURL), as: .psql) } else { // 在这里处理缺少 DATABASE_URL 的情况... // // 或者,你也可以根据 app.environment 是否设置为 .development 或 .production 来设置不同的配置 } ``` 此时,你的项目应该已准备好运行迁移并使用数据库了。 ### 运行迁移 使用 `fly.toml` 的 `release_command`,可以要求 Fly 在运行主服务器进程之前运行某个命令。将其添加到 `fly.toml` 中: ```toml [deploy] release_command = "migrate -y" ``` !!! note "注意" 上面的代码片段假设你正在使用默认的 Vapor Dockerfile,该文件将你的应用程序 `ENTRYPOINT` 设置为 `./App`。具体来说,这意味着当你将 `release_command` 设置为 `migrate -y` 时,Fly 将调用 `./App migrate -y`。如果你的 `ENTRYPOINT` 设置为其他值,则需要调整 `release_command` 的值。 Fly 将在具有访问 Fly 内部网络、密钥和环境变量的临时实例中运行你的发布命令。 如果你的发布命令失败,部署将无法继续。 ### 其他数据库 虽然 Fly 使创建 Postgres 数据库应用程序变得容易,但也可以托管其他类型的数据库(例如,请参阅 Fly 文档中的 [”使用 MySQL 数据库“](https://fly.io/docs/app-guides/mysql-on-fly/))。 ## 密钥和环境变量 ### 密钥 使用密钥将任何敏感值设置为环境变量。 ```bash fly secrets set MYSECRET=A_SUPER_SECRET_VALUE ``` !!! warning "警告" 请注意,大多数 shell 都会保留你输入的命令历史记录。在使用此方式设置密钥时要注意。某些 shell 可以配置为不记录以空格为前缀的命令。请参阅 [`fly secrets import` 命令](https://fly.io/docs/flyctl/secrets-import/)的文档。 更多信息,请参阅 [`fly secrets` 文档](https://fly.io/docs/apps/secrets/) 。 ### 环境变量 你可以在 [`fly.toml`](https://fly.io/docs/reference/configuration/#the-env-variables-section) 中设置其他非敏感的环境变量,例如: ```toml [env] MAX_API_RETRY_COUNT = "3" SMS_LOG_LEVEL = "error" ``` ## SSH连接 你可以使用以下方式连接到应用实例: ```bash fly ssh console -s ``` ## 查看日志 你可以使用以下命令查看应用程序的实时日志: ```bash fly logs ``` ## 下一步 现在,你的 Vapor 应用已经部署完成,你可以进行更多操作,例如在多个区域垂直和水平扩展你的应用程序、添加持久卷、设置持续部署,甚至创建分布式应用程序集群。学习如何执行这些操作的最好地方是查看 [Fly 文档](https://fly.io/docs/)。