サイトを提供し、セルフホストサーバーでコースを販売します。
SSERVERは、最小限のオーバーヘッドで、プライベートGitHubリポジトリのコースと関連するブログ/静的コンテンツをホストするためのシンプルなヘッドレスサーバーです。
箱からhttpsを提供するので、証明書のインストール/管理に対処する必要はありません。コンテンツをGitHubから自動的に同期するため、コンテンツをサーバーにアップロードする必要はありません。また、Hugoなどの静的サイトジェネレーターを使用している場合、コンテンツワークフローに影響を与えることなく、シンプルな構成ファイルを使用してプレミアムコンテンツをサポートします。設定ファイルで指定してプレミアムコンテンツを公開できます。ストライプ統合があるため、プレミアムコンテンツを販売できます。ユーザーを追加/認証するためにユーザー管理が組み込まれています。また、Admin 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などが静的サイトジェネレーターのように使用される場合、リポジトリには生成されたサイトが含まれている必要があります(デフォルトでrootに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"
Branchには、ルートディレクトリにindex.htmlとssconfig.tomlが必要です。 Hugo/Jekyllなどが静的サイトジェネレーターのように使用される場合、ブランチには生成されたサイトが含まれている必要があります。
./sserver -repo "https://github.com/newbeelearn/sserver.git?domain=example.com"
リポジトリにはindex.htmlとssconfig.tomlが必要です。そのrootディレクトリには、サイトが提供されるドメインへのアクセスSserverが443ポートにバインドする権限を持つ必要があります。これは、次のコマンドで実行できます
sudo setcap 'cap_net_bind_service=+ep' sserver
./sserver -repo "file:///workspace/projects/newbeelearn.com/sserver"
リポジトリには、ルートディレクトリにindex.htmlとssconfig.tomlが必要です。すべてのオプションIEフォルダ/ドメインなどは、ローカルファイルの場合にも指定できます
サンプル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エンドポイントは、domainがexample.comであり、APIが/api/v1/product/list
requestがhttps://example.com/api/v1/product/listになる場合、コンテンツIEの提供に使用されるドメインに関連しています。
ロール階層はこの管理者>ユーザー>ゲストにアクセスできる任意のAPIがユーザーがアクセスできるようになり、ユーザーがアクセスできるAPIは、ログインした後に取得したユーザー/管理者APIのセッションCookieにアクセスするためにAdminがアクセスできます。これを練習して、ブラウザに注意してください
説明 | リクエスト | 役割 |
---|---|---|
ユーザーを登録します | POST /api/v1/user/register | ゲスト |
ログインユーザー | POST /api/v1/user/login | ゲスト |
ログアウトユーザー | 取得/api/v1/user/logout | ゲスト |
ユーザーを確認します | get /api/v1/user/verify/:id | ゲスト |
ユーザーパスワードをリセットします | POST /api/v1/user/reset | ゲスト |
製品リストを取得します | 取得/api/v1/product/list | ゲスト |
注文を作成します | POST /api/v1/order/id | ゲスト |
注文を変更します | put /api/v1/order/id | ユーザー |
チェックアウト注文 | 投稿/api/v1/order/checkout | ユーザー |
注文IDで注文を取得します | get /api/v1/order/id/:id | ユーザー |
ユーザーがすべての注文を取得します | get /api/v1/order/id/list | ユーザー |
ユーザーパスワードを変更します | POST /api/v1/user/changepwd | ユーザー |
すべての注文を取得します | get /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を返します。
リクエストの例
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"
}
Order APIの作成によって作成された注文の支払いのためにストライプ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"
}
ユーザーがすべての注文を取得します。クエリパラメーターのデフォルト値はそれぞれ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"
}
すべてのユーザーをWebサイトに登録します。クエリパラメーターのデフォルト値は、管理者ユーザーのみがそれぞれ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リリースからダウンロードしている場合は、永遠に無料です。それを決めるのを手伝ってください。ディスカッションボードであなたがそれに対して何を支払うか教えてください。