«Яндекс Диск» синхронизирует ночь напролёт, цена подписки растёт, а данные лежат на серверах, к которым нет ключей. И я решил всё это исправить. Теперь у меня 700 МБ/с, свои данные и ноль рублей в месяц за подписку. Расскажу как.

Всем привет, я Дмитрий Гайворонский, Business Development Manager в команде Deckhouse Data Orchestration компании «Флант». У меня нет инженерного бэкграунда — я чистый вайб-кодер, или даже вайб-DevOps-инженер. Но я очень хорошо понимаю, чего хочу и как это должно выглядеть. Всё остальное — это Cursor, Perplexity и промпт-инжиниринг. Если вы такой же, то эта статья для вас.

А можно что-то взамен «Яндекс Диска»?

Я использовал старенький Mac mini 2014 с внешним HDD-диском как полную реплику «Яндекс Диска» — на всякий случай. Но у Mac mini закончилась поддержка macOS, и он начал заметно тормозить. И что с ним делать? Выкинуть рука не поднималась.

К тому же скорость синхронизации с «Яндексом» была ну очень медленной: полная заливка 2 ТБ растягивалась на ночь. В лучшем случае 10–20 МБ/с.

Разброс 5–29 МБ/с, в среднем около 15 МБ/с. Интернет-тариф 500
Разброс 5–29 МБ/с, в среднем около 15 МБ/с. Интернет-тариф 500

Я начал изучать тему через Perplexity. Выяснил: на Mac mini 2014 стоит Intel Core i5, и на него отлично встаёт Ubuntu 24.04 LTS — поддержка ещё на 5 лет, архитектура x86 в наличии. Установил.

А что поставить на Ubuntu? Гуглил, читал, и ответ был очевидным — Nextcloud. Прямо из пакетного менеджера Ubuntu через Snap:

В процессе установки Ubuntu нужно всего лишь выбрать пакет nextcloud
В процессе установки Ubuntu нужно всего лишь выбрать пакет nextcloud

Nextcloud также можно установить одной командой:

sudo snap install nextcloud
Установленный Nextcloud
Установленный Nextcloud

Я копировал команды из Perplexity, выполнял их в терминале, не особо понимая, что они делают, — только общий смысл. И знаете что? Внутри домашней сети 1 Гбит я сразу получил скорость синхронизации 90 МБ/с — это ограничение самой сети. И это в 4–9 раз быстрее «Яндекс Диска». Из такого старья я выжимал в несколько раз больше, чем мог дать «могучий провайдер».

1 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Запись 80–95 МБ/с
1 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Запись 80–95 МБ/с
1 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Чтение 100–120 МБ/с
1 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Чтение 100–120 МБ/с

Апгрейды: гонка за скоростью

Я задумался, что меня реально ограничивал только старенький диск и тариф интернета, а не скорость публичного сервиса. Пока ещё продлевал подписку «Яндекса», но уже начинал думать о сети 10 Гбит, NVMe и тарифе 1 Гбит. Это свербило и заставляло дальше изучать тему — надо купить новое железо.

Апгрейд 1 — почти бесплатный: переход на 2,5 Гбит

Что купил: коммутатор TP-Link TL-SG105 (5 портов по 2,5 Гбит) + USB-адаптер 2,5 Гбит для Mac mini.

2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Роутер + коммутатор 2,5
2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Роутер + коммутатор 2,5
2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Запись 150–160 МБ/с
2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Запись 150–160 МБ/с
2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Чтение 150–160 МБ/с
2,5 Гбит/с, HDD, скорость записи и чтения через macOS-клиента. Чтение 150–160 МБ/с

Если синхронизируешь файл больше одного раза, то Nextcloud кеширует его и отдает из оперативной памяти. Скорость сразу вырастает до ~220–230 МБ/с, а это уже ближе к ограничению сети.

В итоге скорость выросла в 1,5 раза и упёрлась в ~150–160 МБ/с — теперь ограничением стал HDD-диск. Ничего себе! Надо развивать тему и переходить на SSD SATA 3 (его можно вставить в Mac mini 2014 как второй диск).

После замены диска скорость сразу дошла до 230 МБ/с. Явно видно, что пока только железо определяет производительность, а не софт.

Апгрейд 2 — уровень 10 Гбит: новые роутер, коммутатор и узел

Раз дело в железе, то надо брать железо получше. Долго искал б/у коммутатор на 10 Гбит: новый — дорогой и enterprise, а мне нужен маленький и тихий. Нашёл подходящий на «Авито».

Там же нашёл б/у Mac mini 2018 i7 / 64 ГБ RAM с портом 10GbE — потому что на него ещё можно поставить Ubuntu, много RAM и есть порт на 10 Гбит.

Итоговая конфигурация: Netcraze Ultra (порт 10 Гбит + WiFi 6e) + TP-Link TL-SX105 (5 портов по 10 Гбит) + Mac mini 2018 i7 / 64 ГБ / 10GbE.

Порт 10 Гбит на роутере в квартире — скорее для красоты: жилого тарифа на 10 Гбит всё равно будет, пока все провода в доме не заменят на cat6e. WiFi 6E с агрегацией до 2,4 Гбит вполне достаточно. Но раз порт есть — грех не использовать.

Всё завелось по той же схеме через Ubuntu/Snap. Тестировал на встроенном NVMe и на внешних SSD SATA 3. Результаты:

  • встроенный NVMe → 500–700 МБ/с (чтение и запись больших файлов, например кино);

  • внешний SSD SATA 3 → 300–450 МБ/с;

  • «Яндекс Диск» → 10–30 МБ/с.

Всё упирается только в реальную скорость дисков — ровно как и должно быть.

Сравнение конфигураций — итоговая таблица

Фаза

Узел

Диск

Сеть

Софт

Результат

Комментарий

1

Mac mini Late 2014, i5, 8 GB

HDD LaCie 2 TB

1 Гбит, роутер Keenetic

Ubuntu/Snap + Nextcloud

90–100 МБ/с

Ограничение сети 1 Гбит/с

2

Mac mini Late 2014, i5, 8 GB

HDD LaCie 2 TB

2,5 Гбит (USB- адаптер), роутер Keenetic Giga + коммутатор TP-Link TL-SG105 (5×2,5 Гбит)

Ubuntu/Snap + Nextcloud

150–160 МБ/с (через адаптер USB → 2,5 Гбит)

Ограничение HDD ~150 МБ/с

3

Mac mini Late 2014, i5, 8 GB

SSD SATA III Samsung 4 TB (второй слот)

2,5 Гбит (USB-C адаптер), роутер Keenetic Giga + коммутатор TP-Link TL-SG105 (5×2,5 Гбит)

Ubuntu/Snap + Nextcloud

230 МБ/с (через адаптер USB → 2,5 Гбит)

Ограничение сети 2,5 Гбит/с

4

Mac mini 2018, i7, 64 GB, 10 GbE

NVMe 1 TB + SSD SATA III в корпусе Thunderbolt 3

10 Гбит, роутер Netcraze Ultra + коммутатор TP-Link TL-SX105 (5×10 Гбит)

Ubuntu/Snap + Nextcloud

700 МБ/с (NVMe), 450 МБ/с (SATA III через TB3/10 Гбит), 150–160 МБ/с (Wi-Fi 6E, 2401 Мбит/с по роутеру)

Для SATA III нормально, для NVMe маловато (должно быть ~1000 МБ/с). Требуется тюнинг

Результаты по цифрам: 90 → 150 → 230 → 700 МБ/с. Каждое обновление железа снимало лимит предыдущего звена: сначала сеть, потом диск, снова сеть и, наконец, переход на 10 Гбит + NVMe. Wi-Fi 6E (150–160 МБ/с) — отдельная история, но для беспроводного доступа вполне достойно. Забегая вперёд скажу, что уже на этом шаге достижима скорость 1,2 Гб/с, но об этом будет в другой статье.

Выход в интернет и паранойя про безопасность

Заказал публичный IP-адрес у провайдера, купил публичный домен, настроил A-записи (всё через nic.ru) и научился пробрасывать порты в роутере — всё достаточно легко заработало извне.

Но также это всё открыто торчит в интернет! А у меня нет никакого SOC-центра. Здесь я сам по себе. Стрёмно — я же ничего в этом не понимаю. Сразу определился: моя стратегия защиты в интернете — скрытность.

Mesh VPN: Tailscale, NetBird и неожиданная проблема

Нашёл технологию Mesh VPN, когда узлы сети связываются между собой через VPN-туннели напрямую, минуя открытые порты. Два основных игрока: Tailscale (США, tailscale.com) и NetBird (Германия, netbird.io), которые предоставляют облачный сервис — бесплатно до 5 пользователей и 100 узлов.

Попробовал — обалдеть, работает. Каким-то непостижимым образом узлы связывались между собой даже при закрытых портах на роутере.

Остановился на NetBird: приложение есть в российском App Store, нативные iOS- клиенты для NetBird и Nextcloud работают штатно. Nextcloud на iOS — вполне полноценный Dropbox.

Но вот досада

VPN-туннели режут скорость соединения, потому что шифрование работает в одном потоке на каждом узле — технология однопоточная. Внутри домашней сети скорость упала с 700 МБ/с до ~100 МБ/с. Я уже достиг 700 и обратно на 100? Надо разбираться.

NetBird Self-Hosted + Cursor

Задача: VPN снаружи, прямое соединение внутри

Начал копать: как исключить VPN-туннели внутри локальной сети, но включать их при доступе снаружи?

Нашёл Posture Check в NetBird — политика доступа, которая запрещает туннель при подключении с определённых IP-адресов. Выяснил, что эта фича работает только в тарифе Business, и она недешёвая. Вся моя архитектура к чёрту… :)

Но коллеги из NetBird любезно предоставляют Open Source-исходники для self-hosted-инсталляций. И в self-hosted входит весь функционал: Posture Check и кастомные DNS-зоны. Логика понятна: для реально серьёзных сетей никто не пойдёт в облако в Германию.

Ну что же… Cursor, иди сюда!

Cursor, иди сюда

Забегая вперёд — получилось. Но это было на грани моего понимания архитектуры. HTTPS, gRPC, relay, NAT traversal, signal-серверы… Проблемы с сертификатами на iOS. Несколько дней итераций с Cursor.

Расскажу, как это выглядело на практике, и дам несколько советов на основе своих факапов.

Особенность моих промптов в том, что я не могу оценить реальную работу Cursor. Я могу только ставить ему задачу на английском или русском и разговаривать. Я не могу проверить код или скрипты. То есть оценка даётся только по результатам или косвенно.

Факап № 1: игра в слова

Спросил у Cursor: «Можешь настроить кастомную DNS-зону в NetBird Self-Hosted?» Он ответил: «Да, вот конфиг». Я запустил — не сработало. Спросил: «Почему DNS не резолвится?» А он отвечает: «Я не знаю реального состояния твоего сервера и конфигурации roles.yaml». Выяснилось, что я не задал вопрос, а попросил решить задачу. Cursor исполнил её как мог на основе документации, но не видел реальную инфраструктуру. Когда я переспросил: «Возможно ли это сделать, учитывая мои ограничения?» — он честно разобрал, что именно мне нужно уточнить в конфиге. Помогло.

Получается, есть два почти одинаковых вопроса:

  1. Возможно ли это сделать?

  2. Можно ли это сделать?

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

Совет — с Cursor надо по-военному. Вполне уместно добавить в конце промпта «это вопрос». Не ленитесь переключать режим ask/agent.

Факап № 2: когда контекст становится врагом

Реальный диалог с Cursor:

— Сколько сейчас работает воркеров и какой у них лимит памяти?
— 16 и 256.
— А как ты это проверил?
— В файлах репо указано — вот здесь.
— Нет же! Я спрашивал, сколько сейчас реально в кластере, а не как у тебя написано.
— Извините, тогда 8 и 1024.

Когда уже что-то получается, то объём репозиториев, которые создаёт Cursor, прилично увеличивается. В какой-то момент ты обсуждаешь с ним тему или задаёшь вопрос, он отвечает, но у тебя закрадываются сомнения — что-то не так.

Если бы я поверил Cursor на слово, то принял бы решение на основе недостоверной информации. Потерял бы кучу времени, пытаясь оптимизировать несуществующие узкие места, не понял бы, что реально помогло, а что только навредило, и в итоге всё равно пришлось бы переделывать с нуля. 

В такие моменты понимаешь, что надо всё заново перепроверять, потому что уже не можешь оценить, где Cursor прочитал из истории, а где реально проверил. У моделей контекст единый. Они же не отличают реальность от истории. Чем длиннее переписка, тем сильнее они начинают смешивать старую информацию, которую ты уже забыл, а модели — нет.

Совет — надо периодически удалять все материалы из оперативного доступа Cursor. Закрывать чат с перепиской. Всё обнулять и начинать заново. Так Cursor лучше работает. Очень не хочется делать это и опять ставить задачу, но надо.

Факап № 3: сразу к делу (best practice)

Как-то я просто сказал Cursor: «Настрой NetBird Self-Hosted Management-сервер в Docker». Он выдал конфиг, я запустил, половина не работает — нет сертификатов, gRPC не слушает, Posture Check не активируется. Пришлось всё переделывать. 

Ошибка новичков — сразу просить конечную цель. Так 100%-но не заработает.

Мой метод такой:

  • Этап 1 (режим ask). Обсуждаю с Cursor тему в виде вопросов-ответов, чтобы самому разобраться. Параллельно делаю то же в Perplexity.

  • Этап 2 (изучение). Прошу Cursor изучить документацию по какому-то продукту: «Найди документацию», «Найди и изучи материалы», «Прочитай файлы конфигурации», «Что ты понял?», «Какие у тебя вопросы?».

  • Этап 3 (план). Прошу подготовить пошаговый план по развёртыванию: что нужно будет делать, как это должно работать, всё ли понятно. Периодически промежуточные итоги надо копировать и вставлять в Perplexity с задачей проверить на предмет ошибок и дать рекомендации с учётом определённой цели. Потом результат вставляю обратно в Cursor: «Изучи критику, обнови план». В общем, ИИ vs ИИ.

  • Этап 4 (исполнение). Выполняю по шагам, строго по плану. Команда за командой: «Выполни шаг 1, покажи результат, жди подтверждения». Если результат не совпадает с ожиданиями, не иду дальше — довожу шаг до нужного состояния. Только потом делаю следующий.

Совет — семь раз отмерь, один раз отрежь. Если хорошо продумать и обсудить задачу с Cursor несколько раз, то можно потратить 2–3 часа на подготовку, но потом он выполнит всё за минуты и с первого раза.

Факап № 4: рабочий, а не мастер («насяльника»)

Попросил Cursor «сделать общую папку в Nextcloud для обмена файлами между пользователями». Он создал директорию и сразу выставил права 777. На вопрос «Зачем давать полный доступ всем подряд?» получил ответ: «Вы не указали политику доступа».

Cursor часто напоминает работягу-строителя, которому лишь бы сдать работу:

— Положи плитку в ванной.
— Положил.
— А почему она криво положена?
— Вы же не говорили, как именно она должна быть приклеена.

Cursor выполняет работу так, как удобно ему, а не как требует задача. Он слегка «костыльный» по природе. Если ты недосказал — его оправдание звучит логичным: «Я не нарушал инструкцию, а просто интерпретировал её по-своему».

Совет — добавляйте в каждый промпт уточнение: «Делай всё стандартным способом по документации, если что-то не получается — остановись и спроси меня, без самодеятельности». Даже если повторишь это пять раз, Cursor всё равно когда-нибудь сделает так, как ему захочется, потом напишет: «Извините, я должен был ждать». Здесь нужно внимательно смотреть на экран и быть готовым нажать кнопку «Стоп»!

Факап № 5: абонент временно недоступен

Был у меня с Cursor и такой диалог:

— Проведи тестирование скорости чтения и записи встроенного и внешнего дисков.
— Сделано, скорости такие-то.
— А почему сервер по SSH теперь говорит «server down»?
— Извините, сервер недоступен. У вас есть физический доступ?

Он записал тестовый блок куда-то в загрузочный раздел, Ubuntu перестала подниматься. Я так и не понял, как это произошло. Но смысл ясен: у Cursor был доступ по SSH с правами администратора (я сам это разрешил), и он им воспользовался — выполнил команду, которая убила систему. Кто виноват? Я.

Совет — полностью от этого не защитишься, но можно изолировать убытки. Я скопировал все важные данные на отдельные диски: один вообще отключён (синхронизирую раз в месяц), второй под строгим присмотром. Cursor работает только в той среде, которую я могу потерять целиком без катастрофы. Времени и нервов потребуется много, но данные в безопасности. Команды я изучаю сам, выполняю сам.

Факап № 6: «В здоровом теле — здоровый дух. На самом деле — одно из двух»

Два дня подряд работал с Cursor в режиме 12+ часов. Разбирался с NetBird-архитектурой, HTTPS, signal-серверами, DNS-зонами, iOS-сертификатами, relay-узлами. К концу второго дня в голове была полная каша, я забывал, какие файлы конфигурации уже читал, а какие нет. 

Cursor продолжал говорить как свежий, а я начинал материться и делать ошибки в промптах. День третий: я без перерыва продолжаю, изнутри понимая, что соображаю плохо, но «нужно доделать». В результате допустил критическую ошибку — попросил Cursor «протестировать скорость дисков» и забыл указать папку. Он выполнил, записал тестовые блоки в загрузочный раздел, Ubuntu упала.

Отслеживайте своё состояние. Буквально.

ИИ не устаёт. Он может работать часами без паузы, погружать тебя в кучу материала, требовать быстрых решений. Я даже в университете не учил столько, сколько за время с Cursor. Это колоссальная нагрузка на мозг.

И вот ты уже начинаешь тупить, злиться, материться на Cursor — и сам делаешь ошибки. Промпты становятся неконкретными, размытыми. Всё идёт наперекосяк.

В том кейсе на четвёртый день я просто решил не включать компьютер. Гулял, отдыхал. День пятый: новая сессия, отдохнувший мозг, я формулирую задачи точнее, а Cursor сразу даёт правильное решение.

Совет — нужна дисциплина. Нужны паузы. Нужен режим. Потому что Cursor — это не помощник, это партнёр, который не знает усталости. И если ты не выставишь себе лимиты, он будет крутить тебя в своём темпе до сгорания.

Итоговая архитектура

Развернул свой NetBird Self-Hosted Management-сервер, настроил домен для Nextcloud, соединил все узлы в единую сеть, подключил приложения iOS, macOS. Всё удобно и работает. Как было раньше с Dropbox, только теперь всё «своё».

Единственный сервис, который торчит в интернет, — это NetBird Management для установки первоначального соединения. Дальше всё идёт через туннели.

С какой-то специфической проблемой iOS я так и не разобрался до конца. Что-то было с сертификатами — помогло отключение Posture Check и добавление DNS-записей.

  • Доступ внутри сети: по домену трафик сразу попадает на локальный IP-адрес через кастомную DNS-зону — туннель не строится, скорость максимальная.

  • Доступ снаружи: NetBird-клиент строит зашифрованный туннель — закрытый порт, никому не виден.

  • NetBird выключен — сервис вообще не существует для внешнего мира.

Зацените, какие слова я стал знать и использовать, хотя до старта этого мероприятия пользовался «Яндекс Диском» и горя не знал…

Итог: «Яндекс Диск», спасибо за всё

Nextcloud работает стабильно уже полгода:

  • Теперь доступ есть и у жены — уже два пользователя.

  • Фото и видео с телефонов автоматически пишутся домой.

  • Скачанное кино смотрю из любой точки мира через Nextcloud-клиент.

  • Рабочие файлы синхронизируются моментально.

Я поверил в себя и отключил подписку «Яндекс 360». Всё, свободное плавание. На всякий случай периодически просто копирую всё на отдельный диск. Cursor — мой личный DevOps на подхвате.

Главный инсайт — ваш опыт и ваши идеи плюс ИИ могут изменить вашу карьеру и доход. Я увидел в этом не решение задачи, а новый подход в ИТ вообще. Теперь я понимаю, как начинаются миллионные стартапы: три архитектора и рой агентов.

Продолжение следует

Я остановился на 700 МБ/с и Docker — но на этом история не закончилась. Дальше я переехал на Kubernetes, подключил Managed Postgres и ValKey от Deckhouse, перенёс туда же NetBird. А когда разобрался, как Nextcloud распараллеливает синхронизацию по потокам, дожал до 1,25 ГБ/с.

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

P. S.

Читайте также в нашем блоге: