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

Rails 4, Capistrano 3 and Dotenv - How to deploy using server-side .env file

我有一个带有 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 脚本?

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

可能最好将 ENV 变量放入:

/etc/environment

通过这样写你的变量:

export ENV_VARIABLE=value

如果有人仍然遇到这个问题,下面是我如何让我的 .env 在生产环境中使用 Capistrano 3.5+:

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

append :linked_files, ".env.production"

运行 标准部署 (cap production deploy)

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