Был серьёзный перерыв, потеря мотивации и всё такое, с момента последнего поста углубился в работу с консолью, поставил две виртуалки дебиан, одну кде, другую hyprland, обе снёс из за того что надоел весь этот сахар, сегодня более или мненее разобрался с psutils, написал что то типа мини утилиты для бекапа системы, не на что не претендую, писал не для использования а для освежения навыков и изучения библиотеки, вот код и вывод:
Каждый раз, когда нужно перекинуть файл, код или ссылку с ПК на телефон (или другу в той же Wi-Fi сети), начинается классическая возня. Либо гоняешь через «Избранное» в мессенджерах (где режется качество и файлы вечно висят в облаке), либо поднимаешь локальные веб-серверы через консоль. Мне это надоело, и я решил написать свою утилиту — FlashStash.
Основная идея: софт должен запускаться в один клик, работать без интернета внутри локалки, иметь всеядный предпросмотр файлов прямо в браузере и не требовать от пользователя установки Питона или настройки окружения.
После нескольких итераций проект дорос до версии 1.6, и я хочу поделиться тем, как устроена утилита изнутри и с какими техническими проблемами пришлось столкнуться.
Что под капотом и как это работает
Бэкенд написан на Python + Flask, а фронтенд работает на чистом JS. Процесс использования максимально упрощен:
Запускается один исполняемый файл FlashStash.exe.
Программа сама определяет локальный IP-адрес компьютера, поднимает сервер и автоматически открывает веб-интерфейс в браузере хоста.
Чтобы подключить смартфон или другой ПК к общему пространству, нужно просто ввести в адресную строку браузера IP-адрес, который отображается в консоли сервера.
При этом для каждого загруженного файла в интерфейсе генерируется отдельный QR-код — это позволяет мгновенно скачивать конкретные файлы на телефон через камеру, не вбивая ссылки вручную.
Проект собран как Zero-Dependency Portable Build. Внутри архива лежит скомпилированный .exe файл со своей иконкой и встроенное портативное ядро Python. То есть утилиту можно закинуть на абсолютно «голую» Windows (желательно прямо на Рабочий стол), кликнуть, и всё сразу заведётся.
Как развивался проект: от костылей к нормальной архитектуре
В процессе разработки вылезло несколько неочевидных проблем, которые пришлось оперативно закрывать.
1. Борьба с «одноразовой» безопасностью
Изначально я добавил функцию защиты файлов паролями при загрузке. Но в первых версиях все пароли хранились в обычном Python-словаре в оперативной памяти. Стоило перезапустить сервер, как словарь очищался, файлы оставались в папке, но скачать их мог любой желающий без всякого пароля.
В версии 1.6 я переписал эту логику. Теперь все хэндлы, пароли файлов и история текстового буфера обмена намертво пишутся в локальные JSON-файлы. Данные идеально выдерживают перезапуск сервера и не нагружают систему лишними тяжелыми СУБД.
2. Закрытие уязвимости Path Traversal
Когда пишешь локальный веб-сервер для обмена файлами, легко забыть про базовую безопасность путей. В первых билдах бэкенд принимал имя файла из адресной строки практически «как есть».
Продвинутый пользователь в локальной сети мог провернуть атаку Path Traversal, отправив запрос вида ../, выйти за пределы папки обмена и стянуть системные файлы с хост-машины. Чтобы это исправить, я внедрил жесткую фильтрацию и санитаризацию входных путей через os.path.basename. Теперь бэкенд отсекает любые попытки побега из папки shared_files.
3. Всеядный предпросмотр (All-in-One)
Мне не хотелось, чтобы пользователь скачивал файл только ради того, чтобы узнать, что внутри. Поэтому фронтенд получил встроенные плееры для аудио и видео, просмотрщик картинок и текстовых документов. Из интересного — добавил просмотрщик архивов: структура файлов внутри .zip и .rar отображается прямо на веб-странице до скачивания самого архива.
Наведение порядка: Wipe_All_Data
Поскольку Питон при работе создаёт скрытый кэш (__pycache__), а папка shared_files постепенно забивается реальными файлами, перед заливкой проекта на GitHub или передачей папки другу её нужно как-то чистить. Сам запущенный Питон свои процессы и кэш удалить не может (Windows выдаёт Access Denied).
Для этого я написал отдельный служебный батник Wipe_All_Data.bat на английском (чтобы кодовая база репозитория выглядела аккуратно). Он делает три вещи:
Жестко тушит активные процессы сервера через taskkill.
Под ноль вычищает папки с файлами, паролями и текстами.
Сканирует дерево директорий и сносит весь кэш компилятора Питона, сжимая вес папки до исходного минимума.
Итоги
Проект получился именно таким, каким я хотел его видеть в повседневной жизни — легким, быстрым и независимым. Исходный код полностью открыт, пощупать портативный билд v1.6 и оценить реализацию можно на гитхабе.
Всем привет! Продолжаю свою историю с чат сервисов. Расскажу о болячках и проблемах, и о том как их решали.
Первый деплой
У нас прошел еще 30 апреля. Что по конфигурации:
2 CPU
4GB ОЗУ
20GB SSD
OC: Ubuntu
Арендовали у Яндекса, из всех у них был самый дешевый вариант и довольно легкий в настройке. Все встало сразу, без танцев с бубнами. Ценник приемлемый, но зная что яндекс фанаты воровать чей-то код - немного опасаюсь того что слижут (хотя казалось бы вообще должно быть все равно, кому он нафиг сдался).
Что по нагрузке? В статике сервисы не пожирают процессор больше чем на 15-20% (Основной потребитель сервис транскрипции, без него 10%). ОЗУ тоже в порядке, 900мб из 4GB.
Поставили поверх основных сервисов еще дополнительно Portainer (аналог докера десктопа, но с чуть меньшим функционалом), grafana + prometeus для метрик, вместе со всем без сервисы транскрипции сейчас 1.1gb потребление ОЗУ и 16%CPU. Ну это мелочи. Сейчас начнем уже тестировать в открытую с нормальным трафиком.
Ошибки
Ох их было много. Ну кто-же знал что например пути для медийки будут разные. И вот одна картинка аватарки руинила вообще весь UI. Потом пути не правильно парсились - исправили. Часть функционала не хотела работать должным образом - переписали ряд мелких модулей. Например из такого прикольного - система прав пользователей. Запускаешь на локалке под 2 учетками - все работает, сервисы те же самые. Компилируешь прилу, запускаешь с сервера - ну вот не обновляются они в real time и все. А проблема была в одной строке ws, которая за собой тянула просто уйму компонентов. Нашли, разобрались и все заработало. Сейчас 97% примерно функционала работает должным образом. Есть еще проблемы - решаем.
Баги
Вот эти твари вообще появились откуда не возьмись. При деплое часть файлов которые были второстепенные и их основной модуль не опрашивал - просто не залились и ошибок не было.
Опять же как пример: Есть у нас сервис Emoji который позволяет создавать свои наборы эмодзи и применять их как в сообщениях, так и в реакциях. Вот rout который отвечает за создание пака - скопировался, а route который отвечает за отправку и получения медия - не перенесся. Долго искал проблему. Тем более интерфейса нету никакого, а в лине я вообще нуб. Нашел, написал скрипт который сам заливает по SSH файлы, проверяет на соответствие, и если нет - дозаливает. Почему так - не знаю, но хотелось бы узнать.
И всякие мелкие тоже повсплывали недочеты, права, Pub\sub события и тп.
Первый взлом
Вот тут я вообще офиг и ушел на неделю читать про безопасность и то как порты влияют на доступ извне и бла-бла-бла. В общем, неделю две назад стали замечать что наша база вечно дропается раз в день. Ну казалось бы не жалко, дропайся, посмотрели Volume в докере, все стоит, дропаться не должна, подумали что косяк у яндекса. А вот и нифига. Решил я значит залезть в БД и глянуть логи. Оказалось что кто-то обычным перебором IP и портов залез в БД (Да, я открывал на нее порт, что бы компас подрубить и смотреть данные тестовые). И вот он у себя видимо поставил скрипт на повтор и дропал нам базу. И самое смешное создавал там новую БД с коллекцией README в которой была только 1 запись, цитирую "Кинь биток пожалуйста иначе солью БД". Поржали мы с этого и пошли капать как нам изолировать все. Оказалось что в первоначально версии я задумался о бэк безопасности от эксплойтов, но оставил прямые эксплойти в Compose докера и еще открыл порты. Теперь у нас полная изоляция через NGINX и 3NAT-a. Доступ есть только у нашей команды по нашим IP которые не статичны (Да-да, приходиться раз в сутки менять IP в доступах что бы можно было подключаться). Порты у сервисов теперь проставляет только Docker и автоматически это делает.
Что имеем по итогу:
Мы сейчас собрали живое приложение, устранили большинство эксплойтов и багов.
Вот так выглядят чаты, все работает, все аккуратное
Добавили лобби для голосовых комнат
При нажатии подключиться - входите в саму комнату
Протестировали звуковой кодек который основан на ИИ модели и я хочу сказать что не зря мы потратили время на обучение модели. Очень хорошо работает. Не уровень дискорда конечно, но шумы отсекаются прилично не влияя на голос.
Доработали "Заметки" к сохраненным сообщениям. И нет они не локальные, все лежит на сервере.
Нажимаете "Заметка", пишите что надо и все, всегда помните об этом.
А что у нас по задержкам ответа:
Есть пара мест, но тут мы знаем в чем проблема. Играет 2 вещи:
Это порядок запросов (исправляем). Фронт открывает на эти запросы 2 тоннеля и пока один не отработает второй не начнет гнать данные. Но тут больше архитектурный подход
Куча подкапотных запросов из которых часть так же идет несколькими туннелями вместо одного. Тут не все получиться решить, но сократить где-то на 40% время запроса - думаю сможем.
Задержка в звуке, тестировали на 9 человек - вообще минимальная 30-100мс. Практически говоришь и сразу слышишь собеседника.
Ах, да. Мобилки. Мобилок пока не будет. Т.е. они готовы, но надо стилевые файлы править под новые функции, не делали пока что. Как бы работают нормально, но есть косяки. Да и в ПК версии тоже косяки будут. Но сил самим 100 раз тыкать одно и тоже уже нету.
Шифрование. В коде оно реализовано для 1:1 общения, но мы его выключили. Нам не нужны проблемы в тв.Майором на этапе тестирования.
Сбор данных и метрик. Их нет. Ну точнее как нет, ради безопасности ваших доступов мы собираем только слепок метаданных пк. Но не для их хранения, а для того что бы на этой основе составить пары ключей доступа и вам не приходилось 100 раз в день вводить логи + пароль - получать ключ входа на почту и тд. Т.е. один раз запрашиваем данные при авторизации, создаем пару ключей, далее рефрешим их и проверяем совпадают ли ваши текущие данные с теми что были отправлены заранее. Если нет - релог. Рефреш раз в Х секунд (минут). Больше мы ничего не запрашиваем. За VPN не бойтесь - не смотрим, нам это не надо. Если вдруг будет много возмущений и слов "Да нам не нужна эта защита я хоть 1000 раз в сутки готов вводить код" - таких будет большинство - отключим и пусть любой подменяет ваш токен.
Ну вот и все, спасибо за прочтение. Сейчас мы готовим страницу с информацией о приложении и ссылкой на скачивание, с нашим описание и тп. (Надеюсь) скоро уже сможем дать попробовать пообщаться в новом мессенджере.
Если есть какие-то предложения, вопросы - пишите, с радостью отвечу. А может быть что-то интересное подскажете.
Недавно я выкладывал здесь пост про свою текстовую оболочку ZeliconCMDtxt, и многие в комментариях начали смеяться, что 530 строк кода — это слишком мало для операционной системы. Тот проект был лишь маленьким тестом интерфейса.
Пришло время раскрыть карты и показать мой главный проект. Встречайте — Dony OS!
Это масштабная графическая операционная система, над которой я работал. Мой текущий репозиторий на языке C# (.NET Framework) официально перевалил за 550 384 строки кода!
Что вшито в эти полмиллиона строк:
Полноценная архитектура управления процессами и распределения оперативной памяти.
Собственная графическая подсистема с поддержкой квадратных окон и 3D-иконок.
Встроенная хакерская среда разработки Zelicon Code Studio, способная запускать скрипты на Python и чистом Си.
Фирменный движок Anti-Lag System, который силой удерживает лаги на отметке 0% на любом железе (даже на эконом-ноутбуках!).
По сути это система, которая показывает на экранах (ТВ в коридоре, монитор, планшет) актуальное расписание, время, объявления и звонки. Всё работает в обычном браузере, без всяких специальных программ. Мне надоело смотреть как девчонки бегают с флешками между телевизорами.
Сделал так, чтобы после настройки можно было отключить интернет совсем — всё хранится локально и работает по сети (после сборки). Поставил старый мини-ПК или даже прямо на Smart TV заходит по адресу и показывает.
Сначала думал только про школы (уроки, перемены, звонки на Рупор-300 или используя собственный усилитель), но чем дальше, тем больше понимаю, что это можно использовать гораздо шире...
Сейчас уже стоит в паре мест, работает. Столкнулся с интересными моментами по интерфейсу и удобству, особенно когда пытаешься сделать так, чтобы и директору было понятно, и обычному человеку на телефоне.
Если кому-то интересно такое решение для своей задачи — могу показать, что получилось. Или иные вопросы или явные указания (по скринам) на проблемы. Основа - питон, FastApi и js.
Мой ТГ (личка): @GuardDoc
Не каналы, не продажи, просто если есть интерес поговорить что это такое. Ищу критики и предложений по интерефейсу (сложно в UI)
Особенно не откажусь от мыслей что можно добавить как "виджеты"
У меня есть старый ноутбук Lenovo Z510. Процессор: Intel Core i3. Оперативная память: 8GB DDR3. Постоянная память: 500 GB SSD. Видеокарта две штуки: встроенная в процессор intel и дискретная: NVIDIA GeForce GT 740M. Объем видеопамяти 2 GB.
Ноутбук используется для интернета, офиса, написания кода на Python, мультимедиа, обработки фотографий, рисования на графическом планшете Wacom, рисование схем в Inkscape, 3d моделирования, монтажа коротких видеороликов и для легких игр.
Изначально на нем была Windows 8 (была предустановлена изначально), затем сломался жесткий диск и после того как старый жесткий диск был заменен на новый. На нем были установлены параллельно (Dual boot) Windows 10 и Linux mint. И так и работало до недавнего времени, а затем жесткий диск начал сыпаться. Я почистил ноутбук, от пыли и заменил жесткий диск на SSD накопитель, а заодно сделал полную диагностику. Дальше пришлось решать, что на него ставить. Сначала хотел снова установить Windows 10 и Linux mint. Но потом подумал, а какой в этом смысл? И в самом деле, поддержка Windows 10 была прекращена осенью прошлого года. С Windows 11, ноутбук не совместим аппаратно. Microsoft Office как и другими программами от Microsoft я много лет как не пользуюсь (давно перешел на LibreOffice и все документы храню в форматах ODF), браузер Firefox, Blender, Krita, RawTherapee, VLC, Inkscape, Shotcut, Pycharm, PCSX2 — бесплатный эмулятор PlayStation 2, браузер Firefox кросс платформенные, мультимедиа вся есть на Linux. Единственная программа которая нативно не запускается на Linux это Affinity Photo (я в нём фотографии обрабатывал), но его можно запускать через WinBoat или перейти на GIMP. Исходя из этого я решил полностью перейти на Linux mint. Поэтому я вставил приготовленную флешку с Linux Mint 22.3 Zena, и загрузившись с неё приступил к установке. Саму установку описывать не буду (она очень простая), точно так же как и настройку (тоже довольно просто). Расскажу какие преимущества получил.
Чистая и не требовательная к ресурсам система. Без вирусов, рекламы и телеметрии.
Потребление памяти меньше 2 GB
Linux mint занимает меньше 2 GB ОЗУ, после загрузки, может работать на 4 GB, ей не нужен антивирус, в ней нет рекламы и телеметрии. Система на SSD работает быстро и обладает высокой скоростью отклика. Ноутбук Lenovo Z510 полностью совместим с Linux mint.
Интернет.
Браухер Firefox
Программы для интернета есть все. Браузер Firefox, менеджер Telegram, торрент клиент qBittorrent. На современном ПК браузер, это главная программа. На Linux она работает.
Офис.
LibreOffice Writer
LibreOffice под Linux функционально идентичен LibreOffice под Windows. А поскольку у меня все документы хранятся в формате ODF. То при переходе на Linux mint, работать с документами, стало так же удобно как и на Windows.
Написание кода на Python.
Pycharm Hello World
Поддержка Python встроена в Linux. Достаточно установить любую IDE (у меня это Pycharm) и можно писать код. Так же используя Python на Linux можно автоматизировать ряд задач.
Обработка фотографий.
Графический редактор GIMP. Сейчас я обрабатываю фотографии в нём.
Raw конвертер RawTherapee нативно работает на Linux. А растровый редактор фото Affinity Photo не имеет нативной версии для Linux. Пришлось выбирать-запускать его через WinBoat, или переходить на GIMP. Который с выходом третьей версии сильно похорошел, выбрал его.
Рисования на графическом планшете Wacom.
Графический редактор Krita. Рисунок выполнен на графическом планшете Wacom.
Сам планшет поддерживается Linux на уровне ядра. И работает сразу после подключения. Можно настроить через графический интерфейс или терминал. Программ для рисования я пробовал много, считаю что лучшая это Krita. Которая нативно запускается на Linux.
Рисование схем в Inkscape
Векторный редактор Inkscape
Inkscape под Linux функционально идентичен Inkscape под Windows. Программа по интерфейсу и функциональности напоминает Corel Draw.
3d моделирование
3D редактор Blender
Считаю лучшей программой для 3d моделирования Blender. Потому что во-первых в нем есть всё (моделирование, скульптинг, анимация и.т.д.), во-вторых он кросс платформенный, в третьих он бесплатный. Уже много лет как пользуюсь им, по моему, это наиболее перспективный 3d редактор. Разработчиков спонсируют гиганты IT индустрии Apple и Nvidia. Epic Games — в 2019 году выделила значительный грант в размере $1,2 млн. Недавно посмотрел мультфильм «Поток» (оригинальное название — Flow, 2024) Гинтса Зилбалодиса, он был полностью сделан в Blender. Я пользуюсь версией 2.8. Версия старая, но не требовательная к ресурсам и обладает широкими функциональными возможностями.
Монтажа коротких видеороликов
Shotcut для монтажа видео
Под Linux нативно работают Kdenlive и Shotcut. Возможностей которых достаточно для большинства пользователей. Я пользуюсь Shotcut. Он удобен и функционален.
Мультимедиа
Видеоплеер VLC. Анимационный фильм Поток. Выполнен в Blender.Для просмотра видео и
прослушивания аудио в Linux есть набор нативных программ.
Простые игры.
Эмулятор PlayStation 2. Игра серии Need for Speed Underground.
Выбор игр под Linux весьма обширен. Под Linux есть нативные игры, далее большая часть Windows игр запускается на Linux через Proton, а ещё на Linux есть эмуляторы игровых приставок. Я пользуюсь PCSX2 — бесплатным эмулятором PlayStation 2. Он позволяет запускать любые игры выпущенные под эту игровую приставку. А их было выпущено более трёх тысяч штук. Так что под Linux есть во что играть.
У меня не вызывает сомнений что ноутбук с уставленной Linux mint, прослужит ещё не один год. Поэтому если у вас есть старый ноутбук или стационарный ПК который не совместим с новыми версиями Windows, то я советую установить на него Linux mint. Только лучше это делать на SSD накопитель. Так он прослужит вам ещё долго. Потому что сейчас у многих есть техника не совместимая с Windows 11. И которая тем более будет не совместима с Windows 12. Но которая отлично совместима с Linux. Который созрел, для повседневного использования в качестве основной операционной системы. Он прост, надежен и безопасен.
Итак, сегодня я изучил новое понятие: стек и конкретнее - стек вызовов. Стек вызовов позволяет программе как бы запоминать которые сейчас выполняются и ждут завершения, в каком месте нужно продолжить выполнение. Функция, попавшая в стек последней - выполняется первой. Например мы вызываем функцию a() которая, в свою очередь, вызывает функцию b(), находящуюся ниже по коду. В этом случае сначала в стек вызова кладётся функция a() и начинает выполняться, но как только программа доходит до вызова функции b() - в стек попадает она и начинает выполняться временно прервав выполнение первой функции, потом программа возвращается к функции a() и продолжает выполняться.
Сегодня не слишком много получилось изучить с утра, но в течении дня, возможно, ещё что - нибудь изучу и выложу сюда.
P.S Я понимаю, что многие люди и так знают эти базовые понятия, я пишу сюда потому что лучший способ разобраться в чём - то это объяснения другому, а говорить с самим собой я пока не хочу.