参考: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