Upgrade notes
This page lists what you must change when you move to a newer identity-service release. Releases not listed here need no action beyond deploying the new image, which runs the database migrations on start. The full list of changes is in the changelog.
Upgrade to 0.9.0
Web and desktop session codes both require S256 PKCE. An http(s) POST /api/v1/oauth/session also requires Origin to match redirect_to. Shells that omitted code_challenge on /api/v1/authorize or code_verifier on the exchange need that change before this release (shellui 0.6.4 or later). See OAuth login.
With DEBUG=false, session and CSRF cookies use the __Host- prefix and the CSRF cookie is HttpOnly. Generate SECRET_KEY (at least 50 characters). JWT_ACCEPT_HS256_LEGACY=true does not start.
Instance roles are off unless you set SHELLUI_INSTANCE_ROLE. A standalone deployment needs no change. A region in production must set its own email service URL and must not keep email.shellui.com or admin.shellui.com in EMAIL_SERVICE_URL, ALLOWED_HOSTS, or CSRF_TRUSTED_ORIGINS. See Instance roles.
A region that the dashboard provisions sets PROVISIONING_PUBLIC_KEY (the dashboard's provisioning public key), PROVISIONING_ISSUER, and usually PROVISIONING_DEFAULT_REDIRECTS with the regional admin origin.
Upgrade to 0.8.2
0.8.2 accepts a registered scheme's -dev variant when DEBUG=true. Owners and staff can turn the same variant on per company when DEBUG=false.
- Apply migration
companies.0030_company_allow_desktop_dev_scheme. It addsallow_desktop_dev_scheme(default false). With the flag off andDEBUG=false,shellui-playgrounddoes not allowshellui-playground-dev. To accept that redirect, an owner or a staff member sets the flag, or you addshellui-playground-devtodesktop_redirect_schemes. A local identity-service withDEBUG=truestill accepts the variant without the flag. See Desktop apps.
Upgrade to 0.8.1
0.8.1 moves desktop sign-in schemes from each OAuth application onto the company.
- Set schemes on the company.
PATCH /api/v1/companies/{id}/with{"desktop_redirect_schemes":["shellui-playground"]}. An empty list turns desktop sign-in off for every method. Migrationcompanies.0029_company_desktop_redirect_schemescopies existing non-empty values onto that list (duplicates dropped) and removesCompanyOAuthClient.desktop_redirect_scheme. OAuth client and social app requests no longer accept that field. See Desktop apps.
Upgrade to 0.8.0
0.8.0 removes the login-events API and requires a registered scheme plus S256 PKCE for desktop sign-in. Web shells need no change.
- Stop calling
/api/v1/login-events.GET /api/v1/login-eventsandGET /api/v1/login-events/{id}are removed. UseGET /api/v1/events?event_type=identity.auth.login.succeeded,identity.auth.login.failed. See Event log. - Register a scheme before a desktop app signs in. 0.8.0 stored one
desktop_redirect_schemeon the OAuth application. 0.8.1 moved that allowlist to the company. Send S256 PKCE on every custom-scheme redirect. See Upgrade to 0.8.1 and Desktop apps. Migrationauthapi.0018_desktop_custom_scheme_redirectadds the PKCE challenge column.
identity.user.updated fires when a tracked profile field changes. Add a webhook rule if you want that event. See Webhooks.
Upgrade to 0.7.0
0.7.0 has two breaking changes: Redis becomes required in production, and magic link webhooks no longer carry the sign-in link. It also changes how staff accounts sign in and what the company metrics endpoint returns.
- Add Redis before you deploy. With
DEBUG=false, the container now exits at startup withoutREDIS_URL, also withSCHEDULER_ENABLED=false. See Shared cache (Redis). - Remove your external scheduler. The container now runs
retry_webhooksandpurge_expired_dataitself. Delete the Coolify Scheduled Tasks or cron entries, or setSCHEDULER_ENABLED=falseto keep them. See Scheduled jobs. - Stop delivering magic links from webhooks. The
identity.auth.magic_link.requestedpayload no longer containsmagic_link_url, and identity-service always sends the sign-in email itself. A workflow that mailed the link (for example in n8n) no longer works. See Magic link. - Give staff another sign-in method. Staff and superuser accounts can no longer sign in with a magic link, and their unused links stop working. Make sure every staff member can sign in with OAuth, OIDC, SAML, or a Django admin password. See Staff accounts.
- Point global dashboards at
/api/v1/metrics/all.GET /api/v1/metricsnow returns only the token company's series, also for staff. Process metrics, platform-wide user counts, and other companies' series are only on the global endpoint. See Metrics. - Change staff flags in Django admin.
PUT /api/v1/users/{id}returns 400admin_only_fieldwhen the body containsis_stafforis_superuser.
Account ID migrations
Migration 0014_migrate_oidc_social_account_keys rekeys OpenID Connect accounts on its own. Migration 0015_scope_self_hosted_gitlab_uids prefixes self-hosted GitLab account IDs with the GitLab base URL, so two GitLab hosts cannot share an ID. Accounts on https://gitlab.com keep their raw ID. The base URL comes from the account's social token when there is one, otherwise from the user's company when that company has exactly one GitLab app.
The migration stops and lists the social_account IDs it cannot place: a row that matches more than one GitLab host, already contains |, would exceed 191 characters, or collides with an existing ID. Bind each listed row to its app, then run the migrations again:
python manage.py scope_gitlab_social_uids
python manage.py scope_gitlab_social_uids --account-id 123 --social-app-id 45
The first command lists the rows that still need a choice. The second stores the binding for one row without changing its ID; the migration rewrites it on the next run.
Upgrade to 0.5.0
0.5.0 changes how the shell receives tokens after OAuth (session code delivery), and rotates refresh tokens. Migration 0010_refresh_rotation_oauth_session_code adds both.
Session code delivery. After sign-in, identity-service now redirects with a one-time shellui_auth_code instead of tokens in the URL fragment:
- Update shells to read
shellui_auth_codefrom the login callback query string and callPOST /api/v1/oauth/sessionwith{"auth_code": "…", "redirect_to": "<same callback URL>"}. - Since 0.9.0,
token_delivery=fragmentandOAUTH_TOKEN_DELIVERY=fragmentare ignored and fall back to the one-time code with PKCE.
Refresh rotation. Every refresh now returns a new refresh token and revokes the old one:
- Store the new refresh token after each refresh, and stop using the old one
- Logout revokes the refresh session, so discard both tokens on the client
- Refresh tokens issued before the upgrade stop working, and users sign in again once
Upgrade to 0.4.1
0.4.1 adds hosting preview sync to the redirect allowlist, and makes API CORS permissive by default:
- Deploy so migration
0014_companyoauthredirect_sourceruns. It addssourceonCompanyOAuthRedirect, and existing rows becomemanual. - Keep
CORS_ALLOW_ALL_ORIGINS=trueunless you restrict API origins on purpose. Do not list hosting preview origins inCORS_ALLOWED_ORIGINS. - Make sure hosting-service can call
PUTandDELETEon/api/v1/hosting-oauth-redirectswith the caller's identity JWT, so preview origins stay on the allowlist. Since 0.5.0, that caller must be staff or a company owner.
Upgrade to 0.4.0
0.4.0 moves the OAuth callback from the shell to identity-service. If your provider apps still call back to {shell}/login/callback:
- Change each provider app callback to
https://auth.example.com/api/v1/oauth/callback. - Add every production shell origin to the company redirect allowlist, see OAuth login.
- Deploy so migration
0013_companyoauthredirectruns. - Use a Shellui admin build that shows the identity callback URL in OAuth setup.