From ca2a555d7cdeb3f77386c3c62c9aab3b2d7df303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 13 Oct 2026 06:41:16 +0500 Subject: [PATCH] fix(docker): request restart when remote client protocol changes --- changelog.d/20261013-docker-remote-client-restart.md | 7 +++++++ crates/coa-core/src/docker/sharing.rs | 12 +++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 changelog.d/20261013-docker-remote-client-restart.md diff --git a/changelog.d/20261013-docker-remote-client-restart.md b/changelog.d/20261013-docker-remote-client-restart.md new file mode 100644 index 0000000..01bafc6 --- /dev/null +++ b/changelog.d/20261013-docker-remote-client-restart.md @@ -0,0 +1,7 @@ +--- +area: manager +type: fixed +audience: admins +title: Docker friend mode requests a restart when remote client support changes +--- +Enabling remote CoA clients now requests a world restart even when the game ports were already open. Repeating the same unchanged setting does not request another restart. diff --git a/crates/coa-core/src/docker/sharing.rs b/crates/coa-core/src/docker/sharing.rs index b233d4d..1c0d120 100644 --- a/crates/coa-core/src/docker/sharing.rs +++ b/crates/coa-core/src/docker/sharing.rs @@ -59,10 +59,11 @@ pub fn set_open(root: &Path, meta: &Path, open: bool) -> Result { if changed { fsx::atomic_write_json(&root.join(MARKER), &cfg)?; } + let remote_changed = coa_edit.is_some(); if let Some(text) = coa_edit { fsx::atomic_write(&coa_conf, text.as_bytes())?; } - Ok(changed) + Ok(changed || remote_changed) } /// What each service can be reached from, computed from how the containers publish their ports: the database is never published, @@ -110,6 +111,15 @@ mod tests { assert_eq!(Config::load(&root).unwrap().bind_address, "127.0.0.1"); } + #[test] + fn enabling_remote_client_protocol_requires_restart_even_when_ports_are_open() { + let (_d, root, meta) = server(Some("0.0.0.0")); + fs::write(root.join("Core/configs/modules/coa.conf"), "CoA.Enable = 1\nCoA.AllowRemoteClients = 0\n").unwrap(); + assert!(set_open(&root, &meta, true).unwrap()); + assert_eq!(Config::load(&root).unwrap().bind_address, "0.0.0.0"); + assert!(!set_open(&root, &meta, true).unwrap()); + } + #[test] fn an_address_chosen_by_hand_is_kept_when_opening_and_other_settings_survive() { let (_d, root, meta) = server(Some("192.168.1.20"));