第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
。
输入应用程序名称¶
在下一个屏幕,选择部署区域和一个独特的应用程序名称。如果你不想选择你的应用程序的名称,请将该字段留空,Heroku
会自动生成一个独特的蛞蝓来为你识别该应用程序。无论你是创建一个名称,还是Heroku给你分配一个,都要记下它;你以后在配置你的应用程序时将会用到它。
点击Create app
。
添加PostgreSQL
数据库¶
创建你的应用程序后,Heroku
会将你重定向到你的应用程序的页面。在顶部附近,在你的应用程序的名称下,有一排标签。选择Resources
。
在题为Add-ons
的部分,输入postgres
,你会看到一个Heroku Postgres
的选项。选择这个选项。
这将使你进入另一个屏幕,询问要提供什么类型的数据库。现在,提供一个Hobby Dev - Free
版本来使用。
点击Submit Order Form
,Heroku
将完成剩下的工作。
一旦你完成,你会看到数据库出现在Resources
标签下。
在本地设置你的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-version
。Buildpack
用它来决定为项目安装哪个版本的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_URL
、GOOGLE_CLIENT_ID
和GOOGLE_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_URL
、GITHUB_CLIENT_ID
和GITHUB_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
帮助,以了解更多的选项!