Поддержка работы на Apple M1

Привет! Я использую M1 для разработки автоматизации и инструментов запуска Discourse. Скрипт discourse-setup имеет проблему с определением процессоров на архитектуре ARM и завершается с ошибкой:

./discourse-setup: строка 261: *0: синтаксическая ошибка: ожидаемый операнд (ошибочный токен "*0")

Из-за этого контейнер не запускается. В моём случае используется подход с двумя контейнерами (веб + данные), поэтому не запускается именно web_container.

Это происходит потому, что скрипт поддерживает только вывод /proc/cpuinfo для процессоров Intel, тогда как для ARM-процессоров он отличается. Пример можно увидеть в задаче /proc/cpuinfo внутри контейнеров выдаёт бессмысленные данные на Apple M1 Max · Issue #6111 · docker/for-mac · GitHub.

Представленный ниже Pull Request пытается решить эту проблему, используя команду lscpu.
FEATURE: Обновлён расчёт avail_cores для поддержки процессоров Apple M1 или ARM от cheungtitus · Pull Request #631 · discourse/discourse_docker (github.com)

Полный вывод

./discourse-setup --two-container
Файл конфигурации containers/web_only.yml уже существует!

. . . переконфигурация . . .


Сохранение старого файла как web_only.yml.2022-06-12-062509.bak
Остановка существующего контейнера через 5 секунд или нажмите Control-C для отмены.
ПРЕДУПРЕЖДЕНИЕ: Поддержка aarch64 в настоящее время экспериментальная. Пожалуйста, сообщайте о любых проблемах по адресу https://meta.discourse.org/tag/arm 
Нажмите любую клавишу, чтобы продолжить
ПРЕДУПРЕЖДЕНИЕ: Мы собираемся начать загрузку базового образа Discourse
Этот процесс может занять от нескольких минут до часа в зависимости от скорости вашей сети

Пожалуйста, будьте терпеливы

aarch64: получение из discourse/base
Сводка: sha256:a2ce381fdc4fed59fe160fb01b79bce0d5266f59ad907a22f3399772c8711791
Статус: Образ discourse/base:aarch64 уже актуален
docker.io/discourse/base:aarch64
ПРЕДУПРЕЖДЕНИЕ: Файл containers/web_only.yml доступен для чтения всеми. Вы можете защитить его, выполнив команду: chmod o-rwx containers/web_only.yml
web_only не был запущен!
./discourse-doctor может помочь диагностировать проблему.

./discourse-setup: строка 261: *0: синтаксическая ошибка: ожидаемый операнд (ошибочный токен "*0")

Введите доменное имя для вашего Discourse? [discourse.example.com]: 
2 лайка

Наша производственная среда работает только на Linux. Однако есть поддержка запуска среды разработки на M1.

1 лайк

Привет, да, я тоже работаю на Linux, а не на macOS. Я использую полный образ RHEL 9, а не UBI, через UTM на M1. Таким образом, проблема действительно связана с Linux. После публикации этого PR и обсуждения я наткнулся на несколько тем, где упоминалось, что команда разработчиков использует M1, но, не углубляясь в детали, я подозреваю, что это связано с тем, что команда разработчиков использует другой способ инициализации?

1 лайк

Стоит ли тратить время на работу над производственной средой для M1, когда ещё нет готового к производству оборудования M1? Звучит как нецелесообразная трата времени.

Вы рассматривали вариант установки для разработки?

Кажется, здесь возникло недопонимание. Я не пытаюсь разрабатывать сам Discourse и также не планирую запускать Discourse в продакшене на M1. Мои задачи следующие:

  • Написание кода автоматизации для управления моей инфраструктурой
    • Это включает установку и периодическое обновление Discourse.
    • Работа будет выполняться на моем ноутбуке M1 с использованием образа RHEL9, запущенного через UTM.
    • Это подразумевает наличие кода автоматизации для установки и начальной настройки Discourse внутри виртуальной машины RHEL9.
  • Запуск Discourse на серверах с архитектурой Intel
    • Код автоматизации будет развернут на сервере под управлением RHEL для сред UAT и продакшена.

Таким образом, если я не ошибаюсь, никаких дополнительных изменений не требуется, поскольку я не пытаюсь запускать это на macOS. Если же необходимы какие-то дополнительные изменения помимо тех, что уже есть в PR, то, полагаю, мне придется найти подходящий сервер для выполнения этой работы. Но так ли это на самом деле? С другой стороны, есть ли какие-либо проблемы с представленным PR, которые могут помешать его слиянию, учитывая, что работа уже выполнена?

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

Отсюда мой вопрос: имеет ли смысл добавлять эту поддержку, когда сценарий установки в производственной среде на M1 невозможен?

Разве не логичнее разрабатывать это в среде, где ваше оборудование более точно отражает финальный сценарий установки?

Должно быть, здесь какое-то недопонимание. В исходном посте я написал: «Я использую M1 для разработки автоматизации и инструментов, чтобы запустить Discourse». Это для разработки автоматизации, а не для запуска самого Discourse. Да, было бы здорово запускать его на репрезентативном оборудовании, но речь идёт именно о разработке инструментов для установки и запуска Discourse и ничего более. Иногда я в пути и хочу иметь возможность делать это только с помощью моего ноутбука на M1, без привязки к машинам, находящимся в каком-то дата-центре, где мне пришлось бы настраивать VPN-подключение.

Я понимаю, что вы пытаетесь сделать. Всё, что я хочу сказать, это то, что установка в производственной среде не работает на M1, потому что M1 не может использоваться в продакшене.

Это не совсем верно. Например, Raspberry Pi использует SoC на базе ARM, и установка Discourse проходит без проблем, согласно:

Хорошо, похоже, я ошибся, сказав, что это процессор на базе ARM, поскольку проблема возникает только на M1?

В любом случае, вот что я сделал…

  1. Создал новую ветку
    discourse-setup успешно выполнился с изменениями из PR, но затем запустился launcher, который проверил, есть ли у меня актуальный код в master. Поэтому я создал новую ветку и поместил изменения туда. Также я добавил запись в /etc/hosts, чтобы при проверке домена система считала, что я работаю на указанном домене, и тест прошел успешно.
  2. Запустил discourse-setup снова
    На этот раз всё прошло успешно, включая запуск launcher для сборки и создание контейнера.

Ниже показано, что я увидел в конце вывода. Я попытался перейти по адресу http://127.0.0.1, но увидел только страницу по умолчанию от nginx. Вероятно, на M1 это всё-таки не работает из-за каких-то других проблем. Протестирую на настоящей системе на базе Intel. Хотя для проверки того, что процесс работает и что-то слушает порты 80/443, это достаточно, но было бы здорово иметь возможность реально обслуживать страницу.

I, [2022-06-14T15:29:42.810750 #1]  INFO -- : Замена (?-mix:#?ACCOUNT_EMAIL=.+) на ACCOUNT_EMAIL=$$ENV_LETSENCRYPT_ACCOUNT_EMAIL
 в /shared/letsencrypt/account.conf
I, [2022-06-14T15:29:42.811886 #1]  INFO -- : Замена (?-mix:ssl_certificate_key.+) на ssl_certificate_key /shared/ssl/$$ENV_DISCOURSE_HOSTNAME.key;
ssl_certificate_key /shared/ssl/$$ENV_DISCOURSE_HOSTNAME_ecc.key;
 в /etc/nginx/conf.d/discourse.conf
I, [2022-06-14T15:29:42.812148 #1]  INFO -- : Замена (?-mix:add_header.+) на add_header Strict-Transport-Security 'max-age=63072000'; в /etc/nginx/conf.d/discourse.conf
I, [2022-06-14T15:29:42.812430 #1]  INFO -- : Замена location @discourse { на location @discourse {
add_header Strict-Transport-Security 'max-age=31536000'; # запомнить сертификат на год и автоматически подключаться к HTTPS для этого домена в /etc/nginx/conf.d/discourse.conf
I, [2022-06-14T15:29:42.813521 #1]  INFO -- : > echo "Начало пользовательских команд"
I, [2022-06-14T15:29:42.814803 #1]  INFO -- : Начало пользовательских команд

I, [2022-06-14T15:29:42.814856 #1]  INFO -- : > echo "Конец пользовательских команд"
I, [2022-06-14T15:29:42.816137 #1]  INFO -- : Конец пользовательских команд

I, [2022-06-14T15:29:42.818177 #1]  INFO -- : Завершение асинхронных процессов
I, [2022-06-14T15:29:42.819361 #1]  INFO -- : Отправка INT для HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 57
2022-06-14 15:29:42.819 UTC [57] LOG:  получен запрос быстрого завершения работы
I, [2022-06-14T15:29:42.820068 #1]  INFO -- : Отправка TERM для exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 118
118:signal-handler (1655220582) Получен SIGTERM, планирование завершения работы...
2022-06-14 15:29:42.829 UTC [57] LOG:  прерывание всех активных транзакций
2022-06-14 15:29:42.832 UTC [57] LOG:  фоновый рабочий "logical replication launcher" (PID 66) завершился с кодом выхода 1
2022-06-14 15:29:42.835 UTC [61] LOG:  завершение работы
118:M 14 Jun 2022 15:29:42.866 # Пользователь запросил завершение работы...
118:M 14 Jun 2022 15:29:42.867 * Сохранение финального снимка RDB перед выходом.
118:M 14 Jun 2022 15:29:42.876 * База данных сохранена на диск
118:M 14 Jun 2022 15:29:42.876 # Redis готов к выходу, пока...
2022-06-14 15:29:42.958 UTC [57] LOG:  система баз данных завершена
sha256:5f552461c03594fde4b917c0e995c5f63a777b44ee1638e0367c22a29fe1ec16
ef60feb320f8684423dcb5c3ca6062226d937cd72a642485052fa641f15cbc01

+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_FORCE_HTTPS=true -e LC_ALL=en_US.UTF-8 -e LANGUAGE=en_US.UTF-8 -e EMBER_CLI_PROD_ASSETS=1 -e DISCOURSE_HOSTNAME=dev.bogus.com -e DISCOURSE_DEVELOPER_EMAILS=support@bogus.com -e DISCOURSE_SMTP_ADDRESS=smtp-relay.gmail.com -e DISCOURSE_SMTP_PORT=587 -e DISCOURSE_SMTP_USER_NAME=support@bogus.com -e DISCOURSE_SMTP_PASSWORD=stupidpassword -e DISCOURSE_SMTP_DOMAIN=dev.bogus.com -e DISCOURSE_NOTIFICATION_EMAIL=noreply@dev.bogus.com -e LETSENCRYPT_ACCOUNT_EMAIL=me@example.com -h bogusdev-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:f1:a1:42:8a:5f local_discourse/app /sbin/boot
0be6584a62912bae1d517882fde2a5bf61d1c39466448803be811fbd777c87a5
[root@bogusdev discourse]# 
[root@bogusdev discourse]# docker ps
CONTAINER ID   IMAGE                 COMMAND        CREATED          STATUS          PORTS                                                                      NAMES
0be6584a6291   local_discourse/app   "/sbin/boot"   35 секунд назад  Up 34 секунды   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app
[root@bogusdev discourse]#