Nos últimos anos, tenho pensado em como poderia construir SaaS e implantá-lo em minha própria infraestrutura sem precisar usar nenhuma plataforma de nuvem como AWS ou GCP. Neste repositório, documento meu progresso na construção de um clone do AWS S3 que funciona da mesma forma que o S3 (implantação automatizada de bucket, expansão dinâmica de volumes, segurança, etc.) usando uma pilha de tecnologia exclusivamente de código aberto.
@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" ) ) ;
} ) ( ) ;
Precisaremos de uma maneira de armazenar o código do site de destino, do aplicativo front-end e da API REST back-end. Também precisaremos de CI/CD para compilar o código e implantá-lo em nossa infraestrutura. O GitLab funcionará perfeitamente para essas duas tarefas.
Precisaremos de uma rede para os nós se comunicarem. Para o roteador escolhi OpenWRT. Isso me permite usar um Raspberry Pi com um adaptador Ethernet USB 3.0 para que funcione como um roteador entre a internet e o “datacenter”.
Quando você cria um bucket S3 na AWS, tudo é automatizado, não há um humano em um datacenter em algum lugar digitando comandos CLI para agendar seu bucket. Este projeto também deve funcionar da mesma forma: quando um usuário deseja criar um recurso, não deve ser necessária nenhuma intervenção humana para provisionar e implantar o bucket.
Devido à escala da AWS, não seria financeiramente prático fornecer a cada usuário seu próprio hardware de servidor dedicado; em vez disso, o hardware é virtualizado, permitindo que vários locatários compartilhem uma única CPU física. Da mesma forma, não seria prático atribuir um nó inteiro e um SSD a cada bucket. Para maximizar a utilização de recursos, minha plataforma deve ser capaz de permitir que vários locatários compartilhem o conjunto de espaço de armazenamento SSD disponível. Além disso, os buckets AWS S3 podem armazenar uma quantidade ilimitada de dados, portanto, minha plataforma também precisará permitir que um usuário tenha um volume crescente dinamicamente que será escalonado automaticamente com base no espaço de armazenamento necessário.
Você precisará fazer SSH em vários dispositivos simultaneamente. Adicionei uma anotação (exemplo: [Console] nano /boot/config.txt
) a todos os comandos neste repositório, para mostrar onde você deve executar cada comando. Geralmente você verá [Console]
e [Node X]
.
Como este ainda é um trabalho em andamento, você verá minhas notas em itálico " AB: " do começo ao fim, por favor ignore.