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 Stars1.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 节点来:

  1. 触发器:监控集合中的新文档(通过轮询或 Webhook)
  2. 动作:Stripe 付款后创建用户
  3. 查询:根据条件获取文档用于报表
{
  "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.1Firebase (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.6FirebaseSupabaseNhostPocketBase
自托管Yes (Docker)NoYesYes (K8s)Yes (单二进制)
开源协议BSD-3-Clause商业专有Apache-2.0Apache-2.0MIT
认证提供商50+ OAuth10+20+10+5+
实时功能WebSocketWebSocketPostgreSQL LISTENWebSocketSSE
函数运行时15+Node.js only8+Node.js/GoJavaScript only
文件存储内置 (MinIO)Cloud Storage兼容 S3兼容 S3仅本地
数据库MariaDB/MongoDBFirestorePostgreSQLPostgreSQLSQLite
离线同步计划中 (2.x)YesYesNoNo
多区域手动 (K8s)全球读副本K8s单节点
GitHub Stars47,200+N/A79,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 pulldocker 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 深入对比

来源与延伸阅读

联盟披露 本文包含指向 DigitalOceanHTStack 的联盟链接。如果你通过这些链接购买托管服务,dibi8.com 将获得佣金,不会增加你的额外费用。我们只推荐用于自己基础设施的服务。所有基准测试均在付费实例上独立进行。


文章发布:2026-05-19 | 分类:dev-utils | 工具:Appwrite 1.6.1 加入 dibi8 开发者社区:English | Chinese | Korean | Vietnamese

💬 留言讨论