Files
coolify/templates/compose/appwrite.yaml
T
Andras Bacsai 624bc098c6 fix(service): bump PHP templates to patched images and re-enable them
Update the templates that pinned images with a PHP release vulnerable
to CVE-2026-109618 and CVE-2026-109619, and remove their ignore flag:

- appwrite 2.6.1 (console 1.2.97, orchestrator 2.2.4, exiftool service)
- castopod 1.15.6
- freescout: move to nfrastack/freescout:2.2.21 (tiredofit image removed)
- grocy 4.7.1
- opnform 2.6.1 (nginx route for Nuxt icons)
- paymenter v1.5.9
- pterodactyl panel v1.15.2, wings v1.13.4
- snipe-it v8.8.3
2026-10-22 20:39:08 +02:00

828 lines
43 KiB
YAML

# documentation: https://appwrite.io/docs
# slogan: A backend-as-a-service platform that simplifies the web & mobile app development.
# category: backend
# tags: backend, backend-as-a-service, platform
# logo: svgs/appwrite.svg
# port: 80
services:
appwrite:
image: appwrite/appwrite:2.6.1
environment:
- SERVICE_URL_APPWRITE=/v1
- _APP_DNS_EXTERNAL=${_APP_DNS_EXTERNAL}
- _APP_ALLOWED_INTERNAL_ADDRESSES=${_APP_ALLOWED_INTERNAL_ADDRESSES}
- _APP_ENV=${_APP_ENV:-production}
- _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled}
- _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE
- _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2}
- _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2}
- _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180}
- _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage}
- _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources}
- _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600}
- _APP_EDITION=${_APP_EDITION:-self-hosted}
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_LOCALE=${_APP_LOCALE:-en}
- _APP_COMPRESSION_ENABLED=${_APP_COMPRESSION_ENABLED:-enabled}
- _APP_COMPRESSION_MIN_SIZE_BYTES=${_APP_COMPRESSION_MIN_SIZE_BYTES}
- _APP_CONSOLE_WHITELIST_ROOT=${_APP_CONSOLE_WHITELIST_ROOT:-enabled}
- _APP_CONSOLE_WHITELIST_EMAILS=${_APP_CONSOLE_WHITELIST_EMAILS}
- _APP_CONSOLE_SESSION_ALERTS=${_APP_CONSOLE_SESSION_ALERTS:-disabled}
- _APP_CONSOLE_WHITELIST_IPS=${_APP_CONSOLE_WHITELIST_IPS}
- _APP_CONSOLE_HOSTNAMES=${_APP_CONSOLE_HOSTNAMES}
- _APP_CONSOLE_SCHEMA=${_APP_CONSOLE_SCHEMA:-appwriteio}
- _APP_CONSOLE_GITHUB_APP_ID=${_APP_CONSOLE_GITHUB_APP_ID}
- _APP_CONSOLE_GITHUB_SECRET=${_APP_CONSOLE_GITHUB_SECRET}
- _APP_CONSOLE_GITLAB_APP_ID=${_APP_CONSOLE_GITLAB_APP_ID}
- _APP_CONSOLE_GITLAB_SECRET=${_APP_CONSOLE_GITLAB_SECRET}
- _APP_CONSOLE_GITLAB_ENDPOINT=${_APP_CONSOLE_GITLAB_ENDPOINT}
- _APP_CONSOLE_BITBUCKET_APP_ID=${_APP_CONSOLE_BITBUCKET_APP_ID}
- _APP_CONSOLE_BITBUCKET_SECRET=${_APP_CONSOLE_BITBUCKET_SECRET}
- _APP_CONSOLE_GOOGLE_APP_ID=${_APP_CONSOLE_GOOGLE_APP_ID}
- _APP_CONSOLE_GOOGLE_SECRET=${_APP_CONSOLE_GOOGLE_SECRET}
- _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite}
- _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-noreply@appwrite.io}
- _APP_SYSTEM_TEAM_EMAIL=${_APP_SYSTEM_TEAM_EMAIL:-team@appwrite.io}
- _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-security@appwrite.io}
- _APP_SYSTEM_RESPONSE_FORMAT=${_APP_SYSTEM_RESPONSE_FORMAT}
- _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled}
- _APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=${_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS}
- _APP_OPTIONS_ROUTER_PROTECTION=${_APP_OPTIONS_ROUTER_PROTECTION:-disabled}
- _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled}
- _APP_OPTIONS_ROUTER_FORCE_HTTPS=${_APP_OPTIONS_ROUTER_FORCE_HTTPS:-disabled}
- _APP_ROUTER_AUTO_CERTIFICATES=${_APP_ROUTER_AUTO_CERTIFICATES:-disabled}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_NOTIFICATIONS_TRACKING_SECRET=$SERVICE_PASSWORD_64_NOTIFICATIONS
- _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE}
- _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN}
- _APP_CONSOLE_URL=${_APP_CONSOLE_URL}
- _APP_CONSOLE_TRUSTED_PROJECTS=${_APP_CONSOLE_TRUSTED_PROJECTS}
- _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost}
- _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1}
- _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1}
- _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA}
- _APP_DNS=${_APP_DNS}
- _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE}
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql}
- _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql}
- _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432}
- _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite}
- _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES
- _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb}
- _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB}
- _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017}
- _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB}
- _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB}
- _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB}
- _APP_SMTP_HOST=${_APP_SMTP_HOST}
- _APP_SMTP_PORT=${_APP_SMTP_PORT}
- _APP_SMTP_SECURE=${_APP_SMTP_SECURE}
- _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME}
- _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD}
- _APP_STORAGE_LIMIT=${_APP_STORAGE_LIMIT:-30000000}
- _APP_STORAGE_PREVIEW_LIMIT=${_APP_STORAGE_PREVIEW_LIMIT:-20000000}
- _APP_AUTOGRAVITY_HOST=${_APP_AUTOGRAVITY_HOST}
- _APP_EXIFTOOL_HOST=${_APP_EXIFTOOL_HOST:-http://appwrite-exiftool:8080}
- _APP_STORAGE_ANTIVIRUS=${_APP_STORAGE_ANTIVIRUS:-disabled}
- _APP_STORAGE_ANTIVIRUS_HOST=${_APP_STORAGE_ANTIVIRUS_HOST}
- _APP_STORAGE_ANTIVIRUS_PORT=${_APP_STORAGE_ANTIVIRUS_PORT:-3310}
- _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local}
- _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY}
- _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET}
- _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1}
- _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET}
- _APP_STORAGE_S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT}
- _APP_STORAGE_S3_PATH_STYLE=${_APP_STORAGE_S3_PATH_STYLE}
- _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY}
- _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET}
- _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1}
- _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET}
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY}
- _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET}
- _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004}
- _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET}
- _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY}
- _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET}
- _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1}
- _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET}
- _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY}
- _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET}
- _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1}
- _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET}
- _APP_COMPUTE_SIZE_LIMIT=${_APP_COMPUTE_SIZE_LIMIT:-30000000}
- _APP_COMPUTE_BUILD_SIZE_LIMIT=${_APP_COMPUTE_BUILD_SIZE_LIMIT:-2000000000}
- _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900}
- _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900}
- _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-2700}
- _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0}
- _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0}
- _APP_FUNCTIONS_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-22}
- _APP_SITES_RUNTIMES=${_APP_SITES_RUNTIMES:-static-1,node-22}
- _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE}
- _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR
- _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://openruntimes-executor/v1}
- _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME}_appwrite-builds
- _APP_JOBS_HOST=${_APP_JOBS_HOST:-http://orchestrator:8080}
- _APP_JOBS_SECRET=$SERVICE_PASSWORD_64_JOBS
- _APP_JOBS_ENDPOINT=${_APP_JOBS_ENDPOINT:-http://appwrite}
- _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_LOCKING_ENABLED=${_APP_LOCKING_ENABLED:-enabled}
- _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL:-86400}
- _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600}
- _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000}
- _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400}
- _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600}
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=${_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE}
- _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400}
- _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER}
- _APP_SMS_FROM=${_APP_SMS_FROM}
- _APP_GRAPHQL_INTROSPECTION=${_APP_GRAPHQL_INTROSPECTION:-enabled}
- _APP_GRAPHQL_MAX_BATCH_SIZE=${_APP_GRAPHQL_MAX_BATCH_SIZE:-10}
- _APP_GRAPHQL_MAX_COMPLEXITY=${_APP_GRAPHQL_MAX_COMPLEXITY:-250}
- _APP_GRAPHQL_MAX_DEPTH=${_APP_GRAPHQL_MAX_DEPTH:-3}
- _APP_VCS_GITHUB_APP_NAME=${_APP_VCS_GITHUB_APP_NAME}
- _APP_VCS_GITHUB_PRIVATE_KEY=${_APP_VCS_GITHUB_PRIVATE_KEY}
- _APP_VCS_GITHUB_APP_ID=${_APP_VCS_GITHUB_APP_ID}
- _APP_VCS_GITHUB_WEBHOOK_SECRET=${_APP_VCS_GITHUB_WEBHOOK_SECRET}
- _APP_VCS_GITHUB_CLIENT_SECRET=${_APP_VCS_GITHUB_CLIENT_SECRET}
- _APP_VCS_GITHUB_CLIENT_ID=${_APP_VCS_GITHUB_CLIENT_ID}
- _APP_VCS_GITEA_ENDPOINT=${_APP_VCS_GITEA_ENDPOINT}
- _APP_VCS_GITEA_BROWSER_ENDPOINT=${_APP_VCS_GITEA_BROWSER_ENDPOINT}
- _APP_VCS_GITEA_CLIENT_ID=${_APP_VCS_GITEA_CLIENT_ID}
- _APP_VCS_GITEA_CLIENT_SECRET=${_APP_VCS_GITEA_CLIENT_SECRET}
- _APP_VCS_GITEA_WEBHOOK_SECRET=${_APP_VCS_GITEA_WEBHOOK_SECRET}
- _APP_VCS_GITLAB_ENDPOINT=${_APP_VCS_GITLAB_ENDPOINT}
- _APP_VCS_GITLAB_CLIENT_ID=${_APP_VCS_GITLAB_CLIENT_ID}
- _APP_VCS_GITLAB_CLIENT_SECRET=${_APP_VCS_GITLAB_CLIENT_SECRET}
- _APP_VCS_GITLAB_WEBHOOK_SECRET=${_APP_VCS_GITLAB_WEBHOOK_SECRET}
- _APP_VCS_BITBUCKET_CLIENT_ID=${_APP_VCS_BITBUCKET_CLIENT_ID}
- _APP_VCS_BITBUCKET_CLIENT_SECRET=${_APP_VCS_BITBUCKET_CLIENT_SECRET}
- _APP_VCS_BITBUCKET_WEBHOOK_SECRET=${_APP_VCS_BITBUCKET_WEBHOOK_SECRET}
- _APP_VCS_ORIGIN_CLIENT_ID=${_APP_VCS_ORIGIN_CLIENT_ID}
- _APP_VCS_ORIGIN_PRIVATE_KEY=${_APP_VCS_ORIGIN_PRIVATE_KEY}
- _APP_VCS_ENTIRE_PLUGIN=${_APP_VCS_ENTIRE_PLUGIN}
- _APP_VCS_ENTIRE_PRIVATE_KEY=${_APP_VCS_ENTIRE_PRIVATE_KEY}
- _APP_VCS_ENTIRE_ISSUER=${_APP_VCS_ENTIRE_ISSUER}
- _APP_VCS_ENTIRE_ENDPOINT=${_APP_VCS_ENTIRE_ENDPOINT}
- _APP_VCS_WEBHOOK_URL=${_APP_VCS_WEBHOOK_URL}
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID}
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET}
- _APP_CONSOLE_COUNTRIES_DENYLIST=${_APP_CONSOLE_COUNTRIES_DENYLIST}
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
- _APP_DATABASE_SHARED_NAMESPACE=${_APP_DATABASE_SHARED_NAMESPACE}
- _APP_FUNCTIONS_CREATION_ABUSE_LIMIT=${_APP_FUNCTIONS_CREATION_ABUSE_LIMIT}
- _APP_CUSTOM_DOMAIN_DENY_LIST=${_APP_CUSTOM_DOMAIN_DENY_LIST:-example.com,test.com,app.example.com}
- _APP_TRUSTED_HEADERS=${_APP_TRUSTED_HEADERS:-x-forwarded-for}
- _APP_TRUSTED_PROXIES=${_APP_TRUSTED_PROXIES:-127.0.0.1,::1,10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16}
- _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite}
- _APP_GEO_SECRET=$SERVICE_PASSWORD_64_GEO
- _APP_GEO_ENDPOINT=${_APP_GEO_ENDPOINT:-http://appwrite-geo/v1}
- _APP_PWNED_PASSWORDS_DSN=${_APP_PWNED_PASSWORDS_DSN:-none://localhost}
- _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100}
- _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled}
- _APP_VECTORSDB=${_APP_VECTORSDB:-disabled}
- _APP_EMBEDDING=${_APP_EMBEDDING:-disabled}
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:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
appwrite-clickhouse:
condition: service_healthy
appwrite-geo:
condition: service_healthy
appwrite-exiftool:
condition: service_started
healthcheck:
test: ["CMD-SHELL", "test -f /tmp/.appwrite-ready && curl -fsS -o /dev/null http://localhost/v1/health/version || exit 1"]
interval: 20s
timeout: 5s
retries: 6
start_period: 120s
appwrite-console:
image: appwrite/new:1.2.97-self-hosted
environment:
- SERVICE_URL_APPWRITE_3000=/
- VITE_CONSOLE_PROFILE=self-hosted
- VITE_APPWRITE_VERSION=2.6.1
- APPWRITE_ENDPOINT_SAME_ORIGIN=true
depends_on:
appwrite:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "bun -e \"fetch('http://localhost:3000').then(r => process.exit(r.status < 500 ? 0 : 1)).catch(() => process.exit(1))\""]
interval: 20s
timeout: 5s
retries: 3
appwrite-realtime:
image: appwrite/appwrite:2.6.1
entrypoint: realtime
environment:
- SERVICE_URL_APPWRITE=/v1/realtime
- _APP_ENV=${_APP_ENV:-production}
- _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled}
- _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage}
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_OPTIONS_ABUSE=${_APP_OPTIONS_ABUSE:-enabled}
- _APP_OPTIONS_ROUTER_PROTECTION=${_APP_OPTIONS_ROUTER_PROTECTION:-disabled}
- _APP_CONSOLE_HOSTNAMES=${_APP_CONSOLE_HOSTNAMES}
- _APP_REALTIME_TAIL_RATE=${_APP_REALTIME_TAIL_RATE:-50}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_TRUSTED_HEADERS=${_APP_TRUSTED_HEADERS:-x-forwarded-for}
- _APP_TRUSTED_PROXIES=${_APP_TRUSTED_PROXIES:-127.0.0.1,::1,10.0.0.0/8,100.64.0.0/10,172.16.0.0/12,192.168.0.0/16}
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql}
- _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql}
- _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432}
- _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite}
- _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES
- _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb}
- _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB}
- _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017}
- _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB}
- _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB}
- _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB}
- _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
- _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100}
- _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled}
- _APP_VECTORSDB=${_APP_VECTORSDB:-disabled}
- _APP_EMBEDDING=${_APP_EMBEDDING:-disabled}
depends_on:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "curl -s localhost > /dev/null || exit 1"]
interval: 20s
timeout: 5s
retries: 3
appwrite-worker:
image: appwrite/appwrite:2.6.1
entrypoint: worker
environment:
- _APP_ENV=${_APP_ENV:-production}
- _APP_DNS_EXTERNAL=${_APP_DNS_EXTERNAL}
- _APP_ALLOWED_INTERNAL_ADDRESSES=${_APP_ALLOWED_INTERNAL_ADDRESSES}
- _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled}
- _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE
- _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2}
- _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2}
- _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180}
- _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage}
- _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources}
- _APP_MAINTENANCE_QUEUE_NAME=${_APP_MAINTENANCE_QUEUE_NAME:-v1-maintenance}
- _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600}
- _APP_WORKERS_NUM=1
- _APP_WORKER_MAX_COROUTINES=79
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_EMAIL_SECURITY=${_APP_EMAIL_SECURITY:-security@appwrite.io}
- _APP_EMAIL_CERTIFICATES=${_APP_EMAIL_CERTIFICATES}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_VECTORSDB=${_APP_DB_ADAPTER_VECTORSDB:-postgresql}
- _APP_DB_HOST_VECTORSDB=${_APP_DB_HOST_VECTORSDB:-appwrite-postgresql}
- _APP_DB_PORT_VECTORSDB=${_APP_DB_PORT_VECTORSDB:-5432}
- _APP_DB_SCHEMA_VECTORSDB=${_APP_DB_SCHEMA_VECTORSDB:-appwrite}
- _APP_DB_USER_VECTORSDB=$SERVICE_USER_POSTGRES
- _APP_DB_PASS_VECTORSDB=$SERVICE_PASSWORD_POSTGRES
- _APP_DB_ADAPTER_DOCUMENTSDB=${_APP_DB_ADAPTER_DOCUMENTSDB:-mongodb}
- _APP_DB_HOST_DOCUMENTSDB=${_APP_DB_HOST_DOCUMENTSDB}
- _APP_DB_PORT_DOCUMENTSDB=${_APP_DB_PORT_DOCUMENTSDB:-27017}
- _APP_DB_SCHEMA_DOCUMENTSDB=${_APP_DB_SCHEMA_DOCUMENTSDB}
- _APP_DB_USER_DOCUMENTSDB=${_APP_DB_USER_DOCUMENTSDB}
- _APP_DB_PASS_DOCUMENTSDB=${_APP_DB_PASS_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB=${_APP_CONNECTIONS_DATABASE_DOCUMENTSDB}
- _APP_CONNECTIONS_DATABASE_VECTORSDB=${_APP_CONNECTIONS_DATABASE_VECTORSDB}
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_LOGGING_CONFIG=${_APP_LOGGING_CONFIG}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_QUEUE_NAME=${_APP_QUEUE_NAME}
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
- _APP_CONSOLE_URL=${_APP_CONSOLE_URL}
- _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN}
- _APP_CONSOLE_TRUSTED_PROJECTS=${_APP_CONSOLE_TRUSTED_PROJECTS}
- _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost}
- _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1}
- _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1}
- _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA}
- _APP_DNS=${_APP_DNS}
- _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE}
- _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled}
- _APP_OPTIONS_ROUTER_FORCE_HTTPS=${_APP_OPTIONS_ROUTER_FORCE_HTTPS:-disabled}
- _APP_WEBHOOK_MAX_FAILED_ATTEMPTS=${_APP_WEBHOOK_MAX_FAILED_ATTEMPTS:-10}
- _APP_STORAGE_DEVICE=${_APP_STORAGE_DEVICE:-local}
- _APP_STORAGE_S3_ACCESS_KEY=${_APP_STORAGE_S3_ACCESS_KEY}
- _APP_STORAGE_S3_SECRET=${_APP_STORAGE_S3_SECRET}
- _APP_STORAGE_S3_REGION=${_APP_STORAGE_S3_REGION:-us-east-1}
- _APP_STORAGE_S3_BUCKET=${_APP_STORAGE_S3_BUCKET}
- _APP_STORAGE_S3_ENDPOINT=${_APP_STORAGE_S3_ENDPOINT}
- _APP_STORAGE_S3_PATH_STYLE=${_APP_STORAGE_S3_PATH_STYLE}
- _APP_STORAGE_DO_SPACES_ACCESS_KEY=${_APP_STORAGE_DO_SPACES_ACCESS_KEY}
- _APP_STORAGE_DO_SPACES_SECRET=${_APP_STORAGE_DO_SPACES_SECRET}
- _APP_STORAGE_DO_SPACES_REGION=${_APP_STORAGE_DO_SPACES_REGION:-us-east-1}
- _APP_STORAGE_DO_SPACES_BUCKET=${_APP_STORAGE_DO_SPACES_BUCKET}
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY=${_APP_STORAGE_BACKBLAZE_ACCESS_KEY}
- _APP_STORAGE_BACKBLAZE_SECRET=${_APP_STORAGE_BACKBLAZE_SECRET}
- _APP_STORAGE_BACKBLAZE_REGION=${_APP_STORAGE_BACKBLAZE_REGION:-us-west-004}
- _APP_STORAGE_BACKBLAZE_BUCKET=${_APP_STORAGE_BACKBLAZE_BUCKET}
- _APP_STORAGE_LINODE_ACCESS_KEY=${_APP_STORAGE_LINODE_ACCESS_KEY}
- _APP_STORAGE_LINODE_SECRET=${_APP_STORAGE_LINODE_SECRET}
- _APP_STORAGE_LINODE_REGION=${_APP_STORAGE_LINODE_REGION:-eu-central-1}
- _APP_STORAGE_LINODE_BUCKET=${_APP_STORAGE_LINODE_BUCKET}
- _APP_STORAGE_WASABI_ACCESS_KEY=${_APP_STORAGE_WASABI_ACCESS_KEY}
- _APP_STORAGE_WASABI_SECRET=${_APP_STORAGE_WASABI_SECRET}
- _APP_STORAGE_WASABI_REGION=${_APP_STORAGE_WASABI_REGION:-eu-central-1}
- _APP_STORAGE_WASABI_BUCKET=${_APP_STORAGE_WASABI_BUCKET}
- _APP_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR
- _APP_EXECUTOR_HOST=${_APP_EXECUTOR_HOST:-http://openruntimes-executor/v1}
- _APP_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME}
- _APP_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD}
- _APP_FUNCTIONS_TIMEOUT=${_APP_FUNCTIONS_TIMEOUT:-900}
- _APP_SITES_TIMEOUT=${_APP_SITES_TIMEOUT:-900}
- _APP_COMPUTE_BUILD_TIMEOUT=${_APP_COMPUTE_BUILD_TIMEOUT:-2700}
- _APP_COMPUTE_CPUS=${_APP_COMPUTE_CPUS:-0}
- _APP_COMPUTE_MEMORY=${_APP_COMPUTE_MEMORY:-0}
- _APP_OPEN_RUNTIMES_NFT=${_APP_OPEN_RUNTIMES_NFT:-enabled}
- _APP_COMPUTE_SIZE_LIMIT=${_APP_COMPUTE_SIZE_LIMIT:-30000000}
- _APP_COMPUTE_BUILD_SIZE_LIMIT=${_APP_COMPUTE_BUILD_SIZE_LIMIT:-2000000000}
- _APP_VCS_GITHUB_APP_NAME=${_APP_VCS_GITHUB_APP_NAME}
- _APP_VCS_GITHUB_PRIVATE_KEY=${_APP_VCS_GITHUB_PRIVATE_KEY}
- _APP_VCS_GITHUB_APP_ID=${_APP_VCS_GITHUB_APP_ID}
- _APP_VCS_GITEA_ENDPOINT=${_APP_VCS_GITEA_ENDPOINT}
- _APP_VCS_GITEA_BROWSER_ENDPOINT=${_APP_VCS_GITEA_BROWSER_ENDPOINT}
- _APP_VCS_GITEA_CLIENT_ID=${_APP_VCS_GITEA_CLIENT_ID}
- _APP_VCS_GITEA_CLIENT_SECRET=${_APP_VCS_GITEA_CLIENT_SECRET}
- _APP_VCS_GITEA_WEBHOOK_SECRET=${_APP_VCS_GITEA_WEBHOOK_SECRET}
- _APP_VCS_GITLAB_ENDPOINT=${_APP_VCS_GITLAB_ENDPOINT}
- _APP_VCS_GITLAB_CLIENT_ID=${_APP_VCS_GITLAB_CLIENT_ID}
- _APP_VCS_GITLAB_CLIENT_SECRET=${_APP_VCS_GITLAB_CLIENT_SECRET}
- _APP_VCS_GITLAB_WEBHOOK_SECRET=${_APP_VCS_GITLAB_WEBHOOK_SECRET}
- _APP_VCS_BITBUCKET_CLIENT_ID=${_APP_VCS_BITBUCKET_CLIENT_ID}
- _APP_VCS_BITBUCKET_CLIENT_SECRET=${_APP_VCS_BITBUCKET_CLIENT_SECRET}
- _APP_VCS_BITBUCKET_WEBHOOK_SECRET=${_APP_VCS_BITBUCKET_WEBHOOK_SECRET}
- _APP_VCS_ORIGIN_CLIENT_ID=${_APP_VCS_ORIGIN_CLIENT_ID}
- _APP_VCS_ORIGIN_PRIVATE_KEY=${_APP_VCS_ORIGIN_PRIVATE_KEY}
- _APP_VCS_ENTIRE_PLUGIN=${_APP_VCS_ENTIRE_PLUGIN}
- _APP_VCS_ENTIRE_PRIVATE_KEY=${_APP_VCS_ENTIRE_PRIVATE_KEY}
- _APP_VCS_ENTIRE_ISSUER=${_APP_VCS_ENTIRE_ISSUER}
- _APP_VCS_ENTIRE_ENDPOINT=${_APP_VCS_ENTIRE_ENDPOINT}
- _APP_VCS_WEBHOOK_URL=${_APP_VCS_WEBHOOK_URL}
- _APP_BUILDS_VOLUME=${COMPOSE_PROJECT_NAME}_appwrite-builds
- _APP_JOBS_HOST=${_APP_JOBS_HOST:-http://orchestrator:8080}
- _APP_JOBS_SECRET=$SERVICE_PASSWORD_64_JOBS
- _APP_JOBS_ENDPOINT=${_APP_JOBS_ENDPOINT:-http://appwrite}
- _APP_BROWSER_HOST=${_APP_BROWSER_HOST:-http://appwrite-browser:3000/v1}
- _APP_WORKER_SCREENSHOTS_ROUTER=${_APP_WORKER_SCREENSHOTS_ROUTER:-http://appwrite}
- _APP_NOTIFICATIONS_TRACKING_SECRET=$SERVICE_PASSWORD_64_NOTIFICATIONS
- _APP_SYSTEM_EMAIL_NAME=${_APP_SYSTEM_EMAIL_NAME:-Appwrite}
- _APP_SYSTEM_EMAIL_ADDRESS=${_APP_SYSTEM_EMAIL_ADDRESS:-noreply@appwrite.io}
- _APP_SMTP_HOST=${_APP_SMTP_HOST}
- _APP_SMTP_PORT=${_APP_SMTP_PORT}
- _APP_SMTP_SECURE=${_APP_SMTP_SECURE}
- _APP_SMTP_USERNAME=${_APP_SMTP_USERNAME}
- _APP_SMTP_PASSWORD=${_APP_SMTP_PASSWORD}
- _APP_SMS_FROM=${_APP_SMS_FROM}
- _APP_SMS_PROVIDER=${_APP_SMS_PROVIDER}
- _APP_SMS_PROJECTS_DENY_LIST=${_APP_SMS_PROJECTS_DENY_LIST}
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID=${_APP_MIGRATIONS_FIREBASE_CLIENT_ID}
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=${_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET}
- _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite}
- _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600}
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=${_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE}
- _APP_LIMIT_DATABASE_BATCH=${_APP_LIMIT_DATABASE_BATCH:-100}
- _APP_DOCUMENTSDB=${_APP_DOCUMENTSDB:-disabled}
- _APP_VECTORSDB=${_APP_VECTORSDB:-disabled}
- _APP_EMBEDDING=${_APP_EMBEDDING:-disabled}
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:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
appwrite-clickhouse:
condition: service_healthy
openruntimes-executor:
condition: service_healthy
orchestrator:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"]
interval: 20s
timeout: 5s
retries: 3
appwrite-task-scheduler:
image: appwrite/appwrite:2.6.1
entrypoint: schedule
environment:
- _APP_ENV=${_APP_ENV:-production}
- _APP_USAGE_STATS=${_APP_USAGE_STATS:-enabled}
- _APP_USAGE_PASS=$SERVICE_PASSWORD_CLICKHOUSE
- _APP_CONNECTIONS_DB_USAGE=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_USAGE=${_APP_POOL_SIZE_USAGE:-2}
- _APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:$SERVICE_PASSWORD_CLICKHOUSE@appwrite-clickhouse:8123/appwrite
- _APP_POOL_SIZE_EXECUTIONS=${_APP_POOL_SIZE_EXECUTIONS:-2}
- _APP_MAINTENANCE_RETENTION_USAGE_TTL=${_APP_MAINTENANCE_RETENTION_USAGE_TTL:-180}
- _APP_STATS_USAGE_QUEUE_NAME=${_APP_STATS_USAGE_QUEUE_NAME:-v1-stats-usage}
- _APP_STATS_RESOURCES_QUEUE_NAME=${_APP_STATS_RESOURCES_QUEUE_NAME:-v1-stats-resources}
- _APP_MAINTENANCE_QUEUE_NAME=${_APP_MAINTENANCE_QUEUE_NAME:-v1-maintenance}
- _APP_STATS_RESOURCES_INTERVAL=${_APP_STATS_RESOURCES_INTERVAL:-3600}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_WORKER_MAX_COROUTINES=8
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_OPTIONS_FORCE_HTTPS=${_APP_OPTIONS_FORCE_HTTPS:-disabled}
- _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE}
- _APP_CONSOLE_DOMAIN=${_APP_CONSOLE_DOMAIN}
- _APP_CONSOLE_SCHEMA=${_APP_CONSOLE_SCHEMA:-appwriteio}
- _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE}
- _APP_MIGRATION_HOST=${_APP_MIGRATION_HOST:-appwrite}
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
- _APP_FUNCTIONS_SCHEDULE_SPREAD=${_APP_FUNCTIONS_SCHEDULE_SPREAD:-0}
- _APP_MAINTENANCE_INACTIVE_INTERVAL=${_APP_MAINTENANCE_INACTIVE_INTERVAL:-604800}
depends_on:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"]
interval: 20s
timeout: 5s
retries: 3
appwrite-task-maintenance:
image: appwrite/appwrite:2.6.1
entrypoint: maintenance
environment:
- _APP_ENV=${_APP_ENV:-production}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost}
- _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1}
- _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1}
- _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA}
- _APP_DNS=${_APP_DNS}
- _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE}
- _APP_EDITION=${_APP_EDITION:-self-hosted}
- _APP_ROUTER_AUTO_CERTIFICATES=${_APP_ROUTER_AUTO_CERTIFICATES:-disabled}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_MAINTENANCE_INTERVAL=${_APP_MAINTENANCE_INTERVAL:-86400}
- _APP_MAINTENANCE_RETENTION_EXECUTION=${_APP_MAINTENANCE_RETENTION_EXECUTION:-1209600}
- _APP_MAINTENANCE_RETENTION_CACHE=${_APP_MAINTENANCE_RETENTION_CACHE:-2592000}
- _APP_MAINTENANCE_RETENTION_ABUSE=${_APP_MAINTENANCE_RETENTION_ABUSE:-86400}
- _APP_MAINTENANCE_RETENTION_AUDIT=${_APP_MAINTENANCE_RETENTION_AUDIT:-1209600}
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=${_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE}
- _APP_MAINTENANCE_RETENTION_SCHEDULES=${_APP_MAINTENANCE_RETENTION_SCHEDULES:-86400}
- _APP_MAINTENANCE_START_TIME=${_APP_MAINTENANCE_START_TIME}
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
depends_on:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"]
interval: 20s
timeout: 5s
retries: 3
appwrite-task-interval:
image: appwrite/appwrite:2.6.1
entrypoint: interval
environment:
- _APP_ENV=${_APP_ENV:-production}
- _APP_LOGGING_FORMAT=${_APP_LOGGING_FORMAT:-pretty}
- _APP_WORKER_PER_CORE=${_APP_WORKER_PER_CORE:-6}
- _APP_DOMAIN=${_APP_DOMAIN:-$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_TARGET_CNAME=${_APP_DOMAIN_TARGET_CNAME:-localhost}
- _APP_DOMAIN_TARGET_AAAA=${_APP_DOMAIN_TARGET_AAAA:-::1}
- _APP_DOMAIN_TARGET_A=${_APP_DOMAIN_TARGET_A:-127.0.0.1}
- _APP_DOMAIN_TARGET_CAA=${_APP_DOMAIN_TARGET_CAA}
- _APP_DNS=${_APP_DNS}
- _APP_DOMAIN_FUNCTIONS=${_APP_DOMAIN_FUNCTIONS:-functions.$SERVICE_FQDN_APPWRITE}
- _APP_DOMAIN_SITES=${_APP_DOMAIN_SITES:-sites.$SERVICE_FQDN_APPWRITE}
- _APP_OPENSSL_KEY_V1=$SERVICE_PASSWORD_64_APPWRITE
- _APP_REDIS_HOST=${_APP_REDIS_HOST:-appwrite-redis}
- _APP_REDIS_PORT=${_APP_REDIS_PORT:-6379}
- _APP_REDIS_USER=${_APP_REDIS_USER}
- _APP_REDIS_PASS=${_APP_REDIS_PASS}
- _APP_DB_ADAPTER=${_APP_DB_ADAPTER:-postgresql}
- _APP_DB_HOST=${_APP_DB_HOST:-appwrite-postgresql}
- _APP_DB_PORT=${_APP_DB_PORT:-5432}
- _APP_DB_SCHEMA=${_APP_DB_SCHEMA:-appwrite}
- _APP_DB_USER=$SERVICE_USER_POSTGRES
- _APP_DB_PASS=$SERVICE_PASSWORD_POSTGRES
- _APP_DATABASE_SHARED_TABLES=${_APP_DATABASE_SHARED_TABLES}
- _APP_INTERVAL_DOMAIN_VERIFICATION=${_APP_INTERVAL_DOMAIN_VERIFICATION:-120}
- _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=${_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS:-300}
depends_on:
appwrite-postgresql:
condition: service_healthy
appwrite-redis:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "ps aux | grep -q '[p]hp' || exit 1"]
interval: 20s
timeout: 5s
retries: 3
appwrite-geo:
image: appwrite/geo:0.3.2
environment:
- GEO_SECRET=$SERVICE_PASSWORD_64_GEO
healthcheck:
test: ["CMD-SHELL", "php -r \"exit(json_decode(file_get_contents('http://localhost/v1/health'))->status === 'ok' ? 0 : 1);\""]
interval: 20s
timeout: 5s
retries: 3
start_period: 10s
appwrite-browser:
image: appwrite/browser:0.3.6
environment:
- ALLOWED_HOSTS=appwrite
dns:
- 1.1.1.1
- 8.8.8.8
exclude_from_hc: true
appwrite-exiftool:
image: ghcr.io/appwrite/exiftool:0.1.0
healthcheck:
test: ["CMD", "healthcheck"]
interval: 20s
timeout: 5s
retries: 3
start_period: 15s
openruntimes-executor:
image: openruntimes/executor:1.1.2
hostname: openruntimes-executor
stop_signal: SIGINT
environment:
- OPR_EXECUTOR_IMAGES=${_APP_EXECUTOR_IMAGES:-openruntimes/node:v5-22,openruntimes/static:v5-1}
- OPR_EXECUTOR_INACTIVE_THRESHOLD=${_APP_COMPUTE_INACTIVE_THRESHOLD:-600}
- OPR_EXECUTOR_MAINTENANCE_INTERVAL=${_APP_COMPUTE_MAINTENANCE_INTERVAL:-600}
- OPR_EXECUTOR_NETWORK=${_APP_COMPUTE_RUNTIMES_NETWORK:-runtimes}
- OPR_EXECUTOR_DOCKER_HUB_USERNAME=${_APP_DOCKER_HUB_USERNAME}
- OPR_EXECUTOR_DOCKER_HUB_PASSWORD=${_APP_DOCKER_HUB_PASSWORD}
- OPR_EXECUTOR_ENV=${_APP_ENV:-production}
- OPR_EXECUTOR_RUNTIMES=${_APP_FUNCTIONS_RUNTIMES:-node-22},${_APP_SITES_RUNTIMES:-static-1,node-22}
- OPR_EXECUTOR_SECRET=$SERVICE_PASSWORD_64_EXECUTOR
- OPR_EXECUTOR_RUNTIME_VERSIONS=v5
- OPEN_RUNTIMES_NFT=${_APP_OPEN_RUNTIMES_NFT:-enabled}
- OPR_EXECUTOR_LOGGING_CONFIG=${_APP_LOGGING_CONFIG}
- OPR_EXECUTOR_CONNECTION_STORAGE=${_APP_EXECUTOR_CONNECTION_STORAGE:-local://localhost}
- OPR_EXECUTOR_CONNECTION_BUILD_CACHE_STORAGE=
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- appwrite-builds:/storage/builds:rw
- appwrite-functions:/storage/functions:rw
- appwrite-sites:/storage/sites:rw
- /tmp:/tmp:rw
healthcheck:
test: ["CMD-SHELL", "curl -fsS -H \"Authorization: Bearer $$OPR_EXECUTOR_SECRET\" http://localhost/v1/health > /dev/null || exit 1"]
interval: 20s
timeout: 5s
retries: 3
start_period: 10s
orchestrator:
image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.4
hostname: orchestrator
user: root
environment:
- ORCHESTRATOR_BACKEND=docker
- ORCHESTRATOR_NETWORK=${COMPOSE_PROJECT_NAME}
- DOCKER_NETWORK=${COMPOSE_PROJECT_NAME}
- 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}
volumes:
- /var/run/docker.sock:/var/run/docker.sock
healthcheck:
test: ["CMD", "/ko-app/orchestrator", "-check-ready"]
interval: 20s
timeout: 5s
retries: 3
start_period: 10s
appwrite-postgresql:
image: appwrite/postgres:0.1.0
shm_size: 1g
environment:
- POSTGRES_DB=${_APP_DB_SCHEMA:-appwrite}
- POSTGRES_USER=$SERVICE_USER_POSTGRES
- POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES
volumes:
- appwrite-postgresql:/var/lib/postgresql:rw
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
start_period: 10s
appwrite-redis:
image: redis:7.4.7-alpine
command: redis-server --maxmemory 512mb --maxmemory-policy allkeys-lru --maxmemory-samples 5
volumes:
- appwrite-redis:/data:rw
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 20s
timeout: 10s
retries: 5
appwrite-clickhouse:
image: clickhouse/clickhouse-server:26.4.3-alpine
environment:
- CLICKHOUSE_DB=appwrite
- CLICKHOUSE_USER=appwrite
- CLICKHOUSE_PASSWORD=$SERVICE_PASSWORD_CLICKHOUSE
- CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1
- CLICKHOUSE_ALWAYS_RUN_INITDB_SCRIPTS=1
volumes:
- appwrite-clickhouse:/var/lib/clickhouse:rw
- type: bind
source: ./clickhouse-config.xml
target: /etc/clickhouse-server/config.d/appwrite.xml
read_only: true
content: |
<?xml version="1.0"?>
<!--
Retention for ClickHouse's own system log tables.
Every <ttl> in the image's config.xml sits inside an XML comment, so these
tables keep every row forever, and the metric ones add a row per second
whether or not the instance serves traffic. Left alone they outgrow the
usage data they sit next to and fill the volume.
When a window here changes, ClickHouse replaces the table on the next
restart and keeps the old one, rows and all, as <log>_<N>.
clickhouse-init.sh gives those old tables the same window.
-->
<clickhouse>
<!-- The metric, trace and profile logs sample the server every second whether
or not Appwrite serves traffic, and nothing reads them back, so their
writes and the merges behind them are pure overhead. -->
<asynchronous_metric_log remove="1"/>
<metric_log remove="1"/>
<histogram_metric_log remove="1"/>
<query_metric_log remove="1"/>
<processors_profile_log remove="1"/>
<trace_log remove="1"/>
<!-- text_log repeats the server log the container already writes. -->
<text_log remove="1"/>
<!-- Kept for debugging, capped so they cannot fill the volume. -->
<asynchronous_insert_log><ttl>event_date + INTERVAL 3 DAY DELETE</ttl></asynchronous_insert_log>
<query_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_log>
<query_views_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_views_log>
<query_thread_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></query_thread_log>
<part_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></part_log>
<background_schedule_pool_log><ttl>event_date + INTERVAL 7 DAY DELETE</ttl></background_schedule_pool_log>
<!-- Longer, so it still covers a report that reaches us late. crash_log is
deliberately left alone: it is tiny and worth keeping. -->
<error_log><ttl>event_date + INTERVAL 14 DAY DELETE</ttl></error_log>
</clickhouse>
- type: bind
source: ./clickhouse-init.sh
target: /docker-entrypoint-initdb.d/clickhouse-init.sh
read_only: true
content: |
#!/bin/bash
# The ClickHouse entrypoint sources this file, so a subshell keeps these options out of it.
(
set -euo pipefail
client() {
clickhouse-client --host 127.0.0.1 --user "$CLICKHOUSE_USER" --password "$CLICKHOUSE_PASSWORD" "$@"
}
# Flushing replaces log tables whose definition changed, keeping each old table as <log>_<N>.
client --query 'SYSTEM FLUSH LOGS'
# Tables left behind never expire on their own: take the TTL of the log that
# replaced this one, or a week when the log is no longer written at all.
# The named logs must match the ones clickhouse-config.xml removes: a log that
# is still written gets replaced on the next restart if its TTL is altered here.
client --format TSVRaw <<'SQL' | client --multiquery
SELECT concat('ALTER TABLE system.', stale.name, ' MODIFY TTL ', if(active.name = '', 'event_date + INTERVAL 7 DAY DELETE', splitByString(' SETTINGS ', splitByString(' TTL ', active.engine_full)[2])[1]), ';')
FROM (
SELECT name, splitByChar('_', name)[-1] AS suffix, arrayStringConcat(arrayPopBack(splitByChar('_', name)), '_') AS log
FROM system.tables
WHERE database = 'system'
AND position(engine_full, ' TTL ') = 0
AND endsWith(engine, 'MergeTree')
AND name IN (SELECT table FROM system.columns WHERE database = 'system' AND name = 'event_date' AND type = 'Date')
) AS stale
LEFT JOIN system.tables AS active
ON active.database = 'system'
AND active.name = stale.log
AND position(active.engine_full, ' TTL ') > 0
WHERE (endsWith(stale.log, '_log') AND toUInt64OrNull(stale.suffix) IS NOT NULL)
OR stale.name IN ('asynchronous_metric_log', 'metric_log', 'histogram_metric_log', 'query_metric_log', 'processors_profile_log', 'trace_log', 'text_log')
SQL
)
ulimits:
nofile:
soft: 262144
hard: 262144
healthcheck:
test: ["CMD-SHELL", "clickhouse-client --user \"$$CLICKHOUSE_USER\" --password \"$$CLICKHOUSE_PASSWORD\" --query \"SELECT 1\" > /dev/null || exit 1"]
interval: 10s
timeout: 5s
retries: 20
start_period: 30s