You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kamal 2部署Rails7+Postgres遇ActiveSupport加密错误

解决Kamal部署Rails 7应用时的ActiveSupport::MessageEncryptor::InvalidMessage错误

问题概述

使用Kamal 2在EC2 Ubuntu实例部署Rails 7 + Postgres应用时,Postgres和Kamal Proxy容器正常运行,但Rails Web容器启动失败,执行kamal setup时触发解密错误,容器退出状态码为1。

关键错误日志

ERROR Failed to boot web on x.x.x.x
INFO First web container is unhealthy on x.x.x.x, not booting any other roles
ERROR 2024-11-25T18:03:34.760918670Z bin/rails aborted!
2024-11-25T18:03:34.773757665Z ActiveSupport::MessageEncryptor::InvalidMessage: ActiveSupport::MessageEncryptor::InvalidMessage
2024-11-25T18:03:34.773917647Z /rails/config/environment.rb:5:in `<main>'
2024-11-25T18:03:34.773964950Z Tasks: TOP => db:prepare => db:load_config => environment
2024-11-25T18:03:34.773995507Z (See full trace by running task with --trace)

当前容器状态

执行docker ps -a的输出:

CONTAINER ID   IMAGE                                                        COMMAND                  CREATED          STATUS                     PORTS                                                                      NAMES
e574c13c02ae   usrname/app:7b4a17845abcd627c29b810dbf2386476e85903f   "/rails/bin/docker-e…"   9 minutes ago    Exited (1) 9 minutes ago                                                                              doordepot-web-7b4a17845abcd627c29b810dbf2386476e85903f
efd6d57f5dea   basecamp/kamal-proxy:v0.8.2                                  "kamal-proxy run"        9 minutes ago    Up 9 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   kamal-proxy
9895da41d87a   postgres:17                                                  "docker-entrypoint.s…"   10 minutes ago   Up 10 minutes              127.0.0.1:5432->5432/tcp                                                   doordepot-db

数据库配置文件(database.yml)

production:
  <<: *default
  database: doordepot_production
  username: doordepot
  password: <%= ENV["POSTGRES_PASSWORD"] %>
  host: <%= ENV["DB_HOST"] %>

解决方案步骤

1. 优先确认Rails加密密钥配置

这个错误的核心是Rails无法解密加密凭据,90%以上的情况是容器内缺少正确的主密钥:

  • 检查.kamal/secrets目录下的文件,确认是否包含RAILS_MASTER_KEY(对应本地config/master.key)或SECRET_KEY_BASE
  • 确保本地config/master.key的内容和Kamal部署到服务器的密钥完全一致;如果使用SECRET_KEY_BASE,可通过rails secret生成新值并同步到.kamal/secrets中

2. 验证环境变量是否正确注入容器

  • 检查.kamal/deploy.yml的env配置块,确认POSTGRES_PASSWORD、DB_HOST、RAILS_MASTER_KEY(或SECRET_KEY_BASE)已正确声明
  • 查看退出容器的环境变量,确认变量是否存在:
docker exec -it e574c13c02ae env

(替换容器ID为你的Web容器ID)

3. 重新推送密钥并部署

  • 推送最新密钥到服务器:
kamal secrets push
  • 清理旧容器后重新部署:
docker rm doordepot-web-7b4a17845abcd627c29b810dbf2386476e85903f
kamal deploy

4. 排查详细错误栈

如果以上步骤无效,执行以下命令获取完整错误轨迹,定位具体问题:

docker run --rm -e RAILS_ENV=production usrname/app:7b4a17845abcd627c29b810dbf2386476e85903f bin/rails db:prepare --trace

内容的提问来源于stack exchange,提问作者titan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:54:51