前言
看过我前面文章的知道,其实我已经 通过 Github + jsDelivr + PicGo 配置了免费图床 ,并且一直在使用,那为什么还要闲的没事,自建图床呢?
原因前面也提到过,Github + jsDelivr
的方案什么都好,免费、高效、配置简单,唯一的毛病就是内地这边不太稳定,如果主打海外市场,这个问题可能并不明显,但如果大部分读者都在国内,那还是挺糟心的了。
我一开始还想着反正网站也没什么人访问,而且在我看来大部分访问的人估计也只是看看效果就退出去了,不怎么会详细浏览,所以一直没怎么放在心上,但最近反馈的有点多,所以想着还是自建一个吧,毕竟图床对图片的管理确实太方便了!
于是就在网上搜索并对比了一圈,最终选择了MinIO + PicList的方案,因为该方案与我的运行环境比较契合,部署起来比较简单。
1. 环境准备
我们知道通过 Github + jsDelivr + PicGo
配置图床,真的只需要简单的配置一下就可以了,不需要投入任何资源,可以说是零成本。而自建图床就不一样了,可能至少需要如下准备:
- 一台服务器,并且部署好了
Docker
环境,可以参考 Docker环境部署 这篇文章; - 一个域名,并且做好了域名泛解析,可以参考 域名注册、网站备案、域名解析 的域名解析部分;
- 部署了反向代理服务,可以参考 一款简单易用的反向代理神器 一文;
- 当然,最好也完成
SSL
证书申请(非必须),可以参考 堪称完美的永久泛域名SSL证书免费申请方案 一文。
不难发现,环境的准备还是挺麻烦的,但如果你前面搭建博客的步骤和我一样,那么,这次的图床搭建也会非常简单,事实上前面的每一个步骤都非常简单且很有必要。环境搭建就跟学习一样,基础打牢了,后面的每一步就都简单了。
2. Minio部署
这里我用到了 minio/minio
镜像,这个是官方的,你也可以用 bitnami/minio
,它在 minio/minio
的基础上做了一些扩展,这个虽然是非官方的,但经过了官方认证,用的人也挺多,不过对于我们而言,二者其实没有太大区别。
首先,通过如下命令拉取镜像:
docker pull minio/minio
事实上,也可以省略上述步骤,直接执行下面的脚本启动容器,如果本地没有镜像,会自动从服务端拉取:
docker run --network=ilaozhu_net --name minio -d --restart=always -e "MINIO_ROOT_USER=xxxx" -e "MINIO_ROOT_PASSWORD=xxxxxxxx" -v /data/minio:/data minio/minio server /data --console-address ":9000" --address ":9001"
值得注意的是:
- 需要通过
--network
确保minio
容器和反向代理服务容器(我这里是Nginx Proxy Manager)在同一网络,否则两个容器网络不通,反向代理会不成功; - 通过
MINIO_ROOT_USER
和MINIO_ROOT_PASSWORD
设置登录账号密码,其中,MINIO_ROOT_PASSWORD
必须至少是8
位字符,否则容器启动会报错; - 细心的会发现,我这里没有将
9000
,9001
端口与主机进行端口映射,因为后续会配置反向代理,映射了也用不上,所以干脆省掉了; - 这里的
9000
端口对应的是管理控制台,而9001
对应的是API
接口。
2. 反向代理与证书
其实经过上面的一行脚本,容器就已经部署成功了,但由于没有对外暴露 9000
和 9001
端口,所以还不能访问,还需要配置反向代理做域名映射后才行,域名映射对应关系如下表所示:
域名 | 端口 | 说明 |
---|---|---|
imgr.ilaozhu.com | 9000 | 管理控制台 |
imgs.ilaozhu.com | 9001 | API接口 |
2.1 设置反向代理
2.2 设置SSL证书
2.3 最终效果
一共就只有上面两项需要设置,两个域名都设置完成的最终效果如下图所示:
接下来就可以通过 https://imgr.ilaozhu.com
登录控制台了。
3. 图床设置
图床的设置也很简单,只需要创建桶和授权两个步骤就可以了。
3.1 创建桶
登录后打开主界面,选择 Buckets,并点击Create Bucket,如下图所示:
填写桶名称,最好是用英文。提示说的是下面的特性单磁盘不可用,不用管,直接创建就可以了。
3.2 设置权限
最后一步,把访问权限设置成Public
。
接下来就可以通过控制台上传图片,然后通过https://你的API接口域名/桶名/图片名
来访问了。
4. 设置PicList
如果直接在浏览器上管理图片,不仅功能缺失,而且还很不方便,因此,我们还需要把PicList配置起来。
如何安装PicList就不赘述了,这里主要介绍如何在PicList上安装设置所需的插件。
4.1 安装插件
首先,直接在插件中搜索minio
,第一个就是,安装它。
4.2 配置插件
然后,到已安装的插件列表中,点击插件上的齿轮配置插件。
这里需要特别注意一下的是,已安装的插件列表中还有一个rename-file
插件,这是之前安装的,用来生成文件名称与目录的,现在依然需要。
有了它,无论使用什么图床,都可以保证目录结构和文件命名方式一致,方便迁移,当然,使用这个插件,minio
插件中的自动归档就不能开启了。
好了,到这里所有的安装配置都完成了,去试试操作是否丝滑吧。
5. 图片迁移
配置了新的图床,图片肯定是需要迁移的,好在也不复杂,我们之前的图片全在github
上,现在只需要下载下来,然后整个目录完整上传到新的图床空间中就可以了。
接下来,就可以将原图片链接中的 https://cdn.jsdelivr.net/gh/ZShijun/image-repo
替换成https://imgs.ilaozhu.com/images
,用新地址访问图片了,虽然历史文章替换起来有些麻烦,但总的来讲还是可以接受的。
很明显,这次学聪明了,用上了域名映射,也就是说如果以后还想换成其它更强大的图床,如阿里云OSS
,或腾讯云的COS
等,直接换存储方式和域名映射就可以了,上层使用方式完全不受影响。
结语
好了,到这里自建图床就全部完成了,如果恰好你也用得上,就赶紧部署起来试试吧!
评论6
空白格
大佬,请教个问题,您最后一张图片,从GitHub 迁移的目录能直接在minio 目录下用吗,minio 中的图片实际是个目录+元数据?
tree Actual_A.png/
Actual_A.png/
└── xl.meta
并且如果npm 中不设置 允许 websocket ,minio object broswer 就一直 loading
老朱
我是直接迁移的,并且也没有允许websocket,你看看是不是代理的端口不对,要代理到API接口的这个9001端口
运维学习笔记博客
我喜欢直接把图片放在本地,然后针对图片CDN 上开大缓存策略,这样备份迁移很方便!
老朱
这样也是个好办法
Huo
看起来这个方案很不错,特别想尝试一下!
老朱
用了段时间,感觉还可以😁