MonacaアプリやWebアプリを開発する際に、常に問題になるのが「バックエンドをどうするか」です。アプリ単体で完結できるものは多くなく、大抵何らかのバックエンドを用意するでしょう。

クラウドサービスを使ったり、自分で開発したりと複数の選択肢がありますが、今回はオープンソース・ソフトウェアのバックエンドインフラであるAppwriteを紹介します。オープンソースなのでセルフホストもできます。

Appwriteについて

Appwriteは、オープンソース・ソフトウェアのバックエンドインフラソフトウェアです。

主に以下のような機能があります。

  • 認証
  • データベース
  • ストレージ
  • ファンクション(FaaS)
  • メッセージ
  • リアルタイム通信
  • Webホスティング

これだけの機能があれば、大抵のアプリ開発であれば事足りるのではないでしょうか。ここから、各機能について細かく解説します。

認証

認証はデータベースやストレージなどを安全に保存、利用するために必須の機能です。Appwriteでは、以下のような認証機能が用意されています。

  • メール/パスワード
  • SMS
  • マジックURL
  • メールベースのOTP
  • OAuth2
  • JWT(JSON Web Token)
  • SSR
  • カスタムトークン
  • 匿名認証
  • 多要素認証

OAuth2を利用すれば、GoogleやFacebook、GitHubなどの外部プロバイダーを利用した認証も行えます。カスタムトークンではPassKeyや生体情報を使った認証にも利用できます。

データベース

データベースはFirebaseなどと似ていて、以下の3段階で管理されます。

  • データベース
  • コレクション
  • ドキュメント

使い方はシンプルで、以下のコードでデータの取得が可能です。

import { Client, Databases, Query } from "appwrite";

const client = new Client()
    .setEndpoint("https://<REGION>.cloud.appwrite.io/v1")
    .setProject("<PROJECT_ID>")

const databases = new Databases(client);

const response = await databases.listDocuments(
    "<DATABASE_ID>",
    "<COLLECTION_ID>",
    [
        Query.equal("title", "Hamlet")
    ]
);

console.log(response);

各データに対して、先ほど利用した認証情報などを用いてアクセス制御できます。

ストレージ

ストレージはバケットと呼ぶ単位で管理されます。S3に似た概念です。

以下は、ファイルをアップロードするコードです。

import { Client, Storage, ID } from "appwrite";

const client = new Client()
    .setEndpoint("https://<REGION>.cloud.appwrite.io/v1")
    .setProject("<PROJECT_ID>");

const storage = new Storage(client);

const response = await storage.createFile(
    "[BUCKET_ID]",
    ID.unique(),
    document.getElementById("uploader").files[0]
);

console.log(response); // Success

ファンクション(FaaS)

ファンクションは、コードをAppwrite上にアップロードして、アプリから実行する機能です。APIキーを隠蔽化したり、異なるプラットフォーム上のロジックを共有化することができます。

Appwriteではランタイムとして、以下の言語が指定できます。

  • JavaScript
    • Node.js
    • Node.js + TypeScript
    • Bun
    • Deno
  • Python
  • PHP
  • Dart
  • Ruby
  • Kotlin
  • C++
  • .NET
  • Java
  • Swift
  • Go

これらのコードをアップロードして、アプリから呼び出したり、データを保存したタイミングなどのトリガーで実行します。

import { Client, Functions } from "appwrite";

const client = new Client();

const functions = new Functions(client);

client
    .setProject("<PROJECT_ID>") // Your project ID
;

const response = await functions.createExecution(
        "<FUNCTION_ID>",  // functionId
        "<BODY>",  // body (optional)
        false,  // async (optional)
        "<PATH>",  // path (optional)
        "GET",  // method (optional)
        {} // headers (optional)
    );

これはAPIとして、curlやfetchなどで呼び出すことも可能です。

curl -X POST https://64d4d22db370ae41a32e.appwrite.global \
-H "X-Custom-Header: 123" \
-H "x-appwrite-user-jwt: <YOUR_JWT_KEY>" \
-H "Content-Type: application/json" \
-d "{"data":"this is json data"}"

メッセージ

Appwriteは、以下のメッセージングに対応しています。

  • プッシュ通知
  • SMS
  • メール

リアルタイム通信

リアルタイム通信は、いわゆるPub/Sub通信になります。以下のようなコードで、特定のチャンネルのイベントをウォッチできます。

import { Client } from "appwrite";

const client = new Client()
    .setEndpoint("https://<REGION>.cloud.appwrite.io/v1")
    .setProject("<PROJECT_ID>");

// Subscribe to files channel
client.subscribe("files", response => {
    if(response.events.includes("buckets.*.files.*.create")) {
        // Log when a new file is uploaded
        console.log(response.payload);
    }
});

Webホスティング

いわゆるWebサイトのホスティング機能です。静的サイトだけでなく、各種フレームワークを利用したWebアプリケーションもホスティングできます。ドキュメントに依れば、以下のフレームワークが利用可能です。

  • Next.js
  • Nuxt
  • SvelteKit
  • Astro

FlutterやReact Nativeなど、他のフレームワークも利用できるようです。

Start with Sites - Docs - Appwrite

AI

AppwriteはいくつかのAI機能をサードパーティプロバイダーのAPIで実現しています。執筆時点で利用できるのは、以下の機能です。

  • 画像の判別
  • オブジェクト認識
  • テキスト生成
  • テキスト翻訳
  • 音声認識
  • TTS(テキストを音声に)

これらの機能を利用する際にはHugging FaceのAPIキーなどが必要になります。

Artificial intelligence - Overview - Appwrite

フロントエンドとの親和性

もし、これからPWAやMonacaアプリなどを開発していくのであれば、Appwriteは良い選択肢になるでしょう。オープンソースなので、自分でセルフホストできますし、もしそれが面倒ならクラウドサービスを利用しても良いでしょう。

データベースにはオフライン同期機能というのが用意されています。ネットワークがない状態でもデータの取得、追加、更新などが行えて、あとで同期できます。この辺りはPWAにとって嬉しい機能ではないでしょうか。

SDKが充実しているので、モバイルアプリとサーバーサイドでデータを相互に触れるのも容易です。

他のBaaSとの比較

他のBaaSとの簡易的な比較です。参考にしてください。

項目 Appwrite Firebase Supabase
URL URL URL URL
ライセンス Apache‑2.0 クラウドのみ オープンソース
開始年 2019年 2011年 2020年
認証 メール/OAuth2/匿名/その他 メール/電話/SNSなど メール/OAuthなど
データベース NoSQL風 Realtime DB + Firestore(NoSQL) PostgreSQL + REST / GraphQL
ストレージ あり あり あり
プッシュ通知 あり Firebase Cloud Messaging (FCM) Edge Functions経由で実装
ホスティング あり(動的にも対応) 静的サイト + Next.jsなど 静的配信のみ
ファンクション 多数の言語に対応 Node.js Deno
リアルタイム PubSub Realtime DB / Firestore同期 LISTEN/NOTIFYによるリアルタイム
解析 なし Analytics・Crashlytics等統合 なし
クラウド利用料 無料から。有料は月15ドル〜 無料枠あり、従量制 無料枠から。有料は月25ドル〜

機能面だけで見ると、Firebaseはアクセス解析機能などもあり、充実しています。AppwriteやSupabaseは、オープンソースでセルフホストできるのが大きな利点になりそうです。

FirebaseやAppwriteではAIに対しても活発に開発が行われている印象です。SupabaseはAI Assistantを提供していますが、こちらはダッシュボード利用をサポートしてくれるAIになります。

まとめ

AppwriteはモバイルアプリやWebアプリのバックエンドをまるっとサポートしてくれるソフトウェアになります。自分でホスティングもできますし、クラウドサービスを利用することもできます。

活発に開発が行われているので、今後もどんどん進化していくと思われます。ぜひ試してみてください。

Appwrite - Build like a team of hundreds