지난 몇 년 동안 저는 AWS나 GCP와 같은 클라우드 플랫폼을 사용할 필요 없이 SaaS를 구축하고 자체 인프라에 배포할 수 있는 방법에 대해 생각해 왔습니다. 이 리포지토리에는 독점적인 오픈 소스 기술 스택을 사용하여 S3(자동 버킷 배포, 동적으로 확장되는 볼륨, 보안 등)와 동일하게 작동하는 AWS S3 복제본을 구축하는 진행 상황을 기록합니다.
@aws-sdk/client-s3
사용하는 라이브 POC 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를 선택했습니다. 이를 통해 USB 3.0 이더넷 어댑터와 함께 Raspberry Pi를 사용할 수 있으므로 인터넷과 "데이터 센터" 사이의 라우터로 작동할 수 있습니다.
AWS에서 S3 버킷을 생성하면 모든 것이 자동화됩니다. 데이터 센터 어딘가에는 버킷 예약을 위해 CLI 명령을 입력하는 사람이 없습니다. 이 프로젝트도 동일한 방식으로 작동해야 합니다. 즉, 사용자가 리소스를 생성하려는 경우 버킷을 프로비저닝하고 배포하기 위해 사람의 입력이 필요하지 않아야 합니다.
AWS의 규모로 인해 각 사용자에게 전용 서버 하드웨어를 제공하는 것은 재정적으로 실용적이지 않습니다. 대신 하드웨어가 가상화되어 여러 테넌트가 단일 물리적 CPU를 공유할 수 있습니다. 마찬가지로 전체 노드와 SSD를 각 버킷에 할당하는 것은 실용적이지 않습니다. 리소스 활용도를 최대화하려면 내 플랫폼에서 여러 테넌트가 사용 가능한 SSD 스토리지 공간 풀을 공유할 수 있도록 허용해야 합니다. 또한 AWS S3 버킷은 무제한의 데이터를 저장할 수 있으므로 내 플랫폼에서는 사용자가 필요한 저장 공간에 따라 자동으로 확장되는 동적으로 증가하는 볼륨을 가질 수 있도록 허용해야 합니다.
여러 장치에 동시에 SSH를 연결해야 합니다. 각 명령을 실행해야 하는 위치를 표시하기 위해 이 저장소의 모든 명령에 주석(예: [Console] nano /boot/config.txt
)을 추가했습니다. 일반적으로 [Console]
및 [Node X]
가 표시됩니다.
이 작업은 여전히 진행 중인 작업이므로 내 메모 전체가 이탤릭체 " AB: "로 표시됩니다. 무시하시기 바랍니다.