Downgrade from Kamal 2 to 1.9
Add a downgrade command, so you can reverse the upgrade process and go back to Kamal 1.9. This replaces kamal-proxy and reboots all the accessories. This gives an upgrade and downgrade path: Upgrade: 1. Upgrade config to be Kamal 2 compatible + use kamal 2.0 2. Run `kamal upgrade` Downgrade: 1. Switch back to previous config + use kamal 1.9 2. Run `kamal downgrade` You can set `--rolling` to downgrade one host at a time.
This commit is contained in:
@@ -222,6 +222,25 @@ class Kamal::Cli::Accessory < Kamal::Cli::Base
|
||||
end
|
||||
end
|
||||
|
||||
desc "downgrade", "Downgrade accessories from Kamal 2 to 1.9"
|
||||
option :rolling, type: :boolean, default: false, desc: "Upgrade one host at a time"
|
||||
option :confirmed, aliases: "-y", type: :boolean, default: false, desc: "Proceed without confirmation question"
|
||||
def downgrade(name)
|
||||
confirming "This will restart all accessories" do
|
||||
with_lock do
|
||||
host_groups = options[:rolling] ? KAMAL.accessory_hosts : [ KAMAL.accessory_hosts ]
|
||||
host_groups.each do |hosts|
|
||||
host_list = Array(hosts).join(",")
|
||||
KAMAL.with_specific_hosts(hosts) do
|
||||
say "Downgrading #{name} accessories on #{host_list}...", :magenta
|
||||
reboot name
|
||||
say "Downgraded #{name} accessories on #{host_list}...", :magenta
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def with_accessory(name)
|
||||
if KAMAL.config.accessory(name)
|
||||
|
||||
@@ -206,6 +206,10 @@ module Kamal::Cli
|
||||
instance_variable_get("@_invocations").first
|
||||
end
|
||||
|
||||
def reset_invocation(cli_class)
|
||||
instance_variable_get("@_invocations")[cli_class].pop
|
||||
end
|
||||
|
||||
def ensure_run_and_locks_directory
|
||||
on(KAMAL.hosts) do
|
||||
execute(*KAMAL.server.ensure_run_directory)
|
||||
|
||||
@@ -217,6 +217,37 @@ class Kamal::Cli::Main < Kamal::Cli::Base
|
||||
end
|
||||
end
|
||||
|
||||
desc "downgrade", "Downgrade from Kamal 2 to 1.9"
|
||||
option :confirmed, aliases: "-y", type: :boolean, default: false, desc: "Proceed without confirmation question"
|
||||
option :rolling, type: :boolean, default: false, desc: "Downgrade one host at a time"
|
||||
def downgrade
|
||||
confirming "This will replace Traefik with kamal-proxy and restart all accessories" do
|
||||
with_lock do
|
||||
if options[:rolling]
|
||||
(KAMAL.hosts | KAMAL.accessory_hosts).each do |host|
|
||||
KAMAL.with_specific_hosts(host) do
|
||||
say "Downgrading #{host}...", :magenta
|
||||
if KAMAL.hosts.include?(host)
|
||||
invoke "kamal:cli:traefik:downgrade", [], options.merge(confirmed: true, rolling: false)
|
||||
reset_invocation(Kamal::Cli::Traefik)
|
||||
end
|
||||
if KAMAL.accessory_hosts.include?(host)
|
||||
invoke "kamal:cli:accessory:downgrade", [ "all" ], options.merge(confirmed: true, rolling: false)
|
||||
reset_invocation(Kamal::Cli::Accessory)
|
||||
end
|
||||
say "Downgraded #{host}", :magenta
|
||||
end
|
||||
end
|
||||
else
|
||||
say "Downgrading all hosts...", :magenta
|
||||
invoke "kamal:cli:traefik:downgrade", [], options.merge(confirmed: true)
|
||||
invoke "kamal:cli:accessory:downgrade", [ "all" ], options.merge(confirmed: true)
|
||||
say "Downgraded all hosts", :magenta
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "version", "Show Kamal version"
|
||||
def version
|
||||
puts Kamal::VERSION
|
||||
|
||||
@@ -119,4 +119,44 @@ class Kamal::Cli::Traefik < Kamal::Cli::Base
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "downgrade", "Downgrade to Traefik on servers (stop container, remove container, start new container, reboot app)"
|
||||
option :rolling, type: :boolean, default: false, desc: "Reboot proxy on hosts in sequence, rather than in parallel"
|
||||
option :confirmed, aliases: "-y", type: :boolean, default: false, desc: "Proceed without confirmation question"
|
||||
def downgrade
|
||||
invoke_options = { "version" => KAMAL.config.latest_tag }.merge(options)
|
||||
|
||||
confirming "This will cause a brief outage on each host. Are you sure?" do
|
||||
host_groups = options[:rolling] ? KAMAL.hosts : [ KAMAL.hosts ]
|
||||
host_groups.each do |hosts|
|
||||
host_list = Array(hosts).join(",")
|
||||
say "Downgrading to Traefik on #{host_list}...", :magenta
|
||||
run_hook "pre-traefik-reboot", hosts: host_list
|
||||
on(hosts) do |host|
|
||||
execute *KAMAL.auditor.record("Rebooted Traefik"), verbosity: :debug
|
||||
execute *KAMAL.registry.login
|
||||
|
||||
"Stopping and removing kamal-proxy on #{host}, if running..."
|
||||
execute *KAMAL.traefik.cleanup_kamal_proxy
|
||||
|
||||
"Stopping and removing Traefik on #{host}, if running..."
|
||||
execute *KAMAL.traefik.stop, raise_on_non_zero_exit: false
|
||||
execute *KAMAL.traefik.remove_container
|
||||
execute *KAMAL.traefik.remove_image
|
||||
end
|
||||
|
||||
KAMAL.with_specific_hosts(hosts) do
|
||||
invoke "kamal:cli:traefik:boot", [], invoke_options
|
||||
reset_invocation(Kamal::Cli::Traefik)
|
||||
invoke "kamal:cli:app:boot", [], invoke_options
|
||||
reset_invocation(Kamal::Cli::App)
|
||||
invoke "kamal:cli:prune:all", [], invoke_options
|
||||
reset_invocation(Kamal::Cli::Prune)
|
||||
end
|
||||
|
||||
run_hook "post-traefik-reboot", hosts: host_list
|
||||
say "Downgraded to Traefik on #{host_list}", :magenta
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -56,6 +56,13 @@ class Kamal::Commander
|
||||
end
|
||||
end
|
||||
|
||||
def with_specific_hosts(hosts)
|
||||
original_hosts, self.specific_hosts = specific_hosts, hosts
|
||||
yield
|
||||
ensure
|
||||
self.specific_hosts = original_hosts
|
||||
end
|
||||
|
||||
def accessory_names
|
||||
config.accessories&.collect(&:name) || []
|
||||
end
|
||||
|
||||
@@ -23,7 +23,7 @@ class Kamal::Commander::Specifics
|
||||
end
|
||||
|
||||
def accessory_hosts
|
||||
specific_hosts || config.accessories.flat_map(&:hosts)
|
||||
config.accessories.flat_map(&:hosts) & specified_hosts
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -62,6 +62,15 @@ class Kamal::Commands::Traefik < Kamal::Commands::Base
|
||||
[ :rm, "-f", env.secrets_file ]
|
||||
end
|
||||
|
||||
def cleanup_kamal_proxy
|
||||
chain \
|
||||
docker(:container, :stop, "kamal-proxy"),
|
||||
combine(
|
||||
docker(:container, :prune, "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy"),
|
||||
docker(:image, :prune, "--all", "--force", "--filter", "label=org.opencontainers.image.title=kamal-proxy")
|
||||
)
|
||||
end
|
||||
|
||||
private
|
||||
def publish_args
|
||||
argumentize "--publish", port if publish?
|
||||
|
||||
Reference in New Issue
Block a user