如何将应用程序部署到 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 Containers 中部署应用程序?
在本节中,我们将在 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 化的最简单方法是通过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
论据解释:
-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. 註冊一個 Heroku 帳戶。
2. 安裝並設定 Heroku CLI。
3. 建立一個 Heroku 應用程式。
4. 透過 runtime.txt 指定執行環境。
5. 透過 Procfile 指定應用程式的處理程序。
6. 將原始碼推送到 Heroku。
什麼是 Back4app Containers?
Containers 是一個出色的 CaaS(容器即服務)平台。該平台可讓您快速在全球分散的容器上部署、管理及擴展 Docker 化的應用程式。它具有內建的 CI/CD 系統,支援零停機部署、自訂網域等功能!
如何將應用程式部署到 Back4app Containers?
1. 註冊一個免費的 Back4app 帳戶。
2. 將您的應用程式 Docker 化。
3. 將原始碼推送到 GitHub。
4. 將 GitHub 帳戶與 Back4app 帳戶連接。
5. 匯入所需的儲存庫 & 部署!