VPS搭建Chevereto私有图床

  1. 1. Chevereto图床简介
  2. 2. 搭建前的环境准备
    1. 2.1 Docker环境搭建
    2. 2.2 Docker-MySQL环境搭建
      1. 2.2.1 搜索MySQL镜像
      2. 2.2.2 拉取MySQL镜像
      3. 2.2.3 创建实例容器并运行
      4. 2.2.4 创建数据库及用户
  3. 3. 搭建Chevereto图床
    1. 3.1 通过Installer部署
      1. 3.1.1 宝塔面板安装PHP和Nginx环境
      2. 3.1.2 将Installer上传至网站根目录
      3. 3.1.3 添加Nginx规则
      4. 3.1.4 执行Chevereto安装过程
    2. 3.2 通过Docker部署
      1. 3.2.1 拉取Chevereto的docker镜像
      2. 3.2.2 创建Chevereto的docker容器并运行
      3. 3.2.3 执行Chevereto的安装过程
  4. 4. Chevereto图床优化
    1. 4.1 申请泛域名SSL证书并开启HTTPS
      1. 4.1.1 安装 acme.sh
      2. 4.1.2 生成SSL泛域名证书
      3. 4.1.3 给网站开启HTTPS
    2. 4.2 Chevereto基本设置及上传API
      1. 4.2.1 Chevereto基本设置
      2. 4.2.2 获取Chevereto的上传API
  5. 5. 配置自动上传Chevereto图床
    1. 5.1 使用ShareX工具实现截图处理上传
      1. 5.1.1 下载安装ShareX工具
      2. 5.1.2 在ShareX里配置Chevereto API
    2. 5.2 使用Typora+Python脚本实现自动上传
      1. 5.2.1 准备Python脚本和JSON配置文件
      2. 5.2.2 配置Typora的Custom Command功能
  6. 6. 参考资料

1. Chevereto图床简介

图床:也就是专门提供存储图片的地方,我们上传好图片,就可以通过外链/API等方式访问了。图床分为公共图床和自建图床。

  • 公共图床,会用各种技术帮我们做图片相关的优化和服务,比如CDN 加速、图片处理、图片鉴黄、文本识别等等,我们不需要担心硬盘空间不足等问题。
  • 而下文介绍的Chevereto属于私有图床,将其建立在国内服务器或者套上合适的CDN,都可以为我们访问照片加速,大大加快打开网页的速度。除了储存、处理、分发照片外,Chevereto还可以作为个人分享和收集优秀图片的平台。

Chevereto图床

2. 搭建前的环境准备

以下我将采用宝塔面板与Docker混合部署的方式(宝塔面板安装PHP和Nginx环境并开启HTTPS,Docker安装MySQL),VPS系统用的是Debian 10 x86_64。

VPS的购买及配置、域名解析、宝塔面板的搭建及使用、Docker的概念及使用…这些基本的就不再赘述了,如果不会的话见我的另一篇博客:VPS基本部署环境的搭建与配置

图床的话最好是开启个CDN服务,可以减轻服务器压力,提高访问速度,由于Cloudflare CDN对于国内访问的效果提升不大,这里我就不加了。

2.1 Docker环境搭建

1
2
3
4
$ apt-get update -y && apt-get install curl -y  # 安装curl
$ curl https://get.docker.com | sh - # 安装docker
$ sudo systemctl start docker # 启动docker服务
$ docker version # 查看docker版本(客户端要与服务端一致)

2.2 Docker-MySQL环境搭建

2.2.1 搜索MySQL镜像

1
$ docker search mysql

docker-mysql

通常选择OFFICIAL里Star数最多的那个镜像,即mysql。

2.2.2 拉取MySQL镜像

1
$ docker pull mysql:5.7

2.2.3 创建实例容器并运行

1
2
3
4
5
6
7
$ docker run -p 3306:3306 --name mysql \
-e TZ=Asia/Shanghai \
-v /mydocker/mysql/conf:/etc/mysql/conf.d \
-v /mydocker/mysql/logs:/var/log/mysql \
-v /mydocker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=[password] \
-d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

命令解释说明:

1
2
3
4
5
6
7
-p 3306:3306:将主机的3306端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-e TZ=Asia/Shanghai:时区是使用了世界标准时间(UTC)。因为在中国使用,所以需要把时区改成东八区的。
-e MYSQL_ROOT_PASSWORD=[password]:初始化 root 用户的密码。
-d mysql:5.7 : 后台程序运行mysql5.7
--character-set-server=utf8mb4 :设置字符集
--collation-server=utf8mb4_unicode_ci:设置校对集

设置开机自启

1
$ docker update mysql --restart=always

2.2.4 创建数据库及用户

在本地使用Navicat工具使用root用户连接上该数据库(国外服务器建议配置代理),使用如下四条命令创建数据库及用户。

1
2
3
4
5
6
7
8
9
10
11
--创建新的数据库,并设置数据库编码
$ CREATE DATABASE 你的数据库名 DEFAULT CHARSET=utf8 DEFAULT COLLATE utf8_unicode_ci;

--创建新的用户
$ CREATE USER '你的用户名'@'你的服务器IP' IDENTIFIED BY '你的密码';

--把数据库的管理权限给予刚刚创建的MySQL用户
$ GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'%';

--刷新权限,使用设置生效
$ FLUSH PRIVILEGES;

注:如果连接数据库时出现Access denied for user '用户名'@'某IP' (using password: YES)问题,则是第三句授权出了问题,你的本地外网IP被拦截了,那个’%’代表的是访问IP不受限制。

3. 搭建Chevereto图床

Chevereto的搭建以下介绍 通过官方提供的Installer部署、通过Docker部署 两种方式,我后续的优化和配置都是基于第一种部署方式。

3.1 通过Installer部署

3.1.1 宝塔面板安装PHP和Nginx环境

宝塔面板——软件商店,搜索PHP和Nginx进行安装(我选用的版本分别是 Nginx 1.18.0、PHP 7.4),安装方式建议采用编译安装,根据自己的实际需求来即可。

注:本文使用的installer.php是2.2.2版本的,PHP的最低支持是7.4,如果版本再低了无法安装。

3.1.2 将Installer上传至网站根目录

Step1:新建网站

宝塔面板——网站——添加站点——填写域名、选择PHP版本即可(不用创建数据库和FTP)

注:如果你不采用上文所述的docker-mysql,那就要去软件商店安装一个mysql,并在这里创建数据库。下图提示的未安装数据库不用管,是因为宝塔检测不到docker部署的环境。

宝塔面板新建站点

Step2:下载Installer并将Installer上传至网站根目录

官方提供的Installer:Chevereto Installer Github项目地址:https://github.com/chevereto/installer

宝塔面板——文件——打开/www/wwwroot/example.com,把installer上传上去即可。

3.1.3 添加Nginx规则

宝塔面板——网站——指定站点的“设置”——配置文件,将以下规则放入server{}代码块中,并reload或restart nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Chevereto nginx generated rules
## Disable access to sensitive files
location ~* /(app|content|lib)/.*\.(po|php|lock|sql)$ {
deny all;
}
## CORS headers
location ~* /.*\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js) {
add_header Access-Control-Allow-Origin "*";
}
## Upload path for image content only and set 404 replacement
location ^~ /images/ {
location ~* (jpe?g|png|gif) {
log_not_found off;
error_page 404 /content/images/system/default/404.gif;
}
return 403;
}
## Pretty URLs
location / {
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}
# END Chevereto nginx rules

注:如果不配置这个到installer安装的最后一步会出现“执行HTTP请求时出错”报错。下文所述的docker方式部署不用配这个,内置了。

3.1.4 执行Chevereto安装过程

Chrome输入http://域名/installer.php路径,打开安装界面。

Step1:首先它会让你检查这两个路径与你要安装Chevereto的位置相匹配,并且没有安装其他软件。

Step2:然后填写数据库信息(Host处填写VPS的IP,其他项根据MySQL搭建时的配置来即可)

Chevereto安装过程

Step3:然后就是填写邮箱信息,可以用来重置密码什么的,填完邮箱就开始了自动安装,如果没有报错就算是初步搭建完成了。

3.2 通过Docker部署

3.2.1 拉取Chevereto的docker镜像

先使用docker search命令搜索一下Chevereto的镜像,然后这里我们选用的是linuxserver/chevereto镜像进行搭建。

1
2
$ docker search chevereto
$ docker pull linuxserver/chevereto

Chevereto的Docker镜像

3.2.2 创建Chevereto的docker容器并运行

1
2
3
4
5
6
7
8
9
10
11
12
$ mkdir /appliaction
$ docker run -d \
--name=chevereto \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-p 80:80 \
-p 443:443 \
-v /appliaction/chevereto/config:/config \
-v /appliaction/chevereto/data:/data \
--restart unless-stopped \
linuxserver/chevereto

命令说明:-e PUID=1000和-e PGID=1000指定用户和用户组ID,镜像官方的解释是,在用-v挂载卷的时候,主机操作系统和容器之间可能会出现权限问题,如果出现权限问题,可以指定这两个参数(不过一般情况下这俩不指定也能启动),-e TZ指定时区,两个-v挂载了配置文件和数据的目录。

3.2.3 执行Chevereto的安装过程

Chrome输入http://域名:端口号路径,打开安装界面,其余与Installer部署的安装过程一致,不再赘述。

4. Chevereto图床优化

4.1 申请泛域名SSL证书并开启HTTPS

SSL证书是一种数字证书,用于加密从用户的浏览器发送到Web服务器的数据。 通过这种方式,发送的数据对于使用Wireshark等数据包嗅探器来拦截和窃听您的通信的黑客来说是安全的。

Chrome一直在推动https,所有的http协议网站被标记为不安全,如果再不对网站进行https改造的话,那么可能会对信任度造成一定的影响,所以说对一个面向用户的网站来说,开启https是非常有必要的。

下面将使用acme.sh开源项目申请免费的 Let’s Encrypt 泛域名SSL证书。

注:如果懒得折腾泛域名证书,也可在宝塔面板直接傻瓜式申请Let’s Encrypt的单域名SSL证书(宝塔面板——网站——设置——SSL——Let’s Encrypt——勾选域名,点文件验证——申请出来后设置强制HTTPS)。

4.1.1 安装 acme.sh

1
$ curl  https://get.acme.sh | sh

acme.sh

普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:

  • [1] 把 acme.sh 安装到你的 root 目录下,并创建 一个 bash 的 alias, 方便你的使用。

  • [2] 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书。

注:安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中。那个socat未安装的问题不用管,那是http验证无Web Server时才需要的。

4.1.2 生成SSL泛域名证书

acme.sh 实现了 acme 协议支持的所有验证协议,一般有两种方式验证:http 和 dns 验证。

  • http 验证:http 方式需要在你的网站根目录下放置一个文件,来验证你的域名所有权。
  • dns 验证:dns 方式,在域名上添加一条 txt 解析记录,验证域名所有权。

dns 方式的可以使用域名解析商提供的 API 自动添加 txt 记录完成验证,下面我们将采用这种方法申请Namesilo的泛域名证书。

Step1:打开 https://www.namesilo.com/account/api-manager 去申请 NameSilo API,勾选第2个复选框,点击Generate,即可生成。

申请NameSilo API

注:务必不要勾选上Generate key for read-only access的哪个复选框,否则会导致Unable to add the DNS record. Error add txt for domain的问题。另外,生成的API只出现一次,如果没记下来只能重置。

Step2:在服务器输入以下命令,实现自动dns验证生成泛域名证书。

1
2
3
$ cd /root/.acme.sh
$ export Namesilo_Key="xxxxxxxxxxxxxxxxxxxxxxxx"
$ ./acme.sh --issue --dns dns_namesilo --dnssleep 1800 -d example.com -d *.example.com

等待1800s即可看到申请下来的SSL证书(NameSilo的验证比较慢,官方文档上写的900s有时不足以验证完)

申请下来的SSL证书

生成文件都放在/root/.acme.sh/example.com/目录下,其中:example.com.key是密钥文件,fullchain.cer是证书文件。

注:如果你的域名不是NameSilo的,上述操作有所不同,具体请参考: https://github.com/acmesh-official/acme.sh/wiki/dnsapi

4.1.3 给网站开启HTTPS

打开宝塔面板——网站——设置——SSL——其他证书,把example.com.key密钥文件、fullchain.cer证书文件复制上去,强制https。

开启HTTPS

4.2 Chevereto基本设置及上传API

4.2.1 Chevereto基本设置

头像——仪表盘——设置——根据自己的需要进行配置,其中要注意的两点如下:

  • 如果你的图床加载速度很慢,禁用自动更新可以有效缓解此问题(系统——“自动更新检查”、“显示可用的更新通知”设置成禁用)

  • 如果你的图床只供给自己使用,请把开放注册的功能关掉(用户——“开放注册”设置成禁用)

4.2.2 获取Chevereto的上传API

头像——仪表盘——设置——API处,可以看到图片上传API的密钥,这个下面配置自动上传会用到。

Chevereto API v1

该API的使用说明详见: Chevereto API v1,它的调用示例如下:

1
http://mysite.com/api/1/upload/?key=12345&source=http://somewebsite/someimage.jpg&format=json

API V1没有办法上传与给定用户相关联的图像,但是你可以覆盖默认的API,以实现以用户的形式上传:

宝塔面板——文件——将app/routes/route.api.php文件复制到app/routes/overrides文件夹,然后在此编辑该文件

CHV\Image::uploadToWebsite($source);改为CHV\Image::uploadToWebsite($source, '用户名'); (在第105行附近)

覆盖原有API实现以用户形式上传

5. 配置自动上传Chevereto图床

以上我们已经搭建好了Chevereto图床,但还存在一个问题,就是图片该怎么上传呢?一般写博客用到的截图需要经过以下四步:截图——处理截图——上传图床——粘贴到md,要是用Chevereto自带的图片上传想想就很麻烦,有没有什么好的解决方案呢?答案是有的,下面我将介绍两种比较好用的上传方案。

注:主流使用PicGo进行自动上传的方案已经被我否了,搞不懂那玩意儿经常上传失败为什么还那么多人用,一点儿都不稳定。

5.1 使用ShareX工具实现截图处理上传

5.1.1 下载安装ShareX工具

ShareX官网:https://getsharex.com/

ShareX可以实现截图——处理截图——上传图床于一体,并提供上传后的URL,将原来的四步简化为两步。这个工具的功能远不止这些,很强大的一个工具,自行探索吧。

ShareX工具

5.1.2 在ShareX里配置Chevereto API

打开ShareX——目标——上传目标设置——Chevereto——填写上传URL、API密钥,勾选直链,填写示例如下:

1
2
上传URL:http://example.com/api/1/upload
API密钥:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

注:上传URL的前半部分http://example.com就是你的图床地址;后半部分/api/1/upload是拼接成API的调用格式(upload的后面不要加/),其中1是指上传用户的ID,这个根据实际填写(如果只有一个管理员用户,那这里就是1,不是的话就去看一下用户ID据实填写)

5.2 使用Typora+Python脚本实现自动上传

我们还可以利用Typora的Custom Command功能实现自动上传,这也是我目前写博客最常用的方案,效果很好,但不支持批量上传。

注:Typora需要是新版的,版本太老可能没有这个功能。Custom Command我这里用的是Python脚本,因此需要配置Python开发环境。

5.2.1 准备Python脚本和JSON配置文件

新建一个Python脚本,将其命名为upload.py,代码如下:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import base64
import time

import requests
import json
import mimetypes
import argparse
import sys

APP_DESC = """
A command line tool to upload pictures to chevereto image bed
"""

print(APP_DESC)
if len(sys.argv) == 1:
sys.argv.append('--help')

parser = argparse.ArgumentParser()
parser.add_argument('-s', '--source', type=str, nargs='+', help="上传图片路径", required=True)
parser.add_argument('-c', '--config', default="./config.json", help="读取配置文件", required=True)
args = parser.parse_args()

# 从参数中获取要上传的文件列表
img_list = args.source

def read_conf(path):
with open(path, "r", encoding="utf-8") as f:
confstr = f.read()
conf = json.loads(confstr)
return conf

def up_to_chevereto(img_list):
# 获得本地图片路径后,上传至图床并记录返回的json字段
for img in img_list:
# 先判断传过来的是本地路径还是远程图片地址
if "http" == img[:4]:
# 非本地图片的话可以考虑下载到本地再上传
print(img)
continue
else:
try:
res_json = upload(formatSource(img))
parse_response_url(res_json,img)
except Exception as e:
print(e)
print(img+"\tUpload failed")

def upload(files):
# 拼接url并上传图片至Chevereto图床
conf = read_conf(args.config)
url = conf['url'] + "?key=" + conf['APIKEY'] + "&format=json"
r = requests.post(url, files=files)
return json.loads(r.text)

def formatSource(filename):
imageList = []
with open(filename, "rb") as f:
base64_data = base64.b64encode(f.read())
imageList.append(
('source', (filename, base64_data))
)
return imageList

def parse_response_url(json, img_path):
# 从返回的json中解析字段
if json['status_code'] != 200:
print(json['error'])
print("{}\tupload failure. status_code {} .".format(
img_path, json['status_code'])
)
else:
img_url = json["image"]["url"]
print(img_url)
# 记录上传成功的日志
conf = read_conf(args.config)
path = conf['path']
with open(path, 'a') as file_object:
file_object.write(img_url + " --" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + "\n")
file_object.write("![](" + img_url + ")\n\n")

up_to_chevereto(img_list)

再新建一个JSON配置文件,将其命名为config.json

1
2
3
4
5
{
"APIKEY": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"url": "http://example.com/api/1/upload/",
"path": "E:/cheveretoUploadLog.md"
}

说明:Python脚本原封不动抄过来就好(需要配置好Python开发环境,并使用pip命令安装所需的依赖),JSON配置文件需要按照你自己的配置来填写,Python脚本将读取这个配置文件里的数据进行处理。

注意事项:APIKEY必须要大写;url末尾upload后面需要加/;path必须是/或者\\(Windows复制路径给的是\);path的末尾没有逗号;JSON文件不能写注释。

还有个坑:一切配置都OK的情况下使用时报错ValueError: check_hostname requires server_hostname,经排查是开了梯子的缘故,关掉代理就好使了。

然后将这两个脚本放到一个不会轻易动的同一目录下(我选择放置在Typora的安装目录,以为一会儿还要跟它进行配置)

5.2.2 配置Typora的Custom Command功能

打开Typora——文件——偏好设置——图像

“插入图片时”处:选择“复制图片到./${filename}.assets文件夹”,勾选对本地位置和网络位置的图片应用上述规则

”上传服务设定“处:上传服务选择Custom Command,命令填写为python upload.py的绝对路径 -c config.json的绝对路径 -s

注:-s 后面是上传图片的路径,这个用的时候Typora就给我们自动补上了,不需要填写。

Typora配置Custom Command

配置完毕可点击“验证图片上传选项”按钮进行验证,如果失败就要去检查你的JSON配置文件、Python脚本文件和这里的命令是否配置正确,问题一般会处在JSON配置文件那里(比如APIKEY填写不正确、我上面提到的那几条注意事项)

配置成功后便可对md文档里的图片右键,使用上传图片功能了。上传成功后Typora会自动将我们的图片路径替换成链接,十分方便。

6. 参考资料

[1] Chevereto-搭建私人图片外链库 from Newlearnerの小站

[2] Chevereto项目地址 from Github

[3] Chevereto-中文文档-上传到用户的解决方案 from Chevereto API

[4] 利用ShareX快速截图并自动上传分享到chevereto from 主机笔记

[5] chevereto图床打开非常慢,谷歌浏览器显示为ping值慢 from pc6a

[6] 用docker快速搭建chevereto图床 from CSDN

[7] Chevereto API v1 使用说明 from Chevereto官方文档

[8] 利用python脚本实现使用typora时图片自动上传到chevereto图床 from 知乎

[9] ValueError: check_hostname requires server_hostname from Bilibili