V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vaynecv
V2EX  ›  程序员

MinIO+PicGo+Nginx+Typora 自建图床

  •  
  •   vaynecv · 211 天前 · 3201 次点击
    这是一个创建于 211 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写在前面

    需求背景

    ​ 自从开始写文章后,就遇到了一个问题,图床;我这边是使用 Typora 编写 Markdown 格式的文章,然后发布到各个平台,有些平台会自动将你的图片文件上传到他们的服务器上,但是有的还是会使用你自己的图片文件来源。这会产生两个问题:

    ​ 1. Typora 会默认将你的截图、复制的图片放在本地,没法多设备同步,导致我从公司回到家后打开笔记只能面对一张张“破”了的图,属实影响阅读体验

    ​ 2. Typora 编写文章的时候如果使用第三方图床的方式,得依赖于第三方服务器的稳定性

    ​ 所以,有没有可能自建图床,搭建一个属于自己的可控的图床方案呢?答案是,Yes!

    需求调研

    • 首先考虑了免费图床,SM.MS,5G 免费存储空间,网络貌似不太稳定
    • 大厂提供的对象存储服务,最开始优先考虑的就是这套解决方案
      • 七牛云:月免费额度 10G,这个跟我几年前的使用体验还是有出入的,创建好桶,存储空间后就可以正常进行文件存取;但是我想的是通过自定义域名来作为图床的访问地址,又增加了自定义域名配置,至此倒也没啥大问题。使用了几天后,发现了账单里多了一笔 0.12 元的实时账单,询问客服后了解了来龙去脉,原来是访问我文章的外部流量,也就是我把图片 URL 暴露出去后,每一次的访问都会产生外网流出流量,产生一笔小小的费用
      • 客服提供的解决方案:绑定CDN加速域名,月免费额度 10G,好的,继续折腾;当我再次绑定好CDN加速域名后,配置完成咨询客服是否正确后,得到的回复是免费额度只支持 HTTP,您使用的是 HTTPS,好嘛,这并不是我想要的,遂抛弃此方案。如果不在意这部分支出的话,选择一些大厂的云存储方案还是很方便的,有售后保证。
      • image-20220901141613104
    • 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

    安装步骤

    MinIO 部署

    本文采用的是 Docker 部署方式,单节点,考虑到我的云服务器配置并不是那么高

    拉取MinIO最新镜像

    [[email protected] /]# docker pull minio/minio
    

    容器启动MinIO实例

    [[email protected] /]# 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 使用
    • MINIO_ACCESS_KEY=xxx:登录用户名
    • MINIO_SECRET_KEY=xxxxxxxx:登录用密码
    • /home/data: 宿主机映射目录卷
    • /home/config: 宿主机映射配置文件目录卷

    注意事项

    • 将用户名密码替换你自己设置的,另外 ACCESS_KEY 至少 3 位,MINIO_SECRET_KEY 至少 8 位,否则容器启动失败,抛出此异常

    Nginx 配置

    云服务器上之前有部署好的 Nginx 环境,所以此文就不展开说明,仅贴上具体 Nginx 配置文件

    云安全组端口开放
    • io.xxx.com: 用于访问 MinIO Manage Web 控制台,开放 9000 端口

    • share.xxx.com: 用于图床 API 访问 URL ,开放 9001 端口

    云域名解析

    上述提到的两个域名均解析到你对应的云服务器即可

    Nginx 设置域名配置文件
    # nginx 配置目录
    [[email protected] nginx]# pwd
    /etc/nginx
    # nginx 下使用 vhost 子目录 include 到主的配置文件中
    [[email protected] vhost]# pwd
    /etc/nginx/vhost
    [[email protected] 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
    
    vim io.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;                 
            }
    }
    
    vim share.xxx.com.conf
    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;
            }
    }
    

    MinIO Manage Web 访问

    MinIO 登录

    访问地址: https://io.xxx.com, 输入你最初设置的用户密码登录即可

    image-20220901141429906

    Bucket (桶) 创建

    image-20220901141459185

    Bucket 信息

    image-20220901141522702

    至此, MinIO 整个服务端已经搭建且调试完成!

    MinIO Client (Typora+PicGo)

    PicGo 配置
    • 安装MinIO 插件

    image-20220901141543044

    • MinIO 图床设置 [] 内为注释
      • endPoint: share.xxx.com [ API 访问的域名]
      • port: 443 [端口]
      • useSSl: true [使用 SSL 时打开]
      • accessKey: [用户名]
      • secretKey: [密码]
      • bucket: lattice [桶名称]
      • 同名文件:跳过 [当文件名重复时设置的策略]
      • 基础目录:/typora [自定义子目录文件夹]
      • 自定义域名share.xxx.com
      • 自动归档:true [可选择开启,PicGo 程序会自动帮你按照 yyyy/MM/dd 的格式归档]
    Typora 配置
    • 打开 typora, [文件] -> [偏好设置] -> [图像]

    image-20220901141709006

    • 上传图床服务成功

    image-20220901141237800

    收获&问题

    • 掌握了分布式存储 MinIO Docker 部署
    • 了解了 Nginx 下域名配置等
    • 实现“免费”图床服务,写文章再也不用考虑图片失联了
    • 可充当个人网盘轻量使用

    拓展

    • 后续可以使用 MinIO 作为业务开发中的分布式存储服务
    • SpringBoot 方式整合 MinIO,JavaSDK 的使用
    • 使用自己的文件服务中转,设置业务附件与 MinIO 关联,使用类似 https://share.xxx/com/UUID 这种方式访问,进而不去暴露文件名,以及文件的权限控制等等

    完结

    ​ 至此,就已经全部完成了整套自建图床服务的搭建了!可能也并不是最好的方案,只能说是目前我能想到的一个比较适合我的“免费”图床方案;但是“免费”的前提也是需要一些投入的成本,我这里是已有一个闲置的域名,一台 XX 云的轻量服务器。

    ​ 谢谢大家的观看我的博客~下期再见

    37 条回复    2022-09-04 18:45:17 +08:00
    twofox
        1
    twofox  
       211 天前
    我选择阿里云 oss ,人生苦短,能少折腾就少折腾,速度还比自己服务器的小水管快
    perfectlife
        2
    perfectlife  
       211 天前
    oss +1
    lisongeee
        3
    lisongeee  
       211 天前
    我一般都是复制图片,然后到 github 的 markdown 编辑框粘贴一下,然后 Ctrl+A , Ctrl + X 复制产生的 md 文本
    ![image]( https://user-images.githubusercontent.com/38517192/187864245-3634ae33-9419-4614-bed7-7b1f747e5374.png)

    如果是 vscode 编辑 md 文件,我可以装插件,然后在我粘贴的时候自动上传图片然后插入 md 文本
    ltkun
        4
    ltkun  
       211 天前 via Android
    picx 传 github 还有 cdn
    yesterday1mo
        5
    yesterday1mo  
       211 天前
    @twofox 目前存储了多少图片,每个月的账单是多少?
    ltkun
        6
    ltkun  
       211 天前 via Android
    ![Screenshot_20220901-160800]( https://git.poker/ltkun/img/blob/master/20220901/Screenshot_20220901-160800.7joxrxoyo0o0.webp?raw=true)
    vaynecv
        7
    vaynecv  
    OP
       211 天前
    @twofox #1 哈哈,当然可以的,不过这个折腾的成本也比较小;七牛云的我用了自定义域名,但是 HTTPS 受限,就没用了

    @lisongeee #3 也是一种方案
    @ltkun #4 就当学习了😂我是瞎折腾
    leipengcheng
        8
    leipengcheng  
       211 天前
    我一直都是白嫖的图床。。。懒得自建了,还要维护
    xiangsanliu
        9
    xiangsanliu  
       211 天前
    用的 GitHub 做图床,最近还写了个 raycast 插件,配合起来非常便捷了
    tairan2006
        10
    tairan2006  
       211 天前 via Android
    微博图床?
    zggsong
        11
    zggsong  
       211 天前
    后期维护起来。。。反正我选择 oss 这类产品
    vaynecv
        12
    vaynecv  
    OP
       211 天前
    看来我是白折腾了😂不过问题不大,先用着,后续看体验如何
    aptupdate
        13
    aptupdate  
       211 天前
    用 OSS 有审核吧?而且还要操心账单。
    vaynecv
        14
    vaynecv  
    OP
       211 天前
    @aptupdate #13 是的,我就是感觉有个后付费的账单在那,有点不放心,毕竟只是个人使用
    当然如果有免费图床且稳定的话,我肯定也会选择
    没有最好的,只有适合自己的,😝
    waler
        15
    waler  
       211 天前
    我用的 onedrive ,多台电脑同步没任何问题,发布到外网是可以用 alist 或者 onedrive-vercel-index 之类的,展示 onedrive 目录就可以
    novolunt
        16
    novolunt  
       211 天前
    https://github.com/mosuka/phalanx minio 可以加这个,做搜索
    vaynecv
        17
    vaynecv  
    OP
       211 天前
    @waler #15 写这文章前我应该发个帖问问的,这样就可选择更多的方案了
    @novolunt #16 好嘞,我学习一下
    fstar
        18
    fstar  
       211 天前
    用的阿里云 OSS ,省事。难受的一点是强制带上 Content-Disposition: attachment ,除非用自己的域名。不过放在 Markdown 里显示图片还好,但新标签页打开会直接下载
    pytth
        19
    pytth  
       211 天前
    我都是直接在一些平台上传后生成的链接作为图床,例如百度、微博、腾讯等产品的一些头像上传、反馈建议的截图上传等地方,上传后 F12 拿到链接就是我的图床了...哈哈哈,找一些不会过期的就挺稳!
    X-Force
        20
    X-Force  
       211 天前
    图床最大的问题不是搭建,是「带宽、成本、稳定性」啊……
    AlexPUBLIC
        21
    AlexPUBLIC  
       211 天前
    我选 cloud flare+B2 图床
    retrocode
        22
    retrocode  
       211 天前
    我是临时图片丢到 imgur 上, 博客图片一起丢服务器上, 博客只有自己访问不用考虑带宽, 图片便于管理更重要些
    hemingcn
        23
    hemingcn  
       211 天前 via Android   ❤️ 1
    我也有个自用图床: https://z.run
    PickleFish
        24
    PickleFish  
       211 天前
    有么有视频图床
    lazyyz
        25
    lazyyz  
       211 天前
    OP 可以去申请又拍云联盟,每月 10GB 存储空间 + 15GB 流量免费额度,https 不额外计费。

    我正在用,挺不错的,就是需要每年续一次
    AllenHua
        26
    AllenHua  
       211 天前
    我选择在自己家里服务器上跑 Lsky Pro ,实际上 N1 就行,但我还是组了个 e3 平台。帮顶一下昨天哥们的图床帖
    https://www.v2ex.com/t/876776
    chenzhe
        27
    chenzhe  
       211 天前
    我选择白嫖京东。因为不太在意图片的可靠性,所以直接白嫖京东的图床,配合 uPic 直接拿到京东 cdn 的地址来用。
    docker hub "chenzheio/jd-upload"
    xiaoz
        28
    xiaoz  
       211 天前 via Android
    @hemingcn 域名不错
    lait
        29
    lait  
       211 天前 via Android
    服务器到期图片数据迁移方便吗?
    neochen13
        30
    neochen13  
       211 天前
    自建的那个带宽太痛苦了,一点都不爽
    vaynecv
        31
    vaynecv  
    OP
       210 天前
    @lait #29 有考虑这个问题,感觉迁移应该不是太坑吧
    @neochen13 #30 我那个轻量的是 2 核 4G,6M,感觉还行
    @chenzhe #27 这方案我也考虑过,哈哈
    @AllenHua #26 学习了~
    @lazyyz #25 好的,又拍云之前没了解过
    @pytth #19 都被你们玩坏了
    sampeng
        32
    sampeng  
       210 天前
    生命在于折腾。。。
    twofox
        33
    twofox  
       210 天前
    @yesterday1mo 图片两万多张吧,大小大概几个 G ,当初做毕业设计的时候爬的。后来就一直存放着
    现在主要用于写 md 自动上传的图片。一个月大概几十张。
    或者是工作的时候,存放一下几百兆的软件,当作中转站发给远程客户

    刚刚去看了一下近一个月的消费,花了 0.47
    twofox
        34
    twofox  
       210 天前
    @aptupdate 醒醒,我做毕业设计的时候还得自己花钱买图像审核,你以为图像审核不花钱的吗
    twofox
        35
    twofox  
       210 天前
    @yesterday1mo 噢,记错了,我两个 Bucket 加起来得 47GB ,一个月流出流量在 1GB
    PickleFish
        36
    PickleFish  
       210 天前
    yesterday1mo
        37
    yesterday1mo  
       208 天前
    嗯嗯,如果是这样使用,账单不多,但是如果是博客使用的话,就顶不住了。 博主他博客有使用,那样的话,账单应该会多一些。不知道有没有群友有你这样的存储大小并且使用博客的情况,能大概估算下账单
    关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   实用小工具   ·   956 人在线   最高记录 5556   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 22:48 · PVG 06:48 · LAX 15:48 · JFK 18:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.