Cauldron's container can't resolve 'recipes.sulkta.com' from inside the sulkta+sulkta-db-net bridges (Lucy's split-horizon doesn't propagate to container DNS). Symptom: 500 on /connect-mealie POST when validating the pasted token. Fix: take the LAN-internal HTTP path direct to mealie. Mealie shares OpenVPN-rack2's netns, listening on 9000 inside that netns. Both cauldron and OpenVPN-rack2 are on sulkta-db-net (172.30.1.0/24), so cauldron talks to 'http://OpenVPN-rack2:9000' via Docker's internal DNS — bypasses Apache/HTTPS termination on Rackham entirely. The public URL stays in the UI (so the connect-mealie page deep-link to mint a token still goes to https://recipes.sulkta.com via the user's browser, which DOES resolve it). Also tightened Mealie._get/_put/_post to wrap requests.RequestException into MealieError so connection failures don't 500 callers.
67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Config:
|
|
secret_key: str
|
|
|
|
bind_host: str
|
|
bind_port: int
|
|
|
|
mealie_api_url: str # internal URL cauldron uses for HTTP calls (LAN-internal)
|
|
mealie_public_url: str # external URL shown to users for token-mint UI
|
|
mealie_api_token: str # system token (Cobb's "Cauldron" token, used for admin batch ops)
|
|
|
|
clawdforge_url: str
|
|
clawdforge_token: str
|
|
default_model: str
|
|
default_timeout_secs: int
|
|
|
|
admin_bearer: str
|
|
|
|
# OIDC (Authentik)
|
|
oidc_issuer: str
|
|
oidc_client_id: str
|
|
oidc_client_secret: str
|
|
oidc_redirect_uri: str
|
|
|
|
# DB (sulkta-mariadb)
|
|
db_host: str
|
|
db_port: int
|
|
db_name: str
|
|
db_user: str
|
|
db_password: str
|
|
|
|
# Per-user token at-rest crypto
|
|
fernet_key: str
|
|
|
|
|
|
def load() -> Config:
|
|
return Config(
|
|
secret_key=os.environ["SECRET_KEY"],
|
|
bind_host=os.environ.get("BIND_HOST", "0.0.0.0"),
|
|
bind_port=int(os.environ.get("BIND_PORT", "7790")),
|
|
mealie_api_url=os.environ.get(
|
|
"MEALIE_API_URL", os.environ["MEALIE_BASE_URL"]
|
|
).rstrip("/"),
|
|
mealie_public_url=os.environ.get(
|
|
"MEALIE_PUBLIC_URL", os.environ["MEALIE_BASE_URL"]
|
|
).rstrip("/"),
|
|
mealie_api_token=os.environ["MEALIE_API_TOKEN"],
|
|
clawdforge_url=os.environ["CLAWDFORGE_URL"].rstrip("/"),
|
|
clawdforge_token=os.environ["CLAWDFORGE_TOKEN"],
|
|
default_model=os.environ.get("DEFAULT_MODEL", "sonnet"),
|
|
default_timeout_secs=int(os.environ.get("DEFAULT_TIMEOUT_SECS", "120")),
|
|
admin_bearer=os.environ["ADMIN_BEARER"],
|
|
oidc_issuer=os.environ["OIDC_ISSUER"].rstrip("/") + "/",
|
|
oidc_client_id=os.environ["OIDC_CLIENT_ID"],
|
|
oidc_client_secret=os.environ["OIDC_CLIENT_SECRET"],
|
|
oidc_redirect_uri=os.environ["OIDC_REDIRECT_URI"],
|
|
db_host=os.environ["DB_HOST"],
|
|
db_port=int(os.environ.get("DB_PORT", "3306")),
|
|
db_name=os.environ["DB_NAME"],
|
|
db_user=os.environ["DB_USER"],
|
|
db_password=os.environ["DB_PASSWORD"],
|
|
fernet_key=os.environ["CAULDRON_FERNET_KEY"],
|
|
)
|