简体   繁体   中英

foreman development vs production (rails)

what is the "foreman way" for behaving differently in production vs development? That is we want foreman start to start up a bunch of stuff in dev, however in heroku production we don't need it to start (for example) solr.

I follow the convention;

  • Procfile defines all processes
  • .foreman set specific foreman variables

Development:

  • .env sets environment variables for each developer
  • .env.example sets defaults for development
  • foreman start starts all processes

Production:

  • heroku config sets environment variables
  • heroku ps:scale turns on or off whichever processes are needed for production

Here's an example from a project.

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

.foreman:

# development port is 3000
port: 3000

Foreman takes arguments to use a different file (-d) and arguments to specify what to run. It also supports a .foreman file that allows those args to become default. See http://ddollar.github.com/foreman/ for more info

I've used environment-specific Procfile s before, which is pretty simple and works fine.

Basically you have Procfile.development , Procfile.production , etc. In each you can customize the procs you want to start, then run them via foreman like so:

foreman start -f Procfile.development

Another approach is to reference scripts in your Procfile , and within each script start up the appropriate process based on the environment. The creator of Foreman does this and has an example from his Anvil project your reference .

Our solution was to use a separate job type in our Procfile for dev vs. production. It is not the most DRY method, but it works...

sidekiq: bundle exec sidekiq
sidekiq-prod: bundle exec sidekiq -e production

Then we run foreman specifying the prod job on the production system:

foreman start -c sidekiq-prod=4

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM