本文知识共享许可协议为CC BY-NC-SA 4.0,首发于个人博客,转载和参考请注明出处。

其实最一开始的时候,就考虑过图片应该怎么办,考虑了很久,也尝试过阿里云、七牛云的oss,总得来说就是能够折腾白嫖的还是不要花钱的好。到现在,多平台发布文章变为刚需,就再次把目光放在了chevereto上面,想要自建图床来使用。

chevereto

所使用的chevereto网上评价还是可以的,我也没有找到其他更多的开源图床程序,就使用这个了,效果如下。

image-20210808153954660

数据库

存储的方式,是需要使用数据库来辅助存储内容,所以需要先构造一个数据库。

如何使用docker安装部署mysql或者mariadb,已经在本系列一里面写到了,大家可以从我的博客右上角去搜索。

在这里只是简单附上了创建和运行容器的方法。

docker run \
    --name mariadb \
    -p 4305:3306 \
    -e MYSQL_ROOT_PASSWORD="数据库root密码" \
    -d \
    --restart=always \
    --privileged=true \
    -v /home/keen/docker/myriadb-10.0/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
    -v /home/keen/docker/myriadb-10.0/data/:/var/lib/mysql \
    mariadb

进入容器中,并且创建数据库:

create database keen_chevereto DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

这里重要参数就是数据库的名称keen_chevereto在下面会要用到的。

寻找并拉取镜像

首先去寻找确定有这个的镜像,再决定拉取哪个版本。

docker search chevereto

image-20210808080909622

本意是想要直接拉取官方提供的那个版本,但是在之后官网上面发现了linuxserver/chevereto还多两个tagarmarm64感觉更为通用啊,于是就选择了这个。

直接拉取了最新版本的:

 docker pull linuxserver/chevereto

创建外部挂载目录

递归创建存储目录

export Chevereto=chevereto
mkdir -p /home/keen/docker/$Chevereto/config
mkdir -p /home/keen/docker/$Chevereto/data

启动临时容器

启动临时容器是为了解决两个问题:

  1. 第一次启动正式容器后,上传文件大小为2M
  2. 使用api上传图片会自动归档为游客上传的内容

首先启动临时容器。

docker run -d \
    --name temp \
    linuxserver/chevereto

配置图片上传大小

然后将临时容器中的配置文件复制到服务器。

docker cp temp:/etc/php7/php.ini /home/keen/docker/$Chevereto/config/php.ini

接着修改服务器上面的php.ini文件:

; post传递数据大小
post_max_size = 20M

; 上传文件的大小
upload_max_filesize = 20M

; 一批次最多可以上传的个数
max_file_uploads = 100

经过尝试后发现在重启容器之后,该处配置的默认值会被config/php/php-local.ini覆盖掉!

配置路由

如果不配置路由,那么所有通过api的方式上传的图片,全是归为访客上传的,不会在既有的相册里面存在。故而我更推荐配置一下路由。

首先要将临时容器中的配置文件复制到服务器。

docker cp temp:/app/chevereto/app/routes/route.api.php /home/keen/docker/$Chevereto/config/route.api.php

将里面原始的内容:

$uploaded_id = CHV\Image::uploadToWebsite($source);

进行特别的修改,比如我的用户名是 keen,相册ID是2,则修改为:

$uploaded_id = CHV\Image::uploadToWebsite($source, 'keen', array('album_id'=>2));

关闭临时容器

docker stop temp && docker rm temp

启动正式容器

启动正式容器就以完成了上述所有配置的基准来编写,不再分情况细写。熟悉docker的读者可以随意更改,不必拘泥于此。

docker run -d \
    --restart=always \
    --name=chevereto \
    --link mariadb:db \
    -e TZ=Asia/Shanghai \
    -p 5217:80 \
    -p 5218:443 \
    -v /home/keen/docker/chevereto/config:/config \
    -v /home/keen/docker/chevereto/data:/data \
    -v /etc/localtime:/etc/localtime:ro \
    -v /home/keen/docker/$Chevereto/config/route.api.php:/app/chevereto/app/routes/route.api.php \
    -v /home/keen/docker/$Chevereto/config/php.ini:/etc/php7/php.ini \
    linuxserver/chevereto

这里的重要信息就是连接docker数据库的名称为db,也会在下面安装的时候用到。

可以使用命令重启了容器:

 docker restart chevereto

那么config/php/php-local.ini就会生效并且优先级会高于php.ini

安装chevereto

接下来进入图床链接:https://www.images.clzly.xyz

image-20210808083715173

按照提示,完成两次信息输入,完成安装。

image-20210808083940561

配置域名转发

因为以前就是使用的nginx,所以完全可以使用转发的方式,将端口映射到子域名。

这里出现了一点儿问题,php服务转发之后没有办法渲染页面。

最后如下配置nginx达成了目的:

server {
        listen       80;
        server_name  images.clzly.xyz www.images.clzly.xyz;
        rewrite ^(.*)$  https://www.images.clzly.xyz permanent; #用于将http页面重定向到https页面

}
server {
    listen 443 ssl;
    server_name  images.clzly.xyz www.images.clzly.xyz;
    ssl_certificate     /etc/nginx/conf.d/cert3/www.images.clzly.xyz.pem;
    ssl_certificate_key /etc/nginx/conf.d/cert3/www.images.clzly.xyz.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

      location / {
            proxy_pass  https://39.96.12.167:5218; # 转发规则
      }

      location ~ .* {
            proxy_pass  https://39.96.12.167:5218; # 转发规则
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

至于为什么这样子配置就可以实现目的,我还没有找到答案。

图片上传

接下来总共介绍三种方法,第一种需要科学上网和Node.js环境,第二种只需要Node.js环境,第三种则是需要Python环境,按需使用就是了。

方法一PicGo工具

安装PicGo

博主在之前就已经有所了解了。

需要点击PicGo下载链接,科学上网的方式下载下来,完成应用的安装。

又因为插件下载需要使用到 Node.jsnpm,所以需要Node环境!

PicGo的配置文件所在:

C:\Users\Administrator\AppData\Roaming\PicGo\data.json

接着安装插件chevereto

image-20210808212601546

从这里可以看到api的密钥:

image-20210808173829503

配置插件为:

image-20210808215134627

注意:

Url的格式必须是 域名地址+/api/1/upload

使用方式

在编写文章的时候,就需要先将想要使用的图片用PicGo的客户端,上传到自建图床上面,之后将图片成功上传后的Url黏贴在文章的指定位置即可。

或许有的小伙伴喜欢这种方式吧,但是我个人来说是不大喜欢的。

方法二Typora使用PicGo

typora本身是可以集成PicGo的,既可以使用客户端,也可以只下载一个模块。这里先说使用脚本的方式,因为这个不用科学上网也能够下载下来的。

PicGo-Core脚本

PicG-Core的命令行只有在需要上传图片时才会启用一个进程。

如果直接从Typora的偏好设置里面进行安装,仍然需要科学上网的。考虑之后,这里选择使用node进行安装,node环境安装可以从我之前的文章里面看到,不再复述。

运行语句下载模块:

npm install picgo -g

安装完成后,查看安装的位置:

which picgo

我之前就已经将node的全局模块路径放在系统环境变量中,所以可以实现在任意目录都可以使用关键字:

picgo --version

image-20210808223533673

接着使用模块picgo安装插件chevereto

picgo install chevereto

image-20210808224504369

点击Typora的打开配置文件按钮,将C:\Users\Administrator\.picgo\config.json修改成为:

{
  "picBed": {
    "current": "chevereto",
    "uploader": "chevereto",
    "chevereto": {
      "key": "上面从api里面获得的密钥",
      "source_param": "source",
      "url": "https://www.images.clzly.xyz/api/1/upload",
      "url_param": null
    }
  },
  "picgoPlugins": {
    "picgo-plugin-chevereto": true
  }
}

接着修改上传服务为命令picgo upload

image-20210808225909410

他的使用方式有两种。

第一种是针对单个图片的,在编辑的过程中,右键某个图片,会有一个上传图片的选项,点击之后,就是会自动上传,并且修改图片的Url

image-20210808230731735

第二种是针对本文档的所有图片,在编辑完整个文档之后,点击格式->图像->上传所有本地图片来一次性的将整个文档的图片都转成第三方链接。

image-20210808231229885

PicGo-客户端

需要 PicGo ≥ 2.2.0 并启用PicGo-Server并使用默认值 (36677) 的端口。当 Typora 使用 PicGo 上传图片时,PicGo 将被启动并保持运行。

客户端应该有的配置都在方法一里面说了,不再赘述。

上传服务选择PicGo(app)填入所在的路径,点击验证

在这里插入图片描述

相较于使用脚本的区别,就是会在右下角有一个上传成功的提醒。

image-20210808231618156

如果一定要在方法二的两个实现间去选择,我个人更倾向于选择脚本的方式。

方法三Typora使用Python脚本

其实我是先了解到方法三才在后面搜寻资料的过程中找到了方法一和方法二的。

这个方式完全舍弃了PicGo的工具,只是一个脚本就完成了想要做的事情,让我很是意动!

分为两个文件,一个是config.json 保存配置

{
    "APIKEY": "上面从api里面获得的密钥",
    "url": "https://www.images.clzly.xyz/api/1/upload/"
}

**注意!**在配置url的时候最后面一定要有斜杠!

第二个文件为:

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
# author: guiu
# data: 2020.2.28

import requests
import json
import mimetypes
import argparse
import sys

APP_DESC = """
upload pictures automatically
"""

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
# print(img_list)

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:
                print(img+"\t上传失败")

def upload(files):
    # 图床api
    # APIKey = "THERE PUT YOUR APIKEY"
    conf = read_conf(args.config)
    url = conf['url'] + "?key=" + conf['APIKEY']
    r = requests.post(url, files=files)
    return json.loads(r.text)

def formatSource(filename):
    imageList = []
    mime_type = mimetypes.guess_type(filename)[0]
    imageList.append(
        ('source', (filename, open(filename, 'rb'), mime_type))
    )
    #print (imageList)
    return imageList

def parse_response_url(json, img_path):
        # 从返回的json中解析字段
    if json['status_code'] != 200:
        print("{}\tweb端返回失败,可能是APIKey不对. status_code {} .".format(
            img_path, json['status_code'])
        )
    else:
        img_url = json["image"]["url"]
        print(img_url)

up_to_chevereto(img_list)

修改Typora的配置为:

"D:\all_sdk\python\python.exe" "D:\blog\blog-keen\bat\upload.py" -c "D:\blog\blog-keen\bat\config.json" -s

就可以了!

图床迁移

config/settings.php文件中配置了数据库的内容:

<?php
$settings = array (
  'db_host' => 'db',
  'db_name' => 'keen_chevereto',
  'db_user' => '数据库账号',
  'db_pass' => '数据库密码',
  'db_table_prefix' => 'chv_',
  'db_driver' => 'mysql',
  'db_pdo_attrs' => 
  array (
  ),
  'debug_level' => 1,
);

图片内容是必须的,数据库也是必须的!

完成上面三个的备份,就可以关闭并且删除原先的容器。

export Chevereto=chevereto
docker stop $Chevereto && docker rm $Chevereto

接着在新的机器上面,拉取镜像,创建外部挂载目录,导入数据库,修改配置文件,接着运行容器即可!

感谢

感谢现在努力的自己。

[]: http://www.haoyufang.site:8888/root/python-typora-chevereto “Python脚本实现Typora插入图片自动上传到Chevereto图床”

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐