Add support for multiple publish ip addresses
This commit is contained in:
@@ -23,7 +23,7 @@ class Kamal::Cli::Proxy < Kamal::Cli::Base
|
|||||||
|
|
||||||
desc "boot_config <set|get|reset>", "Manage kamal-proxy boot configuration"
|
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, type: :boolean, default: true, desc: "Publish the proxy ports on the host"
|
||||||
option :publish_host_ip, type: :string, desc: "Host IP address to bind HTTP/HTTPS traffic to. Defaults to all interfaces"
|
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 :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 :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"
|
option :log_max_size, type: :string, default: Kamal::Configuration::PROXY_LOG_MAX_SIZE, desc: "Max size of proxy logs"
|
||||||
|
|||||||
@@ -249,10 +249,16 @@ class Kamal::Configuration
|
|||||||
env_tags.detect { |t| t.name == name.to_s }
|
env_tags.detect { |t| t.name == name.to_s }
|
||||||
end
|
end
|
||||||
|
|
||||||
def proxy_publish_args(http_port, https_port, bind_ip = nil)
|
def proxy_publish_args(http_port, https_port, bind_ips = nil)
|
||||||
publish_http = [ bind_ip, http_port, PROXY_HTTP_PORT ].compact.join(":")
|
ensure_valid_bind_ips(bind_ips)
|
||||||
publish_https = [ bind_ip, https_port, PROXY_HTTPS_PORT ].compact.join(":")
|
|
||||||
argumentize "--publish", [ publish_http, publish_https ]
|
(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
|
end
|
||||||
|
|
||||||
def proxy_logging_args(max_size)
|
def proxy_logging_args(max_size)
|
||||||
@@ -346,6 +352,15 @@ class Kamal::Configuration
|
|||||||
true
|
true
|
||||||
end
|
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 Kamal::ConfigurationError, "Invalid publish IP address: #{ip}"
|
||||||
|
end
|
||||||
|
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
def ensure_retain_containers_valid
|
def ensure_retain_containers_valid
|
||||||
raise Kamal::ConfigurationError, "Must retain at least 1 container" if retain_containers < 1
|
raise Kamal::ConfigurationError, "Must retain at least 1 container" if retain_containers < 1
|
||||||
|
|
||||||
@@ -377,6 +392,15 @@ class Kamal::Configuration
|
|||||||
true
|
true
|
||||||
end
|
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
|
def role_names
|
||||||
raw_config.servers.is_a?(Array) ? [ "web" ] : raw_config.servers.keys.sort
|
raw_config.servers.is_a?(Array) ? [ "web" ] : raw_config.servers.keys.sort
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ class CliProxyTest < CliTestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "boot_config set custom bind ip" do
|
test "boot_config set bind IP" do
|
||||||
run_command("boot_config", "set", "--publish-host-ip", "127.0.0.1").tap do |output|
|
run_command("boot_config", "set", "--publish-host-ip", "127.0.0.1").tap do |output|
|
||||||
%w[ 1.1.1.1 1.1.1.2 ].each do |host|
|
%w[ 1.1.1.1 1.1.1.2 ].each do |host|
|
||||||
assert_match "Running /usr/bin/env mkdir -p .kamal/proxy on #{host}", output
|
assert_match "Running /usr/bin/env mkdir -p .kamal/proxy on #{host}", output
|
||||||
@@ -290,6 +290,23 @@ class CliProxyTest < CliTestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "boot_config set multiple bind IPs" do
|
||||||
|
run_command("boot_config", "set", "--publish-host-ip", "127.0.0.1", "--publish-host-ip", "::1").tap do |output|
|
||||||
|
%w[ 1.1.1.1 1.1.1.2 ].each do |host|
|
||||||
|
assert_match "Running /usr/bin/env mkdir -p .kamal/proxy on #{host}", output
|
||||||
|
assert_match "Uploading \"--publish 127.0.0.1:80:80 --publish 127.0.0.1:443:443 --publish [::1]:80:80 --publish [::1]:443:443 --log-opt max-size=10m\" to .kamal/proxy/options on #{host}", output
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
test "boot_config set invalid bind IPs" do
|
||||||
|
exception = assert_raises do
|
||||||
|
run_command("boot_config", "set", "--publish-host-ip", "1.2.3.invalidIP", "--publish-host-ip", "::1")
|
||||||
|
end
|
||||||
|
|
||||||
|
assert_includes exception.message, "Invalid publish IP address: 1.2.3.invalidIP"
|
||||||
|
end
|
||||||
|
|
||||||
test "boot_config set docker options" do
|
test "boot_config set docker options" do
|
||||||
run_command("boot_config", "set", "--docker_options", "label=foo=bar", "add_host=thishost:thathost").tap do |output|
|
run_command("boot_config", "set", "--docker_options", "label=foo=bar", "add_host=thishost:thathost").tap do |output|
|
||||||
%w[ 1.1.1.1 1.1.1.2 ].each do |host|
|
%w[ 1.1.1.1 1.1.1.2 ].each do |host|
|
||||||
|
|||||||
Reference in New Issue
Block a user