From dc0fbbf7aaceadf531fe5c31e9ab1f3aa6fd452c Mon Sep 17 00:00:00 2001 From: Grzegorz Date: Sun, 1 Nov 2026 03:03:06 +0100 Subject: [PATCH] fix(compose): default ODYSSEUS_TTS_CACHE_MAX_BYTES so compose stops warning (#6619) (#6645) The three shipped compose files forwarded the variable bare, so every `docker compose` command on a default .env printed "variable is not set". Default it to the 500 MiB that .env.example documents, like the other limits, and add a guard test that rejects any bare ${VAR} in compose files. Fixes #6619 Co-authored-by: Claude Opus 5.5 Co-authored-by: Alexandre Teixeira --- docker-compose.gpu-amd.yml | 2 +- docker-compose.gpu-nvidia.yml | 2 +- docker-compose.yml | 2 +- tests/test_compose_env_defaults.py | 28 ++++++++++++++++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 tests/test_compose_env_defaults.py diff --git a/docker-compose.gpu-amd.yml b/docker-compose.gpu-amd.yml index 841c69e9f..ae9a3336d 100644 --- a/docker-compose.gpu-amd.yml +++ b/docker-compose.gpu-amd.yml @@ -82,7 +82,7 @@ services: - ODYSSEUS_EDITOR_DRAFT_MAX_BYTES=${ODYSSEUS_EDITOR_DRAFT_MAX_BYTES:-268435456} - ODYSSEUS_STT_MAX_AUDIO_BYTES=${ODYSSEUS_STT_MAX_AUDIO_BYTES:-26214400} - ODYSSEUS_ICS_MAX_BYTES=${ODYSSEUS_ICS_MAX_BYTES:-10485760} - - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES} + - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES:-524288000} # Host workspace translation is opt-in. Keep the public compose file # user-neutral; configure these in a local .env or use the host-workspace # overlay with ODYSSEUS_HOST_WORKSPACE_DIR. diff --git a/docker-compose.gpu-nvidia.yml b/docker-compose.gpu-nvidia.yml index 287f0cfba..b9f5df506 100644 --- a/docker-compose.gpu-nvidia.yml +++ b/docker-compose.gpu-nvidia.yml @@ -81,7 +81,7 @@ services: - ODYSSEUS_EDITOR_DRAFT_MAX_BYTES=${ODYSSEUS_EDITOR_DRAFT_MAX_BYTES:-268435456} - ODYSSEUS_STT_MAX_AUDIO_BYTES=${ODYSSEUS_STT_MAX_AUDIO_BYTES:-26214400} - ODYSSEUS_ICS_MAX_BYTES=${ODYSSEUS_ICS_MAX_BYTES:-10485760} - - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES} + - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES:-524288000} # Host workspace translation is opt-in. Keep the public compose file # user-neutral; configure these in a local .env or use the host-workspace # overlay with ODYSSEUS_HOST_WORKSPACE_DIR. diff --git a/docker-compose.yml b/docker-compose.yml index 8f3d748e1..e04c5584a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -70,7 +70,7 @@ services: - ODYSSEUS_EDITOR_DRAFT_MAX_BYTES=${ODYSSEUS_EDITOR_DRAFT_MAX_BYTES:-268435456} - ODYSSEUS_STT_MAX_AUDIO_BYTES=${ODYSSEUS_STT_MAX_AUDIO_BYTES:-26214400} - ODYSSEUS_ICS_MAX_BYTES=${ODYSSEUS_ICS_MAX_BYTES:-10485760} - - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES} + - ODYSSEUS_TTS_CACHE_MAX_BYTES=${ODYSSEUS_TTS_CACHE_MAX_BYTES:-524288000} # Host workspace translation is opt-in. Keep the public compose file # user-neutral; configure these in a local .env or use the host-workspace # overlay with ODYSSEUS_HOST_WORKSPACE_DIR. diff --git a/tests/test_compose_env_defaults.py b/tests/test_compose_env_defaults.py new file mode 100644 index 000000000..0c6d3d572 --- /dev/null +++ b/tests/test_compose_env_defaults.py @@ -0,0 +1,28 @@ +"""Every variable a shipped compose file forwards must carry a default. + +A bare ``${VAR}`` makes ``docker compose`` print "variable is not set" on every +command for a default ``.env`` (#6619), which greets fresh installs with a +warning that looks like a misconfiguration. +""" + +import re +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +COMPOSE_FILES = sorted(ROOT.glob("docker-compose*.yml")) + sorted((ROOT / "docker").glob("*.yml")) + +# ${VAR} with no ``:-``/``-``/``:?``/``?`` modifier. +BARE_VAR = re.compile(r"\$\{([A-Za-z_][A-Za-z0-9_]*)\}") + + +@pytest.mark.parametrize("path", COMPOSE_FILES, ids=lambda p: p.relative_to(ROOT).as_posix()) +def test_compose_variables_have_defaults(path): + bare = [ + f"{path.name}:{lineno}: ${{{name}}}" + for lineno, line in enumerate(path.read_text(encoding="utf-8").splitlines(), 1) + if not line.lstrip().startswith("#") + for name in BARE_VAR.findall(line) + ] + assert not bare, "compose variables without a default:\n" + "\n".join(bare)