In den letzten Jahren habe ich darüber nachgedacht, wie ich SaaS aufbauen und auf meiner eigenen Infrastruktur bereitstellen könnte, ohne Cloud-Plattformen wie AWS oder GCP nutzen zu müssen. In diesem Repo dokumentiere ich meine Fortschritte beim Erstellen eines Klons von AWS S3, der genauso funktioniert wie S3 (automatisierte Bucket-Bereitstellung, dynamisch wachsende Volumes, Sicherheit usw.) und einen ausschließlich Open-Source-Technologie-Stack verwendet.
@aws-sdk/client-s3
arbeitet 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" ) ) ;
} ) ( ) ;
Wir benötigen eine Möglichkeit, den Code für die Landing-Website, die Front-End-App und die Back-End-REST-API zu speichern. Wir benötigen außerdem CI/CD, um den Code zu kompilieren und in unserer Infrastruktur bereitzustellen. GitLab eignet sich perfekt für diese beiden Aufgaben.
Wir benötigen ein Netzwerk, damit die Knoten kommunizieren können. Als Router habe ich mich für OpenWRT entschieden. Dadurch kann ich einen Raspberry Pi mit einem USB 3.0-Ethernet-Adapter verwenden, sodass er als Router zwischen dem Internet und dem „Rechenzentrum“ fungieren kann.
Wenn Sie einen S3-Bucket auf AWS erstellen, ist alles automatisiert, es gibt keinen Menschen in einem Rechenzentrum, der CLI-Befehle eingibt, um Ihren Bucket zu planen. Auch dieses Projekt muss auf die gleiche Weise funktionieren: Wenn ein Benutzer eine Ressource erstellen möchte, darf für die Bereitstellung und Bereitstellung des Buckets keine menschliche Eingabe erforderlich sein.
Aufgrund der Größe von AWS wäre es finanziell nicht praktikabel, jedem Benutzer seine eigene dedizierte Serverhardware zur Verfügung zu stellen. Stattdessen wird die Hardware virtualisiert, sodass mehrere Mandanten eine einzige physische CPU gemeinsam nutzen können. Ebenso wäre es nicht praktikabel, jedem Bucket einen ganzen Knoten und eine SSD zuzuweisen. Um die Ressourcenauslastung zu maximieren, muss meine Plattform in der Lage sein, mehreren Mandanten die gemeinsame Nutzung des verfügbaren SSD-Speicherplatzpools zu ermöglichen. Darüber hinaus können AWS S3-Buckets eine unbegrenzte Menge an Daten speichern, sodass meine Plattform einem Benutzer auch ein dynamisch wachsendes Volumen ermöglichen muss, das automatisch basierend auf dem benötigten Speicherplatz skaliert.
Sie müssen eine SSH-Verbindung zu mehreren Geräten gleichzeitig herstellen. Ich habe allen Befehlen in diesem Repo eine Anmerkung (Beispiel: [Console] nano /boot/config.txt
) hinzugefügt, um zu zeigen, wo Sie jeden Befehl ausführen sollten. Im Allgemeinen werden [Console]
und [Node X]
angezeigt.
Da dies noch in Arbeit ist, werden Sie meine Notizen durchgehend in Kursivschrift „ AB: “ sehen, bitte ignorieren.