API REST хостинга Firebase обеспечивает программное и настраиваемое развертывание на ваших сайтах, размещенных на Firebase. Используйте этот REST API для развертывания нового или обновленного содержимого и конфигурации хостинга.
В качестве альтернативы использованию Firebase CLI для развертываний вы можете использовать REST API Firebase Hosting, чтобы программно создать новую version
ресурсов для вашего сайта, загрузить файлы в эту версию, а затем развернуть ��е на своем сайте.
Например, с помощью REST API хостинга Firebase вы можете:
Расписание развертываний. Используя REST API в сочетании с заданием cron, вы можете регулярно изменять контент, размещенный в Firebase (например, для развертывания специальной версии вашего контента, связанной с праздниками или событиями).
Интеграция с инструментами разработчика. Вы можете создать в своем инструменте опцию для развертывания проектов веб-приложений на хостинге Firebase одним щелчком мыши (например, нажатием кнопки развертывания в IDE).
Автоматизируйте развертывание при создании статического контента. Когда процесс программно генерирует статический контент (например, пользовательский контент, такой как вики-страница или новостная статья), вы можете развернуть сгенерированный контент в виде статических файлов, а не обслуживать его динамически. Это экономит дорогостоящие вычислительные мощности и обеспечивает более масштабируемое обслуживание ваших файлов.
В этом руководстве сначала описывается, как включить, аутентифицировать и авторизовать API. Затем в этом руководстве рассматривается пример создания версии хостинга Firebase, загрузки необходимых файлов в версию и, наконец, развертывания версии.
Вы также можете узнать больше об этом REST API в полной справочной документации Hosting REST API .
Прежде чем начать: включите REST API.
Вам необходимо включить REST API хостинга Firebase в консоли Google API:
Откройте страницу Firebase Hosting API в консоли Google API.
При появлении запроса выберите свой проект Firebase.
Нажмите «Включить» на странице API хостинга Firebase.
Шаг 1. Получите токен доступа для аутентификации и авторизации запросов API.
Проекты Firebase поддерживают учетные записи служб Google, которые вы можете использовать для вызова API-интерфейсов сервера Firebase с вашего сервера приложений или доверенной среды. Если вы разрабатываете код локально или развертываете приложение локально, вы можете использовать учетные данные, полученные через эту учетную запись службы, для авторизации запросов к серверу.
Чтобы аутентифицировать учетную запись службы и разрешить ей доступ к службам Firebase, вам необходимо создать файл закрытого ключа в формате JSON.
Чтобы создать файл закрытого ключа для вашей учетной записи службы:
В консоли Firebase откройте «Настройки» > «Учетные записи служб» .
Нажмите «Создать новый закрытый ключ» , затем подтвердите действие, нажав «Создать ключ» .
Надежно сохраните файл JSON, содержащий ключ.
Используйте свои учетные данные Firebase вместе с библиотекой Google Auth для предпочитаемого вами языка, чтобы получить недолговечный токен доступа OAuth 2.0:
узел.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 .
Питон
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(); }
По истечении срока действия токена доступа метод обновления токена вызывается автоматически для получения обновленного токена доступа.
Шаг 2. Убедитесь, что в вашем проекте есть хостинг по умолчанию.
Перед первым развертыванием на хостинге Firebase в вашем проекте Firebase должен быть хостинг SITE
по умолчанию.
Проверьте, есть ли у вашего проекта хостинг-сайт по умолчанию, вызвав конечную точку
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"
, то в вашем проекте уже есть хостинг-сайт по умолчанию. Пропустите оставшуюся часть этого шага и перейдите к следующему: создайте новую версию своего сайта .Если вы получаете пустой массив, значит, у вас нет хостинга по умолчанию. Завершите оставшуюся часть этого шага.
Определите
SITE_ID
для вашего сайта хостинга по умолчанию. При выбореSITE_ID
помните следующее:Этот
SITE_ID
используется для создания поддоменов Firebase по умолчанию:SITE_ID .web.app
иSITE_ID .firebaseapp.com
.К SITE_ID
предъявляются следующие требования:Должна быть допустимой меткой имени хоста, то есть она не может содержать .
,_
, и т. д.Должно быть 30 символов или меньше. Должно быть глобально уникальным в Firebase.
Обратите внимание, что мы часто рекомендуем использовать идентификатор вашего проекта в качестве SITE_ID
для вашего хостинг-сайта по умолчанию. Узнайте, как найти этот идентификатор, в разделе «Понимание проектов Firebase» .Создайте сайт хостинга по умолчанию, вызвав конечную точку 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. Создайте новую версию своего сайта.
Version
для вашего сайта. Далее в этом руководстве вы загрузите файлы в эту версию, а затем развернете ее на своем сайте.
Определите SITE_ID сайта, на котором вы хотите выполнить развертывание. Вызовите конечную точкуversions.create , используя в вызове свой SITE_ID . (Необязательно) Вы также можете передать в вызове объект конфигурации хостинга Firebase , включая установку заголовка, который кэширует все файлы в течение определенного периода времени. Например: команда 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" } }] } }
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. Укажите список файлов, которые вы хотите развернуть.
file1
, file2
и file3
.
Заархивируйте файлы: gzip file1 && gzip file2 && gzip file3 Теперь у вас есть три сжатых файла: file1.gz
,file2.gz
иfile3.gz
.Получите хэш SHA256 каждого сжатого файла: cat file1.gz | openssl dgst -sha256 66d61f86bb684d0e35f94461c1f9cf4f07a4bb3407bfbd80e518bd44368ff8f4 cat file2.gz | openssl dgst -sha256 490423ebae5dcd6c2df695aea79f1f80555c62e535a2808c8115a6714863d083 cat file3.gz | openssl dgst -sha256 59cae17473d7dd339fe714f4c6c514ab4470757a4fe616dfdb4d81400addf315 Теперь у вас есть три хеша SHA256 трех сжатых файлов. Отправьте эти три хеша в запросе 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" } }
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
из предыдущего шага.
Добавьте косую черту и хэш файла к uploadUrl
, чтобы создать URL-адрес для конкретного файла в формате:https://upload-firebasehosting.googleapis.com/upload/sites/ SITE_ID /versions/ VERSION_ID /files/ FILE_HASH
.Загрузите все необходимые файлы один за другим (в этом примере только 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
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"}
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
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" }
https:// SITE_ID .web.app/file1
https:// SITE_ID .web.app/file2
https:// SITE_ID .web.app/file3
SITE_ID .firebaseapp.com
.