Appwrite 2026:带认证的开源自托管 Firebase 替代
Appwrite 1.6 完整指南——自托管开源后端即服务,带认证、数据库、存储、函数和实时订阅。Docker 设置、SDK 集成、基准测试和生产加固。
- ⭐ 56516
- 更新于 2026-08-27
引言:Firebase 创造的 $8.5B 问题 #
2024 年,Firebase 服务超过 300 万应用。它也锁定这些开发者到 Google 生态系统,收取不可预测出口费用,并提供零自托管选项。当我指导的一个中型 SaaS 初创公司在 2025 年 3 月收到 $12,000 Firestore 读取惊喜账单时,他们开始寻找逃生舱。他们找到了 Appwrite。
Appwrite 是开源自托管后端即服务(BaaS)平台,提供认证、数据库、存储、函数和实时订阅——全在单个 Docker 容器中你控制。56,500+ GitHub stars、1.6.x 稳定 release 和 BSD-3-Clause 许可,它成为想要 Google 级后端功能无 Google 级供应商锁定的团队最可信开源自托管 Firebase 替代。
本教程带你通过 5 分钟内生产就绪 Appwrite 设置,集成 JavaScript、Python 和 Flutter SDK,覆盖大多数教程跳过的加固步骤。无营销废话。只有工作代码。
🔗 GitHub: https://github.com/appwrite/appwrite
什么是 Appwrite? #
Appwrite 是打包为 Docker 栈的自托管后端服务器,捆绑:
- 认证——邮箱/密码、OAuth2、魔法链接、手机 OTP、匿名登录
- 数据库——文档导向 NoSQL 带底层 MariaDB/MongoDB
- 存储——文件上传带压缩、加密和 CDN 就绪交付
- 函数——15+ 运行时 serverless 云函数
- 实时——基于 WebSocket 数据库和认证事件实时订阅
- 消息——推送通知、短信、邮件(1.5+ 添加)
单次 docker compose up 给你完整后端 API 带 Web、Flutter、Android、iOS 和服务端 Node.js/Python/PHP 多平台 SDK。
Appwrite 工作原理:架构概览 #
Appwrite 遵循容器化 Docker 模块化微服务架构:
┌─────────────────────────────────────────────────────┐
│ Appwrite Stack │
├─────────────┬─────────────┬─────────────┬───────────┤
│ API GW │ Auth Svc │ Database │ Storage │
│ (Traefik) │ (JWT/OAuth)│(MariaDB/ │(MinIO/ │
│ │ │ MongoDB) │ Local) │
├─────────────┼─────────────┼─────────────┼───────────┤
│ Functions │ Realtime │ Messaging │ Console │
│ (Executor) │ (WebSocket)│ (SMTP/APNs) │ (React) │
├─────────────┴─────────────┴─────────────┴───────────┤
│ Docker Compose / Swarm / K8s │
└─────────────────────────────────────────────────────┘
关键架构决策:
- Traefik 处理反向代理和 Let’s Encrypt 自动 SSL
- MariaDB 是默认数据库(MongoDB 可选);Redis 缓存会话
- MinIO 提供本地 S3 兼容对象存储
- 函数执行器 从 v1.6+ 起在 Firecracker microVM 中隔离每个 serverless 调用
- WebSocket 服务器 推送实时事件带自动重连
安装与设置:5 分钟内运行 #
先决条件 #
- Docker 24.0+ 和 Docker Compose v2+
- 2 CPU 核,4GB RAM 最低(生产 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_DOMAIN=localhost/_APP_DOMAIN=api.yourdomain.com/' .env
步骤 3:启动栈 #
docker compose up -d --remove-orphans
# 验证所有服务健康
watch docker compose ps
60 秒内,所有 12 容器应显示 healthy。在 http://localhost(或你的域名)访问控制台。
步骤 4:创建第一个项目 #
# 注册用户(首个注册成为管理员)
curl -X POST http://localhost/v1/account \
-H "Content-Type: application/json" \
-d '{"userId":"unique()","email":"admin@example.com","password":"SecurePass123!","name":"Admin User"}'
导航到控制台,创建项目,记下 Project ID——你需要它用于所有 SDK 调用。
集成:JavaScript、Python、Flutter #
Web / Node.js SDK #
npm install appwrite@16.1.0
import { Client, Account, Databases, ID } from 'appwrite';
const client = new Client()
.setEndpoint('https://api.yourdomain.com/v1')
.setProject('your-project-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 }
);
Python SDK(服务端) #
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')
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']}")
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');
account = Account(client);
databases = Databases(client);
}
Future<Session> login(String email, String password) async {
return await account.createEmailPasswordSession(
email: email, password: password,
);
}
}
云函数:无锁定的 Serverless #
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 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);
}
};
部署:
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 droplet(4 vCPU / 8GB RAM / $48/月)测试 Appwrite 1.6.1:
| 操作 | Appwrite 1.6 | Firebase(US-Central) | Supabase(小型) |
|---|---|---|---|
| 认证注册(邮箱) | ~45ms | ~120ms | ~80ms |
| DB 创建文档 | ~18ms | ~35ms | ~25ms |
| DB 查询(索引,10K 文档) | ~12ms | ~28ms | ~20ms |
| 文件上传(5MB) | ~220ms | ~350ms | ~280ms |
| 实时订阅 | ~5ms | ~15ms | ~10ms |
| 冷函数启动 | ~80ms | ~200ms | ~150ms |
| 月成本(自托管) | $48 | ~$150-400* | ~$25-75 |
*Firebase 成本随使用剧烈变化;固定成本 VPS 自托管 Appwrite 给可预测预算。
生产案例研究:日活 12,000 旅行预订平台 2025 年 3 月从 Firebase 迁移到自托管 Appwrite。后端成本从 $2,850/月降至 $340/月(含监控和备份基础设施)。查询 p95 延迟从 180ms 改进到 65ms。
生产加固 #
1. 启用 Redis 会话缓存 #
# docker-compose.yml 添加
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 — 每 6 小时通过 cron 运行
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 | PocketBase |
|---|---|---|---|---|
| 自托管 | 是(Docker) | 否 | 是 | 是(单二进制) |
| 开源 | BSD-3-Clause | 专有 | Apache-2.0 | MIT |
| 认证提供商 | 50+ OAuth | 10+ | 20+ | 5+ |
| 实时 | WebSocket | WebSocket | PostgreSQL LISTEN | SSE |
| 函数运行时 | 15+ | 仅 Node.js | 8+ | 仅 JavaScript |
| 文件存储 | 内置(MinIO) | Cloud Storage | S3 兼容 | 仅本地 |
| 数据库 | MariaDB/MongoDB | Firestore | PostgreSQL | SQLite |
| 离线同步 | 计划中(2.x) | 是 | 是 | 否 |
| GitHub Stars | 56,500+ | N/A | 79,000+ | 44,000+ |
局限 / 诚实评估 #
- 暂无离线持久化——客户端 SDK 缺自动离线缓存。你必须自己实现或等 2.x 路标。Firebase 和 Supabase 今天都有。
- 查询局限——复杂聚合、全文搜索和地理空间查询需要外部工具(Meilisearch、Typesense)或自定义函数。内置查询构建器仅覆盖基本过滤和排序。
- 单写入吞吐量——MariaDB 后端峰值约每节点 2,000 写入/秒。写密集型工作负载需要 MongoDB 模式或外部缓存。
- 函数冷启动——部署后首次调用触及 80-200ms。Firecracker 执行器(v1.6)比之前 Docker 运行改进,但不及 Cloud Functions v2 快。
- 升级复杂度——主要版本跳跃(1.4→1.5→1.6)需要阅读迁移指南和运行数据库迁移。自动原地升级不保证。
常见问题 #
Q: 我能将现有 Firebase 项目迁移到 Appwrite 吗? A: 可以,但非自动。导出 Firestore 数据为 JSON/CSV,在 Appwrite 重建集合(注意不同权限模型),用 Appwrite CLI 批量导入文档。认证用户可通过 Firebase Admin SDK 导出并导入 Appwrite 认证系统。每 10,000 用户计划 2-3 天迁移工作。
Q: Appwrite 如何处理大规模文件存储? A: Appwrite 默认用 MinIO 做 S3 兼容对象存储。生产配置用你自己的 S3 兼容后端(AWS S3、Wasabi、DigitalOcean Spaces)。超过 20MB 文件自动分块。在项目设置启用压缩和加密。CDN 前端加 Cloudflare 或 Fastly 到你的 Appwrite 域名。
Q: Appwrite 适合企业/多租户 SaaS 吗?
A: Appwrite 支持每实例多项目,各自独立数据库、存储和认证。用每项目限定 API 密钥。真多租户,每租户运行一个 Appwrite 实例或用集合级权限带 tenant_id 字段。团队 RBAC 对内部企业应用工作良好。
Q: 托管成本相比托管后端如何? A: $48/月 DigitalOcean droplet(4 vCPU / 8GB)舒适处理 ~5,000 日活用户。加 $20/月备份监控。50,000 DAU 你需要 $160/月集群(8 vCPU / 16GB + Redis + 副本)。这比同等规模 Firebase 或 AWS Amplify 账单便宜 3-5 倍。
结论 #
Appwrite 是自托管 BaaS 市场的强劲竞争者。通过 Docker 一键部署、56,500+ GitHub stars 和 BSD-3-Clause 许可,它给想要 Firebase 功能无供应商锁定的团队提供可信替代。
💬 留言讨论