Astro calendar_today 23 апр. 2026 г. schedule 2 мин

Astro + Cloudflare: Деплой на Edge за 5 минут

Как задеплоить Astro-сайт на Cloudflare Pages. Настройка адаптера, переменные окружения, D1 база данных, R2 хранилище, KV и Workers AI с Astro SSR.

person
Журналист
Автор
Astro + Cloudflare — деплой и едж-компьютинг

С момента приобретения The Astro Technology Company компанией Cloudflare в 2026 году интеграция между Astro и платформой Cloudflare стала ещё глубже. Astro и Cloudflare — идеальная пара: статика на Pages, SSR на Workers, база данных D1, файловое хранилище R2 и кэш KV — всё работает из коробки.

Cloudflare для Astro: Что доступно

СервисЧто этоБесплатно
Cloudflare PagesХостинг статики + SSRДо 100K запросов/день
Cloudflare WorkersEdge-функции (SSR)100K запросов/день
D1 DatabaseSQLite на edge5 GB
KVKey-Value хранилище100K операций/день
R2 StorageОбъектное хранилище10 GB
Workers AIAI-инференс на edgeОграниченно
TurnstileCaptcha без трекингаБесплатно

Деплой статического сайта (SSG) на Pages

Самый простой вариант — чистая статика:

code
# 1. Установите Wrangler CLI
npm install -g wrangler

# 2. Войдите в аккаунт
wrangler login

# 3. Соберите проект
npm run build

# 4. Задеплойте
wrangler pages deploy dist/ --project-name my-site

Или через GitHub-интеграцию в Cloudflare Dashboard:

  1. Подключите GitHub-репозиторий
  2. Укажите: Build command: npm run build, Output: dist
  3. Каждый git push в main → автодеплой

Настройка SSR на Cloudflare Workers

Для динамических страниц (SSR) — установите адаптер:

code
npx astro add cloudflare
code
// astro.config.mjs
import { defineConfig } from 'astro/config';
import cloudflare from '@astrojs/cloudflare';

export default defineConfig({
  output: 'server', // Или 'hybrid' для частичного SSR
  adapter: cloudflare({
    platformProxy: {
      enabled: true, // Локальная эмуляция Cloudflare в dev
    },
  }),
});

В режиме hybrid — большинство страниц статичны, отдельные — SSR:

code
---
// src/pages/profile.astro — только эта страница рендерится на сервере
export const prerender = false; // Отключить пресоздание

const user = await getUserFromCookie(Astro.request);
---

<h1>Привет, {user.name}!</h1>

D1 Database: SQLite на Edge

D1 — это управляемая SQLite база данных Cloudflare. Она живёт на edge-серверах рядом с пользователями.

code
# Создать базу данных
wrangler d1 create my-db

# Создать таблицы
wrangler d1 execute my-db --command "
  CREATE TABLE posts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    content TEXT,
    published_at TEXT DEFAULT CURRENT_TIMESTAMP
  )
"
code
# wrangler.toml
name = "my-site"
compatibility_date = "2026-01-01"

[[d1_databases]]
binding = "DB"
database_name = "my-db"
database_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

В Astro SSR-странице или API-роуте:

code
// src/pages/api/posts.ts
import type { APIRoute } from 'astro';

export const GET: APIRoute = async ({ locals }) => {
  // locals.runtime.env — доступ к Cloudflare bindings
  const db = locals.runtime.env.DB;

  const { results } = await db
    .prepare('SELECT * FROM posts ORDER BY published_at DESC')
    .all();

  return new Response(JSON.stringify(results), {
    headers: { 'Content-Type': 'application/json' },
  });
};

KV: Быстрый кэш и настройки

KV — key-value хранилище с глобальной репликацией. Идеально для кэша, сессий и конфигурации:

code
wrangler kv namespace create "CACHE"
code
# wrangler.toml
[[kv_namespaces]]
binding = "CACHE"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
code
// Кэширование API-ответа
export const GET: APIRoute = async ({ locals }) => {
  const kv = locals.runtime.env.CACHE;

  // Попробовать из кэша
  const cached = await kv.get('weather-data', 'json');
  if (cached) return new Response(JSON.stringify(cached));

  // Запросить данные
  const data = await fetch('https://api.weather.com/today').then((r) => r.json());

  // Кэшировать на 1 час
  await kv.put('weather-data', JSON.stringify(data), { expirationTtl: 3600 });

  return new Response(JSON.stringify(data));
};

R2: Загрузка файлов

R2 — объектное хранилище (аналог AWS S3), без платы за исходящий трафик:

code
wrangler r2 bucket create my-uploads
code
// Загрузка файла через API-роут
export const POST: APIRoute = async ({ request, locals }) => {
  const r2 = locals.runtime.env.MY_BUCKET;
  const formData = await request.formData();
  const file = formData.get('file') as File;

  const key = `uploads/${Date.now()}-${file.name}`;
  await r2.put(key, file.stream(), {
    httpMetadata: { contentType: file.type },
  });

  return new Response(
    JSON.stringify({
      url: `https://your-domain.ru/${key}`,
    }),
  );
};
smart_toy

Workers AI

Cloudflare Workers AI позволяет запускать LLM прямо на edge — 0 мс cold start. Доступны Llama 3, Mistral, Whisper, SDXL и другие модели.

shield

Turnstile вместо CAPTCHA

Cloudflare Turnstile — дружелюбная CAPTCHA без трекинга пользователей. Интегрируется в Astro-формы за 5 минут.

bar_chart

Analytics Engine

Cloudflare Analytics Engine — privacy-friendly аналитика прямо в Workers. Альтернатива GA4 без куки и GDPR-проблем.

Переменные окружения

code
# Добавить секрет (не попадёт в git)
wrangler secret put STRIPE_SECRET_KEY

# Добавить обычную переменную
wrangler pages secret put PUBLIC_SITE_URL

В коде:

code
// В SSR — через locals.runtime.env
const stripeKey = locals.runtime.env.STRIPE_SECRET_KEY;

// В SSG/build-time — через import.meta.env
const siteUrl = import.meta.env.PUBLIC_SITE_URL;

Локальная разработка с Cloudflare

Благодаря platformProxy (Astro 4+) локальный dev-сервер эмулирует Cloudflare Workers:

code
npm run dev
# Локально эмулируются: D1, KV, R2, Workers AI

Не нужно деплоиться для тестирования — всё работает в localhost.

Деплой через GitHub Actions

code
# .github/workflows/deploy.yml
name: Deploy to Cloudflare Pages
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npm run build
      - uses: cloudflare/pages-action@v1
        with:
          apiToken: ${{ secrets.CF_API_TOKEN }}
          accountId: ${{ secrets.CF_ACCOUNT_ID }}
          projectName: my-site
          directory: dist

Итог

Cloudflare + Astro — архитектура будущего. Статика на Pages со встроенным CDN, SSR на Workers с нулевым cold start, D1 для базы данных, KV для кэша, R2 для файлов. Всё это доступно бесплатно в разумных лимитах и масштабируется до миллиардов запросов. Подробнее о хостинге — в статье Деплой и хостинг для Astro.

Портрет автора Дмитрий Соколов

Senior Frontend Engineer / Tech Writer

Senior Frontend Engineer с 9-летним опытом. Специализируется на Astro.js и JAMstack.

Комментарии

Загрузка комментариев...

Оставить комментарий

Комментарии проходят модерацию перед публикацией. Правила

Рекомендуем к прочтению