From 8beb87f3abbb8fa521e8ccb5851ff597bf9b6279 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 18:46:27 -0300 Subject: [PATCH 01/13] feat: add Appwrite 2.2 template Add a self-hosted Appwrite 2.2 stack adapted from the official docker-compose, using Dokploy domains instead of the bundled Traefik. - Fix the compose file so it parses: drop the dangling networks block that duplicated the appwrite service and created phantom gateway/runtimes services - Pin all images to explicit versions (appwrite/appwrite:2.2.0, etc.) - Add restart: unless-stopped to the always-on services and to the separate-profile workers --- blueprints/appwrite-2-2/appwrite.svg | 9 + blueprints/appwrite-2-2/docker-compose.yml | 1713 ++++++++++++++++++++ blueprints/appwrite-2-2/meta.json | 20 + blueprints/appwrite-2-2/template.toml | 284 ++++ 4 files changed, 2026 insertions(+) create mode 100644 blueprints/appwrite-2-2/appwrite.svg create mode 100644 blueprints/appwrite-2-2/docker-compose.yml create mode 100644 blueprints/appwrite-2-2/meta.json create mode 100644 blueprints/appwrite-2-2/template.toml diff --git a/blueprints/appwrite-2-2/appwrite.svg b/blueprints/appwrite-2-2/appwrite.svg new file mode 100644 index 000000000..2034a812a --- /dev/null +++ b/blueprints/appwrite-2-2/appwrite.svg @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/blueprints/appwrite-2-2/docker-compose.yml b/blueprints/appwrite-2-2/docker-compose.yml new file mode 100644 index 000000000..22764048d --- /dev/null +++ b/blueprints/appwrite-2-2/docker-compose.yml @@ -0,0 +1,1713 @@ +version: "3.8" + +x-logging: + logging: + driver: json-file + options: + max-file: "5" + max-size: "10m" +services: + appwrite: + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + restart: unless-stopped + 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 + - ${_APP_DB_HOST:-postgresql} + - appwrite-geo + - appwrite-autogravity + environment: + - _APP_ENV + - _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_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_SCHEME=root + - _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_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_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_CONNECTIONS_DATABASE_VECTORSDB + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _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_FUNCTIONS_TIMEOUT + - _APP_SITES_TIMEOUT + - _APP_COMPUTE_BUILD_TIMEOUT + - _APP_COMPUTE_CPUS + - _APP_COMPUTE_MEMORY + - _APP_FUNCTIONS_RUNTIMES + - _APP_SITES_RUNTIMES + - _APP_DOMAIN_SITES + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_BUILDS_VOLUME + - _APP_JOBS_HOST + - _APP_JOBS_SECRET + - _APP_JOBS_ENDPOINT + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_LOCKING_ENABLED + - _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_SMS_PROVIDER + - _APP_SMS_FROM + - _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_MIGRATIONS_FIREBASE_CLIENT_ID + - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET + - _APP_ASSISTANT_OPENAI_API_KEY + - _APP_CONSOLE_COUNTRIES_DENYLIST + - _APP_DATABASE_SHARED_TABLES + - _APP_DATABASE_SHARED_NAMESPACE + - _APP_FUNCTIONS_CREATION_ABUSE_LIMIT + - _APP_CUSTOM_DOMAIN_DENY_LIST + - _APP_TRUSTED_HEADERS + - _APP_MIGRATION_HOST + - _APP_GEO_SECRET + - _APP_GEO_ENDPOINT + - _APP_LIMIT_DATABASE_BATCH + - _APP_DOCUMENTSDB + - _APP_VECTORSDB + - _APP_EMBEDDING + appwrite-console: + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/new:1.1.96-self-hosted + restart: unless-stopped + environment: + - VITE_CONSOLE_PROFILE=self-hosted + - APPWRITE_ENDPOINT_SAME_ORIGIN=true + - VITE_GROWTH_ENDPOINT=https://growth.appwrite.io/v1 + appwrite-realtime: + entrypoint: realtime + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + restart: unless-stopped + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_USAGE_STATS + - _APP_STATS_USAGE_QUEUE_NAME + - _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_DB_ADAPTER_VECTORSDB + - _APP_DB_HOST_VECTORSDB + - _APP_DB_PORT_VECTORSDB + - _APP_DB_SCHEMA_VECTORSDB + - _APP_DB_USER_VECTORSDB + - _APP_DB_PASS_VECTORSDB + - _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_CONNECTIONS_DATABASE_VECTORSDB + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DATABASE_SHARED_TABLES + - _APP_LIMIT_DATABASE_BATCH + - _APP_DOCUMENTSDB + - _APP_VECTORSDB + - _APP_EMBEDDING + + appwrite-worker: + entrypoint: worker + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + 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_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_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_EMAIL_SECURITY + - _APP_EMAIL_CERTIFICATES + - _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_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_CONNECTIONS_DATABASE_VECTORSDB + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_QUEUE_NAME + - _APP_DATABASE_SHARED_TABLES + - _APP_CONSOLE_URL_SCHEME=root + - _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_DOCKER_HUB_USERNAME + - _APP_DOCKER_HUB_PASSWORD + - _APP_FUNCTIONS_TIMEOUT + - _APP_SITES_TIMEOUT + - _APP_COMPUTE_BUILD_TIMEOUT + - _APP_COMPUTE_CPUS + - _APP_COMPUTE_MEMORY + - _APP_OPEN_RUNTIMES_NFT + - _APP_COMPUTE_SIZE_LIMIT + - _APP_COMPUTE_BUILD_SIZE_LIMIT + - _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_BUILDS_VOLUME + - _APP_JOBS_HOST + - _APP_JOBS_SECRET + - _APP_JOBS_ENDPOINT + - _APP_BROWSER_HOST + - _APP_WORKER_SCREENSHOTS_ROUTER + - _APP_NOTIFICATIONS_TRACKING_SECRET + - _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 + - _APP_LIMIT_DATABASE_BATCH + - _APP_DOCUMENTSDB + - _APP_VECTORSDB + - _APP_EMBEDDING + + appwrite-task-scheduler: + entrypoint: schedule + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _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_FORMAT + # 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_FUNCTIONS_SCHEDULE_SPREAD + + appwrite-worker-stats-usage: + profiles: + - separate + extends: + service: appwrite-worker + entrypoint: worker-stats-usage + + appwrite-worker-stats-resources: + profiles: + - separate + extends: + service: appwrite-worker + entrypoint: worker-stats-resources + + appwrite-task-stats-resources: + profiles: + - separate + extends: + service: appwrite-task-scheduler + entrypoint: stats-resources + + appwrite-worker-webhooks: + profiles: + - separate + entrypoint: worker-webhooks + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_EMAIL_SECURITY + - _APP_DB_ADAPTER + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS + - _APP_DATABASE_SHARED_TABLES + - _APP_CONSOLE_URL_SCHEME=root + appwrite-worker-deletes: + profiles: + - separate + entrypoint: worker-deletes + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + 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 + environment: + - _APP_ENV + - _APP_USAGE_PASS + - _APP_CONNECTIONS_DB_USAGE + - _APP_CONNECTIONS_DB_EXECUTIONS + - _APP_POOL_SIZE_EXECUTIONS + - _APP_MAINTENANCE_RETENTION_EXECUTION + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _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_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_CONNECTIONS_DATABASE_VECTORSDB + - _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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_DATABASE_SHARED_TABLES + - _APP_EMAIL_CERTIFICATES + - _APP_MAINTENANCE_RETENTION_AUDIT + - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE + appwrite-worker-databases: + profiles: + - separate + entrypoint: worker-databases + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=1 + - _APP_WORKER_PER_CORE + - _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_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_CONNECTIONS_DATABASE_VECTORSDB + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_QUEUE_NAME + - _APP_DATABASE_SHARED_TABLES + - _APP_LIMIT_DATABASE_BATCH + - _APP_DOCUMENTSDB + - _APP_VECTORSDB + - _APP_EMBEDDING + appwrite-worker-builds: + profiles: + - separate + entrypoint: worker-builds + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + volumes: + - appwrite-functions:/storage/functions:rw + - appwrite-sites:/storage/sites:rw + - appwrite-builds:/storage/builds:rw + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _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_FUNCTIONS_TIMEOUT + - _APP_SITES_TIMEOUT + - _APP_COMPUTE_BUILD_TIMEOUT + - _APP_COMPUTE_CPUS + - _APP_COMPUTE_MEMORY + - _APP_OPEN_RUNTIMES_NFT + - _APP_COMPUTE_SIZE_LIMIT + - _APP_COMPUTE_BUILD_SIZE_LIMIT + - _APP_OPTIONS_FORCE_HTTPS + - _APP_OPTIONS_ROUTER_FORCE_HTTPS + - _APP_DOMAIN + - _APP_CONSOLE_DOMAIN + - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_TRUSTED_PROJECTS + - _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_DATABASE_SHARED_TABLES + - _APP_DOMAIN_SITES + - _APP_BUILDS_VOLUME + - _APP_JOBS_HOST + - _APP_JOBS_SECRET + - _APP_JOBS_ENDPOINT + extra_hosts: + - host.docker.internal:host-gateway + + appwrite-worker-jobs: + profiles: + - separate + entrypoint: worker-jobs + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + volumes: + - appwrite-builds:/storage/builds:rw + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _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_JOBS_HOST + - _APP_JOBS_SECRET + - _APP_COMPUTE_BUILD_SIZE_LIMIT + - _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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DATABASE_SHARED_TABLES + extra_hosts: + - host.docker.internal:host-gateway + + appwrite-worker-screenshots: + profiles: + - separate + entrypoint: worker-screenshots + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + volumes: + - appwrite-uploads:/storage/uploads:rw + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_BROWSER_HOST + - _APP_SITES_TIMEOUT + - _APP_WORKER_SCREENSHOTS_ROUTER + - _APP_OPTIONS_FORCE_HTTPS + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _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_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 + extra_hosts: + - host.docker.internal:host-gateway + appwrite-worker-certificates: + profiles: + - separate + entrypoint: worker-certificates + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + volumes: + - appwrite-config:/storage/config:rw + - appwrite-certificates:/storage/certificates:rw + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _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_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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DATABASE_SHARED_TABLES + + appwrite-worker-executions: + profiles: + - separate + entrypoint: worker-executions + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_USAGE_PASS + - _APP_CONNECTIONS_DB_USAGE + - _APP_CONNECTIONS_DB_EXECUTIONS + - _APP_POOL_SIZE_EXECUTIONS + - _APP_MAINTENANCE_RETENTION_EXECUTION + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DATABASE_SHARED_TABLES + + appwrite-worker-functions: + profiles: + - separate + entrypoint: worker-functions + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=8 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_OPTIONS_FORCE_HTTPS + - _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_FUNCTIONS_TIMEOUT + - _APP_SITES_TIMEOUT + - _APP_COMPUTE_BUILD_TIMEOUT + - _APP_COMPUTE_CPUS + - _APP_COMPUTE_MEMORY + - _APP_EXECUTOR_SECRET + - _APP_EXECUTOR_HOST + - _APP_DOCKER_HUB_USERNAME + - _APP_DOCKER_HUB_PASSWORD + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DATABASE_SHARED_TABLES + appwrite-worker-mails: + profiles: + - separate + entrypoint: worker-mails + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=6 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_NOTIFICATIONS_TRACKING_SECRET + - _APP_SYSTEM_EMAIL_NAME + - _APP_SYSTEM_EMAIL_ADDRESS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_DB_ADAPTER + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DOMAIN + - _APP_OPTIONS_FORCE_HTTPS + - _APP_DATABASE_SHARED_TABLES + + appwrite-worker-notifications: + profiles: + - separate + entrypoint: worker-notifications + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + restart: unless-stopped + image: appwrite/appwrite:2.2.0 + depends_on: + - redis + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_NOTIFICATIONS_TRACKING_SECRET + - _APP_SYSTEM_EMAIL_NAME + - _APP_SYSTEM_EMAIL_ADDRESS + - _APP_REDIS_HOST + - _APP_REDIS_PORT + - _APP_REDIS_USER + - _APP_REDIS_PASS + - _APP_DB_HOST + - _APP_DB_PORT + - _APP_DB_SCHEMA + - _APP_DB_USER + - _APP_DB_PASS + - _APP_DB_ADAPTER + - _APP_SMTP_HOST + - _APP_SMTP_PORT + - _APP_SMTP_SECURE + - _APP_SMTP_USERNAME + - _APP_SMTP_PASSWORD + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_DOMAIN + - _APP_OPTIONS_FORCE_HTTPS + - _APP_DATABASE_SHARED_TABLES + appwrite-worker-messaging: + profiles: + - separate + entrypoint: worker-messaging + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + restart: unless-stopped + image: appwrite/appwrite:2.2.0 + volumes: + - appwrite-uploads:/storage/uploads:rw + depends_on: + - redis + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=1 + - _APP_WORKER_PER_CORE + - _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_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_SMS_FROM + - _APP_SMS_PROVIDER + - _APP_SMS_PROJECTS_DENY_LIST + - _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_DATABASE_SHARED_TABLES + appwrite-worker-migrations: + profiles: + - separate + entrypoint: worker-migrations + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + restart: unless-stopped + image: appwrite/appwrite:2.2.0 + volumes: + - appwrite-imports:/storage/imports:rw + - appwrite-uploads:/storage/uploads:rw + depends_on: + - ${_APP_DB_HOST:-postgresql} + environment: + - _APP_ENV + - _APP_WORKERS_NUM=1 + - _APP_WORKER_MAX_COROUTINES=1 + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_DOMAIN + - _APP_DOMAIN_TARGET_CNAME + - _APP_DOMAIN_TARGET_AAAA + - _APP_DOMAIN_TARGET_A + - _APP_DOMAIN_TARGET_CAA + - _APP_DNS + - _APP_EMAIL_SECURITY + - _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_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_CONNECTIONS_DATABASE_VECTORSDB + - _APP_LOGGING_CONFIG + - _APP_LOGGING_FORMAT + - _APP_MIGRATIONS_FIREBASE_CLIENT_ID + - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET + - _APP_DATABASE_SHARED_TABLES + - _APP_OPTIONS_FORCE_HTTPS + - _APP_MIGRATION_HOST + appwrite-task-maintenance: + entrypoint: maintenance + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_LOGGING_FORMAT + - _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_EDITION + - _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_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_MAINTENANCE_START_TIME + - _APP_DATABASE_SHARED_TABLES + appwrite-task-interval: + entrypoint: interval + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_LOGGING_FORMAT + - _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 + + appwrite-task-scheduler-functions: + profiles: + - separate + entrypoint: schedule-functions + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_LOGGING_FORMAT + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_OPTIONS_FORCE_HTTPS + - _APP_DOMAIN + - _APP_CONSOLE_DOMAIN + - _APP_DOMAIN_FUNCTIONS + - _APP_DOMAIN_SITES + - _APP_MIGRATION_HOST + - _APP_CONSOLE_SCHEMA + - _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_FUNCTIONS_SCHEDULE_SPREAD + appwrite-task-scheduler-executions: + profiles: + - separate + entrypoint: schedule-executions + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_LOGGING_FORMAT + - _APP_WORKER_PER_CORE + - _APP_OPENSSL_KEY_V1 + - _APP_OPTIONS_FORCE_HTTPS + - _APP_DOMAIN + - _APP_CONSOLE_DOMAIN + - _APP_DOMAIN_FUNCTIONS + - _APP_DOMAIN_SITES + - _APP_MIGRATION_HOST + - _APP_CONSOLE_SCHEMA + - _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 + appwrite-task-scheduler-messages: + profiles: + - separate + entrypoint: schedule-messages + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.2.0 + depends_on: + - ${_APP_DB_HOST:-postgresql} + - redis + environment: + - _APP_ENV + - _APP_LOGGING_FORMAT + - _APP_WORKER_PER_CORE + - _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 + appwrite-assistant: + image: appwrite/assistant:0.8.4 + restart: unless-stopped + environment: + - _APP_ASSISTANT_OPENAI_API_KEY + appwrite-browser: + image: appwrite/browser:0.3.4 + restart: unless-stopped + appwrite-autogravity: + image: ghcr.io/appwrite/autogravity:0.0.10 + restart: unless-stopped + clickhouse: + image: clickhouse/clickhouse-server:26.4.3-alpine + restart: unless-stopped + environment: + - CLICKHOUSE_DB=appwrite + - CLICKHOUSE_USER=appwrite + - CLICKHOUSE_PASSWORD=${_APP_USAGE_PASS:-appwrite} + - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 + volumes: + - appwrite-clickhouse:/var/lib/clickhouse:rw + 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 + + appwrite-geo: + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/geo:0.3.1 + 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 + + openruntimes-executor: + hostname: exc1 + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + stop_signal: SIGINT + image: openruntimes/executor:0.29.0 + restart: unless-stopped + 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 + environment: + - OPR_EXECUTOR_IMAGES=$_APP_EXECUTOR_IMAGES + - OPR_EXECUTOR_INACTIVE_THRESHOLD=$_APP_COMPUTE_INACTIVE_THRESHOLD + - OPR_EXECUTOR_MAINTENANCE_INTERVAL=$_APP_COMPUTE_MAINTENANCE_INTERVAL + - OPR_EXECUTOR_NETWORK=$_APP_COMPUTE_RUNTIMES_NETWORK + - 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: + hostname: orchestrator + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + # One image carrying every orchestrator control plane. Appwrite drives the + # jobs plane today; the per-plane images exist for Kubernetes, where each + # scales, fails and gets RBAC on its own. + image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.0 + restart: unless-stopped + user: root + volumes: + - /var/run/docker.sock:/var/run/docker.sock + environment: + - ORCHESTRATOR_BACKEND=docker + # The jobs plane and the serving planes read the network under different + # names; both name the network the workload containers join. + - ORCHESTRATOR_NETWORK=${_APP_COMPUTE_RUNTIMES_NETWORK:-dokploy-network} + - DOCKER_NETWORK=${_APP_COMPUTE_RUNTIMES_NETWORK:-dokploy-network} + - 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:-} + + mariadb: + image: mariadb:10.11 + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + 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 + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + restart: unless-stopped + volumes: + - appwrite-mongodb:/data/db + - appwrite-mongodb-keyfile:/data/keyfile + - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro + - ./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 + postgresql: + image: appwrite/postgres:0.1.0 + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + volumes: + - appwrite-postgresql:/var/lib/postgresql:rw + environment: + - POSTGRES_DB=${_APP_DB_SCHEMA} + - POSTGRES_USER=${_APP_DB_USER} + - POSTGRES_PASSWORD=${_APP_DB_PASS} + healthcheck: + test: + - CMD-SHELL + - pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA} + interval: 5s + timeout: 5s + retries: 10 + start_period: 10s + command: + - postgres + appwrite-embedding: + image: appwrite/embedding:0.3.1 + profiles: + - embedding + environment: + EMBEDDING_MODELS: ${_APP_EMBEDDING_MODELS:-nomic-embed-text} + restart: unless-stopped + volumes: + - appwrite-models:/home/embedder/models + redis: + image: redis:7.4.7-alpine + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + 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 +volumes: + appwrite-mariadb: null + appwrite-mongodb: null + appwrite-mongodb-keyfile: null + appwrite-postgresql: null + appwrite-redis: null + appwrite-cache: null + appwrite-clickhouse: null + appwrite-uploads: null + appwrite-imports: null + appwrite-certificates: null + appwrite-functions: null + appwrite-sites: null + # Pinned name (unprefixed) so the jobs-service can attach it to build workers + # by a stable name across environments (see _APP_BUILDS_VOLUME). + appwrite-builds: + name: appwrite-builds + appwrite-config: null + appwrite-models: null + openruntimes-node-modules-cache: null + diff --git a/blueprints/appwrite-2-2/meta.json b/blueprints/appwrite-2-2/meta.json new file mode 100644 index 000000000..2bd1b46e8 --- /dev/null +++ b/blueprints/appwrite-2-2/meta.json @@ -0,0 +1,20 @@ +{ + "id": "appwrite-2-2", + "name": "Appwrite 2.2", + "version": "2.2.0", + "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. This template deploys Appwrite 2.2 with PostgreSQL, MongoDB, Redis, ClickHouse, Open Runtimes, and the Appwrite Console for self-hosted application development.", + "links": { + "github": "https://github.com/appwrite/appwrite", + "website": "https://appwrite.io/", + "docs": "https://appwrite.io/docs" + }, + "logo": "appwrite.svg", + "tags": [ + "database", + "firebase", + "postgresql", + "mongodb", + "hosting", + "self-hosted" + ] +} diff --git a/blueprints/appwrite-2-2/template.toml b/blueprints/appwrite-2-2/template.toml new file mode 100644 index 000000000..340562d8a --- /dev/null +++ b/blueprints/appwrite-2-2/template.toml @@ -0,0 +1,284 @@ +[variables] +main_domain = "${domain}" +functions_domain = "functions.${main_domain}" +sites_domain = "sites.${main_domain}" +openssl_key = "${password:32}" +notifications_tracking_secret = "${password:32}" +db_root_pw = "${password:32}" +db_user_pw = "${password:32}" +executor_secret = "${password:32}" +jobs_secret = "${password:32}" +usage_pass = "${password:32}" +geo_secret = "${password:32}" + +[config] +env = [ + "_APP_ENV=production", + "_APP_EDITION=self-hosted", + "_APP_LOCALE=en", + "_APP_OPENSSL_KEY_V1=${openssl_key}", + "_APP_NOTIFICATIONS_TRACKING_SECRET=${notifications_tracking_secret}", + "_APP_RULES_FORMAT=md5", + "_APP_SYSTEM_RESPONSE_FORMAT=", + "_APP_TRUSTED_HEADERS=x-forwarded-for", + "_APP_WORKER_PER_CORE=6", + "_APP_WORKERS_NUM=1", + "_APP_WORKER_MAX_COROUTINES=1", + "_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite", + "_APP_REALTIME_TAIL_RATE=50", + "_APP_COMPRESSION_ENABLED=enabled", + "_APP_COMPRESSION_MIN_SIZE_BYTES=1024", + "_APP_DOMAIN=${main_domain}", + "_APP_DOMAIN_FUNCTIONS=${functions_domain}", + "_APP_DOMAIN_SITES=${sites_domain}", + "_APP_DOMAIN_TARGET_A=127.0.0.1", + "_APP_DOMAIN_TARGET_AAAA=::1", + "_APP_DOMAIN_TARGET_CAA=", + "_APP_DOMAIN_TARGET_CNAME=localhost", + "_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com", + "_APP_DNS=8.8.8.8", + "_APP_OPTIONS_FORCE_HTTPS=enabled", + "_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled", + "_APP_OPTIONS_ROUTER_PROTECTION=disabled", + "_APP_OPTIONS_ABUSE=enabled", + "_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=increased-limit-project", + "_APP_CONSOLE_DOMAIN=${main_domain}", + "_APP_CONSOLE_HOSTNAMES=${main_domain}", + "_APP_CONSOLE_SCHEMA=appwriteio", + "_APP_CONSOLE_SESSION_ALERTS=disabled", + "_APP_CONSOLE_TRUSTED_PROJECTS=", + "_APP_CONSOLE_COUNTRIES_DENYLIST=", + "_APP_CONSOLE_WHITELIST_EMAILS=", + "_APP_CONSOLE_WHITELIST_IPS=", + "_APP_CONSOLE_WHITELIST_ROOT=enabled", + "_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_DB_ADAPTER=postgresql", + "_APP_DB_HOST=postgresql", + "_APP_DB_PORT=5432", + "_APP_DB_SCHEMA=appwrite", + "_APP_DB_USER=user", + "_APP_DB_PASS=${db_user_pw}", + "_APP_DB_ROOT_PASS=${db_root_pw}", + "_APP_DATABASE_SHARED_NAMESPACE=", + "_APP_DATABASE_SHARED_TABLES=", + "_APP_DB_ADAPTER_DOCUMENTSDB=mongodb", + "_APP_DB_HOST_DOCUMENTSDB=mongodb", + "_APP_DB_PORT_DOCUMENTSDB=27017", + "_APP_DB_ADAPTER_VECTORSDB=postgresql", + "_APP_DB_HOST_VECTORSDB=postgresql", + "_APP_DB_PORT_VECTORSDB=5432", + "_APP_REDIS_HOST=redis", + "_APP_REDIS_PORT=6379", + "_APP_REDIS_USER=", + "_APP_REDIS_PASS=", + "_APP_EMBEDDING=disabled", + "_APP_EMBEDDING_ENDPOINT='http://appwrite-embedding:3000/embed'", + "_APP_EMBEDDING_MODELS=nomic-embed-text", + "_APP_EMBEDDING_TIMEOUT=30000", + "_APP_STORAGE_DEVICE=Local", + "_APP_STORAGE_LIMIT=30000000", + "_APP_STORAGE_PREVIEW_LIMIT=20000000", + "_APP_AUTOGRAVITY_HOST=http://appwrite-autogravity:8080", + "_APP_STORAGE_ANTIVIRUS=disabled", + "_APP_STORAGE_ANTIVIRUS_HOST=clamav", + "_APP_STORAGE_ANTIVIRUS_PORT=3310", + "_APP_STORAGE_S3_ACCESS_KEY=", + "_APP_STORAGE_S3_SECRET=", + "_APP_STORAGE_S3_REGION=us-east-1", + "_APP_STORAGE_S3_BUCKET=", + "_APP_STORAGE_S3_ENDPOINT=", + "_APP_STORAGE_DO_SPACES_ACCESS_KEY=", + "_APP_STORAGE_DO_SPACES_SECRET=", + "_APP_STORAGE_DO_SPACES_REGION=us-east-1", + "_APP_STORAGE_DO_SPACES_BUCKET=", + "_APP_STORAGE_BACKBLAZE_ACCESS_KEY=", + "_APP_STORAGE_BACKBLAZE_SECRET=", + "_APP_STORAGE_BACKBLAZE_REGION=us-west-004", + "_APP_STORAGE_BACKBLAZE_BUCKET=", + "_APP_STORAGE_LINODE_ACCESS_KEY=", + "_APP_STORAGE_LINODE_SECRET=", + "_APP_STORAGE_LINODE_REGION=eu-central-1", + "_APP_STORAGE_LINODE_BUCKET=", + "_APP_STORAGE_WASABI_ACCESS_KEY=", + "_APP_STORAGE_WASABI_SECRET=", + "_APP_STORAGE_WASABI_REGION=eu-central-1", + "_APP_STORAGE_WASABI_BUCKET=", + "_APP_SYSTEM_EMAIL_NAME=Appwrite", + "_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io", + "_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io", + "_APP_EMAIL_SECURITY=security@appwrite.io", + "_APP_EMAIL_CERTIFICATES=certificates@appwrite.io", + "_APP_SMTP_HOST=", + "_APP_SMTP_PORT=", + "_APP_SMTP_SECURE=", + "_APP_SMTP_USERNAME=", + "_APP_SMTP_PASSWORD=", + "_APP_SMS_PROVIDER=", + "_APP_SMS_FROM=", + "_APP_SMS_PROJECTS_DENY_LIST=", + "_APP_MESSAGE_EMAIL_TEST_DSN=", + "_APP_MESSAGE_PUSH_TEST_DSN=", + "_APP_MESSAGE_SMS_TEST_DSN=", + "_APP_COMPUTE_SIZE_LIMIT=30000000", + "_APP_COMPUTE_BUILD_SIZE_LIMIT=2000000000", + "_APP_COMPUTE_BUILD_TIMEOUT=900", + "_APP_COMPUTE_CPUS=0", + "_APP_COMPUTE_MEMORY=0", + "_APP_COMPUTE_INACTIVE_THRESHOLD=600", + "_APP_COMPUTE_MAINTENANCE_INTERVAL=600", + "_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network", + "_APP_OPEN_RUNTIMES_NFT=enabled", + "_APP_FUNCTIONS_RUNTIMES=node-22", + "_APP_FUNCTIONS_TIMEOUT=900", + "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000", + "_APP_SITES_RUNTIMES=static-1,node-22", + "_APP_SITES_TIMEOUT=60", + "_APP_EXECUTOR_HOST=http://exc1/v1", + "_APP_EXECUTOR_SECRET=${executor_secret}", + "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/static:v5-1", + "_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost", + "_APP_BUILDS_VOLUME=appwrite-builds", + "_APP_JOBS_HOST=http://orchestrator:8080", + "_APP_JOBS_SECRET=${jobs_secret}", + "_APP_JOBS_ENDPOINT=http://appwrite", + "_APP_BROWSER_HOST=http://appwrite-browser:3000/v1", + "_APP_DOCKER_HUB_USERNAME=", + "_APP_DOCKER_HUB_PASSWORD=", + "_APP_MAINTENANCE_INTERVAL=86400", + "_APP_MAINTENANCE_START_TIME=12:00", + "_APP_MAINTENANCE_RETENTION_ABUSE=86400", + "_APP_MAINTENANCE_RETENTION_AUDIT=1209600", + "_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800", + "_APP_MAINTENANCE_RETENTION_CACHE=2592000", + "_APP_MAINTENANCE_RETENTION_EXECUTION=1209600", + "_APP_MAINTENANCE_RETENTION_SCHEDULES=86400", + "_APP_USAGE_STATS=enabled", + "_APP_USAGE_PASS=${usage_pass}", + "_APP_CONNECTIONS_DB_USAGE=http://appwrite:${usage_pass}@clickhouse:8123/appwrite", + "_APP_POOL_SIZE_USAGE=2", + "_APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:${usage_pass}@clickhouse:8123/appwrite", + "_APP_POOL_SIZE_EXECUTIONS=2", + "_APP_MAINTENANCE_RETENTION_USAGE_TTL=180", + "_APP_STATS_USAGE_QUEUE_NAME=v1-stats-usage", + "_APP_STATS_RESOURCES_QUEUE_NAME=v1-stats-resources", + "_APP_STATS_RESOURCES_INTERVAL=3600", + "_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300", + "_APP_INTERVAL_DOMAIN_VERIFICATION=120", + "_APP_GRAPHQL_INTROSPECTION=enabled", + "_APP_GRAPHQL_MAX_BATCH_SIZE=10", + "_APP_GRAPHQL_MAX_COMPLEXITY=250", + "_APP_GRAPHQL_MAX_DEPTH=4", + "_APP_ASSISTANT_OPENAI_API_KEY=", + "_APP_LOGGING_CONFIG=", + "_APP_LOGGING_FORMAT=pretty", + "_APP_MIGRATION_HOST=appwrite", + "_APP_MIGRATIONS_FIREBASE_CLIENT_ID=", + "_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=", + "_APP_PROJECT_REGIONS=default", + "_APP_GEO_SECRET=${geo_secret}", + "_APP_GEO_ENDPOINT=http://appwrite-geo/v1", + "_APP_VCS_GITHUB_APP_ID=", + "_APP_VCS_GITHUB_APP_NAME=", + "_APP_VCS_GITHUB_CLIENT_ID=", + "_APP_VCS_GITHUB_CLIENT_SECRET=", + "_APP_VCS_GITHUB_PRIVATE_KEY=disabled", + "_APP_VCS_GITHUB_WEBHOOK_SECRET=", + "_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=https://${main_domain}/v1", + "_APP_WEBHOOK_MAX_FAILED_ATTEMPTS=10", +] + +[[config.mounts]] +filePath = "mongo-init.js" +content = """// mongo-init.js + +const adminDb = db.getSiblingDB('admin'); + +const username = process.env.MONGO_INITDB_USERNAME; +const password = process.env.MONGO_INITDB_PASSWORD; +const database = process.env.MONGO_INITDB_DATABASE; + +adminDb.createUser({ + user: username, + pwd: password, + roles: [ + { role: 'readWrite', db: database } + ] +}); +""" + +[[config.mounts]] +filePath = "mongo-entrypoint.sh" +content = """#!/bin/bash +set -e + +KEYFILE_PATH="/data/keyfile/mongo-keyfile" + +if [ ! -f "$KEYFILE_PATH" ]; then + echo "Generating random MongoDB keyfile..." + mkdir -p /data/keyfile + openssl rand -base64 756 > "$KEYFILE_PATH" +fi + +chmod 400 "$KEYFILE_PATH" +chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH" + +exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH" +""" + +[[config.domains]] +serviceName = "appwrite-console" +port = 3000 +host = "${main_domain}" +path = "/" + +[[config.domains]] +serviceName = "appwrite" +port = 80 +host = "${main_domain}" +path = "/v1" + +[[config.domains]] +serviceName = "appwrite" +port = 80 +host = "${main_domain}" +path = "/.well-known" + +[[config.domains]] +serviceName = "appwrite-realtime" +port = 80 +host = "${main_domain}" +path = "/v1/realtime" + +[[config.domains]] +serviceName = "appwrite" +port = 80 +host = "${sites_domain}" +path = "/" + +[[config.domains]] +serviceName = "appwrite" +port = 80 +host = "${functions_domain}" +path = "/" From 79fb54496b662781fd030825dd58ec5399803d66 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 20:44:11 -0300 Subject: [PATCH 02/13] fix(appwrite-2-2): route function and site preview subdomains Appwrite serves function/site previews on . and .. Dokploy rejects wildcard hosts in template.toml, so add Traefik HostRegexp labels on the appwrite service, matching the existing appwrite blueprint. Also disable _APP_ROUTER_AUTO_CERTIFICATES since Dokploy terminates TLS and the bundled Appwrite Traefik is not deployed. --- blueprints/appwrite-2-2/docker-compose.yml | 17 +++++++++++++++++ blueprints/appwrite-2-2/template.toml | 1 + 2 files changed, 18 insertions(+) diff --git a/blueprints/appwrite-2-2/docker-compose.yml b/blueprints/appwrite-2-2/docker-compose.yml index 22764048d..1d2b95e49 100644 --- a/blueprints/appwrite-2-2/docker-compose.yml +++ b/blueprints/appwrite-2-2/docker-compose.yml @@ -23,6 +23,23 @@ services: timeout: 5s retries: 12 start_period: 120s + 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 volumes: - appwrite-uploads:/storage/uploads:rw - appwrite-imports:/storage/imports:rw diff --git a/blueprints/appwrite-2-2/template.toml b/blueprints/appwrite-2-2/template.toml index 340562d8a..2552a141e 100644 --- a/blueprints/appwrite-2-2/template.toml +++ b/blueprints/appwrite-2-2/template.toml @@ -40,6 +40,7 @@ env = [ "_APP_OPTIONS_FORCE_HTTPS=enabled", "_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled", "_APP_OPTIONS_ROUTER_PROTECTION=disabled", + "_APP_ROUTER_AUTO_CERTIFICATES=disabled", "_APP_OPTIONS_ABUSE=enabled", "_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=increased-limit-project", "_APP_CONSOLE_DOMAIN=${main_domain}", From 2bddfa780a8993c31de4760c233747fe1a0b95eb Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 20:46:29 -0300 Subject: [PATCH 03/13] fix(appwrite-2-2): wait for postgres, redis and geo health before appwrite Use depends_on conditions so appwrite does not start before its backing services are healthy. Compose rejects interpolation in depends_on keys, so postgresql is referenced by its literal service name. --- blueprints/appwrite-2-2/docker-compose.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/blueprints/appwrite-2-2/docker-compose.yml b/blueprints/appwrite-2-2/docker-compose.yml index 1d2b95e49..1bb7522b4 100644 --- a/blueprints/appwrite-2-2/docker-compose.yml +++ b/blueprints/appwrite-2-2/docker-compose.yml @@ -50,10 +50,14 @@ services: - appwrite-sites:/storage/sites:rw - appwrite-builds:/storage/builds:rw depends_on: - - redis - - ${_APP_DB_HOST:-postgresql} - - appwrite-geo - - appwrite-autogravity + redis: + condition: service_healthy + postgresql: + condition: service_healthy + appwrite-geo: + condition: service_healthy + appwrite-autogravity: + condition: service_started environment: - _APP_ENV - _APP_USAGE_STATS From 81325f073144d27f7812cc03bf9e0a3d3e6b7aba Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 20:58:56 -0300 Subject: [PATCH 04/13] refactor(appwrite-2): rename blueprint from appwrite-2-2 to appwrite-2 --- blueprints/{appwrite-2-2 => appwrite-2}/appwrite.svg | 0 blueprints/{appwrite-2-2 => appwrite-2}/docker-compose.yml | 0 blueprints/{appwrite-2-2 => appwrite-2}/meta.json | 0 blueprints/{appwrite-2-2 => appwrite-2}/template.toml | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename blueprints/{appwrite-2-2 => appwrite-2}/appwrite.svg (100%) rename blueprints/{appwrite-2-2 => appwrite-2}/docker-compose.yml (100%) rename blueprints/{appwrite-2-2 => appwrite-2}/meta.json (100%) rename blueprints/{appwrite-2-2 => appwrite-2}/template.toml (100%) diff --git a/blueprints/appwrite-2-2/appwrite.svg b/blueprints/appwrite-2/appwrite.svg similarity index 100% rename from blueprints/appwrite-2-2/appwrite.svg rename to blueprints/appwrite-2/appwrite.svg diff --git a/blueprints/appwrite-2-2/docker-compose.yml b/blueprints/appwrite-2/docker-compose.yml similarity index 100% rename from blueprints/appwrite-2-2/docker-compose.yml rename to blueprints/appwrite-2/docker-compose.yml diff --git a/blueprints/appwrite-2-2/meta.json b/blueprints/appwrite-2/meta.json similarity index 100% rename from blueprints/appwrite-2-2/meta.json rename to blueprints/appwrite-2/meta.json diff --git a/blueprints/appwrite-2-2/template.toml b/blueprints/appwrite-2/template.toml similarity index 100% rename from blueprints/appwrite-2-2/template.toml rename to blueprints/appwrite-2/template.toml From b1b5a61e7da7d9aec81bb31f3ff1c18bdeb84452 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 21:02:01 -0300 Subject: [PATCH 05/13] fix(appwrite-2): set meta.json id to match renamed blueprint folder --- blueprints/appwrite-2/meta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blueprints/appwrite-2/meta.json b/blueprints/appwrite-2/meta.json index 2bd1b46e8..d68e1aa4f 100644 --- a/blueprints/appwrite-2/meta.json +++ b/blueprints/appwrite-2/meta.json @@ -1,6 +1,6 @@ { - "id": "appwrite-2-2", - "name": "Appwrite 2.2", + "id": "appwrite-2", + "name": "Appwrite 2", "version": "2.2.0", "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. This template deploys Appwrite 2.2 with PostgreSQL, MongoDB, Redis, ClickHouse, Open Runtimes, and the Appwrite Console for self-hosted application development.", "links": { From e8872803864f62bfa51a191cda3901c3972d6fbc Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Wed, 16 Sep 2026 21:42:16 -0300 Subject: [PATCH 06/13] fix(appwrite-2): default _APP_OPTIONS_FORCE_HTTPS to disabled --- blueprints/appwrite-2/template.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index 2552a141e..d36afeb8a 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -37,7 +37,7 @@ env = [ "_APP_DOMAIN_TARGET_CNAME=localhost", "_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com", "_APP_DNS=8.8.8.8", - "_APP_OPTIONS_FORCE_HTTPS=enabled", + "_APP_OPTIONS_FORCE_HTTPS=disabled", "_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled", "_APP_OPTIONS_ROUTER_PROTECTION=disabled", "_APP_ROUTER_AUTO_CERTIFICATES=disabled", From c88ef64e299f56f48b1f56e9e2a328aaccd1686a Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Thu, 17 Sep 2026 17:18:14 -0300 Subject: [PATCH 07/13] feat(appwrite-2): support a dedicated console domain Add a console_domain variable (defaults to console.) and route the Console, API (/v1) and Realtime (/v1/realtime) on that host, while keeping the existing main-domain routes intact. Point _APP_CONSOLE_DOMAIN and _APP_CONSOLE_HOSTNAMES at the console host so the Console can reach the API on its own origin and can be protected independently (e.g. Cloudflare Access). --- blueprints/appwrite-2/template.toml | 39 +++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index d36afeb8a..b0905e154 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -1,5 +1,15 @@ +# Appwrite 2 exposes the API, the Console, Sites and Functions on separate hosts. +# Defaults below keep a single main domain for API + Console while Sites and +# Functions live on their own subdomains. To separate the Console from the API +# (e.g. to protect it behind Cloudflare Access without exposing the public API), +# change `console_domain` to a dedicated host such as "console.example.com". +# API -> ${main_domain}/v1 (and /v1/realtime, /.well-known) +# Console -> ${console_domain}/ +# Sites -> ${sites_domain} +# Functions -> ${functions_domain} [variables] main_domain = "${domain}" +console_domain = "console.${main_domain}" functions_domain = "functions.${main_domain}" sites_domain = "sites.${main_domain}" openssl_key = "${password:32}" @@ -43,8 +53,8 @@ env = [ "_APP_ROUTER_AUTO_CERTIFICATES=disabled", "_APP_OPTIONS_ABUSE=enabled", "_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=increased-limit-project", - "_APP_CONSOLE_DOMAIN=${main_domain}", - "_APP_CONSOLE_HOSTNAMES=${main_domain}", + "_APP_CONSOLE_DOMAIN=${console_domain}", + "_APP_CONSOLE_HOSTNAMES=${console_domain}", "_APP_CONSOLE_SCHEMA=appwriteio", "_APP_CONSOLE_SESSION_ALERTS=disabled", "_APP_CONSOLE_TRUSTED_PROJECTS=", @@ -248,6 +258,7 @@ chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PAT exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH" """ +# --- Main domain: API + Console (kept for backwards compatibility) --- [[config.domains]] serviceName = "appwrite-console" port = 3000 @@ -272,6 +283,30 @@ port = 80 host = "${main_domain}" path = "/v1/realtime" +# --- Dedicated Console domain --- +# The Console SPA is served at the root of ${console_domain}. Requests to +# /v1 and /v1/realtime on that same host are proxied to the API and Realtime +# services so the Console reaches the API on its own origin. No wildcard is +# used here; Sites and Functions keep their own wildcard hosts below. +[[config.domains]] +serviceName = "appwrite-console" +port = 3000 +host = "${console_domain}" +path = "/" + +[[config.domains]] +serviceName = "appwrite" +port = 80 +host = "${console_domain}" +path = "/v1" + +[[config.domains]] +serviceName = "appwrite-realtime" +port = 80 +host = "${console_domain}" +path = "/v1/realtime" + +# --- Sites and Functions (wildcards handled by Traefik HostRegexp labels) --- [[config.domains]] serviceName = "appwrite" port = 80 From df4d401ad717ac71893f018b0a8dacc08a0be67e Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Thu, 17 Sep 2026 18:37:58 -0300 Subject: [PATCH 08/13] fix(appwrite-2): set executor container_name to match hostname openruntimes-executor looks itself up in Docker by matching its hostname against the container name. Without container_name the generated name is "-openruntimes-executor-1", so the lookup fails and the executor crash loops with "Own container not found" (appwrite/appwrite#13016), leaving site/function deployments stuck in "building". --- blueprints/appwrite-2/docker-compose.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/blueprints/appwrite-2/docker-compose.yml b/blueprints/appwrite-2/docker-compose.yml index 1bb7522b4..dba20e733 100644 --- a/blueprints/appwrite-2/docker-compose.yml +++ b/blueprints/appwrite-2/docker-compose.yml @@ -1515,6 +1515,13 @@ services: openruntimes-executor: hostname: exc1 + # The executor looks itself up in Docker by matching its hostname against + # the container name. Without container_name the generated name is + # "-openruntimes-executor-1", the lookup fails and the executor + # crash loops with "Own container not found" (appwrite/appwrite#13016). + # Keep container_name in sync with hostname (also required by + # _APP_EXECUTOR_HOST=http://exc1/v1). + container_name: exc1 logging: driver: json-file options: From 573afcfca87754216f6274fad090d812c9a5fe4e Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Thu, 17 Sep 2026 18:42:57 -0300 Subject: [PATCH 09/13] fix(appwrite-2): use service name as executor hostname openruntimes-executor resolves its own container with gethostname() against Docker's name filter. With hostname "exc1" the filter never matches "-openruntimes-executor-1", so the executor crash loops with "Own container not found" (appwrite/appwrite#13016). Mirror the appwrite blueprint: set hostname to the service name (a substring of the generated container name) and point _APP_EXECUTOR_HOST at http://openruntimes-executor/v1. Avoids container_name, which the compose validator rejects and which is not deployment-unique. --- blueprints/appwrite-2/docker-compose.yml | 15 +++++++-------- blueprints/appwrite-2/template.toml | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/blueprints/appwrite-2/docker-compose.yml b/blueprints/appwrite-2/docker-compose.yml index dba20e733..fa1b1357e 100644 --- a/blueprints/appwrite-2/docker-compose.yml +++ b/blueprints/appwrite-2/docker-compose.yml @@ -1514,14 +1514,13 @@ services: start_period: 5s openruntimes-executor: - hostname: exc1 - # The executor looks itself up in Docker by matching its hostname against - # the container name. Without container_name the generated name is - # "-openruntimes-executor-1", the lookup fails and the executor - # crash loops with "Own container not found" (appwrite/appwrite#13016). - # Keep container_name in sync with hostname (also required by - # _APP_EXECUTOR_HOST=http://exc1/v1). - container_name: exc1 + # Must stay equal to the service name: the executor finds its own container + # with gethostname() against Docker's name filter, and the generated name is + # "-openruntimes-executor-1" (substring match). A hostname like + # "exc1" makes the lookup fail and the executor crash loops with + # "Own container not found" (appwrite/appwrite#13016). Keep it in sync with + # _APP_EXECUTOR_HOST=http://openruntimes-executor/v1. + hostname: openruntimes-executor logging: driver: json-file options: diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index b0905e154..074046ebc 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -152,7 +152,7 @@ env = [ "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000", "_APP_SITES_RUNTIMES=static-1,node-22", "_APP_SITES_TIMEOUT=60", - "_APP_EXECUTOR_HOST=http://exc1/v1", + "_APP_EXECUTOR_HOST=http://openruntimes-executor/v1", "_APP_EXECUTOR_SECRET=${executor_secret}", "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/static:v5-1", "_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost", From 8841f90c9e7ac161357ca78b0258e5e156738d5c Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Sat, 19 Sep 2026 10:23:00 -0300 Subject: [PATCH 10/13] feat(appwrite-2): add all supported runtimes with multiple versions --- blueprints/appwrite-2/template.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index 074046ebc..39ff1d91f 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -147,14 +147,14 @@ env = [ "_APP_COMPUTE_MAINTENANCE_INTERVAL=600", "_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network", "_APP_OPEN_RUNTIMES_NFT=enabled", - "_APP_FUNCTIONS_RUNTIMES=node-22", + "_APP_FUNCTIONS_RUNTIMES=node-22,node-25,python-3.12,python-3.14,php-8.4,ruby-4.0,dart-3.5,go-1.23,go-1.26,rust-1.83,bun-1.3,deno-2.6,java-22,dotnet-10,kotlin-2.3,swift-6.2", "_APP_FUNCTIONS_TIMEOUT=900", "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000", - "_APP_SITES_RUNTIMES=static-1,node-22", + "_APP_SITES_RUNTIMES=static-1,node-22,node-25", "_APP_SITES_TIMEOUT=60", "_APP_EXECUTOR_HOST=http://openruntimes-executor/v1", "_APP_EXECUTOR_SECRET=${executor_secret}", - "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/static:v5-1", + "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/node:v5-25,openruntimes/static:v5-1,openruntimes/python:v5-3.12,openruntimes/python:v5-3.14,openruntimes/php:v5-8.4,openruntimes/ruby:v5-4.0,openruntimes/dart:v5-3.5,openruntimes/go:v5-1.23,openruntimes/go:v5-1.26,openruntimes/rust:v5-1.83,openruntimes/bun:v5-1.3,openruntimes/deno:v5-2.6,openruntimes/java:v5-22,openruntimes/dotnet:v5-10,openruntimes/kotlin:v5-2.3,openruntimes/swift:v5-6.2", "_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost", "_APP_BUILDS_VOLUME=appwrite-builds", "_APP_JOBS_HOST=http://orchestrator:8080", From 3ad2b050131a1fb55cbee64e84c3ba70200be839 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Sat, 19 Sep 2026 19:01:37 -0300 Subject: [PATCH 11/13] chore(appwrite-2): bump orchestrator to 2.2.2 and executor to 0.29.1 --- blueprints/appwrite-2/docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blueprints/appwrite-2/docker-compose.yml b/blueprints/appwrite-2/docker-compose.yml index fa1b1357e..fc28ba8ff 100644 --- a/blueprints/appwrite-2/docker-compose.yml +++ b/blueprints/appwrite-2/docker-compose.yml @@ -1527,7 +1527,7 @@ services: max-file: "5" max-size: 10m stop_signal: SIGINT - image: openruntimes/executor:0.29.0 + image: openruntimes/executor:0.29.1 restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock @@ -1570,7 +1570,7 @@ services: # One image carrying every orchestrator control plane. Appwrite drives the # jobs plane today; the per-plane images exist for Kubernetes, where each # scales, fails and gets RBAC on its own. - image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.0 + image: ghcr.io/open-runtimes/orchestrator/orchestrator:2.2.2 restart: unless-stopped user: root volumes: From 32fe660cc403d9bdc68b5160fa9f9ac1591ea4d1 Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Mon, 21 Sep 2026 14:56:37 -0300 Subject: [PATCH 12/13] feat(appwrite-2): use node LTS runtimes 22, 24 and 26 --- blueprints/appwrite-2/template.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index 39ff1d91f..8f7f5ce5c 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -147,14 +147,14 @@ env = [ "_APP_COMPUTE_MAINTENANCE_INTERVAL=600", "_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network", "_APP_OPEN_RUNTIMES_NFT=enabled", - "_APP_FUNCTIONS_RUNTIMES=node-22,node-25,python-3.12,python-3.14,php-8.4,ruby-4.0,dart-3.5,go-1.23,go-1.26,rust-1.83,bun-1.3,deno-2.6,java-22,dotnet-10,kotlin-2.3,swift-6.2", + "_APP_FUNCTIONS_RUNTIMES=node-22,node-24,node-26,python-3.12,python-3.14,php-8.4,ruby-4.0,dart-3.5,go-1.23,go-1.26,rust-1.83,bun-1.3,deno-2.6,java-22,dotnet-10,kotlin-2.3,swift-6.2", "_APP_FUNCTIONS_TIMEOUT=900", "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000", - "_APP_SITES_RUNTIMES=static-1,node-22,node-25", + "_APP_SITES_RUNTIMES=static-1,node-22,node-24,node-26", "_APP_SITES_TIMEOUT=60", "_APP_EXECUTOR_HOST=http://openruntimes-executor/v1", "_APP_EXECUTOR_SECRET=${executor_secret}", - "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/node:v5-25,openruntimes/static:v5-1,openruntimes/python:v5-3.12,openruntimes/python:v5-3.14,openruntimes/php:v5-8.4,openruntimes/ruby:v5-4.0,openruntimes/dart:v5-3.5,openruntimes/go:v5-1.23,openruntimes/go:v5-1.26,openruntimes/rust:v5-1.83,openruntimes/bun:v5-1.3,openruntimes/deno:v5-2.6,openruntimes/java:v5-22,openruntimes/dotnet:v5-10,openruntimes/kotlin:v5-2.3,openruntimes/swift:v5-6.2", + "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/node:v5-24,openruntimes/node:v5-26,openruntimes/static:v5-1,openruntimes/python:v5-3.12,openruntimes/python:v5-3.14,openruntimes/php:v5-8.4,openruntimes/ruby:v5-4.0,openruntimes/dart:v5-3.5,openruntimes/go:v5-1.23,openruntimes/go:v5-1.26,openruntimes/rust:v5-1.83,openruntimes/bun:v5-1.3,openruntimes/deno:v5-2.6,openruntimes/java:v5-22,openruntimes/dotnet:v5-10,openruntimes/kotlin:v5-2.3,openruntimes/swift:v5-6.2", "_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost", "_APP_BUILDS_VOLUME=appwrite-builds", "_APP_JOBS_HOST=http://orchestrator:8080", From 235acdea236b00f50b0a5721d01b01f654e664fe Mon Sep 17 00:00:00 2001 From: Carlos Dorneles Date: Thu, 24 Sep 2026 20:23:09 -0300 Subject: [PATCH 13/13] feat(appwrite-2): update to Appwrite 2.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bump appwrite/appwrite to 2.3.0, console to 1.1.159, autogravity to 0.0.11 - Replace _APP_CONSOLE_URL_SCHEME with _APP_CONSOLE_URL (removed in 2.3.0) - Add appwrite-mqtt service with MQTT envs (_APP_MQTT_REPLAY_DEPTH, _APP_MQTT_MAX_PACKET_SIZE) - Add _APP_PWNED_PASSWORDS_DSN (2.3.0 password breach policy) - Add flutter-3.44 sites runtime (Jaspr SSR) and its executor image - Adopt upstream MongoDB init fix (#13593): idempotent init on port 27018 🤖 Generated with Codebuff Co-Authored-By: Codebuff --- blueprints/appwrite-2/docker-compose.yml | 110 +++++++++++++++++------ blueprints/appwrite-2/meta.json | 4 +- blueprints/appwrite-2/template.toml | 75 ++++++++++++++-- 3 files changed, 149 insertions(+), 40 deletions(-) diff --git a/blueprints/appwrite-2/docker-compose.yml b/blueprints/appwrite-2/docker-compose.yml index fc28ba8ff..7b56cf349 100644 --- a/blueprints/appwrite-2/docker-compose.yml +++ b/blueprints/appwrite-2/docker-compose.yml @@ -13,7 +13,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 restart: unless-stopped healthcheck: test: @@ -105,7 +105,7 @@ services: - _APP_NOTIFICATIONS_TRACKING_SECRET - _APP_DOMAIN - _APP_CONSOLE_DOMAIN - - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_URL - _APP_CONSOLE_TRUSTED_PROJECTS - _APP_DOMAIN_TARGET_CNAME - _APP_DOMAIN_TARGET_AAAA @@ -235,6 +235,7 @@ services: - _APP_MIGRATION_HOST - _APP_GEO_SECRET - _APP_GEO_ENDPOINT + - _APP_PWNED_PASSWORDS_DSN - _APP_LIMIT_DATABASE_BATCH - _APP_DOCUMENTSDB - _APP_VECTORSDB @@ -245,7 +246,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/new:1.1.96-self-hosted + image: appwrite/new:1.1.159-self-hosted restart: unless-stopped environment: - VITE_CONSOLE_PROFILE=self-hosted @@ -258,7 +259,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 restart: unless-stopped depends_on: - ${_APP_DB_HOST:-postgresql} @@ -305,6 +306,55 @@ services: - _APP_VECTORSDB - _APP_EMBEDDING + appwrite-mqtt: + entrypoint: mqtt + restart: unless-stopped + logging: + driver: json-file + options: + max-file: "5" + max-size: 10m + image: appwrite/appwrite:2.3.0 + 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: entrypoint: worker restart: unless-stopped @@ -313,7 +363,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -375,7 +425,7 @@ services: - _APP_LOGGING_FORMAT - _APP_QUEUE_NAME - _APP_DATABASE_SHARED_TABLES - - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_URL - _APP_CONSOLE_DOMAIN - _APP_CONSOLE_TRUSTED_PROJECTS - _APP_DOMAIN @@ -476,7 +526,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -549,7 +599,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -574,7 +624,7 @@ services: - _APP_LOGGING_FORMAT - _APP_WEBHOOK_MAX_FAILED_ATTEMPTS - _APP_DATABASE_SHARED_TABLES - - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_URL appwrite-worker-deletes: profiles: - separate @@ -585,7 +635,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -671,7 +721,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -723,7 +773,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 volumes: - appwrite-functions:/storage/functions:rw - appwrite-sites:/storage/sites:rw @@ -781,7 +831,7 @@ services: - _APP_OPTIONS_ROUTER_FORCE_HTTPS - _APP_DOMAIN - _APP_CONSOLE_DOMAIN - - _APP_CONSOLE_URL_SCHEME=root + - _APP_CONSOLE_URL - _APP_CONSOLE_TRUSTED_PROJECTS - _APP_STORAGE_DEVICE - _APP_STORAGE_S3_ACCESS_KEY @@ -824,7 +874,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 volumes: - appwrite-builds:/storage/builds:rw depends_on: @@ -887,7 +937,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 volumes: - appwrite-uploads:/storage/uploads:rw depends_on: @@ -950,7 +1000,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -996,7 +1046,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -1035,7 +1085,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1079,7 +1129,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -1123,7 +1173,7 @@ services: max-file: "5" max-size: 10m restart: unless-stopped - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - redis - ${_APP_DB_HOST:-postgresql} @@ -1164,7 +1214,7 @@ services: max-file: "5" max-size: 10m restart: unless-stopped - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 volumes: - appwrite-uploads:/storage/uploads:rw depends_on: @@ -1223,7 +1273,7 @@ services: max-file: "5" max-size: 10m restart: unless-stopped - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 volumes: - appwrite-imports:/storage/imports:rw - appwrite-uploads:/storage/uploads:rw @@ -1281,7 +1331,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1326,7 +1376,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1367,7 +1417,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1405,7 +1455,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1442,7 +1492,7 @@ services: options: max-file: "5" max-size: 10m - image: appwrite/appwrite:2.2.0 + image: appwrite/appwrite:2.3.0 depends_on: - ${_APP_DB_HOST:-postgresql} - redis @@ -1471,8 +1521,10 @@ services: image: appwrite/browser:0.3.4 restart: unless-stopped appwrite-autogravity: - image: ghcr.io/appwrite/autogravity:0.0.10 + image: ghcr.io/appwrite/autogravity:0.0.11 restart: unless-stopped + environment: + - MODEL_BACKEND=focalnet clickhouse: image: clickhouse/clickhouse-server:26.4.3-alpine restart: unless-stopped @@ -1625,7 +1677,7 @@ services: volumes: - appwrite-mongodb:/data/db - appwrite-mongodb-keyfile:/data/keyfile - - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro + - ./mongo-init.js:/mongo-init.js:ro - ./mongo-entrypoint.sh:/mongo-entrypoint.sh:ro environment: - MONGO_INITDB_ROOT_USERNAME=root diff --git a/blueprints/appwrite-2/meta.json b/blueprints/appwrite-2/meta.json index d68e1aa4f..e2ab92e9d 100644 --- a/blueprints/appwrite-2/meta.json +++ b/blueprints/appwrite-2/meta.json @@ -1,8 +1,8 @@ { "id": "appwrite-2", "name": "Appwrite 2", - "version": "2.2.0", - "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. This template deploys Appwrite 2.2 with PostgreSQL, MongoDB, Redis, ClickHouse, Open Runtimes, and the Appwrite Console for self-hosted application development.", + "version": "2.3.0", + "description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. This template deploys Appwrite 2.3 with PostgreSQL, MongoDB, Redis, ClickHouse, Open Runtimes, MQTT, and the Appwrite Console for self-hosted application development.", "links": { "github": "https://github.com/appwrite/appwrite", "website": "https://appwrite.io/", diff --git a/blueprints/appwrite-2/template.toml b/blueprints/appwrite-2/template.toml index 8f7f5ce5c..b63108721 100644 --- a/blueprints/appwrite-2/template.toml +++ b/blueprints/appwrite-2/template.toml @@ -54,6 +54,7 @@ env = [ "_APP_OPTIONS_ABUSE=enabled", "_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=increased-limit-project", "_APP_CONSOLE_DOMAIN=${console_domain}", + "_APP_CONSOLE_URL=https://${console_domain}", "_APP_CONSOLE_HOSTNAMES=${console_domain}", "_APP_CONSOLE_SCHEMA=appwriteio", "_APP_CONSOLE_SESSION_ALERTS=disabled", @@ -94,6 +95,9 @@ env = [ "_APP_EMBEDDING_ENDPOINT='http://appwrite-embedding:3000/embed'", "_APP_EMBEDDING_MODELS=nomic-embed-text", "_APP_EMBEDDING_TIMEOUT=30000", + "_APP_PWNED_PASSWORDS_DSN=none://localhost", + "_APP_MQTT_REPLAY_DEPTH=5", + "_APP_MQTT_MAX_PACKET_SIZE=64000", "_APP_STORAGE_DEVICE=Local", "_APP_STORAGE_LIMIT=30000000", "_APP_STORAGE_PREVIEW_LIMIT=20000000", @@ -150,11 +154,11 @@ env = [ "_APP_FUNCTIONS_RUNTIMES=node-22,node-24,node-26,python-3.12,python-3.14,php-8.4,ruby-4.0,dart-3.5,go-1.23,go-1.26,rust-1.83,bun-1.3,deno-2.6,java-22,dotnet-10,kotlin-2.3,swift-6.2", "_APP_FUNCTIONS_TIMEOUT=900", "_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000", - "_APP_SITES_RUNTIMES=static-1,node-22,node-24,node-26", + "_APP_SITES_RUNTIMES=static-1,node-22,node-24,node-26,flutter-3.44", "_APP_SITES_TIMEOUT=60", "_APP_EXECUTOR_HOST=http://openruntimes-executor/v1", "_APP_EXECUTOR_SECRET=${executor_secret}", - "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/node:v5-24,openruntimes/node:v5-26,openruntimes/static:v5-1,openruntimes/python:v5-3.12,openruntimes/python:v5-3.14,openruntimes/php:v5-8.4,openruntimes/ruby:v5-4.0,openruntimes/dart:v5-3.5,openruntimes/go:v5-1.23,openruntimes/go:v5-1.26,openruntimes/rust:v5-1.83,openruntimes/bun:v5-1.3,openruntimes/deno:v5-2.6,openruntimes/java:v5-22,openruntimes/dotnet:v5-10,openruntimes/kotlin:v5-2.3,openruntimes/swift:v5-6.2", + "_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/node:v5-24,openruntimes/node:v5-26,openruntimes/static:v5-1,openruntimes/python:v5-3.12,openruntimes/python:v5-3.14,openruntimes/php:v5-8.4,openruntimes/ruby:v5-4.0,openruntimes/dart:v5-3.5,openruntimes/go:v5-1.23,openruntimes/go:v5-1.26,openruntimes/rust:v5-1.83,openruntimes/bun:v5-1.3,openruntimes/deno:v5-2.6,openruntimes/java:v5-22,openruntimes/dotnet:v5-10,openruntimes/kotlin:v5-2.3,openruntimes/swift:v5-6.2,openruntimes/flutter:v5-3.44", "_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost", "_APP_BUILDS_VOLUME=appwrite-builds", "_APP_JOBS_HOST=http://orchestrator:8080", @@ -230,13 +234,18 @@ const username = process.env.MONGO_INITDB_USERNAME; const password = process.env.MONGO_INITDB_PASSWORD; const database = process.env.MONGO_INITDB_DATABASE; -adminDb.createUser({ - user: username, - pwd: password, - roles: [ - { role: 'readWrite', db: database } - ] -}); +// Idempotent: the official entrypoint races the real server on port 27017 when +// initialising a fresh volume (appwrite/appwrite#13593), so this script may run +// more than once. Skip if the user already exists. +if (adminDb.getUser(username) === null) { + adminDb.createUser({ + user: username, + pwd: password, + roles: [ + { role: 'readWrite', db: database } + ] + }); +} """ [[config.mounts]] @@ -255,6 +264,54 @@ fi chmod 400 "$KEYFILE_PATH" chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH" +# The standard entrypoint initialises an empty data directory with a second +# mongod on 27017, stopped with `mongod --shutdown`. That returns once the +# server clears /mongod.lock, several steps before it exits and +# releases the port, and the real server binds a millisecond after it starts -- +# so a slow shutdown tail leaves it exiting 48, "Address already in use", +# taking the container with it (appwrite/appwrite#13593). Initialise here +# instead, on a port the real server never binds, and hand over a directory +# the standard entrypoint has nothing left to do. +INIT_MARKER=/data/db/.appwrite-initialised +if [ ! -e "$INIT_MARKER" ]; then + INIT_PORT=27018 + echo "Initialising MongoDB data directory..." + find -L /data/db \! -user mongodb -exec chown mongodb '{}' + + export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}" + gosu mongodb mongod --dbpath /data/db --bind_ip 127.0.0.1 --port "$INIT_PORT" & + INIT_SERVER=$! + READY= + for _ in $(seq 1 30); do + if mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet --eval 'quit(0)' > /dev/null 2>&1; then + READY=1 + break + fi + if ! kill -0 "$INIT_SERVER" 2>/dev/null; then + break + fi + sleep 1 + done + if [ -z "$READY" ]; then + echo "MongoDB did not accept connections for initialisation" >&2 + exit 1 + fi + mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet admin --eval ' + const username = process.env.MONGO_INITDB_ROOT_USERNAME; + if (db.getUser(username) === null) { + db.createUser({ + user: username, + pwd: process.env.MONGO_INITDB_ROOT_PASSWORD, + roles: [{ role: "root", db: "admin" }] + }); + } + ' + mongosh --host 127.0.0.1 --port "$INIT_PORT" --quiet "$MONGO_INITDB_DATABASE" /mongo-init.js + touch "$INIT_MARKER" + kill -TERM "$INIT_SERVER" + wait "$INIT_SERVER" + echo "MongoDB data directory initialised." +fi + exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH" """