SERVICE_FQDN_* gets regenerated with a random hash on each Coolify save,
making custom domains impossible to persist. Introduce APP_URL as a single
user-controlled variable (never auto-generated) for all app URLs. Derive
VITE_BACKEND_WS_URL automatically from VITE_BASE_URL in aio_run.mjs so
only APP_URL needs to be set. SERVICE_FQDN_HOPPSCOTCH_80 is kept solely
for Coolify proxy routing.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
COOLIFY_URL/COOLIFY_FQDN were custom variables requiring manual setup,
causing VITE_BACKEND_WS_URL to resolve to wss://backend/graphql (broken).
SERVICE_FQDN_HOPPSCOTCH_80 triggers Coolify auto-generation of an editable
domain, and SERVICE_URL_HOPPSCOTCH provides the scheme-less form needed for
the wss:// WebSocket URL.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>