Fly.io部署Phoenix应用调用Resend API发邮件报错求助
解决方案:Fly.io环境下Resend API调用因CA证书缺失失败
问题根源
错误:enoent表示文件不存在,结合调用栈里的pubkey_os_cacerts.get/0,说明Erlang的httpc适配器在Fly.io容器中找不到系统CA证书——这是因为部分精简容器镜像未预装CA证书,或者Erlang/OTP 26在容器环境下默认的CA证书路径不匹配。
可行解决方法
方法1:切换Tesla适配器为Hackney(推荐)
Hackney适配器自带CA证书,无需依赖系统证书文件,能直接解决问题:
- 在
mix.exs的依赖中添加hackney:defp deps do [ # 其他依赖... {:hackney, "~> 1.18"} ] - 运行
mix deps.get安装依赖。 - 配置Resend使用Hackney适配器,在
config/runtime.exs中添加:config :resend, adapter: Tesla.Adapter.Hackney
方法2:手动指定CA证书路径(适用于坚持使用httpc的场景)
Fly.io的Debian/Ubuntu镜像中,CA证书通常位于/etc/ssl/certs/ca-certificates.crt,可以给httpc适配器指定该路径:
config :tesla, Tesla.Adapter.Httpc, httpc_options: [ ssl: [cacertfile: "/etc/ssl/certs/ca-certificates.crt"] ]
方法3:确保容器镜像预装CA证书
如果使用自定义Docker镜像,需要在Dockerfile中安装CA证书包:
# 基于官方Elixir镜像的示例 FROM elixir:1.15.4-slim # 安装CA证书 RUN apt-get update && \ apt-get install -y --no-install-recommends ca-certificates && \ rm -rf /var/lib/apt/lists/* # 其他构建步骤...
验证
部署修改后的代码到Fly.io,触发邮件发送功能,检查Sentry是否再出现该错误,同时确认Resend后台是否收到发送请求。
内容的提问来源于stack exchange,提问作者hackemate
相关产品推荐
相关产品推荐

