建设网站最重要的是什么意思,巩义网站建设与制作,凡科建站弊端,济宁网站建设案例展示unsetunset前言unsetunset AWS S3#xff08;Amazon S3#xff0c;全名为亚马逊简易存储服务#xff09;#xff0c;是亚马逊公司利用其亚马逊网络服务系统所提供的网络在线存储服务。我常用的很多SaaS服务中提供的文件存储功能#xff0c;底层也都是AWS S3#xff0c;比… unsetunset前言unsetunset AWS S3Amazon 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 非常简单你可以按照以下步骤进行 更新包索引在终端中执行以下命令来确保本地的包索引是最新的 sudo apt update 安装依赖包 sudo apt install apt-transport-https ca-certificates curl software-properties-common 添加 Docker 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 添加 Docker APT 仓库 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable 更新包索引再次为了确保新添加的 Docker APT 仓库生效再次执行更新包索引的命令 sudo apt update 安装 Docker CE最后执行以下命令安装 Docker 社区版Docker CE sudo apt install docker-ce 启动 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 :9090nginx:image: jc21/nginx-proxy-manager:latestrestart: unless-stoppedports:- 80:80- 81:81- 443:443volumes:- ./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如下图 除了minio镜像外我们还构建了nginx-proxy-manager服务这个服务其实就是将nginx的各种功能通过一个webui提供出来方便我们使用然后还集成了一些其他服务比如Lets 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的页面此时我们使用默认账号密码登录usernameadminexample.compasswordchangeme第一次登录需要修改邮箱和密码。 unsetunsetnpm配置unsetunset 这里的npm是nginx-proxy-manager的简称不是npmjs。 我们一开始使用ip:81去访问npm但这是不太安全的因为是http容易被中间人攻击虽然我感觉早期没人会攻击你哈哈所以我们还是用https域名的方式访问npm比较好。 进入npm点击Hosts - Proxy Hosts - Add New Proxy Host。 我在name.com购买了域名注意在name.com购买域名时会默认将域名的SSL证书、whois信息保护给购买我们需要取消这个因为我们会使用Lets Encrypt来创建证书我一开始直接在name.com购买了域名SSL证书服务导致npm操作时报错然后我又购买了一个新域名此时没有去购买SSL证书操作成功。 这里有一些细节不同的CA证书颁发机构是否是冲突的比如name.com自己的CA去颁发SSL证书后是否会导致Lets Encrypt无法成功我没有理清这里所有技术细节就是没花时间去实验单纯找GPT4聊了一下感觉GPT4的回答不太符合我的技术直觉就不贴出来了如果你想一口气成功就听我的不要在name.com上购买SSL证书服务先。 假设我购买了xxx.run的域名没在name.com上购买SSL证书服务此时按下图操作将 xxx.runwww.xxx.runproxy.xxx.runs3.xxx.runs3-dash.xxx.run 都添加成A Type然后映射到服务器公网IP上。 回到npm首先我们先将proxy.xxx.run设成成npm的url并开启https。 点击New Proxy Host时先配置Domain Names。图是Edit Proxy Host是因为我创建成功了为了截图我打开了Edit截图给大家看跟New Proxy Host没有区别 我们将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。 此时点击Save就成功了。 可以看见STATUS为Online。 当然我一开始也踩了坑STATUS是Unknown此时就需要看一下日志。 通过 sudo docker logs -f npm容器id 的方式实时查看npm的日志然后重复去点击一次Save看看是否有报错然后再基于报错信息去查询不要通过f12通过chrome的Console中的报错去Google因为这里的报错不准确你难以定位具体的原因。 设置成功后就可以通过proxy.xxx.run访问npm了此时就是https的。 接着我们需要配置一下minio的路由。 我们先创建s3.xxx.run的Proxy Host配置这里需要跟docker-compose.yml中minio配置的MINIO_SERVER_URL一致如下图 注意Forward Hostname/IP 处我们写minioPort使用的是9000这是docker-compose.yml中minio的名称即docker内部网络可以通过http://minio:9000去访问minio服务这样用户访问s3.xxx.comnginx会将流量转发到http://minio:9000服务上。 怎么判断Port是9000的我们可以通过sudo docker ps查看到。 然后SSL设置也是一样的通过Lets Encrypt服务为s3.xxx.run生成SSL证书开启https。 因为s3.xxx.run是给上传文件使用的比如我们上传了图片到minio构建的存储服务此时想访问这个图片时就需要使用s3.xxx.run因为资源名称、资源大小、资源类型不可控为了避免资源无法被访问我们还需要配置一下nginx实现如下效果 允许url中存在特殊字符允许访问任意大小的资源停用缓存 上图的内容如下 # 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我们才能使用代码上传文件。 Port使用了9090这是因为docker-compose.yml中minio的配置command使用了9090所以我们需要转发到9090。 然后SSL是一样的设置。 此时访问s3-dash.xxx.com就可以访问到minio服务了使用docker-compose.yml中你设置的username和password。 进来后我们点击【Object Browser】 - 【Create a Bucket】创建好用于存储资源的桶。 然后我们上传一张图片 查看图片信息 此时点击share就会获得图片的url其他用户就可以通过这个url访问这张图片资源了。 为了让代码可以使用我们可以创建Access Keys。 创建好后可以直接修改一下将文件上传到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_urlendpoint_url,aws_access_key_idaccess_key,aws_secret_access_keysecret_key,configConfig(signature_versions3v4))# 要上传的文件路径
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可以正常访问和下载。 minio还提供Monitoring等功能可自行探索。 unsetunset结尾unsetunset 至此自建aws s3就完成了。 我是二两下篇文章见后面几篇文章我会开始分析supabase源码。