自建AWS S3存储服务

unsetunset前言unsetunset

AWS S3(Amazon S3,全名为亚马逊简易存储服务),是亚马逊公司利用其亚马逊网络服务系统所提供的网络在线存储服务。我常用的很多SaaS服务中提供的文件存储功能,底层也都是AWS S3,比如:

  • Cloudflare中的R2基于AWS S3构建的

  • Supabase页可以兼容AWS S3(自建时,默认直接文件存储到服务器本地)

本文,简单自建一个与AWS S3完全对齐的存储服务,后面我们自建Supabase时,就可以将文件提交到这里了。

unsetunset基础环境unsetunset

我在腾讯云上购买了韩国首尔的ubuntu 22.04 LTS 2核2G,注意要购买海外的,不然要花比较多精力处理网络问题。

首先,安装一下docker。在 Ubuntu 22.04 LTS 上安装 Docker 非常简单,你可以按照以下步骤进行:

  1. 更新包索引:在终端中执行以下命令来确保本地的包索引是最新的:

sudo apt update
  1. 安装依赖包

sudo apt install apt-transport-https ca-certificates curl software-properties-common
  1. 添加 Docker 的官方 GPG 密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 添加 Docker APT 仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 更新包索引(再次):为了确保新添加的 Docker APT 仓库生效,再次执行更新包索引的命令:

sudo apt update
  1. 安装 Docker CE:最后,执行以下命令安装 Docker 社区版(Docker CE):

sudo apt install docker-ce
  1. 启动 Docker 服务:安装完成后,Docker 服务会自动启动。你可以使用以下命令来检查 Docker 服务的状态:

sudo systemctl status docker

如果 Docker 正在运行,你会看到类似于 "Active: active (running)" 的信息。

现在,Docker 已经成功安装在你的 Ubuntu 22.04 LTS 上了。你可以尝试运行 docker --version 来验证 Docker 是否安装成功。

unsetunset基于minio构建S3unsetunset

minio官网:https://min.io/,它是一个完全兼容S3的开源存储方案,你可以基于他们的docker镜像自建minio,从而实现自己的存储服务,也可以使用他们提供的(Minio自己号称是世界上最快的对象存储服务),这里我们选择自建。

创建 docker-compose.yml 文件,写入如下内容:

version: '3.8'
services:minio:image: quay.io/minio/miniocontainer_name: miniovolumes:- ./minio-data:/dataenvironment:MINIO_ROOT_USER: your_root_userMINIO_ROOT_PASSWORD: your_root_passwordMINIO_SERVER_URL: https://storage.yourdomain.comcommand: server /data --console-address ":9090"nginx:image: 'jc21/nginx-proxy-manager:latest'restart: unless-stoppedports:- '80:80'- '81:81'- '443:443'volumes:- ./nginx-data:/data- ./nginx-letsencrypt:/etc/letsencrypt

你需要修改MINIO_ROOT_USER、MINIO_ROOT_PASSWORD和MINIO_SERVER_URL,用户名和密码在你构建好minio时,用于登录minio服务,而MINIO_SERVER_URL是我们上传文件后,我们需要访问这个文件时,所需要使用的url,比如,我将MINIO_SERVER_URL设置成https://s3.xxxx.run,那么当我们访问minio中的文件,就会使用https://s3.xxxx.run,如下图:

47efde0bfa7126a2d5a7ba4da7be0ce3.png

除了minio镜像外,我们还构建了nginx-proxy-manager服务,这个服务其实就是将nginx的各种功能通过一个webui提供出来,方便我们使用,然后还集成了一些其他服务,比如Let's Encrypt服务,这样我们就可以通过nginx-proxy-manager快速将域名从http转成https了。

docker-compose.yml内容解释完了,我们在docker-compose.yml同目录下,运行docker compose up -d,然后等待2个镜像安装并启动相应的容器,等容器启动完后,我们访问:http://your-server-ip:81就可以进入nginx-proxy-manager的页面,此时我们使用默认账号密码登录(username:admin@example.com,password:changeme),第一次登录需要修改邮箱和密码。

bf2d3966058e942928cfb6a5f1c2ad3a.png

unsetunsetnpm配置unsetunset

这里的npm是nginx-proxy-manager的简称,不是npmjs。

我们一开始使用ip:81去访问npm,但这是不太安全的,因为是http,容易被中间人攻击(虽然我感觉早期没人会攻击你,哈哈),所以我们还是用https+域名的方式访问npm比较好。

进入npm,点击Hosts -> Proxy Hosts -> Add New Proxy Host。

4214c86b2bc013c845b4d3af03c959a6.png

我在name.com购买了域名,注意,在name.com购买域名时,会默认将域名的SSL证书、whois信息保护给购买,我们需要取消这个,因为我们会使用Let's Encrypt来创建证书,我一开始直接在name.com购买了域名+SSL证书服务,导致npm操作时报错,然后我又购买了一个新域名,此时没有去购买SSL证书,操作成功。

这里有一些细节,不同的CA(证书颁发机构)是否是冲突的,比如name.com自己的CA去颁发SSL证书后,是否会导致Let's Encrypt无法成功,我没有理清这里所有技术细节(就是没花时间去实验,单纯找GPT4聊了一下,感觉GPT4的回答不太符合我的技术直觉,就不贴出来了),如果你想一口气成功,就听我的,不要在name.com上购买SSL证书服务先。

假设,我购买了xxx.run的域名(没在name.com上购买SSL证书服务),此时按下图操作,将:

  • xxx.run

  • www.xxx.run

  • proxy.xxx.run

  • s3.xxx.run

  • s3-dash.xxx.run

都添加成A Type,然后映射到服务器公网IP上。

c1c77bdf20d901448d49003ff54cf6bc.png

回到npm,首先,我们先将proxy.xxx.run设成成npm的url,并开启https。

点击New Proxy Host时,先配置Domain Names。(图是Edit Proxy Host,是因为我创建成功了,为了截图,我打开了Edit,截图给大家看,跟New Proxy Host没有区别)

c2e17629ee9d168ac49064510c427b8b.png

我们将proxy.xxx.run添加到Domain Names里,然后在Scheme中使用http(是的,不是https),然后Forward Hostname/IP处,填入127.0.0.1,然后Forward Port为81,这样用户访问proxy.xxx.run时,就会命中这条proxy host规则,然后被nginx转发到127.0.0.1:81的服务上。

然后去到SSL配置,为域名设置https。

a073cdd533ac8ccb80d3accacacbe1d6.png

此时点击Save,就成功了。ac200d5ae33cdffedb62672c0df2a065.png

可以看见STATUS为Online。

当然我一开始也踩了坑,STATUS是Unknown,此时,就需要看一下日志。

通过 sudo docker logs -f npm容器id 的方式,实时查看npm的日志,然后重复去点击一次Save,看看是否有报错,然后再基于报错信息去查询,不要通过f12,通过chrome的Console中的报错去Google,因为这里的报错不准确,你难以定位具体的原因。

设置成功后,就可以通过proxy.xxx.run访问npm了,此时就是https的。

fe232a5d01411650bdbc48e72c3c3eed.png

接着,我们需要配置一下minio的路由。

我们先创建s3.xxx.run的Proxy Host配置,这里需要跟docker-compose.yml中minio配置的MINIO_SERVER_URL一致,如下图:

5a8e7aa17cdae0cf065bf9073cc4ea5c.png

注意,Forward Hostname/IP 处,我们写minio,Port使用的是9000,这是docker-compose.yml中minio的名称,即docker内部网络可以通过http://minio:9000去访问minio服务,这样用户访问s3.xxx.com,nginx会将流量转发到http://minio:9000服务上。

怎么判断Port是9000的?我们可以通过sudo docker ps查看到。

ade86517b96fa7a641729de8f2976ac1.png

然后,SSL设置,也是一样的,通过Let's Encrypt服务为s3.xxx.run生成SSL证书,开启https。

ade8e22d5ab7ae6f468fc4c26735a140.png

因为s3.xxx.run是给上传文件使用的,比如我们上传了图片到minio构建的存储服务,此时想访问这个图片时,就需要使用s3.xxx.run,因为资源名称、资源大小、资源类型不可控,为了避免资源无法被访问,我们还需要配置一下nginx,实现如下效果:

  • 允许url中存在特殊字符

  • 允许访问任意大小的资源

  • 停用缓存

71fb299d32871e2f44b940361b377f73.png上图的内容如下:

# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;

至此,s3.xxx.run就配置完了,我们还需配置一个url,才能访问minio的web ui服务,通过web ui服务,我们才能创建api key,有了api key,我们才能使用代码上传文件。

c82bdcfa55c63fe8cf651a97415c3814.png

Port使用了9090,这是因为docker-compose.yml中minio的配置,command使用了9090,所以我们需要转发到9090。

然后SSL是一样的设置。

74104f549566f6d225c5f69d8a1e59a1.png

此时,访问s3-dash.xxx.com,就可以访问到minio服务了,使用docker-compose.yml中你设置的username和password。

c959f581ca5310f62c9e7e0c5cadd4c4.png

进来后,我们点击【Object Browser】 -> 【Create a Bucket】,创建好,用于存储资源的桶。1b0f7ec2196974c9b5702cddf34cc9b4.png

cc0c431dfd374ec0cc6ab189aed49ff8.png

然后,我们上传一张图片:

799318d4ef5c2b5feec3afaae8417e39.png

查看图片信息:

39c8af8523d0ccb56c56d9965fae308e.png

此时,点击share,就会获得图片的url,其他用户就可以通过这个url访问这张图片资源了。

为了让代码可以使用,我们可以创建Access Keys。

f9e33677d63cce1fe1b0090b13f0de08.png

创建好后,可以直接修改一下将文件上传到aws s3的代码,换一下access key等内容,代码如下:

import boto3
from botocore.client import Configaccess_key = 'xxx'
secret_key = 'xxx'
# 桶名称
bucket_name = 'test'# S3 兼容的终端节点
endpoint_url = 'https://s3.xxx.run'# 创建 S3 客户端
s3_client = boto3.client('s3', endpoint_url=endpoint_url,aws_access_key_id=access_key,aws_secret_access_key=secret_key,config=Config(signature_version='s3v4'))# 要上传的文件路径
file_path = 'cover.jpg'
file_key = 'cover-1.jpg'  # 存储桶中的文件名# 上传文件
try:s3_client.upload_file(file_path, bucket_name, file_key)print(f'文件成功上传到 {bucket_name}/{file_key}')
except Exception as e:print(f'上传失败: {e}')

运行上面的代码,会成功,然后刷新一下minio,就会看到conver-1.jpg,可以正常访问和下载。

757039ec63e65bd60ff810aa953c8238.pngminio还提供Monitoring等功能,可自行探索。

3310982f77a6361d7b337c0c4f505abe.png

unsetunset结尾unsetunset

至此,自建aws s3就完成了。

我是二两,下篇文章见,后面几篇文章,我会开始分析supabase源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/688795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线代:认识行列式、矩阵和向量

本文主要参考的视频教程如下: 8小时学完线代【中国大学MOOC*小元老师】线性代数速学_哔哩哔哩_bilibili 另外这个视频可以作为补充: 【考研数学 线性代数 基础课】—全集_哔哩哔哩_bilibili 行列式的概念和定义 一般会由方程组来引出行列式 比如一个二阶…

【Python】测量WAV文件播放时长

问题 windows播放WAV音频文件,一般使用API函数,如PlaySound。实际使用发现,从调用PlaySound到实际开始播放存在200ms以上的延时,在游戏编程中音效实时性是个需要解决的问题。 本文主要讨论,windows播放WAV文件的衍生…

后端开发怎么学?

后端开发怎么学? 后端开发可以简单地理解为与前端开发相对应的开发方向。前端开发主要负责构建用户界面、维护用户体验等方面的工作,而后端开发则主要负责处理数据、逻辑和算法等方面的工作。后端开发旨在为前端应用程序提供支持,以帮助实现可…

微信小程序之开发会议OA项目

目录 前言 本篇目标 首页 会议 投票 个人中心 会议OA项目-首页 配置 tabbar mock工具 page swiper 会议信息 会议OA项目-会议 自定义tabs组件 会议管理 会议OA项目-投票 会议OA项目-个人中心 前言 文章含源码资源,投票及个人中心详细自行查看…

【开源】SpringBoot框架开发服装店库存管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服装档案模块2.4 服装入库模块2.5 服装出库模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 服装档案表3.2.3 服装入库表3.2.4 服装出库表 四、系统展示五、核心代码5.…

VTK Python PyQt 监听键盘 控制 Actor 移动 变色

KeyPressInteractorStyle 在vtk 中有时我们需要监听 键盘或鼠标做一些事; 1. 创建 Actor; Sphere vtk.vtkSphereSource() Sphere.SetRadius(10)mapper vtk.vtkPolyDataMapper() mapper.SetInputConnection(Sphere.GetOutputPort()) actor vtk.vtkAc…

立创EDA专业版快速使用和一些快捷键

立创EDA专业版 介绍原理图PCB快捷键原理图PCB 介绍 器件 符号 封装 3D模型 属性 仅支持放置器件在原理图或PCB 一个Board(板)只能有一个原理图和PCB,一个原理图可以有多页 原理图 网络标签 是给连接线命名 新建图页 如果一个图页上画不下&#…

第4讲 小程序首页实现

首页 create.vue <template><view class"vote_type"><view class"vote_tip_wrap"><text class"type_tip">请选择投票类型</text><!-- <text class"share">&#xe739;分享给朋友</text&g…

STM32中断定时器的使用

使用systimer来产生较为精确的定时&#xff0c;之前使用for循环来产生。 用示例工程时产生错误&#xff0c;原因是调用F103的3种容量器件&#xff0c;需要更换S汇编头函数。 另外在工程设置中&#xff0c;需要把HD设置为MD&#xff0c;重新编译即可成功。

二叉树基础总结

目录 树的定义&#xff1a; 深度和高度&#xff1a; 二叉树 由来 二叉树种类&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 严格二叉树&#xff08;Strict Binary Tree&#xff09;&#xff1a; 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;…

DoRA(权重分解低秩适应):一种新颖的模型微调方法

来自&#xff1a;小互 DoRA&#xff08;权重分解低秩适应&#xff09;&#xff1a;一种新颖的模型微调方法 DoRA在LoRA的基础上进一步发展&#xff0c;通过将预训练权重分解为“幅度”和“方向”两个部分进行微调。 这种权重分解方法允许DoRA更精细地控制模型的学习过程&…

基于函数计算AIGC生成图应用

目录 基于函数计算部署AIGC应用的主要步骤 创建Stable Diffusion模型的应用 访问应用实现文字生图 函数的查看与管理 基于函数计算部署AIGC应用的主要步骤 用函数计算实现AIGC只要简单的三步&#xff0c;分别是创建应用、运行应用及查看管理。 创建Stable Diffusion模型的应…

【大厂AI课学习笔记】【2.2机器学习开发任务实例】(3)数据准备和数据预处理

项目开始&#xff0c;首先要进行数据准备和数据预处理。 数据准备的核心是找到这些数据&#xff0c;观察数据的问题。 数据预处理就是去掉脏数据。 缺失值的处理&#xff0c;格式转换等。 延伸学习&#xff1a; 在人工智能&#xff08;AI&#xff09;的众多工作流程中&#…

Python如何实现定时发送qq消息

因为生活中老是忘记各种事情&#xff0c;刚好又在学python&#xff0c;便突发奇想通过python实现提醒任务的功能&#xff08;尽管TIM有定时功能&#xff09;&#xff0c;也可定时给好友、群、讨论组发送qq消息。其工作流程是&#xff1a;访问数据库提取最近计划——>根据数据…

打开ps显示找不到dll怎么办?这四种方法可快速修复

在计算机操作系统中&#xff0c;当执行某程序或运行特定软件时&#xff0c;如果系统提示“ps显示找不到dll文件”&#xff0c;这其实是一个较为常见的问题现象。动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统中不可或缺的重要组件&#xff0c;它包含了大量可被多…

IDEA实现序列化时如何自动生成serialVersionUID

实现步骤&#xff1a;1.安装GenerateSerialVersionUID插件 2.点击idea左上角File -> Settings -> Editor -> Inspections -> 搜索 Serialization issues &#xff0c;找到 Serializable class without ‘serialVersionUID’ ->打上勾&#xff0c;再点击Apply-&…

简单介绍数据结构的基本概念

数据结构的基本概念 常用术语 数据 数据&#xff08;Data&#xff09;是客观事物的符号表示&#xff0c;是所有能输入到计算机中并被计算机程序处理的符号的总称。例如&#xff1a;整数、字符串、图形、图像、声音和动画等 数据元素 数据元素&#xff08;Data Element&…

每日OJ题_算法_递归③力扣206. 反转链表

目录 力扣206. 反转链表 解析代码 力扣206. 反转链表 206. 反转链表 LCR 024. 反转链表 难度 简单 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,…

【机构内部教程】Jmeter性能测试【一】:性能测试全套教程

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

【漏洞复现-通达OA】通达OA getcallist存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…