Full-stack Telegram Mini App примерно за 50-60 тысяч рублей. Я беру слишком мало? Синдром самозванца бьет ключом
Всем привет, я соло джуниор/мидл разработчик, сейчас обновляю образовательного Телеграм-бота для клиента. Мы переходим от простого текстового бота к полноценному Telegram Mini App.
Клиент постоянно добавляет новые фичи, и хотя мне нравится работа, мой синдром самозванца сходит с ума по поводу цены. Я запросил около 50-60 тысяч рублей за весь объем, разбив его на 3 этапа.
Вот стек технологий и запрошенный функционал:
Стек: React.js, Python (Backend), PostgreSQL.
Объем работ:
• Полное обновление дизайна: Современный дизайн (Glassmorphism), адаптивная верстка, автоматическая смена темной/светлой темы.
• Умная регистрация: Каскадные списки (выбор города подтягивает нужные школы из БД).
• Система тестирования: Тесты по Алгебре, Геометрии и др. с активным таймером обратного отсчета и автозавершением.
• ИИ-разбор: Интеграция с нейросетью для разбора ошибок.
• Сложные рейтинги: Глобальный топ учеников и сложные SQL-запросы для рейтинга по школам.
• Геймификация (Дуэли): Асинхронная система дуэлей 1 на 1.
Я делаю всё сам: архитектуру БД, бэкенд и фронтенд.
Мой вопрос: 50-60 тысяч рублей — это справедливая цена за такой объем работы для соло-фрилансера, или я сильно демпингую? Но хотел бы услышать ваши мысли о соотношении объема работы и оплаты. Спасибо!
Open Source: Зачем это тебе на самом деле?
Когда вы в начале пути программиста, почти всё обучение происходит в вакууме. Вы пишете пет-проекты, смотрите бесконечные курсы и решаете задачи, результат которых увидите только вы сами. Но реальная разработка, это часто про командную игру.
Open Source — отличный способ выйти за пределы учебной песочницы. Это возможность заглянуть под капот известных инструментов, поработать плечом к плечу с опытными разработчиками и внести вклад в продукты, которыми пользуются тысячи людей.
Постепенно, у вас появляется публичный опыт, это реальные pull requests, которые может посмотреть любой. Даже вклад в небольшой проект показывает что вы умеете работать с чужим кодом, и понимаете Git-workflow. Если вы участвовали в известном проекте, это можно использовать в резюме.
1. С чего начинается любой Open Source проект ?
Перед тем как писать код, важно понять, как устроен проект и по каким правилам он живёт.
README.md — это фундаментальный документ любого проекта с открытым исходным кодом, выполняющий сразу три ключевые роли: техническую инструкцию, маркетинг вашего проекта и приглашение к сотрудничеству.
CONTRIBUTING.md — это правила входа. Автор проекта обычно прописывает здесь, как оформлять коммиты, как запускать тесты и в какие ветки писать код. Обязательно прочитайте его.
Лицензия — определяет юридические правила использования кода: можно ли его копировать, изменять и использовать в коммерческих проектах. Например, MIT License разрешает почти всё, а GPL требует, чтобы производные проекты тоже оставались открытыми.
2. Где найти свою первую задачу?
GitHub огромен, и новичку легко утонуть в тысячах заброшенных репозиториев. Чтобы не тратить часы на ручной поиск «живых» проектов, и находить актуальные задачи, удобно использовать специализированный инструмент.
OpenSourceHub.tech — это платформа, где собраны проекты, открытые для контрибьюта, и дружелюбные issues, подходит для новичков и опытных разработчиков.
Страница поиска issues | OpenSourceHub.tech
Существует множество различных фильтров. Включите чекбокс «Лёгкий вход», он покажет именно те задачи с которых удобно начать в новом проекте. Используйте фильтры по Labels, можно сразу найти задачи по созданию фичи (feature), исправлению багов (bug), написанию тестов (tests), и написание документации (docs).
У тебя есть Open Source проект?
Даже если он небольшой и у него мало звёзд, не держите его взаперти! На OpenSourceHub.tech можно добавить свой проект или issues на платформу, дай ему шанс получить: звёзды, обсуждение, интерес со стороны других разработчиков и первые контрибьюты в дружелюбной среде.
Вступай в наше Telegram-сообщество «Опенсорсеры». Тут помогают сделать первый вклад, и не чувствовать себя потерянным в начале пути, можно получить совет и найти проекты, в которые действительно хочется внести вклад. Есть отдельная рубрика, мы разбираем Open Source проекты участников. Цель таких разборов помочь авторам взглянуть на свой репозиторий глазами пользователя и потенциального контрибьютора.
3. Берем Issue в работу
Вы нашли подходящую задачу. Что дальше? На платформе только актуальные задачи, но всё равно посмотрите на правую колонку в GitHub и проверьте Assignees. Если там уже висит чья-то аватарка то значит задача занята.
Хорошим тоном является заранее связаться с автором issue прямо в комментариях. Это спасет тебя от ситуации, когда ты сделал работу, которую уже кто-то делает или которая не вписывается в планы проекта.
Пример: «Hi @Author_name! I want to take on this task. Is it still relevant?»
4. После того как вас назначили на задачу, можно начинать работу.
Создайте Fork. Нажмите кнопку Fork в верхнем углу страницы репозитория на GitHub. Копия проекта появится в вашем аккаунте.
Клонируйте форк локально:
Создайте новую ветку. Никогда не делайте правки в ветке main. Используйте префиксы для разных типов веток. Префиксы помогают быстро идентифицировать тип ветки и характер изменений.
Общепринятые префиксы: feature/ — для новых функций (например, feature/new-post-form), bugfix/ или fix/ — для исправление ошибок, hotfix/ — срочные исправления прямо в рабочей ветке, release/ — для подготовки релизов (например, release/0.2.0), refactor/ — структурные изменения кода, не влияющие на функциональность, docs/ — обновления документации.
Например: test/42-cli-runner, где 42 номер вашего Issue.
git checkout -b test/42-cli-runner
Эта команда создаёт новую ветку и сразу переключает вас на неё.
5. Код и коммиты
После того как вы внесли изменения, нужно сделать commit с описанием проделанной работы. Хорошим тоном считается использование Conventional Commits, это простая система заголовков.
git commit -m "test: cli runner (#42)"
Затем отправьте вашу ветку с локального компьютера на GitHub (в ваш форк):
git push origin test/42-cli-runner
6. Pull Request (PR)
После этого отправляем изменённую ветку, нажмите на GitHub кнопку "Open pull request"
В заголовке PR кратко расскажите, что вы сделали. И в описании опишите подробности. В конце добавьте: fixes #42, чтобы когда автор примет ваш PR, GitHub автоматически закроет задачу.
После создания PR начинается code review. Мейнтейнер может принять изменения сразу, оставить комментарии или попросить внести правки. Это нормальная часть процесса. Если вас просят что-то исправить, просто внесите изменения и отправьте их в ту же ветку. Pull Request обновится автоматически.
Когда всё будет готово, мейнтейнер нажмёт кнопку Merge и ваш вклад станет частью проекта. Это и есть тот самый момент, когда вы становитесь контрибьютором!
Заключение
Сегодня добавите тест. Завтра добавите фичу. Через неделю будете уверенно отправлять pull request в чужие проекты. А через пару месяцев уже возможно откроете свой.
Если вы хотите получить обратную связь и поддержку, найти пользователей и контрибьютеров для своего проекта присоединяйтесь в наше сообщество: t.me/OpenSource_Chat
Как делать программы с ИИ
Это не инструкция а просто пример как за 15 минут (буквально - я пост этот писал дольше) нагенерить минимально функциональное приложение. И понять - насколько это просто.
По ссылке переписка в процессе которой получился неплохой онлайн плеер, с поиском и каталогизацией треков.
Тут можно скачать и покурочить конечный результат ( ни разу не запускал docker под winndows, по идее должен понадобится ну хоть какой то бубен. Под linux просто нужен установленный docker + docker-compose, не из флетпак и тп, а именно системной службой. ).
Выглядит так:
Лёрника, часть очередная
Всем привет!
Как подобает любому сериалу, в предыдущих сериях:
настроил jitsi meet, подготовил работу с токенами, падре, я грешен, я не звонил своему дону целый год, карточки уроков добавляются и работают.... ну и иже с ними и все такое.
Доступ к ресурсу: https://learnika.ru/
Итак. подружил jitsi с лёрникой. Сразу скажу - было просто. От сервиса требовалось генерировать токены, собирать url адреса для каждого пользователя и отправлять их от сервера к учителю, а от учителя к ученику. По сути все. Ну почти, время жизни токена я установил на один час, ну и если учитель случайно ошибся и сделал ссылку "вчера", то ничто не мешает ему снова создать новый урок. еще долго обдумывал - а где конкретно пользователю "создавать онлайн урок"? я решил что в чате более логично.
Пользовательский сценарий такой:
В назначенное время учитель и ученик + - списываются в чате, там есть кнопка "создать урок" и, что думаю будет удобно, любой из оппонентов может создать урок. Просто потому что очень многие могут смотреть в книгу, а видеть фигу. Ну типа того.
Что еще интересно - сервер пытались атаковать, но ХУдожественный фильм там плавал, кто понял отсылку, тот понял отсылку и, ничего вы с этим не поделаете, да - да. Была туева хуча попыток...... эм...... положить сервер что ли..... или наполнить ботами что ли......... ну короче была попытка создать ботов на сервере. Но фиг там плавал. Рекаптча и одноразовый пароль показал кто тут главный. А это я, если вы забыли.
Вот вам фото чатика:
Два оппонента, учитель, и его ученик. Ого, прям как в звездных войнах! И как всегда двое их....
в таблице, которая хранит уроки, все стандартно -
то есть, любая запись о создании урока будет храниться в базе данных. К слову, teacherLink и studentlink имеют параметр текст потому что токен очень большой получается, плюс комната, плюс url, Высчитывать "а сколько надо" я не стал. По контроллеру, он же эндпоинт и сервису скажу что есть в наличии только создание. Удаление и редактирование не делал, а потому что зачем? У меня в планах сделать так, чтобы старые сообщения, по прошествию месяца удалялись бы.
Следующий шаг - Отзывы..... Да..... Нет.... Геморрой не в публикации.... а геморрой в модерации этих отзывов.... с одной стороны можно подрубить нейронку, а с другой - ну блин, превращаться в очередной сами знаете кто.... свят, свят, свят.... в бога не верю вот вам крест +.
О!!! Точно!!! предыдущие части:
Лёрника, часть следующая. Война с jitsi
Лёрника, часть следующая
Кому не сложно - просьба протестировать. можно зарегистрироваться как ученик и написать мне, или. если вы смелые, зарегистрироваться через яндекс, создать урок, подключиться с кем нибудь.
И, как всегда, адептам запятых и точек насыпал тут: ,,,,,,,,,,,,............ расставляйте по своему усмотрению и что бы демон орфографии, синтаксиса и пунктуации не загубил вас.
Всем спасибо за внимание!
Лёрника, часть следующая. Война с jitsi
Всем привет!
Доступ к ресурсу: https://learnika.ru/
Итак, я подобрался к 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 (ни в коем случае не реклама) то стало быть настройки где то там в панели. И, в кое то веки вскрытие показало что пациент ожил от вскрытия!!! Оно стало работать!
после выхода с конференции перекидывает на главную страницу
Да, у меня два монитора, очень удобно,
точки и запятые насыпал вот тут: .............,,,,,,,,,,,,,,,, кому важно могут брать оттуда и расставлять по своему усмотрению.
Как то так, всем спасибо за внимание!
Лёрника, часть следующая
Всем привет! продолжаю работать над сервисом, пока что в демо режиме, доступен по ссылке:
https://learnika.ru/
сделал следующую стадию: Календарь. учитель может сделать слот с занятием, назначить тему, цену, время, ученика. Ученик, в свою очередь, должен этот урок подтвердить.
Тут хотелось бы выслушать "отзывы и предложения" по работе слотов, что улучшить, что доделать.
желтый, как вы понимаете, неподтвержденный урок. он ожидает подтверждения от ученика, чуть позже добавлю туда клавишу "подключиться к видеоконференции".
Вид со стороны ученика:
И... как долго я ругался с этим фронтом, ненавижу js! С сервером проблем нет и небыло за все время! написал сервисы, эндпоинты, энтити, все работает, curl запросы отправляет, данные ходят во все стороны, но на странице нормально не отображается, или вообще модальное окно не открывается вовсе. Но, я победил.
следующий этап: "оставьте отзыв" на преподавателя и кастомизация подключение jitsi.
еще пришла в голову идея сделать тесты для пользователей, чтобы учитель мог сделать на платформе тестовые формы, и мог давать их своим ученикам.
точки и запятые насыпал вот тут: .............,,,,,,,,,,,,,,,, кто "чувствительный" могут брать оттуда и расставлять по своему усмотрению.
как то так, всем спасибо за внимание!
Лёрника
Всем привет! Давно ничего не писал про проект, потому что скрупулезно работал. Итак, она все еще разрабатывается, но, доступна по ссылке - https://learnika.ru/ пока что в демо режиме, но с рабочим функционалом. Иногда будет недоступна, когда я буду что либо с ней делать.
Да, проект еще не полностью готов, и, думаю, есть наличие уязвимостей, это еще будет прорабатываться.
На данный момент - обычная регистрация через почту с одноразовым паролем с возможностью просматривать карточки уроков и возможностью написать преподавателю. Ранее хотел сделать регистрацию через госуслуги, но, это оказалось геморроем, потому что постоянно "сервис временно недоступен". потому я отложил на время госуслуги и задействовал яндекс верификацию. Чтобы начать выкладывать карточки своих уроков необходимо пройти регистрацию через яндекс. Впринципе, если с госуслугами не получится, то останусь на яндексе и переведу регистрацию полностью через него. Как ни странно, но система аутентификации у яндекса мне нравится. При регистрации защиту от ботов предоставляет google recaptcha.
Последнее нововведение - чаты. Реализация через webSocket, это накладывает некоторые ограничения на количество пользователей, до, 32 тысяч человек за раз там +-. Но это пока что не критично.
Следующая реализация - видеоконференция и календарь. Видеоконференцию я возьму от jitsi, и кастомизирую для лёрники. календарь будет мой. В идеале что бы в чате можно было списаться пользователям, учитель откроет календарь, и поставит урок на тот день и на то время, когда это им удобно а ученик подтвердит. При этом, думаю, реализовать отмену или перенос урока нужно так же через подтверждение от обеих сторон.
Загрузка аватара пользователя и загрузка обложки урока работает по одному принципу - пережимает изображение на сервере, исходное изображение удаляется с сервера и на нем остается сильно сжатое для экономии памяти.
Вчера весь день запускал сервер. я взял обычную vps, и первое с чем я столкнулся - сайт открывается, но регистрация не работает, постоянная ошибка. логи сервера в начале показали что запросы до spring boot доходят, но сам spring их блокирует. Пришлось повозиться с конфигами nginx, но там было не сложно. Потом, при попытке зарегистрироваться, запрос от hibernate идет на БД, но запись не появляется. Магия, подумал я, но нет, по какой то причине миграция БД с созданием схемы не работала. Решил проблему прямым запросом в саму базу. И вуаля, запись появилась. Но, следующий подвох - письма не приходят, точнее, не отправляются. Ну, первое что я проверил - работают ли порты? при попытке послушать 465 порт мертвые с косами стоят и тишина... тоже самое и с 587 портом, проблему так же решил путем включения портов в панели управления хостингом. Я такого не ожидал, потому что ранее не сталкивался.
Еще немного поработал с логотипом, мучался и сам, и с нейронками, в итоге пришел к виду вот такого логотипа:
стилизованная буква "Л", как по мне, выглядит современно.
Как то так, продолжаю работу над проектом, в планах закончить и полностью запустить до нового года. Всем спасибо за внимание!
















