Appwrite
集认证、数据库、存储、函数、实时和消息于一体的开源后端平台。
项目概述
Appwrite 为 Web、移动端和服务端应用提供统一 API 与多语言 SDK,可直接使用 Appwrite Cloud,也能通过 Docker 自行托管完整后端。
Appwrite 是采用 BSD-3-Clause 许可证的开源 Backend-as-a-Service 平台。它把 Authentication、TablesDB、Storage、Functions、Realtime、Messaging 和 Sites 等能力放在统一项目、权限模型、Console、REST / GraphQL API 与多语言 SDK 中,让 Web、移动端和原生应用无需从零搭建常见后端基础设施。TablesDB 使用数据库、表、列和行组织结构化数据,并通过用户、团队、标签和角色权限控制访问;Functions 可由 HTTP、SDK、事件、Webhook 或 Cron 触发;Realtime 则通过 WebSocket 推送用户有权访问的资源变化。团队可以选择 Appwrite Cloud,也可以在支持 Docker 的环境中运行同一套自托管平台。
主要特点
Appwrite 将应用后端常用的身份、数据、文件、计算、实时通信和消息投递整合为统一 API、SDK 与权限体系。
多方式身份认证
支持邮箱密码、Phone、Magic URL、Email OTP、OAuth、Anonymous、JWT、MFA 和 SSR Session,并通过 Account API 管理用户偏好与会话。
TablesDB 结构化数据
以数据库、表、列和行建模数据,支持查询、排序、分页、关系以及表级和行级权限,并通过统一 JSON API 访问。
细粒度权限体系
可向特定用户、团队、标签或角色授予 Read、Create、Update、Delete 权限,认证身份会自动参与资源授权。
对象存储
Bucket 和文件支持权限、预览、压缩、加密及多种存储适配器,自托管时可选择本地磁盘或 S3 兼容服务。
Realtime 订阅
通过 WebSocket 订阅 Auth、TablesDB、Storage 和 Function 事件,并只向当前会话推送有权限读取的资源。
多运行时 Functions
函数运行在隔离容器,可由 HTTP、SDK、平台事件、Webhook 或 Cron 调用,并支持环境变量、权限 Scope、日志和版本化部署。
Messaging
统一管理 Push、Email 和 SMS 的 Provider、Target、Topic、草稿和定时发送,适合通知、营销与安全消息。
多平台 SDK 与开放 API
为 Web、Flutter、Apple、Android、React Native、Node.js、Python、Deno、Go 等平台提供 SDK,同时开放 REST、GraphQL 和 Realtime API。
适用场景
适合希望快速交付 Web 或移动产品,同时保留自托管路径和多语言客户端支持的团队。
Web 与移动端 MVP
认证、数据、文件和 SDK 可以减少后端样板代码,让团队优先验证产品流程与用户体验。
会员与社区产品
Account、Team、Label、Permission、Realtime 和 Messaging 可组合账户、组织、关注、通知与在线互动。
内容和媒体应用
TablesDB 管理元数据,Storage 保存图片、视频和附件,Function 负责转码、审核或第三方处理。
实时协作工具
数据和文件事件可驱动聊天、任务状态、协作通知和实时列表,但高频协作仍需验证连接与事件配额。
事件驱动自动化
Functions 通过数据、用户、文件、Webhook 和定时事件执行邮件、同步、清理及外部 API 集成。
需要数据自主权的项目
Docker 自托管适合开发环境、合规或数据位置有明确要求的团队,但需要自行承担完整平台运维。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Appwrite 擅长的地方
- 认证、数据、文件、函数、实时和消息共享统一项目、Console 与权限模型
- Client SDK 和 Server SDK 覆盖多种 Web、移动、原生和后端语言
- Appwrite Cloud 可快速启动,自托管又提供数据位置和基础设施控制权
- 资源权限可直接关联用户、团队、标签和角色,适合多类应用访问模型
- Functions 支持 HTTP、事件、Webhook 和 Cron,便于构建事件驱动后端
- 开放 REST、GraphQL 与 Realtime API,客户端不必绑定单一框架
需要注意
采用前应考虑的问题
表、行、Bucket、文件和函数权限需要分别设计;公开 Role.any()、遗漏用户约束或在 Server SDK 中创建无预期权限的资源都可能造成越权。
浏览器使用用户 Session,API Key 只能存在于可信服务器或 Function,并且必须限制 Scope、定期轮换和避免写入日志。
TablesDB 提供统一行模型和 Query API,但不像直接 PostgreSQL 那样开放完整 SQL、扩展、事务与查询计划能力,复杂数据需求应提前验证。
生产自托管需要负责数据库、队列、缓存、执行器、存储、代理、TLS、邮件、监控、备份、扩容和版本迁移,并不只是运行单个容器。
数据库、表、列、索引和权限应通过 CLI、脚本或可审查流程同步到各环境,避免只在 Console 中手工修改造成漂移。
订阅使用创建时已有的用户会话;登录、退出或切换用户后应断开并重新创建受保护资源订阅。
冷启动、并发、Timeout、Runtime、依赖构建和日志隐私会影响生产行为,长任务应拆分或交给更合适的异步基础设施。
不同运行时、区域、存储和企业功能的可用性可能不同;迁移前应验证目标版本、数据导出、Provider 和容量限制。
快速开始
创建 Web 平台、安装官方 SDK,并实现账户登录、受权限保护的数据行和文件上传。
bashnpm install appwritetypescriptimport {
Account,
Client,
Storage,
TablesDB,
} from "appwrite";
export const client = new Client()
.setEndpoint("https://<REGION>.cloud.appwrite.io/v1")
.setProject("<PROJECT_ID>");
export const account = new Account(client);
export const tablesDB = new TablesDB(client);
export const storage = new Storage(client);typescriptimport { ID } from "appwrite";
import { account } from "./appwrite";
await account.create({
userId: ID.unique(),
email: "reader@example.com",
password: "replace-with-a-strong-password",
name: "Reader",
});
await account.createEmailPasswordSession({
email: "reader@example.com",
password: "replace-with-a-strong-password",
});
const user = await account.get();
console.log(user.$id, user.name);typescriptimport {
ID,
Permission,
Role,
} from "appwrite";
import { account, tablesDB } from "./appwrite";
const user = await account.get();
const todo = await tablesDB.createRow({
databaseId: "<DATABASE_ID>",
tableId: "<TABLE_ID>",
rowId: ID.unique(),
data: {
title: "学习 Appwrite 权限",
completed: false,
},
permissions: [
Permission.read(Role.user(user.$id)),
Permission.update(Role.user(user.$id)),
Permission.delete(Role.user(user.$id)),
],
});
console.log(todo);typescriptimport { Query } from "appwrite";
import { tablesDB } from "./appwrite";
const result = await tablesDB.listRows({
databaseId: "<DATABASE_ID>",
tableId: "<TABLE_ID>",
queries: [
Query.equal("completed", false),
Query.orderDesc("$createdAt"),
Query.limit(20),
],
});
console.log(result.rows);typescriptimport { ID } from "appwrite";
import { storage } from "./appwrite";
const input = document.querySelector<HTMLInputElement>("#file");
const file = input?.files?.[0];
if (!file) {
throw new Error("请选择文件");
}
const uploaded = await storage.createFile({
bucketId: "<BUCKET_ID>",
fileId: ID.unique(),
file,
});
console.log(uploaded.$id);bashdocker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
appwrite/appwrite:1.9.6下一步:浏览器只能使用 Client SDK 和用户会话。API Key 只能放在可信服务端,并应授予最小 Scope;数据库、表、行、Bucket、文件与函数都要逐项核对权限,不能把 Console 可见误认为客户端可安全访问。
类似项目
这些平台同样提供数据库、认证、存储和服务端逻辑,但在数据模型、授权方式、自托管复杂度和托管生态上不同。
Appwrite vs Supabase
Appwrite 和 Supabase 都提供开源、可托管或自托管的应用后端。Appwrite 将 TablesDB、Auth、Storage、Functions、Realtime 和 Messaging 封装为统一平台 API;Supabase 则以完整 PostgreSQL、SQL、RLS 和数据库生态为中心,再围绕它提供认证、存储、实时与边缘函数。
| 比较维度 | Appwrite | Supabase |
|---|---|---|
| 核心数据模型 | TablesDB 的数据库、表、列与行抽象 | 完整 PostgreSQL、Schema、表、关系与 SQL |
| 查询能力 | SDK Query、REST / GraphQL 与平台统一 API | SQL、PostgREST、函数、视图、事务和扩展 |
| 授权方式 | 资源 Permission、Role、User、Team 与 Label | Postgres Role、Grant、JWT 与 Row Level Security |
| 服务端计算 | 隔离容器、多运行时、事件和 Cron Functions | Deno Edge Functions、Postgres Function 与 Trigger |
| 实时能力 | 对 Auth、TablesDB、Storage 和 Function 事件订阅 | Broadcast、Presence 与 Postgres Changes |
| 消息能力 | 内建 Push、Email、SMS、Provider、Topic 与 Schedule | 通常通过 Edge Function 和第三方消息服务组合 |
| 数据可移植性 | 通过 Appwrite API、备份与迁移流程管理 | 标准 PostgreSQL 工具、连接和 SQL 生态更开放 |
| 更适合 | 多端 SDK、一体化服务、消息和平台抽象优先 | 关系数据、复杂 SQL、数据库控制与 Postgres 生态优先 |
如果团队希望通过统一 SDK 快速获得认证、数据、文件、Functions、Realtime 和 Messaging,并重视 Web、移动与原生平台覆盖,Appwrite 更完整;如果业务依赖复杂关系、SQL、事务、PostgreSQL 扩展和数据库级可移植性,Supabase 更自然。两者自托管都需要真实运维投入,选型前应使用权限、迁移、备份和峰值负载做原型验证。
资料核验
版本、维护信息与本页采用的官方资料来源。
本页依据 Appwrite 官方文档、Web Quick Start、Authentication、TablesDB、Functions、Realtime、自托管说明和官方源码仓库整理。版本与许可证通过 GitHub 官方 API 核验;快速开始采用当前 Web SDK 的对象参数和 TablesDB 行 API。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 27 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。