Завайбкодил загрузчик в несколько облаков сразу
В последнее время я, как, думаю, и многие другие все чаще слышу высказывания о том, что программисты больше не нужны и их вот уже прямо сейчас заменяют нейросети. На мой личный взгляд в этих словах есть доля смысла, но только доля. Но, чтобы не быть голословным, я решил попробовать навайбкодить какой-то проект и выложить его в паблик, чтобы им пользовались другие люди (у меня уже полно разных скриптов и утилит для личных целей, но это немного не то - они решают очень узкие задачи в строго определенном окружении и ни о какой универсальности и переносимости речи не идет).
Но вайбкодить проект ради проекта как-то не интересно - он должен выполнять какую-то полезную работу. Я периодически вижу посты, где люди жалуются на жадность почты и диска от Яндекса, а так же ищут какие-то облачные хранилища (ОХ) для своих данных. И вот я подумал - а зачем выбирать, когда можно совмещать? Собрать все популярные ОХ типа Яндекс.Диск, Google Drive, Dropbox, Amazon S3, добавить к этому WebDAV для универсальности и объединить все это в одно. Собственно, этим моя утилита и занимается - она позволяет подключить сразу несколько облачных хранилищ и заливать на них файлы из одного места. Однако, сначала давайте посмотрим на то, что уже имеется:
- Диск О: пожалуй, самая удобная и полноценная программа для обычных пользователей. Крайне рекомендую обратить на нее внимание - нормальный интерфейс (я в интерфейсы не умею вообще :)), богатый функционал. Позволяет прокинуть ОХ как простые папки в вашем проводнике и работать с облачными файлами как с локальными. Из минусов: она условно-бесплатная (но годовая подписка стоит совсем немного), и она закрытая (а учитывая что разработана компанией VK, для многих это может быть тревожным звонком)
- rclone: прямой конкурент. Делает абсолютно то же самое, что и наша тулза, при этом очень старый проект, развивающийся годами и умеющий работать с огромным количеством ОХ (я даже не знал, что столько существует). Так же она открыта и любой желающий может изучить ее исходники и убедиться, что она никуда не сливает ваши данные (что с данными делают сами облака, мы опустим :)). Из минусов - это консольная утилита. У нее есть WebGUI, но он пока экспериментальный. А это значит, что обычному пользователю с ней работать будет не очень удобно - она больше подходит для того, чтобы встроить ее в какое-то свое приложение.
- Всяческие проф. системы бэкапа и NAS, как платные, так и свободные: это уже "высшая лига" - системы, которые не просто копирую файлики, а умеют делать снимки системы, дампы баз данных, накопительные архивы... Тут правят бал серьезные программные решения от крупных контор, сюда я не лезу.
Изначально мне хотелось сделать инструмент, который бы был удобен для пользования обычным людям без каких-то глубоких технических знаний, который они бы использовали в своих личных целях. В первую очередь я подумал о веб-сервисе, так как моя основная работа связанна именно с этим. Запустить сайт, где пользователи могли бы в личном кабинете подключать свои аккаунты от внешних ОХ, а далее загружать файл один раз через браузер на мой сервер, откуда он уже в фоне без участия пользователя раскидывался бы по всем хранилищам. Это достаточно удобно - пользователь загружает файл один раз (можно прикрутить проверку хэша чтобы убедиться что файл загружен корректно) и на этом все. Но в такой модели есть одно очень уязвимое место - доверие. Не думаю, что люди охотно будут не только лить свои файлы на какой-то малопонятный сайт, да еще давать ему доступ к своим учеткам на других сервисах, где хранятся их данные. Поэтому я все-таки решил остановится на обычной прикладной утилите, которая будет запускаться локально на машине пользователя и связываться по сети только с указанными пользователям сервисами напрямую без каких-то третьих участников. Так же на всякий случай добавил опциональную возможность сверхи котрольных сумм загружаемых файлов для проверки целостности - но тут нужно быть внимательным: не все облака умеют возвращать хэш загруженного файла по API - для некоторых типа WebDAV чтобы проверить корректность загрузки файла, нужно снова его скачать, что для больших файлов сильно затратно и по траффику, и по времени. Так же на форуме rclone заметил запрос на добавление интересной фичи - отслеживание изменения файлов в какой-то папке и автоматическая их заливка в облако при обновлениях - реализовал и это. Ну и, до кучи, это будет OpenSource - если вдруг кто-то захочет детально убедиться в приватности своих данных.
С задачами и функционалом определились, теперь о реализации. Поскольку это эксперимент с вайбкодом - то я сразу заложил главное правило: не смотреть код. Не читать его, не править, не просить ИИ объяснить какие-то его фрагменты... Я тут исполняю роль не разработчика, а продакта - а вот за разработчика как раз будет ИИ. Единственное, что я себе позволил - это обсуждать с ИИ общую архитектуру приложения (что-то вроде "спрячь драйверы к разным ОХ за один общий интерфейс, используй композицию мелких интерфейсов для реализации дополнительных фич, специфичных для конкретного провайдера", "всю логику работы с конкретным провайдером инкапсулируй в его драйвере, ядро должно работать только с публичным интерфейсом и ничего не должно знать о технических деталях конкретного провайдера").
Изначально я думал реализовать такое на Go с GUI на Fyne, и даже реализовал тестовую версию, умеющую только в WebDAV - но когда запустил ее и попытался настроить и подключить свой Яндекс.Диск, то сильно приуныл от абсолютно ужасного интерфейса. Я еще некоторое время пытался заставить ИИ сделать его визуально привлекательным и удобным, но так как сам я в интерфейсы умею не очень (последнее, что помню - это как я возился с Grid Layout на Java SE для своей курсовой лет 20 назад) - то ничего вразумительного у меня не родилось. В итоге было принято решение все-таки перейти на более привычный мне веб, но локальный :) То есть переложить GUI на браузер. А это означало и крупные переделки в архитектуре приложения - оно должно стартовать локальный web-сервер на каком-нибудь свободном порту и работать через него посредством своего REST-API. В таком случае фронтом становится простая HTML-страничка, которую можно вообще хранить отдельно и наклепать кучу разных вариантов на любой вкус. Да ИИ, по моим ощущениям, с HTML-версткой справляется очень хорошо. К тому же при таком подходе появляется еще одна фича - сервер может быть не только локальный. Ее теперь можно закинуть на нормальную VPS и/или встроить в какой-то свой бэкенд (честно говоря сомневаюсь, что кто-то будет это делать, но вариант запуска в докере я все-таки предусмотрел. Правда, утилита хранит креды для доступа к вашим сервисам в системном хранилище ключей, так что придется все-таки доустановить кое-какие крупные пакеты на ваш VPS/Docker-контейнер). В общем, получилась вот такая штука: исходники опубликованы на GitHub, там же в разделе релизов можно сразу скачать готовый бинарник под вашу платформу. Поддерживается Win под amd64, Linux под arm и amd64 а так же современный Mac Os под arm64. Сборку для Mac под intel сознательно решил не делать.
Пока что самостоятельно удалось протестировать Yandex.Disk и WebDAV. Если вдруг найдете какой-то баг или захотите предложить какую-то фичу/идею - буду очень благодарен если сделаете это через issue на GitHub либо личным сообщением, если там нет учетки, так как тут я появляюсь не часто и могу пропустить какие-то комментарии. Так же пишите, какие бы еще ОХ вы хотели видеть в первую очередь - планирую их активно добавлять.
Кому интересно, скачать готовый бинарник можно на страничке релизов, документашка есть на английском и на русском. Расспростроняется под MIT лицензией - бесплатно и открыто: можете делать с кодом что хотите :) Благодарю за внимание, буду рад обратной связи