Собирать приложение под iPhone очень просто, если вы можете использовать внешние сервисы сборки (какой-нибудь Codemagick), или у вас есть Mac/Macbook. А что если нет? В одном из проектов возникла необходимость автоматизировать сборку приложение на Flutter для iOS, в результате чего мы приняли решение купить и поставить дома у нашего DevOps Mac Mini m4. А что повлияло на выбор - читайте дальше.

Первоначально рассматривались три варианта:

  1. Аренда mac mini в Selectel.

    Плюсы: Это физическая тачка в цоде - с толстым каналом, с инженерами которые ее обслуживают.

    Минусы: Цена.

  2. Аренда в Unihost

    Плюсы: Такие же как у Селектела

    Минусы: Цена.

  3. Купить себе тачку и сделать так, чтобы она была хотя бы немного отказоустойчива.

    Плюсы: Цена, доступность, скорость реакции

    Минусы: Отказоустойчивость. 

Selectel
Selectel
Unihost
Unihost

Собственно, вопрос стоял исключительно в цене. По какой-то причине аренда Mac Mini - это очень дорого. 

Финансовая эффективность

Самый дешевый вариант на M1 — 82Э (запоминаем цифру) и еще какие‑то непонятные 47Э на Unihost. Мы решили, что это дорого, и плюс еще пол‑дорого за что‑то:

В Селектеле — 11 200 за м1 (запоминаем цифру). Мы бы хотели все‑таки м4 — разница в скорости сборки — 2 раза, плюс опять же это новая ревизия железа, посвежее, аналитику с трех поколений собрали. M4 Pro есть в Селектеле — но это прям оверхед по мощности, и ценник совершенно негуманный — 21 тысяча.

В общем, с командой обсудили, решили поискать на Озоне, и сформировали вот такой вот заказ:

74 862  (запоминаем цифру) наших, деревянных Р, а не каких-то Э с плюсами. 

Смотрим спеки для этого Mac Mini:

Получаем энергопотребление полутора лампочек накаливания в пике. Девопс такие расходы переживет. 

Теперь подробнее, что есть что:

  • Mac Mini — это понятно;

  • ИБП Энергия. Это штука, которая обеспечивает моментальное переключение между источниками питания, и повышает напряжение с внешней АКБ до 220 В (как автомобильный инвертор). В пике — 500W, этого более чем достаточно для наших скромных 155W.

  • Аккумулятор для ИБП Энергия AGM 100Ah 12V. Решили не рисковать и взяли тот же бренд что и ИБП

Забегая вперед - мы протестировали работу мака на АКБ, и у нас отлично получилось продержать более 4 часов, потом тест остановили - нам достаточно такой автономности.

Допустим, Мак проработает 1 год после чего выйдет из строя — мы получим стоимость в 6 238,5/месяц.

Также добавим сюда 1 000 рублей на оплату интернета ежемесячно, и электричество — допустим, при максимальном расходе мака — 155W, в месяц выйдет максимум 115 кВт — 1000 рублей

получится 8200/месяц за выделенную свежую тачку, с быстрым интернетом и без каких либо ограничений, и физическим доступом. Можете поставить в офис, можете домой, если ваша компания вообще не имеет офиса. У нас тоже офиса нет, и ничего — делаем крутые штуки крутым чувакам. 

Понятное дело, что мак проработает гораздо дольше чем 1 год, а нагрузки будут значительно меньше — 1–2 сборки в день, поэтому реальная цифра будет гораздо ниже, предположительно, на 2–3 тысячи рублей. В масштабе двух лет использования, дельта с самым дешевым арендным решением составляет:

11 200 * 12 * 2 = 268 8006200 * 12 * 2 = 148 800

Дельта: 120 000, или экономия 60 000 в год. Пожалуй, мы лучше потратим эти деньги на команду - дни рождения есть у всех.

Резюме: Хостим сами — экономим 60 тысяч в год.

Первичная настройка

Собственно, при первом включении Mac радостно протащил меня по этапам установки. Ничего особо интересного нет. В наших условиях запрещено включать шифрование, потому что иначе наш мак не сможет автоматически запускать весь софт при сбоях (и перезапуске). Основная моя претензия к MacOS на самом деле в том, что он не Linux:)

Mac не умеет работать в Headless‑режиме. Насколько мне известно, некоторые обходят это каким‑то образом через виртуальные дисплеи. Некоторые используют hdmi‑затычки, эмулирующие дисплеи. Мы пошли своим путем и заюзали плату видеозахвата. А смотрели мы ее через приложение «Камера» в windows 11. Очень удобно, однако иногда двигаешь не тот курсор:). Так как плата видеозахвата у нас была — мы приняли решение оставить как есть. Пусть она изображает монитор для Mac. Оставляем всю эту кашу валяться на серваке. Мак, кстати, подключен по WiFi.

После того, как подключен этот “монитор” - нет никаких проблем с автоматическим входом и автозапуском приложений.

Вот как все выглядит

Позднее туда добавится самосрабатывающий огнетушитель, что-то типа такого:

Рекавери

При первой конфигурации я совершил ошибку, зашифровав диск, и потеряв возможность автоматического входа для запуска приложений в MacOS. Я начал исполнять откат к заводским настройкам, но что‑то пошло не так и Mac радостно поморгал мне SOS морзянкой светодиодом красного цвета.

Некоторое время я всячески пытался перевести его в режим восстановления, но это не удалось. Примерно 2 часа я потратил на сборку приложения IDeviceRestore под Win, чтобы выяснить, что оно не работает с Mac, а пригодно только для iPhone. Что ж, теперь я могу кирпичить свой айфон без каких‑либо проблем!

Тратим некоторое время на поиск знакомых с свежими буками Apple, и выезжаем на восстановление.

Девайс восстановлен и работает. Хотя бы тут без проблем.

Что с софтом

Мы планировали использовать эту тачку как сборочную, но я решил несколько расширить ее функции:

      0.  Установил NoMachine для удаленного доступа:

  1. Установил OrbStack -> https://orbstack.dev/. Docker Desktop для Macos нас не устраивает. OrbStack работает намного быстрее, чем Docker Desktop с Hyperkit vm, оставляя полную совместимость. Сборки тоже работают корректно.

  2. Установил Xcode -> Для сборки приложения;

  3. Установил и зарегистрировал Gitlab-runner для исполнения задач с Gitlab

  4. Наконец-то нашел время и развернул Apache Guacamole, а также перенес туда часть ресурсов.

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

Просто по фану развернул сервер Minecraft, на котором периодически ставлю кубики и шестеренки.

А как по-вашему развлекаются инженеры?)
А как по-вашему развлекаются инженеры?)

Что с сетью

В планах продублировать сетевое подключение с помощью 4G-модема и направленной антенны. Тарифы для юридических лиц позволяют использовать статический адрес, а следовательно доступ снаружи мы не потеряем. После установки я набросаю скрипт, который будет переключать ip-адрес в yandex cloud dns. 

Что с бэкапами

Архивируем volumes пару раз в день просто их закидываем в s3 в cold storage. Через неделю стираем.

Что с сборкой

В следующей статье мы раскроем как автоматизируется сборка flutter-приложения с использованием MacOS и gitlab-ci.

Теперь, когда наш нано-ЦОД исправно работает, самое время заставить его приносить реальную пользу. В следующем посте покажу, как эта скромная коробка превращается в мощную сборочную фабрику, которая автоматически упаковывает Flutter-приложения и отправляет их прямиком в AppStore. Оставайтесь на связи с vin.team!

Комментарии (1)


  1. vadimr
    06.11.2025 07:40

    По моему опыту, нормальный срок службы для Mac – 8 лет. С другой стороны, оперативная память 16 гигабайт – ни о чём. Так что я бы ориентировался на другие показатели начальной стоимости и амортизации, но результат получится примерно такой же.