迫于微博图床不能用,用MinIO搭建图床

476 阅读3分钟

写在最前面

  • 几个月前,看笔记的时候发现图片都坏掉了。当时还在发了一条沸点,问了下jym的情况。当时的沸点

  • 之前一直在白嫖微博的图床,用浏览器的插件上传生成url。在这之前的时候微博好像就屏蔽了其他的referer,如果在一些评论区直接使用markdown引用来自微博图床的url就会访问不到。考虑到自己只是写笔记时使用,也没有太过在意。

事情经过

  • 但是这次笔记里去访问的时候referer应该是空的才对,打开浏览器直接访问url同样403,说明微博图床把空referer的情况也给禁用了。

  • 那微博自己的referer总要可以访问的,在chrome里安装下ModHeader插件在请求头里添加下referer参数,值可以给微博的。先把图片down到本地目录

搭建MinIO

  • 交流后发下大家用图床方式有很多种,有像我一样直接白嫖的,也有一些买付费的,还有自己通过云服务商对象存储服务+cdn实现的。但是呢,白嫖的现在不能用了,付费的图床和对象存储+cdn 也都是要花钱的。自己在hk有台机器好闲置一部分资源,就想在这台机器里面多跑个容器自己搞一下。

  • 刚刚机器里有容器环境,直接写好 docker-compose.yaml 起容器就好了。用docker-compose 而不是直接起容器是因为docker-compose管理更方便一些,而且要用自己的域名所以前面还有挂一个nginx做反向代理。

[root@VM-8-10-centos nginx]# cat docker-compose.yaml 
version: "3.7"
services:
  minio:
    image: "quay.io/minio/minio:RELEASE.2022-08-02T23-59-16Z"
    container_name: minio-server
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - "/data/minio/data:/data"
    command: server --console-address ":9001" /data
    environment:
      - MINIO_ROOT_USER=miniouser
      - MINIO_ROOT_PASSWORD=miniopassword
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3
    networks:
      - minio-net
  nginx:
    image: nginx     # 镜像名称
    container_name: minio-nginx     # 容器名字
    restart: always     # 开机自动重启
    ports:     # 端口号绑定(宿主机:容器内)
      - "80:80"
      - "443:443"
    depends_on:
      - minio
    volumes:      # 目录映射(宿主机:容器内)
      - "/data/minio/nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "/data/minio/nginx/ssl_cert:/ssl_cert"
    networks:
      - minio-net 
networks:
  minio-net:
    driver: bridge
[root@VM-8-10-centos nginx]# cat nginx.conf 
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	server {
		listen 80;
		server_name file.yestodayhadrain.com;
		return 301 https://$http_host$request_uri;
		access_log  off;
	}
	server {
            listen 443 ssl;
            server_name file.yestodayhadrain.com;
            index index.html index.htm;
            ssl_certificate /ssl_cert/file.yestodayhadrain.com.pem;
            ssl_certificate_key /ssl_cert/file.yestodayhadrain.com.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 /image {
                    proxy_pass http://minio-server:9000;
                    add_header Access-Control-Allow-Origin *;
            }
            location / {
                    proxy_pass http://minio-server:9001;
                    add_header Access-Control-Allow-Origin *;
            }
	
	}	

}

  • ssl证书的话国内的云服务商都可以申请免费的,随便找一家申请一个下载下来上传到机器上就好了。
[root@VM-8-10-centos nginx]# pwd
/data/minio/nginx
[root@VM-8-10-centos nginx]# ll ssl_cert/
total 12
-rwxrwxrwx 1 root root 1704 Jan 17 15:19 file.yestodayhadrain.com.key
-rwxrwxrwx 1 root root 4113 Jan 17 15:19 file.yestodayhadrain.com.pem

  • 启动容器,把下载到本地的图片上传到MinIO的桶里,然后把笔记中图片url的域名改成自己的就完美恢复啦。

  • MinIO的桶尽量要设置成公有读,私有写的。MinIO的桶策略设置和aws的S3比较类似,我是直接修改了Action下面的操作。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "*"
                ]
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::image/*"
            ]
        }
    ]
}