Собирать приложение под iPhone очень просто, если вы можете использовать внешние сервисы сборки (какой-нибудь Codemagick), или у вас есть Mac/Macbook.

А что если нет?

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

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

  1. Аренда в Selectel
  2. Аренда в Unihost
  3. Свой железный сервер

Аренда mac mini в Selectel

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

Минусы: Цена

Аренда в unihost

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

Минусы: Цена

Свой железный сервер

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

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

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

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

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

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

В Селектеле - 11 200 руб. за M1 (запоминаем цифру).

Мы бы хотели все-таки M4 - разница в скорости сборки - 2 раза. Плюс это новая ревизия железа, посвежее, аналитику с трех поколений собрали.

M4 Pro есть в Селектеле - но это прям оверхед по мощности, и ценник совершенно негуманный - 21 000 руб.

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

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 800

6 200 * 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 (https://www.nomachine.com/ru) для удаленного доступа:

  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.

1
3 комментария