الدمج مع Google Cloud

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

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

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

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

Google Cloud Storage

يمكنك استخدام Google Cloud Storage APIs للوصول إلى الملفات التي تم تحميلها من خلال Firebase SDKs لـ Cloud Storage، خاصةً لتنفيذ عمليات أكثر تعقيدًا، مثل نسخ ملف أو نقله أو إدراج جميع الملفات المتاحة في مرجع.

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

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

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

Google Cloud حِزم SDK من جهة الخادم

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

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

في ما يلي مثال على استخدام Google Cloud Storage SDK:

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 تتيح ميزة التحكّم في إصدارات العناصر ، ما يوفّر طريقة تلقائية للاحتفاظ بنسخة احتياطية من بياناتك واستعادتها من هذه النسخ الاحتياطية. يمكنك تفعيل ميزة التحكّم في إصدارات العناصر باستخدام الأمر versioning set في gsutil:

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

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

إدارة دورة حياة العناصر

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

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

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

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

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

Cloud Storage for Firebase تستخدم تنسيقَين مختلفَين لتسمية السِجلّات التلقائية وذلك حسب تاريخ إنشاء السِجلّ:

  • السِجلّ التلقائي الذي تم إنشاؤه بعد سبتمبر 2024: *.firebasestorage.app تكون السِجلّات التلقائية مستقلة عن Google App Engine.
  • السِجلّات التلقائية القديمة: *.appspot.com تتم مشاركة السِجلّات التلقائية مع Google App Engine.

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

دمج App Engine القديم

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

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

اعتبارات السِجلّ المشترَك

إذا كنت تستخدم السِجلّ التلقائي القديم *.appspot.com:

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

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

  • يحتوي المشروع على تطبيق سابق على App Engine Datastore Master/Slave.

  • يحتوي المشروع على رقم تعريف مشروع مسبوق بنطاق، على سبيل المثال: domain.com:project-1234.

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