第三方图床不好用

搭建完成博客,还需要配置图床,研究了一番,基本上都是推荐用upic,picGo等工具,操作一把发现都不行,情况如下

  1. Gitee,已经封掉了外链

  2. SMMS,需要注册账号

  3. 阿里云oss/腾讯云等,需要注册,然后购买服务,如果要开CDN,域名要备案

对博客来说,流量不大,放本机就行,也懒得备案,这样维护成本最低,迁移的时候连带目录一起copy就行

用本机做图床需要下面两个步骤

配置图片域名

  1. 解析域名的时候最好启用泛域名解析
  2. vps上安装nginx,apt install nginx

然后在nginx conf 里面做如下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
 server {
        listen 80;
        listen 443 ssl http2;
        server_name img.victorc.top;
        ssl_certificate /etc/nginx/ssl/fullchain.cer;
        ssl_certificate_key /etc/nginx/ssl/victorc.top.key;
        add_header                 Strict-Transport-Security "max-age=31536000; preload; includeSubDomains" always;
        add_header                 X-Frame-Options SAMEORIGIN;

        if ($scheme != 'https') {
          rewrite ^(.*)$  https://$server_name$1 permanent;
        } 

        location / {
          root   /var/www/html/blogpics;
        }
}

在/var/www/html/下面创建一个 可写的blogpics目录,图片直接scp 到这个目录中,然后就可以通过https://img.victorc.top/xxx 进行访问了

PicGo用golang写自定义图床上传服务

作者是用golang写了一个简单接受post的服务,部署比较方便,但是上传图片只是偶发行为,一天就1-2次,没有必要后台一直跑着这个程序,比较浪费,直接用scp 上传就很省事.Typora正好支持在粘贴/插入图片之后,执行自定义命令,这个命令是任意脚本,而且协议非常简单

Typora上传服务设定

先在typora的配置中勾选插入图片操作

img

typora会把复制到粘贴板的图片保存到/var/开头的路径,所以写了个简单的python程序来进行上传

  • 图片按月分组,每个月一个目录
  • 支持远程下载图片,并且根据文件格式把乱七八糟的文件名改正确
  • 如果是python3需要安装 pillow包,python2 安装PIL
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from datetime import datetime
from os.path import basename
import sys
import os
from PIL import Image
import time


def fake_down(f):
	if f.startswith("/var/"):
		tmp_name = f"/tmp/{int(time.time()*1000)}"
		i = Image.open(f)
		ext = i.format.lower()
		i.close()
		new_name = f"{tmp_name}.{ext}"
		os.rename(f,new_name)
		return new_name
	else:
		return f


def main():
	if len(sys.argv)<2:return
	t = datetime.now()
	p = t.strftime("%Y-%m")
	os.system(f"ssh 主机 'mkdir -p /var/www/html/blogpics/{p}'")
	print("Upload Success:")
	for l in sys.argv[1:]:
		l = fake_down(l)
		bname = basename(l)
		cmd=f"scp \"{l}\" 主机:/var/www/html/blogpics/{p}/{bname}"
		os.system(cmd)
		print(f"https://img.victorc.top/{p}/{bname}")



if __name__ == '__main__':
	main()