专属自己的图床,你值得拥有

我打算写一个搭建博客的系列,所有在自己做博客过程中遇到的问题,解决的问题,都记录下来,希望能对大家有所帮助,这一篇我们聊聊博客中用到的图片存储的问题。

Posted by figotan on April 11, 2016

折腾了一段时间,博客的托管是弄好了,基本的写作和发布流程也已经梳理清楚,但是写博客不同于高中写周记或者上班敲代码,前两者只关乎于文字和code,顶多全栈哥还会摆弄摆弄PS,为了让博客更生动有趣些,难免会花心思搞搞图片,所以,问题来了,图存哪儿?

这确实是个大伤脑筋的问题!

现状

幸好已经有无数个解决方案了

  • 最懒的办法,直接和文章的托管放在一起
  • 托管在微博
  • 托管在第三方的图床里
  • 托管在公有云存储中
  • 托管在自己的VPS中,或者自己租用的服务器上,需要自己搭建服务,比如Owncloud之类,或者自己编写图片管理平台系统
  • 自己利用免费的PAAS平台,搭建专属自己的图床

以上任何一种方式或者几种方式自由组合都可以满足一般的需求,或者全上都可以。

如果权衡利弊,总有可以选择一个更合适的,下面从几个维度说说各自的优势和问题。

和文章一起丢在VCS中

好处是托管方便,零人力成本和时间成本,坏处是边写想边看效果就的花时间了,第一步先把图从某处放到VCS签出到本地的某目录下,然后把图签入到远程VCS,然后文章里引用图片的地址,然后看效果,如果不满意又得来一次。真是够了,那不能直接引用别人网站上的图吗?可以,先不说版权的问题,如果被引用的网站因为它们产品经理的要求快速迭代导致你的文章上线第三天图片失效了咋办?这样确实稳定性很差,第二个问题是如果你对原图不满意,需要修图咋办?那就和文章丢一起咯,所以预览效果就的忍了。不能忍的接着看。。。

托管在微博

记得有篇帖子说可以把图片直接托管在微博的,省心省力,几乎无成本,预览方便,修改也方便,是不是看到这里就可以了?基本上是,不过前提是你的图不会因为某种原因丢失或者你已经非常信赖微博。其实不想自己折腾的看到这里就可以了,想自己玩的继续往下看。

托管在第三方的图床

抱歉,我这里并不想给谁谁谁家的图床打广告,所以不列举哪家的靠谱不靠谱。总的来说,应该是靠谱的,不过谷歌也经常关闭它家不赚钱的服务的,所以继续看咯。

托管在公有云存储

其实这个和上个类似,比如放在Dropbox,七牛等等等等,你还得考虑国内能不能用,访问速度如何?收费如何?稳定性如何?想来想去,还是自己做吧。

自己做

托管在自己的VPS中,或者自己租用的服务器上,需要自己搭建服务,比如Owncloud之类,或者自己编写图片管理平台系统。Owncloud是不错,可惜引用不方便,你要做的是登录,上传图,获取分享链接,然后贴到文章里,好繁琐的。那么自己做一个呢?时间和人力成本来了。以前看过一篇文章讲一个产品经理如何做了一个多么牛逼的图床产品,各种好,可惜不开源。好了,下面我告诉你如何做一个简单够用的图床,恩,其实已经做好了,你要做的只是部署而已。

如何拥有一个专属自己的图床

当然,如果你想分享自己的图床给别人也是可以的,专属只是为了区别微博大锅饭而已。言归正传,第一步是服务器选型。

服务器选型

我是不会阻止你购买Amazon S3,Digital Ocean, Vultr, Linode, 阿里云,*AE的,花钱可以节省时间,没错,同样,我也会告诉你不花钱的时候,也可以节省时间,比如用RED HAT旗下的Openshift。关于注册和安装不多说,只捡几个需要重点注意的坑说下:

  1. 记得本地生成ssh公钥私钥,并将公钥传到Openshift平台
  2. 用rhc客户端访问注册的服务确实比较方便,记得rhc是Ruby编写的,所以得先安装Ruby的环境
  3. 因为图床选用的是PHP,所以建议注册一个基于PHP开发环境的服务
  4. 每个单独的服务(学名gear)拥有1G的免费空间,所以省着点用吧,个人拍脑袋感觉写博客够用了,如果是P(拍)H(黄)P(片)真心是不够的

图床/云存储选型

可选的说多也不多,比如上Github搜索,也许会找出一大把,实在不行就用Owncloud,Openshift原生支持Owncloud,不过笔者选用的是这个CF Image Host,why? 因为它足够简单,所以好改造;基本功能齐全,操作简单,满足需求。
你可以拿它的代码自己改造后部署到Openshift,也可以直接用我改造过的

我做了啥

叨逼叨逼这么多,我觉得最后才是重点,我说说我做了啥吧

  • 将upload目录下的文件和目录放到OPENSHIFT_DATA_DIR下,因为这篇文档里说这个目录是持久化的数据目录,而CF Image Host的upload目录的内容是上传文件后生成的,需要写权限,而且需要持久化,所以放在这里最合适。
  • 将原本保存在inc/set.php里的设置数据转移到OPENSHIFT_DATA_DIR/upload下,并改写CF Image Host里所有引用set.php的地方,因为这个文件同样需要写权限以及持久化,所以放在OPENSHIFT_DATA_DIR下。
  • 因为install目录随代码一起签入了远程git仓库,所以删除操作也变得不方便,需要修改代码之后再签入,所以为了节省这一步,增加了.installed文件用于判断系统是否安装,如果部署完系统后安装成功,则写入.installed,index.php里判断是否存在.installed,如果存在表示已经安装过,直接进图床主界面,如果没有这个文件表示没有安装,则跳转到install引导界面。
  • 修复了原来代码中REMOTE上传失败的问题。原因是原来的代码中,本地和远程上传共用同一段逻辑,但是逻辑处理错误,而且利用curl下载远程上传的文件后并没有获取到mine类型和大小,也导致了上传失败。
  • 增加了百度统计,原来的CF Image Host是老外做的,所以只支持Google Analytics而且代码很旧了,我升级了GA的统计代码,顺便加上了百度统计,方便查看国内用户的访问数据。

我觉得我说清楚了,所以不贴代码,我将坚持写文字,尽量不贴代码,想看代码直接去Github或者Gitlab

总结

简单的说,如果你觉的各种微博,第三方的各种托管图床你觉的不靠谱不过瘾的话,那么就自己来吧,我这里给你一个虽然做得不咋的但是可以用的参考,欢迎各种拍以及PR。

最后

鸡冻的等待merge中,以及献上我的图床效果

什么,竟然访问不了!擦,原来是Openshift悲剧的被墙了!被墙了!被墙了!被墙了!重要的事情不止说三遍。
所以,如果你选用Openshift做为图床的话,需要解决被墙的问题
我这里的参考答案是:

  1. 不要使用Openshift自动分配的域名,而是去Openshift web portal将提供图床服务的gear绑定为国内可以访问的域名
  2. 到域名供应商的后台配置中设置CNAME

再看看效果

感谢中

目前没有感谢,感谢在等待大家的PR,所以我留空了