自建超简易图床

于由astupidcoder发布

  自从开始用markdown写东西之后,就不习惯word这种富文本编辑器,调整格式手就要离开键盘,很烦的。但markdown有一点不好,大部分的markdown编辑器,特别是我最喜欢使用的Typora,没有自带图床功能,你如果使用本地图片,分享给别人图就会挂掉,因此有使用图床的必要。
  之前经人介绍,使用了七牛云。要说七牛云其实很厚道的,像我这种不交钱的用户,也能长期给维护一个固定的“临时域名”,于是我就用七牛云当了一年多的免费图床。刚才收到七牛云官方邮件,说要修改临时域名的规则,以后临时域名每一个月就要收回一次。于是七牛云的免费图床就不稳定了,一个月换一次图片地址,谁受得了啊。但还是感谢七牛云,大家都要吃饭,免费服务那么多用户,维持那么多长期域名,怕不是很多人直接用它的免费服务当生产环境的CDN?
  于是琢磨着自建一个图床。到底怎么建成了问题。刚好手头有这个域名,而且有一个完全掌控的VPS主机(而不是共享域名,共享域名估计得用ftp上传图片,麻烦多了),而且前几天刚学会了rclone大法,于是事情简单地连post都不用写,下面就分享一下我的方法。
  首先,你得有一个OneDrive,如果可以登录GoogleDrive,有个GD也是可以的。我们以OneDrive为例。首先登录你的服务器:

curl https://rclone.org/install.sh | sudo bash
# 按提示安装好rclone
rclone config

按照rclone官方手册:onedrive挂载的步骤,一步一步做下来。

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> n
name> MyOnedrive                        #起个名字,这以后要用的。
Type of storage to configure.
Choose a number from below, or type in your own value
 1 / Alias for a existing remote
   \ "alias"
 2 / Amazon Drive
   \ "amazon cloud drive"
 3 / Amazon S3 Compliant Storage Providers (AWS, Ceph, Dreamhost, IBM COS, Minio)
   \ "s3"
 4 / Backblaze B2
   \ "b2"
 5 / Box
   \ "box"
 6 / Cache a remote
   \ "cache"
 7 / Dropbox
   \ "dropbox"
 8 / Encrypt/Decrypt a remote
   \ "crypt"
 9 / FTP Connection
   \ "ftp"
10 / Google Cloud Storage (this is not Google Drive)
   \ "google cloud storage"
11 / Google Drive
   \ "drive"
12 / Hubic
   \ "hubic"
13 / Local Disk
   \ "local"
14 / Mega
   \ "mega"
15 / Microsoft Azure Blob Storage
   \ "azureblob"
16 / Microsoft OneDrive
   \ "onedrive"
17 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ "swift"
18 / Pcloud
   \ "pcloud"
19 / QingCloud Object Storage
   \ "qingstor"
20 / SSH/SFTP Connection
   \ "sftp"
21 / Webdav
   \ "webdav"
22 / Yandex Disk
   \ "yandex"
23 / http Connection
   \ "http"
Storage> 16             #表示选择onedrive
Microsoft App Client Id - leave blank normally.
client_id>              #说一般留空,那就留空
Microsoft App Client Secret - leave blank normally.
client_secret>              #说一般留空,那就留空
Remote config
Choose OneDrive account type?
 * Say b for a OneDrive business account
 * Say p for a personal OneDrive account
b) Business
p) Personal
b/p> p                  #一般应该是个人版,选p
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n                  #在vps上一般都是N
For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine:
    rclone authorize "onedrive"
Then paste the result below:
result>                 #在本地电脑上粘贴上面这行命令,以弹出授权界面,之后把授权界面的东西粘贴到这里来,因为我已经做过了,这一步就不做了。
#接下来都是一些无关痛痒的提示信息,再接下来弹出这个界面
[remote]
client_id =
client_secret =
token = {"access_token":"XXXXXX"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y                    确定

这样,用rclone挂载onedrive就配置好了。之后在你的电脑上的html目录下建一个文件夹,假设html目录为/var/www/html,新建了一个/var/www/html/my-img-bed/,则可以运行以下命令

rclone mount MyOnedrive:folder-name /var/www/html/my-img-bed/ --allow-other --uid 33 --gid 33 --daemon

注意,其中MyOnedrive是你在上面rclone config时输入的名字,而folder-name是你onedrive中的某个文件夹。
至此,服务器端配置就完成了。
此时我们需要在本地端进行一些小的配置,我用的是MacOS,理论上linux是一样的,但是windows得用别的办法,不在我的考虑范围啦。
在本地安装好OneDrive下载,这玩意相当于一个同步盘,具体设置不缀,总之相当于将你本地的一个文件夹作为onedrive的本地缓存,与onedrive相互同步。假设我们的同步文件夹目录为/Users/user-name/one-drive-sync/
那么我们可以写一个这样的脚本

#!/bin/bash
#假设这个脚本命名为up2od
var=1
name={var##*/}             #取路径中的文件名
mv var "/Users/user-name/one-drive-sync/folder-name/"name
echo "!["name"](https://www.yourdomain.com/my-img-bed/"name")" | pbcopy
echo "上传成功,已复制到剪贴板"

其中pbcopy是MacOS操作粘贴板的命令,表示将结果复制到粘贴板。linux不一样,好像需要安装一个xsel,不是很清楚,请自行查询吧。我这里直接对链接进行了处理,处理成了markdown可识别的图片字符串格式。即![tag](url)这样。
其中folder-name是上面rclone mount命令中挂载的那个文件夹名字。
之后进行一些权限处理

#假设上面的脚本命名为up2od
sudo chmod +x ./up2od
sudo mv ./up2od /usr/local/bin/up2od

之后就可以这么愉快地使用命令了:

up2od /path/to/img-name.jpg

然后直接去markdown里粘贴,就会有
![img-name.jpg](https://www.yourdomain.com/my-img-bed/img-name.jpg)
因为同步需要一定时间,所以不像七牛云那样上传上去立即可用,大概5s之后图片才能真正刷出来,但是肯定不会出错的。
要注意的是,我这个脚本没有处理重名的能力,如果你不小心把一个重名的图片用这种方式上传,将会覆盖旧的重名文件,因为我本人命名文件有自己的格式,保证绝不重名,所以就懒得写复杂的重命名了,有需求的人士可以自行修改。
话说以前七牛还是很好用的,附送一份七牛云的上传图片代码吧。python3写的。

#!/usr/bin/env python3

"""
用于向七牛云上传一个资源,并获得资源的网址,好用于在markdown里的快速粘贴
"""

def upload(filename):
    import qiniu
    import os
    access_key = "your-access-key"  #这两个字符串需要去七牛云自己的账户页面下查找
    secret_key = "your-secret-key"
    q = qiniu.Auth(access_key,secret_key)
    bucket_name = "your-bucket_name" #需要去七牛云自己的账户页面下查找
    key = os.path.basename(filename)
    token = q.upload_token(bucket_name, key, 3600)

    return qiniu.put_file(token, key, filename)

if __name__=="__main__":
    import sys
    if len(sys.argv) != 2:
        print("需要一个文件名作为参数")
    else:
        ret, info = upload(sys.argv[1])
        if ret == None:
            print("上传哪里出错了")
        else:
            import pyperclip, os
            fn = os.path.basename(sys.argv[1])
            pyperclip.copy("![" + fn + "](http://your-suffix.clouddn.com" + "/" + fn + ")")
            print("上传成功,已复制网址到粘贴板")

其中pyperclip需要pip3 install pyperclip,都一样可以直接粘贴成markdown的图片格式。
最后,其实聪明人已经发现了,rclone可以用来扩展小硬盘容量VPS的硬盘容量,这就是很多大容量网盘的用处了……某家的无限容量网盘挂上去,df -h一下,你就会看到一个1PB的盘,在某些机子中显示是1EB,爽歪歪的,即使是office 365,1T的网盘空间也足够让你的VPS成为伪无限容量了。但是rclone挂载的盘读取速度会略慢,而且大规模读取时特别特别特别烧CPU,基本满载,卡的连挂在vps上的网页都打不开,但大部分时候rclone都很安静,还不错。


1 条评论

D · 2018年12月29日 下午4:40

本来是搜“onedrive图床”的问题,就看到这了。。。
最近在看《浮生六记》,这儿正好叫做“浮生十六记”
然后翻了博客,结果半天就过去了。。。(我是多么的闲?)
全部看下来,也没有发现什么联系方式,就更加好奇了。。。
到底是个清新、文弱 白衬衫的小哥哥,还是油腻中年的大汉,当然,是个姑娘最好不过了
准备建个博客,写点碎碎念的小白 留
新年快乐~

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据。