FOREMAN
Process manager for applications with multiple components




                                         by Stoyan Zhekov
*file quiz
Rakefile
Rake
Gemfile
Bundler
Procfile
?
Foreman
MATZ   HEROKU
HEROKU + FOREMAN
Foreman
PROBLEM ?
Too complicated applications
XMPP Bot
 (Blather)
XMPP Bot     Web Frontend
 (Blather)      (Rails)
XMPP Bot         Web Frontend
  (Blather)          (Rails)



TWT Stream
(Event Machine)
XMPP Bot         Web Frontend
  (Blather)          (Rails)



TWT Stream             API
(Event Machine)      (Sinatra)
XMPP Bot         Web Frontend
  (Blather)          (Rails)



TWT Stream             API
(Event Machine)      (Sinatra)




 BGND Jobs
  (Resque)
XMPP Bot         Web Frontend
  (Blather)          (Rails)



TWT Stream             API
(Event Machine)      (Sinatra)




 BGND Jobs          Cronjobs
  (Resque)         (Clockwork)
HOW TO START THEM?



• rails:   rails server thin -p $PORT
HOW TO START THEM?



• rails:   rails server thin -p $PORT
• api:     rackup -s thin -p $PORT -E production
HOW TO START THEM?


• rails:   rails server thin -p $PORT
• api:     rackup -s thin -p $PORT -E production
• bot:     ruby jabber_bot.rb -D
HOW TO START THEM?

• rails:   rails server thin -p $PORT
• api:     rackup -s thin -p $PORT -E production
• bot:     ruby jabber_bot.rb -D
• cron: clockwork    clock.rb
HOW TO START THEM?

• rails:   rails server thin -p $PORT
• api:     rackup -s thin -p $PORT -E production
• bot:     ruby jabber_bot.rb -D
• cron: clockwork    clock.rb
• jobs:    QUEUE=* rake resque:work
HOW TO START THEM?

• rails:   bundle exec rails server thin -p $PORT

• api:     bundle exec rackup -s thin -p $PORT

• bot:     bundle exec ruby jabber_bot.rb -D

• cron: bundle   exec clockwork clock.rb

• jobs:    QUEUE=* bundle exec rake resque:work
Nightmare !
Foreman
PROCFILE


rails:   bundle exec rails server thin -p $PORT
api:     bundle exec rackup -s thin -p $PORT
bot:     bundle exec ruby jabber_bot.rb -D
cron:    bundle exec clockwork clock.rb
jobs:    QUEUE=* bundle exec rake resque:work
foreman start
IT JUST WORKS!
NOT ONLY RUBY


node:     node web.js
clojure: lein run -m
...
DOES IT SCALE?

  foreman start
-c web=5,job=2
OS INTEGRATION

$ sudo foreman export upstart /etc/init -a myapp

[foreman export] writing: /etc/init/myapp.conf
[foreman export] writing: /etc/init/myapp-web.conf
[foreman export] writing: /etc/init/myapp-web-1.conf


$ sudo start myapp
Thank you!

Foreman - Process manager for applications with multiple components

  • 1.
    FOREMAN Process manager forapplications with multiple components by Stoyan Zhekov
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
    MATZ HEROKU
  • 11.
  • 12.
  • 14.
  • 15.
  • 16.
  • 17.
    XMPP Bot Web Frontend (Blather) (Rails)
  • 18.
    XMPP Bot Web Frontend (Blather) (Rails) TWT Stream (Event Machine)
  • 19.
    XMPP Bot Web Frontend (Blather) (Rails) TWT Stream API (Event Machine) (Sinatra)
  • 20.
    XMPP Bot Web Frontend (Blather) (Rails) TWT Stream API (Event Machine) (Sinatra) BGND Jobs (Resque)
  • 21.
    XMPP Bot Web Frontend (Blather) (Rails) TWT Stream API (Event Machine) (Sinatra) BGND Jobs Cronjobs (Resque) (Clockwork)
  • 22.
    HOW TO STARTTHEM? • rails: rails server thin -p $PORT
  • 23.
    HOW TO STARTTHEM? • rails: rails server thin -p $PORT • api: rackup -s thin -p $PORT -E production
  • 24.
    HOW TO STARTTHEM? • rails: rails server thin -p $PORT • api: rackup -s thin -p $PORT -E production • bot: ruby jabber_bot.rb -D
  • 25.
    HOW TO STARTTHEM? • rails: rails server thin -p $PORT • api: rackup -s thin -p $PORT -E production • bot: ruby jabber_bot.rb -D • cron: clockwork clock.rb
  • 26.
    HOW TO STARTTHEM? • rails: rails server thin -p $PORT • api: rackup -s thin -p $PORT -E production • bot: ruby jabber_bot.rb -D • cron: clockwork clock.rb • jobs: QUEUE=* rake resque:work
  • 27.
    HOW TO STARTTHEM? • rails: bundle exec rails server thin -p $PORT • api: bundle exec rackup -s thin -p $PORT • bot: bundle exec ruby jabber_bot.rb -D • cron: bundle exec clockwork clock.rb • jobs: QUEUE=* bundle exec rake resque:work
  • 28.
  • 29.
  • 30.
    PROCFILE rails: bundle exec rails server thin -p $PORT api: bundle exec rackup -s thin -p $PORT bot: bundle exec ruby jabber_bot.rb -D cron: bundle exec clockwork clock.rb jobs: QUEUE=* bundle exec rake resque:work
  • 31.
  • 33.
  • 34.
    NOT ONLY RUBY node: node web.js clojure: lein run -m ...
  • 35.
    DOES IT SCALE? foreman start -c web=5,job=2
  • 36.
    OS INTEGRATION $ sudoforeman export upstart /etc/init -a myapp [foreman export] writing: /etc/init/myapp.conf [foreman export] writing: /etc/init/myapp-web.conf [foreman export] writing: /etc/init/myapp-web-1.conf $ sudo start myapp
  • 39.