🗂️
Setup Automatic Firestore Backup

References

Using Cloud Functions:

Using Github Actions:

How to create Cloud Storage Bucket:

Test Repo

Cloud Function:

Github Action:

Prerequisites

  1. Pastikan billing Firebase (Blaze Plan) atau Billing GCP sudah aktif.
  1. Buat Cloud Storage Bucket terlebih dahulu.

Setup for Cloud Function

  1. Buka GCP shell
  1. Tambahkan role Cloud Datastore Import Export Admin pada service account project firebase. Bisa dengan melaksanakan perintah berikut (ganti dengan project_id yang sesuai):
    1. gcloud projects add-iam-policy-binding 
  1. Tambahkan role Storage Admin pada service account project firebase. Bisa dengan melaksanakan perintah berikut (ganti dengan project_id dan bucket_name yang sesuai):
    1. gsutil iam ch serviceAccount:
  1. Inisialisasi firebase functions
  1. Masukkan kode berikut (ganti bucket_name dan cronjob dengan yang sesuai):
    1. import * as functions from "firebase-functions";
      import firestore = require("@google-cloud/firestore");
      const client = new firestore.v1.FirestoreAdminClient();
      
      const bucket = "gs://BUCKET_NAME";
      const cronjob = "* * * * *";
      
      exports.scheduledFirestoreExport = functions.pubsub
          .schedule(cronjob)
          .onRun((context) => {
            const projectId = process.env.GCP_PROJECT || process.env.GCLOUD_PROJECT;
            const databaseName = client.databasePath(projectId!, "(default)");
      
            return client.exportDocuments({
              name: databaseName,
              outputUriPrefix: bucket,
              // Leave collectionIds empty to export all collections
              // or set to a list of collection IDs to export,
              // collectionIds: ["users", "posts"]
              collectionIds: [],
            })
                .then((responses) => {
                  const response = responses[0];
                  console.log(`Operation Name: ${response["name"]}`);
                })
                .catch((err) => {
                  console.error(err);
                  throw new Error("Export operation failed");
                });
          });
  1. Deploy function

Pros

  • Terkait dengan Firebase Project sehingga tidak tercecer.

Cons

  • Memakan quota Cloud Functions

Setup for Github Actions

  1. Buka GCP shell
  1. Buka laman Service Account (IAM & Admin → Service Accounts)
  1. Buat Service Account baru. Nama terserah, tapi pastikan pada tahap kedua assign role Cloud Datastore Import Export Admin dan Storage Admin seperti di bawah ini:
    1. Notion image
  1. Klik titik tiga pada bagian kanan service account tersebut, lalu pilih Manage keys
    1. Notion image
  1. Pilih Add KeyCreate new key lalu pada dialog yang muncul pilih JSON format dan klik Create.
    1. Notion image
  1. Browser akan mendownload file json yang berisi key. Ubah file tersebut menjadi base64. Salah satu caranya bisa dengan memakai perintah base64 yang tersedia di WSL ataupun Git Bash. Jalankan perintah dibawah ini (ganti key_file dengan nama yang sesuai):
    1. base64 
  1. Copy seluruh isi dari file key.txt.
  1. Buka repository github yang ingin dibuat Github Actionnya.
  1. Buka tab SettingsSecrets
  1. Pilih New repository secret lalu masukkan nama GCP_SA_KEY dan paste isi key.txt tadi ke bagian Value. Klik Add Secret.
  1. Buka tab Action lalu pilih new workflowset up a workflow yourself
  1. Masukkan kode berikut (ganti your_project_id_here dan bucket_name dengan yang sesuai):
    1. name: Backup Firestore
      
      on:
        schedule:
          - cron:  '* * * * *'
        workflow_dispatch:
      
      env:
        PROJECT_ID: 
  1. Beri nama file workflow dan commit workflow. Sekarang pada tab Actions Anda dapat melihat workflow Backup Firestore yang dapat dijalankan secara manual ataupun scheduled.
    1. Notion image

Notes: Perlu beberapa waktu agar scheduled actions disetup oleh Github Action dibalik layar. Maka dari itu, setelah meng-commit action tersebut, akan terdapat delay sekitar 20-30 menit sebelum schedule dapat berjalan secara otomatis. Hal tersebut hanya terjadi saat setelah mendeploy.

Pros

  • Memiliki kuota yang jauh lebih banyak dibanding Cloud Functions

Cons

  • Terkait dengan repository Github sehingga apabila menggunakan banyak repository untuk 1 Firebase Project dapat tercecer.

Hasil Backup

Hasil backup berupa folder yang berisi file-file dan subdirektori sesuai struktur firestore (sama dengan folder yang dihasilkan apabila melakukan backup secara manual). Folder ini dapat langsung diimport ke Firestore. Lebih lengkapnya terhadap penggunaan hasil backup dapat dilihat di dokumentasi berikut.

Notion image

Notes

Backup akan menghabiskan 1 read operation untuk setiap dokumen yang dibackup.

Notion image