[{"data":1,"prerenderedAt":1840},["ShallowReactive",2],{"site-search-articles":3,"article-\u002Fblog\u002F40\u002F08-cloudflare-imgbed":403,"article-around-\u002Fblog\u002F40\u002F08-cloudflare-imgbed":1781},[4,17,29,40,51,60,68,76,83,90,98,104,110,116,128,137,145,154,163,170,178,184,190,195,202,210,215,221,226,232,237,245,252,257,264,272,276,282,289,295,299,303,308,313,319,324,328,333,340,346,351,359,365,372,378,385,392,398],{"id":5,"path":6,"title":7,"description":8,"date":9,"tags":10,"category":14,"minutes":15,"pinned":16},"blog\u002Fblog\u002Fnuxt4-vuetify4-blog.md","\u002Fblog\u002Fnuxt4-vuetify4-blog","Nuxt 4 + Vuetify 4 个人博客搭建记录","从内容结构、组件分层到服务端渲染，记录这个博客从零开始的完整实现过程。","2026-08-30",[11,12,13],"Nuxt","Vuetify","博客","开发",12,true,{"id":18,"path":19,"title":20,"description":21,"date":22,"tags":23,"category":26,"minutes":27,"pinned":28},"blog\u002Fblog\u002Fphoto-migration.md","\u002Fblog\u002Fphoto-migration","Google 相册迁移到 iCloud 分享","梳理照片导出、元数据修复与共享图库迁移过程，记录几个容易忽略的细节。","2026-08-26",[24,25],"相册","iCloud","生活",8,false,{"id":30,"path":31,"title":32,"description":33,"date":34,"tags":35,"category":14,"minutes":39,"pinned":28},"blog\u002Fblog\u002Fdocker-proxy.md","\u002Fblog\u002Fdocker-proxy","Docker 部署与反向代理配置","使用多阶段构建、容器重启策略和 Nginx 反向代理完成博客服务的可重复部署。","2026-08-18",[36,37,38],"Docker","Nginx","部署",10,{"id":41,"path":42,"title":43,"description":44,"date":45,"tags":46,"category":49,"minutes":50,"pinned":28},"blog\u002Fblog\u002Fsummer-coast.md","\u002Fblog\u002Fsummer-coast","一组夏日海边照片","把散落在相机和手机里的片段整理成一篇安静的夏日相册。","2026-08-09",[47,48],"摄影","夏日","随记",5,{"id":52,"path":53,"title":54,"description":54,"date":55,"tags":56,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F09-CloudFlare 优选 IP.md","\u002Fblog\u002F40\u002F09-cloudflare-ip","CloudFlare 优选 IP","2026-07-22 03:17:28",[57,58],"Cloudflare","优选域名","Blog",{"id":61,"path":62,"title":63,"description":63,"date":64,"tags":65,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F08-Cloudflare ImgBed 免费私有图床完整部署手册.md","\u002Fblog\u002F40\u002F08-cloudflare-imgbed","Cloudflare ImgBed 免费私有图床完整部署手册","2026-07-19 02:09:08",[57,66,67],"对象存储","图床",{"id":69,"path":70,"title":71,"description":71,"date":72,"tags":73,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F07-腾讯云 EdgeOne 边缘函数实现七牛&S3 随机图床 API.md","\u002Fblog\u002F40\u002F07-edgeone-ands3-api","腾讯云 EdgeOne 边缘函数实现七牛云 & S3 存储随机图床 API","2026-07-13 21:25:48",[74,75,67],"EdgeOne","七牛云",{"id":77,"path":78,"title":79,"description":79,"date":80,"tags":81,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F06-腾讯 EdgeOne 部署 Twikoo 评论系统指南.md","\u002Fblog\u002F40\u002F06-edgeone-twikoo","腾讯EdgeOne部署Twikoo评论系统指南","2026-06-14 17:41:11",[74,82],"Twikoo",{"id":84,"path":85,"title":86,"description":86,"date":87,"tags":88,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F05-OpenList 接入 S3 对象存储完整使用教程.md","\u002Fblog\u002F40\u002F05-openlist-s3","OpenList 接入 S3 对象存储完整使用教程","2026-06-11 13:08:07",[66,89],"OpenList",{"id":91,"path":92,"title":93,"description":94,"date":95,"tags":96,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F04-赛博大善人Cloudflare R2 图床.md","\u002Fblog\u002F40\u002F04-cloudflare-r2","赛博大善人 Cloudflare R2 图床","基于 Cloudflare R2 + 腾讯 Edge One + PicList 搭建免费、全球加速的图床方案","2026-06-09 13:07:35",[59,67,97],"CDN加速",{"id":99,"path":100,"title":101,"description":101,"date":102,"tags":103,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F03-白嫖免费图床，套CDN加速.md","\u002Fblog\u002F40\u002F03-cdn","白嫖免费图床，套 CDN 加速","2026-06-09",[59,67,97],{"id":105,"path":106,"title":107,"description":107,"date":108,"tags":109,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F02-零基础优雅搭建静态博客全教程.md","\u002Fblog\u002F40\u002F02","零基础优雅搭建静态博客全教程","2026-06-04",[59],{"id":111,"path":112,"title":113,"description":113,"date":114,"tags":115,"category":59,"minutes":50,"pinned":28},"blog\u002Fblog\u002F40-博客搭建\u002F01-远古产物—博客.md","\u002Fblog\u002F40\u002F01","赛博空间的私人岛屿：博客架构与风格美学","2026-06-03",[59],{"id":117,"path":118,"title":119,"description":119,"date":120,"tags":121,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F15.关于NAT回流与内网域名直连的终极指南.md","\u002Fblog\u002F10\u002F20\u002Fnat","关于 NAT 回流与内网域名直连的终极指南","2026-05-13",[122,123,124,125,126],"docker","DNS","Lucky","NAT 回流","远程访问","软路由",{"id":129,"path":130,"title":131,"description":131,"date":132,"tags":133,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F25.基于QMediaSync的飞牛外网strm直连.md","\u002Fblog\u002F10\u002F30-nas\u002Fqmediasyncstrm","基于 Lucky 反代与 QMediaSync 的飞牛外网 STRM 直连","2026-02-08",[134,135,136],"NAS","飞牛 OS","Strm",{"id":138,"path":139,"title":140,"description":140,"date":141,"tags":142,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F14.基于飞牛漏洞安全访问lucky反代&雷池防护.md","\u002Fblog\u002F10\u002F20\u002Fluckyand","基于飞牛漏洞安全访问Lucky反代&雷池防护","2026-02-03",[122,143,124,144,126],"WAF","飞牛",{"id":146,"path":147,"title":148,"description":148,"date":149,"tags":150,"category":153,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F60-N1&玩客云&OEC\u002F03.oec-fnOS安装.md","\u002Fblog\u002F10\u002F60-n1andandoec\u002Foec-fnos","OEC-Turbo (RK3566) 安装飞牛 OS","2026-01-24",[151,152,134],"OEC","飞牛OS","N1&玩客云&OEC",{"id":155,"path":156,"title":157,"description":157,"date":158,"tags":159,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F13.Lucky反向代理终极指南.md","\u002Fblog\u002F10\u002F20\u002Flucky","Lucky 反向代理终极指南","2026-01-16",[122,160,161,124,162,126],"OpenWRT","IPv4","IPv6",{"id":164,"path":165,"title":166,"description":166,"date":167,"tags":168,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F11.NAS 导航页的终极形态.md","\u002Fblog\u002F10\u002F10-docker\u002Fnas","告别繁琐配置：NAS 导航页的终极形态 —— 从 Sun-Panel 到 FlatNAS","2026-01-05",[122,134,169],"导航页",{"id":171,"path":172,"title":173,"description":173,"date":174,"tags":175,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F10.LogVar 弹幕 API 部署指南.md","\u002Fblog\u002F10\u002F10-docker\u002Flogvar-api","LogVar 弹幕 API  (纯本地缓存版) 部署指南","2025-12-30",[122,176,177],"弹幕 API","媒体库",{"id":179,"path":180,"title":181,"description":181,"date":182,"tags":183,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F24.飞牛NAS第三方应用商店安装.md","\u002Fblog\u002F10\u002F30-nas\u002Fnas","飞牛 NAS 第三方应用商店 (FnDepot) 安装指南","2025-12-02",[134,135],{"id":185,"path":186,"title":187,"description":187,"date":188,"tags":189,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F09.兰空图床和高清图标库.md","\u002Fblog\u002F10\u002F10-docker","兰空图床和高清图标库","2025-11-15",[122,67],{"id":191,"path":186,"title":192,"description":192,"date":193,"tags":194,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F08.你是否需要一个图床？.md","你是否需要一个图床？","2025-11-14",[122,67],{"id":196,"path":197,"title":198,"description":198,"date":199,"tags":200,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F23.Hills播放器-Windows-安卓.md","\u002Fblog\u002F10\u002F30-nas\u002Fhills-windows","Hills 播放器（Windows + 安卓）","2025-11-10",[201],"Emby 第三方播放器",{"id":203,"path":204,"title":205,"description":205,"date":206,"tags":207,"category":208,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F50-Linux\u002F02.Debian13换源.md","\u002Fblog\u002F10\u002F50-linux\u002Fdebian13","Debian13 换源","2025-09-10",[208,209],"Linux","debian",{"id":211,"path":212,"title":213,"description":213,"date":206,"tags":214,"category":208,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F50-Linux\u002F04.Linux系统，音响有底噪.md","\u002Fblog\u002F10\u002F50-linux\u002Flinux","Linux 系统，音响有底噪怎么办？",[208],{"id":216,"path":217,"title":218,"description":218,"date":206,"tags":219,"category":208,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F50-Linux\u002F05.一键DD纯净系统脚本.md","\u002Fblog\u002F10\u002F50-linux\u002Fdd","一键 DD 纯净系统脚本",[208,220],"dd 系统",{"id":222,"path":223,"title":224,"description":224,"date":206,"tags":225,"category":208,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F50-Linux\u002F08.一行代码降低服务器功耗.md","\u002Fblog\u002F10\u002F50-linux","一行代码降低服务器功耗",[208,209],{"id":227,"path":228,"title":229,"description":229,"date":206,"tags":230,"category":153,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F60-N1&玩客云&OEC\u002F01.N1盒子永不为奴-Armbian.md","\u002Fblog\u002F10\u002F60-n1andandoec\u002Fn1-armbian","N1 盒子永不为奴 Armbian",[231,208],"N1",{"id":233,"path":234,"title":235,"description":235,"date":206,"tags":236,"category":153,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F60-N1&玩客云&OEC\u002F02.OEC站起来了-Armbian.md","\u002Fblog\u002F10\u002F60-n1andandoec\u002Foec-armbian","OEC 盒子永不为奴 Armbian",[151,208],{"id":238,"path":239,"title":240,"description":241,"date":242,"tags":243,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F01.容器&docker&docker-compose.md","\u002Fblog\u002F10\u002F10-docker\u002Fanddockeranddocker-compose","容器 & docker & docker-compose","初识 yaml 语法和 docker","2025-08-05",[122,244],"yaml",{"id":246,"path":247,"title":248,"description":249,"date":242,"tags":250,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F02.容器项目&下载类.md","\u002Fblog\u002F10\u002F10-docker\u002Fand","容器项目&下载类","采用docker搭建下载服务",[122,244,251],"下载",{"id":253,"path":247,"title":254,"description":255,"date":242,"tags":256,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F03.容器项目&相册类.md","容器项目&相册类","采用 docker 搭建 AI 相册",[122,244,24],{"id":258,"path":247,"title":259,"description":260,"date":242,"tags":261,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F04.容器项目&影视类.md","容器项目&影视类","采用 docker 影视媒体库",[122,244,262,263],"影视媒体库","Emby",{"id":265,"path":266,"title":267,"description":268,"date":242,"tags":269,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F05.Emby直连115网盘（一）.md","\u002Fblog\u002F10\u002F10-docker\u002Femby115","Emby直连115网盘（一）","使用 Emby 直连 115 网盘",[122,244,262,263,270,271],"strm","115 网盘",{"id":273,"path":266,"title":274,"description":268,"date":242,"tags":275,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F06.Emby直连115网盘（二）.md","Emby直连115网盘（二）",[122,244,262,263,270,271],{"id":277,"path":278,"title":279,"description":279,"date":242,"tags":280,"category":122,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F07.Adguard Home去广告.md","\u002Fblog\u002F10\u002F10-docker\u002Fadguard-home","Adguard Home 去广告",[122,281],"Adguard Home",{"id":283,"path":284,"title":285,"description":286,"date":242,"tags":287,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F01.新的篇章，软路由.md","\u002Fblog\u002F10\u002F20","新的篇章，软路由","初识软路由",[127,288,160],"爱快",{"id":290,"path":284,"title":291,"description":292,"date":242,"tags":293,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F02.如何玩公网，怎么远程访问（一）.md","如何玩公网，怎么远程访问（一）","公网远程访问，IPv6也是公网",[127,126,294],"公网 IP",{"id":296,"path":284,"title":297,"description":292,"date":242,"tags":298,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F03.如何玩公网，怎么远程访问（二）.md","如何玩公网，怎么远程访问（二）",[127,126,294],{"id":300,"path":284,"title":301,"description":292,"date":242,"tags":302,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F04.如何玩公网，怎么远程访问（三）.md","如何玩公网，怎么远程访问（三）",[127,126,294],{"id":304,"path":284,"title":305,"description":305,"date":242,"tags":306,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F05.白嫖域名，远程访问.md","白嫖域名，远程访问",[127,126,307],"免费域名",{"id":309,"path":284,"title":310,"description":310,"date":242,"tags":311,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F06.没有公网如何远程访问.md","没有公网如何远程访问",[127,126,312],"内网穿透",{"id":314,"path":315,"title":316,"description":316,"date":242,"tags":317,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F07.爱快与OpenWRT双软路由MAC地址重复问题修正.md","\u002Fblog\u002F10\u002F20\u002Fopenwrtmac","爱快与 OpenWRT 双软路由MAC地址重复问题修正",[288,160,318],"MAC 地址",{"id":320,"path":321,"title":322,"description":322,"date":242,"tags":323,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F08.OpenWRT扩容.md","\u002Fblog\u002F10\u002F20\u002Fopenwrt","OpenWRT 扩容",[160],{"id":325,"path":321,"title":326,"description":326,"date":242,"tags":327,"category":127,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F20-软路由\u002F09.OpenWRT旁路由一条龙教程.md","OpenWRT 旁路由一条龙教程",[160],{"id":329,"path":330,"title":331,"description":331,"date":242,"tags":332,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F01.Emby刮削以及尽可能刮削到中文.md","\u002Fblog\u002F10\u002F30-nas\u002Femby","Emby 刮削以及尽可能刮削到中文",[263,177],{"id":334,"path":335,"title":336,"description":336,"date":242,"tags":337,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F02.Kodi&CoreELEC安装指南.md","\u002Fblog\u002F10\u002F30-nas\u002Fkodiandcoreelec","Kodi & CoreELEC 安装指南",[338,339,177],"Kodi","CoreELEC",{"id":341,"path":342,"title":343,"description":344,"date":242,"tags":345,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F20.飞牛OS的安装.md","\u002Fblog\u002F10\u002F30-nas\u002Fos","飞牛 OS 的安装","初识飞牛 NAS",[134,135],{"id":347,"path":342,"title":348,"description":349,"date":242,"tags":350,"category":134,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F30-NAS\u002F21.飞牛OS安装后必要配置.md","飞牛 OS 安装后必要配置","飞牛 NAS 基础配置",[134,135],{"id":352,"path":353,"title":354,"description":355,"date":242,"tags":356,"category":358,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F40-虚拟机\u002F01.新的篇章，PVE虚拟机.md","\u002Fblog\u002F10\u002F40\u002Fpve","新的篇章，PVE虚拟机","初识 PVE 虚拟机",[208,209,357,358],"PVE","虚拟机",{"id":360,"path":361,"title":362,"description":363,"date":242,"tags":364,"category":358,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F40-虚拟机\u002F03.基于PVE系统安装LXC-debian.md","\u002Fblog\u002F10\u002F40\u002Fpvelxc-debian","基于 PVE 系统安装 LXC-debian","初识 LXC debian",[208,209,357,358],{"id":366,"path":367,"title":368,"description":368,"date":242,"tags":369,"category":358,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F40-虚拟机\u002F07.Ventoy多系统启动盘制作与使用全指南.md","\u002Fblog\u002F10\u002F40\u002Fventoy","Ventoy 多系统启动盘制作与使用全指南",[370,371],"Ventoy","PE 系统",{"id":373,"path":374,"title":375,"description":376,"date":242,"tags":377,"category":358,"minutes":50,"pinned":28},"blog\u002Fblog\u002F10-技术专栏\u002F50-Linux\u002F01.新的篇章，debian12的配置.md","\u002Fblog\u002F10\u002F50-linux\u002Fdebian12","新的篇章，debian12 的配置","初识 debian 12",[208,209],{"id":379,"path":380,"title":381,"description":381,"date":242,"tags":382,"category":383,"minutes":50,"pinned":28},"blog\u002Fblog\u002F20-生活感悟\u002F02.在裂缝中种满阳光.md","\u002Fblog\u002F20","让灵魂带着光行走：在裂缝中种满太阳",[383,384],"生活感悟","随笔记录",{"id":386,"path":387,"title":388,"description":388,"date":242,"tags":389,"category":391,"minutes":50,"pinned":28},"blog\u002Fblog\u002F30-学习笔记\u002F01.Typora学习笔记.md","\u002Fblog\u002F30\u002Ftypora","Typora学习笔记",[390],"Typora","学习笔记",{"id":393,"path":394,"title":395,"description":395,"date":242,"tags":396,"category":391,"minutes":50,"pinned":28},"blog\u002Fblog\u002F30-学习笔记\u002F02.Markdown 拓展.md","\u002Fblog\u002F30\u002Fmarkdown","Markdown 拓展",[397],"Markdown",{"id":399,"path":380,"title":400,"description":400,"date":401,"tags":402,"category":383,"minutes":50,"pinned":28},"blog\u002Fblog\u002F20-生活感悟\u002F01.拥抱生活中的光与热.md","拥抱生活中的光与热","2025-07-05",[383,384],{"id":61,"title":63,"body":404,"category":59,"date":64,"description":63,"draft":28,"extension":1773,"meta":1774,"minutes":50,"navigation":16,"path":62,"pinned":28,"seo":1777,"stem":1778,"tags":1779,"__hash__":1780},{"type":405,"value":406,"toc":1740},"minimark",[407,411,414,419,424,445,449,478,482,496,498,502,506,514,518,585,589,597,599,603,607,613,617,627,651,655,663,667,692,694,698,702,710,732,736,774,778,843,847,850,854,859,864,924,928,963,967,985,1565,1580,1584,1617,1621,1627,1629,1633,1637,1651,1655,1672,1674,1678,1710,1712,1716,1733,1736],[408,409,63],"h1",{"id":410},"cloudflare-imgbed-免费私有图床完整部署手册",[412,413],"hr",{},[415,416,418],"h2",{"id":417},"_1-前言为什么选-cloudflare-imgbed","1 前言：为什么选 Cloudflare ImgBed",[420,421,423],"h3",{"id":422},"_11-现有图床痛点","1.1 现有图床痛点",[425,426,427,436,439,442],"ul",{},[428,429,430,431,435],"li",{},"商业对象存储图床：国内 ",[432,433,434],"strong",{},"COS \u002F OSS"," 存储、外网流量长期计费，长期维护成本持续上涨",[428,437,438],{},"第三方公共图床：强制防盗链跨域限制、平台关停、图片永久丢失风险高",[428,440,441],{},"无全球边缘加速：海外访问加载缓慢，国内访问链路波动，大图加载超时",[428,443,444],{},"前后端资源分层混乱：图片存储、管理前端、上传接口耦合，扩容迁移成本高",[420,446,448],{"id":447},"_12-项目优势","1.2 项目优势",[425,450,451,458,461,472,475],{},[428,452,453,454,457],{},"依托 ",[432,455,456],{},"Cloudflare Pages"," 静态页面免费托管，无服务器月租支出",[428,459,460],{},"全球 275+ 边缘节点 CDN 加速，国内外图片低延迟访问",[428,462,463,464,467,468,471],{},"原生兼容 ",[432,465,466],{},"R2"," 对象存储，支持标准 ",[432,469,470],{},"S3"," 协议，可对接第三方对象存储",[428,473,474],{},"内置可视化管理后台，支持批量上传、预览、删除、一键复制图片链接",[428,476,477],{},"边缘函数承载上传业务逻辑，全链路 Serverless 架构，无需自建后端服务",[420,479,481],{"id":480},"_13-适用人群","1.3 适用人群",[425,483,484,487,490,493],{},[428,485,486],{},"独立博客、自媒体站长，长期托管文章配图",[428,488,489],{},"Obsidian \u002F Notion \u002F 语雀 笔记工具用户，搭建私有稳定图床",[428,491,492],{},"前端开发者，静态图标、截图、素材资源托管场景",[428,494,495],{},"个人小型项目，追求零成本、高可用静态资源存储方案",[412,497],{},[415,499,501],{"id":500},"_2-方案选型对比","2 方案选型对比",[420,503,505],{"id":504},"_21-两种部署方案约束","2.1 两种部署方案约束",[425,507,508,511],{},[428,509,510],{},"Pages 托管前端 + Workers 边缘函数：完整可视化管理面板，元数据持久化方案成熟，上手门槛低",[428,512,513],{},"Workers 纯函数方案：无前端管理页面，仅开放上传、查询接口，适配程序自动化批量调用场景",[420,515,517],{"id":516},"_22-pages-部署-workers-部署-三线对比表","2.2 Pages 部署 \u002F Workers 部署 三线对比表",[519,520,521,537],"table",{},[522,523,524],"thead",{},[525,526,527,531,534],"tr",{},[528,529,530],"th",{},"对比维度",[528,532,533],{},"Pages 完整部署方案",[528,535,536],{},"Workers 纯函数方案",[538,539,540,552,563,574],"tbody",{},[525,541,542,546,549],{},[543,544,545],"td",{},"成本",[543,547,548],{},"全部免费，免费额度覆盖个人日常使用",[543,550,551],{},"全部免费",[525,553,554,557,560],{},[543,555,556],{},"维护难度",[543,558,559],{},"低，可视化页面配置，操作直观",[543,561,562],{},"高，仅接口调用，无可视化管理界面",[525,564,565,568,571],{},[543,566,567],{},"免费额度",[543,569,570],{},"Pages 无限静态托管；R2 10GB 存储；KV 100MB；D1 5GB",[543,572,573],{},"Workers 每日 10 万免费请求，配套 R2 额度一致",[525,575,576,579,582],{},[543,577,578],{},"功能完整度",[543,580,581],{},"完整上传、批量操作、资源列表、管理员权限校验",[543,583,584],{},"仅基础上传、资源查询接口，无可视化管理功能",[420,586,588],{"id":587},"_23-选型结论","2.3 选型结论",[590,591,592,593,596],"p",{},"新手、博客站长、笔记工具用户",[432,594,595],{},"优先 Pages 方案","，配套可视化管理后台，操作贴合官方文档，开箱即用；仅自动化脚本、批量程序上传场景选择 Workers 纯函数方案。",[412,598],{},[415,600,602],{"id":601},"_3-部署前置准备","3 部署前置准备",[420,604,606],{"id":605},"_31-github-账号","3.1 GitHub 账号",[590,608,609,610,612],{},"用于 Fork 开源 CloudFlare-ImgBed 源码仓库，",[432,611,456],{}," 依赖 Git 仓库实现自动构建、更新部署。",[420,614,616],{"id":615},"_32-paypal-账号注册以及绑定银联","3.2 PayPal 账号注册以及绑定银联",[618,619,620],"blockquote",{},[590,621,622,623,626],{},"⚠️ 关键警告：开通 ",[432,624,625],{},"R2 对象存储"," 强制要求绑定支付渠道，仅做身份校验，免费额度范围内不会产生任何扣费，无隐藏消费。",[425,628,629,638,641,644],{},[428,630,631,632],{},"PayPal 注册地址：",[633,634,635],"a",{"href":635,"rel":636},"https:\u002F\u002Fwww.paypal.com\u002Fc2\u002Fhome",[637],"nofollow",[428,639,640],{},"注册 PayPal 个人账户，完成实名认证并绑定国内银联储蓄卡",[428,642,643],{},"认证完成后再进入 Cloudflare 后台完成支付渠道授权",[428,645,646,647,650],{},"说明：开通 Cloudflare R2 海外存储扣费必须使用",[432,648,649],{},"国际版 PayPal","，地区选择「中国」，可绑定银联储蓄卡 \u002F 双币信用卡。",[420,652,654],{"id":653},"_33-cloudflare-免费账号","3.3 Cloudflare 免费账号",[590,656,657,658,662],{},"注册 ",[633,659,57],{"href":660,"rel":661},"https:\u002F\u002Fdash.cloudflare.com\u002Flogin",[637]," 免费版账号，无需升级 Pro \u002F 企业套餐，免费资源完全满足个人图床业务需求。",[420,664,666],{"id":665},"_34-绑定-paypal-支付开通-r2-对象存储","3.4 绑定 Paypal 支付，开通 R2 对象存储",[425,668,669,675,678,681],{},[428,670,671,672,674],{},"进入 Cloudflare 后台侧边栏 ",[432,673,466],{}," 功能面板",[428,676,677],{},"根据页面指引绑定已完成银联认证的 PayPal 账户",[428,679,680],{},"完成支付渠道校验后，开通 R2 对象存储服务，预留存储桶创建入口",[428,682,683,684,687],{},"最后创建一个存储桶，记住这个存储桶的名称，比如 ",[432,685,686],{},"cloudflare-imgbed",[688,689],"img",{"alt":690,"src":691},"","https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784396392367.avif",[412,693],{},[415,695,697],{"id":696},"_4-cloudflare-pages-分步部署","4 Cloudflare Pages 分步部署",[420,699,701],{"id":700},"_41-fork-官方-cloudflare-imgbed-源码仓库","4.1 Fork 官方 Cloudflare ImgBed 源码仓库",[590,703,704,705,709],{},"仓库开源地址：",[706,707,708],"code",{},"https:\u002F\u002Fgithub.com\u002FMarSeventh\u002FCloudFlare-ImgBed","\n操作步骤",[425,711,712,719,726],{},[428,713,714,715],{},"登录 GitHub，访问 ",[633,716,718],{"href":708,"rel":717},[637],"CloudFlare ImgBed 项目",[428,720,721,722,725],{},"页面右上角点击 ",[432,723,724],{},"Fork","，将完整源码复制至个人 GitHub 名下",[428,727,728,729],{},"Fork 完成后进入个人仓库，确认源码文件完整拉取无缺失\n",[688,730],{"alt":690,"src":731},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784395703898.avif",[420,733,735],{"id":734},"_42-在-cloudflare-后台创建-pages-项目","4.2 在 Cloudflare 后台创建 Pages 项目",[425,737,738,746,753,762,765],{},[428,739,740,741],{},"登录 ",[633,742,745],{"href":743,"rel":744},"https:\u002F\u002Fdash.cloudflare.com\u002F",[637],"Cloudflare Dashboard",[428,747,748,749,752],{},"后台左侧导航栏进入 ",[432,750,751],{},"Workers & Pages"," 功能入口",[428,754,755,756,759],{},"点击「创建应用程序」→「创建 Pages」\n",[688,757],{"alt":690,"src":758},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784395982052.avif",[688,760],{"alt":690,"src":761},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784396032044.avif",[428,763,764],{},"连接 GitHub 账号，授权 Cloudflare 读取个人 GitHub 仓库权限",[428,766,767,768,770,771],{},"在仓库列表选中刚刚 Fork 完成的 ",[706,769,686],{}," 仓库\n",[688,772],{"alt":690,"src":773},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784396081651.avif",[420,775,777],{"id":776},"_43-项目构建参数配置","4.3 项目构建参数配置",[519,779,780,793],{},[522,781,782],{},[525,783,784,787,790],{},[528,785,786],{},"配置项",[528,788,789],{},"标准参数值",[528,791,792],{},"备注说明",[538,794,795,810,821,832],{},[525,796,797,800,803],{},[543,798,799],{},"项目名称",[543,801,802],{},"自定义cloudflare-imgbed",[543,804,805,806,809],{},"决定默认 ",[706,807,808],{},"xxx.pages.dev"," 二级域名前缀",[525,811,812,815,818],{},[543,813,814],{},"生产分支",[543,816,817],{},"main",[543,819,820],{},"源码主分支，无特殊需求禁止修改",[525,822,823,826,829],{},[543,824,825],{},"构建命令",[543,827,828],{},"npm install",[543,830,831],{},"项目内置打包脚本",[525,833,834,837,840],{},[543,835,836],{},"输出目录",[543,838,839],{},"\u002Ffrontend-dist",[543,841,842],{},"打包后静态资源输出文件夹",[420,844,846],{"id":845},"_44-首次保存并触发部署","4.4 首次保存并触发部署",[590,848,849],{},"参数填写完成后点击「保存并部署」，Cloudflare 自动拉取仓库代码、安装依赖、打包静态资源，等待 2–5 分钟构建完成，系统自动生成项目默认访问域名。",[420,851,853],{"id":852},"_45-元数据存储kv-d1-数据库二选一配置","4.5 元数据存储：KV \u002F D1 数据库二选一配置",[618,855,856],{},[590,857,858],{},"强制提醒：KV、D1 仅需配置其中一种，无需同时绑定；若当前 Cloudflare 账号已有其他项目占用 KV 命名空间，建议选择 D1；全新账号统一优先 KV。",[860,861,863],"h4",{"id":862},"_451-kv-与-d1-数据库核心差异三线对比表","4.5.1 KV 与 D1 数据库核心差异三线对比表",[519,865,866,879],{},[522,867,868],{},[525,869,870,873,876],{},[528,871,872],{},"对比项",[528,874,875],{},"KV 键值存储",[528,877,878],{},"D1 SQL 关系型数据库",[538,880,881,892,902,913],{},[525,882,883,886,889],{},[543,884,885],{},"数据结构",[543,887,888],{},"简单 Key-Value 键值对",[543,890,891],{},"标准 SQL 数据表，支持多字段筛选",[525,893,894,896,899],{},[543,895,567],{},[543,897,898],{},"100MB 存储空间",[543,900,901],{},"5GB 数据库存储容量",[525,903,904,907,910],{},[543,905,906],{},"查询性能",[543,908,909],{},"单键读取速度极快，批量筛选能力弱",[543,911,912],{},"支持分页、条件筛选、排序查询",[525,914,915,918,921],{},[543,916,917],{},"适用场景",[543,919,920],{},"图片总量 \u003C 10000 张，仅存储基础元数据",[543,922,923],{},"图片上万张，需要分类、筛选、分页管理",[860,925,927],{"id":926},"_452-kv-命名空间创建-pages-项目绑定完整操作","4.5.2 KV 命名空间创建 + Pages 项目绑定完整操作",[425,929,930,937,946,949,960],{},[428,931,932,933,936],{},"Cloudflare 后台 → Workers & Pages → ",[432,934,935],{},"KV"," 面板",[428,938,939,940,943],{},"点击创建命名空间，自定义名称如 ",[706,941,942],{},"imgbed-kv",[688,944],{"alt":690,"src":945},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784396770378.avif",[428,947,948],{},"返回 Pages 项目页面 → 设置 → 环境变量与绑定",[428,950,951,952,955,956,959],{},"新增 KV 绑定，",[432,953,954],{},"绑定变量名必须填写"," ",[706,957,958],{},"img_url","，选中刚创建的命名空间",[428,961,962],{},"保存全部配置，重新触发一次项目部署使绑定生效",[860,964,966],{"id":965},"_453-d1-sql-数据库创建初始化-sql项目绑定完整操作","4.5.3 D1 SQL 数据库创建、初始化 SQL、项目绑定完整操作",[425,968,969,979],{},[428,970,971,972,975,976],{},"后台侧边栏进入 ",[432,973,974],{},"D1"," 面板，点击创建数据库，自定义名称 ",[706,977,978],{},"imgbed-d1",[428,980,981,982],{},"进入数据库「查询」页面，执行以下初始化建表 SQL：\n",[688,983],{"alt":690,"src":984},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784396835173.avif",[986,987,991],"pre",{"className":988,"code":989,"language":990,"meta":690,"style":690},"language-sql shiki shiki-themes github-light github-dark","CREATE TABLE IF NOT EXISTS files (\n    id TEXT PRIMARY KEY,\n    value TEXT,\n    metadata TEXT NOT NULL,\n    file_name TEXT,\n    file_type TEXT,\n    file_size TEXT,\n    upload_ip TEXT,\n    upload_address TEXT,\n    list_type TEXT,\n    timestamp INTEGER,\n    label TEXT,\n    directory TEXT,\n    channel TEXT,\n    channel_name TEXT,\n    tg_file_id TEXT,\n    tg_chat_id TEXT,\n    tg_bot_token TEXT,\n    is_chunked BOOLEAN DEFAULT FALSE,\n    tags TEXT, \n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS settings (\n    key TEXT PRIMARY KEY,\n    value TEXT NOT NULL,\n    category TEXT,\n    description TEXT,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS index_operations (\n    id TEXT PRIMARY KEY,\n    type TEXT NOT NULL,\n    timestamp INTEGER NOT NULL,\n    data TEXT NOT NULL,\n    processed BOOLEAN DEFAULT FALSE,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS index_metadata (\n    key TEXT PRIMARY KEY,\n    last_updated INTEGER,\n    total_count INTEGER DEFAULT 0,\n    last_operation_id TEXT,\n    chunk_count INTEGER DEFAULT 0,\n    chunk_size INTEGER DEFAULT 0,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS other_data (\n    key TEXT PRIMARY KEY,\n    value TEXT NOT NULL,\n    type TEXT,\n    description TEXT,\n    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE INDEX IF NOT EXISTS idx_files_timestamp ON files(timestamp DESC);\nCREATE INDEX IF NOT EXISTS idx_files_directory ON files(directory);\nCREATE INDEX IF NOT EXISTS idx_files_channel ON files(channel);\nCREATE INDEX IF NOT EXISTS idx_files_file_type ON files(file_type);\nCREATE INDEX IF NOT EXISTS idx_files_upload_ip ON files(upload_ip);\nCREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_files_tags ON files(tags);\n\nCREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\n\nCREATE INDEX IF NOT EXISTS idx_index_operations_timestamp ON index_operations(timestamp);\nCREATE INDEX IF NOT EXISTS idx_index_operations_processed ON index_operations(processed);\nCREATE INDEX IF NOT EXISTS idx_index_operations_type ON index_operations(type);\n\nCREATE INDEX IF NOT EXISTS idx_other_data_type ON other_data(type);\n\nCREATE TRIGGER IF NOT EXISTS update_files_updated_at \n    AFTER UPDATE ON files\n    BEGIN\n        UPDATE files SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;\n    END;\n\nCREATE TRIGGER IF NOT EXISTS update_settings_updated_at \n    AFTER UPDATE ON settings\n    BEGIN\n        UPDATE settings SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n    END;\n\nCREATE TRIGGER IF NOT EXISTS update_index_metadata_updated_at \n    AFTER UPDATE ON index_metadata\n    BEGIN\n        UPDATE index_metadata SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n    END;\n\nCREATE TRIGGER IF NOT EXISTS update_other_data_updated_at \n    AFTER UPDATE ON other_data\n    BEGIN\n        UPDATE other_data SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n    END;\n","sql",[706,992,993,1001,1007,1013,1019,1024,1030,1036,1041,1047,1052,1058,1063,1069,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1135,1141,1147,1153,1159,1165,1170,1175,1180,1185,1191,1196,1202,1208,1214,1220,1226,1231,1236,1242,1247,1253,1259,1265,1271,1277,1282,1287,1292,1297,1303,1308,1313,1319,1324,1329,1334,1339,1344,1350,1356,1362,1368,1374,1380,1386,1391,1397,1402,1408,1414,1420,1425,1431,1436,1442,1448,1454,1460,1466,1471,1477,1483,1488,1494,1499,1504,1510,1516,1521,1527,1532,1537,1543,1549,1554,1560],{"__ignoreMap":690},[994,995,998],"span",{"class":996,"line":997},"line",1,[994,999,1000],{},"CREATE TABLE IF NOT EXISTS files (\n",[994,1002,1004],{"class":996,"line":1003},2,[994,1005,1006],{},"    id TEXT PRIMARY KEY,\n",[994,1008,1010],{"class":996,"line":1009},3,[994,1011,1012],{},"    value TEXT,\n",[994,1014,1016],{"class":996,"line":1015},4,[994,1017,1018],{},"    metadata TEXT NOT NULL,\n",[994,1020,1021],{"class":996,"line":50},[994,1022,1023],{},"    file_name TEXT,\n",[994,1025,1027],{"class":996,"line":1026},6,[994,1028,1029],{},"    file_type TEXT,\n",[994,1031,1033],{"class":996,"line":1032},7,[994,1034,1035],{},"    file_size TEXT,\n",[994,1037,1038],{"class":996,"line":27},[994,1039,1040],{},"    upload_ip TEXT,\n",[994,1042,1044],{"class":996,"line":1043},9,[994,1045,1046],{},"    upload_address TEXT,\n",[994,1048,1049],{"class":996,"line":39},[994,1050,1051],{},"    list_type TEXT,\n",[994,1053,1055],{"class":996,"line":1054},11,[994,1056,1057],{},"    timestamp INTEGER,\n",[994,1059,1060],{"class":996,"line":15},[994,1061,1062],{},"    label TEXT,\n",[994,1064,1066],{"class":996,"line":1065},13,[994,1067,1068],{},"    directory TEXT,\n",[994,1070,1072],{"class":996,"line":1071},14,[994,1073,1074],{},"    channel TEXT,\n",[994,1076,1078],{"class":996,"line":1077},15,[994,1079,1080],{},"    channel_name TEXT,\n",[994,1082,1084],{"class":996,"line":1083},16,[994,1085,1086],{},"    tg_file_id TEXT,\n",[994,1088,1090],{"class":996,"line":1089},17,[994,1091,1092],{},"    tg_chat_id TEXT,\n",[994,1094,1096],{"class":996,"line":1095},18,[994,1097,1098],{},"    tg_bot_token TEXT,\n",[994,1100,1102],{"class":996,"line":1101},19,[994,1103,1104],{},"    is_chunked BOOLEAN DEFAULT FALSE,\n",[994,1106,1108],{"class":996,"line":1107},20,[994,1109,1110],{},"    tags TEXT, \n",[994,1112,1114],{"class":996,"line":1113},21,[994,1115,1116],{},"    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,\n",[994,1118,1120],{"class":996,"line":1119},22,[994,1121,1122],{},"    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP\n",[994,1124,1126],{"class":996,"line":1125},23,[994,1127,1128],{},");\n",[994,1130,1132],{"class":996,"line":1131},24,[994,1133,1134],{"emptyLinePlaceholder":16},"\n",[994,1136,1138],{"class":996,"line":1137},25,[994,1139,1140],{},"CREATE TABLE IF NOT EXISTS settings (\n",[994,1142,1144],{"class":996,"line":1143},26,[994,1145,1146],{},"    key TEXT PRIMARY KEY,\n",[994,1148,1150],{"class":996,"line":1149},27,[994,1151,1152],{},"    value TEXT NOT NULL,\n",[994,1154,1156],{"class":996,"line":1155},28,[994,1157,1158],{},"    category TEXT,\n",[994,1160,1162],{"class":996,"line":1161},29,[994,1163,1164],{},"    description TEXT,\n",[994,1166,1168],{"class":996,"line":1167},30,[994,1169,1116],{},[994,1171,1173],{"class":996,"line":1172},31,[994,1174,1122],{},[994,1176,1178],{"class":996,"line":1177},32,[994,1179,1128],{},[994,1181,1183],{"class":996,"line":1182},33,[994,1184,1134],{"emptyLinePlaceholder":16},[994,1186,1188],{"class":996,"line":1187},34,[994,1189,1190],{},"CREATE TABLE IF NOT EXISTS index_operations (\n",[994,1192,1194],{"class":996,"line":1193},35,[994,1195,1006],{},[994,1197,1199],{"class":996,"line":1198},36,[994,1200,1201],{},"    type TEXT NOT NULL,\n",[994,1203,1205],{"class":996,"line":1204},37,[994,1206,1207],{},"    timestamp INTEGER NOT NULL,\n",[994,1209,1211],{"class":996,"line":1210},38,[994,1212,1213],{},"    data TEXT NOT NULL,\n",[994,1215,1217],{"class":996,"line":1216},39,[994,1218,1219],{},"    processed BOOLEAN DEFAULT FALSE,\n",[994,1221,1223],{"class":996,"line":1222},40,[994,1224,1225],{},"    created_at DATETIME DEFAULT CURRENT_TIMESTAMP\n",[994,1227,1229],{"class":996,"line":1228},41,[994,1230,1128],{},[994,1232,1234],{"class":996,"line":1233},42,[994,1235,1134],{"emptyLinePlaceholder":16},[994,1237,1239],{"class":996,"line":1238},43,[994,1240,1241],{},"CREATE TABLE IF NOT EXISTS index_metadata (\n",[994,1243,1245],{"class":996,"line":1244},44,[994,1246,1146],{},[994,1248,1250],{"class":996,"line":1249},45,[994,1251,1252],{},"    last_updated INTEGER,\n",[994,1254,1256],{"class":996,"line":1255},46,[994,1257,1258],{},"    total_count INTEGER DEFAULT 0,\n",[994,1260,1262],{"class":996,"line":1261},47,[994,1263,1264],{},"    last_operation_id TEXT,\n",[994,1266,1268],{"class":996,"line":1267},48,[994,1269,1270],{},"    chunk_count INTEGER DEFAULT 0,\n",[994,1272,1274],{"class":996,"line":1273},49,[994,1275,1276],{},"    chunk_size INTEGER DEFAULT 0,\n",[994,1278,1280],{"class":996,"line":1279},50,[994,1281,1116],{},[994,1283,1285],{"class":996,"line":1284},51,[994,1286,1122],{},[994,1288,1290],{"class":996,"line":1289},52,[994,1291,1128],{},[994,1293,1295],{"class":996,"line":1294},53,[994,1296,1134],{"emptyLinePlaceholder":16},[994,1298,1300],{"class":996,"line":1299},54,[994,1301,1302],{},"CREATE TABLE IF NOT EXISTS other_data (\n",[994,1304,1306],{"class":996,"line":1305},55,[994,1307,1146],{},[994,1309,1311],{"class":996,"line":1310},56,[994,1312,1152],{},[994,1314,1316],{"class":996,"line":1315},57,[994,1317,1318],{},"    type TEXT,\n",[994,1320,1322],{"class":996,"line":1321},58,[994,1323,1164],{},[994,1325,1327],{"class":996,"line":1326},59,[994,1328,1116],{},[994,1330,1332],{"class":996,"line":1331},60,[994,1333,1122],{},[994,1335,1337],{"class":996,"line":1336},61,[994,1338,1128],{},[994,1340,1342],{"class":996,"line":1341},62,[994,1343,1134],{"emptyLinePlaceholder":16},[994,1345,1347],{"class":996,"line":1346},63,[994,1348,1349],{},"CREATE INDEX IF NOT EXISTS idx_files_timestamp ON files(timestamp DESC);\n",[994,1351,1353],{"class":996,"line":1352},64,[994,1354,1355],{},"CREATE INDEX IF NOT EXISTS idx_files_directory ON files(directory);\n",[994,1357,1359],{"class":996,"line":1358},65,[994,1360,1361],{},"CREATE INDEX IF NOT EXISTS idx_files_channel ON files(channel);\n",[994,1363,1365],{"class":996,"line":1364},66,[994,1366,1367],{},"CREATE INDEX IF NOT EXISTS idx_files_file_type ON files(file_type);\n",[994,1369,1371],{"class":996,"line":1370},67,[994,1372,1373],{},"CREATE INDEX IF NOT EXISTS idx_files_upload_ip ON files(upload_ip);\n",[994,1375,1377],{"class":996,"line":1376},68,[994,1378,1379],{},"CREATE INDEX IF NOT EXISTS idx_files_created_at ON files(created_at DESC);\n",[994,1381,1383],{"class":996,"line":1382},69,[994,1384,1385],{},"CREATE INDEX IF NOT EXISTS idx_files_tags ON files(tags);\n",[994,1387,1389],{"class":996,"line":1388},70,[994,1390,1134],{"emptyLinePlaceholder":16},[994,1392,1394],{"class":996,"line":1393},71,[994,1395,1396],{},"CREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);\n",[994,1398,1400],{"class":996,"line":1399},72,[994,1401,1134],{"emptyLinePlaceholder":16},[994,1403,1405],{"class":996,"line":1404},73,[994,1406,1407],{},"CREATE INDEX IF NOT EXISTS idx_index_operations_timestamp ON index_operations(timestamp);\n",[994,1409,1411],{"class":996,"line":1410},74,[994,1412,1413],{},"CREATE INDEX IF NOT EXISTS idx_index_operations_processed ON index_operations(processed);\n",[994,1415,1417],{"class":996,"line":1416},75,[994,1418,1419],{},"CREATE INDEX IF NOT EXISTS idx_index_operations_type ON index_operations(type);\n",[994,1421,1423],{"class":996,"line":1422},76,[994,1424,1134],{"emptyLinePlaceholder":16},[994,1426,1428],{"class":996,"line":1427},77,[994,1429,1430],{},"CREATE INDEX IF NOT EXISTS idx_other_data_type ON other_data(type);\n",[994,1432,1434],{"class":996,"line":1433},78,[994,1435,1134],{"emptyLinePlaceholder":16},[994,1437,1439],{"class":996,"line":1438},79,[994,1440,1441],{},"CREATE TRIGGER IF NOT EXISTS update_files_updated_at \n",[994,1443,1445],{"class":996,"line":1444},80,[994,1446,1447],{},"    AFTER UPDATE ON files\n",[994,1449,1451],{"class":996,"line":1450},81,[994,1452,1453],{},"    BEGIN\n",[994,1455,1457],{"class":996,"line":1456},82,[994,1458,1459],{},"        UPDATE files SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;\n",[994,1461,1463],{"class":996,"line":1462},83,[994,1464,1465],{},"    END;\n",[994,1467,1469],{"class":996,"line":1468},84,[994,1470,1134],{"emptyLinePlaceholder":16},[994,1472,1474],{"class":996,"line":1473},85,[994,1475,1476],{},"CREATE TRIGGER IF NOT EXISTS update_settings_updated_at \n",[994,1478,1480],{"class":996,"line":1479},86,[994,1481,1482],{},"    AFTER UPDATE ON settings\n",[994,1484,1486],{"class":996,"line":1485},87,[994,1487,1453],{},[994,1489,1491],{"class":996,"line":1490},88,[994,1492,1493],{},"        UPDATE settings SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n",[994,1495,1497],{"class":996,"line":1496},89,[994,1498,1465],{},[994,1500,1502],{"class":996,"line":1501},90,[994,1503,1134],{"emptyLinePlaceholder":16},[994,1505,1507],{"class":996,"line":1506},91,[994,1508,1509],{},"CREATE TRIGGER IF NOT EXISTS update_index_metadata_updated_at \n",[994,1511,1513],{"class":996,"line":1512},92,[994,1514,1515],{},"    AFTER UPDATE ON index_metadata\n",[994,1517,1519],{"class":996,"line":1518},93,[994,1520,1453],{},[994,1522,1524],{"class":996,"line":1523},94,[994,1525,1526],{},"        UPDATE index_metadata SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n",[994,1528,1530],{"class":996,"line":1529},95,[994,1531,1465],{},[994,1533,1535],{"class":996,"line":1534},96,[994,1536,1134],{"emptyLinePlaceholder":16},[994,1538,1540],{"class":996,"line":1539},97,[994,1541,1542],{},"CREATE TRIGGER IF NOT EXISTS update_other_data_updated_at \n",[994,1544,1546],{"class":996,"line":1545},98,[994,1547,1548],{},"    AFTER UPDATE ON other_data\n",[994,1550,1552],{"class":996,"line":1551},99,[994,1553,1453],{},[994,1555,1557],{"class":996,"line":1556},100,[994,1558,1559],{},"        UPDATE other_data SET updated_at = CURRENT_TIMESTAMP WHERE key = NEW.key;\n",[994,1561,1563],{"class":996,"line":1562},101,[994,1564,1465],{},[425,1566,1567,1577],{},[428,1568,1569,1570,955,1573,1576],{},"回到 Pages 项目绑定面板，新增 D1 绑定，",[432,1571,1572],{},"绑定变量名必须是",[706,1574,1575],{},"img_d1","，关联新建数据库",[428,1578,1579],{},"重新部署项目，数据库绑定配置正式生效",[420,1581,1583],{"id":1582},"_46-绑定-kvd1r2-存储","4.6 绑定 KV、D1、R2 存储",[425,1585,1586,1592,1603,1606,1609,1612],{},[428,1587,1588,1589],{},"打开创建好的 CLoudFlare-ImgBed pages 项目，找到设置→绑定\n",[688,1590],{"alt":690,"src":1591},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397068193.avif",[428,1593,1594,1595,1600],{},"添加 KV 或者 D1 其中一个，",[633,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Fblog.nw177.cn\u002Fposts\u002F40-%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA\u002F04-%E8%B5%9B%E5%8D%9A%E5%A4%A7%E5%96%84%E4%BA%BAcloudflare-r2-%E5%9B%BE%E5%BA%8A\u002F#32-%E5%88%9B%E5%BB%BA-r2-%E5%AD%98%E5%82%A8%E6%A1%B6",[637],"再添加 R2 存储",[688,1601],{"alt":690,"src":1602},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397111308.avif",[428,1604,1605],{},"KV 填写，名称：img_url 值：cloudflare_imgbed_kv",[428,1607,1608],{},"D1 数据库，名称：img_d1 值：cloudflare_imgbed_d1",[428,1610,1611],{},"R2 存储桶，名称：img_r2 值：cloudflare_imgbed_r2",[428,1613,1614],{},[432,1615,1616],{},"值，以自己创建的为主，名称必须固定",[420,1618,1620],{"id":1619},"_47-重新部署","4.7 重新部署",[590,1622,1623,1624],{},"设置好一切后，就点击重新部署，那么以上绑定的就会生效。\n",[688,1625],{"alt":690,"src":1626},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397446434.avif",[412,1628],{},[415,1630,1632],{"id":1631},"_5-登录后台以及初始化","5 登录后台以及初始化",[420,1634,1636],{"id":1635},"_51-后台登录密码账号资料填写","5.1 后台登录密码账号资料填写",[425,1638,1639,1642,1645],{},[428,1640,1641],{},"访问 Pages 生成的项目域名，进入初始化配置页面",[428,1643,1644],{},"自定义管理员登录账号、密码，离线备份保存，用于后台登录鉴权",[428,1646,1647,1648],{},"全局权限配置建议关闭匿名上传，防止外部人员恶意上传占用存储额度\n",[688,1649],{"alt":690,"src":1650},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397638502.avif",[420,1652,1654],{"id":1653},"_52-其他-s3-存储桶填写","5.2 其他 S3 存储桶填写",[425,1656,1657,1660,1663,1666],{},[428,1658,1659],{},"S3 Secret Access",[428,1661,1662],{},"S3 Key，私钥凭证",[428,1664,1665],{},"存储桶名称",[428,1667,1668,1669],{},"区域端点地址\n",[688,1670],{"alt":690,"src":1671},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397784865.avif",[412,1673],{},[415,1675,1677],{"id":1676},"_6-功能测试验证","6 功能测试验证",[425,1679,1680,1683,1686,1689,1692,1695,1698],{},[428,1681,1682],{},"基础上传和图片访问测试",[428,1684,1685],{},"使用管理员账号登录后台，上传 PNG \u002F JPG \u002F WebP \u002F GIF 合规图片文件",[428,1687,1688],{},"上传完成页面自动生成 CDN 访问链接，浏览器直接打开链接，图片正常加载无 403 \u002F 500 报错",[428,1690,1691],{},"刷新资源列表页面，已上传图片完整展示，元数据无丢失、错乱",[428,1693,1694],{},"执行图片删除操作，资源同步从 R2 存储、元数据库清除",[428,1696,1697],{},"异常场景校验：上传 exe \u002F zip \u002F txt 非图片文件，接口拦截并返回错误提示",[428,1699,1700,1701,1704,1707],{},"跨域兼容性测试：将图片链接嵌入博客、笔记编辑器，无防盗链拦截，图片正常渲染\n",[688,1702],{"alt":690,"src":1703},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397688920.avif",[688,1705],{"alt":690,"src":1706},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784397998222.avif",[688,1708],{"alt":690,"src":1709},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784398040955.avif",[412,1711],{},[415,1713,1715],{"id":1714},"_7-总结","7 总结",[425,1717,1718,1721,1724,1727,1730],{},[428,1719,1720],{},"Cloudflare ImgBed 采用 Pages + R2 + KV\u002FD1 无服务器架构，免费额度完全覆盖个人使用场景，全球 CDN 解决图片跨地域访问延迟问题",[428,1722,1723],{},"Pages 部署方案自带可视化管理后台，操作门槛低，适配博客站长、笔记用户；纯 Workers 方案仅适合自动化接口调用场景",[428,1725,1726],{},"完整标准化部署流程：Fork 开源仓库 → Pages 创建项目并配置构建参数 → 二选一绑定 KV\u002FD1 元数据存储 → 绑定 R2 对象存储 → 后台初始化配置",[428,1728,1729],{},"生产环境安全规范：所有存储密钥、凭证统一通过 Cloudflare 后台资源绑定注入，禁止前端硬编码密钥，规避资源盗刷风险",[428,1731,1732],{},"平台存在硬性资源约束：Workers 内存上限、R2 10GB 免费存储、KV 容量限制，大量高清原图场景需定期清理闲置图片，防止超出免费配额产生计费",[590,1734,1735],{},"Created with ❤️ by 十三",[1737,1738,1739],"style",{},"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);}",{"title":690,"searchDepth":1003,"depth":1003,"links":1741},[1742,1747,1752,1758,1767,1771,1772],{"id":417,"depth":1003,"text":418,"children":1743},[1744,1745,1746],{"id":422,"depth":1009,"text":423},{"id":447,"depth":1009,"text":448},{"id":480,"depth":1009,"text":481},{"id":500,"depth":1003,"text":501,"children":1748},[1749,1750,1751],{"id":504,"depth":1009,"text":505},{"id":516,"depth":1009,"text":517},{"id":587,"depth":1009,"text":588},{"id":601,"depth":1003,"text":602,"children":1753},[1754,1755,1756,1757],{"id":605,"depth":1009,"text":606},{"id":615,"depth":1009,"text":616},{"id":653,"depth":1009,"text":654},{"id":665,"depth":1009,"text":666},{"id":696,"depth":1003,"text":697,"children":1759},[1760,1761,1762,1763,1764,1765,1766],{"id":700,"depth":1009,"text":701},{"id":734,"depth":1009,"text":735},{"id":776,"depth":1009,"text":777},{"id":845,"depth":1009,"text":846},{"id":852,"depth":1009,"text":853},{"id":1582,"depth":1009,"text":1583},{"id":1619,"depth":1009,"text":1620},{"id":1631,"depth":1003,"text":1632,"children":1768},[1769,1770],{"id":1635,"depth":1009,"text":1636},{"id":1653,"depth":1009,"text":1654},{"id":1676,"depth":1003,"text":1677},{"id":1714,"depth":1003,"text":1715},"md",{"published":64,"author":1775,"image":1776},"十三","https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F07\u002F19\u002F1784398328615.avif",{"title":63,"description":63},"blog\u002F40-博客搭建\u002F08-Cloudflare ImgBed 免费私有图床完整部署手册",[57,66,67],"nvRe9fiMh8waADQDw7Iai4nOVCYhAR0t7Nfq-JO-qiw",[1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839],{"path":6,"title":7,"date":9},{"path":19,"title":20,"date":22},{"path":31,"title":32,"date":34},{"path":42,"title":43,"date":45},{"path":53,"title":54,"date":55},{"path":62,"title":63,"date":64},{"path":70,"title":71,"date":72},{"path":78,"title":79,"date":80},{"path":85,"title":86,"date":87},{"path":92,"title":93,"date":95},{"path":100,"title":101,"date":102},{"path":106,"title":107,"date":108},{"path":112,"title":113,"date":114},{"path":118,"title":119,"date":120},{"path":130,"title":131,"date":132},{"path":139,"title":140,"date":141},{"path":147,"title":148,"date":149},{"path":156,"title":157,"date":158},{"path":165,"title":166,"date":167},{"path":172,"title":173,"date":174},{"path":180,"title":181,"date":182},{"path":186,"title":187,"date":188},{"path":186,"title":192,"date":193},{"path":197,"title":198,"date":199},{"path":204,"title":205,"date":206},{"path":212,"title":213,"date":206},{"path":217,"title":218,"date":206},{"path":223,"title":224,"date":206},{"path":228,"title":229,"date":206},{"path":234,"title":235,"date":206},{"path":239,"title":240,"date":242},{"path":247,"title":248,"date":242},{"path":247,"title":254,"date":242},{"path":247,"title":259,"date":242},{"path":266,"title":267,"date":242},{"path":266,"title":274,"date":242},{"path":278,"title":279,"date":242},{"path":284,"title":285,"date":242},{"path":284,"title":291,"date":242},{"path":284,"title":297,"date":242},{"path":284,"title":301,"date":242},{"path":284,"title":305,"date":242},{"path":284,"title":310,"date":242},{"path":315,"title":316,"date":242},{"path":321,"title":322,"date":242},{"path":321,"title":326,"date":242},{"path":330,"title":331,"date":242},{"path":335,"title":336,"date":242},{"path":342,"title":343,"date":242},{"path":342,"title":348,"date":242},{"path":353,"title":354,"date":242},{"path":361,"title":362,"date":242},{"path":367,"title":368,"date":242},{"path":374,"title":375,"date":242},{"path":380,"title":381,"date":242},{"path":387,"title":388,"date":242},{"path":394,"title":395,"date":242},{"path":380,"title":400,"date":401},1788281982017]