الدمج مع Google Cloud

تم دمج Cloud Storage for Firebase بإحكام مع Google Cloud. تخزِّن حِزم تطوير البرامج (SDK) الخاصة بـ Firebase الملفات مباشرةً في حِزم Google Cloud Storage، ويمكنك مع توسّع تطبيقك دمج خدمات Google Cloud أخرى، مثل الحوسبة المُدارة مثل App Engine أو Cloud Functions، أو واجهات برمجة التطبيقات الخاصة بتعلُّم الآلة مثل Cloud Vision أو "ترجمة Google".Cloud Storage

مشروع Firebase هو في الواقع مجرد مشروع Google Cloud تم تفعيل إعدادات وخدمات إضافية خاصة بـ Firebase فيه. وهذا يعني أنّه يمكن الوصول إلى كل حزمة Cloud Storage تستخدمها مع Cloud Storage for Firebase في Google Cloud (بما في ذلك وحدة التحكّم وواجهات برمجة التطبيقات).

يتطلّب الدمج مع Google Cloud، بما في ذلك استيراد حِزم Cloud Storage الحالية، مشروعًا على Firebase ضمن خطة التسعير Blaze للدفع حسب الاستخدام.

اعتبارات بشأن حسابات الخدمة

تستخدم Firebase Google Cloud حسابات الخدمة لتشغيل الخدمات وإدارتها بدون مشاركة بيانات اعتماد المستخدم. عند إنشاء مشروع على Firebase يستخدم Cloud Storage، قد تلاحظ أنّ حساب خدمة مطابقًا متاحًا في مشروعك: service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com. لمزيد من المعلومات، اطّلِع على نظرة عامة على حسابات خدمة Firebase.

Google Cloud Storage

يمكنك استخدام واجهات برمجة التطبيقات Google Cloud Storage للوصول إلى الملفات التي تم تحميلها من خلال حِزم تطوير البرامج (SDK) الخاصة بـ Firebase في Cloud Storage، خاصةً لتنفيذ عمليات أكثر تعقيدًا، مثل نسخ ملف أو نقله أو إدراج جميع الملفات المتاحة في مرجع.

يُرجى العِلم أنّ هذه الطلبات تستخدم Google Cloud Storage خيارات التحكّم في الوصول، بدلاً من Firebase Authentication وCloud Storage Security Rules.

واجهات برمجة التطبيقات

بالإضافة إلى حِزم تطوير البرامج (SDK) الخاصة بـ Firebase في Cloud Storage، هناك عدد من الطرق الأخرى للوصول إلى البيانات المخزَّنة في حزمة Cloud Storage، وذلك حسب ما تريد تنفيذه. إذا كنت تريد الوصول إلى البيانات على خادم، نوفّر لك مكتبات من جهة الخادم، بالإضافة إلى واجهة برمجة تطبيقات RESTful‏ JSON وXML متوافقة مع S3، أو إذا كنت بحاجة إلى كتابة نصوص برمجية لإجراء تغييرات أو تنفيذ مهام إدارية أخرى، نوفّر لك أداة سطر أوامر ستكون مفيدة.

Google Cloud حِزم SDK للخادم

تقدّم Google Cloud حِزم SDK عالية الجودة للخادم لعدد من منتجات السحابة الإلكترونية، بما في ذلك Cloud Storage. تتوفّر هذه المكتبات في Node.js وJava وgo وPython وPHP وRuby.

لمزيد من المعلومات، بما في ذلك تعليمات التثبيت والمصادقة وتحديد المشاكل وحلّها، يُرجى الرجوع إلى المستندات الخاصة بالنظام الأساسي والمرتبطة أعلاه.

في ما يلي مثال على استخدام حزمة تطوير البرامج (SDK) Google Cloud Storage:

Node.js

    // Require gcloud
    var gcloud = require('google-cloud');

    // Enable Cloud Storage
    var gcs = gcloud.storage({
      projectId: 'grape-spaceship-123',
      keyFilename: '/path/to/keyfile.json'
    });

    // Reference an existing bucket.
    var bucket = gcs.bucket('my-existing-bucket');

    // Upload a local file to a new file to be created in your bucket.
    bucket.upload('/photos/zoo/zebra.jpg', function(err, file) {
      if (!err) {
        // "zebra.jpg" is now in your bucket.
      }
    });

    // Download a file from your bucket.
    bucket.file('giraffe.jpg').download({
      destination: '/photos/zoo/giraffe.jpg'
    }, function(err) {});
    

Java

    // Enable Cloud Storage
    Storage storage = StorageOptions.builder()
      .authCredentials(AuthCredentials.createForJson(new FileInputStream("/path/to/my/key.json"))
      .build()
      .service();

    // Upload a local file to a new file to be created in your bucket.
    InputStream uploadContent = ...
    BlobId blobId = BlobId.of("my-existing-bucket", "zebra.jpg");
    BlobInfo blobInfo = BlobInfo.builder(blobId).contentType("text/plain").build();
    Blob zebraBlob = storage.create(blobInfo, content);

    // Download a file from your bucket.
    Blob giraffeBlob = storage.get("my-existing-bucket", "giraffe.jpg", null);
    InputStream downloadContent = giraffeBlob.getInputStream();
    

Go

    // Enable Cloud Storage
    client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json"))
    if err != nil {
        log.Fatal(err)
    }

    // Download a file from your bucket.
    rc, err := client.Bucket("my-existing-bucket").Object("giraffe.jpg").NewReader(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer rc.Close()
    body, err := ioutil.ReadAll(rc)
    if err != nil {
        log.Fatal(err)
    }
    

Python

    # Import gcloud
    from google.cloud import storage

    # Enable Cloud Storage
    client = storage.Client()

    # Reference an existing bucket.
    bucket = client.get_bucket('my-existing-bucket')

    # Upload a local file to a new file to be created in your bucket.
    zebraBlob = bucket.get_blob('zebra.jpg')
    zebraBlob.upload_from_filename(filename='/photos/zoo/zebra.jpg')

    # Download a file from your bucket.
    giraffeBlob = bucket.get_blob('giraffe.jpg')
    giraffeBlob.download_as_string()
    

PHP

    // Require gcloud
    require 'vendor/autoload.php';
    use Google\Cloud\Storage\StorageClient;

    // Enable Cloud Storage
    $storage = new StorageClient([
        'projectId' => 'grape-spaceship-123'
    ]);

    // Reference an existing bucket.
    $bucket = $storage->bucket('my-existing-bucket');

    // Upload a file to the bucket.
    $bucket->upload(
        fopen('/photos/zoo/zebra.jpg', 'r')
    );

    // Download a file from your bucket.
    $object = $bucket->object('giraffe.jpg');
    $object->downloadToFile('/photos/zoo/giraffe.jpg');
    

لغة Ruby

    # Require gcloud
    require "google/cloud"

    # Enable Cloud Storage
    gcloud = Google::Cloud.new "grape-spaceship-123", "/path/to/keyfile.json"
    storage = gcloud.storage

    # Reference an existing bucket.
    bucket = storage.bucket "my-existing-bucket"

    # Upload a file to the bucket.
    bucket.create_file "/photos/zoo/zebra.jpg", "zebra.jpg"

    # Download a file from your bucket.
    file = bucket.file "giraffe.jpg"
    file.download "/photos/zoo/#{file.name}"
    

واجهة برمجة تطبيقات REST

إذا كنت تستخدم لغة لا تتضمّن مكتبة برامج، أو أردت تنفيذ إجراء لا يمكن تنفيذه باستخدام مكتبات البرامج، أو كان لديك عميل HTTP مفضّل تريد استخدامه، توفّر Google Cloud Storage واجهات برمجة تطبيقات لكل من تنسيقَي JSON و XML.

بالإضافة إلى واجهات برمجة التطبيقات هذه التي تتيح الوصول إلى بيانات التخزين، يمكنك استخدام Cloud Storage for Firebase API لإدارة حِزم Cloud Storage لاستخدامها في مشاريع Firebase.

gsutil

gsutil هي أداة سطر أوامر تتيح لك الوصول مباشرةً إلى Cloud Storage. يمكنك استخدام gsutil لتنفيذ مجموعة كبيرة من مهام إدارة الحِزم والعناصر، بما في ذلك:

  • تحميل العناصر وتنزيلها وحذفها
  • إدراج الحِزم والكائنات
  • نقل العناصر ونسخها وإعادة تسميتها
  • تعديل قوائم التحكّم بالوصول (ACL) الخاصة بالعناصر والحِزم

gsutil السماح بإجراء عمليات متقدّمة أخرى، مثل نقل الملفات من دليل إلى آخر أو حذف جميع الملفات الموجودة ضمن موقع جغرافي معيّن

يمكنك نقل جميع الملفات من مرجع إلى آخر بسهولة باتّباع الخطوات التالية:

gsutil mv gs://bucket/old/reference gs://bucket/new/reference

إنّ الحذف المجمّع لجميع الملفات أدناه هو أمر سهل الاستخدام أيضًا:

# Delete all files under a path
gsutil rm -r gs://bucket/reference/to/delete

# Delete all the files in a bucket but not the bucket gsutil rm -r gs://bucket/**

# Delete all the files AND the bucket # Removing the default bucket will break the Firebase SDKs for Cloud Storage and is strongly discouraged gsutil rm -r gs://bucket

معدّلات الطلبات

Google Cloud Storage هي خدمة قابلة للتوسّع بشكل كبير تستخدم تكنولوجيا التوسّع التلقائي لتحقيق معدّلات طلبات عالية جدًا.

Google Cloud Storage هي خدمة متعددة المستأجرين، ما يعني أنّ المستخدمين يتشاركون مجموعة الموارد الأساسية نفسها. للاستفادة إلى أقصى حد من هذه الموارد المشترَكة، تتضمّن الحِزم سعة إدخال/إخراج أولية.

أثناء التخطيط لدمج Cloud Storage for Firebase في تطبيقك، فكِّر في الحد الأدنى لمعدّل الطلبات الذي يحتاج إليه تطبيقك لتحقيق أداء جيد، وفي تقديم الطلبات بكفاءة. راجِع الإرشادات حول معدّلات الطلبات، وخاصةً زيادة معدّلات الطلبات تدريجيًا.

تحديد إصدارات العناصر

هل سبق أن حذفت شيئًا عن طريق الخطأ ولم يكن لديك نسخة احتياطية؟ تتيح خدمة Google Cloud Storage ميزة إصدارات العناصر، التي توفّر طريقة تلقائية للاحتفاظ بنسخة احتياطية من بياناتك واستعادتها. يمكنك تفعيل ميزة "التحكّم في إصدارات العناصر" باستخدام الأمر gsutil versioning set:

gsutil versioning set on gs://<your-cloud-storage-bucket>

يختار Cloud Storage دائمًا أحدث إصدار، لذا إذا أردت استعادة عنصر، عليك استخدام إحدى واجهات برمجة التطبيقات أو الأدوات الأخرى المذكورة أعلاه لضبط العنصر المطلوب كأحدث إصدار.

إدارة دورة حياة الكائن

تُعدّ إمكانية أرشفة الملفات القديمة أو حذفها تلقائيًا ميزة مفيدة للعديد من التطبيقات. لحسن الحظ، يوفّر Google Cloud Storage ميزة إدارة مراحل نشاط العناصر، التي تتيح لك حذف العناصر أو أرشفتها بعد فترة زمنية معيّنة.

لنفترض أنّك تستخدم تطبيقًا لمشاركة الصور وتريد حذف جميع الصور خلال يوم واحد. يمكنك إعداد سياسة دورة حياة عنصر على النحو التالي:

// lifecycle.json
{
  "lifecycle": {
    "rule":
    [
      {
        "action": {"type": "Delete"},
        "condition": {"age": 1}
      }
    ]
  }
}

ونشره باستخدام الأمر gsutil lifecycle set:

gsutil lifecycle set lifecycle.json gs://<your-cloud-storage-bucket>

يُرجى العِلم أنّ هذا الإجراء ينطبق على جميع الملفات في الحزمة، لذا إذا كنت تخزّن نُسخًا احتياطية مهمة من بيانات المستخدمين تريد الاحتفاظ بها لفترة طويلة إلى جانب الصور التي تريد حذفها يوميًا، ننصحك باستخدام حزمتَين منفصلتَين أو إجراء عمليات الحذف يدويًا باستخدام gsutil أو الخادم الخاص بك.

‫Google Cloud Functions (إصدار تجريبي)

‫Google Cloud Functions هي حلّ حوسبة خفيف الوزن ومستنِد إلى الأحداث وغير متزامن يتيح لك إنشاء وظائف صغيرة ذات غرض واحد تستجيب للأحداث بدون الحاجة إلى إدارة خادم أو بيئة وقت تشغيل. يمكن استخدام هذه الدوال لترميز الفيديو، أو تصنيف الصور باستخدام تعلُّم الآلة، أو مزامنة البيانات الوصفية مع Firebase Realtime Database. توفّر Cloud Functions أسرع طريقة للاستجابة للتغييرات في Cloud Storage، وذلك لأنّها تتطلّب تكلفة أقل من App Engine.

Google Cloud Vision API

تتيح Google Cloud Vision API للمطوّرين فهم محتوى الصورة من خلال تضمين نماذج تعلُّم آلي قوية في واجهة برمجة تطبيقات سهلة الاستخدام. وتصنّف الصور بسرعة إلى آلاف الفئات، وترصد الأشياء والوجوه الفردية داخل الصور، وتعثر على الكلمات المطبوعة داخل الصور وتقرأها، وتتعرّف على المحتوى المسيء، وتقدّم حتى تحليلاً للمشاعر في الصور.

Google Cloud Speech API

على غرار Vision API، تتيح Google Cloud Speech API للمطوّرين استخراج نص من ملف صوتي مخزّن في Cloud Storage. تتعرّف واجهة برمجة التطبيقات على أكثر من 80 لغة وشريحة مختلفة لتلبية احتياجات قاعدة المستخدمين العالمية. عند دمجها مع Google Cloud Natural Language API، يمكن للمطوّرين استخراج النص الأولي واستنتاج المعنى المرتبط به. وإذا كان الجمهور المستهدف عالميًا، يمكنك استخدام Google Translate API لترجمة النص إلى أكثر من 90 لغة.

Google App Engine

Google App Engine هي "منصة كخدمة" تعمل على توسيع نطاق منطق الخلفية تلقائيًا استجابةً لمقدار الزيارات التي تتلقّاها. ما عليك سوى تحميل رمز الخلفية، وستتولّى Google إدارة مدى توفّر تطبيقك، ولن تحتاج إلى توفير أي خوادم أو صيانتها. App Engine هي طريقة سريعة ومباشرة لإضافة قدرة معالجة إضافية أو تنفيذ موثوق به إلى تطبيقك على Firebase.

إذا كان لديك حزمة Cloud Storage تلقائية بتنسيق الاسم PROJECT_ID.appspot.com، تتم مشاركتها تلقائيًا مع تطبيق App Engine في مشروعك. وهذا يعني أنّه في حال إنشاء تطبيق App Engine، يمكنك استخدام واجهات برمجة التطبيقات المضمّنة في App Engine لمشاركة البيانات بين حزمة التطبيق هذه وApp Engine. ويكون ذلك مفيدًا لتنفيذ مهام ترميز الصوت وتحويل ترميز الفيديو وتحويل الصور، بالإضافة إلى عمليات أخرى مكثفة للمعالجة في الخلفية.

تتضمّن البيئات العادية للغات Java وPython وGo في App Engine واجهة برمجة التطبيقات App Engine Images API (Java | Python | Go)، والتي يمكنها تغيير حجم الصورة وتدويرها وقلبها واقتصاصها، بالإضافة إلى عرض عنوان URL لخدمة الصور يتيح إجراء عمليات تحويل من جهة العميل، على غرار Cloudinary وImgix.

عند استيراد مشروع Google Cloud حالي إلى Firebase، إذا أردت إتاحة أي عناصر App Engine حالية في Firebase، عليك ضبط إعدادات التحكّم التلقائية في الوصول إلى عناصرك للسماح لـ Firebase بالوصول إليها من خلال تنفيذ الأمر التالي باستخدام gsutil:

gsutil -m acl ch -r -u service-PROJECT_NUMBER@gcp-sa-firebasestorage.iam.gserviceaccount.com gs://BUCKET_NAME

اعتبارات ملفات Firebase Security Rules وApp Engine

إذا كان لديك حزمة Cloud Storage تلقائية بتنسيق اسم *.appspot.com، سيتضمّن مشروعك أيضًا تطبيق App Engine يشارك هذه الحزمة.

في حال ضبط Firebase Security Rules على إمكانية الوصول العلني (بدون مصادقة)، ستتيح أيضًا إمكانية الوصول العلني إلى ملفات App Engine التي تم تحميلها حديثًا.

المشاكل المعروفة في Cloud Storage وApp Engine

هناك حالتان معروفتان لا يمكنك فيهما استيراد تطبيق App Engine:

  1. يتضمّن المشروع تطبيقًا سابقًا App Engine Datastore رئيسي/تابع.
  2. يحتوي المشروع على رقم تعريف مشروع مسبوق باسم النطاق، مثل: domain.com:project-1234.

في أيّ من هاتين الحالتين، لن يتوافق المشروع مع Cloud Storage for Firebase، ويجب إنشاء مشروع جديد على Firebase لاستخدام Cloud Storage. يُرجى التواصل مع فريق الدعم لنتمكّن من مساعدتك.