Files
templates/blueprints/appwrite/docker-compose.yml
T
061c975a1c feat: update appwrite template to 2.5.0 with MariaDB, node-24/26, console domain (#1215)
* feat: update appwrite template to 2.4.0 with MariaDB, node-24/26, console domain

* feat: enable DocumentsDB and VectorsDB by default in appwrite 2.4.0 template

* feat: update appwrite template to 2.4.0 with MariaDB, node-24/26, console domain

* fix(appwrite): repair 2.4.0 template structure and console setup

- Restore [config] table so config.env/config.isolated parse correctly
  (the env block had been swallowed into config.mounts[0], leaving the
  deployment with no environment variables)
- Add missing mongo-entrypoint.sh mount so the mongodb service can start
- Remove the mariadb [[config.domains]] entry: it exposed the DB on
  main_domain and duplicated the appwrite-console route
- Route the dedicated console domain via config.domains and drop the
  broken HostRegexp Traefik labels; set _APP_CONSOLE_URL/HOSTNAMES
- Bump appwrite-console image to 1.2.55-self-hosted (2.4.0 console)
- Restore the pinned appwrite-builds volume name
- Drop the removed Appwrite Assistant env/service

* feat(appwrite): apply remaining 2.4.0 hardening (clickhouse logs, browser)

- ClickHouse: add the two 2.4.0 config mounts (clickhouse-config.xml for
  system-log retention, clickhouse-init.sh to backfill TTLs on existing
  tables) plus CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS=1; the files are
  generated via [[config.mounts]] and bind-mounted from ../files/
- Browser: bump appwrite/browser 0.3.4 -> 0.3.6, set ALLOWED_HOSTS=appwrite
  and public DNS resolvers to block SSRF to internal services
- Bump appwrite/geo 0.3.1 -> 0.3.2 (matches 2.4.0)

* feat(appwrite): bump template to 2.5.0

Update the Appwrite blueprint to the 2.5.0 release (published
2026-10-13), which only moves images with no new environment
variables:

- appwrite/appwrite 2.4.0 -> 2.5.0 across all services
- appwrite/new console 1.2.55-self-hosted -> 1.2.74-self-hosted
- openruntimes/executor 0.29.0 -> 1.1.2

Brings project passkeys, interval-based function schedules, and
runtime containers that survive executor restarts.

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
2026-10-15 10:04:06 -06:00

899 lines
28 KiB
YAML

x-logging: &x-logging
logging:
driver: "json-file"
options:
max-file: "5"
max-size: "10m"
services:
appwrite:
image: appwrite/appwrite:2.5.0
<<: *x-logging
restart: unless-stopped
labels:
- traefik.enable=true
- 'traefik.http.routers.appwrite-sites-wildcard.rule=HostRegexp(`^.+\.${_APP_DOMAIN_SITES}$$`)'
- 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.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.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.entrypoints=websecure
- traefik.http.routers.appwrite-functions-wildcard-secure.tls=true
- traefik.http.routers.appwrite-functions-wildcard-secure.service=appwrite-wildcard
- traefik.http.services.appwrite-wildcard.loadbalancer.server.port=80
healthcheck:
test:
- CMD-SHELL
- 'curl -fsS -o /dev/null -H "Host: $${_APP_DOMAIN:-localhost}" http://localhost/v1/health/version'
interval: 5s
timeout: 5s
retries: 12
start_period: 120s
volumes:
- appwrite-uploads:/storage/uploads:rw
- appwrite-imports:/storage/imports:rw
- appwrite-cache:/storage/cache:rw
- appwrite-config:/storage/config:rw
- appwrite-certificates:/storage/certificates:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
appwrite-geo:
condition: service_started
appwrite-autogravity:
condition: service_started
environment:
- _APP_ENV
- _APP_EDITION
- _APP_WORKER_PER_CORE
- _APP_LOCALE
- _APP_COMPRESSION_ENABLED
- _APP_COMPRESSION_MIN_SIZE_BYTES
- _APP_CONSOLE_WHITELIST_ROOT
- _APP_CONSOLE_WHITELIST_EMAILS
- _APP_CONSOLE_SESSION_ALERTS
- _APP_CONSOLE_WHITELIST_IPS
- _APP_CONSOLE_HOSTNAMES
- _APP_CONSOLE_SCHEMA
- _APP_CONSOLE_GITHUB_APP_ID
- _APP_CONSOLE_GITHUB_SECRET
- _APP_CONSOLE_GITLAB_APP_ID
- _APP_CONSOLE_GITLAB_SECRET
- _APP_CONSOLE_GITLAB_ENDPOINT
- _APP_CONSOLE_BITBUCKET_APP_ID
- _APP_CONSOLE_BITBUCKET_SECRET
- _APP_CONSOLE_GOOGLE_APP_ID
- _APP_CONSOLE_GOOGLE_SECRET
- _APP_SYSTEM_EMAIL_NAME
- _APP_SYSTEM_EMAIL_ADDRESS
- _APP_SYSTEM_TEAM_EMAIL
- _APP_EMAIL_SECURITY
- _APP_SYSTEM_RESPONSE_FORMAT
- _APP_OPTIONS_ABUSE
- _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS
- _APP_OPTIONS_ROUTER_PROTECTION
- _APP_OPTIONS_FORCE_HTTPS
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_ROUTER_AUTO_CERTIFICATES
- _APP_OPENSSL_KEY_V1
- _APP_NOTIFICATIONS_TRACKING_SECRET
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_CONSOLE_URL
- _APP_CONSOLE_TRUSTED_PROJECTS
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_CUSTOM_DOMAIN_DENY_LIST
- _APP_TRUSTED_HEADERS
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DB_ROOT_PASS
- _APP_DB_USER_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_DATABASE_SHARED_NAMESPACE
- _APP_LIMIT_DATABASE_BATCH
- _APP_LOCKING_ENABLED
- _APP_DOCUMENTSDB
- _APP_DB_ADAPTER_DOCUMENTSDB
- _APP_DB_HOST_DOCUMENTSDB
- _APP_DB_PORT_DOCUMENTSDB
- _APP_DB_SCHEMA_DOCUMENTSDB
- _APP_DB_USER_DOCUMENTSDB
- _APP_DB_PASS_DOCUMENTSDB
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_VECTORSDB
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_EMBEDDING
- _APP_USAGE_STATS
- _APP_USAGE_PASS
- _APP_CONNECTIONS_DB_USAGE
- _APP_POOL_SIZE_USAGE
- _APP_CONNECTIONS_DB_EXECUTIONS
- _APP_POOL_SIZE_EXECUTIONS
- _APP_MAINTENANCE_RETENTION_USAGE_TTL
- _APP_STATS_USAGE_QUEUE_NAME
- _APP_STATS_RESOURCES_QUEUE_NAME
- _APP_STATS_RESOURCES_INTERVAL
- _APP_SMTP_HOST
- _APP_SMTP_PORT
- _APP_SMTP_SECURE
- _APP_SMTP_USERNAME
- _APP_SMTP_PASSWORD
- _APP_SMS_PROVIDER
- _APP_SMS_FROM
- _APP_STORAGE_LIMIT
- _APP_STORAGE_PREVIEW_LIMIT
- _APP_AUTOGRAVITY_HOST
- _APP_STORAGE_ANTIVIRUS
- _APP_STORAGE_ANTIVIRUS_HOST
- _APP_STORAGE_ANTIVIRUS_PORT
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
- _APP_STORAGE_S3_SECRET
- _APP_STORAGE_S3_REGION
- _APP_STORAGE_S3_BUCKET
- _APP_STORAGE_S3_ENDPOINT
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
- _APP_STORAGE_DO_SPACES_SECRET
- _APP_STORAGE_DO_SPACES_REGION
- _APP_STORAGE_DO_SPACES_BUCKET
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
- _APP_STORAGE_BACKBLAZE_SECRET
- _APP_STORAGE_BACKBLAZE_REGION
- _APP_STORAGE_BACKBLAZE_BUCKET
- _APP_STORAGE_LINODE_ACCESS_KEY
- _APP_STORAGE_LINODE_SECRET
- _APP_STORAGE_LINODE_REGION
- _APP_STORAGE_LINODE_BUCKET
- _APP_STORAGE_WASABI_ACCESS_KEY
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_COMPUTE_SIZE_LIMIT
- _APP_COMPUTE_BUILD_SIZE_LIMIT
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_FUNCTIONS_TIMEOUT
- _APP_FUNCTIONS_RUNTIMES
- _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
- _APP_SITES_TIMEOUT
- _APP_SITES_RUNTIMES
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
- _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME:-appwrite}_appwrite-builds
- _APP_JOBS_HOST
- _APP_JOBS_SECRET
- _APP_JOBS_ENDPOINT
- _APP_GEO_SECRET
- _APP_GEO_ENDPOINT
- _APP_LOGGING_CONFIG
- _APP_LOGGING_FORMAT
- _APP_MAINTENANCE_INTERVAL
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_CACHE
- _APP_MAINTENANCE_RETENTION_ABUSE
- _APP_MAINTENANCE_RETENTION_AUDIT
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
- _APP_MAINTENANCE_RETENTION_SCHEDULES
- _APP_GRAPHQL_INTROSPECTION
- _APP_GRAPHQL_MAX_BATCH_SIZE
- _APP_GRAPHQL_MAX_COMPLEXITY
- _APP_GRAPHQL_MAX_DEPTH
- _APP_VCS_GITHUB_APP_NAME
- _APP_VCS_GITHUB_PRIVATE_KEY
- _APP_VCS_GITHUB_APP_ID
- _APP_VCS_GITHUB_WEBHOOK_SECRET
- _APP_VCS_GITHUB_CLIENT_SECRET
- _APP_VCS_GITHUB_CLIENT_ID
- _APP_VCS_GITEA_ENDPOINT
- _APP_VCS_GITEA_BROWSER_ENDPOINT
- _APP_VCS_GITEA_CLIENT_ID
- _APP_VCS_GITEA_CLIENT_SECRET
- _APP_VCS_GITEA_WEBHOOK_SECRET
- _APP_VCS_GITLAB_ENDPOINT
- _APP_VCS_GITLAB_CLIENT_ID
- _APP_VCS_GITLAB_CLIENT_SECRET
- _APP_VCS_GITLAB_WEBHOOK_SECRET
- _APP_VCS_BITBUCKET_CLIENT_ID
- _APP_VCS_BITBUCKET_CLIENT_SECRET
- _APP_VCS_BITBUCKET_WEBHOOK_SECRET
- _APP_VCS_ORIGIN_CLIENT_ID
- _APP_VCS_ORIGIN_PRIVATE_KEY
- _APP_VCS_WEBHOOK_URL
- _APP_MIGRATION_HOST
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_CONSOLE_COUNTRIES_DENYLIST
- _APP_PWNED_PASSWORDS_DSN
appwrite-console:
image: appwrite/new:1.2.74-self-hosted
<<: *x-logging
restart: unless-stopped
environment:
- VITE_CONSOLE_PROFILE=self-hosted
- APPWRITE_ENDPOINT_SAME_ORIGIN=true
- VITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1
appwrite-realtime:
image: appwrite/appwrite:2.5.0
entrypoint: realtime
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPTIONS_ABUSE
- _APP_OPTIONS_ROUTER_PROTECTION
- _APP_CONSOLE_HOSTNAMES
- _APP_REALTIME_TAIL_RATE
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_LIMIT_DATABASE_BATCH
- _APP_DOCUMENTSDB
- _APP_DB_ADAPTER_DOCUMENTSDB
- _APP_DB_HOST_DOCUMENTSDB
- _APP_DB_PORT_DOCUMENTSDB
- _APP_DB_SCHEMA_DOCUMENTSDB
- _APP_DB_USER_DOCUMENTSDB
- _APP_DB_PASS_DOCUMENTSDB
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_VECTORSDB
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_EMBEDDING
- _APP_USAGE_STATS
- _APP_STATS_USAGE_QUEUE_NAME
- _APP_LOGGING_CONFIG
- _APP_LOGGING_FORMAT
appwrite-mqtt:
image: appwrite/appwrite:2.5.0
entrypoint: mqtt
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
healthcheck:
test:
- CMD
- php
- -r
- 'exit(@fsockopen(''127.0.0.1'', 1883) ? 0 : 1);'
interval: 5s
timeout: 5s
retries: 20
start_period: 20s
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_OPTIONS_ABUSE
- _APP_OPTIONS_ROUTER_PROTECTION
- _APP_REALTIME_TAIL_RATE
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_LOGGING_CONFIG
- _APP_LOGGING_FORMAT
- _APP_DATABASE_SHARED_TABLES
- _APP_MQTT_REPLAY_DEPTH
- _APP_MQTT_WS_PORT
- _APP_MQTT_MAX_PACKET_SIZE
appwrite-worker:
image: appwrite/appwrite:2.5.0
entrypoint: worker
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
volumes:
- appwrite-uploads:/storage/uploads:rw
- appwrite-cache:/storage/cache:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- appwrite-builds:/storage/builds:rw
- appwrite-certificates:/storage/certificates:rw
- appwrite-config:/storage/config:rw
- appwrite-imports:/storage/imports:rw
extra_hosts:
- host.docker.internal:host-gateway
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
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_NOTIFICATIONS_TRACKING_SECRET
- _APP_EMAIL_SECURITY
- _APP_EMAIL_CERTIFICATES
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_LIMIT_DATABASE_BATCH
- _APP_DOCUMENTSDB
- _APP_DB_ADAPTER_DOCUMENTSDB
- _APP_DB_HOST_DOCUMENTSDB
- _APP_DB_PORT_DOCUMENTSDB
- _APP_DB_SCHEMA_DOCUMENTSDB
- _APP_DB_USER_DOCUMENTSDB
- _APP_DB_PASS_DOCUMENTSDB
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
- _APP_VECTORSDB
- _APP_DB_ADAPTER_VECTORSDB
- _APP_DB_HOST_VECTORSDB
- _APP_DB_PORT_VECTORSDB
- _APP_DB_SCHEMA_VECTORSDB
- _APP_DB_USER_VECTORSDB
- _APP_DB_PASS_VECTORSDB
- _APP_CONNECTIONS_DATABASE_VECTORSDB
- _APP_EMBEDDING
- _APP_USAGE_STATS
- _APP_USAGE_PASS
- _APP_CONNECTIONS_DB_USAGE
- _APP_POOL_SIZE_USAGE
- _APP_CONNECTIONS_DB_EXECUTIONS
- _APP_POOL_SIZE_EXECUTIONS
- _APP_MAINTENANCE_RETENTION_USAGE_TTL
- _APP_STATS_USAGE_QUEUE_NAME
- _APP_STATS_RESOURCES_QUEUE_NAME
- _APP_STATS_RESOURCES_INTERVAL
- _APP_LOGGING_CONFIG
- _APP_LOGGING_FORMAT
- _APP_QUEUE_NAME
- _APP_CONSOLE_URL
- _APP_CONSOLE_DOMAIN
- _APP_CONSOLE_TRUSTED_PROJECTS
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_OPTIONS_FORCE_HTTPS
- _APP_OPTIONS_ROUTER_FORCE_HTTPS
- _APP_WEBHOOK_MAX_FAILED_ATTEMPTS
- _APP_STORAGE_DEVICE
- _APP_STORAGE_S3_ACCESS_KEY
- _APP_STORAGE_S3_SECRET
- _APP_STORAGE_S3_REGION
- _APP_STORAGE_S3_BUCKET
- _APP_STORAGE_S3_ENDPOINT
- _APP_STORAGE_DO_SPACES_ACCESS_KEY
- _APP_STORAGE_DO_SPACES_SECRET
- _APP_STORAGE_DO_SPACES_REGION
- _APP_STORAGE_DO_SPACES_BUCKET
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY
- _APP_STORAGE_BACKBLAZE_SECRET
- _APP_STORAGE_BACKBLAZE_REGION
- _APP_STORAGE_BACKBLAZE_BUCKET
- _APP_STORAGE_LINODE_ACCESS_KEY
- _APP_STORAGE_LINODE_SECRET
- _APP_STORAGE_LINODE_REGION
- _APP_STORAGE_LINODE_BUCKET
- _APP_STORAGE_WASABI_ACCESS_KEY
- _APP_STORAGE_WASABI_SECRET
- _APP_STORAGE_WASABI_REGION
- _APP_STORAGE_WASABI_BUCKET
- _APP_EXECUTOR_SECRET
- _APP_EXECUTOR_HOST
- _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME:-appwrite}_appwrite-builds
- _APP_JOBS_HOST
- _APP_JOBS_SECRET
- _APP_JOBS_ENDPOINT
- _APP_BROWSER_HOST
- _APP_WORKER_SCREENSHOTS_ROUTER
- _APP_DOCKER_HUB_USERNAME
- _APP_DOCKER_HUB_PASSWORD
- _APP_FUNCTIONS_TIMEOUT
- _APP_SITES_TIMEOUT
- _APP_COMPUTE_BUILD_TIMEOUT
- _APP_COMPUTE_CPUS
- _APP_COMPUTE_MEMORY
- _APP_COMPUTE_SIZE_LIMIT
- _APP_COMPUTE_BUILD_SIZE_LIMIT
- _APP_OPEN_RUNTIMES_NFT
- _APP_VCS_GITHUB_APP_NAME
- _APP_VCS_GITHUB_PRIVATE_KEY
- _APP_VCS_GITHUB_APP_ID
- _APP_VCS_GITEA_ENDPOINT
- _APP_VCS_GITEA_BROWSER_ENDPOINT
- _APP_VCS_GITEA_CLIENT_ID
- _APP_VCS_GITEA_CLIENT_SECRET
- _APP_VCS_GITEA_WEBHOOK_SECRET
- _APP_VCS_GITLAB_ENDPOINT
- _APP_VCS_GITLAB_CLIENT_ID
- _APP_VCS_GITLAB_CLIENT_SECRET
- _APP_VCS_GITLAB_WEBHOOK_SECRET
- _APP_VCS_BITBUCKET_CLIENT_ID
- _APP_VCS_BITBUCKET_CLIENT_SECRET
- _APP_VCS_BITBUCKET_WEBHOOK_SECRET
- _APP_VCS_ORIGIN_CLIENT_ID
- _APP_VCS_ORIGIN_PRIVATE_KEY
- _APP_VCS_WEBHOOK_URL
- _APP_SYSTEM_EMAIL_NAME
- _APP_SYSTEM_EMAIL_ADDRESS
- _APP_SMTP_HOST
- _APP_SMTP_PORT
- _APP_SMTP_SECURE
- _APP_SMTP_USERNAME
- _APP_SMTP_PASSWORD
- _APP_SMS_FROM
- _APP_SMS_PROVIDER
- _APP_SMS_PROJECTS_DENY_LIST
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
- _APP_MIGRATION_HOST
- _APP_MAINTENANCE_RETENTION_AUDIT
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
appwrite-task-scheduler:
image: appwrite/appwrite:2.5.0
entrypoint: schedule
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
environment:
- _APP_ENV
# Combined mode runs functions/executions/messages timers + enqueue coroutines
# against shared console/cache pools; floor must cover concurrent ticks.
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE
- _APP_OPENSSL_KEY_V1
- _APP_OPTIONS_FORCE_HTTPS
- _APP_DOMAIN
- _APP_CONSOLE_DOMAIN
- _APP_CONSOLE_SCHEMA
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_MIGRATION_HOST
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_USAGE_STATS
- _APP_USAGE_PASS
- _APP_CONNECTIONS_DB_USAGE
- _APP_POOL_SIZE_USAGE
- _APP_CONNECTIONS_DB_EXECUTIONS
- _APP_POOL_SIZE_EXECUTIONS
- _APP_MAINTENANCE_RETENTION_USAGE_TTL
- _APP_STATS_USAGE_QUEUE_NAME
- _APP_STATS_RESOURCES_QUEUE_NAME
- _APP_STATS_RESOURCES_INTERVAL
- _APP_FUNCTIONS_SCHEDULE_SPREAD
- _APP_LOGGING_FORMAT
appwrite-task-maintenance:
image: appwrite/appwrite:2.5.0
entrypoint: maintenance
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
environment:
- _APP_ENV
- _APP_EDITION
- _APP_WORKER_PER_CORE
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_ROUTER_AUTO_CERTIFICATES
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_MAINTENANCE_INTERVAL
- _APP_MAINTENANCE_START_TIME
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_CACHE
- _APP_MAINTENANCE_RETENTION_ABUSE
- _APP_MAINTENANCE_RETENTION_AUDIT
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
- _APP_MAINTENANCE_RETENTION_SCHEDULES
- _APP_LOGGING_FORMAT
appwrite-task-interval:
image: appwrite/appwrite:2.5.0
entrypoint: interval
<<: *x-logging
restart: unless-stopped
depends_on:
redis:
condition: service_healthy
postgresql:
condition: service_healthy
environment:
- _APP_ENV
- _APP_WORKER_PER_CORE
- _APP_DOMAIN
- _APP_DOMAIN_TARGET_CNAME
- _APP_DOMAIN_TARGET_AAAA
- _APP_DOMAIN_TARGET_A
- _APP_DOMAIN_TARGET_CAA
- _APP_DNS
- _APP_DOMAIN_FUNCTIONS
- _APP_DOMAIN_SITES
- _APP_OPENSSL_KEY_V1
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_REDIS_USER
- _APP_REDIS_PASS
- _APP_DB_ADAPTER
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_DATABASE_SHARED_TABLES
- _APP_INTERVAL_DOMAIN_VERIFICATION
- _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS
- _APP_LOGGING_FORMAT
appwrite-browser:
image: appwrite/browser:0.3.6
<<: *x-logging
restart: unless-stopped
environment:
- ALLOWED_HOSTS=appwrite
# Public resolvers only, so the browser cannot resolve internal service
# names (e.g. redis, appwrite-mariadb) and render them via a user URL.
dns:
- 1.1.1.1
- 8.8.8.8
appwrite-autogravity:
image: ghcr.io/appwrite/autogravity:0.0.11
<<: *x-logging
restart: unless-stopped
environment:
- MODEL_BACKEND=focalnet
appwrite-geo:
image: appwrite/geo:0.3.2
<<: *x-logging
restart: unless-stopped
environment:
- GEO_SECRET=$_APP_GEO_SECRET
healthcheck:
test: 'php -r "exit(json_decode(file_get_contents(''http://localhost/v1/health''))->status === ''ok'' ? 0 : 1);"'
interval: 10s
timeout: 5s
retries: 3
start_period: 5s
clickhouse:
image: clickhouse/clickhouse-server:26.4.3-alpine
<<: *x-logging
restart: unless-stopped
environment:
- CLICKHOUSE_DB=appwrite
- CLICKHOUSE_USER=appwrite
- CLICKHOUSE_PASSWORD=${_APP_USAGE_PASS:-appwrite}
- CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1
- CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS=1
volumes:
- appwrite-clickhouse:/var/lib/clickhouse:rw
- ../files/clickhouse-config.xml:/etc/clickhouse-server/config.d/appwrite.xml:ro
- ../files/clickhouse-init.sh:/docker-entrypoint-initdb.d/clickhouse-init.sh:ro
ulimits:
nofile:
soft: 262144
hard: 262144
healthcheck:
test:
- CMD-SHELL
- 'clickhouse-client --user "$$CLICKHOUSE_USER" --password "$$CLICKHOUSE_PASSWORD" --query "SELECT 1" >/dev/null'
interval: 5s
timeout: 5s
retries: 20
start_period: 30s
openruntimes-executor:
image: openruntimes/executor:1.1.2
# The executor looks up its own container by hostname to join the runtimes network.
hostname: openruntimes-executor
<<: *x-logging
restart: unless-stopped
stop_signal: SIGINT
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- appwrite-builds:/storage/builds:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
# Host mount necessary to share files between executor and runtimes.
# It's not possible to share mount file between 2 containers without host mount (copying is too slow)
- /tmp:/tmp:rw
environment:
- OPR_EXECUTOR_IMAGES=$_APP_EXECUTOR_IMAGES
- OPR_EXECUTOR_INACTIVE_THRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL
# Runtime containers join this stack's default Compose network so they can reach the API and executor.
# It only exists in standard deployments, hence isolated = false in template.toml.
- OPR_EXECUTOR_NETWORK=${COMPOSE_PROJECT_NAME:-appwrite}_default
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=$_APP_DOCKER_HUB_USERNAME
- OPR_EXECUTOR_DOCKER_HUB_PASSWORD=$_APP_DOCKER_HUB_PASSWORD
- OPR_EXECUTOR_ENV=$_APP_ENV
- OPR_EXECUTOR_RUNTIMES=$_APP_FUNCTIONS_RUNTIMES,$_APP_SITES_RUNTIMES
- OPR_EXECUTOR_SECRET=$_APP_EXECUTOR_SECRET
- OPR_EXECUTOR_RUNTIME_VERSIONS=v5
- OPEN_RUNTIMES_NFT=$_APP_OPEN_RUNTIMES_NFT
- OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
- OPR_EXECUTOR_CONNECTION_STORAGE=${_APP_EXECUTOR_CONNECTION_STORAGE:-local://localhost}
- OPR_EXECUTOR_CONNECTION_BUILD_CACHE_STORAGE=
healthcheck:
test:
- CMD-SHELL
- 'curl -fsS -H "Authorization: Bearer $$OPR_EXECUTOR_SECRET" http://localhost/v1/health >/dev/null'
interval: 5s
timeout: 3s
retries: 20
start_period: 5s
orchestrator:
image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.2
hostname: orchestrator
<<: *x-logging
restart: unless-stopped
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- ORCHESTRATOR_BACKEND=docker
# Build job containers join this stack's default Compose network so they can reach the API and orchestrator.
# It only exists in standard deployments, hence isolated = false in template.toml.
- ORCHESTRATOR_NETWORK=${COMPOSE_PROJECT_NAME:-appwrite}_default
- DOCKER_NETWORK=${COMPOSE_PROJECT_NAME:-appwrite}_default
- ARTIFACT_ENDPOINT=http://orchestrator:8080
- S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT:-}
- S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1}
- S3_ACCESS_KEY_ID=${_APP_STORAGE_S3_ACCESS_KEY:-}
- S3_SECRET_ACCESS_KEY=${_APP_STORAGE_S3_SECRET:-}
postgresql:
image: appwrite/postgres:0.1.0
<<: *x-logging
restart: unless-stopped
volumes:
- appwrite-postgresql:/var/lib/postgresql:rw
environment:
- POSTGRES_DB=${_APP_DB_SCHEMA}
- POSTGRES_USER=${_APP_DB_USER}
- POSTGRES_PASSWORD=${_APP_DB_PASS}
command:
- postgres
healthcheck:
test:
- CMD-SHELL
- pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA}
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
redis:
image: redis:7.4.7-alpine
<<: *x-logging
restart: unless-stopped
command: >
redis-server
--maxmemory 512mb
--maxmemory-policy allkeys-lru
--maxmemory-samples 5
volumes:
- appwrite-redis:/data:rw
healthcheck:
test:
- CMD
- redis-cli
- ping
interval: 5s
timeout: 5s
retries: 12
mariadb:
image: mariadb:10.11
<<: *x-logging
restart: unless-stopped
volumes:
- appwrite-mariadb:/var/lib/mysql:rw
environment:
- MYSQL_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
- MYSQL_DATABASE=${_APP_DB_SCHEMA}
- MYSQL_USER=${_APP_DB_USER}
- MYSQL_PASSWORD=${_APP_DB_PASS}
- MARIADB_AUTO_UPGRADE=1
command:
- mysqld
- --innodb-flush-method=fsync
healthcheck:
test:
- CMD-SHELL
- mariadb --protocol=tcp -h127.0.0.1 -uroot -p"$$MYSQL_ROOT_PASSWORD" --silent -e "SELECT 1"
interval: 5s
timeout: 5s
retries: 12
start_period: 10s
mongodb:
image: mongo:8.2.5
<<: *x-logging
restart: unless-stopped
volumes:
- appwrite-mongodb:/data/db
- appwrite-mongodb-keyfile:/data/keyfile
- ../files/mongo-init.js:/mongo-init.js:ro
- ../files/mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
entrypoint:
- /bin/bash
- /mongo-entrypoint.sh
healthcheck:
test: |
bash -c "
mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
try {
const hello = db.adminCommand({hello: 1});
if (hello.isWritablePrimary && hello.setName === 'rs0') {
quit(0);
}
} catch (e) {}
try {
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'mongodb:27017'}]});
} catch (e) {}
quit(1);
\" 2>/dev/null
"
interval: 10s
timeout: 10s
retries: 10
start_period: 60s
# Embeddings API (optional, resource heavy): set _APP_EMBEDDING=enabled and uncomment.
# appwrite-embedding:
# image: appwrite/embedding:0.3.1
# <<: *x-logging
# restart: unless-stopped
# environment:
# - EMBEDDING_MODELS=nomic-embed-text
# volumes:
# - appwrite-models:/home/embedder/models
# clamav:
# image: appwrite/clamav:1.2.0
# restart: unless-stopped
# volumes:
# - appwrite-uploads:/storage/uploads
volumes:
appwrite-postgresql:
appwrite-redis:
appwrite-clickhouse:
appwrite-cache:
appwrite-uploads:
appwrite-imports:
appwrite-certificates:
appwrite-functions:
appwrite-sites:
# Pinned name so the orchestrator can attach it to build workers by a stable name (see _APP_BUILDS_VOLUME).
appwrite-builds:
name: ${COMPOSE_PROJECT_NAME:-appwrite}_appwrite-builds
appwrite-config:
appwrite-mariadb:
appwrite-mongodb:
appwrite-mongodb-keyfile:
# appwrite-models: