Selama beberapa tahun terakhir, saya memikirkan cara membangun SaaS dan menerapkannya di infrastruktur saya sendiri tanpa perlu menggunakan platform cloud apa pun seperti AWS atau GCP. Dalam repo ini saya mendokumentasikan kemajuan saya dalam membangun tiruan AWS S3 yang berfungsi sama dengan S3 (penerapan bucket otomatis, perluasan volume secara dinamis, keamanan, dll) menggunakan tumpukan teknologi sumber terbuka eksklusif.
@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" ) ) ;
} ) ( ) ;
Kita memerlukan cara untuk menyimpan kode untuk situs web arahan, aplikasi front-end, dan REST API back-end. Kami juga memerlukan CI/CD untuk mengkompilasi kode dan menerapkannya ke infrastruktur kami. GitLab akan bekerja dengan sempurna untuk dua tugas ini.
Kita memerlukan jaringan agar node dapat berkomunikasi. Untuk router saya memilih OpenWRT. Hal ini memungkinkan saya untuk menggunakan Raspberry Pi dengan adaptor USB 3.0 Ethernet sehingga dapat berfungsi sebagai router antara internet dan “pusat data”.
Saat Anda membuat bucket S3 di AWS, semuanya otomatis, tidak ada manusia di pusat data yang mengetikkan perintah CLI untuk menjadwalkan bucket Anda. Proyek ini juga harus bekerja dengan cara yang sama, ketika pengguna ingin membuat sumber daya, ia tidak boleh memerlukan masukan manusia apa pun untuk menyediakan dan menerapkan bucket.
Karena skala AWS, maka tidak praktis secara finansial untuk memberikan perangkat keras server khusus kepada setiap pengguna, sebaliknya perangkat keras tersebut divirtualisasikan, sehingga memungkinkan banyak penyewa untuk berbagi satu CPU fisik. Demikian pula, tidak praktis untuk menetapkan seluruh node dan SSD ke setiap bucket, untuk memaksimalkan pemanfaatan sumber daya, platform saya harus dapat mengizinkan banyak penyewa untuk berbagi kumpulan ruang penyimpanan SSD yang tersedia. Selain itu, bucket AWS S3 dapat menyimpan data dalam jumlah tidak terbatas, sehingga platform saya juga harus mengizinkan pengguna untuk memiliki volume yang meningkat secara dinamis yang akan diskalakan secara otomatis berdasarkan ruang penyimpanan yang diperlukan.
Anda perlu melakukan SSH ke beberapa perangkat secara bersamaan. Saya telah menambahkan anotasi (contoh: [Console] nano /boot/config.txt
) ke semua perintah di repo ini, untuk menunjukkan di mana Anda harus menjalankan setiap perintah. Umumnya Anda akan melihat [Console]
dan [Node X]
.
Karena ini masih dalam proses, Anda akan melihat catatan saya dicetak miring " AB: ", harap abaikan.