على مدار الأعوام القليلة الماضية، كنت أفكر في كيفية إنشاء 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 للواجهة الخلفية. سنحتاج أيضًا إلى CI/CD لتجميع التعليمات البرمجية ونشرها في بنيتنا التحتية. سوف يعمل GitLab بشكل مثالي لهاتين المهمتين.
سنحتاج إلى شبكة للتواصل بين العقد. بالنسبة لجهاز التوجيه لقد اخترت OpenWRT. يتيح لي هذا استخدام Raspberry Pi مع محول USB 3.0 Ethernet حتى يتمكن من العمل كجهاز توجيه بين الإنترنت و"مركز البيانات".
عندما تقوم بإنشاء حاوية S3 على AWS، يتم تشغيل كل شيء تلقائيًا، ولا يوجد إنسان في مركز بيانات في مكان ما يكتب أوامر CLI لجدولة الحاوية الخاصة بك. يجب أن يعمل هذا المشروع أيضًا بنفس الطريقة، عندما يريد المستخدم إنشاء مورد، يجب ألا يتطلب أي مدخلات بشرية لتوفير الحاوية ونشرها.
نظرًا لحجم AWS، لن يكون من العملي من الناحية المالية منح كل مستخدم أجهزة خادم مخصصة خاصة به، وبدلاً من ذلك تكون الأجهزة افتراضية، مما يسمح للعديد من المستأجرين بمشاركة وحدة معالجة مركزية فعلية واحدة. وبالمثل، لن يكون من العملي تعيين عقدة كاملة ومحرك SSD لكل مجموعة، لتحقيق أقصى قدر من الاستفادة من الموارد، يجب أن تكون منصتي قادرة على السماح للعديد من المستأجرين بمشاركة مجموعة مساحة تخزين SSD المتاحة. بالإضافة إلى ذلك، يمكن لحاويات AWS S3 تخزين كمية غير محدودة من البيانات، لذلك ستحتاج منصتي أيضًا إلى السماح للمستخدم بالحصول على حجم متزايد ديناميكيًا والذي سيتم توسيعه تلقائيًا بناءً على مساحة التخزين المطلوبة.
سوف تحتاج إلى SSH في أجهزة متعددة في وقت واحد. لقد أضفت تعليقًا توضيحيًا (مثال: [Console] nano /boot/config.txt
) إلى جميع الأوامر في هذا الريبو، لإظهار المكان الذي يجب أن تقوم فيه بتنفيذ كل أمر. بشكل عام، سترى [Console]
و [Node X]
.
نظرًا لأن هذا لا يزال عملاً قيد التنفيذ إلى حد كبير، فسوف ترى ملاحظاتي بالخط المائل " AB: " طوال الوقت، يرجى تجاهلها.