خدمات سازمانی خدمات دواپس

پردازش لبه آروان‌کلاد؛ تجربه‌ای بی‌نظیر از سرعت و امنیت

به کمک Edge Computing آروان‌کلاد می‌توانید بدون نیاز به سرور، اسکریپت‌ها و کدهای پردازشی سرویس‌های آنلاین خود را در نزدیک‌ترین نقطه به کاربر اجرا کنید و تجربه‌ی تازه‌ای از سرعت و امنیت را ارایه دهید.

blur پردازش لبه آروان‌کلاد؛ تجربه‌ای بی‌نظیر
            از سرعت و امنیت
گواهینامه SSL رایگان

گواهینامه SSL رایگان

به‌شکل خودکار به همه‌ی دامنه‌های وارد شده در پردازش لبه، گواهینامه‌های SSL رایگان اختصاص داده می‌شود.

راه‌اندازی سریع و آسان

راه‌اندازی سریع و آسان

می‌توانید در کم‌تر از ۳۰ ثانیه به‌کمک پنل کاربری یا CLI آروان‌کلاد سرویس آنلاین کسب‌وکارتان را راه‌اندازی و مستقر کنید.

عملکرد بهینه

عملکرد بهینه

همه‌ی کدهای کسب‌وکار شما در پاپ‌سایت‌های CDN آروان‌کلاد قرار می‌گیرند و از نزدیک‌ترین نقطه به کاربر اجرا می‌شوند.

امنیت بالا

امنیت بالا

به‌کمک ویژگی‌های امنیتی پیشرفته‌ CDN آروان‌کلاد، سرویس‌های خود را در بستری امن و قابل اعتماد توسعه دهید.

ویژگی‌ها

توسعه سرویس‌های آنلاین با ویژگی‌های به‌روز و پیشرفته

بدون نیاز به سرور

می‌توانید سرویس‌های آنلاین کسب‌وکارتان را بدون نیاز به سرور ابری یا سرور مجازی توسعه دهید و محتوای آن را در نزدیک‌ترین نقطه به کاربر اجرا کنید.

مقیاس‌پذیری بالا

بدون نیاز به توزیع بار سرور، از منابع نامحدود شبکه توزیع محتوا استفاده کنید و یا ترافیک را در پاپ‌سایت‌های مختلف پخش کنید.

راه‌اندازی با یک کلیک

به‌کمک کدها و قالب‌های آماده آروان‌کلاد، سرویس مورد نظرتان را با یک کلیک توسعه دهید و به‌تناسب نیازتان بخش‌های مختلف آن را شخصی‌سازی کنید.

مقرون‌به‌صرفه

راه‌اندازی و استقرار نرم‌افزار با Ege Computing به شما امکان می‌دهد تا بتوانید با کم‌ترین هزینه، سرویس‌های خود را به کاربران‌تان ارایه دهید.

عیب‌یابی قبل از انتشار

به‌کمک Console Log قبل از عمومی‌سازی وب‌سایت یا اپلیکیشن خود، به‌راحتی و در کوتاه‌ترین زمان نسخه‌های نهایی را ویرایش (Debug) کنید.

پاسخ‌گویی سریع به درخواست‌ها

با Edge Computing آروان‌کلاد درخواست‌های کاربران را از نزدیک‌ترین فاصله پاسخ دهید و سرعت ارایه‌ی خدمات را به میزان قابل توجهی افزایش دهید.

بیش از ۴۰

پاپ سایت در نقاط پرترافیک جهان

۹۹,۹۹ درصد

آپ‌تایم و دسترسی همیشگی به سرویس

۵۰۰ میلیون

ظرفیت پاسخ‌گویی به درخواست‌ها در ساعت
الگوهای آماده

توسعه سرویس‌های کاربردی به‌سادگی یک کلیک

Round Robin Load balancer

Hotlink Protection

Basic Auth

SSR HTMX

Round Robin Load balancer

با استفاده از Round Robin Load Balancer، درخواست‌های ورودی شما به‌‌شکل متناوب بین چندین سرور توزیع می‌شود. این روش با توزیع یکنواخت بار ترافیک و بهبود عملکرد سیستم به شما کمک می‌کند تا با دسترسی‌پذیری و پایداری بسیار بالا شرایط ترافیکی سخت را پشت سر بگذارید.

مشاهده
کپی شد
                                            
'use strict';

// Upstream URLs
const UPSTREAM_URLS = [
    new URL("http://localhost:4000"),
    new URL("http://localhost:4001"),
    new URL("http://localhost:4002"),
    new URL("http://localhost:4003"),
];

let NEXT_UPSTREAM_INDEX = 0;
async function handleRequest(request) {
    let upstreamIdx = NEXT_UPSTREAM_INDEX;
    NEXT_UPSTREAM_INDEX = (NEXT_UPSTREAM_INDEX + 1) % UPSTREAM_URLS.length;
    let upstream = UPSTREAM_URLS[upstreamIdx];
    return await doRequest(request, upstream);
}
function doRequest(request, upstream) {
    let newUrl = new URL(request.url);
    newUrl.protocol = upstream.protocol;
    newUrl.host = upstream.host;
    let newReq = new Request(newUrl.toString(), request);
    return fetch(newReq);
}

addEventListener("fetch", (event) => {
    event.respondWith(handleRequest(event.request));
});
                                        
Hotlink Protection

با فعال کردن Hotlink Protection می‌توانید از فایل‌های وب‌سایت خود (تصاویر و ویدیوها و …) در برابر استفاده‌ی نادرست در ‌وب‌سایت‌های دیگر محافظت کنید. این کار نه‌تنها باعث کاهش مصرف پهنای باند و هزینه‌ها می‌شود، بلکه امنیت سرویس‌تان را افزایش داده و از محتوای شما محافظت می‌کند.

مشاهده
کپی شد
                                            
'use strict';

// Your domains that is allowed to access hotlinks
const DOMAINS = ["time.ir", "fa.wikipedia.org"];
// Upstream url
const UPSTREAM_URL = "http://localhost:4000";
// File extensions that hotlink is against
const EXTENSIONS = ["jpg", "jpeg", "png", "ico", "gif"];

async function handleRequest(request) {
    const fileExt = extractUrlFileExtension(request.url);
    if (fileExt == null || !EXTENSIONS_SET.has(fileExt)) {
        return await doRequest(request);
    }
    else {
        return await checkReferrerAndDoRequest(request);
    }
}
async function doRequest(request) {
    let newUrl = new URL(request.url);
    newUrl.protocol = UPSTREAM_PROTOCOL;
    newUrl.host = UPSTREAM_HOST;
    let newReq = new Request(newUrl.toString(), request);
    return fetch(newReq);
}
async function checkReferrerAndDoRequest(request) {
    let response;
    const referrerHeader = request.headers.get("referer");
    if (referrerHeader != null) {
        let domain = extractDomainFromReferrer(referrerHeader);
        if (domain == null || DOMAINS_SET.has(domain)) {
            response = await doRequest(request);
        }
        else {
            response = UNAUTHORIZED_RESPONSE;
        }
    }
    else {
        response = await doRequest(request);
    }
    return response;
}
function extractDomainFromReferrer(referrer) {
    try {
        return new URL(referrer).hostname;
    }
    catch (e) {
        return null;
    }
}
function extractUrlFileExtension(url) {
    try {
        let pathname = new URL(url).pathname;
        let lastDotIdx = pathname.lastIndexOf(".");
        if (lastDotIdx == -1) {
            return null;
        }
        else {
            return pathname.substring(1 + lastDotIdx);
        }
    }
    catch (e) {
        return null;
    }
}
const DOMAINS_SET = (() => {
    const set = new Set();
    DOMAINS.forEach((i) => set.add(i));
    return set;
})();
const EXTENSIONS_SET = (() => {
    const set = new Set();
    EXTENSIONS.forEach((i) => set.add(i));
    return set;
})();
const UNAUTHORIZED_RESPONSE = new Response(null, {
    status: 401,
});
const UPSTREAM_PROTOCOL = new URL(UPSTREAM_URL).protocol;
const UPSTREAM_HOST = new URL(UPSTREAM_URL).host;

addEventListener("fetch", (event) => {
    event.respondWith(handleRequest(event.request));
});
                                        
Basic Auth

الگوی Basic Auth به شما امکان می‌دهد تا بتوانید به‌سادگی دسترسی به بخش‌های محافظت‌شده‌ی وب‌سایت خود را با وارد کردن نام کاربری و رمز عبور کنترل کنید. این اسکریپت سریع و آسان پیاده‌سازی می‌شود و نیازهای امنیتی سرویس‌تان را تامین می‌کند.

مشاهده
کپی شد
                                            
'use strict';

// Credentials for users
const UserPassList = [{ user: "admin", pass: "adminpass" }];
// Upstream url
const UPSTREAM_URL = "http://localhost:4000";

async function handleRequest(request) {
    const authHeader = request.headers.get("Authorization");
    let response;
    if (authHeader != null && authHeader.startsWith("Basic")) {
        let encodedCredential = authHeader.substring(6);
        if (CREDENTIALS.has(encodedCredential)) {
            let newUrl = new URL(request.url);
            newUrl.protocol = UPSTREAM_PROTOCOL;
            newUrl.host = UPSTREAM_HOST;
            let newReq = new Request(newUrl.toString(), request);
            newReq.headers.delete("Authorization");
            response = await fetch(newReq);
        }
        else {
            response = UNAUTHORIZED_INVALID_CREDENTIALS_RESPONSE;
        }
    }
    else {
        response = UNAUTHORIZED_NEEDS_LOGIN_RESPONSE;
    }
    return response;
}
const UNAUTHORIZED_NEEDS_LOGIN_RESPONSE = new Response(null, {
    //TODO: Add realm and/or charset if needed
    headers: new Headers({
        "WWW-Authenticate": "Basic",
    }),
    status: 401,
});
const UNAUTHORIZED_INVALID_CREDENTIALS_RESPONSE = new Response(null, {
    status: 401,
});
// Key: Base64 encoded username:password
// Value: username
const CREDENTIALS = (() => {
    const map = new Map();
    for (let i of UserPassList) {
        // TODO: this may not properly work with utf8
        const encoded = btoa(`${i.user}:${i.pass}`);
        map.set(encoded, i.user);
    }
    return map;
})();
const UPSTREAM_PROTOCOL = new URL(UPSTREAM_URL).protocol;
const UPSTREAM_HOST = new URL(UPSTREAM_URL).host;

addEventListener("fetch", (event) => {
    event.respondWith(handleRequest(event.request));
});
                                        
SSR HTMX

با استفاده از الگوی Server-Side Rendering در HTMX، می‌توانید صفحه‌های وب را به‌شکل پویا از سمت سرور رندر کرده و بخش‌های مختلف آن را بدون بارگذاری کامل به‌روزرسانی کنید. این روش به بهبود سرعت بارگذاری و تجربه کاربری کمک می‌کند.

مشاهده
کپی شد
                                            
'use strict';

const TODO_LIST = ["test"];
function createDb() {
    return {
        add: async (title) => {
            TODO_LIST.push(title);
        },
        list: async () => TODO_LIST,
    };
}
const DefaultDB = createDb();

var Index = "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <title>Todo list</title>\n  <script src=\"https://unpkg.com/htmx.org@1.9.5\"></script>\n  <link rel=\"stylesheet\" href=\"/styles.css\">\n</head>\n\n<body>\n  <div>\n    <div>\n      <h1>To-Do List</h1>\n    </div>\n    <form hx-post=\"/add\" hx-target=\"#list\" hx-swap=\"beforeend\">\n      <div>\n        <input type=\"text\" placeholder=\"Task title\" name=\"title\" required />\n        <button type=\"submit\">Add</button>\n      </div>\n    </form>\n    <div id=\"list\" hx-get=\"/list\" hx-trigger=\"load\"></div>\n  </div>\n</body>\n\n</html>";

var Styles = "h1 {\n  color: red;\n}\n";

async function handleRequest(request) {
    // simple router:
    let content = "";
    const url = new URL(request.url);
    switch (url.pathname) {
        case "/":
            content = Index;
            break;
        case "/styles.css":
            return new Response(Styles, {
                headers: { "Content-Type": "text/css" },
            });
        case "/add":
            const data = await request.formData();
            const title = data.get("title").toString();
            await DefaultDB.add(title);
            content = `<li>${title}</li>`;
            break;
        case "/list":
            content = (await DefaultDB.list()).map((x) => `<li>${x}</li>`).join("");
            break;
        default:
            content = "Not found :(";
    }
    if (request.url)
        return new Response(content, {
            headers: { "Content-Type": "text/html; charset=utf-8" },
        });
}

addEventListener("fetch", (event) => {
    event.respondWith(handleRequest(event.request));
});
                                        
قیمت‌گذاری

زیرساختی مقرون‌به‌صرفه برای کسب‌وکارهای آنلاین

پرداخت به‌ازای مصرف

ترافیک ورودی رایگان
۱۰۰ پردازش لبه (اپلیکیشن)
۱۰۰ هزار درخواست رایگان در هر ماه
شروع رایگان

سازمانی

ترافیک ورودی رایگان
۵۰۰ پردازش لبه (اپلیکیشن)
تعداد درخواست نامحدود
ثبت درخواست
هزینه‌ی نهایی پردازش لبه آروان‌کلاد بر اساس میزان مصرف شما از ویژگی‌های مختلف آن محاسبه می‌شود، جزییات بیش‌تر را در صفحه‌ی قیمت‌گذاری ببینید.
قیمت‌گذاری Edge Computing

سرعت و امنیت بیش‌تر با پردازش لبه آروان‌کلاد

بدون نیاز به زیرساخت‌های ابری مختلف سرویس‌های خود را توسعه دهید.