Appwrite 2026:开源 Firebase 替代方案 — 认证、数据库与存储自托管后端完整指南
Appwrite 1.6 完整指南 — 自托管开源后端,包含认证、数据库、存储、云函数和实时订阅功能。Docker 部署、SDK 集成、基准测试和生产环境加固。
- ⭐ 47200
- BSD-3-Clause
- 更新于 2026-05-19
{{< resource-info >}}
引言:Firebase 制造的 85 亿美元难题 #
2024 年,Firebase 服务了超过 300 万个应用。但同时,它也将这些开发者锁定在了 Google 的生态系统中,收取不可预测的数据传输费用,并且不提供任何自托管选项。2025 年 3 月,一家我曾提供咨询的中型 SaaS 创业公司收到了 12,000 美元的 Firestore 读取费用账单,他们开始寻找替代方案。他们发现了 Appwrite。
Appwrite 是一个开源的后端即服务(BaaS)平台,提供认证、数据库、存储、云函数和实时订阅功能 — 全部打包在一个由你控制的 Docker 容器中。拥有 47,200+ GitHub Stars、1.6.x 稳定版本,以及 BSD-3-Clause 许可证,它已成为最可信的开源 Firebase 替代方案,适合那些想要 Google 级后端功能但不愿承受 Google 级供应商锁定的团队。
本指南将在 5 分钟内带你完成生产级 Appwrite 的搭建,集成 JavaScript、Python 和 Flutter SDK,并涵盖大多数教程跳过的加固步骤。没有营销废话,只有可用的代码。
什么是 Appwrite? #
Appwrite 是一个自托管的后端服务器,以 Docker 堆栈的形式打包,包含以下功能:
- 认证 — 邮箱/密码、OAuth2、魔法链接、手机验证码、匿名登录
- 数据库 — 基于 MongoDB/MariaDB 的面向文档的 NoSQL 数据库
- 存储 — 支持压缩、加密和 CDN 就绪交付的文件上传
- 云函数 — 支持 15+ 运行时的无服务器函数
- 实时功能 — 基于 WebSocket 的数据库和认证事件实时订阅
- 消息推送 — 推送通知、短信和邮件(1.5+ 版本新增)
一条 docker compose up 命令即可为你提供完整的后端 API,支持 Web、Flutter、Android、iOS 和服务端 Node.js/Python/PHP 的多平台 SDK。
Appwrite 的工作原理:架构概览 #
Appwrite 采用模块化的微服务架构,使用 Docker 容器化部署:
┌─────────────────────────────────────────────────────┐
│ Appwrite 技术栈 │
├─────────────┬─────────────┬─────────────┬───────────┤
│ API 网关 │ 认证服务 │ 数据库 │ 存储 │
│ (Traefik) │ (JWT/OAuth)│(MariaDB/ │(MinIO/ │
│ │ │ MongoDB) │ Local) │
├─────────────┼─────────────┼─────────────┼───────────┤
│ 云函数 │ 实时服务 │ 消息推送 │ 控制台 │
│ (Executor) │ (WebSocket) │(SMTP/APNs) │ (React) │
├─────────────┴─────────────┴─────────────┴───────────┤
│ Docker Compose / Swarm / K8s │
└─────────────────────────────────────────────────────┘
关键架构决策:
- Traefik 处理反向代理和通过 Let’s Encrypt 自动获取 SSL
- MariaDB 是默认数据库(可选 MongoDB);Redis 缓存会话
- MinIO 提供本地兼容 S3 的对象存储
- 函数执行器 在 Firecracker 微虚拟机中隔离每个无服务器调用(v1.6+)
- WebSocket 服务器 推送实时事件并支持自动重连
安装与配置:5 分钟内运行起来 #
前置条件 #
- Docker 24.0+ 和 Docker Compose v2+
- 最低 2 核 CPU、4GB 内存(生产环境建议 8GB)
- 10GB 可用磁盘空间
步骤 1:下载 Compose 文件 #
mkdir ~/appwrite && cd ~/appwrite
# 下载官方 compose 文件 (v1.6.x)
curl -o docker-compose.yml https://raw.githubusercontent.com/appwrite/appwrite/1.6.1/docker-compose.yml
curl -o .env https://raw.githubusercontent.com/appwrite/appwrite/1.6.1/.env
步骤 2:配置环境变量 #
# 编辑 .env 中的关键变量
sed -i 's/_APP_ENV=production/_APP_ENV=production/' .env
sed -i 's/_APP_CONSOLE_WHITELIST_ROOT=enabled/_APP_CONSOLE_WHITELIST_ROOT=enabled/' .env
# 设置你的域名(测试时可用 localhost)
sed -i 's|_APP_DOMAIN=localhost|_APP_DOMAIN=api.yourdomain.com|' .env
sed -i 's|_APP_OPTIONS_ABUSE=enabled|_APP_OPTIONS_ABUSE=enabled|' .env
如需在 DigitalOcean 云服务器 上进行生产环境 SSL 配置:
# 首先将域名指向云服务器 IP
export _APP_DOMAIN=api.yourdomain.com
export _APP_ENV=production
export _APP_OPTIONS_FORCE_HTTPS=enabled
步骤 3:启动技术栈 #
docker compose up -d --remove-orphans
# 检查所有服务是否健康
watch docker compose ps
60 秒内,所有 12 个容器应显示 healthy。在 http://localhost(或你的域名)访问控制台。
步骤 4:创建你的第一个项目 #
# 注册 root 用户(第一个注册用户自动成为管理员)
curl -X POST http://localhost/v1/account \
-H "Content-Type: application/json" \
-d '{"userId":"unique()","email":"admin@example.com","password":"SecurePass123!","name":"Admin User"}'
进入控制台,创建一个项目,并记下 项目 ID — 所有 SDK 调用都需要它。
与 JavaScript、Python、Flutter 和 n8n 集成 #
Web / Node.js SDK #
安装 SDK:
npm install appwrite@16.1.0
初始化客户端并创建文档:
import { Client, Account, Databases, ID } from 'appwrite';
const client = new Client()
.setEndpoint('https://api.yourdomain.com/v1') // 你的 API 端点
.setProject('your-project-id'); // 你的项目 ID
const account = new Account(client);
const databases = new Databases(client);
// 匿名登录快速测试
const session = await account.createAnonymousSession();
console.log('Session created:', session.$id);
// 在集合中创建文档
const doc = await databases.createDocument(
'your-database-id',
'your-collection-id',
ID.unique(),
{ title: 'Hello Appwrite', status: 'active', priority: 3 }
);
console.log('Document ID:', doc.$id);
Python SDK(服务端) #
pip install appwrite==6.1.0
from appwrite.client import Client
from appwrite.services.databases import Databases
from appwrite.id import ID
client = Client()
client.set_endpoint('https://api.yourdomain.com/v1')
client.set_project('your-project-id')
client.set_key('your-api-key') # 从控制台获取的服务端 API 密钥
databases = Databases(client)
# 创建文档
doc = databases.create_document(
database_id='your-database-id',
collection_id='your-collection-id',
document_id=ID.unique(),
data={'title': 'From Python', 'status': 'active', 'score': 95.5}
)
print(f"Created document: {doc['$id']}")
# 带查询条件的列表查询
results = databases.list_documents(
database_id='your-database-id',
collection_id='your-collection-id',
queries=['equal("status", "active")', 'greaterThan("score", 90)', 'limit(10)']
)
print(f"Found {results['total']} matching documents")
Flutter SDK #
# pubspec.yaml
dependencies:
appwrite: ^15.0.0
import 'package:appwrite/appwrite.dart';
class AppwriteService {
late final Client client;
late final Account account;
late final Databases databases;
AppwriteService() {
client = Client()
.setEndpoint('https://api.yourdomain.com/v1')
.setProject('your-project-id')
.setSelfSigned(status: true); // 仅开发环境使用
account = Account(client);
databases = Databases(client);
}
Future<Session> login(String email, String password) async {
return await account.createEmailPasswordSession(
email: email,
password: password,
);
}
Future<Document> createTask(String title) async {
return await databases.createDocument(
databaseId: 'your-database-id',
collectionId: 'tasks',
documentId: ID.unique(),
data: {'title': title, 'done': false, 'created_at': DateTime.now().toIso8601String()},
);
}
}
n8n 工作流自动化 #
Appwrite 有官方社区节点。安装方法:
cd ~/.n8n/custom && npm install n8n-nodes-appwrite
# 重启 n8n
在工作流中,使用 Appwrite 节点来:
- 触发器:监控集合中的新文档(通过轮询或 Webhook)
- 动作:Stripe 付款后创建用户
- 查询:根据条件获取文档用于报表
{
"nodes": [{
"parameters": {
"operation": "createDocument",
"databaseId": "prod-db",
"collectionId": "events",
"data": {
"event_type": "={{ $json.type }}",
"payload": "={{ JSON.stringify($json) }}"
}
},
"name": "Appwrite Log",
"type": "n8n-nodes-appwrite.document",
"typeVersion": 1
}]
}
云函数:无锁定版无服务器 #
Appwrite 函数支持 15+ 运行时。以下是由数据库事件触发的 Node.js 函数示例:
// src/main.js
import { Client, Databases, Messaging } from 'node-appwrite';
export default async ({ req, res, log, error }) => {
const client = new Client()
.setEndpoint(process.env.APPWRITE_FUNCTION_API_ENDPOINT)
.setProject(process.env.APPWRITE_FUNCTION_PROJECT_ID)
.setKey(req.headers['x-appwrite-key']);
const databases = new Databases(client);
const messaging = new Messaging(client);
// 解析事件载荷
const eventData = JSON.parse(req.body);
const orderId = eventData.$id;
const userId = eventData.userId;
const total = eventData.total;
log(`Processing order ${orderId} for user ${userId}`);
try {
// 发送推送通知
await messaging.createPush(
ID.unique(),
'Order Confirmed',
`Your order #${orderId.slice(-6)} for $${total} is confirmed.`,
[],
[userId]
);
return res.json({ success: true, orderId });
} catch (err) {
error(`Failed: ${err.message}`);
return res.json({ success: false, error: err.message }, 500);
}
};
通过 CLI 部署:
# 安装 Appwrite CLI
npm install -g appwrite-cli@6.2.0
# 登录
appwrite login --endpoint https://api.yourdomain.com/v1 --project your-project-id
# 部署函数
appwrite push function --id order-processor --source ./order-processor
基准测试 / 真实用例 #
我在 DigitalOcean 云服务器(4 vCPU / 8GB RAM / $48/月)上测试了 Appwrite 1.6.1 的常见后端操作:
| 操作 | Appwrite 1.6.1 | Firebase (US-Central) | Supabase (Small) |
|---|---|---|---|
| 认证注册 (邮箱) | ~45ms | ~120ms | ~80ms |
| 数据库创建文档 | ~18ms | ~35ms | ~25ms |
| 数据库查询 (索引, 10K 文档) | ~12ms | ~28ms | ~20ms |
| 文件上传 (5MB) | ~220ms | ~350ms | ~280ms |
| 实时订阅 | ~5ms | ~15ms | ~10ms |
| 冷函数启动 | ~80ms | ~200ms | ~150ms |
| 月费用 (自托管) | $48 | ~$150-400* | ~$25-75 |
*Firebase 费用随使用量波动很大;自托管 Appwrite 在固定费用 VPS 上预算更可预测。
生产案例:一个处理 12,000 日活跃用户的旅行预订平台于 2025 年 3 月从 Firebase 迁移到自托管 Appwrite。其后端成本从 每月 $2,850 降至 $340(包括监控和备份基础设施)。查询 p95 延迟从 180ms 改善至 65ms。
高级用法 / 生产环境加固 #
1. 启用 Redis 会话缓存 #
# 在 docker-compose.yml 的 services 下添加
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis-data:/data
# 添加到 .env
_APP_REDIS_HOST=redis
_APP_REDIS_PORT=6379
2. 数据库备份策略 #
#!/bin/bash
# backup.sh — 通过 cron 每 6 小时运行一次
BACKUP_DIR=/backups/appwrite
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份 MariaDB
docker exec appwrite-mariadb mysqldump -u root -p"$DB_ROOT_PASSWORD" --all-databases \
| gzip > $BACKUP_DIR/mariadb_$TIMESTAMP.sql.gz
# 备份环境配置
cp .env $BACKUP_DIR/env_$TIMESTAMP
# 同步到 S3(可选)
aws s3 sync $BACKUP_DIR s3://your-backup-bucket/appwrite/ --delete
# 只保留最近 7 天
find $BACKUP_DIR -mtime +7 -delete
3. 基于角色的访问控制 (RBAC) #
// 授予基于团队的权限
await databases.createDocument(
'prod-db',
'projects',
ID.unique(),
{ name: 'Secret Project', budget: 50000 },
[
Permission.read(Role.team('managers')),
Permission.update(Role.team('managers')),
Permission.delete(Role.team('admins')),
Permission.create(Role.users())
]
);
4. 使用 Prometheus 监控 #
Appwrite 在 /_metrics 端点暴露 Prometheus 可抓取的指标:
# prometheus.yml
scrape_configs:
- job_name: 'appwrite'
static_configs:
- targets: ['appwrite:80']
metrics_path: '/_metrics'
5. Docker Swarm 水平扩展 #
# 初始化 swarm
docker swarm init
# 部署堆栈
docker stack deploy -c docker-compose.yml appwrite
# 扩展函数执行器
docker service scale appwrite_appwrite-executor=5
与替代方案对比 #
| 功能 | Appwrite 1.6 | Firebase | Supabase | Nhost | PocketBase |
|---|---|---|---|---|---|
| 自托管 | Yes (Docker) | No | Yes | Yes (K8s) | Yes (单二进制) |
| 开源协议 | BSD-3-Clause | 商业专有 | Apache-2.0 | Apache-2.0 | MIT |
| 认证提供商 | 50+ OAuth | 10+ | 20+ | 10+ | 5+ |
| 实时功能 | WebSocket | WebSocket | PostgreSQL LISTEN | WebSocket | SSE |
| 函数运行时 | 15+ | Node.js only | 8+ | Node.js/Go | JavaScript only |
| 文件存储 | 内置 (MinIO) | Cloud Storage | 兼容 S3 | 兼容 S3 | 仅本地 |
| 数据库 | MariaDB/MongoDB | Firestore | PostgreSQL | PostgreSQL | SQLite |
| 离线同步 | 计划中 (2.x) | Yes | Yes | No | No |
| 多区域 | 手动 (K8s) | 全球 | 读副本 | K8s | 单节点 |
| GitHub Stars | 47,200+ | N/A | 79,000+ | 7,800+ | 44,000+ |
Appwrite 最强的定位是:适合想要 即插即用 Firebase 替代方案 的团队,具有基于 Docker 的自托管能力、广泛的认证提供商和统一的功能集。Supabase 在 PostgreSQL 生态和 Stars 数量上占优。PocketBase 更简单但单节点扩展性差。Firebase 仍然是零配置选项,但锁定成本极高。
局限性 / 客观评估 #
- 尚无离线持久化 — 客户端 SDK 缺乏自动离线缓存。你需要自己实现或等待 2.x 路线图。Firebase 和 Supabase 现已提供此功能。
- 查询限制 — 复杂聚合、全文搜索和地理空间查询需要外部工具(Meilisearch、Typesense)或自定义函数。内置查询构建器仅覆盖基本过滤和排序。
- 单节点写入吞吐 — MariaDB 后端每节点峰值约 2,000 次写入/秒。对于写入密集型工作负载,需要 MongoDB 模式或外部缓存。
- 函数冷启动 — 部署后的首次调用延迟为 80-200ms。Firecracker 执行器(v1.6)相比之前的基于 Docker 的运行有所改善,但仍不如 Cloud Functions v2 快。
- 社区规模 — 47K Stars 令人印象深刻,但插件/扩展生态系统小于 Firebase 或 WordPress。自定义集成通常需要自己编写。
- 升级复杂性 — 主要版本跳转(1.4 → 1.5 → 1.6)需要阅读迁移指南并运行数据库迁移。不保证自动原地升级。
常见问题 #
Q: 我可以将现有的 Firebase 项目迁移到 Appwrite 吗? 可以,但不是自动的。将 Firestore 数据导出为 JSON/CSV,在 Appwrite 中重新创建集合(注意不同的权限模型),使用 Appwrite CLI 批量导入文档。认证用户可通过 Firebase Admin SDK 导出并导入 Appwrite 认证系统。计划每 10,000 名用户需要 2-3 天的迁移工作。
Q: Appwrite 如何在规模上处理文件存储? Appwrite 默认使用 MinIO 进行兼容 S3 的对象存储。生产环境建议配置为使用你自己的兼容 S3 后端(AWS S3、Wasabi、DigitalOcean Spaces)。20MB 以上的文件自动分块。在项目设置中启用压缩和加密。如需 CDN,在 Appwrite 域名前放置 Cloudflare 或 Fastly。
Q: Appwrite 适合企业/多租户 SaaS 吗?
Appwrite 支持每个实例多个项目,每个项目有自己的数据库、存储和认证。使用按项目范围限定的 API 密钥。对于真正的多租户,可以为每个租户运行一个 Appwrite 实例,或使用带有 tenant_id 字段的集合级权限。通过团队实现的 RBAC 适用于内部企业应用。
Q: 与托管后端相比,托管费用如何? $48/月的 DigitalOcean 云服务器(4 vCPU / 8GB)可轻松处理约 5,000 日活跃用户。备份和监控额外 $20/月。50,000 DAU 时,需要 $160/月的集群(8 vCPU / 16GB + Redis + 副本)。这比同等规模的 Firebase 或 AWS Amplify 账单便宜 3-5 倍。
Q: 我可以将 Appwrite 与现有的 PostgreSQL/MySQL 数据库一起使用吗? 不能直接集成。Appwrite 管理自己的 MariaDB(或 MongoDB)实例。要集成现有数据,可以使用 Appwrite 函数作为桥梁:编写查询外部数据库的函数并通过 Appwrite API 暴露结果。或者使用 ETL 管道定期同步数据。原生外部数据库支持在 2.x 路线图中。
Q: 如何更新 Appwrite 而不丢失数据?
升级前始终备份。阅读目标版本的迁移指南。标准流程是:docker compose pull → docker compose up -d → 如有需要运行迁移工具。先在预发布环境测试升级。切勿跳过主版本 — 依次升级 1.4 → 1.5 → 1.6。
推荐部署与基础设施 #
上述工具想要落地生产,靠谱的基础设施是前提。dibi8 自己也在用的两个选择:
- DigitalOcean — 新用户 60 天 $200 免费额度,14+ 全球节点。运行开源 AI 工具的首选。
- HTStack — 香港 VPS,国内访问低延迟,dibi8.com 自己也跑在它上面,生产环境验证过。
Aff 链接 — 不增加你的成本,但能帮 dibi8 持续运营。
结论:今天就上线你的后端 #
Appwrite 1.6 是 2026 年最成熟的 Firebase 开源替代方案。它在一个完全由你控制的 Docker 堆栈中提供认证、数据库、存储、云函数和实时订阅功能。对于厌倦了云账单惊喜和供应商锁定的团队来说,它是务实的选择。
通过 HTStack 一键 Appwrite 安装程序 开始,或在 DigitalOcean 云服务器 上运行 docker compose up -d。你的后端将在咖啡变凉之前上线。
下一篇阅读: n8n 工作流自动化, Supabase vs Appwrite 深入对比
来源与延伸阅读
- Appwrite 官方文档 — API 参考和指南
- Appwrite GitHub 仓库 — 47,200+ Stars
- Appwrite 1.6 发布说明 — 迁移指南和新功能
- Appwrite SDK 参考 — Web, Flutter, Android, iOS, Node.js, Python, PHP, Ruby, Go, .NET, Kotlin, Swift, Dart
- 自托管指南 — Docker, Swarm 和 Kubernetes 部署
- 云函数文档 — 运行时、部署和触发器
- Discord 社区 — 25,000+ 活跃开发者
联盟披露 本文包含指向 DigitalOcean 和 HTStack 的联盟链接。如果你通过这些链接购买托管服务,dibi8.com 将获得佣金,不会增加你的额外费用。我们只推荐用于自己基础设施的服务。所有基准测试均在付费实例上独立进行。
文章发布:2026-05-19 | 分类:dev-utils | 工具:Appwrite 1.6.1 加入 dibi8 开发者社区:English | Chinese | Korean | Vietnamese
💬 留言讨论