Вторая жизнь старого смартфона в качестве домашнего сервера

от автора

С появлением нейросетей реализовывать идеи в разработке стало гораздо проще. Идеи практически любого масштаба, надо сказать. Хочу рассказать о довольно крупномасштабной.

Дисклеймер: этот пост — про вайб-кодинг, поэтому в нём не будет приведено ни единой строки кода. Я просто показываю идею, не детали реализации.

История у идеи довольно долгая, и началось всё с… психотерапии. Да, вот так неожиданно: в рамках починки ментального состояния понадобилось мне вести дневник эмоций. После пары дней записывания в блокнот было решено, что не положено мне, разработчику всего и вся, не попытаться перенести это в цифровой вид — а поскольку формат существующих сервисов меня не устроил, я закатал рукава и вспомнил всё, что знаю о Kotlin.

Первая версия честно писалась вручную, без всякого использования нейросетей, да и могли они тогда существенно меньше. Выглядела она непритязательно, выполняла базовый минимум функций и хранила все данные в локальных файлах на устройстве, поскольку и денег, и сил на отдельный бэкенд было жаль; и около двух лет это решение работало и устраивало, пока не начало катастрофически тормозить из-за обилия ежедневных записей.

Назрела явная необходимость всё же выделить работу с данными в отдельный бэкенд. Знаний в мобильной разработке с тех пор не прибавилось, а вот нейросети сильно выросли в возможностях, появились и возмужали агентные среды разработки, и вот в один прекрасный вечер (на самом деле, несколько вечеров, конечно) была собрана новая версия — с наконец-то более-менее приятным дизайном (на который ушло больше всего токенов), а также с бэкендом. Поскольку ведение дневника происходит по вечерам, а я не большой любитель ночевать вне дома, сервер был поднят локально на рабочем ноутбуке, выпущен смотреть в локальную сеть, и стало совсем красиво.

Вот примерно так красиво.

Вот примерно так красиво.

Однако, на волне успеха с вайбкодингом руки чесались сделать что-то ещё этакое. Да и сервер на ноутбуке несколько ограничивал — всё же рабочий ПК это не сервер.

Спустя несколько минут вздохов о том, что вот бы было у меня железо, на котором можно домашний сервер поднять, и не забивать им рабочий компьютер, я внезапно осознал, что железо-то есть! Не совсем форматное, но есть. И железом оказался старый телефон с разбитым экраном. Несмотря на солидный возраст, он всё же был флагманом в свои бородатые года, и аппаратная начинка там до сих пор вполне способна крутить даже довольно сложные и нагруженные штуки. А разбитый экран — экран серверу, собственно, ни к чему.

В роли сервера выступает Xperia XZ1.

В роли сервера выступает Xperia XZ1.

Таким образом, изначальная конфигурация плана «воскрешение» сложилась. Решил даже вложиться: прикупил USB-хаб для подключения в локальную сеть по Ethernet — выбор остановился на TP-Link UH6120C. Добрался рутировать аппарат, поставил самый свежий ROM (умельцы не забросили разработку и доступен даже Android 14) и настроил контроль перезаряда — взрывов из-за вздувшейся батареи нам не нужно, и прожить без замены батареи хотелось бы подольше. Подключил хаб, пересобрал ядро с драйверами под его чип, и телефон встроился в локалку как влитой.

Для красоты телефон был повешен на стену (магнитный держатель для авто).

Для красоты телефон был повешен на стену (магнитный держатель для авто).

Но останавливаться на достигнутом было уже поздно — глаза у меня загорелись. Теперь в наличии есть устройство с процессором, оперативной памятью, микрофоном и динамиком, постоянно находящееся во включённом состоянии на одном и том же месте в доме; что это напоминает?

Правильно, умная колонка. С бюджетом в 3.5 тысячи на хаб, без которого в теории несложно было обойтись, и несколько вечеров времени на вайбкодинг собственно ИИ-ассистента и всего сопутствующего.

Структура вышла такая: центральный HTTP-сервер на Go, который обеспечивает интерфейс между всеми проектами, Android-приложение ассистента, Vosk для распознавания речи и SileroTTS для её синтеза. С последним пришлось повозиться, поскольку официально Android не поддерживается, но вместе с нейросетью и это было побеждено. Задержки ввода-вывода минимальные, измеряются миллисекундами, на сервер к API LLM ходит дольше.

Внешний вид ассистента. Фон сгенерирован с учётом повреждений экрана.

Внешний вид ассистента. Фон сгенерирован с учётом повреждений экрана.

Ну и, конечно, изначальный проект, с которого всё начиналось — сервер локальной апишки для «домашних» приложений, количество коих тоже разрослось пропорционально свободному времени.

Централизованный хаб апишек уже на повседневном телефоне — всё общается с сервером через один канал.

Централизованный хаб апишек уже на повседневном телефоне — всё общается с сервером через один канал.

Следующим этапом намереваюсь поднять там же OpenClaw либо самописный аналог и, вероятно, какой-то RAG для дома.

Мораль истории заключается в следующем: вайбкодинг — это не плохо. Даже каноничный вариант сгенерировал-запустил-получил ошибку-вставил ошибку в агента-перезапустил генерацию, от которого все плюются: небезопасно! Плохая архитектура! Невозможно поддерживать!

Да, да и да. И поэтому в продакшен я ничего из-под пера ИИ не потащу без пристального ревью никогда. Но есть сферы, где всё это не имеет значения, и сервисы для личного пользования — отличный пример. Этот код никогда не будет читать никто, кроме меня, у этих сервисов никогда не будет больше одного пользователя, и ничего из этого не будет доступно извне из интернета. И всем требованиям, которые предъявляются к этому коду, вполне соответствует тот, без сомнения, ужас, что мне понагенерировала нейросеть. Всему своё место, и на мой взгляд, место вайбкодинга — в подобных проектах.

Изначально запись была опубликована мной же в личном блоге — там не очень активно, но возможно, ещё будут апдейты по проекту.

ссылка на оригинал статьи https://habr.com/ru/articles/1027584/