23、向 Fly.io 部署应用程序指南

向 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
  1. 在项目根目录执行以下 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 平台上成功部署和管理应用。

课程设计报告:总体方案设计说明 一、软件开发环境配置 本系统采用C++作为核心编程语言,结合Qt 5.12.7框架进行图形用户界面开发。数据库管理系统选用MySQL,用于存储用户数据与小精灵信息。集成开发环境为Qt Creator,操作系统平台为Windows 10。 二、窗口界面架构设计 系统界面由多个功能模块构成,各模块职责明确,具体如下: 1. 起始界面模块(Widget) 作为应用程序的入口界面,提供初始导航功能。 2. 身份验证模块(Login) 负责处理用户登录与账户注册流程,实现身份认证机制。 3. 游戏主大厅模块(Lobby) 作为用户登录后的核心交互区域,集成各项功能入口。 4. 资源管理模块(BagWidget) 展示用户持有的全部小精灵资产,提供可视化资源管理界面。 5. 精灵详情模块(SpiritInfo) 呈现选定小精灵的完整属性数据与状态信息。 6. 用户名录模块(UserList) 系统内所有注册用户的基本信息列表展示界面。 7. 个人资料模块(UserInfo) 显示当前用户的详细账户资料与历史数据统计。 8. 服务器精灵选择模块(Choose) 对战准备阶段,从服务器可用精灵池中选取参战单位的专用界面。 9. 玩家精灵选择模块(Choose2) 对战准备阶段,从玩家自有精灵库中筛选参战单位的操作界面。 10. 对战演算模块(FightWidget) 实时模拟精灵对战过程,动态呈现战斗动画与状态变化。 11. 对战结算模块(ResultWidget) 对战结束后,系统生成并展示战斗结果报告与数据统计。 各模块通过统一的事件驱动机制实现数据通信与状态同步,确保系统功能的连贯性与数据一致性。界面布局遵循模块化设计原则,采用响应式视觉方案适配不同显示环境。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值