Rails 4、Capistrano 3 和 Dotenv - 如何使用服务器端 .env 文件进行部署

Ale*_*rus 3 ruby-on-rails capistrano3

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

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

MYSQL_ROOT_USER='rootuser'
MYSQL_ROOT_PASSWORD='rootpassword'
APP_DATABASE_USER='mydbuser'
APP_DATABASE_PASSWORD='userpassword'
Run Code Online (Sandbox Code Playgroud)

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

#!/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';"
Run Code Online (Sandbox Code Playgroud)

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

我有三个问题:

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

小智 5

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

可能最好将 ENV 变量放入:

/etc/environment

通过像这样编写变量:

export ENV_VARIABLE=value


dim*_*nyc 5

如果有人对此仍有问题,以下是我.env使用 Capistrano 3.5+ 进行生产的方式:

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

append :linked_files, ".env.production"
Run Code Online (Sandbox Code Playgroud)

运行标准部署 ( cap production deploy)

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