跳转至

577_Appwrite后端服务

一句话概述:Appwrite 是开源自托管的 BaaS(Backend as a Service)平台,提供认证、数据库、存储、函数、消息推送等一站式后端服务,用 Docker 一键部署,替代 Firebase/Supabase。

核心知识点表

概念白话解释
BaaSBackend as a Service,后端即服务,不用自己写后端,平台帮你搞定
自托管跑在你自己的服务器上,数据完全由你掌控
SDK官方提供的开发工具包,前端直接调API就能用
Realtime实时订阅,数据一变前端立刻收到通知(类似微信消息推送)
Functions无服务器函数,写一段代码上传就能跑,不用管服务器
SitesAppwrite 1.8+ 新增的网站托管功能,直接部署前端应用

安装配置

环境要求

# 最低要求:4GB RAM + Docker
# 当前最新版本:1.9.x(2026年)
# Appwrite 会运行 20+ 个容器,所以内存要求较高

一键安装(Docker)

# 用官方安装器自动生成 docker-compose.yml 并启动
docker run -it --rm \
  --publish 20080:20080 \                              # 安装器的临时端口
  --volume /var/run/docker.sock:/var/run/docker.sock \ # 让安装器能控制 Docker
  --volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \ # 配置文件保存位置
  --entrypoint="install" \                              # 运行安装模式
  appwrite/appwrite                                     # 官方镜像

安装过程中的配置项

# 安装器会交互式询问以下配置:
# 1. HTTP 端口(默认 80)
# 2. HTTPS 端口(默认 443)
# 3. 域名(默认 localhost)
# 4. 是否启用 HTTPS(生产环境建议开启)

启动与停止

cd appwrite                      # 进入 Appwrite 目录
docker compose up -d             # 后台启动所有服务
docker compose down              # 停止所有服务
docker compose logs -f           # 查看实时日志

基本使用

访问管理面板

# 浏览器打开(默认端口)
# http://localhost(HTTP)或 https://localhost(HTTPS)

# 首次访问需要注册管理员账号
# 然后创建项目 → 添加平台(Web/iOS/Android)→ 开始开发

创建数据库和集合

# 在管理面板中操作:
# 1. 进入项目 → Databases → Create Database
# 2. 在数据库中创建 Collection(类似数据表)
# 3. 定义 Attributes(字段),如 name(string)、age(integer)
# 4. 设置 Indexes(索引)提升查询性能

Web SDK 使用示例

// 安装 SDK
// npm install appwrite

import { Client, Databases, ID } from 'appwrite';  // 导入 Appwrite 模块

const client = new Client()                         // 创建客户端实例
    .setEndpoint('https://your-domain/v1')           // 设置 API 地址
    .setProject('your-project-id');                   // 设置项目 ID

const databases = new Databases(client);             // 初始化数据库服务

// 创建文档(插入一条数据)
const result = await databases.createDocument(
    'database-id',                                   // 数据库 ID
    'collection-id',                                 // 集合 ID
    ID.unique(),                                     // 自动生成唯一 ID
    { name: '张三', age: 25 }                         // 数据内容
);

// 查询文档列表
const docs = await databases.listDocuments(
    'database-id',                                   // 数据库 ID
    'collection-id'                                  // 集合 ID
);
console.log(docs.documents);                         // 打印查询结果

用户认证示例

import { Client, Account, ID } from 'appwrite';     // 导入认证模块

const client = new Client()
    .setEndpoint('https://your-domain/v1')
    .setProject('your-project-id');

const account = new Account(client);                 // 初始化认证服务

// 注册新用户
await account.create(
    ID.unique(),                                     // 用户 ID
    'user@example.com',                              // 邮箱
    'password123',                                   // 密码
    '张三'                                            // 用户名
);

// 登录(创建会话)
await account.createEmailPasswordSession(
    'user@example.com',                              // 邮箱
    'password123'                                    // 密码
);

// 获取当前用户信息
const user = await account.get();                    // 获取登录用户详情
console.log(user.name);                              // 输出:张三

高级用法

云函数(Functions)

// 在管理面板创建函数:
// Functions → Create Function → 选择运行时(Node.js/Python/Go 等)

// 示例:Node.js 函数代码
export default async ({ req, res, log }) => {        // 接收请求和响应对象
    const name = req.body.name || 'World';           // 获取请求参数
    log(`收到请求,name = ${name}`);                   // 记录日志
    return res.json({                                // 返回 JSON 响应
        message: `Hello, ${name}!`,
        timestamp: new Date().toISOString()
    });
};

实时订阅(Realtime)

import { Client } from 'appwrite';

const client = new Client()
    .setEndpoint('https://your-domain/v1')
    .setProject('your-project-id');

// 订阅文档变化(类似聊天室的消息推送)
const unsubscribe = client.subscribe(
    'databases.db-id.collections.col-id.documents',  // 订阅的频道
    (response) => {                                   // 收到变化时的回调
        console.log('数据变化了:', response.payload); // 打印变化的数据
        console.log('事件类型:', response.events);    // create/update/delete
    }
);

// 取消订阅
// unsubscribe();

生产环境配置(.env)

# 关键环境变量配置
_APP_DOMAIN=your-domain.com          # 你的域名
_APP_OPENSSL_KEY_V1=your-secret-key  # 加密密钥(必须修改!)
_APP_SMTP_HOST=smtp.gmail.com        # 邮件服务器
_APP_SMTP_PORT=587                   # 邮件端口
_APP_SMTP_USERNAME=your@email.com    # 邮箱账号
_APP_SMTP_PASSWORD=your-app-password # 邮箱密码
_APP_STORAGE_LIMIT=30000000          # 单文件上传限制(30MB)

版本升级

cd appwrite                          # 进入 Appwrite 目录
docker compose pull                  # 拉取最新镜像
docker compose up -d                 # 重启服务
docker compose exec appwrite migrate # 执行数据库迁移

常见报错

报错信息原因解决方案
Error: Connection refusedDocker 服务未启动或端口被占用systemctl start docker 并检查端口
Error: Insufficient memory内存不足(需要 4GB+)增加服务器内存或减少其他容器
Error: SSL certificate errorHTTPS 配置错误检查域名 DNS 解析和证书路径
Error: Permission deniedDocker socket 权限不够sudo chmod 666 /var/run/docker.sock
CORS error未添加前端平台在项目设置中添加 Web 平台和域名
429 Too Many Requests触发速率限制调整 _APP_OPTIONS_ABUSE 配置

速查表

# === Appwrite 常用命令 ===
docker compose up -d                 # 启动
docker compose down                  # 停止
docker compose logs -f               # 查看日志
docker compose exec appwrite migrate # 数据库迁移
docker compose pull                  # 更新镜像

# === API 端点 ===
# POST /v1/account                   # 注册
# POST /v1/account/sessions/email    # 登录
# GET  /v1/account                   # 获取用户信息
# POST /v1/databases/{db}/collections/{col}/documents  # 创建文档
# GET  /v1/databases/{db}/collections/{col}/documents  # 查询文档
# POST /v1/storage/buckets/{id}/files                  # 上传文件

# === 支持的认证方式 ===
# Email/Password | OAuth2 | Magic Link | Phone/SMS
# Anonymous | JWT | API Key

同类对比

特性AppwriteSupabaseFirebasePocketBase
开源协议MITApache 2.0闭源MIT
自托管支持支持不支持支持
数据库MariaDBPostgreSQL文档数据库SQLite
实时功能支持支持支持支持
云函数15种运行时Edge FunctionsCloud FunctionsGo扩展
内存需求4GB+2GB+N/A256MB
适合场景中大型项目中大型项目快速原型小型项目/MVP
学习曲线中等中等

选型建议:想要完全自主可控且功能全面选 Appwrite;需要 PostgreSQL 生态选 Supabase;极简单文件部署选 PocketBase。