Я неоднократно высказывал своё восхищение OS X Server. Под Linux сервисы ставятся мучительно, зато потом работают как часы. А под OS X ставятся одной кнопкой, но потом перестают работать при любом чихе, и получаешь изысканное удовольствие, разбираясь, почему эта балалайка умерла. Так и держишь себя регулярно в форме. За что низкий поклон Apple.

Начну с идеи. К выходу Mountain Lion я уже подзабыл, как увлекательно развлекаться с поднятием внезапно упавших сервисов на OS X Server, и снова решил дать шанс OS X ML Server.

Сначала перенёс обратно с Ubuntu/Linode почту. На Ubuntu меня всё устраивало. Postfix + Dovecot + MySQL + Amavisd/SpamAssasin + Greylisting работали без вопросов полгода. Не хватало иллюзорного - PUSH-уведомлений (если быть откровенным, то мне хватает и проверки почты раз в несколько часов, но зуд не остановить, тем более, что денег это не стоит). Запустил почтовую систему за пару нажатий кнопок в GUI, покрутил записи в DNS (MX/SPF). Заработало. Работает второй месяц нормально.

В августе Сергей Макаренко решил перейти с Google Talk на собственный jabber-сервер. Пообщался с ним на эту тему и решил - а почему бы и нет.

Сказано - сделано. Нажал на кнопку активации Messages в Server.app и оно заработало. Вроде бы даже предложило открыть порты на Time Capsule, через который я включаюсь в Интернет. Проверил - действительно работает. Хотите деталей - смотрите у грандов Setting Up The Messages Service In Mountain Lion Server, размусоливать эту тему со скриншотами и описанием, в какой руке держать мышь, мне уже давно лень.

Но! Мой сервер зовётся ceiling-cat.ctrld.me (привет любителям “I can has cheezburger?”). А длинный JID вида username@ceiling-cat.ctrld.me мне не нравится. Хочу username@ctrld.me. Где такое найти в изумительно удобном GUI Server.app с единственной кнопкой? Правильно, нигде.

Консоль. Привычный запуск команды serveradmin… Непривычный ответ “команда неизвестна”. Почему? Ибо нехрен (хотел привести ссылку на Луркморье, но гык должен быть вежливым). А! Само собой! В .zshrc/.bash_profile вписываю алиас:

alias serveradmin='sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/serveradmin'

Продолжаю:

$ serveradmin settings jabber

Вижу многообещающие переменные jabber:hostsCommaDelimitedString и jabber:hosts. Ищу на discussions.apple.com эти строки и нахожу обсуждения один и два.

Запускаю команды (помните alias с sudo?):

$ serveradmin settings jabber jabber:hosts:_array_index:0 = "ceiling-cat.ctrld.me"
$ serveradmin settings jabber jabber:hosts:_array_index:1 = "ctrld.me"
$ serveradmin settings jabber jabber:hostsCommaDelimitedString = "ceiling-cat.ctrld.me,ctrld.me"
$ serveradmin stop jabber
$ serveradmin start jabber

Конфигурация такая:

$ serveradmin settings jabber
jabber:hostsCommaDelimitedString = "ceiling-cat.ctrld.me,ctrld.me"
jabber:hosts:_array_index:0 = "ceiling-cat.ctrld.me"
jabber:hosts:_array_index:1 = "ctrld.me"

Вручную настраиваю учётную запись в Messages.app - всё локально работает. Извне, естественно, нет, потому как ctrld.me указывает на другой сервер, а там нет jabber.

Что делать? Как сказать всем в Интернет, что jabber-сервер для домена N находится на сервере M? Правильно, SRV-записи в DNS. Хардкорный бы гык полез в RFC, мне же хватило Wiki на XMPP:

_xmpp-client._tcp.ctrld.me. 86400 IN SRV 0 0 5222 ceiling-cat.ctrld.me.
_xmpp-server._tcp.ctrld.me. 86400 IN SRV 5 0 5269 ceiling-cat.ctrld.me.
_jabber._tcp.ctrld.me.      86400 IN SRV 5 0 5269 ceiling-cat.ctrld.me.

А вот теперь заработало действительно всё, и локально, и из Интернет.

Теперь о полезностях. Куда пишутся логи - понятно:

$ serveradmin settings jabber
jabber:savedChatsLocation = "/Library/Server/Messages/Data/message_archives"

И где архив сообщений - тоже:

$ serveradmin fullstatus jabber
jabber:logPaths:JABBER_LOG = "/var/log/system.log"

Минусы:

  • привык к клиенту на iOS Verbs IM, а он не поддерживает произвольные jabber-сервера, только Google Talk. BeejiveIM with Push и IM+ Pro (у каждой есть вариации) - обе программы страшны, как Windows 3.1. Удобоваримого клиента не нашёл, и, следуя принципу роста энтропии/уменьшения белого шума/минимализма решил, что на телефоне IM мне и даром не нужен. Кому нужно, тот напишет email или позвонит.
  • сюрпризы при доставке сообщений при нескольких активных соединениях. Если у меня активны IM-клиенты на десктопе, ноутбуке и телефоне, то я не могу уверенно сказать, куда доставится сообщение. Всё зависит от важности. Нотификации об алармах приходят на ту систему, за которой я в данный момент работаю. Трёп - аналогично. А важные сообщения идут туда, где их труднее всего увидеть. Мда. Решение? Включил архивирование всех сообщений и в отдельной консоли держу запущенной команду

      $ sudo tail -f  /Library/Server/Messages/Data/message_archives/jabberd_user_messages.log | grep ctrld@ctrld.me
    

Всё было бы здорово и весело, если бы не обновление OS X до 10.8.2 и Server.app до 2.1.1. Это было усугублено тем, что мой сервер включён в три сети VLAN’ами. После апдейта Server.app решил, что будет здорово в Port Mapping на Time Capsule прописать вместо основного адреса сервера один из дополнительных, абсолютно недоступный с этой TimeCapsule. Прописал выборочно, дабы сделать мою жизнь увлекательнее - только для двух правил из трёх.

В итоге перестали работать почта и Messages. И остался бы работать Profile Manager, если бы я его давно не выключил. Это ещё одно подтверждение того, что Apple заботится о пользователях, потому как им приходится поддерживать в тонусе мозги и руки, восстанавливая критичные сервисы.

Я понял, что почта недоступна из-за Port Mapping не сразу, минут через 20 после начала поисков. Ладно. Обнаружил, удалил правило (отредактировать невозможно, так как правится только последний октет во внутреннем адресе - ещё раз поклон), создал правило, записал. Почта заработала.

Messages так просто починить не удалось. Он стал доступен извне, но при попытке подключения всё время запрашивался пароль, и не проходила аутентификация. В логах выдавались ошибки:

imagent[...]: [Warning] XMPPConnection: Error: Error Domain=XMPPErrorDomain Code=104 "The operation couldn’t be completed. (XMPPErrorDomain error 104.)" UserInfo=... {XMPPErrorText=session manager for requested domain is not available}

Поиски по discussions.apple.com ничего не дали. По Google - тоже. Попытки поднять конфигурацию из бекапа Time Machine не помогли, многоточие вставлено цензурой… Меланхолично вспомнил о команде ServerBackup, до которой я никак не доберусь. Конечно же, она находится немного в другом месте - /Applications/Server.app/Contents/ServerRoot/usr/sbin/ServerBackup.

Час копания в логах, изменения прав, рестартов сервисов, повторного просмотра логов и т.д. не привели ни к чему. Начал читать конфиги в /Library/Server/Messages/Config/jabberd. В файле sm.xml обнаружил, что в секции local (Who we identify ourselves as. Users will have this as the domain part of their JID) там указан мой сервер ceiling-cat.ctrld.me, но домена ctrld.me нет. Других зацепок нет. Вставил его:

<local>
    <!-- Who we identify ourselves as.
     Users will have this as the domain part of their JID.
     If you want your server to be accessible from other
     Jabber servers, this IDs must be FQDN resolvable by DNSes.
     If not set, the SM id is used. -->
    <id>ctrld.me</id>
    <id>ceiling-cat.ctrld.me</id>
    <!--
    <id>vhost1.localdomain</id>
    <id>vhost2.localdomain</id>
    -->
</local>

Перезапустил jabber. Подключился. Заработало… НУ КАК МОЖНО ДО ТАКОГО ДОГАДАТЬСЯ ИЗ ДОСТУПНОЙ ДИАГНОСТИКИ??? Никак… (Многоточие снова вставлено цензурой, здесь был абзац восхваления Apple).

Сижу. Размышляю. Потеряно часа три моего времени. Зато я снова в форме. А может ну её, эту форму, и лучше вернуться на Google Talk?

А на будущее сделал:

$ cd /Library/Server
$ sudo vim .gitignore
*/Data/
*/Backup/
*/Cache/
*/Logs/
*/Status/
*/Migration
Migrated
*/FileData
$ sudo git init
$ sudo git add .
$ sudo git commit -a -m "Initial commit" Вряд ли поможет, но вдруг?