跳转至

第32章:使用Heroku进行部署

Heroku是一个流行的托管解决方案,它简化了网络和云应用程序的部署。它支持许多流行的语言和数据库选项。在本章中,你将学习如何在Heroku上部署一个带有PostgreSQL数据库的Vapor Web应用。

设置Heroku

如果你还没有一个Heroku账户,现在就注册一个。Heroku提供了免费的选择,而且设置一个账户是不费吹灰之力的。只需访问https://signup.heroku.com/,按照说明创建一个账户。

安装CLI

现在你有了Heroku账户,安装Heroku CLI工具。在macOS上安装的最简单方法是通过Homebrew。在终端,输入:

brew install heroku/brew/heroku

如果你不希望使用Homebrew,或者在Linux上运行,还有其他的安装选项https://devcenter.heroku.com/articles/heroku-cli#download-and-install

登录

安装了Heroku CLI后,你需要登录你的账户。在终端,输入:

heroku login

按照提示,输入你的电子邮件和密码。一旦你登录了,你可以通过检查whoami来验证成功,以确保它输出正确的电子邮件。使用下面的命令:

heroku auth:whoami

就这样,Heroku已经在你的系统上全部设置好了。现在是时候创建你的第一个项目了。

创建一个应用程序

在你的浏览器中访问heroku.com,创建一个新的应用程序。Heroku.com应该将你重定向到dashboard.heroku.com。如果没有,请确保你已经登录并再次尝试。一旦进入仪表板,在右上角,有一个按钮,上面写着New。点击它并选择Create new app

img

输入应用程序名称

在下一个屏幕,选择部署区域和一个独特的应用程序名称。如果你不想选择你的应用程序的名称,请将该字段留空,Heroku会自动生成一个独特的蛞蝓来为你识别该应用程序。无论你是创建一个名称,还是Heroku给你分配一个,都要记下它;你以后在配置你的应用程序时将会用到它。

点击Create app

img

添加PostgreSQL数据库

创建你的应用程序后,Heroku会将你重定向到你的应用程序的页面。在顶部附近,在你的应用程序的名称下,有一排标签。选择Resources

img

在题为Add-ons的部分,输入postgres,你会看到一个Heroku Postgres的选项。选择这个选项。

img

这将使你进入另一个屏幕,询问要提供什么类型的数据库。现在,提供一个Hobby Dev - Free版本来使用。

点击Submit Order FormHeroku将完成剩下的工作。

img

一旦你完成,你会看到数据库出现在Resources标签下。

img

在本地设置你的Vapor应用程序

你的应用程序现在已经在Heroku上设置好了,下一步是在本地配置Vapor应用程序。下载并打开与本章相关的项目。如果你一直跟着书走,它应该看起来像你一直在做的TIL项目。你可以自由地使用你自己的项目来代替。

Git

Heroku使用Git来部署你的应用程序,所以你需要把你的项目放入Git仓库,如果它还没有的话。

首先,确定你的应用程序是否已经有一个Git仓库。要做到这一点,在终端输入以下命令:

git rev-parse --is-inside-work-tree

它应该输出true。如果它没有,那么你必须初始化一个Git仓库。否则,跳过下一节。

初始化Git

如果你需要在你的项目中加入Git,请在终端输入以下命令:

git init
git add .
git commit -m "Initial commit"

这些命令在项目中创建一个本地的Git仓库,并在该仓库中创建项目的初始提交。

分支

Heroku部署的是main分支。请确保你是在这个分支上,并且已经合并了你想部署的任何修改。

要查看你当前的分支,在终端输入以下内容:

git branch

输出结果将类似于以下内容。旁边有星号的分支是当前分支:

* main
  commander
  other-branches

如果你目前不在main上,可以通过输入导航到那里:

git checkout main

Git可能已经为你自动创建了一个master分支,而不是main。如果是这种情况,通过输入以下内容导航到master

git checkout master

随后,你可以通过以下命令重命名这个分支:

git branch -m main

本章的其余部分假设你有一个main分支作为你的默认分支。如果你在master分支之外再创建一个名为main的分支,可能会引起问题。

提交修改

确保所有的修改都在你的主分支中,并已提交。你可以通过输入以下命令来验证。如果你看到任何输出,这意味着你有未提交的修改。

git status --porcelain

如果你有未提交的修改,请输入以下命令来提交它们:

git add .
git commit -m "a description of the changes I made"

这可以确保你的项目被提交到你的本地仓库。

Heroku连接

Heroku需要在你的Git仓库上配置另一个远程。在终端输入以下命令,替换你的应用程序的Heroku名称:

heroku git:remote -a your-apps-name-here

你可以在浏览器中点击Heroku仪表板上的Deploy标签,查看Existing Git repository下的命令,确认该命令的格式。

设置Buildpack

Heroku使用一种叫做Buildpack的东西,在你部署应用时提供构建应用的配方。Vapor社区目前提供了一个为Vapor应用程序设计的Buildpack。要为你的应用程序设置Buildpack,在终端输入以下内容:

heroku buildpacks:set \
  https://github.com/vapor-community/heroku-buildpack

启用测试发现

在Linux上有一些剩余的构建系统的工件会搜索测试文件。你想省略这些,优先考虑自动发现,所以输入以下命令:

heroku config:set SWIFT_BUILD_FLAGS="--enable-test-discovery"

Swift版本文件

现在你的Buildpack已经设置好了,Heroku需要几个配置文件。其中第一个是.swift-versionBuildpack用它来决定为项目安装哪个版本的Swift。在终端输入以下命令:

echo "5.3" > .swift-version

这将创建.swift-version,其内容为5.3。值得注意的是,在macOS上,带有前导词.的文件是默认隐藏的,所以你可能在查找器中看不到这个文件。

Procfile

一旦应用程序被建立在Heroku上,Heroku需要知道运行什么类型的进程以及如何运行它。为了确定这一点,它利用了一个名为Procfile的特殊文件。输入以下命令来创建你的Procfile

echo "web: Run serve --env production" \
  "--hostname 0.0.0.0 --port \$PORT" > Procfile

这为Heroku提供了运行你的应用程序所需的命令。如果你不在$PORT前加上\,那么它就会把这个条目解释为bash命令,不能正常运行。你完成的Procfile应该与这些内容完全一致:

web: Run serve --env production --hostname 0.0.0.0 --port $PORT

提交修改

如前所述,Heroku使用Git和主分支来部署应用程序。由于你在前面配置了Git,所以你已经添加了两个文件。Procfile.swift-version。这些文件需要在部署前提交,否则Heroku将无法正确构建应用程序。在终端输入以下命令:

git add .
git commit -m "adding heroku build files"

配置数据库

在你部署你的应用程序之前,还有一件事要做。你必须在你的应用程序中配置数据库。首先,列出你的应用程序的配置变量。

在终端中,输入:

heroku config

你应该看到类似以下的输出。它为你提供了关于你为这个项目配置的数据库的信息。

=== today-i-learned-vapor Config Vars
DATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4

这个输出有两部分;第一部分是DATABASE_URL。这代表环境变量的名称。第二部分将类似于以下内容:

postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4

这个组件代表环境变量的实际值。在这种情况下,它是到你的PostgreSQL数据库的直接链接。你可以使用这个直接的网址,以便在你需要时手动连接到数据库。然而,重要的是,你千万不要在你的应用程序中硬编码这个值。这不仅是不好的做法,也不安全,Heroku规定这个环境变量的值可以随时改变,因此绝对值没有用。

重要的部分是环境变量的名称:database_url

Xcode中打开你的Vapor应用程序,并导航到configure.swift。找到设置数据库配置的部分。找出这一行:

app.databases.use(.postgres(
  hostname: Environment.get("DATABASE_HOST") ?? "localhost",
  port: databasePort,
  username: Environment.get("DATABASE_USERNAME") ?? 
    "vapor_username",
  password: Environment.get("DATABASE_PASSWORD") ?? 
    "vapor_password",
  database: Environment.get("DATABASE_NAME") ?? databaseName
), as: .psql)

这段代码对你到目前为止使用的数据库配置非常有效,但Heroku会传递整个URL,所以你必须利用这一点。将上面的这行代码替换为以下内容:

if var config = Environment.get("DATABASE_URL")
    .flatMap(URL.init)
    .flatMap(PostgresConfiguration.init) {
  config.tlsConfiguration = .forClient(
    certificateVerification: .none)
  app.databases.use(.postgres(
    configuration: config
  ), as: .psql)
} else {
  app.databases.use(
    .postgres(
      hostname: Environment.get("DATABASE_HOST") ??
        "localhost",
      port: databasePort,
      username: Environment.get("DATABASE_USERNAME") ??
        "vapor_username",
      password: Environment.get("DATABASE_PASSWORD") ??
        "vapor_password",
      database: Environment.get("DATABASE_NAME") ??
        databaseName),
    as: .psql)
}

如果项目在Heroku上运行,这允许项目从环境中检索数据库URL。如果DATABASE_URL没有在环境中设置,应用程序将继续使用之前的方法来确定其数据库。

再一次,你需要在Git中保存你的修改。在终端输入以下内容:

git add .
git commit -m "configured heroku database"

配置谷歌环境变量

如果你完成了第22章"Google认证",并在这里使用该章作为你的项目,你必须配置你在那里使用的相同的Google环境变量。

在终端输入以下命令:

heroku config:set \
  GOOGLE_CALLBACK_URL=https://<YOUR_HEROKU_URL>/oauth/google

heroku config:set GOOGLE_CLIENT_ID=<YOUR_CLIENT_ID>

heroku config:set GOOGLE_CLIENT_SECRET=<YOUR_CLIENT_SECRET>

你可以在Heroku仪表板的Settings标签上找到你的Heroku URL。这将设置GOOGLE_CALLBACK_URLGOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRET的环境变量,以便它们在运行时可用。记得访问https://console.developers.google.com,将Heroku的回调URL添加为授权重定向。如果你需要复习,请看第22章,"Google认证"。

配置GitHub环境变量

如果你完成了第23章"GitHub认证",并在这里使用该章作为你的项目,你必须配置你在那里使用的相同的GitHub环境变量。

在终端输入以下命令:

heroku config:set \
  GITHUB_CALLBACK_URL=https://<YOUR_HEROKU_URL>/oauth/github

heroku config:set GITHUB_CLIENT_ID=<YOUR_CLIENT_ID>

heroku config:set GITHUB_CLIENT_SECRET=<YOUR_CLIENT_SECRET>

你可以在Heroku仪表板的Settings标签上找到你的Heroku URL。这将设置GITHUB_CALLBACK_URLGITHUB_CLIENT_IDGITHUB_CLIENT_SECRET的环境变量,以便它们在运行时可用。记得访问https://github.com/settings/developers,将Heroku的回调URL作为一个授权重定向添加。如果你需要复习,请看第23章,"GitHub认证"。

部署到Heroku

现在你已经准备好将你的应用部署到Heroku了。把你的主分支推送到Heroku的远程服务器上,然后等待一切构建。这可能需要一些时间,特别是对于一个大型的应用程序。

为了开始工作,在终端输入以下内容:

git push heroku main

一旦一切部署完毕,Heroku会通知你应用程序的状态。Heroku通常在完成构建后自动启动你的应用程序。如果它没有这样做,请在终端输入以下内容来启动你的应用程序:

heroku ps:scale web=1

今后,将main分支推送到Heroku将重新部署你的应用程序。通过访问浏览器中Heroku仪表板的Settings标签中的应用URL来打开你的应用。你也可以通过在终端输入以下内容在浏览器中打开该网站:

heroku open

接下来去哪?

在本章中,你学到了如何在Heroku仪表盘中设置应用,配置你的Git仓库,为你的项目添加必要的配置文件,并部署你的应用。探索你的仪表板和Heroku帮助,以了解更多的选项!