Разработка Edge Functions для сайта (Cloudflare Workers)

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка Edge Functions для сайта (Cloudflare Workers)
Средняя
~2-3 рабочих дня
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Разработка Edge Functions для сайта (Cloudflare Workers)

Cloudflare Workers — это edge functions, выполняемые на 300+ PoP-узлах сети Cloudflare. В отличие от Vercel Edge, Workers работают на вашем домене как часть CDN: каждый HTTP-запрос к yourdomain.com может быть перехвачен, модифицирован или полностью обработан Worker'ом без обращения к origin-серверу.

Архитектурные паттерны

Workers as API Gateway — Worker принимает запросы, выполняет аутентификацию, rate limiting, роутинг и проксирует к нужному backend.

Workers as Middleware — модификация запросов/ответов: добавление заголовков, трансформация тела, редиректы по геолокации.

Workers as full API — полная логика в Worker с хранением в KV/D1/R2. Origin-сервер не нужен.

Пример: rate limiting и аутентификация

import { Hono } from "hono";
import { jwt } from "hono/jwt";

const app = new Hono<{ Bindings: Env }>();

// Rate limiting через KV
app.use("*", async (c, next) => {
  const ip = c.req.header("CF-Connecting-IP") || "unknown";
  const key = `rate:${ip}`;

  const count = parseInt(await c.env.KV.get(key) || "0");

  if (count > 100) {
    return c.json({ error: "Too many requests" }, 429);
  }

  await c.env.KV.put(key, String(count + 1), { expirationTtl: 60 });
  return next();
});

// JWT защита для /api/*
app.use("/api/*", jwt({ secret: (c) => c.env.JWT_SECRET }));

app.get("/api/user/:id", async (c) => {
  const { id } = c.req.param();
  const user = await c.env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(id).first();

  if (!user) return c.json({ error: "Not found" }, 404);
  return c.json(user);
});

export default app;

Hono — легковесный роутер, оптимизированный для edge-сред (Cloudflare Workers, Deno Deploy, Bun).

Трансформация ответов от origin

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const response = await fetch(request);

    // Добавляем security headers ко всем ответам
    const newHeaders = new Headers(response.headers);
    newHeaders.set("X-Content-Type-Options", "nosniff");
    newHeaders.set("X-Frame-Options", "SAMEORIGIN");
    newHeaders.set("Referrer-Policy", "strict-origin-when-cross-origin");
    newHeaders.set(
      "Content-Security-Policy",
      "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'"
    );

    return new Response(response.body, {
      status: response.status,
      statusText: response.statusText,
      headers: newHeaders,
    });
  },
};

Геолокация и персонализация контента

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const cf = (request as any).cf as CfProperties;
    const url = new URL(request.url);

    // Редирект на локализованный сайт
    const countryLangMap: Record<string, string> = {
      RU: "ru", UA: "uk", DE: "de", FR: "fr",
    };

    const lang = countryLangMap[cf.country || ""] || "en";

    if (!url.pathname.match(/^\/(ru|uk|de|fr|en)\//)) {
      return Response.redirect(
        `${url.origin}/${lang}${url.pathname}${url.search}`,
        302
      );
    }

    // Передаём геоданные origin-серверу через заголовки
    const modifiedRequest = new Request(request, {
      headers: {
        ...Object.fromEntries(request.headers),
        "X-Country": cf.country || "",
        "X-City": cf.city || "",
        "X-Timezone": cf.timezone || "",
      },
    });

    return fetch(modifiedRequest);
  },
};

R2: хранение файлов без egress-платы

Cloudflare R2 — S3-совместимое хранилище без платы за исходящий трафик.

app.post("/upload", async (c) => {
  const formData = await c.req.formData();
  const file = formData.get("file") as File;

  const key = `uploads/${Date.now()}-${file.name}`;

  await c.env.R2.put(key, file.stream(), {
    httpMetadata: { contentType: file.type },
  });

  return c.json({ url: `https://cdn.yourdomain.com/${key}` });
});

app.get("/files/:key{.+}", async (c) => {
  const key = c.req.param("key");
  const object = await c.env.R2.get(key);

  if (!object) return c.json({ error: "Not found" }, 404);

  return new Response(object.body, {
    headers: {
      "Content-Type": object.httpMetadata?.contentType || "application/octet-stream",
      "Cache-Control": "public, max-age=31536000",
    },
  });
});

Durable Objects: состояние на edge

Для задач, требующих согласованного состояния (счётчики, WebSocket-комнаты, распределённые блокировки):

export class RateLimiter implements DurableObject {
  private requests = 0;

  async fetch(request: Request): Promise<Response> {
    this.requests++;

    if (this.requests > 1000) {
      return new Response("Rate limited", { status: 429 });
    }

    // Сброс счётчика через 1 минуту
    setTimeout(() => { this.requests = 0; }, 60000);

    return new Response("OK");
  }
}

Сроки

Worker с роутингом и rate limiting — 2–3 дня. Полный API с D1, KV, R2 и CI/CD — 5–6 дней.