Skip to content

feat!: Appwrite 2.5.0, built-in object storage, Functions and Sites on by default - #21

Merged
levivannoort merged 4 commits into
mainfrom
feat/compute-by-default
Oct 14, 2026
Merged

levivannoort merged 4 commits into
mainfrom
feat/compute-by-default

Conversation

@levivannoort

Copy link
Copy Markdown
Member

What

Three commits, for chart 2.0.0 (release in a separate pull request):

1. Appwrite 2.5.0 (13ed1d8)

  • appVersion 2.5.0, and the images its docker-compose.yml uses: console 1.2.74-self-hosted, executor 1.1.2, browser 0.3.6, geo 0.3.2.
  • files/env-defaults.yaml regenerated. New: _APP_TRUSTED_PROXIES, _APP_ALLOWED_INTERNAL_ADDRESSES, _APP_DNS_EXTERNAL. node-22 joins the default runtimes.
  • make env-defaults crashed on 2.5.0, whose variables.php uses Appwrite\Network\TrustedProxies::DEFAULT for a default. The generator now loads such classes from the same Appwrite version, PSR-4 style. The Makefile only replaces the file on success: before, PHP's error text ended up in env-defaults.yaml. The upstream-drift workflow would have hit the same crash.
  • The assistant is removed (Appwrite removed it in 2.4.0). Setting assistant.* fails with that message, through _deprecations.tpl and a schema stub that hack/schema-postprocess.py now generates for deprecated keys.
  • Browser ALLOWED_HOSTS is set to the API Service's host. Browser 0.3.5+ refuses private addresses unless listed, which broke site screenshots.
  • The console no longer gets VITE_GROWTH_ENDPOINT, matching compose.
  • ClickHouse follows upstream 2.4.0: the per-second metric, trace and text logs are removed rather than sampled, and an init script gives tables left behind by config changes a TTL.
  • Docs: trusted proxies, requests to private addresses, the external DNS resolver under egress policies, and the now-required GitHub webhook secret. Every "Appwrite 2.3.0" claim was checked against the 2.5.0 source (Redis TLS, MongoDB SRV, Sentry-only, no metrics, antivirus) before being updated.
  • Data migration: 2.3.0 → 2.5.0 is still one step (all use V25).

2. Built-in SeaweedFS object storage (24d5e2c)

  • New mode: storage.s3.mode: builtin | external, like the other datastores. External settings move to storage.s3.external.endpoint and .region. The old keys fail with where they went.
  • The StatefulSet: a single-replica weed server with master, volume server and filer on loopback. It serves only S3 on 8333, runs as UID 1000 on a read-only root, and keeps data on a 20Gi PVC.
    • The S3 users file is written from the chart Secret on start. The keys are generated once, like the other built-in credentials.
    • A postStart hook creates the bucket before the pod is ready; "already exists" is fine.
    • Tested in Docker first: non-root with a read-only root, bucket creation is idempotent, signed PUT/GET round-trips (3 MB byte-identical), anonymous and wrong-key requests get 403, data survives restart.
  • Wiring: Appwrite, the orchestrator and the executor get the endpoint through one helper (appwrite.s3). The executor reaches <fullname>-seaweedfs.<ns>.svc from inside DinD through the pod's resolver.
  • Policies: the build and executor policies allow the store by pod selector. With networkPolicy.enabled, a new object-storage policy admits only Appwrite pods, the orchestrator, build pods and the executor.

3. Functions and Sites on by default (6c2262b)

  • New defaults: storage.device: s3, compute.enabled: true, compute.executor.privileged: true. A plain install builds and runs functions and sites.
    • Clusters that forbid privileged pods set compute.enabled=false. The NOTES and the validation message say so.
    • Without compute, creating a function or site fails with Could not resolve host: orchestrator (a 500, then a 409 on retry). That's now documented in troubleshooting.
  • Examples: those that read S3 keys from your own Secrets (production, external-services, aws, gcp), or keep files on Azure Files, turn compute off explicitly. The two functions overlays turn it back on.
  • CI:
    • Every install scenario now runs compute and the built-in store.
    • The upgrade scenario installs the published chart 1.0.0 and upgrades it with default values. That's the real 1.0.0 → 2.0.0 path: chart upgrade plus the 2.3 → 2.5 data migration.
    • The nightly uses the built-in store, so hack/compute-plane.sh is gone.
  • Docs and changelog: getting started, executor, storage, production checklist, migrating from Docker (keep local explicitly), and the READMEs. CHANGELOG entries are under [Unreleased].

Breaking (hence 2.0.0): the new defaults, the moved S3 keys, and the removed assistant. Upgrade notes go in the release PR.

Testing

  • make test passes locally: 245/245 unit tests (10 new for object storage), ct lint, helm lint --strict on every scenario, kubeconform on 1.29–1.37, all 16 example combinations, generated files, changelog. actionlint and shellcheck are clean.
  • make env-defaults APP_VERSION=2.5.0 regenerates cleanly.
  • The kind installs and the nightly run in CI on gcrunner; see the checks.

- appVersion 2.5.0, with the images its docker-compose.yml uses: console
  1.2.74-self-hosted, executor 1.1.2, browser 0.3.6, geo 0.3.2.
- files/env-defaults.yaml regenerated: _APP_TRUSTED_PROXIES,
  _APP_ALLOWED_INTERNAL_ADDRESSES and _APP_DNS_EXTERNAL are new, and
  node-22 joins the default function runtimes. make env-defaults crashed on
  2.5.0, whose variables.php uses an Appwrite class for a default; the
  generator now loads such classes from the same Appwrite version, and the
  Makefile only replaces the file when generation succeeds.
- The assistant is gone: Appwrite removed it in 2.4.0. Setting assistant.*
  fails with that message (templates/_deprecations.tpl), through a schema
  stub that hack/schema-postprocess.py now adds for deprecated keys.
- The browser gets ALLOWED_HOSTS with the API Service's host: browser 0.3.5
  and later refuse private addresses, which broke site screenshots.
- The console no longer gets VITE_GROWTH_ENDPOINT, as in compose.
- ClickHouse follows Appwrite 2.4.0: the per-second metric, trace and text
  logs are removed rather than sampled, and an init script gives tables
  left behind by a config change a TTL.
- Docs: trusted proxies, requests to private addresses, the external DNS
  resolver under egress policies, the now-required GitHub webhook secret,
  and 2.5.0 wherever a version is named (claims checked against 2.5.0).
- CI upgrades from 2.3.0, the Appwrite of chart 1.0.0.
storage.s3.mode picks where the bucket lives: builtin (the default) runs
SeaweedFS, an Apache-2.0 S3-compatible store, in the release; external uses
storage.s3.external.endpoint and .region, which move there from
storage.s3.endpoint and .region (setting the old keys fails with where they
went).

The built-in store is a single-replica StatefulSet like the other built-in
datastores: one `weed server` process with master, volume server and filer
on loopback, serving only S3 on port 8333, as UID 1000 on a read-only root.
Its users file is written from the chart's Secret on start, where the access
keys are generated once like the other built-in credentials, and a postStart
hook creates the bucket before the pod is ready. It only runs with
storage.device s3.

Appwrite, the orchestrator and the executor get its in-cluster endpoint
through one helper (appwrite.s3); the build and executor policies allow it
by pod selector, and with networkPolicy.enabled the object-storage policy
lets only Appwrite pods, the orchestrator, build pods and the executor in.
Renovate keeps SeaweedFS on its major version, as for the other datastores.
storage.device defaults to s3 on the built-in object storage, and
compute.enabled and compute.executor.privileged default to true: a plain
install builds and runs functions and sites, with the executor as a
privileged pod in a namespace of its own. Clusters that forbid privileged
pods set compute.enabled=false; the validation message and NOTES say so, and
NOTES list SeaweedFS among the single-replica built-ins.

- Examples that read S3 keys from your own Secrets (production,
  external-services, aws, gcp) or keep files on Azure Files turn compute off;
  functions.yaml and functions-existing-secrets.yaml turn it back on with
  executor nodes and Secrets of its own.
- CI: every install scenario now runs compute and the built-in store; the
  upgrade scenario installs the published chart 1.0.0 and upgrades it with
  default values; the nightly installs full-values.yaml alone, so
  hack/compute-plane.sh and its SeaweedFS container are gone.
- Docs: getting started, executor, storage, production checklist,
  troubleshooting (deployments fail with an internal error while compute is
  off), migrating from Docker (keep local storage explicitly), READMEs; the
  stale "before the first release" notes are gone.
- CHANGELOG entries for the branch under [Unreleased].
@hansi-codes

hansi-codes Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

🟢 Tier S · Ready to merge

This PR updates the chart to Appwrite 2.5.0, removes the assistant, and adds built-in SeaweedFS object storage with revised defaults for Functions and Sites. It also updates storage and compute networking, ClickHouse configuration, generated environment defaults, and the migration and upgrade paths. Documentation, examples, CI scenarios, and tests are refreshed for the new chart behavior.

Latest changes: The latest commit extends the StatefulSet-name length validation to built-in SeaweedFS and adds a test for the case where it is the only built-in store.

Verdict New comments Fixed Still open
✅ Approved 0 1 0
📂 Walkthrough · 13
File Change
.github/workflows/e2e-nightly.yaml, .github/workflows/test-install.yaml Run nightly and upgrade scenarios with the built-in store and update the upgrade source.
.gitignore, Makefile, hack/gen-env-defaults.php, hack/schema-postprocess.py Make environment-default generation failure-safe, load upstream default classes, and retain deprecation schema stubs.
CHANGELOG.md, CONTRIBUTING.md, README.md Document the new defaults, breaking settings, and updated install workflow.
charts/appwrite/Chart.yaml, charts/appwrite/values.yaml, charts/appwrite/values.schema.json, charts/appwrite/README.md, charts/appwrite/README.md.gotmpl Update Appwrite and image versions, configure SeaweedFS and compute defaults, and regenerate chart docs and schema.
charts/appwrite/ci/*.yaml, charts/appwrite/tests/*.yaml Update install scenarios and tests for storage modes, compute defaults, assistant removal, migration, and SeaweedFS name validation.
charts/appwrite/files/clickhouse/*, charts/appwrite/templates/clickhouse/* Remove selected ClickHouse logs and apply TTLs to tables left behind by configuration changes.
charts/appwrite/files/env-defaults.yaml, charts/appwrite/templates/_env.tpl, charts/appwrite/templates/_deprecations.tpl, charts/appwrite/templates/_secrets.tpl, charts/appwrite/templates/_validate.tpl, charts/appwrite/templates/_datastores.tpl Update environment handling, S3 settings and credentials, deprecation validation, and StatefulSet name validation.
charts/appwrite/templates/_datastore.tpl, charts/appwrite/templates/NOTES.txt, charts/appwrite/templates/browser/deployment.yaml Support datastore lifecycle hooks, report compute and storage setup, and allow the browser to reach the API service.
charts/appwrite/templates/seaweedfs/*, charts/appwrite/templates/networkpolicy/object-storage.yaml Deploy the built-in SeaweedFS store and restrict access to its S3 service.
charts/appwrite/templates/builds/networkpolicy.yaml, charts/appwrite/templates/executor/networkpolicy.yaml, charts/appwrite/templates/networkpolicy/internal.yaml, charts/appwrite/templates/orchestrator/deployment.yaml, charts/appwrite/templates/executor/deployment.yaml Wire built-in S3 connectivity into the compute plane and update related policies and executor settings.
charts/appwrite/templates/assistant/*, hack/compute-plane.sh, hack/fixtures/compute/s3.json Remove the assistant templates and the external compute-plane test helper.
docs/*.md Update guides for Appwrite 2.5.0, object storage, compute defaults, networking, security, and upgrades.
examples/*.yaml, renovate.json Refresh example configurations for the new storage and compute defaults and adjust Renovate configuration.
✅ Fixed since the last review · 1
  • Validate the SeaweedFS StatefulSet name length · charts/appwrite/templates/seaweedfs/statefulset.yaml:28

Reviewed the commits since 6c2262b · Details · Comment @hansi-codes review to re-run, or mention @hansi-codes with a question.

@hansi-codes hansi-codes Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Tier A · See the inline comments. Summary

Comment thread charts/appwrite/templates/seaweedfs/statefulset.yaml
@levivannoort levivannoort mentioned this pull request Oct 14, 2026
4 tasks done
The 52-character limit, which the pods' controller-revision-hash label
needs, was only checked for the built-in PostgreSQL, Redis and ClickHouse.
With those external and a long release name, the built-in object store could
render a name its pods can't hold.

@hansi-codes hansi-codes Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Tier S · Looks good to merge. Summary

@levivannoort
levivannoort merged commit 2df29f8 into main Oct 14, 2026
23 checks passed
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.

1 participant