Развертывание Astro-сайта на объектном хранилище с CDN
С помощью VK Object Storage и CDN можно развернуть статический сайт на фреймворке Astro с глобальной доставкой контента и низкой задержкой. Объектное хранилище выступает в роли serverless-хостинга для фронтенда, а CDN обеспечивает кеширование на edge-серверах и доставку контента по HTTPS.
Для примера далее используются следующие данные:
- Имя бакета:
astro-site-bucket - Доменное имя сайта:
astro.example.com - Директория собранного проекта:
./dist - Эндпоинт хранилища:
https://hb.ru-msk.vkcloud-storage.ru
-
Убедитесь, что у вас установлен и настроен AWS CLI.
-
Создайте бакет VK Object Storage со следующими параметрами:
- Имя:
astro-site-bucket. Имя бакета должно соответствовать правилам именования. - Класс хранения:
Hotbox— подходит для быстрой раздачи большого количества файлов.
- Имя:
-
Установите Node.js версии 18 или выше, если это еще не сделано.
-
Создайте проект Astro:
npm create astro@latest -
Убедитесь, что у вас есть доступ к управлению DNS-записями домена
astro.example.com.
-
Перейдите в директорию проекта Astro.
-
Убедитесь, что в файле
astro.config.mjsнастроен статический вывод:import { defineConfig } from 'astro/config';export default defineConfig({output: 'static',}); -
Соберите проект:
npm run buildВ директории
./distпоявятся статические файлы сайта:index.html, страницы ошибок, изображения, файлы CSS и JavaScript. -
Убедитесь, что в корне
./distприсутствуют файлыindex.htmlи404.html. Если файл404.htmlне создан автоматически, создайте его вручную.
Настройте конфигурацию статического сайта. В конфигурации укажите индексный документ и страницу ошибки для бакета. Это можно сделать через файл конфигурации или сразу в команде AWS CLI:
aws s3api put-bucket-website \--bucket astro-site-bucket \--website-configuration '{"IndexDocument":{"Suffix":"index.html"},"ErrorDocument":{"Key":"404.html"}}' \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
Здесь:
index.html— документ, который отдается при обращении к корню бакета.404.html— документ, который отдается при ошибке 404.
После настройки конфигурации статический сайт будет доступен по адресу: https://astro-site-bucket.hb-website.hb.ru-msk.vkcloud-storage.ru
-
Настройте публичный доступ на чтение для объектов сайта. Используйте один из способов.
Политика доступа (рекомендуется)ACL-
Создайте файл
policy.jsonс политикой, разрешающей анонимное чтение объектов:{"Version": "2012-10-17","Statement": [{"Sid": "PublicReadGetObject","Effect": "Allow","Principal": "*","Action": "s3:GetObject","Resource": ["arn:aws:s3:::astro-site-bucket/*"]}]} -
Примените политику:
aws s3api put-bucket-policy \--bucket astro-site-bucket \--policy file://policy.json \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
-
-
Настройте CORS для бакета, если сайт использует кросс-доменные запросы к ресурсам в хранилище.
Пример XML-конфигурации CORS:
<CORSConfiguration><CORSRule><AllowedOrigin>https://astro.example.com</AllowedOrigin><AllowedMethod>GET</AllowedMethod><AllowedMethod>HEAD</AllowedMethod><AllowedHeader>*</AllowedHeader><MaxAgeSeconds>3000</MaxAgeSeconds></CORSRule></CORSConfiguration>Здесь:
AllowedOrigin— домен сайта, с которого разрешены запросы к бакету.AllowedMethods— HTTP-методы, разрешенные в запросах.MaxAgeSeconds— время кеширования результатов предварительного запроса в браузере.
-
Синхронизируйте содержимое директории
./distс бакетом с помощью AWS CLI:aws s3 sync ./dist s3://astro-site-bucket \--endpoint-url https://hb.ru-msk.vkcloud-storage.ruКоманда загружает только новые и измененные файлы, что ускоряет повторные деплои.
-
Убедитесь, что файлы загружены:
aws s3 ls s3://astro-site-bucket \--endpoint-url https://hb.ru-msk.vkcloud-storage.ru
-
Создайте CDN-ресурс через интерфейс бакета
astro-site-bucket. В параметрах укажите:- Персональный домен:
astro.example.com. - Время жизни кеша:
4. Для статического сайта рекомендуется указывать значение от1до7дней.
- Персональный домен:
-
Нажмите Перейти к CDN-ресурсу, чтобы перейти в раздел CDN для дальнейшей настройки.
-
Сохраните служебное доменное имя CDN-ресурса (например,
cl-541e19d9.service.cdn.msk.vkcs.cloud) — оно понадобится для создания CNAME-записи. -
Включите доступ к контенту конечным пользователям. Это необходимо, чтобы затем иметь возможность выбрать Let's Encrypt в качестве SSL-сертификата.
-
Выберите HTTPS в качестве протокола взаимодействия с источником для CDN-ресурса, чтобы обеспечить безопасную передачу данных пользователям. Это также необходимо для использования Let's Encrypt в качестве SSL-сертификата.
-
В настройках шифрования CDN-ресурса выберите опцию Let's Encrypt — будет использован бесплатный SSL-сертификат, который создается автоматически после распространения CNAME-записей в DNS (обычно до 30 минут). Подробнее об управлении SSL-сертификатами — в разделе Использование SSL-сертификата.
-
Настройте DNS-запись: создайте CNAME-запись для домена
astro.example.com, указав в качестве псевдонима сохраненное служебное доменное имя CDN-ресурса. Если используется сервис DNS от VK Cloud, следуйте инструкции по добавлению DNS-записей.
Настройте кеширование на CDN-ресурсе. Подробнее о рекомендуемых значениях TTL для разных типов контента в разделе Кеширование контента.
- Настройте политику доступов по домену, чтобы предотвратить использование ваших ресурсов другими сайтами.
- Настройте политику доступа по странам для ваших источников, чтобы ограничить доступ к контенту по географическому признаку.
-
Откройте сайт по адресу
https://astro.example.comв браузере. Должна отобразиться главная страница Astro-сайта. -
Проверьте страницу ошибки — откройте несуществующий URL, например
https://astro.example.com/nonexistent-page. Должна отобразиться страница404.html. -
Проверьте заголовки ответа:
curl -I https://astro.example.comУбедитесь, что:
- В заголовке
Content-Typeуказан правильный MIME-тип. - Присутствуют заголовки кеширования от CDN.
- В заголовке
-
Проверьте, что изображения и другие статические ресурсы загружаются корректно.
Созданные ресурсы тарифицируются. Если они вам больше не нужны:
- Удалите объекты из бакета.
- Удалите бакет.
- Удалите CDN-ресурс, если он больше не нужен.