- PVSM.RU - https://www.pvsm.ru -
Вчера мы выпустили ONLYOFFICE [1] под Linux и спешим поделиться не только новостями, но и полезной информацией для тех, кто, как и мы, 5 лет назад оказался в собственной ловушке под названием «ASP.Net»
Попытки портировать приложение на Unix с использованием проекта Mono мы начали предпринимать еще 4 года назад, однако, долгое время у нас ничего не получалось, поскольку на тот момент Mono сильно отставал по функционалу при портировании с .Net под Windows. В частности, в Mono была сильно урезана поддержка wcf, а также плохо работал asp.net mvc. Впрочем, к счастью разработчиков все эти годы проект Mono активно развивался — добавилась поддержка .Net 4.0 и .Net 4.5, так что весной 2013 мы решили возобновить работу.
Здесь мы расскажем о том, с какими проблемами столкнулись в процессе портирования облачного офиса под Mono, как их решили, что имеем в итоге, и как один инициативный пользователь уже через пару часов после релиза обернул всё в Dockerfile.
Что происходит: сайт не открывается, картинки не отображаются или отображаются некорректно. Сейчас проблема подробно описана [2] на официальном сайте Mono Project.
В чем дело: в Windows прямой и обратный слеш — это одно и тоже, а в Unix — два совершенно разных пути. В Windows пути нечувствительны к регистру, а в Unix — это разные имена.
Как решить проблему:
Что происходит: незакрывающиеся транзакции в базе данных MySQL.
В чем дело: к сожалению, так и не выяснили до конца (есть предположения?)
Как решили: добавили параметр в строке подключения AutoEnlist=false
Что происходит: различие в xml представлении полей со значением null и исключение в mono сериализаторе при использовании пустых namespace в xml.
Как решили: Убрали wcf сервис модуля «Документы» и заменили на webapi.
Что происходит: утечка памяти при использовании mod_mono_server для apache2. Например, при вставке новых данных в HttpRuntime.Cache с ключом, который уже есть в кеше, Mono, в отличие от .NET, не освобождает память занятую предыдущими данными.
В чем было дело: все ещё загадка для нас.
Как решили: для решения данной проблемы требуется явно удалять старые данные перед вставкой новых. Мы в свою очередь перешли на nginx, где подобной проблемы не наблюдалось.
Что происходит: в WCF-сервисе при обращении к членам класса ConfigurationManager возникал NullReferenceException, если ранее мы где-либо перезаписывали свойство HttpContext.Current.
В чем дело: если вручную выставить в не веб-приложении HttpContext.Current, то mono начинает использовать вместо ConfigurationManager — WebConfigurationManager, что приводит к исключениям в не веб-приложении.
Как решили: избавились от установки вручную HttpContext.Current.
В чем дело: HTTP WCF Mono сервис имеет много мелких различий по сравнению с Microsoft версией (например, небольшие различия в xml при сериализации; в mono версии расширения нельзя указать через атрибуты, только через конфигурационный файл; отсутсвует HttpContext.Current, и так далее).
Как решили: переписали HTTP WCF сервис документов на версию, основанную на Web API.
В чем дело: при обмене сообщениями в чате, встроенном в страницу, мы используем библиотеку ASP.NET SignalR. При портировании ONLYOFFICE под Mono нам хотелось бы и там использовать данную библиотеку. Она поддерживает несколько типов транспортов для передачи данных: websockets, long polling, forever frame, server sent events. Наиболее предпочтительной для нас является технология вебсокетов, которую мы используем в нашей Saas-версии. К сожалению, на данный момент SignalR не позволяет использовать вебсокеты под Mono, поэтому была предпринята попытка в качестве транспорта использовать Long Polling. Но на этапе нагрузочного тестирования SignalR-сервер падал с исключением System.IO.IOException: «Too many open files» — примерно после тысячи подключений клиентов. При последующем изучении проблемы была замечена утечка сокетов на SignalR-сервере после дисконекта клиента, о чем мы сообщили разработчикам SignalR. Надеемся в следующей версии SignalR данная проблема будет решена.
Как решили: другие транспорты не подходят для решения наших задач по разным причинам, поэтому на данный момент для версии под Mono нам пришлось отключить чат, работающий через SignalR.
В общей сложности было внесено несколько сотен измений в проект, однако, в результате нам удалось сделать такую версию, которая при сборке из одних и тех же исходников корректно работает и под Windows, и под Unix с использованием Mono.
Прошло полгода с тех пор, как заработала первая страничка ONLYOFFICE под Mono. Сегодня мы имеем кроссплатформенное решение [3] для управления проектами и документами, ведения базы клиентов, усиленное почтовым агрегатором и другими инструментами для совместной работы.
В качестве защиты авторского права на наш продукт мы выбрали лицензию AGPL v.3 [7], то есть вы можете разворачивать ONLYOFFICE Common для внутренней работы команды, однако, используя исходники в собственном проекте, вы обязаны открыть его код под той же лицензией.
Уже через пару часов после выхода версии, на нашем форуме разработчиков [8] появилось сообщение от инициативного пользователя, который опередил нас и уже успел обернуть всё решение в Dockerfile (за что ему отдельное большое спасибо).
Несмотря на то, что с этой сборкой еще стоит поработать, тренд угадан верно — в ближайшее время мы планируем подготовить ONLYOFFICE Docker-контейнер для каждого языка распространения.
Большая часть бекэнда редакторов документов ONLYOFFICE написана на С++, поэтому перевод приложения под Linux осуществляется иными методами.
Например, недавно мы закончили работу с элементами, отвечающими за конвертацию форматов документов. Основная сложность здесь состоит в том, чтобы избавиться от компонентов ActiveX и ATL.
Чтобы реализовать задуманное, необходимо было осуществить четыре шага:
В ближайшие планы входит разработка десктопных офисных приложений под популярные ОС, поэтому для сборки мы использовали qmake из фреймворка Qt Framework. К тому же IDE QtCreator показалась наиболее удобным вариантом для разработки и отладки кода.
* * *
Если бы мы начинали разработку продукта сегодня, то конечно, обратились бы к ASP.NET vNext [9], который анонсировали как раз к окончанию процесса портирования ONLYOFFICE (о несправедливый мир разработки!). Впрочем, дело уже сделано, а планы, как всегда, наполеоновские. В следующем году мы выпускаем открытый онлайн-офис под Linux, а значит сможем наконец помериться силами с OpenOffice на их же территории. Впрочем, это уже совсем другая история, о которой мы подробнее расскажем в январе.
А пока что наша команда поздравляет всех с наступающим Новым Годом!
ps. Кто душой уже на каникулах, а телом в офисе, может скоротать часы, посчитав всех пингвинов на фотке (наши сотрудники не в счёт ;)
Автор: Galkinator
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/78128
Ссылки в тексте:
[1] ONLYOFFICE: http://www.onlyoffice.com/ru
[2] описана: http://www.mono-project.com/docs/advanced/iomap/
[3] кроссплатформенное решение: http://www.onlyoffice.com/ru/server-common.aspx
[4] репозитории GitHub: https://github.com/ONLYOFFICE
[5] Sourceforge: http://sourceforge.net/projects/teamlab/files/ONLYOFFICE%208.1/binaries/
[6] репозитории.: https://help.onlyoffice.com/products/files/doceditor.aspx?fileid=4065006&doc=dzd3c25JRGFFa0xzL1lKNEIrd2xDZEJySWNhWTBzdVVyeFB6b3Rsa1BTbz0_IjQwNjUwMDYi0
[7] AGPL v.3: http://www.onlyoffice.com/ru/license-faq.aspx
[8] форуме разработчиков: http://dev.onlyoffice.org/ru/viewtopic.php?f=5&t=707
[9] ASP.NET vNext: http://blogs.msdn.com/b/dotnet/archive/2014/05/12/the-next-generation-of-net-asp-net-vnext.aspx
[10] Источник: http://habrahabr.ru/post/246777/
Нажмите здесь для печати.