فضای ذخیرهسازی
باکت برای هر کلاینت ذخیرهسازی. با هر کلاینت یا 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 فقط باکت خالی را حذف میکند، و نه وقتی نسخهٔ زندهای به آن متصل است.