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

本教程介绍将基于 Python 的应用程序部署到 Heroku 的过程。通过阅读本文,您可以了解 Heroku 的核心功能、Heroku 的应用程序部署流程以及如何将应用程序部署到 Heroku。
此外,它还提供了将同一应用程序部署到 Back4app Containers 的说明,这是 Heroku 的一个很好的免费替代方案。
Contents
目标
本教程结束时,您将能够
- 了解 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?
项目设置
为了演示如何将应用程序部署到Heroku和Back4app Containers,我准备了一个简单的 Web 应用程序,指导您如何将 Python 应用程序部署到 Heroku。该 Web 应用程序使用FastAPI 框架,是一个简单的 URL 短缩服务。它有两个端点:
/shorten为long_url指定别名/<alias>将用户重定向到相应的long_url
请根据自己的项目测试自己的理解能力。
先决条件
- 对 Python 和 Git 有基本了解
- 本地计算机上安装了Python 3.9 及以上版本
- 安装并配置Git Bash和Docker Desktop
- 个人 GitHub 账户
克隆与运行
要部署 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
目标
- 安装 Heroku CLI。
- 创建 Heroku 应用程序。
- 通过runtime.txt 指定运行时间。
- 通过Procfile 指定应用程序进程。
- 将源代码推送到 Heroku。
Heroku CLI
与 Heroku 交互有多种方式。您可以使用仪表板、Heroku CLI 或Heroku 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 容器?
在本节中,我们将在 Back4app Containers 中部署应用程序。
什么是 Back4app Containers?
Back4app Containers 是一个出色的容器即服务(CaaS)平台。它允许您在全球分布式容器上部署、管理和扩展应用程序。
该平台与 GitHub 紧密集成,并提供内置的 CI/CD 系统。其他功能还包括零停机时间部署、自定义域链接、日志记录、监控等。
最重要的是,该平台提供了慷慨的免费层级。每月有 600 多个免费容器小时,您可以轻松地为您的宠物项目建立原型和托管。随着应用程序规模的扩大,您可以升级到具有可预测价格的高级层级。
要了解有关容器即服务的更多信息,请查看什么是 CaaS – 容器即服务?
以主分支为基础,切换到名为back4app的新分支:
$ git checkout master && git checkout -b back4app
目标
- Dockerize 应用程序
- 将 GitHub 与 Back4app 账户连接。
- 导入所需的 GitHub 仓库。
- 部署!
Dockerize
要将应用程序部署到 Back4app Containers,必须先对其进行 dockerize。
Docker 化是在 Docker 容器中构建、部署和运行应用程序的过程。对应用程序进行 Docker 化的最简单方法是通过Dockerfile。
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
论据解释:
-p 80:80将主机的端口80与容器的端口80绑定--名称 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 提供两种解决方案:
- 后端即服务(BaaS)–开箱即用的后端解决方案
- 容器即服务 (CaaS) — 由 Docker 驱动的容器部署平台
由于我们要部署的是一个自定义 Python 应用程序,因此将使用 CaaS。选择屏幕右侧的 “容器即服务”。

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

由于我们部署的是一个简单的应用程序,因此无需过多配置环境。只需设置
- 应用程序名称:back4app-url-shortener(您可以选择不同的名称)
- 分支:back4app(您的 GitHub 分支)
然后点击 “部署”。

Back4app Containers 提供许多配置选项,包括自动部署、端口设置、环境变量和健康检查。
Back4app Containers 需要一点时间来构建和部署您的 Docker 映像。应用程序准备就绪后,应用程序的状态将变为 “可用”。要访问您的应用程序,请单击状态下方的链接,如图所示。

干得好您已成功将网络应用程序部署到 Back4app Containers。
结论
本教程教您如何在 Heroku 和 Back4app Containers 上部署一个简单的网络应用程序。这两个平台各有利弊,您在部署应用程序时应加以考虑。
根据经验,对于不需要数据库的应用程序,我会选择 Back4app Containers。Back4app Containers 可以帮你省钱,而且它的免费层对于你的宠物项目来说绰绰有余。
如果您的应用程序依赖于数据库或花哨的附加组件,Heroku 可能会更好。
我在下表中总结了一些主要的平台差异:
| Heroku | Back4app 容器 | |
|---|---|---|
| 云模式 | 平台即服务(PaaS) | 容器即服务(CaaS) |
| 构建和部署 | 建筑套件 | Docker |
| 支持的语言 | 9 种编程语言 | 任何语言或框架 |
| 免费 HTTPS/SSL | ✔️ | ✔️ |
| 自定义域名 | ✔️ | ✔️ |
| 免费层 | ❌ | ✔️ |
| 供应商锁定风险 | ✔️ | ❌ |
| 管理数据库 | ✔️ | ❌ |
| 适合初学者 | 是(需要一定的 DevOps 技能) | 是(需要一定的 Docker 技能) |
常见问题
什么是 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. 将你的应用容器化(Dockerize)。u003cbru003e3. 将源代码推送到 GitHub。u003cbru003e4. 将你的 GitHub 账户与 Back4app 连接。u003cbru003e5. 导入所需的代码仓库并开始部署!

