Docker系列五自建图床
<hr><p>title: Docker系列五自建图床tags:</p><ul><li>python</li><li>dockercategories:</li><li>Blogtyp
本文知识共享许可协议为CC BY-NC-SA 4.0,首发于个人博客,转载和参考请注明出处。
其实最一开始的时候,就考虑过图片应该怎么办,考虑了很久,也尝试过阿里云、七牛云的oss,总得来说就是能够折腾白嫖的还是不要花钱的好。到现在,多平台发布文章变为刚需,就再次把目光放在了chevereto
上面,想要自建图床来使用。
chevereto
所使用的chevereto
网上评价还是可以的,我也没有找到其他更多的开源图床程序,就使用这个了,效果如下。
数据库
存储的方式,是需要使用数据库来辅助存储内容,所以需要先构造一个数据库。
如何使用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
本意是想要直接拉取官方提供的那个版本,但是在之后官网上面发现了linuxserver/chevereto
还多两个tag
,arm
和arm64
感觉更为通用啊,于是就选择了这个。
直接拉取了最新版本的:
docker pull linuxserver/chevereto
创建外部挂载目录
递归创建存储目录
export Chevereto=chevereto
mkdir -p /home/keen/docker/$Chevereto/config
mkdir -p /home/keen/docker/$Chevereto/data
启动临时容器
启动临时容器是为了解决两个问题:
- 第一次启动正式容器后,上传文件大小为2M
- 使用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
按照提示,完成两次信息输入,完成安装。
配置域名转发
因为以前就是使用的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.js
的npm
,所以需要Node
环境!
PicGo的配置文件所在:
C:\Users\Administrator\AppData\Roaming\PicGo\data.json
接着安装插件chevereto
。
从这里可以看到api的密钥:
配置插件为:
注意:
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
接着使用模块picgo
安装插件chevereto
:
picgo install chevereto
点击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
他的使用方式有两种。
第一种是针对单个图片的,在编辑的过程中,右键某个图片,会有一个上传图片的选项,点击之后,就是会自动上传,并且修改图片的Url
。
第二种是针对本文档的所有图片,在编辑完整个文档之后,点击格式->图像->上传所有本地图片
来一次性的将整个文档的图片都转成第三方链接。
PicGo-客户端
需要 PicGo ≥ 2.2.0
并启用PicGo-Server并使用默认值 (36677) 的端口。当 Typora 使用 PicGo 上传图片时,PicGo 将被启动并保持运行。
客户端应该有的配置都在方法一里面说了,不再赘述。
上传服务选择PicGo(app)
填入所在的路径,点击验证
相较于使用脚本的区别,就是会在右下角有一个上传成功的提醒。
如果一定要在方法二的两个实现间去选择,我个人更倾向于选择脚本的方式。
方法三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图床”
更多推荐
所有评论(0)