C8: Add a comment block above the connection pool definitions warning
that the `redis` scheme on the `database` and `logs` pools is for the
test matrix only — operators who set `_APP_DB_ADAPTER=redis` in
production will lose data on cache eviction or process restart.
Redis stays OFF the `documentsdb` and `vectorsdb` pools, which have
stricter durability and indexing requirements that the in-memory
Utopia Redis adapter does not provide.
M12: Restore the matrix-generator logic that picks the per-PR matrix
based on whether `composer.lock` changed `utopia-php/database`. PRs
that bump the database package run the full Mariadb+Postgres+Mongo+
Redis matrix in both dedicated and shared modes; everything else
runs the SQLite+Redis short matrix in shared mode. The previous
"TEMP — revert before merge" early `return` short-circuited that
logic and forced every PR through the short matrix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wires the new Redis database adapter through the Appwrite stack:
- registers.php: add 'redis' to schemes for console/database/logs pools,
add an explicit redis resource arm honouring the optional db segment,
and dispatch to Utopia\Database\Adapter\Redis in the database match
- composer.json: switch utopia-php/database constraint to
dev-feat-redis-adapter to pick up the new adapter (lockfile bump
follows after the database PR is pushed to origin)
- docker-compose.yml: add a dedicated redis-mirror service with
noeviction policy and AOF persistence so the database backend stays
isolated from the cache instance
- ci.yml: add Redis to default and full database matrices and export
the matching env vars (_APP_DB_HOST=redis-mirror, port 6379)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
SQLite serialises writes through a single file lock. Running services
like Databases and TablesDB with paratest_processes=3 produces SQLITE_BUSY
storms — 97 lock errors in Databases and 283 in TablesDB on the prior run
even with a 30s busy_timeout. Drop concurrency to 1 for the SQLite matrix
specifically; the legacy adapter matrix keeps its existing parallelism.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Short-circuit the matrix script so this PR runs SQLite shared-tables only
while we drive the SQLite test suite to green. Revert this commit before
merging so the upstream branch-aware matrix logic kicks back in.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default per-PR runs target SQLite/shared only. PRs that bump
utopia-php/database swap to the legacy MariaDB/PostgreSQL/MongoDB matrix
across both modes — SQLite is excluded there since the SQLite layer is
already covered by every other PR.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Default per-PR runs target only SQLite shared-tables, since SQLite is the
test backend and most PRs don't touch the database adapter layer. When
utopia-php/database changes, run the full MariaDB/PostgreSQL/MongoDB
matrix across both modes to catch adapter regressions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This branch is exclusively about wiring SQLite as the test backend, so
running the rest of the matrix is wasted CI. Strip databases to SQLite
and modes to shared.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
SQLite gives e2e tests a single shared file across all containers without
needing a heavyweight MariaDB/MongoDB/PostgreSQL service. WAL + busy_timeout
keep multi-process writers tolerable. Memory adapter was considered but its
per-process PHP arrays don't survive Swoole worker fan-out or cross-container
queue handoffs, so file-backed SQLite is the practical choice.
- registers: add 'sqlite' scheme to pool factory and worker db register,
configured with PRAGMA journal_mode=WAL, busy_timeout=5000, foreign_keys=ON
- compose: pass _APP_DB_SQLITE_PATH and mount appwrite-sqlite:/storage/sqlite
on every service that touches the main DB
- .env: switch _APP_DB_ADAPTER to sqlite, drop mariadb from COMPOSE_PROFILES
- ci.yml: add SQLite to the e2e matrix alongside MongoDB so each service
is timed against both adapters in the same workflow run
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Every CI run pushes ghcr.io/<repo>/appwrite-dev:<sha> and nothing
removes it. On an active repo with many PRs the GHCR storage grows
without bound. Add a cleanup job that runs after all consumer jobs
complete (always, even if some fail) and deletes the SHA-tagged
package version via the Packages API.
Addresses Greptile feedback on appwrite/appwrite#12176.
The build job uploads the appwrite-dev image as an actions artifact
(~hundreds of MB), and 30+ E2E test jobs all pull it concurrently with
actions/download-artifact. GitHub Actions' artifact storage struggles
with that many parallel downloads and intermittently fails with
BlobNotFound or 'Artifact download failed after 5 retries'.
Push the built image to ghcr.io/<repo>/appwrite-dev:<sha> in the build
job and pull from GHCR in each test job. GHCR handles parallel image
fetches without throttling.
Mirrors appwrite-labs/cloud#3906.
`https://appwrite.io/install/compose` now returns a 308 redirect to the
HTML install docs (`/docs/advanced/self-hosting/installation`) instead
of serving the compose file, so the Benchmark job's "Installing latest
version" step was downloading 0 bytes and `docker compose up -d` died
with "empty compose file". This has been failing the Benchmark job on
every recent PR, not just this one.
Resolve the latest release tag via the GitHub API, then fetch the
compose file and `.env` from `raw.githubusercontent.com` at that tag.
Switched both curl calls to `-fsSL` so they fail loudly on non-2xx
responses or redirect loss instead of silently writing empty files.