Hosting REST API kullanarak sitenize dağıtım yapma

Firebase Hosting REST API, Firebase'de barındırılan sitelerinize programatik ve özelleştirilebilir dağıtımlar yapmanızı sağlar. Yeni veya güncellenmiş Hosting içerik ve yapılandırmayı dağıtmak için bu REST API'yi kullanın.

Dağıtımlar için Firebase CLI'yı kullanmak yerine, siteniz için programatik olarak yeni bir version oluşturmak, dosyaları sürüme yüklemek ve ardından sürümü sitenize dağıtmak üzere Firebase Hosting REST API'yi kullanabilirsiniz.

Örneğin, Firebase Hosting REST API ile şunları yapabilirsiniz:

  • Dağıtımları planlayın. REST API'yi bir cron işiyle birlikte kullanarak Firebase'de barındırılan içeriği düzenli olarak değiştirebilirsiniz (örneğin, içeriğinizin özel bir tatil veya etkinlikle ilgili sürümünü dağıtmak için).

  • Geliştirici araçlarıyla entegrasyon Aracınızda, web uygulaması projelerinizi tek bir tıklamayla Firebase Hosting'ya dağıtma seçeneği oluşturabilirsiniz (örneğin, bir IDE'de dağıtma düğmesini tıklama).

  • Statik içerik oluşturulduğunda dağıtımları otomatikleştirin. Bir işlem, statik içeriği programatik olarak oluşturduğunda (örneğin, kullanıcı tarafından oluşturulan içerik, wiki veya haber makalesi gibi) oluşturulan içeriği dinamik olarak sunmak yerine statik dosyalar olarak dağıtabilirsiniz. Bu sayede pahalı işlem gücünden tasarruf edebilir ve dosyalarınızı daha ölçeklenebilir bir şekilde sunabilirsiniz.

Bu kılavuzda öncelikle API'nin nasıl etkinleştirileceği, kimliğinin nasıl doğrulanacağı ve nasıl yetkilendirileceği açıklanmaktadır. Ardından, bu kılavuzda Firebase Hosting sürümü oluşturma, gerekli dosyaları sürüme yükleme ve son olarak sürümü dağıtma ile ilgili bir örnek açıklanmaktadır.

Bu REST API hakkında daha fazla bilgiyi tam Hosting REST API referans belgelerinde bulabilirsiniz.

Başlamadan önce: REST API'yi etkinleştirme

Google API'leri Konsolu'nda Firebase Hosting REST API'yi etkinleştirmeniz gerekir:

  1. Google API Konsolu'nda Firebase Hosting API sayfasını açın.

  2. İstendiğinde Firebase projenizi seçin.

  3. Firebase Hosting API sayfasında Etkinleştir'i tıklayın.

1. adım: API isteklerinin kimliğini doğrulamak ve istekleri yetkilendirmek için erişim jetonu alın

Firebase projeleri, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucu API'lerini çağırmak için kullanabileceğiniz Google hizmet hesaplarını destekler. Kodu yerel olarak geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerini yetkilendirmek için bu hizmet hesabı kullanılarak elde edilen kimlik bilgilerini kullanabilirsiniz.

Firebase projenizle ilgili tüm hizmet hesaplarını Ayarlar > Hizmet hesapları sekmesinde görüntüleyebilirsiniz.

Bir hizmet hesabının kimliğini doğrulamak ve Firebase hizmetlerine erişmesine izin vermek için JSON biçiminde bir özel anahtar dosyası oluşturmanız gerekir.

Hizmet hesabınız için özel anahtar dosyası oluşturmak üzere:

  1. Firebase konsolunda Ayarlar > Hizmet hesapları sekmesine gidin.

  2. Yeni Özel Anahtar Oluştur'u tıklayın, ardından Anahtar Oluştur'u tıklayarak onaylayın.

  3. Anahtarı içeren JSON dosyasını güvenli bir şekilde saklayın.

Kısa süreli bir OAuth 2.0 erişim jetonu almak için tercih ettiğiniz dildeki Google Auth Library ile birlikte Firebase kimlik bilgilerinizi kullanın:

node.js

const {google} = require('googleapis');
function getAccessToken() {
  return new Promise(function(resolve, reject) {
    var key = require('./service-account.json');
    var jwtClient = new google.auth.JWT(
      key.client_email,
      null,
      key.private_key,
      SCOPES,
      null
    );
    jwtClient.authorize(function(err, tokens) {
      if (err) {
        reject(err);
        return;
      }
      resolve(tokens.access_token);
    });
  });
}

Bu örnekte, Google API istemci kitaplığı isteği bir JSON web jetonu (JWT) ile doğrular. Daha fazla bilgi için JSON web jetonları konusuna bakın.

Python

def _get_access_token():
  """Retrieve a valid access token that can be used to authorize requests.

  :return: Access token.
  """
  credentials = ServiceAccountCredentials.from_json_keyfile_name(
      'service-account.json', SCOPES)
  access_token_info = credentials.get_access_token()
  return access_token_info.access_token

Java

private static String getAccessToken() throws IOException {
  GoogleCredential googleCredential = GoogleCredential
      .fromStream(new FileInputStream("service-account.json"))
      .createScoped(Arrays.asList(SCOPES));
  googleCredential.refreshToken();
  return googleCredential.getAccessToken();
}

Erişim jetonunuzun süresi dolduktan sonra, güncellenmiş bir erişim jetonu almak için jeton yenileme yöntemi otomatik olarak çağrılır.

2. adım: Projenizin varsayılan bir Hosting sitesi olduğundan emin olun

Firebase Hosting'ya ilk dağıtımınızı yapmadan önce Firebase projenizde varsayılan bir Hosting SITE olmalıdır.

  1. sites.list uç noktasını çağırarak projenizde varsayılan bir Hosting sitesi olup olmadığını kontrol edin.

    Örneğin:

    cURL komutu

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    

    Ham HTTPS isteği

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Sitelerden birinde "type": "DEFAULT_SITE" varsa projenizde zaten varsayılan bir Hosting sitesi vardır. Bu adımın geri kalanını atlayıp bir sonraki adıma geçin: Siteniz için yeni bir sürüm oluşturun.

    • Boş bir dizi alırsanız varsayılan bir Hosting siteniz yoktur. Bu adımın geri kalanını tamamlayın.

  2. Varsayılan Hosting siteniz için SITE_ID karar verin. Buna karar verirken aşağıdakileri göz önünde bulundurun SITE_ID:

    • Bu SITE_ID, varsayılan Firebase alt alanlarınızı oluşturmak için kullanılır:
      SITE_ID.web.app ve SITE_ID.firebaseapp.com.

    • Bir SITE_ID için aşağıdaki şartlar geçerlidir:

      • Geçerli bir ana makine adı etiketi olmalıdır. Bu nedenle ., _ vb. karakterler içeremez.
      • En fazla 30 karakter uzunluğunda olmalıdır
      • Firebase'de global olarak benzersiz olmalıdır.

    Varsayılan SITE_IDHosting siteniz için genellikle proje kimliğinizi kullanmanızı önerdiğimizi hatırlatmak isteriz. Bu kimliği nasıl bulacağınızı öğrenmek için Firebase projelerini anlama başlıklı makaleyi inceleyin.

  3. İstediğiniz SITE_ID öğesini siteId parametresi olarak kullanarak sites.create uç noktasını çağırarak varsayılan Hosting sitenizi oluşturun.

    Örneğin:

    cURL komutu

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    

    Ham HTTPS isteği

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites?siteId=SITE_ID
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json

    sites.create için yapılan bu API çağrısı aşağıdaki JSON'u döndürür:

    {
      "name": "projects/PROJECT_ID/sites/SITE_ID",
      "defaultUrl": "https://SITE_ID.web.app",
      "type": "DEFAULT_SITE"
    }

3. adım: Siteniz için yeni bir sürüm oluşturun

İlk API çağrınız, siteniz için yeni bir Version oluşturmaktır. Bu kılavuzun ilerleyen bölümlerinde, bu sürüme dosya yükleyip sitenize dağıtacaksınız.

  1. Dağıtmak istediğiniz site için SITE_ID değerini belirleyin.

  2. Aramada SITE_ID kullanarak versions.create uç noktasını arayın.

    (İsteğe bağlı) Belirli bir süre boyunca tüm dosyaları önbelleğe alan bir üstbilgi ayarlama da dahil olmak üzere, çağrıda bir Firebase Hosting yapılandırma nesnesi de iletebilirsiniz.

    Örneğin:

    cURL komutu

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
           -d '{
                 "config": {
                   "headers": [{
                     "glob": "**",
                     "headers": {
                       "Cache-Control": "max-age=1800"
                     }
                   }]
                 }
               }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions
    

    Ham HTTPS isteği

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 134
    
    {
      "config": {
        "headers": [{
          "glob": "**",
          "headers": {
            "Cache-Control": "max-age=1800"
          }
        }]
      }
    }

versions.create için yapılan bu API çağrısı aşağıdaki JSON'u döndürür:

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "CREATED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {
        "Cache-Control": "max-age=1800"
      }
    }]
  }
}

Bu yanıtta, yeni sürümün benzersiz tanımlayıcısı şu biçimde yer alır: sites/SITE_ID/versions/VERSION_ID. Bu kılavuzda, söz konusu sürümden bahsederken bu benzersiz tanımlayıcıyı kullanmanız gerekir.

4. adım: Dağıtmak istediğiniz dosyaların listesini belirtin

Yeni sürüm tanımlayıcınızı aldığınıza göre, hangi dosyaları bu yeni sürümde dağıtmak istediğinizi Firebase Hosting'ya bildirmeniz gerekir.

Hosting'da tek tek dosyalar için maksimum 2 GB boyut sınırı olduğunu unutmayın.

Bu API, dosyaları SHA256 karmasıyla tanımlamanızı gerektirir. Bu nedenle, API çağrısı yapmadan önce dosyaları Gzip ile sıkıştırıp yeni sıkıştırılmış her dosyanın SHA256 karmasını alarak her statik dosyanın karmasını hesaplamanız gerekir.

Örneğimize devam edelim. Yeni sürümde file1, file2 ve file3 olmak üzere üç dosya dağıtmak istediğinizi varsayalım.

  1. Dosyaları Gzip ile sıkıştırın:

    gzip file1 && gzip file2 && gzip file3

    Artık file1.gz, file2.gz ve file3.gz olmak üzere üç sıkıştırılmış dosyanız var.

  2. Sıkıştırılmış her dosyanın SHA256 karmasını alın:

    cat file1.gz | openssl dgst -sha256
    
    66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4
    
    cat file2.gz | openssl dgst -sha256
    
    490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083
    
    cat file3.gz | openssl dgst -sha256
    
    59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315
    

    Artık üç sıkıştırılmış dosyanın üç SHA256 karma değerine sahipsiniz.

  3. Bu üç karma değerini versions.populateFiles uç noktasına bir API isteğiyle gönderin. Her karma değerini, yüklenen dosyanın istenen yoluyla birlikte listeleyin (bu örnekte /file1, /file2 ve /file3).

    Örneğin:

    cURL komutu

    $ curl -H "Content-Type: application/json" \
             -H "Authorization: Bearer ACCESS_TOKEN" \
             -d '{
                   "files": {
                     "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
                     "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
                     "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
                   }
                 }' \
    https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles
    

    Ham HTTPS İsteği

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/sites/SITE_ID/versions/VERSION_ID:populateFiles HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    Content-Length: 181
    
    {
      "files": {
        "/file1": "66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4",
        "/file2": "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
        "/file3": "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
      }
    }

versions.populateFiles için yapılan bu API çağrısı aşağıdaki JSON'u döndürür:

{
  "uploadRequiredHashes": [
    "490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083",
    "59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315"
  ],
  "uploadUrl": "https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files"
}

Bu yanıtta şunlar yer alır:

  • Yüklenmesi gereken her dosyanın karması. Örneğin, bu örnekte file1 daha önce yüklenmiş olduğundan karma değeri uploadRequiredHashes listesine dahil edilmemiştir.

  • Yeni sürüme özel olan uploadUrl.

İki yeni dosyayı yüklemek için bir sonraki adımda, versions.populateFiles yanıtındaki karmalara ve uploadURL değerine ihtiyacınız olacak.

5. adım: Gerekli dosyaları yükleyin

Gerekli olan her dosyayı (önceki adımda versions.populateFiles yanıtındaki uploadRequiredHashes içinde listelenen dosyalar) ayrı ayrı yüklemeniz gerekir. Bu dosya yüklemeleri için dosya karmalarına ve önceki adımdaki uploadUrl ihtiyacınız olacaktır.

  1. uploadUrl öğesine eğik çizgi ve dosyanın karmasını ekleyerek şu biçimde dosyaya özel bir URL oluşturun: https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH.

  2. Gerekli tüm dosyaları (bu örnekte yalnızca file2.gz ve file3.gz) bir dizi istek kullanarak dosyaya özel URL'ye tek tek yükleyin.

    Örneğin, sıkıştırılmış file2.gz dosyasını yüklemek için:

    cURL komutu

    curl -H "Authorization: Bearer ACCESS_TOKEN" \
           -H "Content-Type: application/octet-stream" \
           --data-binary @./file2.gz \
    https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH
    

    Ham HTTPS İsteği

    Host: upload-firebasehosting.googleapis.com
    
    POST /upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/octet-stream
    Content-Length: 500
    
    content-of-file2.gz

Başarılı yüklemeler 200 OK HTTPS yanıtı döndürür.

6. adım: Sürümün durumunu SONLANDIRILDI olarak güncelleyin

versions.populateFiles yanıtında listelenen tüm dosyaları yükledikten sonra sürümünüzün durumunu FINALIZED olarak güncelleyebilirsiniz.

API isteğinizdeki status alanı FINALIZED olarak ayarlanmış şekilde versions.patch uç noktasını çağırın.

Örneğin:

cURL komutu

curl -H "Content-Type: application/json" \
       -H "Authorization: Bearer ACCESS_TOKEN" \
       -X PATCH \
       -d '{"status": "FINALIZED"}' \
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status

Ham HTTPS İsteği

Host: firebasehosting.googleapis.com

PATCH /v1beta1/sites/SITE_ID/versions/VERSION_ID?update_mask=status HTTP/1.1
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
Content-Length: 23

{"status": "FINALIZED"}

versions.patch için yapılan bu API çağrısı aşağıdaki JSON'u döndürür. status uygulamasının FINALIZED sürümüne güncellendiğinden emin olun.

{
  "name": "sites/SITE_ID/versions/VERSION_ID",
  "status": "FINALIZED",
  "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  },
  "createTime": "2018-12-02T13:41:56.905743Z",
  "createUser": {
    "email": "SERVICE_ACCOUNT_EMAIL@SITE_ID.iam.gserviceaccount.com"
  },
  "finalizeTime": "2018-12-02T14:56:13.047423Z",
  "finalizeUser": {
    "email": "USER_EMAIL@DOMAIN.tld"
  },
  "fileCount": "5",
  "versionBytes": "114951"
}

7. adım: Sürümü dağıtıma hazır hale getirin

Son halini verdiğiniz sürümü dağıtım için yayınlayın. Bu adımda, sürümünüzün Release dosyasını oluşturmanız gerekir. Bu dosya, barındırma yapılandırmasını ve yeni sürümünüzdeki tüm içerik dosyalarını içermelidir.

Sürümünüzü oluşturmak için releases.create uç noktasını çağırın.

Örneğin:

cURL komutu

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID

Ham HTTPS isteği

Host: firebasehosting.googleapis.com

POST /v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID HTTP/1.1
Authorization: Bearer ACCESS_TOKEN

releases.create için yapılan bu API çağrısı aşağıdaki JSON'u döndürür:

{
  "name": "sites/SITE_ID/releases/RELEASE_ID",
  "version": {
    "name": "sites/SITE_ID/versions/VERSION_ID",
    "status": "FINALIZED",
    "config": {
    "headers": [{
      "glob": "**",
      "headers": {"Cache-Control": "max-age=1800"}
    }]
  }
  },
  "type": "DEPLOY",
  "releaseTime": "2018-12-02T15:14:37Z"
}

Yeni sürümün barındırma yapılandırması ve tüm dosyaları artık sitenize dağıtılmış olmalıdır. Dosyalarınıza şu URL'leri kullanarak erişebilirsiniz:

  • https://SITE_ID.web.app/file1
  • https://SITE_ID.web.app/file2
  • https://SITE_ID.web.app/file3

Bu dosyalara, SITE_ID.firebaseapp.com alanınızla ilişkili URL'lerden de erişilebilir.

Yeni sürümünüzü Firebase konsolunun Hosting kontrol panelinde de görebilirsiniz.