Servieren Sie Ihre Website und verkaufen Sie Kurse mit selbst gehosteter Server.
SSERVER ist ein einfacher Kopflessserver für Hosting -Kurse und zugehörige Blog/statische Inhalte aus dem privaten Github -Repository mit minimalem Overhead.
Es bietet HTTPS nicht in der Box, sodass Sie sich nicht mit der Installation/Verwaltung von Zertifikaten befassen müssen. Es synchronisiert den Inhalt automatisch von GitHub, sodass Sie Ihre Inhalte nicht auf Server hochladen müssen. Es unterstützt auch Premium -Inhalte mit einer einfachen Konfigurationsdatei, ohne Ihren Inhalts -Workflow für z. Es verfügt über eine Streifenintegration, sodass Sie Ihre Premium -Inhalte verkaufen können. Es verfügt über eine Benutzerverwaltung zum Hinzufügen/Authentifizieren von Benutzern. Es verfügt auch über Admin -API, sodass Sie Bestellungen/Benutzer Ihrer Website überwachen können.
Hier sind einige Beispiele dafür, wie es verwendet werden kann. Stellen Sie bitte sicher, dass Sie SS _ <> Umgebungsvariablen festlegen, bevor Sie sie ausprobieren, z.
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"
Repository sollte in seinem Stammverzeichnis index.html und ssconfig.toml haben. Wenn Hugo/Jekyll usw. wie ein statischer Site -Generator verwendet wird, sollte Repository generierte Site enthalten. (Es hätte index.html standardmäßig in Root).
./sserver -repo "https://github.com/newbeelearn/sserver.git?folder=public"
Repository sollte index.html im Ordner haben, von wo aus Sie den Inhalt bedienen möchten. In der Regel ist es öffentlich, wenn Hugo/Jekyll usw. statische Site -Generatoren verwendet werden. Es sollte ssconfig.toml im Stammverzeichnis haben
./sserver -repo "https://github.com/newbeelearn/sserver.git?ref=test-config"
Die Filiale sollte in seinem Stammverzeichnis index.html und ssconfig.toml haben. Wenn Hugo/Jekyll usw. wie ein statischer Site -Generator verwendet wird, sollte der Zweig generierte Site enthalten. (Es hätte index.html in root standardmäßig)
./sserver -repo "https://github.com/newbeelearn/sserver.git?domain=example.com"
Repository sollte in INDEX.HTML und SSCONFIG.TOML in seinem Root -Verzeichniszugriff auf die Domäne haben, aus der SSERVER zugestellt wird
sudo setcap 'cap_net_bind_service=+ep' sserver
./sserver -repo "file:///workspace/projects/newbeelearn.com/sserver"
Repository sollte in seinem Stammverzeichnis index.html und ssconfig.toml haben. Alle Optionen IE Ordner/Domäne usw. können auch im Falle lokaler Dateien angegeben werden
Beispiel ssconfig.toml finden Sie unten
# 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 schafft "WWWSS" -Verzeichnis aus dem Ort, an dem es ausgeführt wird
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
Die Konfigurationsdatei wird verwendet, um die Produkte/Kurse anzugeben, die Sie verkaufen möchten, sowie einige Serverparameter, wie die Site synchronisiert werden. Usw.
Beispiele ssconfig.toml -Datei ist unten angezeigt
#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"
Alle API -Endpunkte sind relativ zu der Domäne, die zum Servieren des Inhalts verwendet wird. Wenn Domain example.com ist, und die API IS /api/v1/product/list -Anfrage wäre https://example.com/api/v1/product/List.
Die Rollenhierarchie ist wie dieser Admin> Benutzer> Gast jeder API, die dem Gast zugegriffen werden kann, ist auch für den Benutzer zugegriffen, und jede API für den Benutzer zugänglich ist auch für den Administrator für den Zugriff auf Benutzer-/Administrator -API -Session -Cookie, die nach der Anmeldung eingeliefert wurden Übung Dies wird vom Browser aufmerksam gemacht
| Beschreibung | Anfrage | Rolle |
|---|---|---|
| Benutzer registrieren | Post /api/v1/user/register | Gast |
| Login -Benutzer | Post /api/v1/user/login | Gast |
| Logout -Benutzer | GET /api/v1/user/logout | Gast |
| Benutzer überprüfen | Get /api/v1/user/verify/:id | Gast |
| Benutzerkennwort zurücksetzen | Post /api/v1/user/reset | Gast |
| Produktliste erhalten | GET /api/v1/product/list | Gast |
| Bestellung erstellen | Post /api/v1/order/id | Gast |
| Reihenfolge ändern | Put /api/v1/order/id | Benutzer |
| Kasse | Post /api/v1/order/checkout | Benutzer |
| Bestellen Sie bestellen nach Bestell -ID | Get /api/v1/order/id/:id | Benutzer |
| Holen Sie sich alle Bestellungen vom Benutzer | Get /api/v1/order/id/list | Benutzer |
| Benutzerkennwort ändern | Post /api/v1/user/changepwd | Benutzer |
| Holen Sie sich alle Bestellungen | GET /api/v1/order/list | Administrator |
| Holen Sie sich alle Benutzer | GET /api/v1/user/list | Administrator |
Registrieren Sie den neuen Benutzer mit E -Mail und Passwort. Sendet E -Mails an die E -Mail, mit der Sie mit dem Verifizierungscode registriert werden können, wenn die SMTP -Serverkonfiguration festgelegt ist.
Beispielanforderung
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'
Beispielantwort
{"status":"success"}
Login Benutzer mit E -Mail und Passwort. Gibt JSON zurück, wenn das Feld "Postlogin" nicht in die Konfigurationsdatei festgelegt wird, da sonst auf die in "Postlogin" angegebene Seite weiterleitet.
Beispielanforderung
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'
Beispielantwort
{
"data": {
"user_id": "1",
"username": ""
},
"msg": "user found",
"status": "success"
}
Melden Sie sich angemeldet und leitet sich auf die Homepage aus
Beispielanforderung
curl 'http://localhost:54545/api/v1/user/logout'
-H 'Cookie: session_id=9e8b22a3-15ac-442f-bf65-15c37dbfc889; max-age=300; path=/; secure; SameSite=Lax'
Beispielantwort
<!doctype html>
<html lang="en">
<head>
</head>
<body>
</body>
</html>
Überprüft die E -Mail des registrierten Benutzers durch Senden von URL, wenn die Domäne festgelegt ist oder Code nach der API verifizieren sollte, wenn die Domäne nicht festgelegt ist
Beispielanforderung
curl 'http://localhost:54545/api/v1/user/verify/cafj5grn0gpog1j3a0m0'
Beispielantwort
{"status":"success"}
Setzt das Benutzerkennwort zurück und sendet den neuen temporären Code für die Anmeldung. Der Benutzer muss diesen Code beim nächsten Anmeldung verwenden und das Kennwort ändern
Beispielanforderung
curl 'http://localhost:54545/api/v1/user/reset'
-H 'Content-Type: application/x-www-form-urlencoded'
-X POST
--data-raw 'email=stripe%40newbeelearn.com'
Beispielantwort
{
"data": null,
"msg": "password reset successful",
"status": "success"
}
Lassen Sie alle Produkte auf der Website zum Verkauf gelistet. Nimmt "Limit" und "Offset" als Abfragen. Wenn die Abfrage nicht festgelegt wird, dass die Standardwerte der Grenzwerte auf 10 festgelegt sind und auf 0 ausgeglichen werden
Beispielanforderung
curl 'http://localhost:54545/api/v1/product/list?limit=1&offset=0'
Beispielantwort
{
"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"
}
Erstellt eine neue Bestellung mit Produkten, die im Feld "line_item" aufgeführt sind. Die Anfrage sollte gültig sein JSON. Tatsächliche order_id/user_id usw. Felder werden vom Server besiedelt, jeder Dummy -Wert kann übergeben werden.
Beispielanforderung
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"
}
]
}'
Beispielantwort
{
"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"
}
Ändert die vorhandene Reihenfolge durch Hinzufügen/Löschen von Produkten im Feld line_item . Der Benutzer muss angemeldet sein, um die Reihenfolge zu ändern, und die Reihenfolge sollte im aktiven Zustand sein. Verwenden Sie die vorherige Antwort von Create Order oder Bestellung, um Produkte hinzuzufügen/zu löschen
Beispielanforderung
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"
}
]
}'
Beispielantwort
{
"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"
}
Erhält Streifen -URL zur Zahlung der Bestellung, die durch Erstellen von Order API erstellt wurde. Verwenden Sie die Antwort aus der Bestellung erstellen/ändern/order/order api abrufen, um die Anfrage zu senden. Ändern Sie die Antwort in dieser Anfrage nicht. Dies führt zu einem Fehler.
Beispielanforderung
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"
}
]
}'
Beispielantwort
{
"data": {
"url": "https://checkout.stripe.com/pay/cs_test_a17D2l74NsKMv29YJ1c5rSBPx7BGSsNAsObGAsOanEJqyFNXKEYDLji4BZ#fidkdWxOYHwnPyd1blpxYHZxWjA0TlVKPHNMaW9vYEd1YmhdUWQ3UUJqSEpMYTMza11ObGAyXDFPcXA8bz1yY1VicVZVdDN8c1NkaUZEazxIQWdjM04wdz1DTmF3PXxHaVE9bTVuZz1pUWw3NTUybHZLZldgaicpJ2N3amhWYHdzYHcnP3F3cGApJ2lkfGpwcVF8dWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYWB3dic%2FcXdwYHgl"
},
"msg": "Order found",
"status": "success"
}
Erhalten Sie Bestelldetails mit Bestellnummer
Beispielanforderung
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'
Beispielantwort
{
"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"
}
Holen Sie sich alle Bestellungen vom Benutzer. Nimmt die Grenzen und Offset, wenn die Standardwerte der Abfrageparameter 10 bzw. 0 sind
Beispielanforderung
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'
Beispielantwort
{
"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"
}
Benutzerkennwort ändern. Der Benutzer muss angemeldet sein, um diese Anfrage zu stellen
Beispielanforderung
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'
Beispielantwort
{
"data": null,
"msg": "password change successful",
"status": "success"
}
Lassen Sie alle Bestellungen im Laden erstellt. Nimmt Limit und Offset, da die Standardwerte der Abfrageparameter nur 10 bzw. 0 für Administrator Benutzer zur Verfügung stehen. Holen Sie sich alle Bestellungen
Beispielanforderung
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'
Beispielantwort
{
"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"
}
Lassen Sie alle Benutzer auf der Website registrieren. Nimmt Limit und Offset, da die Standardwerte der Abfrageparameter nur 10 bzw. 0 für Administrator Benutzer zur Verfügung stehen.
Beispielanforderung
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'
Beispielantwort
{
"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"
}
Nein, nur Binärdateien werden veröffentlicht und die Website wird für Diskussionen rund um das Produkt verwendet.
Es ist in der Alpha -Bühnenfunktionalität abgeschlossen, kann jedoch Fehler enthalten
Dies wurde aufgrund der Notwendigkeit geschaffen, Kurse zu hosten
Im Moment nicht, weil das Abonnement nicht unterstützt wird, es ist nur digitale Produkte nur für digitale Produkte. Es gibt auch keine Routenweitverweissfunktionen, bei denen Ihre eigenen SaaS angeschlossen werden können. Diese Änderungen können jedoch hinzugefügt werden, wenn ausreichend Interesse Plase Start Diskussion vorliegt, wenn Sie diese Funktionen ab sofort auf Roadmap haben möchten.
Es kann für das Hosting -Kurs und die zugehörigen Blogs verwendet werden. Blogs mit Newsletter. Blogs mit Premium -Inhalten. Zielseite des Startups und des zugehörigen Blogs. Verkauf von Themen usw.
Linux und MacOS werden aus der Schachtel unterstützt. Windows -Benutzer können WSL verwenden, es wird jedoch nicht getestet.
Problem erstellen und mit Feature markieren
Dies ist bisher noch nicht entschieden, dass es frei zu verwenden ist. Wenn verfügbar bezahltes Produkt verwendet, wird separater Kanal verwendet. Wenn Sie also von Github Release herunterladen, ist es für immer kostenlos. Helfen Sie uns bei der Entscheidung und sagen Sie uns, was Sie im Diskussionsbehörde dafür bezahlen würden.