С момента приобретения The Astro Technology Company компанией Cloudflare в 2026 году интеграция между Astro и платформой Cloudflare стала ещё глубже. Astro и Cloudflare — идеальная пара: статика на Pages, SSR на Workers, база данных D1, файловое хранилище R2 и кэш KV — всё работает из коробки.
Cloudflare для Astro: Что доступно
| Сервис | Что это | Бесплатно |
|---|---|---|
| Cloudflare Pages | Хостинг статики + SSR | До 100K запросов/день |
| Cloudflare Workers | Edge-функции (SSR) | 100K запросов/день |
| D1 Database | SQLite на edge | 5 GB |
| KV | Key-Value хранилище | 100K операций/день |
| R2 Storage | Объектное хранилище | 10 GB |
| Workers AI | AI-инференс на edge | Ограниченно |
| Turnstile | Captcha без трекинга | Бесплатно |
Деплой статического сайта (SSG) на Pages
Самый простой вариант — чистая статика:
# 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:
- Подключите GitHub-репозиторий
- Укажите: Build command:
npm run build, Output:dist - Каждый
git pushвmain→ автодеплой
Настройка SSR на Cloudflare Workers
Для динамических страниц (SSR) — установите адаптер:
npx astro add cloudflare // 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:
---
// 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-серверах рядом с пользователями.
# Создать базу данных
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
)
" # 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-роуте:
// 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 хранилище с глобальной репликацией. Идеально для кэша, сессий и конфигурации:
wrangler kv namespace create "CACHE" # wrangler.toml
[[kv_namespaces]]
binding = "CACHE"
id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" // Кэширование 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), без платы за исходящий трафик:
wrangler r2 bucket create my-uploads // Загрузка файла через 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}`,
}),
);
}; Workers AI
Cloudflare Workers AI позволяет запускать LLM прямо на edge — 0 мс cold start. Доступны Llama 3, Mistral, Whisper, SDXL и другие модели.
Turnstile вместо CAPTCHA
Cloudflare Turnstile — дружелюбная CAPTCHA без трекинга пользователей. Интегрируется в Astro-формы за 5 минут.
Analytics Engine
Cloudflare Analytics Engine — privacy-friendly аналитика прямо в Workers. Альтернатива GA4 без куки и GDPR-проблем.
Переменные окружения
# Добавить секрет (не попадёт в git)
wrangler secret put STRIPE_SECRET_KEY
# Добавить обычную переменную
wrangler pages secret put PUBLIC_SITE_URL В коде:
// В 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:
npm run dev
# Локально эмулируются: D1, KV, R2, Workers AI Не нужно деплоиться для тестирования — всё работает в localhost.
Деплой через GitHub Actions
# .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.