如何部署Plexus:从Docker多阶段构建到Fly.io上线的完整部署实战

如何部署Plexus:从Docker多阶段构建到Fly.io上线的完整部署实战
如何部署Plexus:从Docker多阶段构建到Fly.io上线的完整部署实战【免费下载链接】plexusRemove the fear of Android app compatibility on de-Googled devices.项目地址: https://gitcode.com/gh_mirrors/ple/plexusPlexus 是一个用于消除 de-Googled Android 设备应用兼容焦虑的开源项目通过社区众包数据告诉你哪些 App 在无 Google Play 服务的 ROM 上能正常工作。本文将带你完成 Plexus 网站端从 Docker 多阶段构建到 Fly.io 上线的完整部署实战零基础也能照着做完。一、先搞懂 Plexus 是怎么跑的在动手之前花 1 分钟了解技术栈部署时才不会迷路后端框架Elixir Phoenix 1.7配合 Phoenix LiveView 实现实时页面数据库PostgreSQL通过 Ecto 访问部署形态mix release打包出的自包含发行版 Docker 镜像 Fly.io 云平台核心文件一览文件作用Dockerfile多阶段构建编译镜像 运行时镜像fly.tomlFly.io 的应用配置端口、资源、部署钩子compose.yml本地一键启动 Postgres 17 数据库config/runtime.exs运行时从环境变量读取生产配置lib/plexus/release.ex生产环境执行数据库迁移/回滚mix.exs项目依赖与assets.deploy等别名二、Dockerfile 多阶段构建为什么这么设计打开Dockerfile你会发现它分成builder构建阶段和runner运行阶段两段这是把镜像做小的关键技巧构建阶段基于hexpm/elixir:1.19.5-erlang-28.5.0.2-debian-bookworm-slim安装编译依赖执行mix deps.get、mix assets.deploy压缩 Tailwind 和 esbuild 静态资源和mix release打出产物运行阶段只用干净的debian:bookworm-slim把构建阶段的_build/prod/rel/plexus拷贝进来并用nobody用户运行最终镜像更小、攻击面更小。几个值得记住的细节使用 Debian 而非 Alpine是为了规避生产环境的 DNS 解析问题MIX_ENVprod贯穿全程保证只编译生产依赖config/runtime.exs单独晚拷贝因为它只在启动时执行改它不需要重新编译代码文件末尾由flyctl自动追加了ECTO_IPV6true和ERL_AFLAGS -proto_dist inet6_tcp让节点以 IPv6 通信Fly.io 内部网络是 IPv6 优先的。一条命令完成本地构建docker build -t plexus:latest .三、本地跑起来数据库 迁移 启动1. 一键启动 Postgrescompose.yml已经把数据库配置好了Postgres 17.5映射到本机5434端口避免与本机 5432 冲突数据持久化在db卷里docker compose up -d2. 准备必要的环境变量生产启动时config/runtime.exs会用System.fetch_env!强制要求以下环境变量存在缺一个都会直接报错退出环境变量说明DATABASE_URL形如ecto://USER:PASSHOST/PLEXUSSECRET_KEY_BASE用mix phx.gen.secret生成PHX_HOST你的域名如plexus.techlore.techPORT监听端口Fly.io 上为8080BASIC_AUTH_USERNAME/BASIC_AUTH_PASSWORD管理后台 Basic AuthONE_AUTH_SIGNING_SECRETLiveDashboard 签名密钥SMTP_SERVER/SMTP_USERNAME/SMTP_PASSWORD/SMTP_PORTSwoosh 发信配置3. 启动服务容器内已内置bin/server启动脚本自动设置PHX_SERVERtrue在fly.toml中可以看到服务监听internal_port 8080。四、Fly.io 上线5 步走Fly.io 非常适合部署这种带 Postgres 的 Elixir 应用fly.toml就是为它量身定做的。第 1 步安装 flyctl 并登录flyctl auth login第 2 步创建应用在项目根目录含fly.toml执行flyctl launch它会读取现有fly.toml应用名plexus、主区域yyz并提示你创建一个Postgres 实例——这一步会生成专属的DATABASE_URL。第 3 步理解 fly.toml 的关键配置[deploy] release_command /app/bin/migrate每次部署自动执行数据库迁移无需手动操作[[services]]auto_stop_machines trueauto_start_machines true支持缩容到 0 台机器以省钱[[vm]] size shared-cpu-2x、memory 1gb一台共享 CPU 2 核、1GB 内存的机器即可承载80 端口开启force_https true443 端口走tls httpHTTPS 全自动配置auto_rollback true新版本启动失败时自动回滚线上更安全。第 4 步注入环境变量并部署flyctl secrets set DATABASE_URL... SECRET_KEY_BASE... PHX_HOSTplexus.techlore.tech \ BASIC_AUTH_USERNAMEadmin BASIC_AUTH_PASSWORD... ONE_AUTH_SIGNING_SECRET... \ SMTP_SERVER... SMTP_USERNAME... SMTP_PASSWORD... SMTP_PORT... flyctl deploy第 5 步验证上线访问https://你的域名并可以打开/swaggerui查看 API 文档确认接口正常返回。五、数据库迁移与回滚不用装 Mix 也能操作lib/plexus/release.ex封装了生产环境的数据库操作容器里没有 Mix 也能执行迁移flyctl exec /app/bin/plexus eval Plexus.Release.migrate() # 应用全部迁移 flyctl exec /app/bin/plexus eval Plexus.Release.rollback(Plexus.Repo, 20241106205931) # 回滚到指定版本迁移脚本按时间戳命名存放在priv/repo/migrations/目录下如20260706180847_add_delete_token_hash_to_ratings.exs版本号即文件名前缀。六、上线后检查清单与常见问题上线后自查首页与/api接口均返回 200部署日志中迁移无报错flyctl logsHTTPS 强制生效80 自动跳转 443flyctl machines list确认机器状态为start常见坑启动报environment variable SECRET_KEY_BASE is missing—— 忘了flyctl secrets set按上面的变量清单补齐即可应用起不来、反复重启—— 多为DATABASE_URL错误或密码含特殊字符未转义检查flyctl logs定位改完runtime.exs没生效—— 它是启动时读取的必须重新flyctl deployIPv6 相关连接超时—— 确认镜像保留了 flyctl 追加的ERL_AFLAGS行不要手动删掉。完成以上步骤你就拥有了一个带自动迁移、自动回滚、HTTPS 全托管的 Plexus 生产环境。想继续深入可以阅读项目中的 PRIVACY.md 了解数据隐私策略或参考config/prod.exs了解静态资源缓存清单等生产级配置。祝部署顺利【免费下载链接】plexusRemove the fear of Android app compatibility on de-Googled devices.项目地址: https://gitcode.com/gh_mirrors/ple/plexus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

最新新闻

日新闻

周新闻

月新闻