پردازش لبه آروانکلاد؛ تجربهای بینظیر از سرعت و امنیت
گواهینامه 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، درخواستهای ورودی شما بهشکل متناوب بین چندین سرور توزیع میشود. این روش با توزیع یکنواخت بار ترافیک و بهبود عملکرد سیستم به شما کمک میکند تا با دسترسیپذیری و پایداری بسیار بالا شرایط ترافیکی سخت را پشت سر بگذارید.
مشاهده
'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 میتوانید از فایلهای وبسایت خود (تصاویر و ویدیوها و …) در برابر استفادهی نادرست در وبسایتهای دیگر محافظت کنید. این کار نهتنها باعث کاهش مصرف پهنای باند و هزینهها میشود، بلکه امنیت سرویستان را افزایش داده و از محتوای شما محافظت میکند.
مشاهده
'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 به شما امکان میدهد تا بتوانید بهسادگی دسترسی به بخشهای محافظتشدهی وبسایت خود را با وارد کردن نام کاربری و رمز عبور کنترل کنید. این اسکریپت سریع و آسان پیادهسازی میشود و نیازهای امنیتی سرویستان را تامین میکند.
مشاهده
'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));
});
با استفاده از الگوی 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));
});