Companion
Companion is a mountable Rails engine for running a companion application (e.g. Node, Python, Go, etc.) alongside a Rails application. Companion spawns and supervises the process, then proxies traffic from a mounted path in your Rails routes to the spawned process.
Usage
Installation
Gemfile
gem "companion"bundle installConfiguration
Initialize your application via a an initializer (e.g. config/initializers/companion.rb):
# config/initializers/companion.rb
Companion.configure do |config|
config.app :dashboard do |app|
app.command = -> { |port| "npm run serve -- --port {port}" }
app.directory = Rails.root.join("dashboard")
app.environment = { "NODE_ENV" => Rails.env.production? ? "production" : "development" }
end
endRouting
Mount your application as an engine in config/routes.rb:
# config/routes.rb
Rails.application.routes.draw do
mount Companion::Engine.app(:dashboard), at: "/dashboard"
endExamples
companions/greeter/Gemfile
source "https://rubygems.org"
gemspec
gem "rack"companions/greeter/config.ru
# companions/greeter/config.ru
run do |env|
[200, { "content-type" => "text/plain" }, ["Greetings!"]]
endconfig/initializers/companion.rb
Companion.configure do |config|
config.app :greeter do |app|
app.command = -> { |port| "rackup --port #{port}" }
app.directory = Rails.root.join("companions", "greeter")
end
endconfig/routes.rb
Rails.application.routes.draw do
mount Companion::Engine.app(:greeter), at: "/greeter"
endrails servercurl --verbose https://localhost:3000/greeter