# Appwrite Plugin Design - Phase I > **MCP Plugin برای مدیریت Appwrite Self-Hosted روی Coolify** **Version**: v1.0.0 (طراحی) **Priority**: High (جایگزین Phase J) **Estimated Tools**: 85-95 --- ## Overview پلاگین Appwrite برای مدیریت **Appwrite Self-Hosted** روی Coolify طراحی شده است. Appwrite یک پلتفرم Backend-as-a-Service متنباز است که امکانات جامعی برای Database، Authentication، Storage، Functions و Messaging ارائه میدهد. ### مقایسه با Supabase ``` ┌─────────────────────────────────────────────────────────────────┐ │ Appwrite vs Supabase Self-Hosted │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ Appwrite: │ │ ├── Document-based Database (NoSQL-like) │ │ ├── Built-in Users & Teams management │ │ ├── Messaging (Email, SMS, Push) built-in │ │ ├── 30+ OAuth providers │ │ ├── Multi-runtime Functions (Node, Python, PHP, etc.) │ │ ├── Database Transactions (v1.8+) │ │ └── GraphQL + REST APIs │ │ │ │ Supabase: │ │ ├── PostgreSQL (relational) │ │ ├── GoTrue for Auth │ │ ├── No built-in messaging │ │ ├── Deno-only Edge Functions │ │ └── PostgREST for REST API │ │ │ │ هر دو: Self-Hosted، Open Source، Coolify-compatible │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### ویژگیهای Self-Hosted Appwrite ``` ✅ موجود در Self-Hosted: ├── Database API (Collections, Documents, Queries) ├── Users API (Users, Sessions, Teams, Memberships) ├── Storage API (Buckets, Files, Image Transformation) ├── Functions API (Deployments, Executions, Variables) ├── Messaging API (Email, SMS, Push Notifications) ├── Health API (Service status, Queue monitoring) ├── Avatars API (Image utilities) ├── Realtime API (WebSocket subscriptions) ├── GraphQL API (Alternative to REST) └── Webhooks & Events ❌ محدودیتها: ├── Console API (Project management) - نیاز به Console access ├── Rate limiting بالا (پیشفرض 60/دقیقه) - قابل تنظیم └── بعضی features نیاز به تنظیمات اضافی دارند ``` --- ## Authentication ### روشهای احراز هویت ``` ┌─────────────────────────────────────────────────────────────────┐ │ Appwrite Self-Hosted Authentication │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ API Key: │ │ ├── X-Appwrite-Key header │ │ ├── Server-side only │ │ ├── Scoped permissions │ │ ├── Bypasses rate limits │ │ └── Admin mode (bypasses permissions) │ │ │ │ JWT Token: │ │ ├── Authorization: Bearer {token} │ │ ├── 15-minute expiration │ │ ├── Respects user permissions │ │ └── Rate limited (10 tokens/60min/user) │ │ │ │ Session (Client): │ │ ├── Cookie-based │ │ ├── For client SDKs │ │ └── Subject to rate limiting │ │ │ │ Project ID: │ │ ├── X-Appwrite-Project header (required) │ │ └── Identifies which project to access │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### Environment Variables ```bash # Appwrite Self-Hosted Instance (Required) APPWRITE_SITE1_URL=https://appwrite.example.com/v1 APPWRITE_SITE1_PROJECT_ID=your-project-id APPWRITE_SITE1_API_KEY=your-api-key-with-scopes APPWRITE_SITE1_ALIAS=myappwrite # Multiple Instances APPWRITE_SITE2_URL=https://appwrite-staging.example.com/v1 APPWRITE_SITE2_PROJECT_ID=staging-project-id APPWRITE_SITE2_API_KEY=staging-api-key APPWRITE_SITE2_ALIAS=staging ``` ### API Key Scopes ``` Authentication & Users: ├── sessions.read / sessions.write ├── users.read / users.write └── teams.read / teams.write Database: ├── databases.read / databases.write ├── collections.read / collections.write (tables) ├── attributes.read / attributes.write (columns) ├── indexes.read / indexes.write └── documents.read / documents.write (rows) Storage: ├── buckets.read / buckets.write └── files.read / files.write Functions: ├── functions.read / functions.write └── execution.read / execution.write Messaging: ├── messages.read / messages.write ├── providers.read / providers.write ├── topics.read / topics.write └── subscribers.read / subscribers.write Other: ├── health.read ├── locale.read └── avatars.read ``` --- ## API Endpoints ### Base URL Structure ``` Self-Hosted: https://[SERVER_HOSTNAME]/v1 Database: GET/POST /databases GET/PUT/DELETE /databases/{databaseId} GET/POST /databases/{databaseId}/collections GET/POST /databases/{databaseId}/collections/{collectionId}/documents ... Users: GET/POST /users GET/PUT/DELETE /users/{userId} GET/DELETE /users/{userId}/sessions ... Storage: GET/POST /storage/buckets GET/POST /storage/buckets/{bucketId}/files GET /storage/buckets/{bucketId}/files/{fileId}/preview ... Functions: GET/POST /functions POST /functions/{functionId}/executions ... Messaging: GET/POST /messaging/providers GET/POST /messaging/topics POST /messaging/messages ... Health: GET /health GET /health/db GET /health/queue ... ``` --- ## Architecture ### Project Structure ``` plugins/appwrite/ ├── __init__.py # Export: AppwritePlugin, AppwriteClient ├── plugin.py # کلاس اصلی AppwritePlugin ├── client.py # AppwriteClient (REST client) └── handlers/ ├── __init__.py ├── databases.py # Database & Collections (18 tools) ├── documents.py # Document CRUD & Queries (12 tools) ├── users.py # User management (12 tools) ├── teams.py # Teams & Memberships (10 tools) ├── storage.py # Buckets & Files (14 tools) ├── functions.py # Functions & Executions (14 tools) ├── messaging.py # Email, SMS, Push (12 tools) └── system.py # Health & Avatars (8 tools) ``` ### Client Architecture ```python class AppwriteClient: """ REST API Client for Appwrite Self-Hosted All requests include Project ID and API Key headers. """ def __init__( self, base_url: str, # e.g., https://appwrite.example.com/v1 project_id: str, # Appwrite project ID api_key: str, # API key with required scopes ): self.base_url = base_url.rstrip('/') self.project_id = project_id self.api_key = api_key def _get_headers(self, additional_headers: Optional[Dict] = None) -> Dict[str, str]: """Get request headers with authentication.""" headers = { "Content-Type": "application/json", "X-Appwrite-Project": self.project_id, "X-Appwrite-Key": self.api_key, } if additional_headers: headers.update(additional_headers) return headers async def request( self, method: str, endpoint: str, params: Optional[Dict] = None, json_data: Optional[Dict] = None, headers_override: Optional[Dict] = None ) -> Any: """Make authenticated request to Appwrite API""" url = f"{self.base_url}{endpoint}" headers = self._get_headers(headers_override) # ... request logic ``` --- ## Tool Categories ### 1. Databases Handler (18 tools) مدیریت Databases و Collections | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_databases` | GET | read | لیست databases | | `get_database` | GET | read | جزئیات database | | `create_database` | POST | write | ایجاد database | | `update_database` | PUT | write | بهروزرسانی database | | `delete_database` | DELETE | admin | حذف database | | `list_collections` | GET | read | لیست collections | | `get_collection` | GET | read | جزئیات collection | | `create_collection` | POST | write | ایجاد collection | | `update_collection` | PUT | write | بهروزرسانی collection | | `delete_collection` | DELETE | admin | حذف collection | | `list_attributes` | GET | read | لیست attributes | | `create_string_attribute` | POST | write | attribute متنی | | `create_integer_attribute` | POST | write | attribute عددی | | `create_boolean_attribute` | POST | write | attribute boolean | | `create_enum_attribute` | POST | write | attribute enum | | `create_datetime_attribute` | POST | write | attribute تاریخ | | `delete_attribute` | DELETE | admin | حذف attribute | | `list_indexes` | GET | read | لیست indexes | | `create_index` | POST | write | ایجاد index | | `delete_index` | DELETE | admin | حذف index | ```python # Create Collection Example { "name": "create_collection", "method_name": "create_collection", "description": "Create a new collection in database", "schema": { "type": "object", "properties": { "database_id": { "type": "string", "description": "Database ID" }, "collection_id": { "type": "string", "description": "Unique collection ID (use 'unique()' for auto)" }, "name": { "type": "string", "description": "Collection name" }, "permissions": { "type": "array", "items": {"type": "string"}, "description": "Array of permission strings", "default": [] }, "document_security": { "type": "boolean", "description": "Enable document-level permissions", "default": true }, "enabled": { "type": "boolean", "default": true } }, "required": ["database_id", "collection_id", "name"] }, "scope": "write" } ``` ### 2. Documents Handler (12 tools) عملیات CRUD روی Documents | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_documents` | GET | read | لیست documents با فیلتر | | `get_document` | GET | read | دریافت یک document | | `create_document` | POST | write | ایجاد document | | `update_document` | PATCH | write | بهروزرسانی document | | `delete_document` | DELETE | write | حذف document | | `bulk_create_documents` | POST | write | ایجاد دستهای | | `bulk_update_documents` | PATCH | write | بهروزرسانی دستهای | | `bulk_delete_documents` | DELETE | write | حذف دستهای | | `count_documents` | GET | read | شمارش documents | | `search_documents` | GET | read | جستجوی full-text | | `create_transaction` | POST | admin | شروع transaction (v1.8+) | | `commit_transaction` | PUT | admin | commit/rollback transaction | ```python # List Documents with Queries { "name": "list_documents", "method_name": "list_documents", "description": "List documents with queries, filters, and pagination", "schema": { "type": "object", "properties": { "database_id": { "type": "string", "description": "Database ID" }, "collection_id": { "type": "string", "description": "Collection ID" }, "queries": { "type": "array", "items": {"type": "string"}, "description": "Query strings (e.g., 'equal(\"status\", \"active\")')", "examples": [ "equal(\"status\", [\"active\"])", "greaterThan(\"price\", 100)", "search(\"title\", \"keyword\")", "orderDesc(\"createdAt\")", "limit(25)", "offset(0)" ] } }, "required": ["database_id", "collection_id"] }, "scope": "read" } ``` ### 3. Users Handler (12 tools) مدیریت کاربران | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_users` | GET | read | لیست کاربران | | `get_user` | GET | read | جزئیات کاربر | | `create_user` | POST | write | ایجاد کاربر | | `update_user` | PATCH | write | بهروزرسانی کاربر | | `delete_user` | DELETE | admin | حذف کاربر | | `update_user_email` | PATCH | write | تغییر ایمیل | | `update_user_phone` | PATCH | write | تغییر تلفن | | `update_user_status` | PATCH | admin | فعال/غیرفعال کردن | | `update_user_labels` | PUT | admin | تنظیم labels | | `list_user_sessions` | GET | read | لیست sessions | | `delete_user_sessions` | DELETE | admin | حذف همه sessions | | `delete_user_session` | DELETE | admin | حذف یک session | ```python # Create User Example { "name": "create_user", "method_name": "create_user", "description": "Create a new user", "schema": { "type": "object", "properties": { "user_id": { "type": "string", "description": "Unique user ID (use 'unique()' for auto)" }, "email": { "type": "string", "format": "email", "description": "User email" }, "phone": { "type": "string", "description": "Phone number (E.164 format)" }, "password": { "type": "string", "minLength": 8, "description": "Password (min 8 chars)" }, "name": { "type": "string", "description": "User display name" } }, "required": ["user_id"] }, "scope": "write" } ``` ### 4. Teams Handler (10 tools) مدیریت Teams و Memberships | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_teams` | GET | read | لیست teams | | `get_team` | GET | read | جزئیات team | | `create_team` | POST | write | ایجاد team | | `update_team` | PUT | write | بهروزرسانی team | | `delete_team` | DELETE | admin | حذف team | | `list_team_memberships` | GET | read | لیست اعضا | | `create_team_membership` | POST | write | دعوت عضو | | `update_membership` | PATCH | write | بهروزرسانی عضویت | | `delete_membership` | DELETE | write | حذف عضو | | `update_membership_status` | PATCH | write | تایید/رد عضویت | ### 5. Storage Handler (14 tools) مدیریت Buckets و Files | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_buckets` | GET | read | لیست buckets | | `get_bucket` | GET | read | جزئیات bucket | | `create_bucket` | POST | write | ایجاد bucket | | `update_bucket` | PUT | write | بهروزرسانی bucket | | `delete_bucket` | DELETE | admin | حذف bucket | | `list_files` | GET | read | لیست فایلها | | `get_file` | GET | read | جزئیات فایل | | `create_file` | POST | write | آپلود فایل | | `update_file` | PUT | write | بهروزرسانی فایل | | `delete_file` | DELETE | write | حذف فایل | | `get_file_download` | GET | read | دانلود فایل | | `get_file_preview` | GET | read | پیشنمایش تصویر | | `get_file_view` | GET | read | مشاهده در browser | | `move_file` | PUT | write | انتقال فایل | ```python # Get File Preview with Transformations { "name": "get_file_preview", "method_name": "get_file_preview", "description": "Get image preview with transformations", "schema": { "type": "object", "properties": { "bucket_id": {"type": "string"}, "file_id": {"type": "string"}, "width": { "type": "integer", "minimum": 0, "maximum": 4000, "description": "Preview width (0-4000)" }, "height": { "type": "integer", "minimum": 0, "maximum": 4000, "description": "Preview height (0-4000)" }, "gravity": { "type": "string", "enum": ["center", "top", "top-left", "top-right", "left", "right", "bottom", "bottom-left", "bottom-right"], "default": "center" }, "quality": { "type": "integer", "minimum": 0, "maximum": 100, "default": 90 }, "output": { "type": "string", "enum": ["jpeg", "jpg", "png", "gif", "webp", "avif"], "default": "webp" }, "rotation": { "type": "integer", "minimum": 0, "maximum": 360 }, "background": { "type": "string", "description": "Background color (hex without #)" }, "border_width": {"type": "integer"}, "border_color": {"type": "string"}, "border_radius": {"type": "integer"} }, "required": ["bucket_id", "file_id"] }, "scope": "read" } ``` ### 6. Functions Handler (14 tools) مدیریت Serverless Functions | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_functions` | GET | read | لیست functions | | `get_function` | GET | read | جزئیات function | | `create_function` | POST | write | ایجاد function | | `update_function` | PUT | write | بهروزرسانی function | | `delete_function` | DELETE | admin | حذف function | | `list_deployments` | GET | read | لیست deployments | | `get_deployment` | GET | read | جزئیات deployment | | `create_deployment` | POST | write | deploy کد جدید | | `delete_deployment` | DELETE | write | حذف deployment | | `update_deployment` | PATCH | write | فعال کردن deployment | | `list_executions` | GET | read | لیست executions | | `get_execution` | GET | read | جزئیات execution | | `create_execution` | POST | write | اجرای function | | `delete_execution` | DELETE | write | حذف execution log | ```python # Create Execution (Run Function) { "name": "create_execution", "method_name": "create_execution", "description": "Execute a function", "schema": { "type": "object", "properties": { "function_id": { "type": "string", "description": "Function ID" }, "body": { "type": "string", "description": "Request body (string or JSON string)" }, "async": { "type": "boolean", "default": false, "description": "Run asynchronously" }, "path": { "type": "string", "description": "Custom execution path" }, "method": { "type": "string", "enum": ["GET", "POST", "PUT", "PATCH", "DELETE"], "default": "POST" }, "headers": { "type": "object", "description": "Custom headers" } }, "required": ["function_id"] }, "scope": "write" } ``` ### 7. Messaging Handler (12 tools) ارسال پیام از طریق Email, SMS, Push | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `list_providers` | GET | read | لیست providers | | `get_provider` | GET | read | جزئیات provider | | `create_email_provider` | POST | admin | ایجاد email provider | | `create_sms_provider` | POST | admin | ایجاد SMS provider | | `create_push_provider` | POST | admin | ایجاد push provider | | `delete_provider` | DELETE | admin | حذف provider | | `list_topics` | GET | read | لیست topics | | `create_topic` | POST | write | ایجاد topic | | `delete_topic` | DELETE | write | حذف topic | | `create_subscriber` | POST | write | اضافه کردن subscriber | | `delete_subscriber` | DELETE | write | حذف subscriber | | `send_message` | POST | write | ارسال پیام | ```python # Send Email Message { "name": "send_message", "method_name": "send_message", "description": "Send email, SMS, or push notification", "schema": { "type": "object", "properties": { "message_id": { "type": "string", "description": "Unique message ID" }, "type": { "type": "string", "enum": ["email", "sms", "push"], "description": "Message type" }, "topics": { "type": "array", "items": {"type": "string"}, "description": "Target topic IDs" }, "targets": { "type": "array", "items": {"type": "string"}, "description": "Target user IDs" }, "subject": { "type": "string", "description": "Email subject" }, "content": { "type": "string", "description": "Message content (HTML for email)" }, "scheduled_at": { "type": "string", "format": "date-time", "description": "Schedule delivery time" } }, "required": ["message_id", "type", "content"] }, "scope": "write" } ``` ### 8. System Handler (8 tools) سلامت سیستم و Utilities | Tool | Method | Scope | Description | |------|--------|-------|-------------| | `health_check` | GET | read | وضعیت کلی سرور | | `health_db` | GET | read | وضعیت database | | `health_cache` | GET | read | وضعیت cache | | `health_queue` | GET | read | وضعیت queue | | `health_storage` | GET | read | وضعیت storage | | `health_time` | GET | read | همزمانی ساعت | | `get_avatar_initials` | GET | read | آواتار از initials | | `get_avatar_image` | GET | read | آواتار از URL | --- ## Query System ### Query Operators Appwrite از سیستم Query مخصوص خود استفاده میکند: ```javascript // Comparison Query.equal("status", ["active"]) Query.notEqual("status", ["deleted"]) Query.lessThan("price", 100) Query.lessThanOrEqual("price", 100) Query.greaterThan("price", 50) Query.greaterThanOrEqual("price", 50) Query.between("price", 50, 100) // String Query.startsWith("name", "John") Query.endsWith("email", "@example.com") Query.search("title", "keyword") // Requires fulltext index // Array Query.contains("tags", ["featured"]) Query.isNull("deleted_at") Query.isNotNull("published_at") // Sorting & Pagination Query.orderAsc("created_at") Query.orderDesc("created_at") Query.limit(25) Query.offset(0) Query.cursorAfter("document_id") Query.cursorBefore("document_id") // Selection Query.select(["id", "name", "email"]) ``` ### Query در REST API ```bash # Example: List active users, sorted by creation date GET /databases/{dbId}/collections/{colId}/documents?queries[]=equal("status",["active"])&queries[]=orderDesc("$createdAt")&queries[]=limit(25) ``` --- ## Tool Summary | Handler | Tools | Description | |---------|-------|-------------| | Databases | 18 | Database, Collections, Attributes, Indexes | | Documents | 12 | Document CRUD, Bulk ops, Transactions | | Users | 12 | User management | | Teams | 10 | Teams & Memberships | | Storage | 14 | Buckets, Files, Image transformation | | Functions | 14 | Functions, Deployments, Executions | | Messaging | 12 | Email, SMS, Push notifications | | System | 8 | Health checks, Avatars | | **Total** | **100** | | --- ## Implementation Phases ### Phase I.1: Core (Database + System) - 38 tools **هدف**: دسترسی اولیه به Appwrite Self-Hosted 1. **AppwritePlugin** class 2. **AppwriteClient** (REST client) 3. **Databases Handler** (18 tools) 4. **Documents Handler** (12 tools) 5. **System Handler** (8 tools) ### Phase I.2: Auth & Teams - 22 tools **هدف**: مدیریت کاربران و تیمها 1. **Users Handler** (12 tools) 2. **Teams Handler** (10 tools) **جمع**: 60 tools ### Phase I.3: Storage - 14 tools **هدف**: مدیریت فایلها 1. **Storage Handler** (14 tools) **جمع**: 74 tools ### Phase I.4: Functions & Messaging - 26 tools **هدف**: قابلیتهای پیشرفته 1. **Functions Handler** (14 tools) 2. **Messaging Handler** (12 tools) **جمع**: 100 tools --- ## Error Handling ### HTTP Status Codes ```python async def handle_appwrite_error(response): """Handle Appwrite API errors""" data = await response.json() message = data.get("message", "Unknown error") code = data.get("code", response.status) error_type = data.get("type", "general_error") if response.status == 400: raise ValidationError(f"Bad Request: {message}") elif response.status == 401: raise AuthError("Invalid API key or missing authentication") elif response.status == 403: raise PermissionError(f"Permission denied: {message}") elif response.status == 404: raise NotFoundError(f"Resource not found: {message}") elif response.status == 409: raise ConflictError(f"Conflict: {message}") elif response.status == 429: raise RateLimitError("Rate limit exceeded. Try again later.") elif response.status >= 500: raise ServerError(f"Server error ({code}): {message}") else: raise AppwriteError(f"Error ({code}): {message}") ``` ### Common Error Types ``` user_not_found - کاربر پیدا نشد document_not_found - document پیدا نشد collection_not_found - collection پیدا نشد database_not_found - database پیدا نشد storage_bucket_not_found - bucket پیدا نشد storage_file_not_found - فایل پیدا نشد document_already_exists - document تکراری user_already_exists - کاربر تکراری attribute_already_exists - attribute تکراری ``` --- ## Security Considerations ### API Key Security ``` ┌─────────────────────────────────────────────────────────────────┐ │ API Key Best Practices │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ ✅ Best Practices: │ │ ├── Create separate keys for different purposes │ │ ├── Use minimal required scopes │ │ ├── Rotate keys periodically │ │ ├── Never expose keys in client-side code │ │ └── Use environment variables for storage │ │ │ │ ⚠️ Scope Recommendations: │ │ ├── Read operations: *.read scopes only │ │ ├── Write operations: specific *.write scopes │ │ └── Admin operations: all scopes + careful monitoring │ │ │ │ ❌ Never Do: │ │ ├── Log API keys (even partially) │ │ ├── Commit keys to version control │ │ ├── Share keys across different services │ │ └── Use single key for all operations │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### Permission System ```python # Document-level permissions permissions = [ "read(\"user:123\")", # Specific user can read "write(\"user:123\")", # Specific user can write "read(\"team:456\")", # Team members can read "read(\"any\")", # Anyone can read (public) "create(\"users\")", # Any authenticated user "update(\"label:admin\")", # Users with admin label ] ``` --- ## Example Usage ### Query Documents ```json { "tool": "list_documents", "args": { "site": "myappwrite", "database_id": "main", "collection_id": "posts", "queries": [ "equal(\"status\", [\"published\"])", "greaterThan(\"views\", 100)", "orderDesc(\"$createdAt\")", "limit(20)" ] } } ``` ### Create User ```json { "tool": "create_user", "args": { "site": "myappwrite", "user_id": "unique()", "email": "user@example.com", "password": "securePassword123", "name": "John Doe" } } ``` ### Upload File ```json { "tool": "create_file", "args": { "site": "myappwrite", "bucket_id": "avatars", "file_id": "unique()", "file_content_base64": "iVBORw0KGgoAAAANSUhEUgAA...", "file_name": "avatar.png", "permissions": ["read(\"any\")"] } } ``` ### Execute Function ```json { "tool": "create_execution", "args": { "site": "myappwrite", "function_id": "send-welcome-email", "body": "{\"userId\": \"123\", \"template\": \"welcome\"}", "async": false } } ``` ### Send Email ```json { "tool": "send_message", "args": { "site": "myappwrite", "message_id": "unique()", "type": "email", "targets": ["user-123"], "subject": "Welcome to our platform!", "content": "
Thanks for signing up.
" } } ``` --- ## Coolify Deployment Notes ### Finding Appwrite Credentials در Coolify، بعد از deploy کردن Appwrite: 1. **URL**: از Coolify dashboard → Project → Appwrite → Domain - معمولاً: `https://appwrite.yourdomain.com/v1` 2. **Project ID**: - در Appwrite Console → Settings → Project ID - یا از URL بعد از login 3. **API Key**: - Appwrite Console → Project → Settings → API Keys → Create - Scopes مورد نیاز را انتخاب کنید ### Docker Compose Services ```yaml # Appwrite services on Coolify services: appwrite: # Main API - port 80 appwrite-realtime: # Realtime WebSocket appwrite-executor: # Function execution appwrite-worker-*: # Background workers mariadb: # Database redis: # Cache influxdb: # Metrics (optional) ``` ### Environment Variables (Appwrite Server) ```bash # Key settings in Appwrite .env _APP_ENV=production _APP_DOMAIN=appwrite.yourdomain.com _APP_DOMAIN_TARGET=appwrite.yourdomain.com _APP_OPTIONS_ABUSE=enabled # Rate limiting _APP_FUNCTIONS_RUNTIMES=node-18.0,python-3.9,php-8.0 ``` --- ## Endpoint Registration ### Endpoint Config ```python # core/endpoints/config.py EndpointType.APPWRITE: EndpointConfig( path="/appwrite", name="Appwrite Manager", description="Appwrite Self-Hosted management (database, auth, storage, functions, messaging)", endpoint_type=EndpointType.APPWRITE, plugin_types=["appwrite"], require_master_key=False, allowed_scopes={"read", "write", "admin"}, tool_blacklist={ "manage_api_keys_create", "manage_api_keys_delete", "manage_api_keys_rotate", "oauth_register_client", "oauth_revoke_client", }, max_tools=110, ), ``` --- ## Comparison: Appwrite vs Supabase Tools | Feature | Appwrite | Supabase | |---------|----------|----------| | Database Tools | 30 (Documents + Databases) | 18 (PostgREST) | | Auth Tools | 22 (Users + Teams) | 14 (GoTrue) | | Storage Tools | 14 | 12 | | Functions Tools | 14 | 8 | | Messaging Tools | 12 | 0 (not built-in) | | System Tools | 8 | 6 | | Admin Tools | - | 12 (postgres-meta) | | **Total** | **100** | **70** | **نکته**: Appwrite ابزارهای بیشتری دارد چون: - Messaging built-in دارد - Teams management جداگانه دارد - Document/Collection model متفاوت است - Image transformation پیشرفتهتر است --- ## Testing Checklist ### Unit Tests - [ ] AppwriteClient authentication - [ ] Database CRUD operations - [ ] Document queries with all operators - [ ] User management operations - [ ] Team operations - [ ] File upload/download - [ ] Function execution - [ ] Message sending - [ ] Error handling ### Integration Tests - [ ] Create database and collection - [ ] CRUD documents with queries - [ ] Create user and authenticate - [ ] Upload and preview image - [ ] Execute serverless function - [ ] Send email through messaging - [ ] Health check all services - [ ] Rate limit handling --- ## Function Runtimes ### Supported Runtimes (v1.8+) | Runtime | Versions | |---------|----------| | Node.js | 18.x, 20.x | | Python | 3.9, 3.10, 3.11, 3.12 | | PHP | 8.0, 8.1, 8.2, 8.3 | | Ruby | 3.0, 3.1, 3.2, 3.3 | | Java | 11, 17, 21 | | Go | 1.18, 1.19, 1.20, 1.21 | | Dart | 3.0, 3.1, 3.2, 3.3 | | Rust | 1.60, 1.65, 1.70, 1.75 | | C# | 8, 11, 12 | | Swift | 5.5, 5.8, 5.9 | | Kotlin | 1.8 | --- ## References - [Appwrite Documentation](https://appwrite.io/docs) - [Appwrite REST API Reference](https://appwrite.io/docs/apis/rest) - [Appwrite Self-Hosting Guide](https://appwrite.io/docs/advanced/self-hosting) - [Appwrite Server SDKs](https://appwrite.io/docs/sdks) - [Appwrite GitHub Repository](https://github.com/appwrite/appwrite) - [Appwrite Database Queries](https://appwrite.io/docs/products/databases/queries) - [Appwrite Permissions](https://appwrite.io/docs/advanced/platform/permissions) - [Appwrite Functions](https://appwrite.io/docs/products/functions) - [Appwrite Messaging](https://appwrite.io/docs/products/messaging) --- **Created**: 2025-12-02 **Author**: Claude AI Assistant **Status**: Design Phase (Ready for Implementation)