[{"data":1,"prerenderedAt":1387},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fs3-storage":3},{"doc":4,"prev":1347,"next":1354,"resolvedType":8,"readingMinutes":196,"audience":1361,"checklist":1365,"related":1369},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成","article",null,"infra-deployment","服务器与部署","2026-02-28","i-carbon-cloud",{"type":15,"value":16,"toc":1327},"minimark",[17,21,25,28,32,72,75,79,145,148,153,282,286,605,609,716,723,727,743,1032,1036,1039,1050,1149,1152,1155,1173,1176,1179,1196,1199,1213,1216,1220,1223,1236,1240,1243,1257,1260,1267,1270,1290,1293,1323],[18,19,6],"h1",{"id":20},"s3-对象存储",[22,23,24],"p",{},"S3（Simple Storage Service）是对象存储的事实标准，众多服务兼容其 API。",[22,26,27],{},"这页适合作为“对象存储选型与接入指南”。如果你是第一次用 S3 兼容存储，最重要的不是先写 SDK，而是先理解 Bucket、Object、Endpoint、Access Key 这些概念分别对应什么。",[29,30,31],"h2",{"id":31},"先按场景选",[33,34,35,47,56,64],"ul",{},[36,37,38,42,43],"li",{},[39,40,41],"strong",{},"边缘站点和静态资源分发","：优先 ",[44,45,46],"code",{},"Cloudflare R2",[36,48,49,52,53],{},[39,50,51],{},"低成本归档与备份","：可看 ",[44,54,55],{},"Backblaze B2",[36,57,58,42,61],{},[39,59,60],{},"完全自控和局域网部署",[44,62,63],{},"MinIO",[36,65,66,52,69],{},[39,67,68],{},"预算敏感、欧洲节点",[44,70,71],{},"Hetzner Object Storage",[22,73,74],{},"如果你本来就已经跑在 Cloudflare 生态里，R2 的接入体验通常会更顺。",[29,76,78],{"id":77},"常见-s3-兼容服务","常见 S3 兼容服务",[80,81,82,95],"table",{},[83,84,85],"thead",{},[86,87,88,92],"tr",{},[89,90,91],"th",{},"服务",[89,93,94],{},"特点",[96,97,98,112,123,134],"tbody",{},[86,99,100,109],{},[101,102,103],"td",{},[104,105,46],"a",{"href":106,"rel":107},"https:\u002F\u002Fwww.cloudflare.com\u002Fr2\u002F",[108],"nofollow",[101,110,111],{},"零出口费用",[86,113,114,120],{},[101,115,116],{},[104,117,55],{"href":118,"rel":119},"https:\u002F\u002Fwww.backblaze.com\u002Fb2\u002F",[108],[101,121,122],{},"便宜，兼容 S3",[86,124,125,131],{},[101,126,127],{},[104,128,63],{"href":129,"rel":130},"https:\u002F\u002Fmin.io\u002F",[108],[101,132,133],{},"自建，开源",[86,135,136,142],{},[101,137,138],{},[104,139,71],{"href":140,"rel":141},"https:\u002F\u002Fwww.hetzner.com\u002F",[108],[101,143,144],{},"欧洲节点，便宜",[29,146,46],{"id":147},"cloudflare-r2",[149,150,152],"h3",{"id":151},"wrangler-管理","Wrangler 管理",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-bash shiki shiki-themes github-light github-dark","# 创建 Bucket\nnpx wrangler r2 bucket create my-bucket\n\n# 列出 Bucket\nnpx wrangler r2 bucket list\n\n# 上传文件\nnpx wrangler r2 object put my-bucket\u002Ffile.txt --file=.\u002Ffile.txt\n\n# 下载\nnpx wrangler r2 object get my-bucket\u002Ffile.txt\n","bash","",[44,161,162,171,194,201,207,221,226,232,254,259,265],{"__ignoreMap":159},[163,164,167],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sJ8bj","# 创建 Bucket\n",[163,172,174,178,182,185,188,191],{"class":165,"line":173},2,[163,175,177],{"class":176},"sScJk","npx",[163,179,181],{"class":180},"sZZnC"," wrangler",[163,183,184],{"class":180}," r2",[163,186,187],{"class":180}," bucket",[163,189,190],{"class":180}," create",[163,192,193],{"class":180}," my-bucket\n",[163,195,197],{"class":165,"line":196},3,[163,198,200],{"emptyLinePlaceholder":199},true,"\n",[163,202,204],{"class":165,"line":203},4,[163,205,206],{"class":169},"# 列出 Bucket\n",[163,208,210,212,214,216,218],{"class":165,"line":209},5,[163,211,177],{"class":176},[163,213,181],{"class":180},[163,215,184],{"class":180},[163,217,187],{"class":180},[163,219,220],{"class":180}," list\n",[163,222,224],{"class":165,"line":223},6,[163,225,200],{"emptyLinePlaceholder":199},[163,227,229],{"class":165,"line":228},7,[163,230,231],{"class":169},"# 上传文件\n",[163,233,235,237,239,241,244,247,250],{"class":165,"line":234},8,[163,236,177],{"class":176},[163,238,181],{"class":180},[163,240,184],{"class":180},[163,242,243],{"class":180}," object",[163,245,246],{"class":180}," put",[163,248,249],{"class":180}," my-bucket\u002Ffile.txt",[163,251,253],{"class":252},"sj4cs"," --file=.\u002Ffile.txt\n",[163,255,257],{"class":165,"line":256},9,[163,258,200],{"emptyLinePlaceholder":199},[163,260,262],{"class":165,"line":261},10,[163,263,264],{"class":169},"# 下载\n",[163,266,268,270,272,274,276,279],{"class":165,"line":267},11,[163,269,177],{"class":176},[163,271,181],{"class":180},[163,273,184],{"class":180},[163,275,243],{"class":180},[163,277,278],{"class":180}," get",[163,280,281],{"class":180}," my-bucket\u002Ffile.txt\n",[149,283,285],{"id":284},"workers-中使用","Workers 中使用",[154,287,291],{"className":288,"code":289,"language":290,"meta":159,"style":159},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F wrangler.jsonc 绑定\n\u002F\u002F { \"r2_buckets\": [{ \"binding\": \"BUCKET\", \"bucket_name\": \"my-bucket\" }] }\n\nexport default {\n  async fetch(request: Request, env: { BUCKET: R2Bucket }) {\n    const url = new URL(request.url);\n    const key = url.pathname.slice(1);\n\n    if (request.method === \"GET\") {\n      const object = await env.BUCKET.get(key);\n      if (!object) return new Response(\"Not Found\", { status: 404 });\n      return new Response(object.body, {\n        headers: { \"Content-Type\": object.httpMetadata?.contentType || \"\" },\n      });\n    }\n\n    if (request.method === \"PUT\") {\n      await env.BUCKET.put(key, request.body);\n      return new Response(\"OK\");\n    }\n  },\n};\n","typescript",[44,292,293,298,303,307,320,363,383,406,410,427,453,489,502,523,529,535,540,554,572,588,593,599],{"__ignoreMap":159},[163,294,295],{"class":165,"line":166},[163,296,297],{"class":169},"\u002F\u002F wrangler.jsonc 绑定\n",[163,299,300],{"class":165,"line":173},[163,301,302],{"class":169},"\u002F\u002F { \"r2_buckets\": [{ \"binding\": \"BUCKET\", \"bucket_name\": \"my-bucket\" }] }\n",[163,304,305],{"class":165,"line":196},[163,306,200],{"emptyLinePlaceholder":199},[163,308,309,313,316],{"class":165,"line":203},[163,310,312],{"class":311},"szBVR","export",[163,314,315],{"class":311}," default",[163,317,319],{"class":318},"sVt8B"," {\n",[163,321,322,325,328,331,335,338,341,344,347,349,352,355,357,360],{"class":165,"line":209},[163,323,324],{"class":311},"  async",[163,326,327],{"class":176}," fetch",[163,329,330],{"class":318},"(",[163,332,334],{"class":333},"s4XuR","request",[163,336,337],{"class":311},":",[163,339,340],{"class":176}," Request",[163,342,343],{"class":318},", ",[163,345,346],{"class":333},"env",[163,348,337],{"class":311},[163,350,351],{"class":318}," { ",[163,353,354],{"class":333},"BUCKET",[163,356,337],{"class":311},[163,358,359],{"class":176}," R2Bucket",[163,361,362],{"class":318}," }) {\n",[163,364,365,368,371,374,377,380],{"class":165,"line":223},[163,366,367],{"class":311},"    const",[163,369,370],{"class":252}," url",[163,372,373],{"class":311}," =",[163,375,376],{"class":311}," new",[163,378,379],{"class":176}," URL",[163,381,382],{"class":318},"(request.url);\n",[163,384,385,387,390,392,395,398,400,403],{"class":165,"line":228},[163,386,367],{"class":311},[163,388,389],{"class":252}," key",[163,391,373],{"class":311},[163,393,394],{"class":318}," url.pathname.",[163,396,397],{"class":176},"slice",[163,399,330],{"class":318},[163,401,402],{"class":252},"1",[163,404,405],{"class":318},");\n",[163,407,408],{"class":165,"line":234},[163,409,200],{"emptyLinePlaceholder":199},[163,411,412,415,418,421,424],{"class":165,"line":256},[163,413,414],{"class":311},"    if",[163,416,417],{"class":318}," (request.method ",[163,419,420],{"class":311},"===",[163,422,423],{"class":180}," \"GET\"",[163,425,426],{"class":318},") {\n",[163,428,429,432,434,436,439,442,444,447,450],{"class":165,"line":261},[163,430,431],{"class":311},"      const",[163,433,243],{"class":252},[163,435,373],{"class":311},[163,437,438],{"class":311}," await",[163,440,441],{"class":318}," env.",[163,443,354],{"class":252},[163,445,446],{"class":318},".",[163,448,449],{"class":176},"get",[163,451,452],{"class":318},"(key);\n",[163,454,455,458,461,464,467,470,472,475,477,480,483,486],{"class":165,"line":267},[163,456,457],{"class":311},"      if",[163,459,460],{"class":318}," (",[163,462,463],{"class":311},"!",[163,465,466],{"class":318},"object) ",[163,468,469],{"class":311},"return",[163,471,376],{"class":311},[163,473,474],{"class":176}," Response",[163,476,330],{"class":318},[163,478,479],{"class":180},"\"Not Found\"",[163,481,482],{"class":318},", { status: ",[163,484,485],{"class":252},"404",[163,487,488],{"class":318}," });\n",[163,490,492,495,497,499],{"class":165,"line":491},12,[163,493,494],{"class":311},"      return",[163,496,376],{"class":311},[163,498,474],{"class":176},[163,500,501],{"class":318},"(object.body, {\n",[163,503,505,508,511,514,517,520],{"class":165,"line":504},13,[163,506,507],{"class":318},"        headers: { ",[163,509,510],{"class":180},"\"Content-Type\"",[163,512,513],{"class":318},": object.httpMetadata?.contentType ",[163,515,516],{"class":311},"||",[163,518,519],{"class":180}," \"\"",[163,521,522],{"class":318}," },\n",[163,524,526],{"class":165,"line":525},14,[163,527,528],{"class":318},"      });\n",[163,530,532],{"class":165,"line":531},15,[163,533,534],{"class":318},"    }\n",[163,536,538],{"class":165,"line":537},16,[163,539,200],{"emptyLinePlaceholder":199},[163,541,543,545,547,549,552],{"class":165,"line":542},17,[163,544,414],{"class":311},[163,546,417],{"class":318},[163,548,420],{"class":311},[163,550,551],{"class":180}," \"PUT\"",[163,553,426],{"class":318},[163,555,557,560,562,564,566,569],{"class":165,"line":556},18,[163,558,559],{"class":311},"      await",[163,561,441],{"class":318},[163,563,354],{"class":252},[163,565,446],{"class":318},[163,567,568],{"class":176},"put",[163,570,571],{"class":318},"(key, request.body);\n",[163,573,575,577,579,581,583,586],{"class":165,"line":574},19,[163,576,494],{"class":311},[163,578,376],{"class":311},[163,580,474],{"class":176},[163,582,330],{"class":318},[163,584,585],{"class":180},"\"OK\"",[163,587,405],{"class":318},[163,589,591],{"class":165,"line":590},20,[163,592,534],{"class":318},[163,594,596],{"class":165,"line":595},21,[163,597,598],{"class":318},"  },\n",[163,600,602],{"class":165,"line":601},22,[163,603,604],{"class":318},"};\n",[29,606,608],{"id":607},"minio-自建","MinIO 自建",[154,610,614],{"className":611,"code":612,"language":613,"meta":159,"style":159},"language-yaml shiki shiki-themes github-light github-dark","services:\n  minio:\n    image: minio\u002Fminio:latest\n    ports:\n      - \"9000:9000\"\n      - \"9001:9001\"\n    environment:\n      MINIO_ROOT_USER: admin\n      MINIO_ROOT_PASSWORD: changeme123\n    volumes:\n      - .\u002Fminio-data:\u002Fdata\n    command: server \u002Fdata --console-address \":9001\"\n","yaml",[44,615,616,625,632,643,650,658,665,672,682,692,699,706],{"__ignoreMap":159},[163,617,618,622],{"class":165,"line":166},[163,619,621],{"class":620},"s9eBZ","services",[163,623,624],{"class":318},":\n",[163,626,627,630],{"class":165,"line":173},[163,628,629],{"class":620},"  minio",[163,631,624],{"class":318},[163,633,634,637,640],{"class":165,"line":196},[163,635,636],{"class":620},"    image",[163,638,639],{"class":318},": ",[163,641,642],{"class":180},"minio\u002Fminio:latest\n",[163,644,645,648],{"class":165,"line":203},[163,646,647],{"class":620},"    ports",[163,649,624],{"class":318},[163,651,652,655],{"class":165,"line":209},[163,653,654],{"class":318},"      - ",[163,656,657],{"class":180},"\"9000:9000\"\n",[163,659,660,662],{"class":165,"line":223},[163,661,654],{"class":318},[163,663,664],{"class":180},"\"9001:9001\"\n",[163,666,667,670],{"class":165,"line":228},[163,668,669],{"class":620},"    environment",[163,671,624],{"class":318},[163,673,674,677,679],{"class":165,"line":234},[163,675,676],{"class":620},"      MINIO_ROOT_USER",[163,678,639],{"class":318},[163,680,681],{"class":180},"admin\n",[163,683,684,687,689],{"class":165,"line":256},[163,685,686],{"class":620},"      MINIO_ROOT_PASSWORD",[163,688,639],{"class":318},[163,690,691],{"class":180},"changeme123\n",[163,693,694,697],{"class":165,"line":261},[163,695,696],{"class":620},"    volumes",[163,698,624],{"class":318},[163,700,701,703],{"class":165,"line":267},[163,702,654],{"class":318},[163,704,705],{"class":180},".\u002Fminio-data:\u002Fdata\n",[163,707,708,711,713],{"class":165,"line":491},[163,709,710],{"class":620},"    command",[163,712,639],{"class":318},[163,714,715],{"class":180},"server \u002Fdata --console-address \":9001\"\n",[22,717,718,719,722],{},"访问 ",[44,720,721],{},"http:\u002F\u002Flocalhost:9001"," 进入管理界面。",[29,724,726],{"id":725},"nodejs-sdk","Node.js SDK",[154,728,730],{"className":156,"code":729,"language":158,"meta":159,"style":159},"pnpm add @aws-sdk\u002Fclient-s3\n",[44,731,732],{"__ignoreMap":159},[163,733,734,737,740],{"class":165,"line":166},[163,735,736],{"class":176},"pnpm",[163,738,739],{"class":180}," add",[163,741,742],{"class":180}," @aws-sdk\u002Fclient-s3\n",[154,744,746],{"className":288,"code":745,"language":290,"meta":159,"style":159},"import {\n  S3Client,\n  PutObjectCommand,\n  GetObjectCommand,\n} from \"@aws-sdk\u002Fclient-s3\";\n\nconst s3 = new S3Client({\n  region: \"auto\",\n  endpoint: \"https:\u002F\u002Fyour-account.r2.cloudflarestorage.com\",\n  credentials: {\n    accessKeyId: process.env.S3_ACCESS_KEY!,\n    secretAccessKey: process.env.S3_SECRET_KEY!,\n  },\n});\n\n\u002F\u002F 上传\nawait s3.send(\n  new PutObjectCommand({\n    Bucket: \"my-bucket\",\n    Key: \"images\u002Fphoto.jpg\",\n    Body: fileBuffer,\n    ContentType: \"image\u002Fjpeg\",\n  }),\n);\n\n\u002F\u002F 下载\nconst response = await s3.send(\n  new GetObjectCommand({\n    Bucket: \"my-bucket\",\n    Key: \"images\u002Fphoto.jpg\",\n  }),\n);\nconst data = await response.Body?.transformToByteArray();\n",[44,747,748,755,760,765,770,784,788,806,817,827,832,844,856,860,865,869,874,888,898,908,918,923,933,939,944,949,955,973,983,992,1001,1006,1011],{"__ignoreMap":159},[163,749,750,753],{"class":165,"line":166},[163,751,752],{"class":311},"import",[163,754,319],{"class":318},[163,756,757],{"class":165,"line":173},[163,758,759],{"class":318},"  S3Client,\n",[163,761,762],{"class":165,"line":196},[163,763,764],{"class":318},"  PutObjectCommand,\n",[163,766,767],{"class":165,"line":203},[163,768,769],{"class":318},"  GetObjectCommand,\n",[163,771,772,775,778,781],{"class":165,"line":209},[163,773,774],{"class":318},"} ",[163,776,777],{"class":311},"from",[163,779,780],{"class":180}," \"@aws-sdk\u002Fclient-s3\"",[163,782,783],{"class":318},";\n",[163,785,786],{"class":165,"line":223},[163,787,200],{"emptyLinePlaceholder":199},[163,789,790,793,796,798,800,803],{"class":165,"line":228},[163,791,792],{"class":311},"const",[163,794,795],{"class":252}," s3",[163,797,373],{"class":311},[163,799,376],{"class":311},[163,801,802],{"class":176}," S3Client",[163,804,805],{"class":318},"({\n",[163,807,808,811,814],{"class":165,"line":234},[163,809,810],{"class":318},"  region: ",[163,812,813],{"class":180},"\"auto\"",[163,815,816],{"class":318},",\n",[163,818,819,822,825],{"class":165,"line":256},[163,820,821],{"class":318},"  endpoint: ",[163,823,824],{"class":180},"\"https:\u002F\u002Fyour-account.r2.cloudflarestorage.com\"",[163,826,816],{"class":318},[163,828,829],{"class":165,"line":261},[163,830,831],{"class":318},"  credentials: {\n",[163,833,834,837,840,842],{"class":165,"line":267},[163,835,836],{"class":318},"    accessKeyId: process.env.",[163,838,839],{"class":252},"S3_ACCESS_KEY",[163,841,463],{"class":311},[163,843,816],{"class":318},[163,845,846,849,852,854],{"class":165,"line":491},[163,847,848],{"class":318},"    secretAccessKey: process.env.",[163,850,851],{"class":252},"S3_SECRET_KEY",[163,853,463],{"class":311},[163,855,816],{"class":318},[163,857,858],{"class":165,"line":504},[163,859,598],{"class":318},[163,861,862],{"class":165,"line":525},[163,863,864],{"class":318},"});\n",[163,866,867],{"class":165,"line":531},[163,868,200],{"emptyLinePlaceholder":199},[163,870,871],{"class":165,"line":537},[163,872,873],{"class":169},"\u002F\u002F 上传\n",[163,875,876,879,882,885],{"class":165,"line":542},[163,877,878],{"class":311},"await",[163,880,881],{"class":318}," s3.",[163,883,884],{"class":176},"send",[163,886,887],{"class":318},"(\n",[163,889,890,893,896],{"class":165,"line":556},[163,891,892],{"class":311},"  new",[163,894,895],{"class":176}," PutObjectCommand",[163,897,805],{"class":318},[163,899,900,903,906],{"class":165,"line":574},[163,901,902],{"class":318},"    Bucket: ",[163,904,905],{"class":180},"\"my-bucket\"",[163,907,816],{"class":318},[163,909,910,913,916],{"class":165,"line":590},[163,911,912],{"class":318},"    Key: ",[163,914,915],{"class":180},"\"images\u002Fphoto.jpg\"",[163,917,816],{"class":318},[163,919,920],{"class":165,"line":595},[163,921,922],{"class":318},"    Body: fileBuffer,\n",[163,924,925,928,931],{"class":165,"line":601},[163,926,927],{"class":318},"    ContentType: ",[163,929,930],{"class":180},"\"image\u002Fjpeg\"",[163,932,816],{"class":318},[163,934,936],{"class":165,"line":935},23,[163,937,938],{"class":318},"  }),\n",[163,940,942],{"class":165,"line":941},24,[163,943,405],{"class":318},[163,945,947],{"class":165,"line":946},25,[163,948,200],{"emptyLinePlaceholder":199},[163,950,952],{"class":165,"line":951},26,[163,953,954],{"class":169},"\u002F\u002F 下载\n",[163,956,958,960,963,965,967,969,971],{"class":165,"line":957},27,[163,959,792],{"class":311},[163,961,962],{"class":252}," response",[163,964,373],{"class":311},[163,966,438],{"class":311},[163,968,881],{"class":318},[163,970,884],{"class":176},[163,972,887],{"class":318},[163,974,976,978,981],{"class":165,"line":975},28,[163,977,892],{"class":311},[163,979,980],{"class":176}," GetObjectCommand",[163,982,805],{"class":318},[163,984,986,988,990],{"class":165,"line":985},29,[163,987,902],{"class":318},[163,989,905],{"class":180},[163,991,816],{"class":318},[163,993,995,997,999],{"class":165,"line":994},30,[163,996,912],{"class":318},[163,998,915],{"class":180},[163,1000,816],{"class":318},[163,1002,1004],{"class":165,"line":1003},31,[163,1005,938],{"class":318},[163,1007,1009],{"class":165,"line":1008},32,[163,1010,405],{"class":318},[163,1012,1014,1016,1019,1021,1023,1026,1029],{"class":165,"line":1013},33,[163,1015,792],{"class":311},[163,1017,1018],{"class":252}," data",[163,1020,373],{"class":311},[163,1022,438],{"class":311},[163,1024,1025],{"class":318}," response.Body?.",[163,1027,1028],{"class":176},"transformToByteArray",[163,1030,1031],{"class":318},"();\n",[29,1033,1035],{"id":1034},"rclone-同步","rclone 同步",[22,1037,1038],{},"跨存储同步工具。",[154,1040,1044],{"className":1041,"code":1042,"language":1043,"meta":159,"style":159},"language-powershell shiki shiki-themes github-light github-dark","scoop install rclone\n","powershell",[44,1045,1046],{"__ignoreMap":159},[163,1047,1048],{"class":165,"line":166},[163,1049,1042],{"class":318},[154,1051,1053],{"className":156,"code":1052,"language":158,"meta":159,"style":159},"# 配置\nrclone config\n\n# 同步\nrclone sync .\u002Flocal-dir remote:bucket-name\nrclone copy .\u002Ffile.txt remote:bucket-name\u002Fpath\u002F\n\n# 列出文件\nrclone ls remote:bucket-name\n\n# 挂载为本地磁盘\nrclone mount remote:bucket-name X: --vfs-cache-mode full\n",[44,1054,1055,1060,1068,1072,1077,1090,1103,1107,1112,1121,1125,1130],{"__ignoreMap":159},[163,1056,1057],{"class":165,"line":166},[163,1058,1059],{"class":169},"# 配置\n",[163,1061,1062,1065],{"class":165,"line":173},[163,1063,1064],{"class":176},"rclone",[163,1066,1067],{"class":180}," config\n",[163,1069,1070],{"class":165,"line":196},[163,1071,200],{"emptyLinePlaceholder":199},[163,1073,1074],{"class":165,"line":203},[163,1075,1076],{"class":169},"# 同步\n",[163,1078,1079,1081,1084,1087],{"class":165,"line":209},[163,1080,1064],{"class":176},[163,1082,1083],{"class":180}," sync",[163,1085,1086],{"class":180}," .\u002Flocal-dir",[163,1088,1089],{"class":180}," remote:bucket-name\n",[163,1091,1092,1094,1097,1100],{"class":165,"line":223},[163,1093,1064],{"class":176},[163,1095,1096],{"class":180}," copy",[163,1098,1099],{"class":180}," .\u002Ffile.txt",[163,1101,1102],{"class":180}," remote:bucket-name\u002Fpath\u002F\n",[163,1104,1105],{"class":165,"line":228},[163,1106,200],{"emptyLinePlaceholder":199},[163,1108,1109],{"class":165,"line":234},[163,1110,1111],{"class":169},"# 列出文件\n",[163,1113,1114,1116,1119],{"class":165,"line":256},[163,1115,1064],{"class":176},[163,1117,1118],{"class":180}," ls",[163,1120,1089],{"class":180},[163,1122,1123],{"class":165,"line":261},[163,1124,200],{"emptyLinePlaceholder":199},[163,1126,1127],{"class":165,"line":267},[163,1128,1129],{"class":169},"# 挂载为本地磁盘\n",[163,1131,1132,1134,1137,1140,1143,1146],{"class":165,"line":491},[163,1133,1064],{"class":176},[163,1135,1136],{"class":180}," mount",[163,1138,1139],{"class":180}," remote:bucket-name",[163,1141,1142],{"class":180}," X:",[163,1144,1145],{"class":252}," --vfs-cache-mode",[163,1147,1148],{"class":180}," full\n",[29,1150,1151],{"id":1151},"推荐接入顺序",[22,1153,1154],{},"建议按下面顺序搭：",[1156,1157,1158,1161,1164,1167,1170],"ol",{},[36,1159,1160],{},"先创建 Bucket",[36,1162,1163],{},"配置最小权限 Access Key",[36,1165,1166],{},"用 CLI 或控制台先上传一个测试文件",[36,1168,1169],{},"再接入应用代码和 SDK",[36,1171,1172],{},"最后再补公开访问、签名 URL、生命周期和同步策略",[22,1174,1175],{},"不要一上来就把应用直接绑到生产 Bucket，先确认权限、路径和内容类型都正确。",[29,1177,1178],{"id":1178},"安全与管理建议",[33,1180,1181,1184,1187,1193],{},[36,1182,1183],{},"Access Key 不要写死进仓库",[36,1185,1186],{},"公开读和私有读写要分 Bucket 或分路径策略",[36,1188,1189,1190],{},"上传时记得带 ",[44,1191,1192],{},"Content-Type",[36,1194,1195],{},"对用户上传内容，最好单独隔离并限制访问方式",[22,1197,1198],{},"如果对象存储会承载用户上传文件，建议尽早考虑：",[33,1200,1201,1204,1207,1210],{},[36,1202,1203],{},"文件命名策略",[36,1205,1206],{},"覆盖冲突",[36,1208,1209],{},"生命周期清理",[36,1211,1212],{},"防止任意公开访问",[29,1214,1215],{"id":1215},"常见问题",[149,1217,1219],{"id":1218},"上传成功了但浏览器打开不对","上传成功了，但浏览器打开不对",[22,1221,1222],{},"高频原因通常包括：",[33,1224,1225,1230,1233],{},[36,1226,1227,1229],{},[44,1228,1192],{}," 没设置",[36,1231,1232],{},"对象权限或公开访问策略不对",[36,1234,1235],{},"CDN 缓存了旧内容",[149,1237,1239],{"id":1238},"本地-sdk-能连线上不能连","本地 SDK 能连，线上不能连",[22,1241,1242],{},"优先检查：",[33,1244,1245,1248,1251,1254],{},[36,1246,1247],{},"Endpoint 是否正确",[36,1249,1250],{},"环境变量是否加载成功",[36,1252,1253],{},"Access Key \u002F Secret Key 是否有权限",[36,1255,1256],{},"部署环境是否能访问对象存储地址",[149,1258,1259],{"id":1259},"想把它当网盘一样挂载",[22,1261,1262,1263,1266],{},"这时 ",[44,1264,1265],{},"rclone mount"," 很有用，但它更适合轻量访问和同步，不一定适合所有高频随机读写场景。",[29,1268,1269],{"id":1269},"延伸阅读",[33,1271,1272,1278,1284],{},[36,1273,1274],{},[104,1275,1277],{"href":1276},"\u002Fdocs\u002Fenv-variables","环境变量与配置管理",[36,1279,1280],{},[104,1281,1283],{"href":1282},"\u002Fdocs\u002Fcloud-services","云服务与托管平台",[36,1285,1286],{},[104,1287,1289],{"href":1288},"\u002Fdocs\u002Fdocker-compose-recipes","Docker Compose 常用配方",[29,1291,1292],{"id":1292},"参考链接",[33,1294,1295,1302,1308,1315],{},[36,1296,1297,1301],{},[104,1298,46],{"href":1299,"rel":1300},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fr2\u002F",[108]," — 文档",[36,1303,1304,1301],{},[104,1305,63],{"href":1306,"rel":1307},"https:\u002F\u002Fmin.io\u002Fdocs\u002F",[108],[36,1309,1310,1314],{},[104,1311,1064],{"href":1312,"rel":1313},"https:\u002F\u002Frclone.org\u002F",[108]," — 多云同步",[36,1316,1317,1322],{},[104,1318,1321],{"href":1319,"rel":1320},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fsdk-for-javascript\u002F",[108],"AWS S3 SDK"," — JS SDK",[1324,1325,1326],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":159,"searchDepth":173,"depth":173,"links":1328},[1329,1330,1331,1335,1336,1337,1338,1339,1340,1345,1346],{"id":31,"depth":173,"text":31},{"id":77,"depth":173,"text":78},{"id":147,"depth":173,"text":46,"children":1332},[1333,1334],{"id":151,"depth":196,"text":152},{"id":284,"depth":196,"text":285},{"id":607,"depth":173,"text":608},{"id":725,"depth":173,"text":726},{"id":1034,"depth":173,"text":1035},{"id":1151,"depth":173,"text":1151},{"id":1178,"depth":173,"text":1178},{"id":1215,"depth":173,"text":1215,"children":1341},[1342,1343,1344],{"id":1218,"depth":196,"text":1219},{"id":1238,"depth":196,"text":1239},{"id":1259,"depth":196,"text":1259},{"id":1269,"depth":173,"text":1269},{"id":1292,"depth":173,"text":1292},{"path":1348,"title":1349,"description":1350,"docType":8,"resourceKind":9,"categoryId":1351,"categoryLabel":1352,"updatedAt":12,"publishedAt":12,"icon":1353},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成","programming-languages","编程语言","i-carbon-application",{"path":1355,"title":1356,"description":1357,"docType":8,"resourceKind":9,"categoryId":1358,"categoryLabel":1359,"updatedAt":12,"publishedAt":12,"icon":1360},"\u002Fdocs\u002Fwebauthn-passkeys","WebAuthn 与 Passkeys","无密码认证原理、Passkeys 实现、浏览器 API 与服务端集成","network-security","网络与安全","i-carbon-network-4",[1362,1363,1364],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1366,1367,1368],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1370,1374,1379,1383],{"path":1371,"title":1372,"description":1373,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions",{"path":1375,"title":1376,"description":1377,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1378,"publishedAt":1378,"icon":13},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置","2026-02-27",{"path":1380,"title":1381,"description":1382,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1378,"publishedAt":1378,"icon":13},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门","Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境",{"path":1384,"title":1385,"description":1386,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1378,"publishedAt":1378,"icon":13},"\u002Fdocs\u002Fci-cd-guide","CI\u002FCD 实践指南","持续集成与部署概念、GitHub Actions 进阶、自动化测试与部署策略",1776215715139]