在过去的几年里,我一直在思考如何构建 SaaS 并将其部署在我自己的基础设施上,而不需要使用 AWS 或 GCP 等任何云平台。在此存储库中,我记录了使用专有开源技术堆栈构建 AWS S3 克隆的进度,该克隆的功能与 S3 相同(自动存储桶部署、动态扩展卷、安全性等)。
@aws-sdk/client-s3
一起使用的实时 POC const { S3Client , ListObjectsV2Command , PutObjectCommand } = require ( "@aws-sdk/client-s3" ) ;
const Bucket = 'BUCKET_NAME_HERE' ;
const Namespace = 'NAMESPACE_HERE' ;
const accessKeyId = "xxxxxxxxxxxxxxxxxxxx" ;
const secretAccessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ;
( async function ( ) {
const client = new S3Client ( {
region : 'us-west-2' ,
endpoint : `https:// ${ Bucket } . ${ Namespace } .s3.anthonybudd.io` ,
forcePathStyle : true ,
sslEnabled : true ,
credentials : {
accessKeyId ,
secretAccessKey
} ,
} ) ;
const Key = ` ${ Date . now ( ) . toString ( ) } .txt` ;
await client . send ( new PutObjectCommand ( {
Bucket ,
Key ,
Body : `The time now is ${ new Date ( ) . toLocaleString ( ) } ` ,
ACL : 'public-read' ,
ContentType : 'text/plain' ,
} ) ) ;
console . log ( `New object successfully written to: ${ Bucket } :// ${ Key } n` ) ;
const { Contents } = await client . send ( new ListObjectsV2Command ( { Bucket } ) ) ;
console . log ( "Bucket Contents:" ) ;
console . log ( Contents . map ( ( { Key } ) => Key ) . join ( "n" ) ) ;
} ) ( ) ;
我们需要一种方法来存储登陆网站、前端应用程序和后端 REST API 的代码。我们还需要 CI/CD 来编译代码并将其部署到我们的基础设施中。 GitLab 将完美地完成这两项任务。
我们需要一个网络来让节点进行通信。对于路由器我选择了OpenWRT。这使我可以使用带有 USB 3.0 以太网适配器的 Raspberry Pi,这样它就可以充当互联网和“数据中心”之间的路由器。
当您在 AWS 上创建 S3 存储桶时,一切都是自动化的,数据中心中无需人工输入 CLI 命令来安排您的存储桶。该项目也必须以相同的方式工作,当用户想要创建资源时,它必须不需要任何人工输入来配置和部署存储桶。
由于 AWS 的规模,为每个用户提供自己的专用服务器硬件在经济上是不切实际的,而是将硬件虚拟化,允许多个租户共享单个物理 CPU。同样,将整个节点和 SSD 分配给每个存储桶也是不切实际的,为了最大限度地提高资源利用率,我的平台必须能够允许多个租户共享可用的 SSD 存储空间池。此外,AWS S3 存储桶可以存储无限量的数据,因此我的平台还需要允许用户拥有动态增加的数据量,该数据量将根据所需的存储空间自动扩展。
您需要同时通过 SSH 连接到多个设备,我已在此存储库中的所有命令中添加了注释(例如: [Console] nano /boot/config.txt
),以显示您应该在何处执行每个命令。通常你会看到[Console]
和[Node X]
。
因为这仍然是一个正在进行的工作,你会在整个过程中看到我的斜体注释“ AB: ”,请忽略。