向 Fly.io 部署应用程序指南
1. 为 Fly.io 配置项目
Fly.io 是一个灵活的部署平台,提供多种部署选项。它支持多种编程语言和框架集成,还有详细的快速入门指南。多数部署方式是 Fly.io 从应用或项目源代码构建容器镜像,也可以部署 Docker Hub 上公开的预构建容器镜像。考虑到我们的应用基于多种编程语言,采用 Docker Hub 上的预构建镜像更合适。
之前我们已将 JVM 模式打包的任务管理器容器镜像推送到 Docker Hub,但由于 Fly.io 无法设置自定义动态运行时环境变量,我们需要创建一个修改后的镜像,以便从 Fly.io 特定的环境变量和运行时提供的密钥中读取数据库凭证。此外,Fly.io 的免费计划资源有限,创建原生二进制文件的容器镜像更适合部署,能降低应用内存占用和大小,减少虚拟机资源消耗。
我们在项目中已配置 Eclipse JKube 来创建容器镜像并将任务管理器部署到 Kubernetes,这里也用它为应用创建适配 Fly.io 的容器镜像。为简单起见,我们配置构建过程使用一个适配的 Dockerfile。
2. 创建适用于 Fly.io 的 Dockerfile
Eclipse JKube 支持基于 Dockerfile 构建和推送容器镜像。在项目根目录创建一个名为 Dockerfile.fly 的新文件,内容可参考 此处 。以下是关键部分分析:
FROM quay.io/quarkus/quarkus-micro-image:1.0
此语句设置容器的基础镜像, quarkus-micro-image 由 Quarkus 维护,最适合容器化和运行原生二进制可执行文件。
COPY fly/target/*-runner /deployments/application
RUN chmod a+x /deployments/*
这部分将生成的原生可执行文件复制到 deployments 目录下的 application 文件,并将其设置为可执行。
CMD ./deployments/application \
-Dquarkus.http.host=0.0.0.0 \
-Dquarkus.datasource.reactive.url=$DATABASE_URL \
-Dquarkus.hibernate-orm.database.generation=create
CMD 指令用于配置应用行为,以下是各属性说明:
- quarkus.http.host :指示 Quarkus 从所有网络接口提供服务。
- quarkus.datasource.reactive.url :覆盖数据库连接 URL,Fly.io 在运行时会用附加的 PostgreSQL 数据库服务 URL 填充 $DATABASE_URL 环境变量。
- quarkus.hibernate-orm.database.generation :配置 Quarkus 在首次连接数据库时创建数据库模式。
为提高 Docker 构建性能,在项目根目录创建一个名为 .jkube-dockerinclude 的新文件,内容如下:
target/*-runner
这将配置 JKube 只考虑 target 目录中文件名以 -runner 结尾的文件。
3. 设置 Fly.io 的 Maven 配置文件
要使用远程 Docker 容器镜像方法将应用部署到 Fly.io,需在项目的 pom.xml 文件中创建一个新的 Maven 配置文件,ID 为 fly 。更新后的文件内容可参考 此处 。关键部分如下:
<configuration>
<images>
<image>
<name>marcnuri/task-manager:fly</name>
<build>
<dockerFile>${project.basedir}/Dockerfile.fly</dockerFile>
<assembly>
<name>fly</name>
</assembly>
</build>
</image>
</images>
</configuration>
此配置有两个主要目的:
- 配置镜像名称:将生成的镜像名称设置为 marcnuri/task-manager:fly ,注意要将 marcnuri 替换为你的 Docker Hub 用户名。
- 配置 JKube 使用 Dockerfile.fly 文件: <build><dockerFile> 配置指示 JKube 使用该 Dockerfile,而非自动分析项目生成。
4. 构建并推送容器镜像到 Docker Hub
接下来,按以下步骤构建并推送容器镜像:
1. 从命令行登录 Docker Hub:
docker login
- 在项目根目录执行以下 Maven 命令:
./mvnw -Pnative,frontend,fly clean package k8s:build k8s:push
此命令分析如下:
- -Pnative,frontend,fly :指示 Maven 使用 native 、 frontend 和 fly 配置文件。 native 配置文件强制 Quarkus 进行 GraalVM 原生构建, frontend 配置文件用于构建前端, fly 启用刚刚定义的 Maven 配置文件。
- clean package k8s:build k8s:push :执行一系列 Maven 目标,清理之前执行的残留文件,使用原生二进制文件重新打包应用,使用 Kubernetes Maven 插件目标构建并推送容器镜像。
命令成功完成后,镜像标签应会在 Docker Hub 仪表板中可见。
5. 部署任务管理器
要在 Fly.io 上执行任何操作,需安装其命令行界面工具 flyctl ,安装说明可参考 此处 。
5.1 创建 Fly.io 账户
使用以下命令创建新账户:
flyctl auth signup
命令会打开一个新的浏览器窗口,填写详细信息后点击“Create My Account”按钮,完成后会收到一封验证账户的邮件,部署应用前需完成验证。
5.2 登录 Fly.io
若已有 Fly.io 账户,使用以下命令登录:
flyctl auth login
命令会打开一个新的浏览器窗口,填写电子邮件和密码后点击“Sign In”按钮。
5.3 创建新应用
在项目根目录运行以下命令创建新应用:
flyctl launch --image marcnuri/task-manager:fly
将 marcnuri/task-manager:fly 替换为你自己的镜像名称。过程如下:
1. 提示输入应用名称,该名称在整个 Fly.io 平台必须唯一。
2. 选择应用部署的区域,Fly.io 可将应用部署到离用户近的地方。
3. 提示是否创建 PostgreSQL 数据库,我们选择创建开发集群(目前免费)。
4. 数据库部署完成后,数据库凭证会记录在控制台,除非手动连接数据库,否则无需这些凭证,部署时会自动注入到任务管理器应用中。
5. 最后会询问是否现在部署应用,我们选择否,先查看 flyctl launch 命令生成的 fly.toml 文件。
6. 分析 fly.toml 应用配置
Fly.io 使用 fly.toml 文件配置应用部署,可手动创建和编辑,完整内容可参考 此处 。关键部分如下:
app = "task-manager"
应用名称用于标识应用,也用于创建 fly.dev 主机名,使应用公开可用。
[build]
image = "marcnuri/task-manager:fly"
由于我们已在 Docker Hub 上发布了适配 Fly.io 的镜像,只需配置 image 字段为该镜像名称。
[[services]]
internal_port = 8080
[[services.ports]]
force_https = true
handlers = ["http"]
port = 80
[[services.ports]]
handlers = ["tls", "http"]
port = 443
-
internal_port:配置应用监听连接的端口,Quarkus 默认端口为 8080。 -
services.ports:将内部端口公开到外部,flyctl会自动在 80(HTTP)和 443(HTTPS)端口暴露应用,端口 80 的http处理程序配置了force_https = true,会自动将用户重定向到tls处理程序,强制使用 HTTPS 连接。
7. 部署应用
最后,在项目根目录运行以下命令部署应用:
flyctl deploy
命令会验证应用配置,启动发布过程并监控进度。部署成功后,可在 Fly.io 仪表板查看数据库和应用的部署情况。点击应用条目可查看概述,还可从“Monitoring”标签查看应用日志、检查应用健康和指标、扩展应用、配置卷等。点击应用的公共 URL(如 task-manager.fly.dev ),使用管理员凭证( admin/quarkus )登录,即可使用应用的各项功能。
流程图
graph LR
A[创建 Fly.io 账户] --> B[登录 Fly.io]
B --> C[创建新应用]
C --> D[分析 fly.toml 配置]
D --> E[部署应用]
总结
通过以上步骤,我们完成了将应用部署到 Fly.io 的整个过程。从配置项目、创建 Dockerfile、设置 Maven 配置文件,到构建和推送容器镜像,再到创建 Fly.io 账户、分析配置文件和最终部署应用,每一步都至关重要。希望本指南能帮助你顺利将应用部署到 Fly.io 平台。
向 Fly.io 部署应用程序指南
8. 关键步骤回顾与总结
为了更清晰地理解整个部署过程,我们将关键步骤进行总结,形成如下表格:
| 步骤 | 操作内容 | 具体命令或文件 |
| — | — | — |
| 1 | 为 Fly.io 配置项目 | 考虑使用 Docker Hub 预构建镜像,创建适配 Fly.io 的容器镜像 |
| 2 | 创建适用于 Fly.io 的 Dockerfile | 在项目根目录创建 Dockerfile.fly 文件,配置基础镜像、复制可执行文件、设置启动命令等 |
| 3 | 设置 Fly.io 的 Maven 配置文件 | 在 pom.xml 中创建 fly 配置文件,配置镜像名称和使用 Dockerfile.fly |
| 4 | 构建并推送容器镜像到 Docker Hub | 登录 Docker Hub,执行 ./mvnw -Pnative,frontend,fly clean package k8s:build k8s:push |
| 5 | 部署任务管理器 | 安装 flyctl ,创建账户、登录、创建新应用 |
| 6 | 分析 fly.toml 应用配置 | 查看 fly.toml 文件,配置应用名称、镜像、端口等 |
| 7 | 部署应用 | 执行 flyctl deploy 命令 |
9. 常见问题及解决方案
在部署过程中,可能会遇到一些常见问题,以下是部分问题及对应的解决方案:
- 镜像构建失败 :
- 问题原因 :可能是 Dockerfile.fly 文件配置错误,或者依赖项缺失。
- 解决方案 :检查 Dockerfile.fly 文件的语法和内容,确保基础镜像可访问,依赖项正确安装。
- flyctl 命令执行失败 :
- 问题原因 :可能是 flyctl 未正确安装,或者网络问题。
- 解决方案 :重新安装 flyctl ,确保网络连接正常,可尝试使用代理。
- 应用部署后无法访问 :
- 问题原因 :可能是端口配置错误,或者应用内部出现异常。
- 解决方案 :检查 fly.toml 文件中的端口配置,查看应用日志,排查异常。
10. 安全注意事项
在部署应用到 Fly.io 时,需要注意以下安全事项:
- 使用 HTTPS :在 fly.toml 文件中配置 force_https = true ,强制使用 HTTPS 连接,避免敏感信息泄露。
- 保护数据库凭证 :不要将数据库凭证硬编码在代码中,使用 Fly.io 提供的环境变量和密钥来管理。
- 定期更新依赖项 :及时更新应用的依赖项,修复潜在的安全漏洞。
11. 性能优化建议
为了提高应用在 Fly.io 上的性能,可以考虑以下优化建议:
- 使用原生二进制文件 :如前文所述,使用 GraalVM 进行原生构建,减少应用的内存占用和启动时间。
- 优化 Docker 镜像 :减少镜像的层数,删除不必要的文件和依赖项,降低镜像大小。
- 合理选择部署区域 :根据用户的地理位置选择合适的部署区域,减少网络延迟。
12. 后续操作与拓展
部署成功后,还可以进行以下操作来进一步完善应用:
- 监控与日志分析 :使用 Fly.io 仪表盘的监控功能,查看应用的健康状态和性能指标,分析日志来排查问题。
- 扩展应用 :根据应用的流量和负载情况,考虑扩展应用的资源,如增加内存、CPU 等。
- 集成其他服务 :可以将应用与其他服务集成,如缓存服务、消息队列等,提高应用的功能和性能。
流程图
graph LR
A[部署完成] --> B[监控与日志分析]
B --> C{是否有问题}
C -- 是 --> D[排查问题并修复]
D --> B
C -- 否 --> E[扩展应用]
E --> F[集成其他服务]
总结
将应用部署到 Fly.io 是一个涉及多个步骤的过程,从项目配置、镜像构建到最终部署,每个环节都需要仔细处理。通过遵循本文提供的指南,你可以顺利完成应用的部署,并通过优化和拓展提升应用的性能和功能。同时,要始终关注安全问题,确保应用的稳定运行。希望这些内容能帮助你在 Fly.io 平台上成功部署和管理应用。
超级会员免费看
2827

被折叠的 条评论
为什么被折叠?



