Развертывание на своем сайте с помощью API REST хостинга.

REST API Firebase Hosting позволяет программно и настраиваемо развертывать ваши сайты, размещенные на Firebase. Используйте этот REST API для развертывания нового или обновленного контента и конфигурации Hosting .

В качестве альтернативы использованию Firebase CLI для развертывания вы можете использовать REST API Firebase Hosting для программного создания новой version ресурсов для вашего сайта, загрузки файлов в эту версию, а затем развертывания этой версии на вашем сайте.

Например, с помощью REST API Firebase Hosting вы можете:

  • Планирование развертывания. Используя REST API в сочетании с заданием cron, вы можете регулярно изменять контент, размещенный в Firebase (например, для развертывания специальной версии контента, посвященной празднику или событию).

  • Интеграция с инструментами разработчика. Вы можете добавить в свой инструмент опцию развертывания проектов веб-приложений на Firebase Hosting одним щелчком мыши (например, нажатием кнопки развертывания в IDE).

  • Автоматическое развертывание происходит при генерации статического контента. Когда процесс генерирует статический контент программно (например, контент, созданный пользователями, такой как вики или новостная статья), вы можете развернуть сгенерированный контент в виде статических файлов, а не предоставлять их динамически. Это экономит дорогостоящие вычислительные мощности и обеспечивает более масштабируемое предоставление файлов.

В этом руководстве сначала описывается, как включить, аутентифицировать и авторизовать API. Затем на примере создается версия Firebase Hosting , загружаются необходимые файлы в эту версию, и, наконец, происходит развертывание версии.

Более подробную информацию об этом REST API можно найти в полной справочной документации Hosting REST API .

Перед началом работы: включите REST API.

Необходимо включить REST API Firebase Hosting в консоли Google API:

  1. Откройте страницу Firebase Hosting API в консоли Google API.

  2. При появлении запроса выберите свой проект Firebase.

  3. На странице Firebase Hosting API нажмите кнопку «Включить» .

Шаг 1: Получите токен доступа для аутентификации и авторизации запросов к API.

Проекты Firebase поддерживают сервисные учетные записи Google, которые можно использовать для вызова API сервера Firebase с вашего сервера приложений или доверенной среды. Если вы разрабатываете код локально или развертываете приложение локально, вы можете использовать учетные данные, полученные через эту сервисную учетную запись, для авторизации запросов к серверу.

Для аутентификации учетной записи службы и предоставления ей доступа к сервисам Firebase необходимо сгенерировать файл закрытого ключа в формате JSON.

Чтобы сгенерировать файл закрытого ключа для вашей служебной учетной записи:

  1. В консоли Firebase откройте «Настройки» > «Учетные записи служб» .

  2. Нажмите «Сгенерировать новый закрытый ключ» , затем подтвердите, нажав «Сгенерировать ключ» .

  3. Надежно сохраните JSON-файл, содержащий ключ.

Используйте свои учетные данные Firebase вместе с библиотекой Google Auth для предпочитаемого языка, чтобы получить кратковременный токен доступа OAuth 2.0:

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);
    });
  });
}

В этом примере клиентская библиотека Google API аутентифицирует запрос с помощью JSON-токена (JWT). Дополнительную информацию см. в разделе «JSON-токены» .

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();
}

После истечения срока действия вашего токена доступа автоматически вызывается метод обновления токена для получения обновленного токена доступа.

Шаг 2: Убедитесь, что для вашего проекта указан Hosting по умолчанию.

Перед первым развертыванием на Firebase Hosting ваш проект Firebase должен иметь SITE Hosting по умолчанию.

  1. Проверьте, есть ли у вашего проекта уже сайт Hosting по умолчанию, вызвав конечную точку sites.list .

    Например:

    команда cURL

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

    Необработанный HTTPS-запрос

    Host: firebasehosting.googleapis.com
    
    POST /v1beta1/projects/PROJECT_ID/sites HTTP/1.1
    Authorization: Bearer ACCESS_TOKEN
    Content-Type: application/json
    • Если у одного из сайтов указано "type": "DEFAULT_SITE" , значит, у вашего проекта уже есть сайт Hosting по умолчанию. Пропустите оставшуюся часть этого шага и перейдите к следующему шагу: Создайте новую версию для вашего сайта .

    • Если вы получили пустой массив, значит, у вас нет сайта Hosting по умолчанию. Завершите оставшуюся часть этого шага.

  2. Выберите SITE_ID для вашего сайта, используемого в качестве основного Hosting . При выборе SITE_ID учитывайте следующее:

    • Этот SITE_ID используется для создания ваших поддоменов Firebase по умолчанию:
      SITE_ID .web.app и SITE_ID .firebaseapp.com .

    • SITE_ID предъявляются следующие требования:

      • Это должна быть допустимая метка имени хоста, то есть она не может содержать точки, _ подчеркивания и т . д.
      • Не более 30 символов.
      • Должно быть уникальным в глобальном масштабе в рамках Firebase.

    Обратите внимание, что мы часто рекомендуем использовать идентификатор вашего проекта в качестве SITE_ID для вашего сайта Hosting по умолчанию. Узнайте, как найти этот идентификатор, в разделе «Понимание проектов Firebase» .

  3. Создайте свой сайт Hosting по умолчанию, вызвав конечную точку sites.create и указав желаемый SITE_ID в качестве параметра siteId .

    Например:

    команда cURL

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

    Необработанный HTTPS-запрос

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

    Этот вызов API к sites.create возвращает следующий JSON:

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

Шаг 3: Создайте новую версию для своего сайта.

Ваш первый вызов API предназначен для создания новой Version вашего сайта. Далее в этом руководстве вы загрузите файлы в эту версию, а затем развернете ее на своем сайте.

  1. Определите SITE_ID для сайта, на который вы хотите выполнить развертывание.

  2. Вызовите конечную точку versions.create , используя в вызове свой SITE_ID .

    (Необязательно) Вы также можете передать в вызов объект конфигурации Firebase Hosting , включая установку заголовка, который кэширует все файлы в течение указанного периода времени.

    Например:

    команда cURL

    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
    

    Необработанный HTTPS-запрос

    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"
          }
        }]
      }
    }

Этот вызов API к versions.create возвращает следующий JSON:

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

Этот ответ содержит уникальный идентификатор новой версии в формате: sites/ SITE_ID /versions/ VERSION_ID . Этот уникальный идентификатор понадобится вам на протяжении всего руководства для ссылки на конкретную версию.

Шаг 4: Укажите список файлов, которые вы хотите развернуть.

Теперь, когда у вас есть новый идентификатор версии, вам нужно сообщить Firebase Hosting какие файлы вы хотите в конечном итоге развернуть в этой новой версии.

Обратите внимание, что Hosting устанавливает максимальное ограничение на размер отдельных файлов в 2 ГБ.

Для работы этого API требуется идентифицировать файлы по хешу SHA256. Поэтому, прежде чем совершать вызов API, вам сначала нужно вычислить хеш для каждого статического файла, сжав файлы с помощью Gzip, а затем вычислив хеш SHA256 каждого вновь сжатого файла.

Продолжая наш пример, предположим, что вы хотите развернуть три файла в новой версии: file1 , file2 и file3 .

  1. Сжатие файлов с помощью Gzip:

    gzip file1 && gzip file2 && gzip file3

    Теперь у вас есть три сжатых файла: file1.gz , file2.gz и file3.gz .

  2. Получите хеш SHA256 каждого сжатого файла:

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

    Теперь у вас есть три хеша SHA256 трех сжатых файлов.

  3. Отправьте эти три хеша в API-запросе к конечной точке versions.populateFiles . Перечислите каждый хеш по нужному пути к загруженному файлу (в этом примере: /file1 , /file2 и /file3 ).

    Например:

    команда cURL

    $ 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
    

    Необработанный HTTPS-запрос

    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"
      }
    }

Этот вызов API к versions.populateFiles возвращает следующий JSON:

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

В этот ответ входит:

  • Хэш каждого файла , который необходимо загрузить. Например, в этом примере file1 уже был загружен в предыдущей версии, поэтому его хэш не включен в список uploadRequiredHashes .

  • Параметр uploadUrl , специфичный для новой версии.

На следующем шаге для загрузки двух новых файлов вам понадобятся хеши и uploadURL из ответа, полученного с помощью метода versions.populateFiles .

Шаг 5: Загрузите необходимые файлы

Вам необходимо загрузить каждый необходимый файл отдельно (те файлы, которые указаны в поле uploadRequiredHashes из ответа versions.populateFiles на предыдущем шаге). Для загрузки этих файлов вам понадобятся хеши файлов и uploadUrl , полученные на предыдущем шаге.

  1. Добавьте косую черту и хеш файла к параметру uploadUrl , чтобы создать URL-адрес, специфичный для файла, в формате https://upload-firebasehosting.googleapis.com/upload/sites/ SITE_ID /versions/ VERSION_ID /files/ FILE_HASH

  2. Загрузите все необходимые файлы по одному (в этом примере только file2.gz и file3.gz ) по URL-адресу, указанному для каждого файла, используя серию запросов.

    Например, чтобы загрузить сжатый file2.gz :

    команда cURL

    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
    

    Необработанный HTTPS-запрос

    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

При успешной загрузке возвращается HTTPS-ответ с кодом 200 OK .

Шаг 6: Обновите статус версии на «Завершено».

После загрузки всех файлов, перечисленных в ответе versions.populateFiles , вы можете изменить статус вашей версии на FINALIZED .

Вызовите конечную точку versions.patch , указав в поле status вашего API-запроса значение FINALIZED .

Например:

команда cURL

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

Необработанный HTTPS-запрос

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"}

Этот вызов API к versions.patch возвращает следующий JSON. Убедитесь, что status обновлен до FINALIZED .

{
  "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: Выпустите версию для развертывания.

Теперь, когда у вас есть окончательная версия, выпустите её для развертывания. Для этого вам нужно создать Release вашей версии, который будет содержать конфигурацию хостинга и все файлы содержимого для вашей новой версии.

Для создания релиза воспользуйтесь конечной точкой releases.create .

Например:

команда cURL

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

Необработанный HTTPS-запрос

Host: firebasehosting.googleapis.com

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

Этот вызов API к releases.create возвращает следующий JSON:

{
  "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"
}

Конфигурация хостинга и все файлы для новой версии теперь должны быть развернуты на вашем сайте, и вы можете получить доступ к своим файлам, используя следующие URL-адреса:

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

Эти файлы также доступны по URL-адресам, связанным с вашим доменом SITE_ID .firebaseapp.com .

Вы также можете увидеть свой новый релиз в панели Hosting в консоли Firebase .