Durante los últimos años he estado pensando en cómo podría crear SaaS e implementarlo en mi propia infraestructura sin necesidad de utilizar ninguna plataforma en la nube como AWS o GCP. En este repositorio, documento mi progreso en la creación de un clon de AWS S3 que funciona igual que S3 (implementación automatizada de depósitos, volúmenes en expansión dinámica, seguridad, etc.) utilizando una pila de tecnología exclusivamente de código abierto.
@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" ) ) ;
} ) ( ) ;
Necesitaremos una forma de almacenar el código para el sitio web de destino, la aplicación de front-end y la API REST de back-end. También necesitaremos CI/CD para compilar el código e implementarlo en nuestra infraestructura. GitLab funcionará perfectamente para estas dos tareas.
Necesitaremos una red para que los nodos se comuniquen. Para el enrutador, elegí OpenWRT. Esto me permite usar una Raspberry Pi con un adaptador Ethernet USB 3.0 para que pueda funcionar como enrutador entre Internet y el “centro de datos”.
Cuando crea un depósito S3 en AWS, todo está automatizado, no hay un ser humano en un centro de datos en algún lugar escribiendo comandos CLI para programar su depósito. Este proyecto también debe funcionar de la misma manera: cuando un usuario desea crear un recurso, no debe requerir ninguna intervención humana para aprovisionar e implementar el depósito.
Debido a la escala de AWS, no sería económicamente práctico darle a cada usuario su propio hardware de servidor dedicado; en cambio, el hardware está virtualizado, lo que permite que varios inquilinos compartan una única CPU física. De manera similar, no sería práctico asignar un nodo completo y un SSD a cada depósito; para maximizar la utilización de recursos, mi plataforma debe poder permitir que varios inquilinos compartan el conjunto de espacio de almacenamiento SSD disponible. Además, los depósitos de AWS S3 pueden almacenar una cantidad ilimitada de datos, por lo que mi plataforma también deberá permitir que un usuario tenga un volumen que aumenta dinámicamente y se escalará automáticamente según el espacio de almacenamiento requerido.
Necesitará SSH en varios dispositivos simultáneamente. He agregado una anotación (ejemplo: [Console] nano /boot/config.txt
) a todos los comandos en este repositorio, para mostrar dónde debe ejecutar cada comando. Generalmente verá [Console]
y [Node X]
.
Debido a que esto todavía es un trabajo en progreso, verás mis notas en cursiva " AB: " en todas partes, ignórala.