mirror of
https://github.com/Dokploy/templates.git
synced 2026-11-11 13:38:07 -06:00
* 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>
899 lines
28 KiB
YAML
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:
|