自从开始写文章后,就遇到了一个问题,图床
;我这边是使用 Typora 编写 Markdown 格式的文章,然后发布到各个平台,有些平台会自动将你的图片文件上传到他们的服务器上,但是有的还是会使用你自己的图片文件来源。这会产生两个问题:
1. Typora 会默认将你的截图、复制的图片放在本地,没法多设备同步,导致我从公司回到家后打开笔记只能面对一张张“破”了的图,属实影响阅读体验
2. Typora 编写文章的时候如果使用第三方图床的方式,得依赖于第三方服务器的稳定性
所以,有没有可能自建图床,搭建一个属于自己的可控的图床方案呢?答案是,Yes!
SM.MS
,5G 免费存储空间,网络貌似不太稳定七牛云
:月免费额度 10G,这个跟我几年前的使用体验还是有出入的,创建好桶,存储空间后就可以正常进行文件存取;但是我想的是通过自定义域名来作为图床的访问地址,又增加了自定义域名配置,至此倒也没啥大问题。使用了几天后,发现了账单里多了一笔 0.12 元的实时账单,询问客服后了解了来龙去脉,原来是访问我文章的外部流量,也就是我把图片 URL 暴露出去后,每一次的访问都会产生外网流出流量,产生一笔小小的费用CDN
加速域名,月免费额度 10G,好的,继续折腾;当我再次绑定好CDN
加速域名后,配置完成咨询客服是否正确后,得到的回复是免费额度只支持 HTTP,您使用的是 HTTPS,好嘛,这并不是我想要的,遂抛弃此方案。如果不在意这部分支出的话,选择一些大厂的云存储方案还是很方便的,有售后保证。MinIO
: 一款基于 Go 语言的高性能对象存储服务。偶然在一篇文章上看到这个开源的分布式存储介绍,就想着看能不能基于自己的云服务器搭建一套存储方案;多番查阅资料折腾后,最终实现本文的 MinIO+PicGo+Nginx+Typora
自建图床方案云服务器 *1
已备案的域名 *1
MinIO:docker hub latest
Nginx: 1.20.1
Typora: 1.3.8
PicGo: 2.3.0
OS: CentOS 7.9
Docker: 20.10.17
本文采用的是 Docker 部署方式,单节点,考虑到我的云服务器配置并不是那么高
拉取MinIO
最新镜像
[root@VM-4-12-centos /]# docker pull minio/minio
容器启动MinIO
实例
[root@VM-4-12-centos /]# docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=xxx" -e "MINIO_SECRET_KEY=xxxxxxxx" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data
配置项说明:
9000
: 控制台使用9001
: API 使用注意事项
云服务器上之前有部署好的 Nginx 环境,所以此文就不展开说明,仅贴上具体 Nginx 配置文件
io.xxx.com
: 用于访问 MinIO Manage Web 控制台,开放 9000 端口
share.xxx.com
: 用于图床 API 访问 URL ,开放 9001 端口
上述提到的两个域名均解析到你对应的云服务器即可
# nginx 配置目录
[root@VM-4-12-centos nginx]# pwd
/etc/nginx
# nginx 下使用 vhost 子目录 include 到主的配置文件中
[root@VM-4-12-centos vhost]# pwd
/etc/nginx/vhost
[root@VM-4-12-centos vhost]# ll
-rw-r--r-- 1 root root 1014 Aug 31 14:43 io.xxx.com.conf
-rw-r--r-- 1 root root 835 Sep 1 08:42 share.xxx.com.conf
server{
listen 80;
# MinIO 后台管理域名
server_name io.xxx.com;
# HTPP 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server{
listen 443 ssl;
server_name io.xxx.com;
# nginx 访问日志,错误日志配置
access_log /usr/local/nginx/logs/io.access.log json;
error_log /usr/local/nginx/logs/io.error.log warn;
# SSL 证书配置
ssl_certificate /usr/local/nginx/ssl/io.xxx.com_bundle.crt;
ssl_certificate_key /usr/local/nginx/ssl/io.xxx.com.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
location / {
proxy_redirect off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 目标 MinIO 服务
proxy_pass http://localhost:9000;
}
}
server{
listen 80;
# MinIO 外链访问域名
server_name share.xxx.com;
# HTPP 重定向到 HTTPS
return 301 https://$server_name$request_uri;
}
server{
listen 443 ssl;
server_name share.xxx.com;
# nginx 访问日志,错误日志配置
access_log /usr/local/nginx/logs/share.access.log json;
error_log /usr/local/nginx/logs/share.error.log warn;
ssl_certificate /usr/local/nginx/ssl/share.xxx.com_bundle.crt;
ssl_certificate_key /usr/local/nginx/ssl/share.xxx.com.key;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
location / {
proxy_set_header Host $host;
add_header Content-Security-Policy "upgrade-insecure-requests";
# 目标 MinIO API 服务
proxy_pass http://localhost:9001;
}
}
访问地址: https://io.xxx.com, 输入你最初设置的用户密码登录即可
至此, MinIO 整个服务端已经搭建且调试完成!
MinIO
插件 [] 内为注释
endPoint
: share.xxx.com [ API 访问的域名] port
: 443 [端口] useSSl
: true [使用 SSL 时打开] accessKey
: [用户名] secretKey
: [密码] bucket
: lattice [桶名称] 同名文件
:跳过 [当文件名重复时设置的策略] 基础目录
:/typora [自定义子目录文件夹] 自定义域名
:share.xxx.com自动归档
:true [可选择开启,PicGo 程序会自动帮你按照 yyyy/MM/dd 的格式归档] 至此,就已经全部完成了整套自建图床服务的搭建了!可能也并不是最好的方案,只能说是目前我能想到的一个比较适合我的“免费”图床方案;但是“免费”的前提也是需要一些投入的成本,我这里是已有一个闲置的域名,一台 XX 云的轻量服务器。
谢谢大家的观看我的博客~下期再见
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.