ในช่วงไม่กี่ปีที่ผ่านมา ฉันคิดถึงวิธีที่ฉันสามารถสร้าง SaaS และปรับใช้บนโครงสร้างพื้นฐานของตัวเอง โดยไม่จำเป็นต้องใช้แพลตฟอร์มระบบคลาวด์ใดๆ เช่น AWS หรือ GCP ใน repo นี้ ฉันบันทึกความคืบหน้าของฉันในการสร้างโคลนของ AWS S3 ที่ทำงานเหมือนกับ S3 (การปรับใช้บัคเก็ตอัตโนมัติ การขยายวอลุ่มแบบไดนามิก ความปลอดภัย ฯลฯ) โดยใช้สแต็กเทคโนโลยีโอเพ่นซอร์สโดยเฉพาะ
@aws-sdk/client-s3
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" ) ) ;
} ) ( ) ;
เราจะต้องมีวิธีจัดเก็บโค้ดสำหรับเว็บไซต์ Landing, แอปส่วนหน้า และ REST API ของส่วนหลัง นอกจากนี้เรายังจำเป็นต้องมี CI/CD เพื่อคอมไพล์โค้ดและปรับใช้ในโครงสร้างพื้นฐานของเรา GitLab จะทำงานได้อย่างสมบูรณ์แบบสำหรับสองงานนี้
เราจะต้องมีเครือข่ายสำหรับโหนดในการสื่อสาร สำหรับเราเตอร์ ฉันเลือก OpenWRT ซึ่งช่วยให้ฉันใช้ Raspberry Pi กับอะแดปเตอร์อีเทอร์เน็ต USB 3.0 ได้ เพื่อให้สามารถทำงานเป็นเราเตอร์ระหว่างอินเทอร์เน็ตและ "ศูนย์ข้อมูล" ได้
เมื่อคุณสร้างบัคเก็ต S3 บน AWS ทุกอย่างจะเป็นไปโดยอัตโนมัติ ไม่มีมนุษย์อยู่ในศูนย์ข้อมูลที่ไหนสักแห่งโดยพิมพ์คำสั่ง CLI เพื่อกำหนดเวลาบัคเก็ตของคุณ โปรเจ็กต์นี้จะต้องทำงานในลักษณะเดียวกัน เมื่อผู้ใช้ต้องการสร้างทรัพยากร จะต้องไม่ต้องใช้อินพุตจากมนุษย์เพื่อจัดเตรียมและปรับใช้บัคเก็ต
เนื่องจากขนาดของ AWS จึงไม่คุ้มที่จะมอบฮาร์ดแวร์เซิร์ฟเวอร์เฉพาะให้กับผู้ใช้แต่ละราย แต่ฮาร์ดแวร์จะถูกจำลองเสมือน ซึ่งช่วยให้ผู้เช่าหลายรายแชร์ CPU กายภาพตัวเดียวได้ ในทำนองเดียวกัน การกำหนดโหนดทั้งหมดและ SSD ให้กับแต่ละบัคเก็ตนั้นเป็นไปไม่ได้ เพื่อเพิ่มการใช้ทรัพยากรให้สูงสุด แพลตฟอร์มของฉันต้องสามารถอนุญาตให้ผู้เช่าหลายรายแชร์พูลพื้นที่จัดเก็บข้อมูล SSD ที่พร้อมใช้งานได้ นอกจากนี้ บัคเก็ต AWS S3 ยังสามารถจัดเก็บข้อมูลได้ไม่จำกัด ดังนั้นแพลตฟอร์มของฉันจึงต้องอนุญาตให้ผู้ใช้มีปริมาณที่เพิ่มขึ้นแบบไดนามิกซึ่งจะปรับขนาดอัตโนมัติตามพื้นที่จัดเก็บข้อมูลที่ต้องการ
คุณจะต้อง SSH ลงในอุปกรณ์หลายเครื่องพร้อมกัน ฉันได้เพิ่มคำอธิบายประกอบ (ตัวอย่าง: [Console] nano /boot/config.txt
) ให้กับคำสั่งทั้งหมดใน repo นี้ เพื่อแสดงตำแหน่งที่คุณควรดำเนินการแต่ละคำสั่ง โดยทั่วไปคุณจะเห็น [Console]
และ [Node X]
เนื่องจากยังอยู่ในระหว่างดำเนินการอย่างมาก คุณจะเห็นบันทึกย่อของฉันเป็นตัวเอียง " AB: " ตลอด โปรดอย่าสนใจ