使用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
相关产品推荐
相关产品推荐

