{{ message }}
Repository navigation
chore: prepare 2.3.0 release - #13857
Merged
Merged
Conversation
Contributor
✨ Benchmark resultsComparing
Per-scenario breakdown & investigation detailsMetrics below reflect the current branch (after). Δ P95 compares against the base.
Top API waits (after) |
(cherry picked from commit 64710f7)
…jects (cherry picked from commit f533e88)
8 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Appwrite 2.3 removes dev keys, builds every console link from one
_APP_CONSOLE_URL, reports execution duration the way the caller experienced it, adds Jaspr to Sites and a nightly channel for self-hosting, and folds in two weeks of fixes across auth, databases, functions, messaging, storage and the installer. It ships with the 1.1.159 self-hosted Console (was 1.1.96). Upgrading from 2.2.0 is a single command and a migration that touches every project'susersandidentitiescollections.Highlights
X-Appwrite-Dev-Keyheader anddevKeyquery parameter, thedevKeys.read/devKeys.writescopes and thedevKeyscollection are removed;migratedrops the collection and strips the scopes from API keys, functions and sites. Until you run it, the API keeps serving. (chore: remove dev keys #13696, fix: keep pre-2.3.0 installs readable after the dev keys removal #13800)_APP_CONSOLE_URLis the origin every console link is built from: OAuth2 success and failure defaults, magic URL, build and webhook-failure emails, VCS comments and commit statuses, and VCS installation callbacks, which now land on/projects/:projectId/settings. Leave it empty to use_APP_CONSOLE_DOMAIN(or_APP_DOMAIN) as before; set it when the console runs on a different host from the API._APP_CONSOLE_URL_SCHEMEand the legacy/console/...link shapes are gone, and/invite,/login,/recoverand/registerredirect to the matching console pages again. (fix(console): link the new console everywhere and drop the legacy /console scheme #13689)durationon an execution is now the time the caller waited, however it was triggered. Executions created through the API or run asynchronously used to report only the time after the runtime was warm, so a cold start that took 6 seconds could show as 311ms in the Console. Expect higher numbers for cold-started executions and in compute usage. (feat(functions): report execution duration as wall clock in every path #13754)POST /v1/account/sessions/id-tokenstores the verified ID token on the identity asproviderIdToken(encrypted at rest, refreshed on every sign-in), so clients can read claims Appwrite does not model, such as Google'slocale. The Console shows it on the user's identities. Theproviderparameter now only accepts providers that support ID tokens (Apple and Google) and gets its ownIdTokenProviderenum in the SDKs. (feat(account): store the ID token on the identity #13698, fix(account): offer only ID token providers on the ID token session #13759)jaspr buildon the Flutter 3.44 runtime. Pick it by hand for now; repository detection does not suggest it yet. (feat: add Jaspr SSR framework support #13710, chore: upgrade utopia-php/detector to 0.2.8 #13773, appwrite/vibes#407)installandupgradetake--channel nightly, or set_APP_VERSION=X.Y-nightly, to follow the newest CI-green commit on the active release branch, rebuilt daily. Nightly is unsupported and stays within one patch line; stable remains the default. (feat(releases): a nightly channel for self-hosting #13659)Fixes
Console
/auth/previewpage that exists, instead of the console's 404. (appwrite/vibes#366, chore: bump self-hosted console to 1.1.101 #13714, fixes Site preview domains 404: API redirects to /auth/preview, a route the bundled Console does not implement (2.2.0 self-hosted) #13713)Auth and users
POST /v1/account/tokens/email,/tokens/magic-urland/tokens/phonereturn409 user_already_existswhen the givenuserIdbelongs to another user, instead of a 500. (fix: return 409 when a token request reuses an existing user ID #13790)PATCH /v1/account/sessions/:sessionIdalso refreshes the identity's photo, so providers with expiring avatar URLs stay current. (added support for updating user Oauth2 avatars via updateSession method #13671)membershipIdand leave a team. (fix(teams): exempt a member's own membership from the privacy policy #13786, fixes Standard users are not sent userId when listing memberships #13767)Databases and TablesDB
failedand returns 401, instead of staying incommitting. (Transaction exception catch #13703)PATCH /v1/tablesdb/:databaseId/tables/:tableId/columns/relationship/:key, like every other column type; the oldcolumns/:key/relationshippath keeps working. (fix(tablesdb): move relationship column update to columns/relationship/:key #13822, fixes 🐛 Bug Report: Update Relationship endpoint is inconsistent #9022)Functions and Sites
readyonly after the function points at it, so executing right after seeingreadyno longer returns 404. (fix(functions): publish a deployment as ready only once it is executable #13741)APPWRITE_VCS_ROOT_DIRECTORYis set for push and redeploy builds. (fix(deployments): preserve VCS source roots #13574, fixes 🐛 Bug Report: Redeploy always fails for monorepo functions — duplicate reads providerRootDirectory from the deployment, where nothing ever sets it #13587)processing, not a broken image. (fix(vcs): use the mapped status when picking the comment image extension #13771)_APP_VCS_GITHUB_PRIVATE_KEYaccepts a PEM, a base64-encoded PEM or a PEM with escaped newlines; a top-level root directory named0is cloned correctly. (chore(deps): require utopia-php/vcs 5.4 #13695, chore(deps): require utopia-php/database ^7.3.11 and utopia-php/vcs 5.5 #13738)Messaging
Toheader; messages with several recipients still send everyone as BCC. (fix(messaging): keep a single SMTP recipient in the To header #13534, fixes Emails sent through custom SMTP provider are missing the "To" header #12365, BCC in email #10474)Doe, Johnare quoted so the mail is delivered. (fix(messaging): skip mail input no provider can deliver instead of retrying #13831)PUT /v1/account/targets/:targetId/pushreturns409 user_target_already_existswhen the identifier is taken, instead of a 500. (fix: return 409 when a push target update reuses an existing identifier #13789)Storage
encryptionandcompression, fixing SDKs that crashed on a missing field. (fix(storage): add missing encryption/compression properties to File model with validated defaults #12405, fixes File encryption property is missing #11647).jar,.aar,.kmz,.3mf,.usdz,.xpi,.msix,.ttfand.otf. Files uploaded before keep their stored type. (fix(storage): keep the real format for files sniffed as their container #13825, fixes 🐛 Bug Report: APK files downloads in zip files #9418)HeadObjectthrough the S3-compatible API works with boto3 and the AWS CLI when a proxy rewrites HEAD to GET. (fix(s3): HeadObject 403 when proxies rewrite HEAD to GET #13744)Domains and certificates
API and GraphQL
nullfornameon account create,scheduleon function create orpathon execution create applies the default instead of returning a 500. (fix: accept explicit null for optional string params instead of a 500 #13707)PATCH /v1/presences/:presenceIdreturns404 presence_not_foundwhen the presence is deleted or expires mid-update, instead of a 500. (fix: return 404 when a presence disappears during update #13792)Installer and workers
migraterestores the five email metadata attributes onuserswhen an earlier V23 step failed, which made every user write fail withUnknown attribute: "emailCanonical". (fix(migration): repair missing email metadata attributes in V25 #13820, fixes URGENT! Missing required attribute "emailCanonical" After update to 1.9.0 #11906)installandupgradetake--domainto set_APP_DOMAINand_APP_DOMAIN_TARGETin headless installs. The CLI installer now sends the same anonymous install report as the web installer, including--no-startand loopback installs; setDO_NOT_TRACK=1to opt out. (feat(installer): report CLI and no-start installs #13844)Under the hood
coroutines;_APP_WORKER_MAX_COROUTINESstill works. (chore(queue): move to utopia-php/queue 3.0 #13762, Upgrade queue to 4 #13809, Upgrade queue to 5 and migrate worker configuration #13814)stats-resourcesspreads project counts across the interval instead of queuing every project at once. (feat(stats-resources): spread project counts across the interval with the scheduler #13669)executionscollection; executions have been ClickHouse only since 2.2. (fix(executions): stop creating MySQL collection #13699)agents,bus,lock,psr7,telemetry,compression,system,smtpandpoolsnow live inpackages/and load directly; no version changes. The agents client no longer leaks a connection per call. (rfc: absorb the Utopia libraries, tooling and the first package #13700, refactor: move Bus to packages/bus #13715, chore: absorb lock into packages/lock #13718, chore: absorb psr7 into packages/psr7 #13723, chore: absorb telemetry into packages/telemetry #13731, chore: absorb compression into packages/compression #13798, chore: absorb system into packages/system #13804, chore: absorb smtp into packages/smtp #13829, chore: absorb pools into packages/pools #13845, fix(agents): send requests through a reused utopia-php/client #13794)x-appwrite.idGeneratorremoved, aliasdescrenamed tosummary, theProjectPathsecurity scheme replaced byx-appwrite.config. (refactor(specs): drop the x-appwrite.idGenerator extension #13742, refactor(specs): name the alias summary "summary" #13745, refactor(specs): state the project path binding as x-appwrite.config #13757)MODEL_BACKEND=focalnet, base imageappwrite/base2.0.5 → 2.1.0 (adds igbinary), utopia-php/database 7.3.11, vcs 5.5, messaging 2.5, user-agent 0.1.2, detector 0.2.8, cdn 0.0.12, schedule 0.3. (Update orchestrator to 2.2.2 #13720, chore: bump Autogravity image to 0.0.11 #13753, feat: store Redis cache payloads with the igbinary codec #13732, chore(deps): require utopia-php/database ^7.3.11 and utopia-php/vcs 5.5 #13738, feat(mails): pass custom headers through the mail queue #13851, chore(deps): bump utopia-php/user-agent to 0.1.2 #13739, chore: upgrade utopia-php/detector to 0.2.8 #13773, chore(deps): bump utopia-php/cdn to 0.0.12 #13760, feat(schedule): name the schedule a reconcile failure belongs to #13746)Removed
X-Appwrite-Dev-Keyheader anddevKeyparameter, thedevKeys.read/devKeys.writescopes, theDevKeymodel and thedevKeyscollection. (chore: remove dev keys #13696)_APP_CONSOLE_URL_SCHEMEand the legacy/console/project-{region}-{id}/...link shapes. Use_APP_CONSOLE_URL. (fix(console): link the new console everywhere and drop the legacy /console scheme #13689)/cardweb redirect; the new console has no matching page. (fix(console): link the new console everywhere and drop the legacy /console scheme #13689)Install
docker run -it --rm \ --volume /var/run/docker.sock:/var/run/docker.sock \ --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ --entrypoint="install" \ appwrite/appwrite:2.3.0Upgrade
Upgrading from 2.2.0 uses the same command with
--entrypoint="upgrade", then run the migration:The migration drops the
devKeyscollection and project attribute from the console database, removes the dev key scopes from API keys, functions and sites, and in every project addsproviderIdTokentoidentitiesand apasswordPwnedattribute and index tousers, restoring any missing email metadata attributes on the way. Its run time grows with the number of projects. The upgraded compose file adds anappwrite-mqttcontainer and has Traefik publish ports 8883 and 8084; set_APP_MQTT_PORTand_APP_MQTT_WSS_PORTin.envif those are taken. Remove_APP_CONSOLE_URL_SCHEMEfrom your.env, and set_APP_CONSOLE_URLif your console is served from a different host than the API. To roll back to 2.2.0, stop the workers and let queued jobs drain first, since the older queue client can't recover jobs the new one has reserved. Back up your data first.Contributors
Thank you to everyone who contributed to 2.3.0:
@HarshMN2345 @ChiragAgg5k @Meldiron @levivannoort @loks0n @TorstenDittmann @ArnabChatterjee20k @imtia33 @jaysomani @deepshekhardas @abnegate @lohanidamodar
Left out of the notes
These are in 2.3.0 but have no screen in the 1.1.159 self-hosted console, or only matter on Cloud, so the notes above leave them out:
_APP_PWNED_PASSWORDS_DSNand the userpasswordPwnedflag (feat(policies): add password pwned project policy #13702, feat: send the SHA-1 hash to the Appwrite Pwned service #13805, Fix password pwned policy so enabled records and users/sessions block #13818). The migration still adds the attribute and index.POST/PUT /v1/account/verifications/email/otp(Add OTP support for email verification and password recovery #13677).POST/PUT /v1/account/recovery/otpand theotpRecoverytemplate (added OTP support for password recovery endpoints #13781).appwritePushLedgeris absent #13772, Update appwrite push ledger name #13815, Update appwrite push ledger name #13848). The Upgrade section still mentions the newappwrite-mqttcontainer and ports.replyToEmail/replyToNameon email messages (Feat add reply params messaging #13785).Also in this PR
app/config/variables.php:introductionfor_APP_CONSOLE_URLwas2.2.1(no such release) and for_APP_PWNED_PASSWORDS_DSNwasTBD; both are now2.3.0._APP_GEO_ENDPOINT,_APP_GEO_SECRETand_APP_MAINTENANCE_RETENTION_SCHEDULESsaidTBDbut shipped in 2.0.0.app/config/variables.php: new MQTT category defining_APP_MQTT_PORT,_APP_MQTT_WSS_PORT,_APP_MQTT_REPLAY_DEPTHand_APP_MQTT_MAX_PACKET_SIZE(introduced 2.3.0), so the installer writes them and the docs list them. The Upgrade notes refer to the two port overrides._APP_MQTT_WS_PORTstays internal because Traefik routes to 8083.docker-compose.yml: removed_APP_LOGGING_CONFIG_REALTIMEand_APP_POOL_ADAPTER=swoolefromappwrite-mqtt; nothing reads them.