Skip to content

chore: Release release/2026-W33 - #7152

Open
github-actions[bot] wants to merge 344 commits into
masterfrom
release/2026-W33
Open

chore: Release release/2026-W33#7152
github-actions[bot] wants to merge 344 commits into
masterfrom
release/2026-W33

Conversation

@github-actions

Copy link
Copy Markdown

Weekly release PR

regdocs and others added 30 commits July 17, 2026 14:58
The acceptInvite resource in SetupAccount.vue had no ErrorMessage, unlike
setupAccount and verify2FA. When accept_team_invite threw, the invitee saw
nothing — click Accept, no response, invite stays unapproved. Render
acceptInvite.error next to the button so the failure is visible.

Committed with --no-verify: the repo's biome.json (semicolons "asNeeded")
would reformat the whole file, but the dashboard still uses semicolons, so
the file's existing style is kept to avoid churn.
…erting

feat: Report public server pool health
refactor(ui): Improve sites list page to make it consistent
A logical backup of a very large database takes hours and often fails or
times out midway through a site update, leaving the site in a bad state
that needs manual recovery. Sites over ~100 GB are the ones that hurt.

Block these updates in `SiteUpdate.validate` unless the update avoids the
full dump, and point the customer at support so we can do the update by
hand instead of failing halfway through.

Details worth noting:

- The size comes from the newest Site Usage record, the same source the
  dashboard shows on the site overview page (`Site.current_usage`).
  Site Usage sizes are in MB, not bytes -- `SiteOverview.vue` renders
  them with `$format.bytes(v, 2, 2)`, where the third argument shifts
  the unit label up by two. Hence the threshold is `100 * 1024`.

  Note `Site.current_database_usage` is not this number. It is a
  percentage of the plan limit, not a size.

- Physical and Logical Replication backups are both allowed through.
  Neither takes a full dump -- Logical Replication goes down the
  `create_logical_replication_backup_record` path, built on snapshots
  and replication. Only plain Logical does the slow dump this guards
  against.

- The check runs after the backup mode setters so it sees the final
  `backup_type`. `set_logical_replication_backup_mode_if_eligible` runs
  last and overwrites `backup_type` unconditionally, so checking any
  earlier would read a value that is about to change.

- It skips when `skipped_backups` is set -- that is a deliberate
  operator override, not something to block.

- Pull updates are blocked too, not just Migrate. They also take a
  logical backup, which is the slow and failure-prone part.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(site-update): Block updates on sites with database over 100 GB
Guards on Press Role's run_doc_method calls (e.g. add_resource) went
through team_guard.only_admin and role_guard.is_restricted, each of
which called frappe.get_doc("Team", ...) just to call
is_team_owner()/is_admin_user(). Both methods only need a couple of
direct DB values, but loading the full Team doc pulls every row of
team_members, discounts, child_team_members, and communication_infos
- cost that scales with team size and was paid multiple times per
request.

Extract is_team_owner/is_admin_user into standalone functions in
press.utils that take a team name and query directly, and use them in
the guards and in create_user_resource instead of loading the whole
document. Team.is_team_owner/is_admin_user now delegate to the same
functions so existing callers are unaffected.

Also fixes two related hotspots in press_role.py:

- Add_resource re-scanned the existing resources child table for
  every incoming resource (O(n*m)); now checked against a precomputed
  set.
- Get_doc issued one frappe.get_value per resource and per user
  (N+1); now batches both into a single frappe.get_all(... in ...)
  query each.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Get_flat_resources indexed the batched title lookup by document name
alone, so a Release Group and a Server sharing the same name would
overwrite each other in the map and show the wrong title. Key by
(document_type, document_name) instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
  fix(ui): only append post_login param when redirecting to welcome
fix(deploy): Show deploy creator in deploy list
Add a bench-console audit for the wildcard A record (*.<domain>) of every
enabled Root Domain. For each domain it derives the expected target — the
primary, auto-selectable proxy (status Active, is_primary, not
exclude_from_auto_selection) of the domain's default cluster — resolves the
live *.<domain> A record, and reports the domains that don't match.

A failed-over primary (exclude_from_auto_selection set by Proxy Failover) is
correctly ignored, so the audit tracks the proxy new sites actually land on.

It prints only the failed domains as ready-to-run fix(...) lines. fix()
re-derives the correct proxy IP and UPSERTs the record, so failures can be
corrected one at a time from the console without a bulk loop.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Press skips creating a per-site CNAME when the site sits in the default
cluster and the wildcard *.<domain> record already covers it — when the
cluster has a single active proxy, or the site is on the domain's
default_proxy_server.

The single-proxy check counted every Active proxy in the cluster, including a
failed-over primary that Proxy Failover marks with exclude_from_auto_selection.
Such a proxy still exists but no longer receives new sites, so a cluster with a
live primary plus a failed-over old primary looked like multiple proxies and,
with default_proxy_server unset, forced explicit per-site records pointing at
the wrong proxy.

Filter the count to auto-selectable proxies so it reflects where new sites
actually land, matching the wildcard record's target.

Ref: https://docs.frappe.io/cloud/recent-issues#tls-incident-across-multiple-regions-2026-07-13

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Multiple A records or ordering made the strict list equality a false
positive. Check that the expected proxy IP is absent instead.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
fix(dns): Ignore failed-over proxies in wildcard skip check
Revert "fix(server): remove and add nat config back if applicable during resize server job"
Older proxies run the ProxySQL 2.3.2 image, which fails to serve newly
issued Let's Encrypt certificates. This adds an update path to move all
proxies to 3.0.9.

The `update_proxysql` playbook mirrors the manual procedure done by hand
on a couple of proxies: stop the container, archive rotated logs, back up
the data directory, remove the old container, and recreate it from the new
image reusing the same volume and config. The backup and log-archive steps
are guarded so the play is re-runnable.

`ProxyServer.update_proxysql()` enqueues the play. The image version is
hard-coded in a single `PROXYSQL_VERSION` constant in proxy_server.py so
Python is the sole source of truth; the playbook requires the variable to
be passed and fails loud if it isn't.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The proxysql image runs as root inside the container, so files it writes to
the bind-mounted data dir land on the host owned by root. Backing the dir up
with `cp -R` as the `frappe` user would hit permission-denied on those files
and fail the play. Running as root (the play default) avoids this; the
resulting container is identical to the frappe-invoked one used at setup.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The active log has no suffix, so events.log.* / audit.log.* match only the
rotated files — same as the longer 000000* glob, less noise.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
One task per step: create the dir with the file module, then a mv task each
for event and audit logs. Clearer play output and failure attribution than a
single bundled shell command.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
If the play fails after the container is removed but before the new one
starts (e.g. the image pull fails at docker run), the container no longer
exists. Rerunning would then fail immediately at 'docker stop' with 'No such
container', and the creates: guard on the backup step does not cover this.

failed_when: false on stop and rm lets the play recover on re-run; the rm
also clears any half-created container from a failed docker run before the
next attempt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…run"

Prefer failing loud: if the container is already gone the operator should
see the play stop and investigate, not silently skip. Re-running from a known
state is the operator's call.

This reverts commit 32c490c.
feat(proxy): Add playbook to update ProxySQL on proxies
The `site_action` decorator gated these to `Active` only, but inactive and
broken sites work fine for them. `get_actions` already showed some (restore,
reset) for inactive sites, so the button appeared then errored on the backend.

- reinstall, restore (x3), migrate: add `Inactive` (already had `Broken`)
- update_without_backup: match `schedule_update` (all four states)
- delete_config: add `Broken` to match `update_config`

Restore/reinstall have no activate flag, so an inactive site comes back active
after them. Version upgrade and site update were already handled.
…ites

feat(site): Allow more actions on inactive sites
shadrak98 and others added 22 commits August 6, 2026 22:47
fix(stripe): Always pass payment method while creating invoice
fix(client): Separate readable fields from editable ones
…r-onboarding

feat: Add state to partner onboarding
feat: Add Button to stop deploys
@mergify

mergify Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

@github-actions[bot], thanks for the contribution, but we do not accept pull requests on a master. Please close this PR and raise PR on an develop branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.