2026年7月28日火曜日

Oracle Backend for FirebaseのCLIインターフェースfusabase-cliを使用する

これまでの記事では、Oracle Backend for Firebaseの操作をGUIで実施してきました。Oracle CorporationではGUIの操作をコマンドラインから実施できるように、CLIのツールとしてfusabase-cliを提供しています。このツールはGitHubで公開されています。

Oracle® Backend for Firebase (Fusabase) CLI
https://github.com/oracle/fusabase-cli

本記事ではfusabase-cliを利用して、前回の記事「Oracle Backend for FirebaseのLiveLabsを実施する」で実施しているGUIによる作業を、CLIによる作業に置き換えてみます。

CLIの構成手順については、公式ドキュメントにも記載があります。

Oracle Backend for Firebase, Release 26.1
Developer's Guide

公式ドキュメントに記述されている、fusabase-cliをインストールするコマンドは以下になります。

npm i -g fusabase-cli

残念なことに、-gオプションをつけてfusabase-cliをグローバル・インストールすると、fusabase-cliを実行するディレクトリに配置するfusabase.config.jsを読み込みません。これは、現状のfusabase-cliがfusabase.config.jsを検索するディレクトリを、fusabase-cliがインストールされているディレクトリから遡って探すようになっているためです。

GitHubのページに記載されているように、fusabase-cliのリポジトリをクローンしてインストールするか、または、-gオプションを外してインストールすると、作業ディレクトリに配置しているfusabase.config.jsが読み込まれます。

本記事ではfusabase-cliをローカル・インストールして、"npx fusabase"のエイリアスとしてfusabaseを登録することで、fusabase-cliを使用します。

fusabase-cliのインストール手順は以下になります。

作業ディレクトリとしてfusabase-livelabsを使用します。

cd fusabase-livelabs

Documents % cd fusabase-livelabs 

fusabase-livelabs % 


npm install fusabase-cli

fusabase-livelabs % npm install fusabase-cli


up to date, audited 116 packages in 954ms


15 packages are looking for funding

  run `npm fund` for details


10 high severity vulnerabilities


Some issues need review, and may require choosing

a different dependency.


Run `npm audit` for details.

fusabase-livelabs % 


エイリアスを設定します。

alias fusabase="npx fusabase"

fusabase-livelabs % alias fusabase="npx fusabase"

fusabase-livelabs % 


npx実行時にnoticeレベルのログが表示されないように、デフォルトをwarnに変更します。
その後に、インストールされたfusabaseのバージョンを確認します。

npm config set loglevel warn
fusabase --version

fusabase-livelabs % npm config set loglevel warn

fusabase-livelabs % fusabase --version          

26.1.1

fusabase-livelabs % 


aliasの設定は、.bashrcや.zshrcなどに記載すると永続化できます。


OAuthクライアントを作成する



fusabase-cliは認証のために、OBAAS_ADMIN.ENABLE_SCHEMAを実行してOracle Backend for Firebaseを有効にしたスキーマに作成した、OAuthクライアントのクライアントIDとクライアント・シークレットを使用します。

OAuthクライアントの作成手順は、公式ドキュメントの3.8.2 Create an OAuth Client for the CLIで紹介されています。

公式ドキュメントにそった手順により、OAuthクライアントを作成できることは確認しました。その手順をそのまま転記してもしかたがないので、パッケージORDS_SECURITYを使って、OAuthクライアントを作成するスクリプトを記述してみました。


Oracle Backend for Firebaseが有効化されたスキーマに接続し、上記のスクリプトを実行してOAuthクライアントを作成します。クライアントIDとクライアント・シークレットが印刷されるので、それを取得します。

sql testuser@localhost/freepdb1
@create_oauth_client

fusabase-livelabs % sql testuser@localhost/freepdb1


SQLcl: 火 7月 28 13:40:57 2026のリリース26.1 Production


Copyright (c) 1982, 2026, Oracle.  All rights reserved.


パスワード (**********?) *******

接続先:

Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

Version 23.26.2.0.0


SQL> @create_oauth_client

OAuth client fusabase-cli is deleted.

OAuth client fusabase-cli is created.

client_id: 8gqfzPOwliW5LCyqGk8ofA..

client_secret: 7fijW5RzBki7jlW66CmLNQ..

Role SQL Developer has granted to OAuth user fusabase-cli.



PL/SQLプロシージャが正常に完了しました。


Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free

Version 23.26.2.0.0から切断されました

fusabase-livelabs % 


印刷されたclient_idとclient_secretの値は、fusabase-cliの初期化時に使用します。


CLIよりサインインする



作業ディレクトリにfusabase.config.jsとして、Oracle Backend for Firebaseへ接続するURLを設定します。
module.exports = {
  host: 'http://localhost:8181/ords/testuser/'
}
fusabase-cliでサインインします。

fusabase init

先ほど取得したクライアントIDとクライアント・シークレットを入力します。

fusabase-livelabs % fusabase init

Type ORDS clientId (with SQL Developer Role) · 8gqfzPOwliW5LCyqGk8ofA..

Type ORDS clientSecret · 7fijW5RzBki7jlW66CmLNQ..

http://localhost:8181/ords/testuser/

Logged In successfully!

Here are the projects accessible: 

Type (or choose) ProjectId to work on: · 573E3A97FC7320ADE063020012AC296D => recipe-workshop

Using project: 573E3A97FC7320ADE063020012AC296D

fusabase-livelabs % 


Logged In successfully!と表示されれば、Oracle Backend for Firebaseのサーバーにサインインできています。

サインインに成功すると.fusabase.confファイルに、アクセス・トークンやプロジェクトIDが記載されます。fusabase-cliはこのファイルからアクセス・トークンやその他の情報を参照します。アクセス・トークンの有効期限は、OAuthクライアントの作成時に実行したスクリプトcreate_oauth_client.sqlの中の、定数C_TOKEN_DURATIONに設定しています。

トークンの有効期限が過ぎた時は、fusabase init(またはfusabase login)を再実行する必要があります。クライアントIDやクライアント・シークレットを覚えていれば、再度、create_oauth_client.sqlを実行する必要はありません。

以上で、fusabase-cliが利用可能になりました。


セキュリティ・ルールを設定する



fusabase-cliでセキュリティ・ルールを設定します。制限なしでアクセスするルールをallow-all.txtとして、ファイルに記載します。


このセキュリティ・ルールをDatabaseに適用するために、以下のコマンドを実行します。

fusabase cel add --path=allow-all.txt

Rule Added Successfullyと表示されると、--pathで指定したセキュリティ・ルールが適用され、PUBLISHEDの状態になります。

fusabase-livelabs % fusabase cel add --path=allow-all.txt


match /{document=**} { allow read, write: if true;}


Rule Added Successfully!!

fusabase-livelabs % 


セキュリティ・リストの確認にはlistコマンドを使用します。

fusabase cel list

最終行のPUBLISHEDが1のセキュリティ・ルールが、現在適用されているセキュリティ・ルールになります。

fusabase-livelabs % fusabase cel list

Fetched Successfully:

  RULE                                                                                              PUBLISH 

  match /{document=**} { allow read, write: if true;}                                               0       

  match /recipes/{recipeId} {                                                                       0       

    allow read: if true;                                                                                    

    allow create: if request.auth != null && request.resource.data.ownerId == request.auth.uid;             

    allow update: if request.auth != null && request.auth.uid == resource.data.ownerId;                     

  }                                                                                                         

  match /recipes/{recipeId}/ratings/{ratingId} {                                                            

    allow read: if true;                                                                                    

    allow create: if request.auth != null;                                                                  

  }                                                                                                         

  match /{document=**} { allow read, write: if true;}                                               0       

  match /{document=**} { allow read, write, create: if true;}                                       0       

  match /{document=**} { allow read, write: if true;}                                               0       

  match /recipes/{recipeId} {                                                                       0       

      allow read: if request.auth != null;                                                                  

      allow create: if request.auth != null && request.resource.data.ownerId == request.auth.uid;           

      allow update: if request.auth != null && request.auth.uid == resource.data.ownerId;                   

  }                                                                                                         

  match /recipes/{recipeId}/ratings/{ratingId} {                                                            

      allow read: if request.auth != null;                                                                  

      allow create: if request.auth != null;                                                                

  }                                                                                                         

  match /{document=**} { allow read, write: if true;}                                               0



[中略]


  match /recipes/{recipeId} {                                                                       0       

      allow read: if request.auth != null;                                                                  

      allow create: if request.auth != null && request.resource.data.ownerId == request.auth.uid;           

      allow update: if request.auth != null && request.auth.uid == resource.data.ownerId;                   

  }                                                                                                         

  match /recipes/{recipeId}/ratings/{ratingId} {                                                            

      allow read: if request.auth != null;                                                                  

      allow create: if request.auth != null;                                                                

  }                                                                                                         

                                                                                                            

  match /{document=**} { allow read, write: if true;}                                               0       

                                                                                                            

  match /{document=**} { allow read, write: if true;}                                               1       

                                                                                                            

fusabase-livelabs %        


listコマンドでは、すべての変更履歴が一覧されます。現行のfusabase-cliでは、表示する行数を制限したりPUBLISHEDの行だけを表示するといったオプションを見つけることはできませんでした。

レシピの更新を作成者に限定するセキュリティ・ルールは以下です。

Web向けです。

iOSおよびAndroid向けです。

このセキュリティ・ルールを適用するfusabase-cliのコマンドは以下になります。

fusabase cel add --path=database-rules.txt

fusabase-livelabs % fusabase cel add --path=database-rules.txt

match /recipes/{recipeId} {

    allow read: if request.auth != null;

    allow create: if request.auth != null && request.resource.data.ownerId == request.auth.uid;

    allow update: if request.auth != null && request.auth.uid == resource.data.ownerId;

}

match /recipes/{recipeId}/ratings/{ratingId} {

    allow read: if request.auth != null;

    allow create: if request.auth != null;

}


Rule Added Successfully!!

fusabase-livelabs % 


Databaseのセキュリティ・ルールはfusabase-cliで設定できますが、現行のfusabase-cliでは、Storageのセキュリティ・ルールは操作できません。

ワークアラウンドとして、Storageのセキュリティ・ルールを設定するスクリプトを書きました。


(注:現行のfusabase-cliはスクリプト内のstorage=2の部分が1としてハード・コードされているため、Databaseのセキュリティ・ルールの操作に固定されています。)

Storageのセキュリティ・ルールとして制限なしを設定する場合、以下のコマンドを実行します。

sh update-security-rules.sh allow-all.txt

fusabase-livelabs % sh update-security-rules.sh allow-all.txt 

fusabase-livelabs %


Storageのセキュリティ・ルールを一覧するスクリプトは以下です。


sh list-security-rules.sh

fusabase-livelabs % sh list-security-rules.sh 

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  4490    0  4490    0     0   140k      0 --:--:-- --:--:-- --:--:--  141k

"rule","created_at","publish"

"match /{document=**} { allow read, write: if true;}","2026-07-23 02:04:15.541576",0

"match /recipes/{recipeId}/{fileName} {

  allow read: if true;

  allow create: if request.auth != null;

}","2026-07-23 03:22:07.450843",0

"match /{document=**} { allow read, write: if true;}","2026-07-23 04:03:41.637378",0

"match /recipes/{recipeId}/{fileName} {

    allow read: if true;

    allow create: if request.auth != null;

}","2026-07-23 07:44:59.371574",0

"match /{document=**} { allow read, write: if true;}","2026-07-23 08:01:50.348963",0

"match /recipes/{recipeId}/{fileName} {

    allow read: if true;

    allow create: if request.auth != null;

}","2026-07-23 19:54:31.101444",0


[中略]


"match /{document=**} { allow read, write: if true;}

","2026-07-28 02:18:58.799914",0

"match /recipes/{recipeId}/{fileName} {

    allow read: if true;

    allow create: if request.auth != null;

}

","2026-07-28 02:19:58.819528",0

"match /{document=**} { allow read, write: if true;}

","2026-07-28 05:20:25.188484",1

fusabase-livelabs % 


認証済みのユーザーのみ、写真をアップロードできるようにするStorageのセキュリティ・ルールは以下です。


このセキュリティ・ルールは、以下のコマンドで設定します。

sh update-security-rules.sh storage-rules.txt

fusabase-livelabs % sh update-security-rules.sh storage-rules.txt 

fusabase-livelabs % 




Webアプリを実装する



fusabase-cliでWebアプリを作成します。application createコマンドを実行します。

fusabase application create

Application NameとApplication Typeの入力を求められます。

fusabase-livelabs % fusabase application create

Provide Application Name:  · RecipeShareWeb

Select Application Type:  · web

Application Created Successfully!!

{"APP_ID":"57A620B87BE604F8E063020012AC8D05"}

fusabase-livelabs % 


作成したアプリケーションは、application listコマンドで一覧できます。

fusabase application list

fusabase-livelabs % fusabase application list

Fetched Successfully :

  Project ID                         App ID                             App Name                          App Type   Active 

  573E3A97FC7320ADE063020012AC296D   578E20ADE7B7710BE063020012AC935F   RecipeShare                       IOS        1      

  573E3A97FC7320ADE063020012AC296D   57A620B87BE604F8E063020012AC8D05   RecipeShareWeb                    web        1      

  573E3A97FC7320ADE063020012AC296D   578F1539F98EA50AE063020012AC11EF   com.oracle.fusabase.recipeshare   ANDROID    1      

fusabase-livelabs % 


アプリケーションの削除はapplication deleteコマンドで行います。削除対象のApp IDを指定します。

fusabase application delete --appid=57A620B87BE604F8E063020012AC8D05

fusabase-livelabs % fusabase application delete --appid=57A620B87BE604F8E063020012AC8D05

Successfully deleted the application

fusabase-livelabs %


あらかじめ、アプリケーション名とタイプを記載したJSONファイルを用意することで、対話せずにアプリケーションの作成ができます。

以下の内容のファイルをapp.jsonとして用意します。

{ "APP_NAME": "RecipeShareWeb", "APP_TYPE": "web" }

fusabase application create --path=app.json

fusabase-livelabs % fusabase application create --path=app.json

Application Created Successfully!!

{"APP_ID":"57A620B87BE704F8E063020012AC8D05"}

fusabase-livelabs % 


作成したアプリケーションの構成データは、application getコマンドで取得します。application listコマンドよりApp IDを確認しておきます。

fusabase application get --appid=<App Id>

ords_hostはnullになっています。この値はfusabase.config.jsにhostとして設定した値になります。

fusabase-livelabs % fusabase application get --appid=57A620B87BE704F8E063020012AC8D05

Response data:

{

  "schema": "testuser",

  "app_name": "RecipeShareWeb",

  "app_type": "web",

  "app_id": "57A620B87BE704F8E063020012AC8D05",

  "objs_type": "dbfs",

  "project_id": "573E3A97FC7320ADE063020012AC296D",

  "storage_bucket": "dbfs_CXJHFAIIZAPLDEH",

  "auth_type": "base",

  "auth_id": "573E3A97FC7720ADE063020012AC296D",

  "ords_host": null

}

fusabase-livelabs % 


以上で、CLIでアプリケーションの作成ができました。

ただし、なぜかCLIで作成したアプリケーションはWebのコンソールから参照できません。CLIのapplication listの一覧には含まれますが、注意が必要でしょう。




Backendを初期化する



LiveLabsのアプリケーションから作成したユーザーは、fusabase auth listでは一覧されないようです。

fusabase auth list

fusabase-livelabs % fusabase auth list

Successfully fetched service details

auth type:base

Fetched Successfully!!

  First Name   Last Name   Email   UUID   Provider   Verified   Active   Ctime 

fusabase-livelabs % 


CLIから作成したユーザー(auth addで作成したユーザー)は、auth listで一覧されます。

ワークアラウンドとして、プロジェクトに作成されているユーザーを一覧するスクリプトを書きました。


このスクリプトを実行します。

sh list-users.sh

fusabase-livelabs % sh list-users.sh 

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100   394    0   394    0     0  11455      0 --:--:-- --:--:-- --:--:-- 11588

"first_name","last_name","username","email","uuid","provider","display_name","verified","active","creationTime","lastSigninTime"

"-","-","test@example.com","test@example.com","57A67E98FC627120E063020012ACF888","UserNamePassword","- -","false","true","2026-07-28T06:07:35.897414Z","2026-07-28T06:18:34.300295Z"

fusabase-livelabs % 


作成したユーザーのusernameを見つけ、削除します。

fusabase auth delete --username=test@example.com

fusabase-livelabs % fusabase auth delete --username=test@example.com

Successfully fetched service details

auth type:base

Successfully deleted app user

fusabase-livelabs % 


Databaseのコレクションrecipesを削除します。

作成されているコレクションを確認します。database listコマンドを実行します。

fusabase database list root

fusabase-livelabs % fusabase database list root

Response data:

  Collection Name   Collection_Id 

  emp               3440030340    

  recipes           3905671794    

fusabase-livelabs % 


コレクションrecipesを削除します。確認がなく、コマンドを実行したら即削除されるので、実行には細心の注意が必要です。

fusabase database delete recipes

fusabase-livelabs % fusabase database delete recipes

Path is : recipes

Collection delete Successfully:

{"message":"success"}

fusabase-livelabs %


コレクションrecipesが削除されたことを確認します。

fusabase database list root

fusabase-livelabs % fusabase database list root

Response data:

  Collection Name   Collection_Id 

  emp               3440030340    

fusabase-livelabs % 


Storageに作成されているフォルダrecipesを削除します。

Storageは作成済みのフォルダについて、storage listコマンドで内容や存在を確認できます。

fusabase storage list recipes

fusabase-livelabs % fusabase storage list recipes

Successfully fetched service details

storage type :dbfs

List of Files:

  ----File Name---- 

List of Directories:

  ----Directory Name----                    

  /recipes/57A67E98FC6B7120E063020012ACF888 

fusabase-livelabs % 


しかし、Databaseのようにrootという指定が効かないため、ルート・フォルダ直下をリストする方法を見つけることができませんでした。

削除についてはstorage delコマンドで実行できます。このコマンドも確認がなく、コマンドを実行したら即削除されます。

fusabase storage del recipes

fusabase-livelabs % fusabase storage del recipes

Successfully fetched service details

storage type :dbfs

Successfully deleted file from storage

fusabase-livelabs % 


以上で、Oracle Backend for FirebaseのLiveLabsで、GUIのコンソールから実施していた作業を、すべてfusabase-cliおよび、一部ワークアラウンドのスクリプトを使って、CLIで実行することができました。

今回の記事は以上になります。