Au cours des dernières années, j'ai réfléchi à la façon dont je pourrais créer un SaaS et le déployer sur ma propre infrastructure sans avoir besoin d'utiliser des plates-formes cloud comme AWS ou GCP. Dans ce référentiel, je documente mes progrès dans la création d'un clone d'AWS S3 qui fonctionne de la même manière que S3 (déploiement automatisé de compartiments, expansion dynamique des volumes, sécurité, etc.) en utilisant une pile technologique exclusivement open source.
@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" ) ) ;
} ) ( ) ;
Nous aurons besoin d'un moyen de stocker le code du site Web de destination, de l'application frontale et de l'API REST back-end. Nous aurons également besoin de CI/CD pour compiler le code et le déployer dans notre infrastructure. GitLab fonctionnera parfaitement pour ces deux tâches.
Nous aurons besoin d'un réseau pour que les nœuds communiquent. Pour le routeur, j'ai choisi OpenWRT. Cela me permet d'utiliser un Raspberry Pi avec un adaptateur Ethernet USB 3.0 afin qu'il puisse fonctionner comme un routeur entre Internet et le « datacenter ».
Lorsque vous créez un compartiment S3 sur AWS, tout est automatisé, il n'y a personne dans un centre de données quelque part qui tape des commandes CLI pour planifier votre compartiment. Ce projet doit également fonctionner de la même manière : lorsqu'un utilisateur souhaite créer une ressource, il ne doit nécessiter aucune intervention humaine pour provisionner et déployer le bucket.
En raison de l'ampleur d'AWS, il ne serait pas financièrement pratique de donner à chaque utilisateur son propre matériel de serveur dédié. Le matériel est plutôt virtualisé, permettant à plusieurs locataires de partager un seul processeur physique. De même, il ne serait pas pratique d'attribuer un nœud entier et un SSD à chaque compartiment. Pour maximiser l'utilisation des ressources, ma plate-forme doit pouvoir permettre à plusieurs locataires de partager le pool d'espace de stockage SSD disponible. De plus, les compartiments AWS S3 peuvent stocker une quantité illimitée de données, ma plate-forme devra donc également permettre à un utilisateur de disposer d'un volume augmentant de manière dynamique et qui évoluera automatiquement en fonction de l'espace de stockage requis.
Vous devrez vous connecter simultanément à plusieurs appareils via SSH. J'ai ajouté une annotation (exemple : [Console] nano /boot/config.txt
) à toutes les commandes de ce référentiel, pour indiquer où vous devez exécuter chaque commande. Généralement, vous verrez [Console]
et [Node X]
.
Parce qu'il s'agit encore d'un travail en cours, vous verrez mes notes en italique « AB : » tout au long, veuillez les ignorer.