Последние несколько лет я думал о том, как я мог бы создать SaaS и развернуть его в своей собственной инфраструктуре без необходимости использовать какие-либо облачные платформы, такие как AWS или GCP. В этом репозитории я документирую свой прогресс в создании клона AWS S3, который функционирует так же, как S3 (автоматическое развертывание сегментов, динамическое расширение томов, безопасность и т. д.) с использованием исключительно стека технологий с открытым исходным кодом.
@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" ) ) ;
} ) ( ) ;
Нам понадобится способ хранения кода целевого веб-сайта, внешнего приложения и внутреннего REST API. Нам также понадобится CI/CD для компиляции кода и его развертывания в нашей инфраструктуре. GitLab отлично подойдет для этих двух задач.
Нам понадобится сеть для связи узлов. В качестве роутера я выбрал OpenWRT. Это позволяет мне использовать Raspberry Pi с адаптером USB 3.0 Ethernet, чтобы он мог работать как маршрутизатор между Интернетом и «центром обработки данных».
Когда вы создаете корзину S3 на AWS, все автоматизировано, где-то в центре обработки данных нет человека, который набирает команды CLI, чтобы запланировать работу вашей корзины. Этот проект также должен работать таким же образом: когда пользователь хочет создать ресурс, ему не должно требоваться никакого человеческого вмешательства для подготовки и развертывания корзины.
Из-за масштабов AWS было бы экономически нецелесообразно предоставлять каждому пользователю собственное выделенное серверное оборудование. Вместо этого оборудование виртуализируется, что позволяет нескольким арендаторам совместно использовать один физический процессор. Точно так же было бы нецелесообразно назначать каждому сегменту целый узел и твердотельный накопитель. Для максимального использования ресурсов моя платформа должна позволять нескольким арендаторам совместно использовать пул доступного пространства хранения SSD. Кроме того, корзины AWS S3 могут хранить неограниченный объем данных, поэтому моя платформа также должна будет позволить пользователю иметь динамически увеличивающийся объем, который будет автоматически масштабироваться в зависимости от необходимого места для хранения.
Вам потребуется подключить SSH к нескольким устройствам одновременно. Я добавил аннотацию (пример: [Console] nano /boot/config.txt
) ко всем командам в этом репозитории, чтобы показать, где вам следует выполнять каждую команду. Обычно вы увидите [Console]
и [Node X]
.
Поскольку эта работа все еще находится в стадии разработки, вы повсюду увидите мои примечания, выделенные курсивом « AB: », пожалуйста, игнорируйте.