gunicorn runs frappe.app with /assets and /files served in process, two
gthread workers as frappe_docker runs it. The Werkzeug debugger and
reloader are no longer in the request path. Frappe resolves the site from
the Host header.
Co-authored-by: Hanzo Dev <[email protected]>
The desk SPA's titles, marks and install icons come from this repo's own
source, so they change here: the shell title and apple title, the PWA
manifest name, the sidebar and welcome-ticket copy, the fallback logo
component, the SPA favicon and the 180/192/512 install icons.
The login page, navbar, footer and favicon are rendered by the Frappe core,
which reads those marks from Website Settings / Navbar Settings / System
Settings at run time. helpdesk/brand.py writes them and the entrypoint runs
it per site on every boot, next to the SSO setup. Each field is set to a
constant and guarded on the field existing, so a boot against a site that
already exists restores the same values instead of failing.
The marks are served from this app's own public directory
(helpdesk/public -> /assets/helpdesk), so no page reaches a third-party host
for a logo.
- custom_base_url=1 so Frappe prepends https://hanzo.id to authorize/token/
userinfo (relative paths were resolving to the Frappe host, breaking OAuth).
- login_with_email_link=0 removes the native passwordless path; IAM SSO is the
ONLY login. CR mirror -> 1.26.6.
- Social Login Key (Custom) requires a Redirect URL; derive it per-site from
frappe.utils.get_url so each org's site gets its correct callback host.
- Run _harden_login in a finally block so disabling native signup applies even
if social-login provisioning fails. CR tag 1.26.4.