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:
Откройте страницу Firebase Hosting API в консоли Google API.
При появлении запроса выберите свой проект Firebase.
На странице Firebase Hosting API нажмите кнопку «Включить» .
Шаг 1: Получите токен доступа для аутентификации и авторизации запросов к API.
Проекты Firebase поддерживают сервисные учетные записи Google, которые можно использовать для вызова API сервера Firebase с вашего сервера приложений или доверенной среды. Если вы разрабатываете код локально или развертываете приложение локально, вы можете использовать учетные данные, полученные через эту сервисную учетную запись, для авторизации запросов к серверу.
Для аутентификации учетной записи службы и предоставления ей доступа к сервисам Firebase необходимо сгенерировать файл закрытого ключа в формате JSON.
Чтобы сгенерировать файл закрытого ключа для вашей служебной учетной записи:
В консоли Firebase откройте «Настройки» > «Учетные записи служб» .
Нажмите «Сгенерировать новый закрытый ключ» , затем подтвердите, нажав «Сгенерировать ключ» .
Надежно сохраните 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 по умолчанию.
Проверьте, есть ли у вашего проекта уже сайт 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 по умолчанию. Завершите оставшуюся часть этого шага.
Выберите
SITE_IDдля вашего сайта, используемого в качестве основного Hosting . При выбореSITE_IDучитывайте следующее:Этот
SITE_IDиспользуется для создания ваших поддоменов Firebase по умолчанию:SITE_ID .web.appиSITE_ID .firebaseapp.com.SITE_IDпредъявляются следующие требования:- Это должна быть допустимая метка имени хоста, то есть она не может содержать точки,
_подчеркивания и т.д. - Не более 30 символов.
- Должно быть уникальным в глобальном масштабе в рамках Firebase.
- Это должна быть допустимая метка имени хоста, то есть она не может содержать точки,
Обратите внимание, что мы часто рекомендуем использовать идентификатор вашего проекта в качестве
SITE_IDдля вашего сайта Hosting по умолчанию. Узнайте, как найти этот идентификатор, в разделе «Понимание проектов Firebase» .Создайте свой сайт 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 вашего сайта. Далее в этом руководстве вы загрузите файлы в эту версию, а затем развернете ее на своем сайте.
Определите SITE_ID для сайта, на который вы хотите выполнить развертывание.
Вызовите конечную точку 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 .
Сжатие файлов с помощью Gzip:
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" } }
Этот вызов 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 , полученные на предыдущем шаге.
Добавьте косую черту и хеш файла к параметру
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
При успешной загрузке возвращается 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 .