极空间 NAS 搭建私人图床全流程
折腾完整套流程后做的总结。从零搭建一个公网可访问、HTTPS 加密、支持博客嵌入的私人图床,无需公网 IP、无需付费 VPS,只需一台极空间 NAS 和一个域名。
方案概览
整套方案由四个部分串联而成:
EasyImage:图床主程序,跑在极空间的 Docker 容器里
Cloudflare Tunnel:内网穿透,把家里的图床暴露到公网且自带 HTTPS
自有域名:DNS 托管在 Cloudflare,作为图床访问入口
PicGo:本地客户端,实现"粘贴图片自动上传 → 返回 URL"的工作流
最终效果:在 Typora 或 Obsidian 里写博客时,截图粘贴进去就自动上传到 NAS,并被替换为公网 URL,全程零手动操作。
为什么选这套方案
数据自主:图片存在自己的 NAS 上,不依赖公有云图床的稳定性和政策
零成本:除了域名(几块钱一年)外,Cloudflare Free 套餐 + 自有硬件,月成本为零
HTTPS 自动续期:Cloudflare 自动签发证书,再也不用折腾 Let's Encrypt
全球 CDN 加速:Cloudflare 边缘节点缓存,博客读者访问图片速度比直连 NAS 快得多
无需公网 IP:Tunnel 走的是长连接反向通道,运营商给你的是大内网也能用
适用场景与限制
适合个人博客图床、笔记图片仓库、技术文章配图等轻量场景。
不适合的场景:
大量视频/音频分发(Cloudflare TOS 2.8 条款限制非 HTML 媒体的大流量分发)
商业级图片站
对国内访问延迟极度敏感的场景(Cloudflare 国内边缘节点高峰期不稳定)
第一步:域名接入 Cloudflare
如果域名是在 Cloudflare 直接注册的,跳过此步。否则需要把 DNS 托管过来。
登录 dash.cloudflare.com,点击 Add a site,输入你的域名,选择 Free 套餐
Cloudflare 会自动扫描现有 DNS 记录,并分配两个 NS 服务器地址(形如
xxx.ns.cloudflare.com)登录你购买域名的服务商后台(阿里云 / 腾讯云 / Namecheap 等),将域名的 NS 服务器修改为 Cloudflare 提供的两个地址
等待 NS 生效,通常 5 分钟到数小时不等,Cloudflare 后台会提示 Active
第二步:极空间部署 EasyImage 图床
打开极空间 Docker → Compose → 新增项目,项目名填 easyimage,粘贴以下配置:
services:
easyimage:
image: ddsderek/easyimage:latest
container_name: easyimage
restart: unless-stopped
ports:
- '8631:80'
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=1000
- DEBUG=false
volumes:
- /vol1/1000/Docker/easyimage/config:/app/web/config
- /vol1/1000/Docker/easyimage/i:/app/web/i
两个 volumes 路径替换为 NAS 上的实际目录:先在 Docker 目录下创建 easyimage/config 和 easyimage/i 两个文件夹,再用"查询路径"按钮把对应绝对路径填进去。/i 是图片实际存储位置,务必映射到本地,否则容器删除后图片全部丢失。
如果镜像拉取失败,在极空间 Docker → 设置 → 仓库里换一个国内镜像加速器。
部署成功后浏览器访问 http://极空间IP:8631,按引导完成初始化:
环境检测全部通过
数据库选择 SQLite(默认,无需额外配置)
设置管理员账号和密码
链接域名先随便填,后面会改
第三步:Cloudflare 创建 Tunnel
在 Cloudflare Dashboard 左侧菜单进入 Zero Trust
首次进入需要选择套餐,选 Free 计划。如提示绑定信用卡,国内用户可用支持外币的虚拟卡或 PayPal
进入 Zero Trust 后,左侧 Networks → Tunnels → Create a tunnel
连接器类型选 Cloudflared(不是 WARP Connector),点 Next
隧道名填
nas-tunnel之类的标识,Save下一页"Install and run a connector"中,选 Docker 标签
页面会显示一条形如
docker run cloudflare/cloudflared:latest tunnel run --token eyJh...的命令,复制其中--token后面那一长串字符并妥善保存先不要关闭这个页面,待会儿回来继续配置
第四步:极空间部署 cloudflared
回到极空间 Docker → Compose → 新增项目,项目名填 cloudflared:
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
network_mode: host
command: tunnel --no-autoupdate run --token 此处粘贴上一步复制的token
environment:
- TZ=Asia/Shanghai
network_mode: host 是关键——cloudflared 需要回连到极空间本机的 8631 端口,host 模式最省事。
部署完成后回到 Cloudflare 那个创建 Tunnel 的页面,刷新几秒后会看到 Connector 状态变为 HEALTHY(绿色),点 Next。
第五步:配置 Public Hostname
在 Tunnel 的 Public Hostname 配置页面填写:
字段内容SubdomainimgDomain下拉选择你的域名Path留空TypeHTTPURLlocalhost:8631
Type 选 HTTP 而非 HTTPS,因为 cloudflared 到图床走的是本机内网,图床本身没有 SSL。用户到 Cloudflare 那一段会自动启用 HTTPS,这正是我们想要的效果。
展开 Additional application settings → HTTP Settings:
Connection Timeout 调到 60s
TLS Timeout 调到 30s
其他保持默认
保存后访问 https://img.yourdomain.com,看到 EasyImage 登录页且地址栏带 HTTPS 小锁,说明链路打通。
第六步:图床后台安全配置(关键)
这一步是整个流程中最容易踩坑的部分,必须按顺序设置完整。
网站设置
链接域名:改为
https://img.yourdomain.com(带 https,不带末尾斜杠)上传后图片直接 URL 就会以这个域名为前缀
安全设置(重点)

仅登录上传:打开,关闭游客上传权限
API上传:必须打开,否则 PicGo 等客户端无法工作
API 请求频率限制:测试阶段调高,避免自己被限流
这一步是最大的坑。后台上传正常但 PicGo 上传"进度走完无反应",多半是这里没开 API 上传。
上传设置
限制图片类型:jpg / png / gif / webp
单文件大小限制:建议 20MB 以内(Cloudflare Free Tunnel 大文件易超时)
开启 WebP 转换:节省流量,加快加载
开启图片压缩
用户管理
进入个人资料,生成 API Token 并妥善保存,后续 PicGo 配置要用
关闭注册功能,仅保留管理员账号
第七步:Cloudflare 侧加固和加速
回到 Cloudflare 主面板(不是 Zero Trust),选中你的域名进行配置。
SSL/TLS
Overview:模式选 Full(不要选 Full Strict,因为图床后端是 HTTP)
Edge Certificates:打开 Always Use HTTPS、Automatic HTTPS Rewrites
缓存加速
Caching → Configuration:Browser Cache TTL 设置为 1 个月
Rules → Cache Rules:新建规则,对
img.yourdomain.com/i/*路径设置:Cache eligibility:Eligible for cache
Edge TTL:1 month
这样图片会缓存在 Cloudflare 全球边缘节点,博客访问速度显著提升
安全防护
Security → WAF:保持默认,免费版自带基础 DDoS 防护
Security → Bots:开启 Bot Fight Mode(免费)
第八步:配置 PicGo 实现自动上传
PicGo 是把工作流体验拉满的关键环节,强烈建议配置。
安装与配置
从官网下载安装 PicGo
进入 插件设置,搜索并安装
picgo-plugin-easyimage(专用插件,比通用 web-uploader 稳定得多)如果搜索不到插件,需要先安装 Node.js,因为 PicGo 装插件依赖 npm
图床设置
图床设置中会出现 easyimage 选项,填写:
字段内容API地址https://img.yourdomain.com/api/index.phpToken后台用户资料中生成的 Token图床域名留空(使用 API 域名)图片质量85转 WebP按需开启
设为默认图床。
验证可用性
拖一张图片到 PicGo 主界面测试。如果"进度走完无反应",按以下顺序排查:
后台是否开启 API 上传:EasyImage 后台 → 安全设置 → 开启 API 上传(这是最常见的坑)
Token 是否正确:复制时不要带空格
打开 PicGo 日志:设置 → 打开日志文件
Windows:%APPDATA%/picgo/picgo.logmacOS:~/.picgo/picgo.log
看具体报错:
403或token error→ Token 配置问题200但解析失败 → 升级 EasyImage 镜像版本timeout→ 图片太大或 Tunnel 超时
工作流接入
配置 Typora:文件 → 偏好设置 → 图像:
插入图片时:上传图片
上传服务:PicGo(app)
设置 PicGo 路径
Obsidian 安装 image-auto-upload-plugin 插件,配置 PicGo Server 地址(默认 http://127.0.0.1:36677/upload)。
之后在编辑器中粘贴图片会自动上传并替换为公网 URL,整个流程无需手动操作。
博客中使用
上传图片后,EasyImage 会返回形如 https://img.yourdomain.com/i/2026/05/19/xxx.webp 的链接,直接复制到 Markdown 中即可:
打开浏览器 DevTools → Network 面板,查看图片请求的 Response Headers,第二次访问起应该能看到 cf-cache-status: HIT,说明 Cloudflare 缓存已生效。
常见踩坑点汇总
整个搭建过程中最容易翻车的几个地方,单独列出来:
PicGo 上传无反应:99% 是 EasyImage 后台没开启 API 上传,去安全设置里打开开关即可。
Cloudflare Tunnel 大文件上传超时:Free 套餐单文件 100MB 是理论值,实际超过 30MB 就容易超时。建议在图床后台限制单文件 20MB 以内,并开启图片压缩。
Token 等同密码:不要贴到公开仓库、不要截图分享。一旦泄漏,他人可以无限往你 NAS 写图。
域名解析没生效:NS 切换到 Cloudflare 后,可能要等几个小时才能 Active。可以用 dig your-domain.com NS 查看当前 NS 状态。
容器映射路径必须落到本地:图片目录 /i 一定要映射到 NAS 本地路径,否则容器一删数据全没。
SSL 模式选 Full 而非 Full Strict:图床后端是 HTTP(仅在本机),Full Strict 会因为后端无证书而握手失败。
国内访问偶尔卡顿:Cloudflare 国内边缘节点高峰期不稳定。如果博客主要面向国内读者且对速度敏感,可以考虑回源到 Cloudflare 套一层国内 CDN(七牛云、又拍云免费额度可用),或直接换用国内对象存储做图床。
后续可选优化
定时备份:在极空间里跑一个 rclone 容器,定时把
easyimage/i同步到阿里云 OSS / 腾讯云 COS 冷归档,防止 NAS 硬盘故障去重压缩:用 EasyImage 自带的相似图片检测,定期清理重复上传
统计分析:Cloudflare Analytics 免费查看流量、命中率、地域分布
多域名分流:再起一个 Tunnel 用
static.yourdomain.com,给其他服务做反向代理
总结
整套方案跑通后,运维成本几乎为零:
极空间长期开机,容器自启
Cloudflare 自动续证书、自动 CDN 缓存
写博客时无需关心图片在哪里、URL 怎么来
回头看最有价值的几个决策点:选 EasyImage 而非 Lsky Pro(避免维护 MySQL)、选 Cloudflare Tunnel 而非自建反代(避免公网 IP 依赖和证书续期)、选 picgo-plugin-easyimage 专用插件而非通用 web-uploader(避免配置踩坑)。每一步都选择了"维护负担最小"的那条路。
如果你也在用极空间或类似的国产 NAS,这套方案可以无脑套用。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
