Merge pull request #1265 from phoozle/proxy-bind-ip
Add proxy boot_config --publish-ip argument
This commit is contained in:
@@ -23,6 +23,7 @@ class Kamal::Cli::Proxy < Kamal::Cli::Base
|
||||
|
||||
desc "boot_config <set|get|reset>", "Manage kamal-proxy boot configuration"
|
||||
option :publish, type: :boolean, default: true, desc: "Publish the proxy ports on the host"
|
||||
option :publish_host_ip, type: :string, repeatable: true, default: nil, desc: "Host IP address to bind HTTP/HTTPS traffic to. Defaults to all interfaces"
|
||||
option :http_port, type: :numeric, default: Kamal::Configuration::PROXY_HTTP_PORT, desc: "HTTP port to publish on the host"
|
||||
option :https_port, type: :numeric, default: Kamal::Configuration::PROXY_HTTPS_PORT, desc: "HTTPS port to publish on the host"
|
||||
option :log_max_size, type: :string, default: Kamal::Configuration::PROXY_LOG_MAX_SIZE, desc: "Max size of proxy logs"
|
||||
@@ -31,7 +32,7 @@ class Kamal::Cli::Proxy < Kamal::Cli::Base
|
||||
case subcommand
|
||||
when "set"
|
||||
boot_options = [
|
||||
*(KAMAL.config.proxy_publish_args(options[:http_port], options[:https_port]) if options[:publish]),
|
||||
*(KAMAL.config.proxy_publish_args(options[:http_port], options[:https_port], options[:publish_host_ip]) if options[:publish]),
|
||||
*(KAMAL.config.proxy_logging_args(options[:log_max_size])),
|
||||
*options[:docker_options].map { |option| "--#{option}" }
|
||||
]
|
||||
|
||||
@@ -249,8 +249,16 @@ class Kamal::Configuration
|
||||
env_tags.detect { |t| t.name == name.to_s }
|
||||
end
|
||||
|
||||
def proxy_publish_args(http_port, https_port)
|
||||
argumentize "--publish", [ "#{http_port}:#{PROXY_HTTP_PORT}", "#{https_port}:#{PROXY_HTTPS_PORT}" ]
|
||||
def proxy_publish_args(http_port, https_port, bind_ips = nil)
|
||||
ensure_valid_bind_ips(bind_ips)
|
||||
|
||||
(bind_ips || [ nil ]).map do |bind_ip|
|
||||
bind_ip = format_bind_ip(bind_ip)
|
||||
publish_http = [ bind_ip, http_port, PROXY_HTTP_PORT ].compact.join(":")
|
||||
publish_https = [ bind_ip, https_port, PROXY_HTTPS_PORT ].compact.join(":")
|
||||
|
||||
argumentize "--publish", [ publish_http, publish_https ]
|
||||
end.join(" ")
|
||||
end
|
||||
|
||||
def proxy_logging_args(max_size)
|
||||
@@ -344,6 +352,15 @@ class Kamal::Configuration
|
||||
true
|
||||
end
|
||||
|
||||
def ensure_valid_bind_ips(bind_ips)
|
||||
bind_ips.present? && bind_ips.each do |ip|
|
||||
next if ip =~ Resolv::IPv4::Regex || ip =~ Resolv::IPv6::Regex
|
||||
raise ArgumentError, "Invalid publish IP address: #{ip}"
|
||||
end
|
||||
|
||||
true
|
||||
end
|
||||
|
||||
def ensure_retain_containers_valid
|
||||
raise Kamal::ConfigurationError, "Must retain at least 1 container" if retain_containers < 1
|
||||
|
||||
@@ -375,6 +392,15 @@ class Kamal::Configuration
|
||||
true
|
||||
end
|
||||
|
||||
def format_bind_ip(ip)
|
||||
# Ensure IPv6 address inside square brackets - e.g. [::1]
|
||||
if ip =~ Resolv::IPv6::Regex && ip !~ /\[.*\]/
|
||||
"[#{ip}]"
|
||||
else
|
||||
ip
|
||||
end
|
||||
end
|
||||
|
||||
def role_names
|
||||
raw_config.servers.is_a?(Array) ? [ "web" ] : raw_config.servers.keys.sort
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user