Розробка 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
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

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

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

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

Workers as API Gateway — Worker приймає запити, виконує аутентифікацію, rate limiting, маршрутизацію та проксирує до потрібного бекенду.

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 днів.