使用自架伺服器為您的網站提供服務並銷售課程。
sserver是簡單的無頭伺服器,用於以最小的開銷託管來自私人 github 儲存庫的課程和相關部落格/靜態內容。
它提供開箱即用的 https,因此您無需處理安裝/管理憑證。它會自動從 github 同步內容,因此您無需將內容上傳到伺服器。它還透過簡單的設定檔支援高級內容,而不會影響您的內容工作流程,例如,如果您使用像hugo這樣的靜態網站產生器,您可以透過在設定檔中指定來向公眾隱藏高級內容。它具有條帶集成功能,因此您可以出售優質內容。它內建了用於添加/驗證用戶的用戶管理。它還具有管理 API,因此您可以監控網站的訂單/使用者。
以下是一些如何使用它的範例,請確保在嘗試之前設定 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等靜態網站產生器,儲存庫應包含產生的網站。
./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等靜態網站產生器,則分支應包含產生的網站。
./sserver -repo "https://github.com/newbeelearn/sserver.git?domain=example.com"
儲存庫的根目錄中應該有index.html和ssconfig.toml 存取服務站點的網域sserver應該有權綁定到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"
所有 api 端點都與用於提供內容的網域相關,即如果網域是 example.com 並且 api 是/api/v1/product/list
請求將是 https://example.com/api/v1/product/list
角色層次結構如下admin > user > guest 任何可以存取guest 的api 也可以存取user,任何可以存取user 的api 也可以存取admin 對於存取user/admin,登入後取得的api 的會話cookie 必須隨每個要求一起提供實踐中這將由瀏覽器處理
描述 | 要求 | 角色 |
---|---|---|
註冊用戶 | 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 | 客人 |
修改訂單 | PUT /api/v1/order/id | 使用者 |
結帳訂單 | POST /api/v1/order/checkout | 使用者 |
根據訂單id取得訂單 | 取得/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"}
使用電子郵件和密碼登入使用者。如果設定檔中未設定「postlogin」字段,則傳回 json,否則重定向到「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 來驗證註冊用戶的電子郵件;如果未設定域名,則透過在驗證 api 後附加代碼來驗證註冊用戶的電子郵件
請求範例
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"
}
取得網站上列出的所有待售產品。以“limit”和“offset”作為查詢。如果未設定查詢,則預設限制值設定為 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"
}
取得由create order api建立的訂單支付的stripe url。使用建立訂單/修改訂單/獲取訂單 api 的回應發送請求。請勿修改此請求中的回應,否則會導致失敗。
請求範例
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"
}
按用戶取得所有訂單。以limit和offset作為查詢參數預設值分別為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"
}
獲取商店中創建的所有訂單。以 limit 和 offset 為查詢參數,預設值分別為 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"
}
讓所有使用者在網站上註冊。以 limit 和 offset 為查詢參數,預設值分別為 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"
}
不,僅發布二進位文件,並且網站用於圍繞產品進行討論。
它處於 alpha 階段,功能已完成,但可能包含錯誤
這是因為需要舉辦課程而創建的
現在不行,因為不支援訂閱,它僅適用於一次性數位產品。它也沒有可以插入您自己的 SaaS 的路由轉發功能。
它可用於託管課程和相關部落格。帶有時事通訊的部落格。具有優質內容的部落格。啟動和相關部落格的登陸頁面。銷售主題等
開箱即用地支援 linux 和 macos。 Windows 使用者可以使用 WSL,但尚未經過測試。
創建問題並用功能標記它
目前尚未決定是否可以免費使用。付費產品(如果有)將使用單獨的管道。因此,如果您從 github 版本下載,它是永久免費的。幫助我們做出決定,在討論區告訴我們您願意為此支付多少錢。