رفتن به محتوا
cloudhostمستندات
راهنما

فضای ذخیره‌سازی

باکت برای هر کلاینت ذخیره‌سازی. با هر کلاینت یا SDK ذخیره‌سازی کار کنید، یا در فانکشن با env.BUCKET فایل بخوانید و بنویسید.

ایجاد باکت و کلید#

ایجاد
cloudhost buckets create uploads
# created bucket uploads at https://storage.trustpage.ir
# your storage key (secret shown once):
#   access key  …
#   secret key  …
cloudhost buckets list

نام باکت ۳ تا ۶۳ کاراکتر است: حروف کوچک لاتین، رقم و خط تیره. هر تیم یک کلید ذخیره برای همهٔ باکت‌هایش دارد؛ اولین باکت آن را ایجاد می‌کند و رمزش فقط همان بار نشان داده می‌شود. ناحیه همیشه us-east-1 است.

کلید جدید
cloudhost storage credentials
# endpoint    https://storage.trustpage.ir
# region      us-east-1
# access key  …
# secret key  …   (shown once; the previous secret no longer works)

cloudhost storage credentials رمز کلید را عوض می‌کند: رمز قبلی همان لحظه از کار می‌افتد و فانکشن‌هایی که به باکت وصل‌اند خودکار رمز جدید را می‌گیرند. اگر کلید تیم پیش از امکان اتصال باکت به فانکشن ایجاد شده باشد، پیش از اولین اتصال یک بار آن را بچرخانید.

کلاینت‌های ذخیره‌سازی#

[uploads]
type = s3
provider = Other
endpoint = https://storage.trustpage.ir
region = us-east-1
access_key_id = …
secret_access_key = …

هر ابزار ذخیره‌سازی با آدرس https://storage.trustpage.ir، ناحیهٔ us-east-1 و کلید تیم کار می‌کند: rclone، SDK ذخیره‌سازی در هر زبان، و ابزارهای پشتیبان‌گیری. در SDK همین سه را بدهید: endpoint، ناحیه و کلید.

# a link anyone can use to download for one hour
rclone link uploads:uploads/report.pdf --expire 1h

آدرس امضاشده: با کلید تیم، برای یک آبجکت آدرسی ایجاد کنید که تا زمان انقضایش (حداکثر ۷ روز) بدون کلید کار می‌کند؛ برای دانلود (GET) یا آپلود (PUT) از مرورگر کاربرانتان. آدرس تغییرداده‌شده یا منقضی‌شده رد می‌شود. فایل‌های بزرگ: آپلود چندبخشی پشتیبانی می‌شود (تا ۱۰٬۰۰۰ بخش، هر بخش تا ۵ گیگابایت). سقف فضا: وقتی فضای طرح پر شود، نوشتن جدید با خطای QuotaExceeded رد می‌شود و خواندن و حذف کار می‌کند. هر درخواست در صفحهٔ مصرف شمرده می‌شود.

env.BUCKET در فانکشن‌ها#

type Obj = { text(): Promise<string>; size: number; contentType: string | null };
type Env = {
  BUCKET: {
    put(key: string, body: string | ArrayBuffer | ReadableStream, opts?: { contentType?: string }): Promise<{ size: number }>;
    get(key: string): Promise<Obj | null>;
    head(key: string): Promise<{ size: number; contentType: string | null } | null>;
    list(opts?: { prefix?: string; limit?: number }): Promise<{ objects: { key: string; size: number }[] }>;
    delete(key: string): Promise<void>;
  };
};

export default {
  async fetch(request: Request, env: Env): Promise<Response> {
    const key = new URL(request.url).searchParams.get("key") ?? "notes/hello.txt";
    if (request.method === "PUT") return Response.json(await env.BUCKET.put(key, await request.text(), { contentType: "text/plain" }));
    if (request.method === "DELETE") { await env.BUCKET.delete(key); return Response.json({ deleted: key }); }
    const obj = await env.BUCKET.get(key);
    return obj ? new Response(await obj.text()) : new Response("no such note\n", { status: 404 });
  },
};

فانکشن باکت را بدون کلید با env.BUCKET می‌خواند: get، head، put، list و delete.

حذف#

cloudhost buckets delete uploads فقط باکت خالی را حذف می‌کند، و نه وقتی نسخهٔ زنده‌ای به آن متصل است.