自建私有图床
参考知乎Minio+Nginx搭建私有图床,写博客从未这么爽 - 知乎 (zhihu.com)
背景
1.使用hexo写东西的时候难免要上传一些图片,hexo又是使用markdown文件来生成网页的,所以一般用typora来编写。
2.Typora自带一个功能,可以自动将图片上传。其支持picgo、自定义命令等。
1.搭建图床
这里是参考知乎Minio+Nginx搭建私有图床,写博客从未这么爽 来完成的。
我是直接搭建在自己的黑群晖上(内网穿透等可以再写一篇记录一下),以下是具体实现步骤。
1.1 MinIO docker搭建
1.1.1 搭建服务端
参考MinIOMinIO对象存储 — MinIO Object Storage for Container搭建
1 | mkdir -p ${HOME}/minio/data |
报错
1 | docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=minio1": dial unix /var/run/docker.sock: connect: permission denied. |
解决:权限不足,当前用户不能建立sock,用root用户或者sudo命令进行。
中间解决了一个问题,提示证书过期
具体解决:
网上找了很多教程,比如修改daemo.json文件,因为是dsm系统,这个文件可能没有生效;修改dsm的注册表为阿里云的镜像加速源,也没有生效。
最后在dsm的docker界面搜索的minio这个镜像直接下载后,运行的下面的docker命令。
我的docker只懂一点皮毛,有时间需要深入的学习一下。
1 | sudo docker run -itd \ |
在地址栏中输入对应ip:9090即可进入网页控制端,能显示这个页面就代表已经成功了。
1.1.2 搭建本地图床
参考这个MinIO搭建本地图床 - 一一风和橘 - 博客园 (cnblogs.com)
- 新建bucker桶
- 修改Access Rule
1.2 Nginx docker搭建
1 | docker run -itd \ |
在conf文件夹下创建一个minio.conf(命名无所谓 ),添加以下配置
1 | server { |
现在就可以使用 http://192.168.6.202:8081/blog/123.jpg 这个地址来直接访问图片。
– 其中 blog是minio的bucket名,需要与配置文件中的location路径一致
– 8081是nginx代理
注:长期使用的话需要用compose来管理容器。
Docker Compose | 菜鸟教程 (runoob.com)
2. 搭配Typora
直接偷文中的python脚本
1 | import os |
代码有问题。
2.1 使用picgo-core
2.1.1 安装
1 | # 安装 |
1 |
具体插件参考Herbertzz/picgo-plugin-minio (github.com)
2.1.2 配置
参考官方文档配置文件 | PicGo-Core
生成配置文件
1 | picgo set uploader |
配置上传器
1 | # |
解决一个问题:这里是上传路径的问题
解决一个问题:
1 | [PicGo WARN]: S3Error: S3 API Requests must be made to API port. |
这个问题是minio设置的端口问题,应该为api的端口9000,而不是console的端口9090。
参考(30条消息) Minio上传图片时遇到的问题S3 API Requests must be made to API port._CoderPorter的博客-CSDN博客解决。
最后测试成功的页面
2.2 typora 使用
刚开始用这个自带时出现未知错误,所以才用的pcigo的cli命令测试的。
后来也是上网查到,因为我们没有使用typora官方的下载,采用命令安装的,所以要采用自定义命令。参考Upload Images - Typora Support
最后采用这个成功
1 | # |
2.3 内网穿透
现在暂时用的是ddns加内网穿透的方案,因为用的是openwrt做的端口转发,可能会不稳定,先暂时这样用吧
3.一些问题
3.1 net::ERR_SSL_PORTOCOL_ERROR
原因:图片的url地址是http的头,但是博客的地址是https的头,需要一致。
解决:修改nginx代理即可,添加https证书。
3.1.1 申请SSL免费证书
途径:
1.Let’s Encrypt 比较复杂吧,可google
2.阿里云免费ssl 33种免费获取SSL证书的方式 - 知乎 (zhihu.com)
因为自己在阿里云购买的域名,所以直接使用阿里云免费ssl
步骤
登陆阿里云控制台,搜索ssl证书
点击免费证书,购买,再点击证书,即可活动一年免费证书
证书验证
阿里云控制台会自动给你添加记录,等待几分钟验证通过就行,状态为已签发。这里没有截图
- 证书下载
3.1.2 docker 配置证书
1.上传上一步下载的证书
2.修改nginx配置文件
这里完全去掉了80的代理,也不再用代理访问了,直接用https访问。
server {
listen 443 ssl;
server_name home.vuhks.top;
ssl_certificate /etc/nginx/certs/1_home.vuhks.top.pem;
ssl_certificate_key /etc/nginx/certs/1_home.vuhks.top.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
client_max_body_size 50m;
location ^~/blog {
proxy_pass http://192.168.6.202:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3.修改docker的启动命令,把证书的路径加上去
1 | docker run -itd \ |
这是因为命令输错了,docker run中的可执行指令有错误。
这是因为编译安装的时候没有启动没有添加ssl模块
好像不是因为这个,我把报错的配置删掉就好了。
1 | *62 no live upstreams while connecting to upstream, client: 172.17.0.1, server: home.vuhks.top, request: "GET /favicon.ico HTTP/1.1", upstream: "http://localhost/favicon.ico", host: "home.vuhks.top:8083", referrer: "https://home.vuhks.top:8083/blog/1234.jpg" |
1 | location /xxx/ { |
这样改写之后仍然不行,继续google,最后发现日志里的upstrem里“http://127.0.0.1:9000/blog/1234.jpg”这里有问题,因为我直接访问192.168.6.202:9000/blog/1234/jpg是可以访问的。所以猜错是docker的原因,不能这么写配置文件?
所以我直接将其改为192.168.6.202:9000
3.1.3 修改picgo配置
1 | { |