From 719c6cb2878e0ccd357dcdf120a78b9076ed5f44 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Fri, 23 Oct 2026 18:47:08 -0300 Subject: [PATCH 1/3] feat(appwrite): bump template to 2.6.1 - Update appwrite/appwrite images to 2.6.1 and console to 1.2.97 - Add ExifTool service for image metadata stripping - Add S3 path-style, VCS Entire, and maintenance queue variables - Add maintenance scheduler interval and worker pool sizing - Harden healthcheck with readiness marker and raise PostgreSQL shm - Bump orchestrator to 2.2.4 - Remove duplicate _APP_CONSOLE_HOSTNAMES entry --- blueprints/appwrite/docker-compose.yml | 47 +++++++++++++++++++------- blueprints/appwrite/meta.json | 2 +- blueprints/appwrite/template.toml | 10 +++++- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/blueprints/appwrite/docker-compose.yml b/blueprints/appwrite/docker-compose.yml index eb4b9d739..8ce314799 100644 --- a/blueprints/appwrite/docker-compose.yml +++ b/blueprints/appwrite/docker-compose.yml @@ -6,7 +6,7 @@ x-logging: &x-logging max-size: "10m" services: appwrite: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 <<: *x-logging restart: unless-stopped labels: @@ -29,7 +29,7 @@ services: healthcheck: test: - CMD-SHELL - - 'curl -fsS -o /dev/null -H "Host: $${_APP_DOMAIN:-localhost}" http://localhost/v1/health/version' + - 'test -f /tmp/.appwrite-ready && curl -fsS -o /dev/null -H "Host: $${_APP_DOMAIN:-localhost}" http://localhost/v1/health/version' interval: 5s timeout: 5s retries: 12 @@ -52,6 +52,8 @@ services: condition: service_started appwrite-autogravity: condition: service_started + appwrite-exiftool: + condition: service_started environment: - _APP_ENV - _APP_EDITION @@ -153,6 +155,7 @@ services: - _APP_STORAGE_LIMIT - _APP_STORAGE_PREVIEW_LIMIT - _APP_AUTOGRAVITY_HOST + - _APP_EXIFTOOL_HOST - _APP_STORAGE_ANTIVIRUS - _APP_STORAGE_ANTIVIRUS_HOST - _APP_STORAGE_ANTIVIRUS_PORT @@ -162,6 +165,7 @@ services: - _APP_STORAGE_S3_REGION - _APP_STORAGE_S3_BUCKET - _APP_STORAGE_S3_ENDPOINT + - _APP_STORAGE_S3_PATH_STYLE - _APP_STORAGE_DO_SPACES_ACCESS_KEY - _APP_STORAGE_DO_SPACES_SECRET - _APP_STORAGE_DO_SPACES_REGION @@ -229,6 +233,10 @@ services: - _APP_VCS_BITBUCKET_WEBHOOK_SECRET - _APP_VCS_ORIGIN_CLIENT_ID - _APP_VCS_ORIGIN_PRIVATE_KEY + - _APP_VCS_ENTIRE_PLUGIN + - _APP_VCS_ENTIRE_PRIVATE_KEY + - _APP_VCS_ENTIRE_ISSUER + - _APP_VCS_ENTIRE_ENDPOINT - _APP_VCS_WEBHOOK_URL - _APP_MIGRATION_HOST - _APP_MIGRATIONS_FIREBASE_CLIENT_ID @@ -237,16 +245,17 @@ services: - _APP_PWNED_PASSWORDS_DSN appwrite-console: - image: appwrite/new:1.2.74-self-hosted + image: appwrite/new:1.2.97-self-hosted <<: *x-logging restart: unless-stopped environment: - VITE_CONSOLE_PROFILE=self-hosted + - VITE_APPWRITE_VERSION=${_APP_VERSION:-2.6.1} - APPWRITE_ENDPOINT_SAME_ORIGIN=true - VITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1 appwrite-realtime: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: realtime <<: *x-logging restart: unless-stopped @@ -298,7 +307,7 @@ services: - _APP_LOGGING_FORMAT appwrite-mqtt: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: mqtt <<: *x-logging restart: unless-stopped @@ -348,7 +357,7 @@ services: - _APP_MQTT_MAX_PACKET_SIZE appwrite-worker: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: worker <<: *x-logging restart: unless-stopped @@ -371,8 +380,8 @@ services: environment: - _APP_ENV - _APP_WORKERS_NUM=1 - # Pool sizing only (sum of per-queue caps). Each queue keeps its own maxCoroutines in PHP; databases stays at 1. - - _APP_WORKER_MAX_COROUTINES=78 + # Pool sizing only (sum of per-queue caps). Each queue keeps its own maxCoroutines in PHP; databases and maintenance stay at 1. + - _APP_WORKER_MAX_COROUTINES=79 - _APP_WORKER_PER_CORE - _APP_OPENSSL_KEY_V1 - _APP_NOTIFICATIONS_TRACKING_SECRET @@ -416,6 +425,7 @@ services: - _APP_MAINTENANCE_RETENTION_USAGE_TTL - _APP_STATS_USAGE_QUEUE_NAME - _APP_STATS_RESOURCES_QUEUE_NAME + - _APP_MAINTENANCE_QUEUE_NAME - _APP_STATS_RESOURCES_INTERVAL - _APP_LOGGING_CONFIG - _APP_LOGGING_FORMAT @@ -440,6 +450,7 @@ services: - _APP_STORAGE_S3_REGION - _APP_STORAGE_S3_BUCKET - _APP_STORAGE_S3_ENDPOINT + - _APP_STORAGE_S3_PATH_STYLE - _APP_STORAGE_DO_SPACES_ACCESS_KEY - _APP_STORAGE_DO_SPACES_SECRET - _APP_STORAGE_DO_SPACES_REGION @@ -491,6 +502,10 @@ services: - _APP_VCS_BITBUCKET_WEBHOOK_SECRET - _APP_VCS_ORIGIN_CLIENT_ID - _APP_VCS_ORIGIN_PRIVATE_KEY + - _APP_VCS_ENTIRE_PLUGIN + - _APP_VCS_ENTIRE_PRIVATE_KEY + - _APP_VCS_ENTIRE_ISSUER + - _APP_VCS_ENTIRE_ENDPOINT - _APP_VCS_WEBHOOK_URL - _APP_SYSTEM_EMAIL_NAME - _APP_SYSTEM_EMAIL_ADDRESS @@ -509,7 +524,7 @@ services: - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE appwrite-task-scheduler: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: schedule <<: *x-logging restart: unless-stopped @@ -552,12 +567,14 @@ services: - _APP_MAINTENANCE_RETENTION_USAGE_TTL - _APP_STATS_USAGE_QUEUE_NAME - _APP_STATS_RESOURCES_QUEUE_NAME + - _APP_MAINTENANCE_QUEUE_NAME - _APP_STATS_RESOURCES_INTERVAL - _APP_FUNCTIONS_SCHEDULE_SPREAD + - _APP_MAINTENANCE_INACTIVE_INTERVAL - _APP_LOGGING_FORMAT appwrite-task-maintenance: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: maintenance <<: *x-logging restart: unless-stopped @@ -601,7 +618,7 @@ services: - _APP_LOGGING_FORMAT appwrite-task-interval: - image: appwrite/appwrite:2.5.0 + image: appwrite/appwrite:2.6.1 entrypoint: interval <<: *x-logging restart: unless-stopped @@ -656,6 +673,11 @@ services: environment: - MODEL_BACKEND=focalnet + appwrite-exiftool: + image: ghcr.io/appwrite/exiftool:0.1.0 + <<: *x-logging + restart: unless-stopped + appwrite-geo: image: appwrite/geo:0.3.2 <<: *x-logging @@ -738,7 +760,7 @@ services: start_period: 5s orchestrator: - image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.2 + image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.4 hostname: orchestrator <<: *x-logging restart: unless-stopped @@ -761,6 +783,7 @@ services: image: appwrite/postgres:0.1.0 <<: *x-logging restart: unless-stopped + shm_size: 1g volumes: - appwrite-postgresql:/var/lib/postgresql:rw environment: diff --git a/blueprints/appwrite/meta.json b/blueprints/appwrite/meta.json index f04c7e159..496804658 100644 --- a/blueprints/appwrite/meta.json +++ b/blueprints/appwrite/meta.json @@ -1,7 +1,7 @@ { "id": "appwrite", "name": "Appwrite", - "version": "2.5.0", + "version": "2.6.1", "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", "links": { "github": "https://github.com/appwrite/appwrite", diff --git a/blueprints/appwrite/template.toml b/blueprints/appwrite/template.toml index fcb930ad8..63f2ed23c 100644 --- a/blueprints/appwrite/template.toml +++ b/blueprints/appwrite/template.toml @@ -20,6 +20,7 @@ console_domain = "console.${main_domain}" isolated = false env = [ "_APP_ENV=production", + "_APP_VERSION=2.6.1", "_APP_EDITION=self-hosted", "_APP_LOCALE=en", "_APP_WORKER_PER_CORE=6", @@ -49,7 +50,6 @@ env = [ "_APP_CONSOLE_WHITELIST_ROOT=enabled", "_APP_CONSOLE_WHITELIST_EMAILS=", "_APP_CONSOLE_WHITELIST_IPS=", - "_APP_CONSOLE_HOSTNAMES=", "_APP_CONSOLE_SCHEMA=appwriteio", "_APP_CONSOLE_SESSION_ALERTS=disabled", "_APP_CONSOLE_COUNTRIES_DENYLIST=", @@ -113,6 +113,7 @@ env = [ "_APP_MAINTENANCE_RETENTION_USAGE_TTL=180", "_APP_STATS_USAGE_QUEUE_NAME=v1-stats-usage", "_APP_STATS_RESOURCES_QUEUE_NAME=v1-stats-resources", + "_APP_MAINTENANCE_QUEUE_NAME=v1-maintenance", "_APP_STATS_RESOURCES_INTERVAL=3600", "_APP_MQTT_REPLAY_DEPTH=5", "_APP_MQTT_MAX_PACKET_SIZE=64000", @@ -128,6 +129,7 @@ env = [ "_APP_STORAGE_LIMIT=30000000", "_APP_STORAGE_PREVIEW_LIMIT=20000000", "_APP_AUTOGRAVITY_HOST=http://appwrite-autogravity:8080", + "_APP_EXIFTOOL_HOST=http://appwrite-exiftool:8080", "_APP_STORAGE_ANTIVIRUS=disabled", "_APP_STORAGE_ANTIVIRUS_HOST=clamav", "_APP_STORAGE_ANTIVIRUS_PORT=3310", @@ -137,6 +139,7 @@ env = [ "_APP_STORAGE_S3_REGION=us-east-1", "_APP_STORAGE_S3_BUCKET=", "_APP_STORAGE_S3_ENDPOINT=", + "_APP_STORAGE_S3_PATH_STYLE=", "_APP_STORAGE_DO_SPACES_ACCESS_KEY=", "_APP_STORAGE_DO_SPACES_SECRET=", "_APP_STORAGE_DO_SPACES_REGION=us-east-1", @@ -179,6 +182,7 @@ env = [ "_APP_DOCKER_HUB_USERNAME=", "_APP_DOCKER_HUB_PASSWORD=", "_APP_MAINTENANCE_INTERVAL=86400", + "_APP_MAINTENANCE_INACTIVE_INTERVAL=604800", "_APP_MAINTENANCE_START_TIME=00:00", "_APP_MAINTENANCE_RETENTION_CACHE=2592000", "_APP_MAINTENANCE_RETENTION_EXECUTION=1209600", @@ -213,6 +217,10 @@ env = [ "_APP_VCS_BITBUCKET_WEBHOOK_SECRET=", "_APP_VCS_ORIGIN_CLIENT_ID=", "_APP_VCS_ORIGIN_PRIVATE_KEY=", + "_APP_VCS_ENTIRE_PLUGIN=", + "_APP_VCS_ENTIRE_PRIVATE_KEY=", + "_APP_VCS_ENTIRE_ISSUER=", + "_APP_VCS_ENTIRE_ENDPOINT=", "_APP_VCS_WEBHOOK_URL=", "_APP_MIGRATION_HOST=appwrite", "_APP_MIGRATIONS_FIREBASE_CLIENT_ID=", From 1d5d8c103773210b40e1994a39c2a63eedfdac7a Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Sun, 25 Oct 2026 16:08:07 -0300 Subject: [PATCH 2/3] feat(appwrite): bump template to 2.6.2 --- blueprints/appwrite/docker-compose.yml | 28 +++++++++++++++++--------- blueprints/appwrite/meta.json | 2 +- blueprints/appwrite/template.toml | 3 ++- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/blueprints/appwrite/docker-compose.yml b/blueprints/appwrite/docker-compose.yml index 8ce314799..775ecc1e4 100644 --- a/blueprints/appwrite/docker-compose.yml +++ b/blueprints/appwrite/docker-compose.yml @@ -6,7 +6,7 @@ x-logging: &x-logging max-size: "10m" services: appwrite: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 <<: *x-logging restart: unless-stopped labels: @@ -56,6 +56,7 @@ services: condition: service_started environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_EDITION - _APP_WORKER_PER_CORE - _APP_LOCALE @@ -245,7 +246,7 @@ services: - _APP_PWNED_PASSWORDS_DSN appwrite-console: - image: appwrite/new:1.2.97-self-hosted + image: appwrite/new:1.2.108-self-hosted <<: *x-logging restart: unless-stopped environment: @@ -255,7 +256,7 @@ services: - VITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1 appwrite-realtime: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: realtime <<: *x-logging restart: unless-stopped @@ -266,6 +267,7 @@ services: condition: service_healthy environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_WORKER_PER_CORE - _APP_OPTIONS_ABUSE - _APP_OPTIONS_ROUTER_PROTECTION @@ -307,7 +309,7 @@ services: - _APP_LOGGING_FORMAT appwrite-mqtt: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: mqtt <<: *x-logging restart: unless-stopped @@ -328,6 +330,7 @@ services: start_period: 20s environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_WORKER_PER_CORE - _APP_OPTIONS_ABUSE - _APP_OPTIONS_ROUTER_PROTECTION @@ -357,7 +360,7 @@ services: - _APP_MQTT_MAX_PACKET_SIZE appwrite-worker: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: worker <<: *x-logging restart: unless-stopped @@ -379,6 +382,7 @@ services: - host.docker.internal:host-gateway environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_WORKERS_NUM=1 # Pool sizing only (sum of per-queue caps). Each queue keeps its own maxCoroutines in PHP; databases and maintenance stay at 1. - _APP_WORKER_MAX_COROUTINES=79 @@ -524,7 +528,7 @@ services: - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE appwrite-task-scheduler: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: schedule <<: *x-logging restart: unless-stopped @@ -535,6 +539,7 @@ services: condition: service_healthy environment: - _APP_ENV + - _APP_MEMORY_LIMIT # Combined mode runs functions/executions/messages timers + enqueue coroutines # against shared console/cache pools; floor must cover concurrent ticks. - _APP_WORKER_MAX_COROUTINES=8 @@ -574,7 +579,7 @@ services: - _APP_LOGGING_FORMAT appwrite-task-maintenance: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: maintenance <<: *x-logging restart: unless-stopped @@ -585,6 +590,7 @@ services: condition: service_healthy environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_EDITION - _APP_WORKER_PER_CORE - _APP_DOMAIN @@ -618,7 +624,7 @@ services: - _APP_LOGGING_FORMAT appwrite-task-interval: - image: appwrite/appwrite:2.6.1 + image: appwrite/appwrite:2.6.2 entrypoint: interval <<: *x-logging restart: unless-stopped @@ -629,6 +635,7 @@ services: condition: service_healthy environment: - _APP_ENV + - _APP_MEMORY_LIMIT - _APP_WORKER_PER_CORE - _APP_DOMAIN - _APP_DOMAIN_TARGET_CNAME @@ -655,7 +662,7 @@ services: - _APP_LOGGING_FORMAT appwrite-browser: - image: appwrite/browser:0.3.6 + image: appwrite/browser:0.3.8 <<: *x-logging restart: unless-stopped environment: @@ -674,7 +681,7 @@ services: - MODEL_BACKEND=focalnet appwrite-exiftool: - image: ghcr.io/appwrite/exiftool:0.1.0 + image: ghcr.io/appwrite/exiftool:0.1.1 <<: *x-logging restart: unless-stopped @@ -783,6 +790,7 @@ services: image: appwrite/postgres:0.1.0 <<: *x-logging restart: unless-stopped + init: true shm_size: 1g volumes: - appwrite-postgresql:/var/lib/postgresql:rw diff --git a/blueprints/appwrite/meta.json b/blueprints/appwrite/meta.json index 496804658..d47499641 100644 --- a/blueprints/appwrite/meta.json +++ b/blueprints/appwrite/meta.json @@ -1,7 +1,7 @@ { "id": "appwrite", "name": "Appwrite", - "version": "2.6.1", + "version": "2.6.2", "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.", "links": { "github": "https://github.com/appwrite/appwrite", diff --git a/blueprints/appwrite/template.toml b/blueprints/appwrite/template.toml index 63f2ed23c..2bfdde7e7 100644 --- a/blueprints/appwrite/template.toml +++ b/blueprints/appwrite/template.toml @@ -20,7 +20,8 @@ console_domain = "console.${main_domain}" isolated = false env = [ "_APP_ENV=production", - "_APP_VERSION=2.6.1", + "_APP_VERSION=2.6.2", + "_APP_MEMORY_LIMIT=512M", "_APP_EDITION=self-hosted", "_APP_LOCALE=en", "_APP_WORKER_PER_CORE=6", From 81dd4ee79a7a5c25a9ebd6309f28a2e012d7e45b Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 28 Oct 2026 20:55:05 -0300 Subject: [PATCH 3/3] fix(appwrite): keep wildcard routers below console Dokploy generates the console/API routers without a priority, so Traefik falls back to rule length. A Sites/Functions HostRegexp rooted at the apex also matches the console host and is longer, so it 404s the console. The generated router names include a per-domain serial, so the template cannot set their priority. Pin the template-owned wildcard routers to the lowest priority instead, for both web and websecure. --- blueprints/appwrite/docker-compose.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/blueprints/appwrite/docker-compose.yml b/blueprints/appwrite/docker-compose.yml index 775ecc1e4..ea9c89c22 100644 --- a/blueprints/appwrite/docker-compose.yml +++ b/blueprints/appwrite/docker-compose.yml @@ -11,17 +11,31 @@ services: restart: unless-stopped labels: - traefik.enable=true + # Dokploy generates the specific routers (console, API, realtime) from the + # domains declared in template.toml, naming them + # "--" and never setting a priority. + # Their priority is therefore Traefik's default: the length of the rule. + # The wildcard routers below are owned by this template, and a HostRegexp + # rule is longer than a Host rule, so without an explicit priority they can + # outrank the console/API router whenever the wildcard also matches the + # host (for example a Sites/Functions wildcard rooted at the same apex as + # the console). Pin every wildcard router to the lowest useful priority so + # the specific router always wins; 1 is below any rule-derived priority. - 'traefik.http.routers.appwrite-sites-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)' + - traefik.http.routers.appwrite-sites-wildcard.priority=1 - traefik.http.routers.appwrite-sites-wildcard.entrypoints=web - traefik.http.routers.appwrite-sites-wildcard.service=appwrite-wildcard - 'traefik.http.routers.appwrite-sites-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)' + - traefik.http.routers.appwrite-sites-wildcard-secure.priority=1 - traefik.http.routers.appwrite-sites-wildcard-secure.entrypoints=websecure - traefik.http.routers.appwrite-sites-wildcard-secure.tls=true - traefik.http.routers.appwrite-sites-wildcard-secure.service=appwrite-wildcard - 'traefik.http.routers.appwrite-functions-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)' + - traefik.http.routers.appwrite-functions-wildcard.priority=1 - traefik.http.routers.appwrite-functions-wildcard.entrypoints=web - traefik.http.routers.appwrite-functions-wildcard.service=appwrite-wildcard - 'traefik.http.routers.appwrite-functions-wildcard-secure.rule=HostRegexp(`^.+\.${_APP_DOMAIN_FUNCTIONS}$$`)' + - traefik.http.routers.appwrite-functions-wildcard-secure.priority=1 - traefik.http.routers.appwrite-functions-wildcard-secure.entrypoints=websecure - traefik.http.routers.appwrite-functions-wildcard-secure.tls=true - traefik.http.routers.appwrite-functions-wildcard-secure.service=appwrite-wildcard