قم بخدمة موقعك وبيع الدورات التدريبية باستخدام خادم مستضاف ذاتيًا.
sserver هو خادم بسيط بدون رأس لاستضافة الدورات التدريبية والمحتوى المرتبط بالمدونة/الثابت من مستودع github الخاص بأقل قدر من الحمل.
فهو يوفر https خارج الصندوق حتى لا تضطر إلى التعامل مع تثبيت/إدارة الشهادات. يقوم بمزامنة المحتوى تلقائيًا من github حتى لا تضطر إلى تحميل المحتوى الخاص بك إلى الخادم. كما أنه يدعم المحتوى المتميز بملف تكوين بسيط دون التأثير على سير عمل المحتوى الخاص بك، على سبيل المثال، إذا كنت تستخدم منشئ موقع ثابت مثل Hugo، فيمكنك إخفاء المحتوى المتميز عن الجمهور عن طريق تحديده في ملف التكوين. يحتوي على تكامل شريطي حتى تتمكن من بيع المحتوى المتميز الخاص بك. يحتوي على إدارة مستخدم مدمجة لإضافة/مصادقة المستخدمين. يحتوي أيضًا على واجهة برمجة تطبيقات المشرف حتى تتمكن من مراقبة الطلبات/المستخدمين في موقعك.
فيما يلي بعض الأمثلة حول كيفية استخدامها، يرجى التأكد من تعيين متغيرات البيئة SS_<> قبل تجربتها، على سبيل المثال
export SS_GITHUB_TOKEN=<github_token>
export SS_STRIPE_TOKEN=<stripe_token>
export SS_SMTP_FROM=<email_id>
export SS_SMTP_USER=<smtp_username>
export SS_SMTP_PWD=<smtp_password>
export SS_SMTP_HOST=<smtp_host_address>
export SS_SMTP_PORT=<smtp_port>
export SS_ADMIN_EMAIL=<admin_email>
export SS_ADMIN_PWD=<admin_password_for_sserver>
./sserver -repo "https://github.com/newbeelearn/sserver.git"
يجب أن يحتوي المستودع على ملف Index.html وssconfig.toml في الدليل الجذر الخاص به. إذا تم استخدام Hugo/jekyll وما إلى ذلك مثل منشئ الموقع الثابت، فيجب أن يحتوي المستودع على موقع تم إنشاؤه. (سيكون به ملف Index.html في الجذر افتراضيًا)
./sserver -repo "https://github.com/newbeelearn/sserver.git?folder=public"
يجب أن يحتوي المستودع على ملف Index.html في المجلد الذي تريد تقديم المحتوى منه، وعادةً ما يكون عامًا في حالة استخدام مولدات المواقع الثابتة Hugo/jekyll وما إلى ذلك. يجب أن يحتوي على ssconfig.toml في الدليل الجذر
./sserver -repo "https://github.com/newbeelearn/sserver.git?ref=test-config"
يجب أن يحتوي الفرع على ملف Index.html وssconfig.toml في الدليل الجذر الخاص به. إذا تم استخدام Hugo/jekyll وما إلى ذلك مثل منشئ الموقع الثابت، فيجب أن يحتوي الفرع على الموقع الذي تم إنشاؤه. (سيكون به ملف Index.html في الجذر افتراضيًا)
./sserver -repo "https://github.com/newbeelearn/sserver.git?domain=example.com"
يجب أن يحتوي المستودع على ملف Index.html وssconfig.toml في الدليل الجذر الخاص به. يجب أن يكون لدى الخادم الذي يتم تقديم الموقع منه أذونات للربط بمنفذ 443، ويمكن القيام بذلك باستخدام الأمر التالي
sudo setcap 'cap_net_bind_service=+ep' sserver
./sserver -repo "file:///workspace/projects/newbeelearn.com/sserver"
يجب أن يحتوي المستودع على ملف Index.html وssconfig.toml في الدليل الجذر الخاص به. يمكن تحديد جميع الخيارات، مثل المجلد/المجال وما إلى ذلك، في حالة الملفات المحلية أيضًا
يمكن العثور على نموذج ssconfig.toml أدناه
# specify the site
[site]
# period to check for new content
syncinterval = "@every 12h"
# product/course details
[[site.prod]]
name = "course1"
# path from root, this will be accessible to users who have bought the course
path = "courses/course1"
# can be draft/active, buying functionality will be enabled when status is active
status = "active"
# unique identifier for the course
sku = "prod-course-1"
# price in cents
price = 10000
# currency
currency = "USD"
يقوم sserver بإنشاء دليل "wwwss" من مكان تشغيله
drwxrwxr-x 2 test test 4096 Nov 30 17:04 a
drwxrwxr-x 8 test test 4096 Nov 30 17:04 b
drwxrwxr-x 2 test test 4096 Nov 30 17:04 certs
drwxrwxr-x 2 test test 4096 Nov 30 17:04 logs
-rw-rw-r-- 1 test test 527483 Nov 30 17:04 tmp.zip
-rw-rw-r-- 1 test test 49152 Nov 30 17:05 ssapp.db
يتم استخدام ملف التكوين لتحديد المنتجات/الدورات التدريبية التي تريد بيعها بالإضافة إلى بعض معلمات الخادم مثل عدد المرات التي يجب أن تتم فيها مزامنة الموقع وما إلى ذلك.
يتم عرض نموذج ملف ssconfig.toml أدناه
#specify the site
[site]
#period to check for new content default is 12 hours
syncinterval = "@every 12h"
[[site.prod]]
name = "course1"
path = "courses/course1"
status = "active"
sku = "prod-course-1"
price = 10000
currency = "USD"
جميع نقاط نهاية واجهة برمجة التطبيقات مرتبطة بالمجال المستخدم لخدمة المحتوى، على سبيل المثال، إذا كان المجال هو example.com وواجهة برمجة التطبيقات هي /api/v1/product/list
فسيكون الطلب https://example.com/api/v1/product/list
التسلسل الهرمي للأدوار هو مثل هذا المشرف > المستخدم > الضيف. أي واجهة برمجة تطبيقات يمكن للضيف الوصول إليها يمكن للمستخدم أيضًا الوصول إليها وأي واجهة برمجة تطبيقات يمكن للمستخدم الوصول إليها يمكن الوصول إليها أيضًا للمسؤول للوصول إلى ملف تعريف ارتباط جلسة المستخدم/المشرف الذي تم الحصول عليه بعد تسجيل الدخول، يجب توفيره مع كل طلب في ممارسة هذا سيتم الاعتناء به من قبل المتصفح
وصف | طلب | دور |
---|---|---|
تسجيل مستخدم | POST /api/v1/user/register | ضيف |
مستخدم تسجيل الدخول | POST /api/v1/user/login | ضيف |
مستخدم تسجيل الخروج | احصل على /api/v1/user/logout | ضيف |
التحقق من المستخدم | احصل على /api/v1/user/verify/:id | ضيف |
إعادة تعيين كلمة مرور المستخدم | POST /api/v1/user/reset | ضيف |
الحصول على قائمة المنتجات | احصل على /api/v1/product/list | ضيف |
إنشاء الطلب | POST /api/v1/order/id | ضيف |
تعديل الطلب | ضع /api/v1/order/id | مستخدم |
طلب الخروج | POST /api/v1/order/checkout | مستخدم |
الحصول على الطلب عن طريق معرف الطلب | احصل /api/v1/order/id/:id | مستخدم |
الحصول على جميع الطلبات من قبل المستخدم | احصل على /api/v1/order/id/list | مستخدم |
تغيير كلمة مرور المستخدم | POST /api/v1/user/changepwd | مستخدم |
احصل على جميع الطلبات | احصل على /api/v1/order/list | مسؤل |
الحصول على كافة المستخدمين | احصل على /api/v1/user/list | مسؤل |
تسجيل مستخدم جديد بالبريد الإلكتروني وكلمة المرور. يرسل البريد إلى البريد الإلكتروني المستخدم للتسجيل برمز التحقق إذا تم تعيين تكوين خادم SMTP.
طلب مثال
curl 'http://localhost:54545/api/v1/user/register'
-H 'Content-Type: application/x-www-form-urlencoded'
-X POST
--data-raw 'email=stripe%40newbeelearn.com&password=test&confirm-password=test&remember=on'
استجابة المثال
{"status":"success"}
تسجيل دخول المستخدم بالبريد الإلكتروني وكلمة المرور. إرجاع json إذا لم يتم تعيين حقل "postlogin" في ملف التكوين وإلا فإنه يعيد التوجيه إلى الصفحة المحددة في "postlogin"
طلب مثال
curl 'http://localhost:54545/api/v1/user/login'
-H 'Content-Type: application/x-www-form-urlencoded'
-X POST
--data-raw 'email=admin%40example.com&password=admin'
استجابة المثال
{
"data": {
"user_id": "1",
"username": ""
},
"msg": "user found",
"status": "success"
}
يقوم بتسجيل خروج المستخدم الذي قام بتسجيل الدخول وإعادة التوجيه إلى الصفحة الرئيسية
طلب مثال
curl 'http://localhost:54545/api/v1/user/logout'
-H 'Cookie: session_id=9e8b22a3-15ac-442f-bf65-15c37dbfc889; max-age=300; path=/; secure; SameSite=Lax'
استجابة المثال
<!doctype html>
<html lang="en">
<head>
</head>
<body>
</body>
</html>
التحقق من البريد الإلكتروني للمستخدم المسجل عن طريق إرسال عنوان url إذا تم تعيين المجال أو الرمز الذي يجب إلحاقه بعد التحقق من واجهة برمجة التطبيقات إذا لم يتم تعيين المجال
طلب مثال
curl 'http://localhost:54545/api/v1/user/verify/cafj5grn0gpog1j3a0m0'
استجابة المثال
{"status":"success"}
إعادة تعيين كلمة مرور المستخدم وإرسال الرمز المؤقت الجديد لتسجيل الدخول. يحتاج المستخدم إلى استخدام هذا الرمز عند تسجيل الدخول التالي وتغيير كلمة المرور
طلب مثال
curl 'http://localhost:54545/api/v1/user/reset'
-H 'Content-Type: application/x-www-form-urlencoded'
-X POST
--data-raw 'email=stripe%40newbeelearn.com'
استجابة المثال
{
"data": null,
"msg": "password reset successful",
"status": "success"
}
احصل على كافة المنتجات المعروضة للبيع على الموقع. يأخذ "الحد" و"الإزاحة" كاستعلامات. إذا لم يتم تعيين الاستعلام، فسيتم تعيين القيم الافتراضية للحد إلى 10 والإزاحة إلى 0
طلب مثال
curl 'http://localhost:54545/api/v1/product/list?limit=1&offset=0'
استجابة المثال
{
"data": [
{
"prd_id": 1,
"prd_name": "course1",
"sku": "prod-course-1",
"permalink": "users/list/",
"price": 10000,
"currency": "USD",
"period": 365,
"status": "active"
}
],
"msg": "Order found",
"status": "success"
}
إنشاء طلب جديد بالمنتجات المدرجة في حقل "line_item"
. يجب أن يكون الطلب صالحًا json. تتم تعبئة حقول order_id/user_id
الفعلية وما إلى ذلك بواسطة الخادم ويمكن تمرير أي قيمة وهمية.
طلب مثال
curl 'http://localhost:54545/api/v1/order/id'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=cad8439e-dcc4-475e-94fc-12b75f85bb20; max-age=300; path=/; secure; SameSite=Lax'
-X POST
--data-raw ' {
"order_id": 1,
"user_id": 3,
"currency": "USD",
"line_items": [
{
"sku": "prod-course-1"
},
{
"sku": "prod-course-3"
}
]
}'
استجابة المثال
{
"data": {
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 11000,
"line_items": [
{
"line_id": 1,
"order_id": 1,
"prd_id": 1,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"grand": 10000,
"enabled": true,
"sku": "prod-course-1"
},
{
"line_id": 2,
"order_id": 1,
"prd_id": 2,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"grand": 1000,
"enabled": true,
"sku": "prod-course-3"
}
]
},
"msg": "Order found",
"status": "success"
}
تعديل الطلب الحالي عن طريق إضافة/حذف المنتجات في حقل line_item
. يجب أن يقوم المستخدم بتسجيل الدخول لتعديل الطلب ويجب أن يكون الطلب في حالة نشطة. استخدم الرد السابق لإنشاء طلب أو الحصول على طلب لإضافة/حذف المنتجات
طلب مثال
curl 'http://localhost:54545/api/v1/order/id'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=cad8439e-dcc4-475e-94fc-12b75f85bb20; max-age=300; path=/; secure; SameSite=Lax'
-X PUT
--data-raw ' {
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 11000,
"line_items": [
{
"line_id": 2,
"order_id": 1,
"prd_id": 2,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"grand": 1000,
"enabled": true,
"sku": "prod-course-3"
}
]
}'
استجابة المثال
{
"data": {
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 1000,
"line_items": [
{
"line_id": 2,
"order_id": 1,
"prd_id": 2,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"grand": 1000,
"enabled": true,
"sku": "prod-course-3"
}
]
},
"msg": "Order found",
"status": "success"
}
يحصل على عنوان URL الشريطي لدفع الطلب الذي تم إنشاؤه بواسطة إنشاء واجهة برمجة تطبيقات الطلب. استخدم الاستجابة من إنشاء طلب/تعديل الطلب/احصل على واجهة برمجة تطبيقات الطلب لإرسال الطلب. لا تقم بتعديل الاستجابة في هذا الطلب، فسوف يؤدي ذلك إلى الفشل.
طلب مثال
curl 'http://localhost:54545/api/v1/order/checkout'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=2f1be070-7256-4e84-a4ef-c14754cabcdb; max-age=300; path=/; secure; SameSite=Lax'
-X POST
--data-raw ' {
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 11000,
"line_items": [
{
"line_id": 2,
"order_id": 1,
"prd_id": 2,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"grand": 1000,
"enabled": true,
"sku": "prod-course-3"
}
]
}'
استجابة المثال
{
"data": {
"url": "https://checkout.stripe.com/pay/cs_test_a17D2l74NsKMv29YJ1c5rSBPx7BGSsNAsObGAsOanEJqyFNXKEYDLji4BZ#fidkdWxOYHwnPyd1blpxYHZxWjA0TlVKPHNMaW9vYEd1YmhdUWQ3UUJqSEpMYTMza11ObGAyXDFPcXA8bz1yY1VicVZVdDN8c1NkaUZEazxIQWdjM04wdz1DTmF3PXxHaVE9bTVuZz1pUWw3NTUybHZLZldgaicpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl"
},
"msg": "Order found",
"status": "success"
}
الحصول على تفاصيل الطلب عن طريق رقم الطلب
طلب مثال
curl 'http://localhost:54545/api/v1/order/id/cafjktbn0gpp5hq3dt4g'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=fe9b9fff-c5c0-4745-becf-ecb0e5abca81; max-age=300; path=/; secure; SameSite=Lax'
استجابة المثال
{
"data": {
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 1000,
"line_items": [
{
"line_id": 2,
"order_id": 1,
"prd_id": 2,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"grand": 1000,
"enabled": true
}
]
},
"msg": "Order found",
"status": "success"
}
الحصول على جميع الطلبات من قبل المستخدم. يأخذ الحد والإزاحة حيث أن القيم الافتراضية لمعلمات الاستعلام هي 10 و0 على التوالي
طلب مثال
curl 'http://localhost:54545/api/v1/order/id/list?limit=1&offset=0'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=fe9b9fff-c5c0-4745-becf-ecb0e5abca81; max-age=300; path=/; secure; SameSite=Lax'
استجابة المثال
{
"data": [
{
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"grand_total": 1000
}
],
"msg": "Order found",
"status": "success"
}
تغيير كلمة مرور المستخدم. يجب أن يقوم المستخدم بتسجيل الدخول لتقديم هذا الطلب
طلب مثال
curl 'http://localhost:54545/api/v1/user/changepwd'
-H 'Content-Type: application/x-www-form-urlencoded'
-H 'Cookie: session_id=fe9b9fff-c5c0-4745-becf-ecb0e5abca81; max-age=300; path=/; secure; SameSite=Lax'
-X POST
--data-raw 'oldpassword=cafjjjbn0gpp5hq3dt40&password=test123'
استجابة المثال
{
"data": null,
"msg": "password change successful",
"status": "success"
}
احصل على جميع الطلبات التي تم إنشاؤها في المتجر. يأخذ الحد والإزاحة حيث أن القيم الافتراضية لمعلمات الاستعلام هي 10 و0 على التوالي وهي متاحة للمستخدمين الإداريين فقط. احصل على جميع الطلبات
طلب مثال
curl 'http://localhost:54545/api/v1/order/list?limit=1&offset=0'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=e4ecd3a4-b8be-493e-a33d-518ab11c65e8; max-age=300; path=/; secure; SameSite=Lax'
استجابة المثال
{
"data": [
{
"order_id": 1,
"user_id": 3,
"created_at": "2022-06-07 11:45:57.601996759 +0000 UTC",
"modified_at": "2022-06-07 11:48:05.425488765 +0000 UTC",
"status": "active",
"currency": "USD",
"order_number": "cafjktbn0gpp5hq3dt4g",
"price_total": 1000,
"discount_total": 0,
"sub_total": 1000,
"taxes_total": 0,
"grand_total": 1000,
"refunds_total": 0,
"created_channel": "",
"payment_provider": ""
}
],
"msg": "Order found",
"status": "success"
}
الحصول على جميع المستخدمين المسجلين على الموقع. يأخذ الحد والإزاحة حيث أن القيم الافتراضية لمعلمات الاستعلام هي 10 و0 على التوالي وهي متاحة للمستخدمين الإداريين فقط.
طلب مثال
curl 'http://localhost:54545/api/v1/user/list?limit=1&offset=0'
-H 'Content-Type: application/json; charset=utf-8'
-H 'Cookie: session_id=e4ecd3a4-b8be-493e-a33d-518ab11c65e8; max-age=300; path=/; secure; SameSite=Lax'
استجابة المثال
{
"data": [
{
"user_id": 1,
"email": "[email protected]",
"created_at": "2022-06-07 10:53:00.480128762 +0000 UTC",
"username": "",
"last_password_set": "2022-06-07 10:53:00.480128762 +0000 UTC",
"last_login": "2022-06-07 10:53:00.480128762 +0000 UTC",
"verified": 0,
"reset": 0,
"user_role": "admin"
},
{
"user_id": 2,
"email": "[email protected]",
"created_at": "2022-06-07 10:53:00.532691788 +0000 UTC",
"username": "",
"last_password_set": "2022-06-07 10:53:00.532691788 +0000 UTC",
"last_login": "2022-06-07 10:53:00.532691788 +0000 UTC",
"verified": 0,
"reset": 0,
"user_role": "guest"
},
{
"user_id": 3,
"email": "[email protected]",
"created_at": "2022-06-07 11:13:06.947313364 +0000 UTC",
"username": "",
"last_password_set": "2022-06-07 11:13:06.947313364 +0000 UTC",
"last_login": "2022-06-07 11:13:06.947313364 +0000 UTC",
"verified": 2,
"reset": 1,
"user_role": "user"
}
],
"msg": "Order found",
"status": "success"
}
لا، يتم إصدار الثنائيات فقط ويتم استخدام الموقع للمناقشات حول المنتج.
لقد اكتملت وظائف مرحلة ألفا ولكنها قد تحتوي على أخطاء
تم إنشاء هذا بسبب الحاجة إلى استضافة الدورات
ليس الآن لأن الاشتراك غير مدعوم، فهو مخصص للمنتجات الرقمية لمرة واحدة فقط. كما أنه لا يحتوي على وظيفة إعادة توجيه المسار حيث يمكن توصيل Saas الخاص بك. ومع ذلك، يمكن إضافة هذه التغييرات إذا كان هناك اهتمام كافٍ، يرجى بدء المناقشة إذا كنت ترغب في الحصول على هذه الميزات حتى الآن فهي ليست على خريطة الطريق.
ويمكن استخدامه لاستضافة الدورة والمدونات المرتبطة بها. مدونات مع النشرة الإخبارية. مدونات ذات محتوى متميز. الصفحة المقصودة لبدء التشغيل والمدونة المرتبطة بها. بيع المواضيع الخ
يتم دعم Linux وmacos خارج الصندوق. يمكن لمستخدمي Windows استخدام WSL ولكن لم يتم اختباره.
قم بإنشاء مشكلة ووضع علامة عليها بالميزة
لم يتم تحديد هذا الأمر بعد، فهو مجاني للاستخدام. المنتج المدفوع إذا كان متاحًا سيستخدم قناة منفصلة. لذا، إذا كنت تقوم بالتنزيل من إصدار github، فهو مجاني إلى الأبد. ساعدنا في اتخاذ القرار، وأخبرنا بالمبلغ الذي ستدفعه مقابل ذلك في لوحة المناقشة.