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

MinIO+PicGo+Nginx+Typora 自建图床

  •  
  •   vaynecv · 2022-09-01 14:56:47 +08:00 · 4829 次点击
    这是一个创建于 806 天前的主题,其中的信息可能已经有所发展或是发生改变。

    写在前面

    需求背景

    ​ 自从开始写文章后,就遇到了一个问题,图床;我这边是使用 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最新镜像

    [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 使用
    • 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 配置目录
    [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
    
    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 云的轻量服务器。

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

    39 条回复    2023-07-17 10:54:17 +08:00
    twofox
        1
    twofox  
       2022-09-01 15:57:06 +08:00
    我选择阿里云 oss ,人生苦短,能少折腾就少折腾,速度还比自己服务器的小水管快
    perfectlife
        2
    perfectlife  
       2022-09-01 16:00:08 +08:00
    oss +1
    lisongeee
        3
    lisongeee  
       2022-09-01 16:06:40 +08:00
    我一般都是复制图片,然后到 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  
       2022-09-01 16:07:14 +08:00 via Android
    picx 传 github 还有 cdn
    yesterday1mo
        5
    yesterday1mo  
       2022-09-01 16:08:36 +08:00
    @twofox 目前存储了多少图片,每个月的账单是多少?
    ltkun
        6
    ltkun  
       2022-09-01 16:09:21 +08:00 via Android
    ![Screenshot_20220901-160800]( https://git.poker/ltkun/img/blob/master/20220901/Screenshot_20220901-160800.7joxrxoyo0o0.webp?raw=true)
    vaynecv
        7
    vaynecv  
    OP
       2022-09-01 16:14:21 +08:00
    @twofox #1 哈哈,当然可以的,不过这个折腾的成本也比较小;七牛云的我用了自定义域名,但是 HTTPS 受限,就没用了

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

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

    刚刚去看了一下近一个月的消费,花了 0.47
    twofox
        34
    twofox  
       2022-09-02 15:19:33 +08:00
    @aptupdate 醒醒,我做毕业设计的时候还得自己花钱买图像审核,你以为图像审核不花钱的吗
    twofox
        35
    twofox  
       2022-09-02 15:21:55 +08:00
    @yesterday1mo 噢,记错了,我两个 Bucket 加起来得 47GB ,一个月流出流量在 1GB
    PickleFish
        36
    PickleFish  
       2022-09-02 16:01:28 +08:00
    yesterday1mo
        37
    yesterday1mo  
       2022-09-04 18:45:17 +08:00
    嗯嗯,如果是这样使用,账单不多,但是如果是博客使用的话,就顶不住了。 博主他博客有使用,那样的话,账单应该会多一些。不知道有没有群友有你这样的存储大小并且使用博客的情况,能大概估算下账单
    Nanmener
        38
    Nanmener  
       2023-07-15 16:09:33 +08:00
    ![图片挂了]https://media.opennet.top/i/2023/07/15/64b253c01c98f.png

    楼主贴的图片挂了,是更换了方案吗
    vaynecv
        39
    vaynecv  
    OP
       2023-07-17 10:54:17 +08:00
    @Nanmener #38 哈哈,是的,不好意思
    我找了个其他平台的链接,你先看这个 https://juejin.cn/post/7138318205512548366
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1048 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 19:45 · PVG 03:45 · LAX 11:45 · JFK 14:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.