【问题标题】:Capistrano 3 rails deploy cant find databaseCapistrano 3 rails 部署找不到数据库
【发布时间】:2026-01-03 23:30:01
【问题描述】:

DigitalOcean Ubuntu 14.04 x64 + Rails 4 + Nginx + Unicorn + PostgreSQL + Capistrano 3

我使用此演练部署了我的数字海洋铁路应用程序。

https://gist.github.com/ChuckJHardy/f44dda5f94c6bbdba9a4

说明非常清楚,也很重要,所以我不必偏离演练。

我已经完成了一切,当我跑步时

cap production deploy:check

没有错误。但是当我跑步时

cap production deploy

它崩溃说

INFO [deploy:migrate] Checking changes in /db/migrate
DEBUG [87821ebd] Running /usr/bin/env diff -q /home/deployer/apps/jones_jems/releases/20150506224711/db/migrate /home/deployer/apps/jones_jems/current/db/migrate as deployer@107.170.222.154
DEBUG [87821ebd] Command: diff -q /home/deployer/apps/jones_jems/releases/20150506224711/db/migrate /home/deployer/apps/jones_jems/current/db/migrate
DEBUG [87821ebd]    diff: 
DEBUG [87821ebd]    /home/deployer/apps/jones_jems/current/db/migrate
DEBUG [87821ebd]    : No such file or directory
DEBUG [87821ebd]    
DEBUG [87821ebd] Finished in 0.085 seconds with exit status 2 (failed).
INFO [deploy:migrate] Run `rake db:migrate`
DEBUG [b41648f9] Running /usr/bin/env if test ! -d /home/deployer/apps/jones_jems/releases/20150506224711; then echo "Directory does not exist '/home/deployer/apps/jones_jems/releases/20150506224711'" 1>&2; false; fi as deployer@107.170.222.154
DEBUG [b41648f9] Command: if test ! -d /home/deployer/apps/jones_jems/releases/20150506224711; then echo "Directory does not exist '/home/deployer/apps/jones_jems/releases/20150506224711'" 1>&2; false; fi
DEBUG [b41648f9] Finished in 0.074 seconds with exit status 0 (successful).
INFO [bde04a76] Running ~/.rvm/bin/rvm default do bundle exec rake db:migrate as deployer@107.170.222.154
DEBUG [bde04a76] Command: cd /home/deployer/apps/jones_jems/releases/20150506224711 && ( RAILS_ENV=production ~/.rvm/bin/rvm default do bundle exec rake db:migrate )
DEBUG [bde04a76]    rake aborted!
DEBUG [bde04a76]    ActiveRecord::NoDatabaseError: FATAL:  database "JonesJems" does not exist

我按照下面列出的创建数据库的演练进行操作

创建 Postgres 用户

sudo -u postgres psql
create user deployer with password 'password';
alter role deployer superuser createrole createdb replication;
create database JonesJems owner deployer;

如果我再次尝试执行此演练,它会说数据库已经存在。

postgres=# create database JonesJems owner deployer;
ERROR:  database "jonesjems" already exists

这是我的 rails database.yml 文件

production:
  adapter: postgresql
  host: 127.0.0.1
  port: 5432
  encoding: unicode
  database: JonesJems
  pool: 5
  username: <%= ENV['JJ_DB_USER'] %>
  password: <%= ENV['JJ_DB_PASSWORD'] %>

环境变量存储在 etc/environment

【问题讨论】:

    标签: ruby-on-rails ruby capistrano capistrano3


    【解决方案1】:

    我最终只是在发布目录中运行 rake db:create

    【讨论】:

    • 如果您在生产服务器上执行此操作,请运行:$ RAILS_ENV=production rake db:create
    【解决方案2】:

    我看到 database.yml 文件和 ActiveRecord 错误消息都将数据库名称引用为 JonesJems(标题大小写),而 psql 错误引用 jonesjems(小写)。

    也许 ActiveRecord 数据库适配器对数据库名称区分大小写?

    尝试将 production.yml 更改为 database: jonesjems

    【讨论】:

    • 是的,我注意到并尝试了。我创建了名为 JonesJems 的数据库。我也尝试为数据库管理员使用不同的用户,但我已经列出了数据库,我可以看到 jonesjems 以及正确的所有者。