Обслуживайте свой сайт и продавайте курсы с помощью собственного сервера.
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. Если используется humo/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. Если используется humo/jekyll и т. д., например, генератор статических сайтов, ветка должна содержать сгенерированный сайт (по умолчанию в корневом каталоге будет index.html).
./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.
Иерархия ролей такая: администратор > пользователь > гость Любой API, доступный гостю, также доступен пользователю, и любой API, доступный пользователю, также доступен администратору. Для доступа к пользователю/администратору файл cookie сеанса API, полученный после входа в систему, должен предоставляться с каждым запросом в потренируйтесь, об этом позаботится браузер
| Описание | Запрос | Роль |
|---|---|---|
| Зарегистрировать пользователя | 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-адрес, если домен установлен, или код, который следует добавить после проверки 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"
}
Получите все продукты, перечисленные для продажи на веб-сайте. Принимает в качестве запросов «предел» и «смещение». Если запрос не установлен, значения по умолчанию для предела установлены на 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-адрес полосы для оплаты заказа, созданного с помощью API создания заказа. Используйте ответ 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"
}
Зарегистрируйте всех пользователей на сайте. Принимает ограничение и смещение, поскольку значения параметров запроса по умолчанию равны 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, она бесплатна навсегда. Помогите нам принять решение, расскажите, сколько бы вы за это заплатили, на форуме обсуждений.