如何将应用程序部署到 Heroku?

Back4app Heroku 应用程序部署封面

本教程介绍将基于 Python 的应用程序部署到 Heroku 的过程。通过阅读本文,您可以了解 Heroku 的核心功能、Heroku 的应用程序部署流程以及如何将应用程序部署到 Heroku。

此外,它还提供了将同一应用程序部署到 Back4app Containers 的说明,这是 Heroku 的一个很好的免费替代方案。

目标

本教程结束时,您将能够

  • 了解 Heroku 及其功能
  • 将应用程序部署到 Heroku
  • 掌握 Back4app 容器及其功能
  • 将应用程序部署到 Back4app 容器中
  • 确定应用程序使用的服务

什么是 Heroku?

Heroku 成立于 2007 年,是最可靠的平台即服务(PaaS)平台之一。通过该云平台,您可以轻松构建、管理、部署和扩展应用程序。

它原生支持 Ruby、Python、Java、Clojure、Node、Scala、Go 和 PHP。不过,它允许你通过 Docker 部署其他编程语言和框架。

Heroku 的主要优势包括易用性、扩展能力、安全功能、附加组件、Heroku CLI 以及以开发人员为中心。

另一方面,Heroku 经常被批评为价格昂贵、地区支持不足以及跟不上最新的开发趋势。

Heroku 之所以如此受欢迎,其中一个主要原因就是它过去提供的免费服务。截至 2022 年 11 月,您可以完全免费地使用 Heroku 托管应用程序甚至数据库。

令人遗憾的是,他们决定取消这些免费服务,以打击欺诈和滥用免费层级的行为。尽管最近发生了一些变化,Heroku 仍然是最受欢迎的托管平台之一。继续阅读,了解如何部署到 Heroku。

要了解有关 Heroku 的更多信息,请查看我们的其他文章《什么是 Heroku?

项目设置

为了演示如何将应用程序部署到HerokuBack4app Containers,我准备了一个简单的 Web 应用程序,指导您如何将 Python 应用程序部署到 Heroku。该 Web 应用程序使用FastAPI 框架,是一个简单的 URL 短缩服务。它有两个端点:

  1. /shortenlong_url指定别名
  2. /<alias>将用户重定向到相应的long_url

请根据自己的项目测试自己的理解能力。

先决条件

克隆与运行

要部署 Heroku,首先要在 GitHub 上分叉该仓库,然后将分叉仓库克隆到本地计算机:

$ git clone <fork_remote_git_url>
$ cd back4app-heroku-deploy

如果不想 fork,可以创建自己的版本库,并将源代码推送到该版本库。

创建虚拟环境并激活:

$ python -m venv env && source env/bin/activate

接下来,安装项目需求:

(env)$ pip install -r requirements.txt

最后,启动开发服务器:

(env)$ python -m uvicorn main:app --reload 

INFO:     Will watch for changes in these directories: [...]
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [1488] using WatchFiles
INFO:     Started server process [2316]
INFO:     Application startup complete.

打开您最喜欢的网络浏览器并导航至http://localhost:8000/docs。使用交互式文档测试网络应用程序。如果需要帮助格式化请求,请查看test_main.http文件。

如何将应用程序部署到 Heroku?

在本节中,我们将把一个应用程序部署到 Heroku。

以下步骤需要一个 Heroku 账户。如果还没有,请注册。此外,请确保在 Heroku 账户中添加支付信息。

如果您在教程结束后立即删除应用程序,应该不会被收取任何费用。

切换到名为heroku 的新分支:

$ git checkout -b heroku

目标

  1. 安装 Heroku CLI。
  2. 创建 Heroku 应用程序。
  3. 通过runtime.txt 指定运行时间。
  4. 通过Procfile 指定应用程序进程。
  5. 将源代码推送到 Heroku。

Heroku CLI

与 Heroku 交互有多种方式。您可以使用仪表板Heroku CLIHeroku API

我更喜欢 Heroku CLI,因为它是一个可以让您快速完成工作的强大工具。我们将在整个教程中使用它。

首先,按照官方安装说明安装 Heroku CLI。

然后,通过检查 CLI 版本确保安装成功:

$ heroku --version
heroku/8.4.2 win32-x64 node-v16.19.0

接下来,检查 CLI 更新,并使用 Heroku 账户进行身份验证:

$ heroku update
$ heroku login

运行第二个命令时,将打开一个浏览器窗口。要进行身份验证,请单击 “登录 “并关闭浏览器窗口。

创建 Heroku 应用程序

要部署到 Heroku,首先需要创建一个 Heroku 应用程序。

再次打开终端,导航到本地项目(如back4app-heroku-deploy文件夹),然后运行以下命令:

$ heroku create -a <app_name>

Creating ⬢ <app_name>... !
https://<app_name>-31a6fd70e769.herokuapp.com/ | 
https://git.heroku.com/<app_name>.git

确保将 <app_name> 替换为所需的应用程序名称。

接下来,通过列出应用程序来检查应用程序是否创建成功:

$ heroku apps

=== <email_address> Apps
<app_name>

然后查看应用程序的详细信息:

$ heroku apps:info <app_name>

=== <app_name>
Auto Cert Mgmt: false
Dynos:
Git URL:        https://git.heroku.com/<app_name>.git
Owner:          <email_address>
Region:         us
Repo Size:      0 B
Slug Size:      0 B
Stack:          heroku-22
Web URL:        https://<app_name>-21de155883d3.herokuapp.com/

众所周知,Heroku 与 Git 紧密集成。创建 Heroku 应用程序时,会创建一个远程 Git 仓库,您可以将源代码推送到该仓库进行部署。在我们的例子中,远程 Git URL 是

https://git.heroku.com/<app_name>.git

在创建应用程序时,Heroku CLI 会自动注册一个 Git 远端。试试列出远程服务器:

$ git remote -v

heroku  https://git.heroku.com/back4app-url-shortener.git (fetch)
heroku  https://git.heroku.com/back4app-url-shortener.git (push)
origin  [email protected]:duplxey/back4app-heroku-deploy.git (fetch)
origin  [email protected]:duplxey/back4app-heroku-deploy.git (push)

在接下来的章节中,我们将使用heroku远程来部署源代码。

runtime.txt

runtime.txt文件允许您指定希望 Heroku 使用的 Python 准确版本。如果您的项目需要特定的 Python 版本才能运行,这一点非常重要。在撰写本文时,它默认使用python-3.11.5 版本。

要指定运行时间,请创建包含运行时间版本的runtime.txt文件。例如

python-3.11.5

有关支持的 Python 运行时列表,请查看Heroku Python 支持

程序文件

Procfile允许你定义启动应用程序进程时应执行的命令。我们将使用 Procfile 来启动Uvicorn 网络服务器。

在项目根目录下创建一个包含网络进程的 Procfile

web: gunicorn -w 1 -k uvicorn.workers.UvicornWorker main:app

在生产应用程序中,您很可能希望生成多个 Worker,而不是一个。由于数据库不支持我们的应用程序(它使用内存数据),因此我们无法在多个 Worker 进程之间同步数据。因此,我们只能使用一个 Worker。

将更改推送到 GitHub 仓库:

$ git add .
$ git commit -m "configured app for heroku"
$ git push origin heroku

部署 Heroku 应用程序

Heroku 使用所谓的构建包(buildpacks)将应用程序转换成可以在动态系统上执行的单元。构建包只是一组针对特定编程语言的专用脚本。

当你将代码推送到 Heroku 时,Heroku 会自动检测你的项目的编程语言以及构建所需的构建包。如果是 Python,它会检查是否存在requirements.txt文件。

要部署应用程序,只需将代码推送到heroku远程服务器即可:

$ git push heroku heroku:main

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Updated five paths from 30a4ffb
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Building on the Heroku-22 stack
remote: -----> Using buildpack: heroku/python
remote: -----> Python app detected
remote: -----> Requirements file has been changed, clearing cached dependencies
remote: -----> Installing python-3.11.5
remote: -----> Installing pip 23.2.1, setuptools 68.0.0 and wheel 0.41.0
remote: -----> Installing SQLite3
remote: -----> Installing requirements with pip
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 30.6M
remote: -----> Launching...
remote:        Released v5
remote:        https://<app_name>-31a6fd70e769.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.

Heroku 会自动选择合适的构建脚本,安装需求,并将应用程序部署到 dyno 上。

如果部署失败,请使用 Heroku CLI 查看日志:

$ heroku logs --tail

接下来,检查应用程序的状态:

$ heroku apps:info <app_name>

=== <app_name>
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/<app_name>.git
Owner:          <your_email>
Region:         us
Repo Size:      9 KB
Slug Size:      31 MB
Stack:          heroku-22
Web URL:        https://<app_name>-31a6fd70e769.herokuapp.com/

尝试在浏览器中访问您的应用程序,导航到 “Web URL”。

Heroku 部分到此为止。下一节将介绍如何将同一应用程序部署到 Back4app 容器。

如何在 Back4app Containers 中部署应用程序?

在本节中,我们将在 Back4app Containers 中部署应用程序。

什么是 Back4app Containers?

Back4app Containers 是一个出色的容器即服务(CaaS)平台。它允许您在全球分布式容器上部署、管理和扩展应用程序。

该平台与 GitHub 紧密集成,并提供内置的 CI/CD 系统。它的其他功能还包括零停机时间部署、自定义域链接、日志记录、监控等。

最重要的是,该平台提供了慷慨的免费层级。每月有 600 多个免费容器小时,您可以轻松地为您的宠物项目建立原型和托管。随着应用程序规模的扩大,您可以升级到具有可预测价格的高级层级。

要了解有关容器即服务的更多信息,请查看什么是 CaaS – 容器即服务?

以主分支为基础,切换到名为back4app的新分支:

$ git checkout master && git checkout -b back4app

目标

  1. Dockerize 应用程序
  2. 将 GitHub 与 Back4app 账户连接。
  3. 导入所需的 GitHub 仓库。
  4. 部署!

Dockerize

要将应用程序部署到 Back4app Containers,必须先对其进行 dockerize。

Docker 化是在 Docker 容器中构建、部署和运行应用程序的过程。对应用程序进行 Docker 化的最简单方法是通过Docker 文件

Dockerfile

Dockerfile是一个脚本,其中包含创建 Docker 容器镜像的说明。您可以使用该文件来定义环境、依赖关系以及构建和运行应用程序所需的其他命令。

其语法如下

COMMAND <arg_1> <arg_2> ... <arg_n>

在项目根目录下创建一个Dockerfile,内容如下

FROM python:3.9.6-alpine

# Set the working directory
WORKDIR /app

# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Copy over the requirements file and install the dependencies
COPY ./requirements.txt .
RUN pip install --no-cache-dir --upgrade -r ./requirements.txt

# Copy over the source code
COPY . .

# Expose the port
EXPOSE 80

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]

此 Dockerfile 基于python:3.9.6-alpine映像。它首先设置工作目录和环境变量,然后处理需求。之后,它会复制源代码,公开80 端口,并在该端口上启动 Uvicorn 服务器。

如需部署其他编程语言和框架,请从Back4app Containers 文档中下载 Dockerfiles。

如果需要了解 Dockerfile 命令的工作原理,请参阅Dockerfile 参考资料

.dockerignore

我们可以使用.dockerignore文件来减少 Docker镜像的大小。这些文件的作用与.gitignore文件类似。你必须定义你希望从映像中排除的文件和目录。

在我们的例子中,这就是虚拟环境、IDE 文件和.git文件夹。

像这样创建一个.dockerignore文件:

.git/
.idea/
venv/

你可以根据自己项目的需要调整.dockerignore文件。

将更改推送到 GitHub 仓库:

$ git add .
$ git commit -m "configured app for back4app"
$ git push origin back4app

构建、运行和测试

在将代码推送到云端之前,最好先在本地进行测试。

首先,创建图片并标记:

$ docker build -t back4app-url-shortener:1.0 .

接下来,列出图片:

$ docker images

REPOSITORY                      TAG            IMAGE ID       CREATED         SIZE
back4app-url-shortener          1.0            1cbe348a04ad   1 minute ago    68.7MB

使用刚刚构建的映像运行容器:

$ docker run -p 80:80 --name back4app-url-shortener back4app-url-shortener:1.0

论据解释:

  1. -p 80:80将主机的端口80与容器的端口80绑定
  2. --名称 back4app-url-shortener命名容器实例

您可以使用-d以分离模式运行容器(不占用终端)。

检查容器是否正在运行:

$ docker ps

CONTAINER ID   IMAGE                        CREATED    STATUS    PORTS
b3b82313ab65   back4app-url-shortener:1.0   3s ago     1s        0.0.0.0:80->80/tcp

打开您最喜欢的网络浏览器,导航至http://localhost/docs。您应该可以看到 URL 缩短器服务。

部署应用程序

以下步骤需要一个 Back4app 帐户。如果您还没有账户,请注册一个免费账户。本教程中的所有操作都将使用免费帐户。

登录 Back4app 账户后,您将看到应用程序列表。点击 “创建新应用 “开始应用创建过程。

创建 Back4app 应用程序

Back4app 提供两种解决方案:

  1. 后端即服务(BaaS)–开箱即用的后端解决方案
  2. 容器即服务 (CaaS) — 由 Docker 驱动的容器部署平台

由于我们要部署的是一个自定义 Python 应用程序,因此将使用 CaaS。选择屏幕右侧的 “容器即服务”。

Back4app 容器即服务

如果您是第一次使用 Back4app,系统会要求您链接 GitHub 账户。此外,请确保导入所有要部署的软件源。

接下来,”选择 “要部署的 GitHub 仓库:

Back4app Containers 选择 GitHub 存储库

由于我们部署的是一个简单的应用程序,因此无需过多配置环境。只需设置

  1. 应用程序名称:back4app-url-shortener(您可以选择不同的名称)
  2. 分支:back4app(您的 GitHub 分支)

然后点击 “部署”。

Back4app 容器配置环境

Back4app Containers 提供许多配置选项,包括自动部署、端口设置、环境变量和健康检查。

Back4app Containers 需要一点时间来构建和部署您的 Docker 映像。应用程序准备就绪后,应用程序的状态将变为 “可用”。要访问您的应用程序,请单击状态下方的链接,如图所示。

Back4app 容器成功部署

干得好您已成功将网络应用程序部署到 Back4app Containers。

结论

本教程教您如何在 Heroku 和 Back4app Containers 上部署一个简单的网络应用程序。这两个平台各有利弊,您在部署应用程序时应加以考虑。

根据经验,对于不需要数据库的应用程序,我会选择 Back4app Containers。Back4app Containers 可以帮你省钱,而且它的免费层对于你的宠物项目来说绰绰有余。

如果您的应用程序依赖于数据库或花哨的附加组件,Heroku 可能会更好。

我在下表中总结了一些主要的平台差异:

HerokuBack4app 容器
云模式平台即服务(PaaS)容器即服务(CaaS)
构建和部署建筑套件Docker
支持的语言9 种编程语言任何语言或框架
免费 HTTPS/SSL✔️✔️
自定义域名✔️✔️
免费层✔️
供应商锁定风险✔️
管理数据库✔️
适合初学者是(需要一定的 DevOps 技能)是(需要一定的 Docker 技能)

欢迎从GitHub 代码库中获取最终源代码。

常见问题

什麼是 Heroku?

Heroku 成立於 2007 年,是最早的 PaaS(平台即服務)平台之一。它支援部署九種程式語言,包括 Java、PHP、Python 和 Ruby。除此之外,它還提供託管資料庫、附加元件、高級日誌記錄、監控等功能。

如何將應用程式部署到 Heroku?

1. 註冊一個 u003ca href=u0022https://signup.heroku.com/u0022 target=u0022_blanku0022 rel=u0022noreferrer noopeneru0022u003eHeroku 帳戶u003c/au003e。u003cbru003e2. 安裝並設定 Heroku CLI。u003cbru003e3. 建立一個 Heroku 應用程式。u003cbru003e4. 透過 u003cemu003eruntime.txtu003c/emu003e 指定執行環境。u003cbru003e5. 透過 u003cemu003eProcfileu003c/emu003e 指定應用程式的處理程序。u003cbru003e6. 將原始碼推送到 Heroku。

什麼是 Back4app Containers?

Containers 是一個出色的 CaaS(容器即服務)平台。該平台可讓您快速在全球分散的容器上部署、管理及擴展 Docker 化的應用程式。它具有內建的 CI/CD 系統,支援零停機部署、自訂網域等功能!

如何將應用程式部署到 Back4app Containers?

1. 註冊一個免費的 u003ca href=u0022https://www.back4app.com/signupu0022 target=u0022_blanku0022 rel=u0022noreferrer noopeneru0022u003eBack4app 帳戶u003c/au003e。u003cbru003e2. 將您的應用程式 Docker 化。u003cbru003e3. 將原始碼推送到 GitHub。u003cbru003e4. 將 GitHub 帳戶與 Back4app 帳戶連接。u003cbru003e5. 匯入所需的儲存庫 u0026amp; 部署!