Arvancloud Uç Bilişim: Hız ve Güvenliğin Benzersiz Deneyimi
Arvancloud'un Edge Computing teknolojisi sayesinde, sunucuya ihtiyaç duymadan, çevrimiçi servislerinize ait komut dosyalarını ve işlem kodlarını kullanıcıya en yakın noktada çalıştırabilir ve hız ile güvenlikte yeni bir deneyim sunabilirsiniz.
Tüm edge işlemine dahil edilen alan adlarına otomatik olarak ücretsiz SSL sertifikası atanır.
Arvancloud'un kullanıcı paneli veya CLI (Komut Satırı Arayüzü) sayesinde işletmenizin çevrimiçi servisini 30 saniyeden kısa bir sürede kurabilir ve devreye alabilirsiniz.
Tüm işletme kodlarınız Arvancloud’un CDN pop sitelerinde yer alır ve kullanıcıya en yakın noktadan çalıştırılır.
Arvancloud'un gelişmiş CDN güvenlik özellikleri sayesinde servislerinizi güvenli ve güvenilir bir ortamda geliştirebilirsiniz.
Gelişmiş Özelliklerle Çevrimiçi Servisleri Geliştirmek
Sunucusuz Çalışma
Bulut sunucusuna veya sanal bir sunucuya ihtiyaç duymadan işletmenizin çevrimiçi hizmetlerini geliştirebilir ve içerikleri kullanıcıya en yakın noktada çalıştırabilirsiniz.
Yüksek Ölçeklenebilirlik
Sunucu yük dengelemeye gerek kalmadan sınırsız içerik dağıtım ağı kaynaklarını kullanabilir ve trafiği farklı pop sitelerine yönlendirebilirsiniz.
Tek Tıkla Kurulum
Arvancloud'un hazır kodları ve şablonları ile istediğiniz servisi tek bir tıkla geliştirebilir ve ihtiyaçlarınıza göre kişiselleştirebilirsiniz.
Ekonomik
Edge Computing ile yazılım kurulumunuzu ve uygulamanızı düşük maliyetle kullanıcılarınıza sunabilirsiniz.
Sorun Giderme
Console Log sayesinde web sitenizi veya uygulamanızı yayına almadan önce hızlı bir şekilde düzenleyebilir (Debug) ve nihai sürümleri yayınlamadan kontrol edebilirsiniz.
Hızlı Yanıt Süreleri
Arvancloud'un Edge Computing teknolojisi ile kullanıcı taleplerine en yakın noktadan yanıt vererek hizmet sunum hızınızı büyük ölçüde artırabilirsiniz.
40+ Pop Site
99.99% Uptime
Saatde 500 Milyon
Tek Tıkla Kolayca Kullanılabilir Uygulama Servisleri
Round Robin Load Balancer
Hotlink Koruması
Basic Auth
SSR HTMX
Gelen taleplerinizi birden fazla sunucu arasında döngüsel olarak dağıtır. Trafik yükünü eşit şekilde paylaştırarak sistem performansını artırır ve zorlu trafik koşullarını sorunsuz bir şekilde yönetmenizi sağlar.
Daha Fazlası
'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));
});
Web sitenizdeki dosyaların (resim, video vb.) diğer web sitelerinde izinsiz kullanılmasını önler. Bu, bant genişliği ve maliyetlerinizi azaltırken servis güvenliğini artırır ve içeriklerinizi korur.
Daha Fazlası
'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));
});
Web sitenizin korunan bölümlerine kullanıcı adı ve şifre ile erişim sağlayabilirsiniz. Bu hızlı ve kolay uygulanabilir script, güvenlik ihtiyaçlarınızı karşılar.
Daha Fazlası
'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));
});
Web sayfalarını sunucu tarafında dinamik olarak render eder ve belirli bölümleri tam sayfa yükleme olmadan günceller. Bu yöntem, yükleme hızını ve kullanıcı deneyimini iyileştirir.
Daha Fazlası
'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));
});