参考:http://elmagnifico.tech/2022/01/20/sapic-smms-picgo/
参考:https://github.com/sapicd/sapic
参考:https://sapic.rtfd.vip/
一直一来,我都是使用github,sm.ms作为博客图床,但是经常遇到访问慢或者打不开的情况。刚好有这篇自建图床的教程,我也拿来用一下。
为什么不上对象存储?
没错,阿里云上的对象存储号称99.99999999%的可靠性,用它你不用担心稳定性相关的问题。当博客图床来用,正常使用的话价格估计几块钱一月够用了。
但是 ,不管是阿里云,腾讯云还是七牛云,这些对象储存的收费都是分为两块的,一个是存储费用,一个是公网流量费用。存储的话便宜,平时搞活动的话100G用一年可能只要10块钱,但是流量就贵了,可能在3毛到5毛一个G。平时自己用可能没什么,但是万一碰上一个刷流量的,那指不定会倾家荡产,所以我选择不用对象存储。
自建图床的优势和弊端
优势:
首先图片掌握在自己手上,我可以方便随时迁移。二来基本上不用担心访问慢的问题。
弊端:
我要花费时间和金钱成本去维护这个图床。如果只是一个静态博客网站,可能1C0.5G的机器配置就够用了。但是搭建图床,可能要再准备一台机器,大约也是1C0.5G的机器配置。当然你可以选择将图床和博客放在一台机器上,也就是需要1C1G的机器。似乎也不是什么大问题。(下面搭建的图床内存占用在200MB左右)
下面使用docker-compose来部署下。
一、部署图床
使用docker-compose部署图床,会起两个容器,一个是webapp,是python flask框架写的一个图床程序,一个是redis,用于存储账号信息。
version: '3'
services:
picbed-web:
image: "staugur/sapic:1.13.4"
restart: always
#ports:
# - "80:9514"
environment:
- sapic_redis_url=redis://@redis:6379
# 设置信任代理标头
#- sapic_proxyfix=true
volumes:
- static:/picbed/static/
- /data/sapic/picbed/:/picbed/static/upload/
depends_on:
- "redis"
redis:
image: "redis:alpine"
command: ["redis-server", "--appendonly", "yes"]
volumes:
- /data/sapic/sapic-redis:/data
volumes:
static:
sapic]# docker-compose -p sapic up -d
nginx做一个反向代理
server {
listen 80;
listen 443 ssl http2;
server_name img.xxx.com;
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
location / {
proxy_pass http://picbed-web:9514;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
add_header X-Cache $upstream_cache_status;
#Set Nginx Cache
add_header Cache-Control no-cache;
expires 12h;
}
#HTTP_TO_HTTPS_END
ssl_certificate /etc/nginx/ssl/img.xxx.com.crt;
ssl_certificate_key /etc/nginx/ssl/img.xxx.com.key;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
}
二、创建管理员账号
]# docker exec -it sapic-picbed-web-1 sh
/picbed # flask sa create -u admin -p 12345678 --isAdmin
然后就可以访问和登陆图床了。登陆后的界面如下:

三、API访问配置
一种是token访问,一种是LinkToken,前者是admin级别,后者是子账号。二选一即可,我一个人用就直接生成token好了。
生成token

生成LinkToken

四、Picgo配置
安装web-uploader插件

图床设置(token方式)
- API地址:https://你的域名/api/upload
- POST参数名:picbed
- JSON路径:src
- 自定义请求头:留空
- 自定义Body:{"token": "你的token", "album": "blog"}

图床设置(Linktoken方式)
本人未尝试,请自行测试
API地址: http[s]://你的sapic域名/api/upload
POST参数名: picbed
JSON路径: src
自定义请求头:{"Authorization": "LinkToken 你的LinkToken"}
自定义Body: {"album": "相册名或留空"}
开启时间戳命名,防止因文件名包含特殊字符上传失败
五、图床数据迁移
通过上面的docker-compose文件可以看到,我们的图床文件和redis数据都已经持久化,迁移也比较容易
停掉图床服务
]# docker-compose -p sapic down
迁移数据,包含一个yml文件和两个目录
]# ls /data/sapic/ -l
total 12
-rw-r--r-- 1 root root 530 May 25 22:03 docker-compose.yml
drwxr-xr-x 4 root root 4096 May 25 21:43 picbed
drwxr-xr-x 3 polkitd root 4096 May 25 22:27 sapic-redis
启动新的服务
]# docker-compose -p sapic up -d
配置nginx(如果有需要的话)
六、别的图床数据如何迁移过来
方式就是脚本遍历所有的文章,找到原图片的url,下载到本地。然后使用sapic的API将这些图片上传到自己的图床上,然后替换文章中的图片地址。具体脚本参考这位博主的就好了,我暂时没这个需求
http://elmagnifico.tech/2022/01/20/sapic-smms-picgo/#%E6%9B%BF%E6%8D%A2%E8%84%9A%E6%9C%AC