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

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

Dağıtım için Firebase CLI'yi kullanmaya alternatif olarak, siteniz için programatik olarak yeni bir version öğesi 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 tarafından barındırılan içeriği düzenli bir programda değiştirebilirsiniz (örneğin, içeriğinizin tatil veya etkinlikle ilgili özel bir sürümünü dağıtmak için).

  • Geliştirici araçlarıyla entegrasyon yapın. Aracınızda, web uygulaması projelerinizi yalnızca bir tıklamayla (örneğin, bir IDE'deki dağıtım düğmesini tıklayarak) Firebase Hosting'e dağıtmak için bir seçenek oluşturabilirsiniz.

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

Bu kılavuzda öncelikle API'nin nasıl etkinleştirileceği, kimliğinin nasıl doğrulanacağı ve yetkilendirileceği açıklanmaktadır. Ardından bu kılavuzda, Firebase Hostingsü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 Hosting REST API referans dokümanının tamamında da bulabilirsiniz.

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

Google API'ler 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 yetkilendirmek için erişim jetonu alın

Firebase projeleri, Google hizmet hesaplarını destekler. Bu hesapları, uygulama sunucunuzdan veya güvenilir ortamınızdan Firebase sunucu API'lerini çağırmak için kullanabilirsiniz. Yerel olarak kod geliştiriyorsanız veya uygulamanızı şirket içinde dağıtıyorsanız sunucu isteklerine yetki vermek için bu hizmet hesabı aracılığıyla edinilen kimlik bilgilerini kullanabilirsiniz.

Bir hizmet hesabının kimliğini doğrulamak ve Firebase hizmetlerine erişmesi için yetkilendirmek üzere 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ı'nı açın.

  2. Yeni Gizli 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 Firebase kimlik bilgilerinizi tercih ettiğiniz dildeki Google Auth Library ile birlikte kullanın:

node.jsPythonJava
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ğin kimliğini JSON web jetonu veya JWT ile doğrular. Daha fazla bilgi için JSON web jetonları başlıklı makaleyi inceleyin.

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
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: Projenizde varsayılan bir Hosting sitesi bulunduğundan emin olun

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

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

    Örneğin:

    curl -H "Content-Type: application/json" \
           -H "Authorization: Bearer ACCESS_TOKEN" \
    
    https://firebasehosting.googleapis.com/v1beta1/projects/PROJECT_ID/sites
    
    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 sonraki adıma geçin: Siteniz için yeni bir sürüm oluşturun.

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

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

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

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

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

    Varsayılan Hosting siteniz için SITE_ID olarak genellikle proje kimliğinizi kullanmanızı öneririz. Bu kimliği nasıl bulacağınızı Firebase projelerini anlama başlıklı makalede bulabilirsiniz.

  3. siteId parametresi olarak istediğiniz SITE_ID'i kullanarak sites.create uç noktasını çağırarak varsayılan Hosting sitenizi oluşturun.

    Örneğin:

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

    sites.create adresine 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ğıtım yapmak istediğiniz site için SITE_ID değerini belirleyin.

  2. Aramada SITE_ID değerinizi kullanarak versions.create uç noktasını çağırın.

    (İsteğe bağlı) Ayrıca, tüm dosyaları belirli bir süre boyunca önbelleğe alan bir başlık ayarlamak da dahil olmak üzere çağrıya bir Firebase Hosting yapılandırma nesnesi iletebilirsiniz.

    Örneğin:

    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
    
    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 adresine 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ıt, yeni sürüm için şu biçimde benzersiz bir tanımlayıcı içerir: sites/SITE_ID/versions/VERSION_ID. Bu kılavuzun tamamında, bu sürüme referans vermek için bu benzersiz tanımlayıcıya ihtiyacınız olacak.

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

Yeni sürüm tanımlayıcınız olduğuna göre, Firebase Hosting bu yeni sürümde dağıtmak istediğiniz dosyaları belirtmeniz gerekir.

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

Bu API, dosyaları SHA256 karmasıyla tanımlamanızı gerektirir. Bu nedenle, API çağrısı yapmadan önce, önce dosyaları Gzip ile sıkıştırarak her statik dosya için bir karma değeri hesaplamanız, ardından yeni sıkıştırılan her dosyanın SHA256 karma değerini almanı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. Her sıkıştırılmış 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 karmalarını elde etmişsinizdir.

  3. Bu üç karma oluşturma işlemini, versions.populateFiles uç noktasına bir API isteğinde gönderin. Her karmayı, yüklenen dosyanın istenen yoluna göre listeleyin (bu örnekte /file1, /file2 ve /file3).

    Örneğin:

    $ 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
    
    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 adresine 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 bir sürümde yüklenmiş olduğundan karması uploadRequiredHashes listesine dahil edilmemiştir.

  • Yeni sürüme özgü uploadUrl.

İki yeni dosyayı yüklemek için sonraki adımda, versions.populateFiles yanıtındaki karma oluşturma işlemleri ve uploadURL öğesine ihtiyacınız olacak.

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

Gerekli her dosyayı (önceki adımdaki versions.populateFiles yanıtında uploadRequiredHashes bölümünde listelenen dosyalar) tek tek yüklemeniz gerekir. Bu dosya yüklemeleri için önceki adımdaki dosya karmaları ve uploadUrl değerine ihtiyacınız vardır.

  1. uploadUrl dosyasına ön eğik çizgi ve dosyanın karma oluşturma özelliği eklendiğinde https://upload-firebasehosting.googleapis.com/upload/sites/SITE_ID/versions/VERSION_ID/files/FILE_HASH biçiminde dosyaya özgü bir URL oluşturulur.

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

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

    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
    
    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 KESİNLEŞTİRİLDİ 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ğinizde status alanı FINALIZED olarak ayarlanmışken versions.patch uç noktasını çağırın.

Örneğin:

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
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 adresine yapılan bu API çağrısı aşağıdaki JSON'u döndürür. status değerinin FINALIZED olarak 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ün dağıtıma hazır olduğunu bildirin

Tamamlanmış bir sürümünüz olduğuna göre dağıtım için yayınlayın. Bu adımda, barındırma yapılandırmasını ve yeni sürümünüze ait tüm içerik dosyalarını içeren bir Release sürümünüz oluşturmanız gerekir.

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

Örneğin:

curl -H "Authorization: Bearer ACCESS_TOKEN" \
       -X POST
https://firebasehosting.googleapis.com/v1beta1/sites/SITE_ID/releases?versionName=sites/SITE_ID/versions/VERSION_ID
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 adresine 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"
}

Barındırma yapılandırması ve yeni sürüme ait tüm dosyalar 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.