【问题标题】:Rails 4, Capistrano 3 and Dotenv - How to deploy using server-side .env fileRails 4、Capistrano 3 和 Dotenv - 如何使用服务器端 .env 文件进行部署
【发布时间】:2017-05-25 03:09:57
【问题描述】:

我有一个带有 Dotenv gem 的 Rails 4 应用程序,可以从文件 .env 中读取变量。

为了让我的 rails 应用程序拥有除“root”以外的 mysql 用户,我设置了一些变量,例如:

MYSQL_ROOT_USER='rootuser'
MYSQL_ROOT_PASSWORD='rootpassword'
APP_DATABASE_USER='mydbuser'
APP_DATABASE_PASSWORD='userpassword'

我还创建了一个bash脚本来在scripts/database_setup.bash下创建mysql用户

#!/bin/bash
source ../.env
# creates the user
mysql -u${MYSQL_ROOT_USER} --password="${MYSQL_ROOT_PASSWORD}" -e "CREATE USER '${APP_DATABASE_USER}'@'localhost' IDENTIFIED BY '${APP_DATABASE_PASSWORD}';"
# grants permission
mysql -u${MYSQL_ROOT_USER} --password="${MYSQL_ROOT_PASSWORD}" -e "GRANT ALL PRIVILEGES ON \`myapp\_%\`.* TO '${APP_DATABASE_USER}'@'localhost';"

在服务器端,Capistrano 部署到 `/home/myuser/apps/myapp/

我有三个问题:

  1. 放置服务器端.env 文件的最佳位置在哪里?现在我把它放在/home/myuser/apps/myapp/ 目录中。
  2. 如何告诉 Capistrano 将其复制到 Rails 根目录?
  3. 如何告诉 Capistrano 在运行迁移之前执行我的 bash 脚本?

【问题讨论】:

    标签: ruby-on-rails capistrano3


    【解决方案1】:

    如果有人仍然遇到此问题,这是我如何让我的 .env 在 Capistrano 3.5+ 的生产环境中工作:

    将您的.env.production 添加到生产环境中的/shared 目录。然后,在部署脚本中,使用 Capistrano 的 append 命令从 /shared 目录加载链接文件,如下所示:

    append :linked_files, ".env.production"
    

    运行标准部署 (cap production deploy)

    您可以通过在/current 目录中以生产模式 (rails c p) 启动 rails 控制台来测试是否附加了环境变量。

    【讨论】:

    • 你能告诉我如何测试的细节吗?我必须输入什么? - 您可以通过在 /current 目录中以生产模式 (rails c p) 启动 rails 控制台来测试是否附加了环境变量。
    • SSH 进入你的服务器,cd 进入/current 并启动rails console。进入pryirb 后,输入ENV['YOUR_ENV_VAR'] 测试您的环境
    • 不知何故,我无法在生产服务器中输入rails c。但你的回答奏效了。 ~/myapp/current$ rails c Traceback(最近一次调用最后):4:来自 bin/rails:3:in <main>' 3: from bin/rails:3:in load' 2:来自 /home/deploy/myapp/releases/20191129015922/bin/spring:8 :in <top (required)>' 1: from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in require' /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': 无法加载这样的文件 -- bundler (LoadError)
    • @JinLim 看起来bundler 没有安装。尝试安装捆绑器。
    • 你可以这样运行它:bundle exec rails console -e production
    【解决方案2】:

    在生产环境中我认为你根本不应该使用.env

    可能最好将 ENV 变量放入:

    /etc/environment

    通过这样编写变量:

    export ENV_VARIABLE=value

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2016-06-02
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      相关资源
      最近更新 更多