Foreman: Use different Procfile in development and production
Solution 1
You could use two Procfiles
(e.g. Procfile
and Procfile.dev
) and use foreman
s -f
option to select a different one to use in dev:
In dev (Procfile.dev
contains your shotgun
web process):
foreman start -f Procfile.dev
In production, foreman start
will pick up the normal Procfile
.
Alternatively you could create a bin
directory in your app with a script to start the appropriate web server depending on $RACK_ENV
(an idea I found in a comment made by the creator of Foreman, so worth considering).
Solution 2
@sharagoz 's comment on the selected answer, in my opinion, is the best option to allow you to still use foreman start
without adding additional arguments AND keep your Procfile separate for Heroku.
To avoid the -f Procfile.dev parameter you can create a .foreman file with
procfile: Procfile.dev
in it – Sharagoz
In my applications root directory I created a .foreman
file and as the comment states
.foreman
procfile: Procfile.dev
Procfile
web: bundle exec puma -C config/puma.rb
Procfile.dev
web: bundle exec puma -C config/puma.rb
webpacker: ./bin/webpack-dev-server
Solution 3
Here is a way to handle it with one Procfile and environment variables. I am using this on Heroku.
Set your environment:
export WEB_START_COMMAND='node index.js'
export WORKER_START_COMMAND='node worker.js'
The Procfile:
web: eval '$WEB_START_COMMAND'
worker: eval '$WORKER_START_COMMAND'
Export different start command in your server and dev environments.
Solution 4
For those still looking for this, according to the docs foreman
is not needed anymore. You can simply use:
heroku local -f Procfile.dev
Comments
-
Arnaud Leymet almost 2 years
I have a homemade Sinatra application for which I intend to use Heroku to host it.
I use foreman and shotgun in development, with the following Procfile:
web: shotgun config.ru -s thin -o 0.0.0.0 -p $PORT -E $RACK_ENV
It works great with both development and production. But the thing is, I don't want to use shotgun in production since it's too slow.
Can we use separate Procfile configurations for both dev and prod?
-
darko over 9 yearsWould you by chance know if there is a way to tell Heroku to run a different Procfile?
-
bgentry over 9 years@darko no, there is no way to specify a custom Procfile for Heroku to run with. It will always use the one named
Procfile
. -
Arctodus over 7 yearsTo avoid the
-f Procfile.dev
parameter you can create a.foreman
file withprocfile: Procfile.dev
in it -
gnkdl_gansklgna almost 7 years@bgentry that's terrifying, is that intentional?
-
Adam over 6 yearsFor anyone happening to use node-foreman, the flag is -j instead of -f for some odd reason.
-
Pablote over 5 yearsthis doesn't seem to work when there's a
$PORT
on the command -
Andy Waite over 5 yearsThis is somewhat limited if you want to have a different set of processes per environment. @sharagoz solution is more flexible.
-
daemon_nio over 4 yearsIn my case it turned out to be a pretty good solution, simple and working.