Adapt dev env to run on a remote box (#8232)
* Adapt dev env to run on a remote box * webpack-dev-server ignores CLI arguments, so switched to environment variables. * Dynamically determine remote webpack host via APP_DOMAIN environment variable, defined in application.yml. * Setup content security policy to allow connecting to webpack on a remote box, defined by APP_DOMAIN environment variable. * Make Webpacker listen on 0.0.0.0 * Account for APP_DOMAIN port * Add support for URI scheme and tests * Fix a spec by disabling a Rubocop linter
This commit is contained in:
parent
9c471640b6
commit
be07697d6d
5 changed files with 55 additions and 4 deletions
|
|
@ -1,3 +1,3 @@
|
||||||
web: bin/rails s -p 3000 -b 0.0.0.0
|
web: bin/rails s -p 3000 -b 0.0.0.0
|
||||||
webpacker: ./bin/webpack-dev-server --listen-host 0.0.0.0 --host 0.0.0.0
|
webpacker: ./bin/webpack-dev-server
|
||||||
sidekiq: bundle exec sidekiq
|
sidekiq: bundle exec sidekiq
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,15 @@
|
||||||
ENVied.require(*ENV["ENVIED_GROUPS"] || Rails.groups)
|
ENVied.require(*ENV["ENVIED_GROUPS"] || Rails.groups)
|
||||||
|
|
||||||
class ApplicationConfig
|
class ApplicationConfig
|
||||||
|
URI_REGEXP = %r{(?<scheme>https?://)?(?<host>.+?)(?<port>:\d+)?$}.freeze
|
||||||
|
|
||||||
def self.[](key)
|
def self.[](key)
|
||||||
ENVied.send(key)
|
ENVied.send(key)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.app_domain_no_port
|
||||||
|
app_domain = self["APP_DOMAIN"]
|
||||||
|
match = app_domain.match(URI_REGEXP)
|
||||||
|
match[:host]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@ Rails.application.config.content_security_policy do |policy|
|
||||||
# # policy.report_uri "/csp-violation-report-endpoint"
|
# # policy.report_uri "/csp-violation-report-endpoint"
|
||||||
|
|
||||||
# allow webpack-dev-server host as allowed origin for connect-src
|
# allow webpack-dev-server host as allowed origin for connect-src
|
||||||
policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
|
if Rails.env.development?
|
||||||
|
webpack_host = "#{ApplicationConfig.app_domain_no_port}:3035"
|
||||||
|
policy.connect_src :self, :https,
|
||||||
|
"http://#{webpack_host}", "ws://#{webpack_host}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# If you are using UJS then enable automatic nonce generation
|
# If you are using UJS then enable automatic nonce generation
|
||||||
|
|
|
||||||
|
|
@ -56,9 +56,9 @@ development:
|
||||||
# Reference: https://webpack.js.org/configuration/dev-server/
|
# Reference: https://webpack.js.org/configuration/dev-server/
|
||||||
dev_server:
|
dev_server:
|
||||||
https: false
|
https: false
|
||||||
host: localhost
|
host: 0.0.0.0
|
||||||
port: 3035
|
port: 3035
|
||||||
public: localhost:3035
|
public: 0.0.0.0:3035
|
||||||
hmr: false
|
hmr: false
|
||||||
# Inline should be set to true if using HMR
|
# Inline should be set to true if using HMR
|
||||||
inline: true
|
inline: true
|
||||||
|
|
|
||||||
39
spec/initializers/application_config_spec.rb
Normal file
39
spec/initializers/application_config_spec.rb
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
require "rails_helper"
|
||||||
|
|
||||||
|
describe ApplicationConfig do
|
||||||
|
describe ".app_domain_no_port" do
|
||||||
|
it "handles plain subdomain only name" do
|
||||||
|
setup_app_domain("renner")
|
||||||
|
|
||||||
|
expect(described_class.app_domain_no_port).to eq "renner"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles plain domain name" do
|
||||||
|
setup_app_domain("renner.ngrok.io")
|
||||||
|
|
||||||
|
expect(described_class.app_domain_no_port).to eq "renner.ngrok.io"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles domain with port" do
|
||||||
|
setup_app_domain("renner:3000")
|
||||||
|
|
||||||
|
expect(described_class.app_domain_no_port).to eq "renner"
|
||||||
|
end
|
||||||
|
|
||||||
|
it "handles domain with schema and port" do
|
||||||
|
setup_app_domain("http://renner:4000")
|
||||||
|
|
||||||
|
expect(described_class.app_domain_no_port).to eq "renner"
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def setup_app_domain(app_domain)
|
||||||
|
# No #and_return for #have_received.
|
||||||
|
# rubocop:disable RSpec/MessageSpies
|
||||||
|
expect(ApplicationConfig).to receive(:[]).with("APP_DOMAIN").
|
||||||
|
and_return(app_domain)
|
||||||
|
# rubocop:enable RSpec/MessageSpies
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Reference in a new issue