Try describing what you need:

Appwrite logo

Appwrite

★ 57.8k

A self-hosted alternative to Auth0, Vercel Heroku, Supabase

BSD 3-Clause "New" or "Revised" LicenseOpen Source — No Paywall36 Containers — 36 containers — heavy hosting footprintDocker · Compose · K8s +1Needs MariaDB9+ active committers (12mo)

About

Appwrite is an open-source development platform aimed at teams building web, mobile, and AI applications. It combines backend services and hosting in a single system so developers can avoid...

Community Ratings

No ratings yet

Features

  • authentication
  • multiple login methods
  • session management
  • multi-factor authentication
  • user verification
  • databases
  • file storage
  • serverless functions
  • messaging
  • web app hosting

Details

Last Updated
Oct 26, 2026
Created
Apr 8, 2019
Install Methods
dockerdocker-composekubernetessource
Requirements
Docker
Authentication
oauthlocal2fa
API
REST
Runtime / Stack
Docker
Privacy & Independence
Cloud: Optional
User Model
Multi-User
Deployment

Deployment: Docker Compose ✓36 Containers — heavy hosting footprintRuns as 36 containers

Run Appwrite with Docker Compose

Compose file from the Appwrite project repository.

36 services · database: mariadb · infra: traefik, mariadb, mongo, postgres, redis · 3 unclassified (appwrite-dev, executor, coredns)

no resource limits declared

needs persistent storage (93 volumes)

docker-compose.yml · @ ba71f9b · scanned Jun 4, 2026

# WARNING!
# This is a development version of THE Appwrite docker-compose.yml file.
# Avoid using this file in your production environment.
# We're exposing here sensitive ports and mounting code volumes for rapid development and debugging of the server stack.

x-logging: &x-logging
  logging:
    driver: "json-file"
    options:
      max-file: "5"
      max-size: "10m"

x-build: &x-build
  build:
    context: .
    target: development
    args:
      DEBUG: false
      TESTING: true
      VERSION: dev

services:
  traefik:
    image: traefik:3.6
    <<: *x-logging
    container_name: appwrite-traefik
    command:
      - --log.level=DEBUG
      - --api.insecure=true
      - --providers.file.directory=/storage/config
      - --providers.file.watch=true
      - --providers.docker=true
      - --providers.docker.exposedByDefault=false
      - --providers.docker.constraints=Label(`traefik.constraint-label-stack`,`appwrite`)
      - --entrypoints.appwrite_web.address=:80
      - --entrypoints.appwrite_websecure.address=:443
      - --accesslog=true
    ports:
      - 80:80
      - 8080:80
      - 443:443
      - 9500:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - appwrite-config:/storage/config:ro
      - appwrite-certificates:/storage/certificates:ro
    depends_on:
      - appwrite
    networks:
      appwrite:
        aliases:
          - appwrite.test
      gateway:
        aliases:
          - appwrite.test
      runtimes:
        aliases:
          - appwrite.test

  appwrite:
    container_name: appwrite
    <<: [*x-logging, *x-build]
    image: appwrite-dev
    healthcheck:
      test: ["CMD", "doctor"]
      interval: 5s
      timeout: 5s
      retries: 12
    ports:
      - 9501:80
    networks:
      - appwrite
    dns:
      - 127.0.0.11
      - 172.16.238.100
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"
      - "traefik.docker.network=appwrite"
      - "traefik.http.services.appwrite_api.loadbalancer.server.port=80"
      #http
      - traefik.http.routers.appwrite_api_http.entrypoints=appwrite_web
      - traefik.http.routers.appwrite_api_http.rule=PathPrefix(`/`)
      - traefik.http.routers.appwrite_api_http.service=appwrite_api
      # https
      - traefik.http.routers.appwrite_api_https.entrypoints=appwrite_websecure
      - traefik.http.routers.appwrite_api_https.rule=PathPrefix(`/`)
      - traefik.http.routers.appwrite_api_https.service=appwrite_api
      - traefik.http.routers.appwrite_api_https.tls=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # Only needed for tests
      - ./docker-compose.yml:/usr/src/code/docker-compose.yml # Only needed for tests
      - ./.env:/usr/src/code/.env # Only needed for tests
      - 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
      - ./phpunit.xml:/usr/src/code/phpunit.xml
      - ./tests:/usr/src/code/tests
      - ./app:/usr/src/code/app
      - ./docs:/usr/src/code/docs
      - ./public:/usr/src/code/public
      - ./src:/usr/src/code/src
      - ./dev:/usr/src/code/dev

    depends_on:
      redis:
        condition: service_healthy
      coredns:
        condition: service_started
      appwrite-embedding:
        condition: service_started
    entrypoint:
      - php
      - -e
      - app/http.php
    environment:
      - _APP_ENV
      - _APP_EDITION
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_SYSTEM_EMAIL_NAME
      - _APP_SYSTEM_EMAIL_ADDRESS
      - _APP_SYSTEM_TEAM_EMAIL
      - _APP_EMAIL_SECURITY
      - _APP_SYSTEM_RESPONSE_FORMAT
      - _APP_OPTIONS_ABUSE
      - _APP_OPTIONS_ROUTER_PROTECTION
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_OPTIONS_ROUTER_FORCE_HTTPS
      - _APP_OPENSSL_KEY_V1
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _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_SMTP_HOST
      - _APP_SMTP_PORT
      - _APP_SMTP_SECURE
      - _APP_SMTP_USERNAME
      - _APP_SMTP_PASSWORD
      - _APP_USAGE_STATS
      - _APP_STORAGE_LIMIT
      - _APP_STORAGE_PREVIEW_LIMIT
      - _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_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_LOGGING_CONFIG
      - _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_USAGE_HOURLY
      - _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_MIGRATIONS_FIREBASE_CLIENT_ID
      - _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
      - _APP_ASSISTANT_OPENAI_API_KEY
      - _APP_MESSAGE_SMS_TEST_DSN
      - _APP_MESSAGE_EMAIL_TEST_DSN
      - _APP_MESSAGE_PUSH_TEST_DSN
      - _APP_CONSOLE_COUNTRIES_DENYLIST
      - _APP_EXPERIMENT_LOGGING_PROVIDER
      - _APP_EXPERIMENT_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES
      - _APP_DATABASE_SHARED_NAMESPACE
      - _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
      - _APP_CUSTOM_DOMAIN_DENY_LIST
      - _APP_TRUSTED_HEADERS
      - _APP_MIGRATION_HOST
      - _TESTS_OAUTH2_GITHUB_CLIENT_ID
      - _TESTS_OAUTH2_GITHUB_CLIENT_SECRET
    extra_hosts:
      - "host.docker.internal:host-gateway"

  appwrite-console:
    <<: *x-logging
    container_name: appwrite-console
    image: appwrite/console:8
    restart: unless-stopped
    networks:
      - appwrite
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"
      - "traefik.docker.network=appwrite"
      - "traefik.http.services.appwrite_console.loadbalancer.server.port=80"
      #ws
      - traefik.http.routers.appwrite_console_http.entrypoints=appwrite_web
      - traefik.http.routers.appwrite_console_http.rule=PathPrefix(`/console`)
      - traefik.http.routers.appwrite_console_http.service=appwrite_console
      # wss
      - traefik.http.routers.appwrite_console_https.entrypoints=appwrite_websecure
      - traefik.http.routers.appwrite_console_https.rule=PathPrefix(`/console`)
      - traefik.http.routers.appwrite_console_https.service=appwrite_console
      - traefik.http.routers.appwrite_console_https.tls=true

  appwrite-realtime:
    entrypoint: realtime
    <<: [*x-logging, *x-build]
    container_name: appwrite-realtime
    image: appwrite-dev
    restart: unless-stopped
    ports:
      - 9505:80
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"
      - "traefik.docker.network=appwrite"
      - "traefik.http.services.appwrite_realtime.loadbalancer.server.port=80"
      #ws
      - traefik.http.routers.appwrite_realtime_ws.entrypoints=appwrite_web
      - traefik.http.routers.appwrite_realtime_ws.rule=PathPrefix(`/v1/realtime`)
      - traefik.http.routers.appwrite_realtime_ws.service=appwrite_realtime
      # wss
      - traefik.http.routers.appwrite_realtime_wss.entrypoints=appwrite_websecure
      - traefik.http.routers.appwrite_realtime_wss.rule=PathPrefix(`/v1/realtime`)
      - traefik.http.routers.appwrite_realtime_wss.service=appwrite_realtime
      - traefik.http.routers.appwrite_realtime_wss.tls=true
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_OPTIONS_ABUSE
      - _APP_OPTIONS_ROUTER_PROTECTION
      - _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_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_LOGGING_CONFIG_REALTIME
      - _APP_DATABASE_SHARED_TABLES
      - _APP_POOL_ADAPTER=swoole

  appwrite-worker-audits:
    entrypoint: worker-audits
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-audits
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_DATABASE_SHARED_TABLES

  appwrite-worker-webhooks:
    entrypoint: worker-webhooks
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-webhooks
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - request-catcher-sms
      - request-catcher-webhook
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_WEBHOOK_MAX_FAILED_ATTEMPTS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-deletes:
    entrypoint: worker-deletes
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-deletes
    image: appwrite-dev
    networks:
      - appwrite
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    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
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
      
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_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_EXECUTOR_SECRET
      - _APP_EXECUTOR_HOST
      - _APP_DATABASE_SHARED_TABLES
      - _APP_EMAIL_CERTIFICATES
      - _APP_MAINTENANCE_RETENTION_AUDIT
      - _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE

  appwrite-worker-databases:
    entrypoint: worker-databases
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-databases
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
      
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_QUEUE_NAME
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-builds:
    entrypoint: worker-builds
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-builds
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - appwrite-functions:/storage/functions:rw
      - appwrite-sites:/storage/sites:rw
      - appwrite-builds:/storage/builds:rw
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_VCS_GITHUB_APP_NAME
      - _APP_VCS_GITHUB_PRIVATE_KEY
      - _APP_VCS_GITHUB_APP_ID
      - _APP_FUNCTIONS_TIMEOUT
      - _APP_SITES_TIMEOUT
      - _APP_COMPUTE_BUILD_TIMEOUT
      - _APP_COMPUTE_CPUS
      - _APP_COMPUTE_MEMORY
      - _APP_COMPUTE_SIZE_LIMIT
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_OPTIONS_ROUTER_FORCE_HTTPS
      - _APP_DOMAIN
      - _APP_CONSOLE_DOMAIN
      - _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
    extra_hosts:
      - "host.docker.internal:host-gateway"

  appwrite-worker-screenshots:
    entrypoint: worker-screenshots
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-screenshots
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - appwrite-uploads:/storage/uploads:rw
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      # Specific
      - _APP_BROWSER_HOST
      - _APP_WORKER_SCREENSHOTS_ROUTER
      - _APP_OPTIONS_FORCE_HTTPS
      # Basic
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_LOGGING_CONFIG
      # Database
      - _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
      # Storage
      - _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:
    entrypoint: worker-certificates
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-certificates
    image: appwrite-dev
    networks:
      - appwrite
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    volumes:
      - appwrite-config:/storage/config:rw
      - appwrite-certificates:/storage/certificates:rw
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_DATABASE_SHARED_TABLES

  appwrite-worker-executions:
    entrypoint: worker-executions
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-executions
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_DATABASE_SHARED_TABLES

  appwrite-worker-functions:
    entrypoint: worker-functions
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-functions
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=8
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_USAGE_STATS
      - _APP_DOCKER_HUB_USERNAME
      - _APP_DOCKER_HUB_PASSWORD
      - _APP_LOGGING_CONFIG
      - _APP_LOGGING_PROVIDER
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-mails:
    entrypoint: worker-mails
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-mails
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - maildev
      - ${_APP_DB_HOST:-mariadb}
      # - smtp
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _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_DOMAIN
      - _APP_OPTIONS_FORCE_HTTPS
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-messaging:
    entrypoint: worker-messaging
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-messaging
    restart: unless-stopped
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - appwrite-uploads:/storage/uploads:rw
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_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:
    entrypoint: worker-migrations
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-migrations
    restart: unless-stopped
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - appwrite-imports:/storage/imports:rw
      - appwrite-uploads:/storage/uploads:rw
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
      - ./tests:/usr/src/code/tests
      
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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_LOGGING_CONFIG
      - _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
    <<: [*x-logging, *x-build]
    container_name: appwrite-task-maintenance
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_DOMAIN
      - _APP_DOMAIN_TARGET_CNAME
      - _APP_DOMAIN_TARGET_AAAA
      - _APP_DOMAIN_TARGET_A
      - _APP_DOMAIN_TARGET_CAA
      - _APP_DNS
      - _APP_DOMAIN_FUNCTIONS
      - _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_USAGE_HOURLY
      - _APP_MAINTENANCE_RETENTION_SCHEDULES
      - _APP_MAINTENANCE_START_TIME
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-interval:
    entrypoint: interval
    <<: [*x-logging, *x-build]
    container_name: appwrite-task-interval
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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-stats-resources:
    container_name: appwrite-task-stats-resources
    entrypoint: stats-resources
    <<: [*x-logging, *x-build]
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _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_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_DATABASE_SHARED_TABLES
      - _APP_STATS_RESOURCES_INTERVAL

  appwrite-worker-stats-resources:
    entrypoint: worker-stats-resources
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-stats-resources
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _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_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_USAGE_AGGREGATION_INTERVAL
      - _APP_DATABASE_SHARED_TABLES

  appwrite-worker-stats-usage:
    entrypoint: worker-stats-usage
    <<: [*x-logging, *x-build]
    container_name: appwrite-worker-stats-usage
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - redis
      - ${_APP_DB_HOST:-mongodb}
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKERS_NUM=1
      - _APP_WORKER_MAX_COROUTINES=1
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _APP_OPENSSL_KEY_V1
      - _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_USAGE_STATS
      - _APP_LOGGING_CONFIG
      - _APP_USAGE_AGGREGATION_INTERVAL
      - _APP_DATABASE_SHARED_TABLES

  appwrite-task-scheduler-functions:
    entrypoint: schedule-functions
    <<: [*x-logging, *x-build]
    container_name: appwrite-task-scheduler-functions
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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-executions:
    entrypoint: schedule-executions
    <<: [*x-logging, *x-build]
    container_name: appwrite-task-scheduler-executions
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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:
    entrypoint: schedule-messages
    <<: [*x-logging, *x-build]
    container_name: appwrite-task-scheduler-messages
    image: appwrite-dev
    networks:
      - appwrite
    volumes:
      - ./app:/usr/src/code/app
      - ./src:/usr/src/code/src
    depends_on:
      - ${_APP_DB_HOST:-mongodb}
      - redis
      - appwrite-embedding
    environment:
      - _APP_ENV
      - _APP_WORKER_PER_CORE
      - _APP_POOL_ADAPTER
      - _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:
    container_name: appwrite-assistant
    image: appwrite/assistant:0.8.4
    networks:
      - appwrite
    environment:
      - _APP_ASSISTANT_OPENAI_API_KEY

  appwrite-browser:
    container_name: appwrite-browser
    image: appwrite/browser:0.3.2
    networks:
      - appwrite

  openruntimes-executor:
    container_name: openruntimes-executor
    hostname: exc1
    <<: *x-logging
    stop_signal: SIGINT
    image: openruntimes/executor:0.11.4
    restart: unless-stopped
    networks:
      - appwrite
      - runtimes
    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 nessessary 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_IMAGE_PULL=enabled
      - OPR_EXECUTOR_INACTIVE_TRESHOLD=$_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
      - OPR_EXECUTOR_LOGGING_CONFIG=$_APP_LOGGING_CONFIG
      - OPR_EXECUTOR_STORAGE_DEVICE=$_APP_STORAGE_DEVICE
      - OPR_EXECUTOR_STORAGE_S3_ACCESS_KEY=$_APP_STORAGE_S3_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_S3_SECRET=$_APP_STORAGE_S3_SECRET
      - OPR_EXECUTOR_STORAGE_S3_REGION=$_APP_STORAGE_S3_REGION
      - OPR_EXECUTOR_STORAGE_S3_BUCKET=$_APP_STORAGE_S3_BUCKET
      - OPR_EXECUTOR_STORAGE_S3_ENDPOINT=$_APP_STORAGE_S3_ENDPOINT
      - OPR_EXECUTOR_STORAGE_DO_SPACES_ACCESS_KEY=$_APP_STORAGE_DO_SPACES_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_DO_SPACES_SECRET=$_APP_STORAGE_DO_SPACES_SECRET
      - OPR_EXECUTOR_STORAGE_DO_SPACES_REGION=$_APP_STORAGE_DO_SPACES_REGION
      - OPR_EXECUTOR_STORAGE_DO_SPACES_BUCKET=$_APP_STORAGE_DO_SPACES_BUCKET
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_ACCESS_KEY=$_APP_STORAGE_BACKBLAZE_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_SECRET=$_APP_STORAGE_BACKBLAZE_SECRET
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_REGION=$_APP_STORAGE_BACKBLAZE_REGION
      - OPR_EXECUTOR_STORAGE_BACKBLAZE_BUCKET=$_APP_STORAGE_BACKBLAZE_BUCKET
      - OPR_EXECUTOR_STORAGE_LINODE_ACCESS_KEY=$_APP_STORAGE_LINODE_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_LINODE_SECRET=$_APP_STORAGE_LINODE_SECRET
      - OPR_EXECUTOR_STORAGE_LINODE_REGION=$_APP_STORAGE_LINODE_REGION
      - OPR_EXECUTOR_STORAGE_LINODE_BUCKET=$_APP_STORAGE_LINODE_BUCKET
      - OPR_EXECUTOR_STORAGE_WASABI_ACCESS_KEY=$_APP_STORAGE_WASABI_ACCESS_KEY
      - OPR_EXECUTOR_STORAGE_WASABI_SECRET=$_APP_STORAGE_WASABI_SECRET
      - OPR_EXECUTOR_STORAGE_WASABI_REGION=$_APP_STORAGE_WASABI_REGION
      - OPR_EXECUTOR_STORAGE_WASABI_BUCKET=$_APP_STORAGE_WASABI_BUCKET
    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

  mariadb:
    image: mariadb:10.11 # fix issues when upgrading using: mysql_upgrade -u root -p
    container_name: appwrite-mariadb
    <<: *x-logging
    networks:
      - appwrite
    volumes:
      - appwrite-mariadb:/var/lib/mysql:rw
    ports:
      - "3306:3306"
    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", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 5s
      timeout: 5s
      retries: 12

  mongodb:
    image: mongo:8.2.5
    container_name: appwrite-mongodb
    <<: *x-logging
    restart: on-failure:3
    networks:
      - appwrite
    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
    ports:
      - "27017:27017"
    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 "
          if mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval 'rs.status().ok' 2>/dev/null | grep -q 1; then
            exit 0
          else
            mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
              rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'appwrite-mongodb:27017'}]})
            \" 2>/dev/null || exit 1
          fi
        "
      interval: 10s
      timeout: 10s
      retries: 10
      start_period: 30s

  postgresql:
    image: appwrite/postgres:0.1.0
    container_name: appwrite-postgresql
    <<: *x-logging
    networks:
      - appwrite
    volumes:
      - appwrite-postgresql:/var/lib/postgresql/18/data:rw
    ports:
      - "5432:5432"
    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
      -c fsync=off
      -c synchronous_commit=off
      -c full_page_writes=off

  appwrite-embedding:
    image: appwrite/embedding:0.1.0
    environment:
      EMBEDDING_MODELS: ${_APP_EMBEDDING_MODELS:-nomic-embed-text}
    container_name: appwrite-embedding
    ports:
      - "3000:3000"
    restart: unless-stopped
    # persistent for caching models across restarts and preloading
    volumes:
      - appwrite-models:/home/embedder/models
    networks:
      - appwrite

  redis:
    image: redis:7.4.7-alpine
    <<: *x-logging
    container_name: appwrite-redis
    command: >
      redis-server
      --maxmemory            512mb
      --maxmemory-policy     allkeys-lru
      --maxmemory-samples    5
    ports:
      - "6379:6379"
    networks:
      - appwrite
    volumes:
      - appwrite-redis:/data:rw
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 5s
      retries: 12

  coredns: # DNS server for testing purposes (Proxy APIs)
    image: coredns/coredns:1.12.4
    container_name: appwrite-coredns
    restart: unless-stopped
    <<: *x-logging
    command: ["-conf", "/mnt/resources/Corefile"]
    # If you need to debug CoreDNS, do it from "appwrite container", or port forward:
    # ports:
    #  - "53:53"
    networks:
      appwrite:
        ipv4_address: 172.16.238.100
    volumes:
      - ./tests/resources/coredns:/mnt/resources:ro

  # Dev Tools Start ------------------------------------------------------------------------------------------
  #
  # The Appwrite Team uses the following tools to help debug, monitor and diagnose the Appwrite stack
  #
  # Here is a description of the different tools and why are we using them:
  #
  # MailCatcher - An SMTP server. Catches all system emails and displays them in a nice UI.
  # RequestCatcher - An HTTP server. Catches all system https calls and displays them using a simple HTTP API. Used to debug & tests webhooks and HTTP tasks
  # Redis Insight - A nice UI for exploring Redis data
  # Adminer - A nice UI for exploring MariaDB data
  # GraphQl Explorer - A nice UI for exploring GraphQL API

  maildev: # used mainly for dev tests
    image: appwrite/mailcatcher:1.1.1
    container_name: appwrite-mailcatcher
    <<: *x-logging
    ports:
      - "9503:1080"
    networks:
      - appwrite
      - gateway
    labels:
      - "traefik.enable=true"
      - "traefik.constraint-label-stack=appwrite"
      - "traefik.docker.network=gateway"
      - "traefik.http.services.appwrite_maildev.loadbalancer.server.port=1080"
      - "traefik.http.routers.appwrite_maildev_http.entrypoints=appwrite_web"
      - "traefik.http.routers.appwrite_maildev_http.rule=Host(`mail.localhost`)"
      - "traefik.http.routers.appwrite_maildev_http.service=appwrite_maildev"
      - "traefik.http.routers.appwrite_maildev_https.entrypoints=appwrite_websecure"
      - "traefik.http.routers.appwrite_maildev_https.rule=Host(`mail.localhost`)"
      - "traefik.http.routers.appwrite_maildev_https.service=appwrite_maildev"
      - "traefik.http.routers.appwrite_maildev_https.tls=true"
    environment:
      - MAILDEV_INCOMING_USER=${_APP_SMTP_USERNAME}
      - MAILDEV_INCOMING_PASS=${_APP_SMTP_PASSWORD}

  request-catcher-webhook: # used mainly for dev tests (mock HTTP webhook)
    image: appwrite/requestcatcher:1.1.0
    container_name: appwrite-requestcatcher-webhook
    <<: *x-logging
    ports:
      - "9504:5000"
    networks:
      - appwrite

  request-catcher-sms: # used mainly for dev tests (mock SMS auth secret)
    image: appwrite/requestcatcher:1.1.0
    container_name: appwrite-requestcatcher-sms
    <<: *x-logging
    ports:
      - "9507:5000"
    networks:
      - appwrite

  # Dev tools (adminer, redis-insight, mongo-express, graphql-explorer)
  # are defined in docker-compose.override.yml

networks:
  gateway:
    name: gateway
  appwrite:
    name: appwrite
    ipam:
      config:
        - subnet: 172.16.238.0/24
  runtimes:
    name: runtimes



volumes:
  appwrite-mariadb:
  appwrite-mongodb:
  appwrite-mongodb-keyfile:
  appwrite-postgresql:
  appwrite-redis:
  appwrite-cache:
  appwrite-uploads:
  appwrite-imports:
  appwrite-certificates:
  appwrite-functions:
  appwrite-sites:
  appwrite-builds:
  appwrite-config:
  appwrite-models:

This file may be out of date. Check the Appwrite documentation for current setup steps.

Track your self-hosted stack

Bookmark software to try, rate tools you've used, and keep your collection in one place.

Metadata extracted from README on Apr 24, 2026

Related Software

TrailBase logo

TrailBase

5.7k
TrailBase is a single-executable Firebase alternative with type-safe REST and realtime APIs, built for self-hosted applications.
Low Code DevelopmentSelf Hosting SolutionsDatabase Management+4
Details
PocketBase logo

PocketBase

61.6k
PocketBase is an open source Go backend with an embedded SQLite database, realtime subscriptions, built-in files and user management, an admin dashboard, and a simple REST-ish API.
Low Code DevelopmentPermissive LicenseDatabase Management+3
Details
Appsmith logo

Appsmith

41.1k
An open-source low-code platform for building, deploying, and maintaining custom applications.
Low Code DevelopmentPermissive LicenseAutomation Tools+3
Details
DreamFactory logo

DreamFactory

1.8k
DreamFactory is a self-hosted platform that provides governed API access to databases and other data sources for enterprise applications and local LLMs.
API ManagementDatabase ManagementLow Code Development+3
Details
Windmill logo

Windmill

18.3k
Windmill is an open-source developer platform for building APIs, background jobs, workflows, and internal UIs, with autogenerated forms and low-code app building.
FOSS with IssuesLow Code DevelopmentAutomation Tools+4
Open CoreFOSS with Issues
Details
FlowForge logo

FlowForge

401
FlowFuse is a platform for building and operating industrial applications at scale, powered by Node-RED and enhanced with AI assistance.
IoT PlatformsPermissive LicenseAutomation Tools+5
Details
UI Bakery logo

UI Bakery

302
UI Bakery is a low-code platform for building internal apps and workflow automations, with a self-hosted on-premise deployment option.
Low Code DevelopmentAutomation ToolsSelf Hosting Solutions+2
Open Core
Details
Mathesar logo

Mathesar

5.2k
Mathesar is a self-hosted web application that provides a spreadsheet-like interface for viewing, editing, querying, and collaborating on PostgreSQL data.
Database ManagementCopyleft LicenseLow Code Development+1
Details
Budibase logo

Budibase

28.4k
Budibase is an open-source operations platform for building AI agents, apps, and automations.
Low Code DevelopmentFOSS with IssuesOpen-Washing Risk+5
2 ContainersOpen CoreFOSS with Issues
Details
Saltcorn logo

Saltcorn

2.1k
Saltcorn is an open source no-code database application builder for creating web and mobile database apps.
Low Code DevelopmentDatabase ManagementWebsite Builders+3
2 Containers
Details
SQLPage logo

SQLPage

2.6k
An SQL-only web app builder that turns database queries into interactive websites.
Low Code DevelopmentWebsite BuildersDatabase Management+3
Details
Teable logo

Teable

21.9k
Teable is a spreadsheet-like no-code platform for creating database applications and collaborating with a team in real time.
Database ManagementLow Code DevelopmentSelf Hosting Solutions+1
6 ContainersOpen Core
Details