在過去的幾年裡,我一直在思考如何建置 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: ”,請忽略。