Foreman开发与生产环境(Rails)

19

"Foreman way"是指在生产环境和开发环境中的不同行为。在开发环境中,我们希望Foreman启动大量东西;但是在Heroku生产环境中,我们不需要它启动Solr(例如)。

4个回答

22

我遵循惯例:

  • Procfile 定义所有进程
  • .foreman 设置特定的 foreman 变量

开发环境:

  • .env 为每个开发人员设置环境变量
  • .env.example 为开发环境设置默认值
  • foreman start 启动所有进程

生产环境:

  • heroku config 设置环境变量
  • heroku ps:scale 开启或关闭生产所需的任何进程

以下是一个项目示例。

Procfile:

web:    bundle exec unicorn_rails -p $PORT -c ./config/unicorn.rb
worker: bundle exec rake jobs:work
search: bundle exec rake sunspot:solr:run

.env.example:

# default S3 bucket
S3_KEY=keykeykeykeykeykey
S3_SECRET=secretsecretsecret
S3_BUCKET=myapp-development

.env

# developer's private S3 bucket
S3_KEY=mememememememememe
S3_SECRET=mysecretmysecret
S3_BUCKET=myapp-development

.工头:

# development port is 3000
port: 3000

3

Foreman 接受传入参数来使用不同的文件 (-d),以及指定要运行什么命令。它还支持一个 .foreman 文件,使这些参数成为默认值。更多信息请参见 http://ddollar.github.com/foreman/


1
我以前使用过特定于环境的Procfile,这很简单并且有效。基本上你需要有Procfile.developmentProcfile.production等文件,在每个文件中你可以自定义要启动的进程,然后通过foreman运行它们,如下所示:
foreman start -f Procfile.development

另一种方法是在您的Procfile中引用脚本,并在每个脚本内根据环境启动适当的进程。Foreman的创建者这样做,并且有他的Anvil项目示例供您参考

0
我们的解决方案是在 Procfile 中为开发和生产使用不同的作业类型。虽然这不是最DRY的方法,但它确实有效...
sidekiq: bundle exec sidekiq
sidekiq-prod: bundle exec sidekiq -e production

然后我们在生产系统上运行foreman,指定prod作业:

foreman start -c sidekiq-prod=4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接