Уже немногим около года я создаю проект, который называется "Лёрника" маркетплейс для репетиторов, преподавателей и учеников. Проект на завершающей стадии и бесплатный. Честно говоря "лигу репетиторов" ранее я не видел, увидел сегодня и поэтому решил написать сюда в лигу.
Итак, как я ранее писал, проект на завершающей стадии.
На нем можно будет выставлять свои уроки, ученики смогут найти ваш урок (на данный момент редактирую поисковую систему поэтому она может иногда выдавать ошибки). Например, мне нужен преподаватель математики, ЕГЭ. В поисковике я ввожу требуемый мне предмет и выбираю среди преподавателей. Классификацию можно выбрать по нескольким параметрам: цена, рейтинг, который строится из отзывов, уровень, город.
Онлайн занятие можно провести прямо на платформе, не уходя ни в какие другие платформы. Не понадобится ни google meet, ни Yandex telemost. Все работает на одной платформе.
при этом никто не запрещает проводить занятия оффлайн. Можно так же искать себе учеников для занятий, к примеру, на дому.
если есть желающие протестировать - милости прошу. Особенно нужно протестировать онлайн занятие в системе.
На данный момент для создания уроков необходимо зарегистрировать на платформе через яндекс. Так же у меня есть регистрация в роскомнадзоре и вскоре будет добавлена политика конфиденциальности.
Очень нужна обратная связь по работе сервиса, что добавить, а что не нужно и можно убрать. По ошибкам в работе - я прекрасно о них знаю и работаю над ними.
Как подобает любому сериалу, в предыдущих сериях: настроил jitsi meet, подготовил работу с токенами, падре, я грешен, я не звонил своему дону целый год, карточки уроков добавляются и работают.... ну и иже с ними и все такое.
Итак. подружил jitsi с лёрникой. Сразу скажу - было просто. От сервиса требовалось генерировать токены, собирать url адреса для каждого пользователя и отправлять их от сервера к учителю, а от учителя к ученику. По сути все. Ну почти, время жизни токена я установил на один час, ну и если учитель случайно ошибся и сделал ссылку "вчера", то ничто не мешает ему снова создать новый урок. еще долго обдумывал - а где конкретно пользователю "создавать онлайн урок"? я решил что в чате более логично.
Пользовательский сценарий такой: В назначенное время учитель и ученик + - списываются в чате, там есть кнопка "создать урок" и, что думаю будет удобно, любой из оппонентов может создать урок. Просто потому что очень многие могут смотреть в книгу, а видеть фигу. Ну типа того.
Что еще интересно - сервер пытались атаковать, но ХУдожественный фильм там плавал, кто понял отсылку, тот понял отсылку и, ничего вы с этим не поделаете, да - да. Была туева хуча попыток...... эм...... положить сервер что ли..... или наполнить ботами что ли......... ну короче была попытка создать ботов на сервере. Но фиг там плавал. Рекаптча и одноразовый пароль показал кто тут главный. А это я, если вы забыли.
Вот вам фото чатика:
Два оппонента, учитель, и его ученик. Ого, прям как в звездных войнах! И как всегда двое их....
в таблице, которая хранит уроки, все стандартно -
то есть, любая запись о создании урока будет храниться в базе данных. К слову, teacherLink и studentlink имеют параметр текст потому что токен очень большой получается, плюс комната, плюс url, Высчитывать "а сколько надо" я не стал. По контроллеру, он же эндпоинт и сервису скажу что есть в наличии только создание. Удаление и редактирование не делал, а потому что зачем? У меня в планах сделать так, чтобы старые сообщения, по прошествию месяца удалялись бы.
Следующий шаг - Отзывы..... Да..... Нет.... Геморрой не в публикации.... а геморрой в модерации этих отзывов.... с одной стороны можно подрубить нейронку, а с другой - ну блин, превращаться в очередной сами знаете кто.... свят, свят, свят.... в бога не верю вот вам крест +.
Кому не сложно - просьба протестировать. можно зарегистрироваться как ученик и написать мне, или. если вы смелые, зарегистрироваться через яндекс, создать урок, подключиться с кем нибудь.
И, как всегда, адептам запятых и точек насыпал тут: ,,,,,,,,,,,,............ расставляйте по своему усмотрению и что бы демон орфографии, синтаксиса и пунктуации не загубил вас.
Итак, я подобрался к jitsi вплотную. Установить это пол беды, хотя это даже не беда, что там не ждут меня. Что не сохранил с тобой себя.... три, четыре, закончили. Настроить JWT токены это тот еще геморрой.
В начале было слово, а какое не скажу. Потому что не знаю, это все равно что спросить "а кто изобрел колесо". Естественно, после установки нужно добавить параметры что у нас не анонимные пользователи, а авторизованные. подключил в конфигах токены. И понеслась...
1 Битва. Prosody не видит токены. Видишь токены? и я не вижу, а он есть. в логах пишет: modulemanager: Unable to load module 'auth_token': /usr/lib/prosody/.../mod_auth_token.lua: No such file or directory modulemanager: Error initializing module 'auth_token': module 'inspect' not found: Суть оказалась проста, Prosody искал плагины не там, где они были. так же ему не хватало библиотеки из Lua, которая нужна для работы в jwt. Собственно, через luarocks поставил inspect. так же в конфигах нужно прописать путь к плагинам : plugin_paths = { "/usr/share/jitsi-meet/prosody-plugins/" }, кто поймет, тот поймет, а кто не поймет, тот не поймет. Да, я капитан очевидность. И..... Prosody таки увидел плагины и начал их грузить!
2 Битва. Пользователи таки стали проходить аутентификацию, но когда подключается второй клиент - давай до свидания, вылетают тут же оба. Client disconnected: connection closed. Сразу оба два.
В настройках : c2s_require_encryption = true а было false, не помогло, если что, это это настройка Prosody XMPP сервера, опять же, кто то понял, кто то нет. да и какая разница. А, ну да, эта настройка определяет обязательно ли шифрование или нет. Вскрытие показало что пациент умер от вскрытия. По любому этот параметр тоже влиял, но, как могла подумать моя многоуважаемая публика, а может и не влиял. Скорее всего да. Но, визуально ничего не поменялось, ошибки все те же самые.
Хм..... хмыкнул я, но и это не помогло. а вдруг права доступа к файлам не права доступа к файлам? а вдруг все под рутом? А у Prosody и пользователь prosody. Права установил, но и это не помогло! Хотя, вскрытие показало что все файлы были под правами рута. При этом Jicofo очень даже молодец, видит, принимает. Если что, он отвечает за управление, фокусировку, координацию участников.
Но вылеты при коннекте продолжаются.
3 Битва. Финал. Порты.
Ну по логике, когда подключение без токенов, оно работает, ну значит и машина не виновата же? А вот Фиг Вам, называется, привет, Шарик. Вскрытие в очередной раз показало что без токенов коннектится по порту 443/TCP, а с токенами используются чуть чуть другие порты, которые для медиа более эффективны: 10000/UDP и 4443/TCP.
Ну а поскольку я брал облачный vps в timeweb (ни в коем случае не реклама) то стало быть настройки где то там в панели. И, в кое то веки вскрытие показало что пациент ожил от вскрытия!!! Оно стало работать!
после выхода с конференции перекидывает на главную страницу
Да, у меня два монитора, очень удобно,
точки и запятые насыпал вот тут: .............,,,,,,,,,,,,,,,, кому важно могут брать оттуда и расставлять по своему усмотрению.
сделал следующую стадию: Календарь. учитель может сделать слот с занятием, назначить тему, цену, время, ученика. Ученик, в свою очередь, должен этот урок подтвердить.
Тут хотелось бы выслушать "отзывы и предложения" по работе слотов, что улучшить, что доделать.
желтый, как вы понимаете, неподтвержденный урок. он ожидает подтверждения от ученика, чуть позже добавлю туда клавишу "подключиться к видеоконференции".
Вид со стороны ученика:
И... как долго я ругался с этим фронтом, ненавижу js! С сервером проблем нет и небыло за все время! написал сервисы, эндпоинты, энтити, все работает, curl запросы отправляет, данные ходят во все стороны, но на странице нормально не отображается, или вообще модальное окно не открывается вовсе. Но, я победил.
следующий этап: "оставьте отзыв" на преподавателя и кастомизация подключение jitsi.
еще пришла в голову идея сделать тесты для пользователей, чтобы учитель мог сделать на платформе тестовые формы, и мог давать их своим ученикам.
точки и запятые насыпал вот тут: .............,,,,,,,,,,,,,,,, кто "чувствительный" могут брать оттуда и расставлять по своему усмотрению.
Всем привет! Давно ничего не писал про проект, потому что скрупулезно работал. Итак, она все еще разрабатывается, но, доступна по ссылке - https://learnika.ru/ пока что в демо режиме, но с рабочим функционалом. Иногда будет недоступна, когда я буду что либо с ней делать. Да, проект еще не полностью готов, и, думаю, есть наличие уязвимостей, это еще будет прорабатываться.
На данный момент - обычная регистрация через почту с одноразовым паролем с возможностью просматривать карточки уроков и возможностью написать преподавателю. Ранее хотел сделать регистрацию через госуслуги, но, это оказалось геморроем, потому что постоянно "сервис временно недоступен". потому я отложил на время госуслуги и задействовал яндекс верификацию. Чтобы начать выкладывать карточки своих уроков необходимо пройти регистрацию через яндекс. Впринципе, если с госуслугами не получится, то останусь на яндексе и переведу регистрацию полностью через него. Как ни странно, но система аутентификации у яндекса мне нравится. При регистрации защиту от ботов предоставляет google recaptcha.
Главная страница
Последнее нововведение - чаты. Реализация через webSocket, это накладывает некоторые ограничения на количество пользователей, до, 32 тысяч человек за раз там +-. Но это пока что не критично.
Чаты пока пустые, писать неком
Следующая реализация - видеоконференция и календарь. Видеоконференцию я возьму от jitsi, и кастомизирую для лёрники. календарь будет мой. В идеале что бы в чате можно было списаться пользователям, учитель откроет календарь, и поставит урок на тот день и на то время, когда это им удобно а ученик подтвердит. При этом, думаю, реализовать отмену или перенос урока нужно так же через подтверждение от обеих сторон.
Загрузка аватара пользователя и загрузка обложки урока работает по одному принципу - пережимает изображение на сервере, исходное изображение удаляется с сервера и на нем остается сильно сжатое для экономии памяти.
Вчера весь день запускал сервер. я взял обычную vps, и первое с чем я столкнулся - сайт открывается, но регистрация не работает, постоянная ошибка. логи сервера в начале показали что запросы до spring boot доходят, но сам spring их блокирует. Пришлось повозиться с конфигами nginx, но там было не сложно. Потом, при попытке зарегистрироваться, запрос от hibernate идет на БД, но запись не появляется. Магия, подумал я, но нет, по какой то причине миграция БД с созданием схемы не работала. Решил проблему прямым запросом в саму базу. И вуаля, запись появилась. Но, следующий подвох - письма не приходят, точнее, не отправляются. Ну, первое что я проверил - работают ли порты? при попытке послушать 465 порт мертвые с косами стоят и тишина... тоже самое и с 587 портом, проблему так же решил путем включения портов в панели управления хостингом. Я такого не ожидал, потому что ранее не сталкивался.
Еще немного поработал с логотипом, мучался и сам, и с нейронками, в итоге пришел к виду вот такого логотипа:
стилизованная буква "Л", как по мне, выглядит современно.
Как то так, продолжаю работу над проектом, в планах закончить и полностью запустить до нового года. Всем спасибо за внимание!
Недавно я уже писал здесь, на Пикабу, о своих идеях создания разных проектов — от сайта объявлений до инвестиционной платформы или маркетплейса для малого бизнеса. Но в итоге я остановился на том, что, на мой взгляд, наиболее перспективно: «Лёрника» — это онлайн-платформа для репетиторов и учеников, где можно находить преподавателей, создавать курсы и заниматься как онлайн, так и оффлайн.
Название придумал сам — от английского «learn» (учиться). Думаю, смысл понятен.
Проект потихоньку движется. Сейчас работаю над ним на Spring Boot (Java). Так как я не фронтенд-разработчик, немного помогает Qwen — справляется, в целом, но не всегда идеально.
Что уже есть?
1. Главная страница
Часть функционала пока в разработке, но базовая структура уже работает. Главное — регистрация и вход реализованы.
2. Окно регистрации
нЯ сознательно не запрашиваю много данных на старте — только самое необходимое. Те, кто внимательно смотрит, могли заметить, что я уже подключил reCAPTCHA от Google для защиты от ботов.
После регистрации пользователь сможет искать курсы и писать преподавателям, но создавать свои курсы — пока нет. Для этого нужно пройти полную верификацию личности.
🔐 А зачем вообще верификация?
Чтобы исключить мошенников. Никому не нужен «репетитор», который соберёт деньги и исчезнет. Я думаю использовать Госуслуги — это, пожалуй, самый надёжный и удобный способ. А вот вариант вроде «сфотографируйтесь с паспортом» (как на Авито) — считаю пережитком прошлого: это легко подделать, особенно с хорошим принтером или фотошопом. На Пикабу полно таких историй.
✉️ Подтверждение почты
Реализован механизм подтверждения email. Сначала были проблемы с доставкой писем — пришлось немного повозиться с настройкой почтового ящика (пока использую Яндекс, но в будущем сделаю собственный почтовый сервер).
Также я купил домен — learnika.ru 🎉 Правда, пока он ни к чему не привязан — особо некуда. Но скоро всё изменится.
🔐 Авторизация и безопасность
Работает по следующей схеме:
После регистрации пользователь получает refreshToken (живёт 2 недели) — нужен только для обновления accessToken.
accessToken (срок жизни — 10 минут) используется для доступа к защищённым ресурсам.
При истечении accessToken (ошибка 401/403) система автоматически запрашивает новый через refreshToken.
Все токены хранятся в базе данных и проверяются при каждом запросе — это защита от подделки.
Если refreshToken ещё жив — пользователь входит автоматически. Если срок истёк или куки удалены — попадает на главную, где можно снова войти.
🧑🎓 Роли пользователей
Есть две роли: STUDENT и TEACHER. Разница в том, что учитель — это студент, прошедший полную верификацию. Только после этого открывается доступ к созданию курсов.
Контроллер регистрации, ничего такого.
🔒 Защита контента
Открытые страницы (например, главная) будут лежать в стандартной папке (/var/www). А вот защищённые (личный кабинет, курсы, профили) — генерируются динамически и доступны только через Spring-бэкенд после авторизации.
вот такой логотип будет)
💬 Группа в Telegram
Я знаю, что многие не любят ссылки, но всё же — у меня есть группа в Telegram, посвящённая именно разработке Лёрники: 👉 https://t.me/learnika_app
Это не рекламный канал и не рассылка. Там можно обсудить функционал, предложить идеи, посмотреть прототипы, проголосовать за фичи или просто поучаствовать в развитии проекта. Буду рад любым мыслям и советам!
(если не понравится, в следующих постах уже не будет)
P.S. Кому не хватает запятых и точек — вот: .................... ,,,,,,,,,,,,,,,,,,,,, Расставляйте по вкусу 😄
Спасибо, что дочитали! Буду рад вашим комментариям и фидбэку.