Я работаю в одной региональной государственной организации, в которой потребовалось внедрить онлайн систему управления документами, умеющую работать с документами формата docx и xlsx.
Конечно прежде чем что-то внедрять происходит анализ существующих решений и целесообразность их внедрения. Казалось бы тут как нельзя кстати походит Р7 офис корпоративный сервер, так как это решение входит в реестр отечественного ПО и нацелено как раз на этот рынок.
Был сделан запрос цены в АО «Р7», но когда руководство увидело предложение от правообладателя Р7, то сразу отклонило это предложение, ведь оказалось, что цена на 2 порядка выше, чем себе это представлял руководитель. Я могу понять правообладателя, ведь он потратил деньги на сертификацию, программистов и т. д., но нашему руководству этого не понять у них бюджет строго ограничен.
Итак задача изменена на внедрить онлайн систему управления документами, но настолько дешево насколько это возможно, а лучше бесплатно, но удовлетворяющую требованиям безопасности. Из альтернатив остается только применение open source решения only office server вкупе с выполнением рекомендаций по запуску не доверенного ПО в защищенных средах.
Задача усложняется тем, что базовые сервера работают на ОС Astra linux 1.8. Казалось бы в чем сложность? бери готовые docker образы, разворачивай и будет тебе счастье, но не все так просто – согласно одному из требований по безопасности docker образ должен быть на базе ОС astra linux.
Итак для безопасности применяем 2 системы: система контейнеризации docker, работающая на основе встроенных в ядро linux механизмов изоляции и МКЦ в ОС astra linux. С docker все стандартно, а вот с запуском docker на пониженном уровне целостности пришлось повозиться. Включаем запуск командой sudo astra-docker-isolation enable, запускаем любой образ и получаем ошибку запуска docker. Путем анализа логов удалось обнаружить, что не удается пробросить порт, так как docker не имеет на это прав. После долгих поисков найдено решение написать политику разрешения доступа к firewalld для группы docker.
[Enable firewalldmanagement by docker CUSTOM]
Identity=unix-group:docker
Action=org.fedoraproject.FirewallD1.direct;org.fedoraproject.FirewallD1.config.info;;org.fedoraproject.FirewallD1.config
ResultAny=yes
Кладем файл с этим содержимым по пути /etc/polkit-1/localauthority/10-vendor.d/my.allow-firewalld-for-docker.pkla и выполняем systemctl polkit restart && systemctl docker restart. После этого контейнеры стали запускаться нормально и пришло время заняться непосредственно onlyoffice.
При первом взгляде на github аккаунт onlyoffice теряешься. Множество проектов и непонятно с чего начать. Но все же почитав немного мне показалось, что нужно собирать only office document server и я не ошибся, но как оказалось это только начало.
Согласно инструкции Compiling ONLYOFFICE Docs for a local server – ONLYOFFICE для компиляции onlyoffice docs достаточно склонировать репозиторий командой git clone https://github.com/ONLYOFFICE/build_tools.git после чего перейти в директорию build_tools/tools/linux далее запустить команду ./automate.py server. Так и поступаем, и долго ждем результатов компиляции, так как скрипт кроме компиляции также скачивает все необходимые зависимости.
получаем ошибку:
/core/Common/3dParty/v8_89/v8/out.gn/linux_64/../../third_party/llvm-build/Release+Asserts/bin/ld.lld: /core/Common/3dParty/v8_89/v8/third_party/llvm-build/Release+Asserts/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libicuuc.so.72)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
после недолгих поисков стало понятно как победить ошибку, достаточно выполнить команду:
mv /core/Common/3dParty/v8_89/v8/third_party/llvm-build/Release+Asserts/lib/libstdc++.so.6 /core/Common/3dParty/v8_89/v8/third_party/llvm-build/Release+Asserts/lib/oldlibstdc++.so.6
.
Сейчас почему-то код перестал компилироваться. Пишет:
File "/core/Common/3dParty/html/fetch.py", line 5, in <module>
import config
ModuleNotFoundError: No module named 'config'
но у меня уже есть собранный ранее артефакт – debian пакет. Уже не помню как его собрал. Кажется в наборе скриптов был какой-то отдельный скрипт для этого. Надо будет вернуться к этому позднее.
Поскольку планируется запуск внутри docker поищем что еще есть в аккаунте onlyoffice на github и не зря находится проект docker-docсumetserver – то, что надо. По файлу docker-compose видно, что также потребуется docker образ redis и postgresql.
services:
onlyoffice-documentserver:
build:
context: .
container_name: onlyoffice-documentserver
depends_on:
- onlyoffice-postgresql
- onlyoffice-rabbitmq
environment:
- DB_TYPE=postgres
- DB_HOST=onlyoffice-postgresql
- DB_PORT=5432
- DB_NAME=onlyoffice
- DB_USER=onlyoffice
- AMQP_URI=amqp://guest:guest@onlyoffice-rabbitmq
# Uncomment strings below to enable the JSON Web Token validation.
#- JWT_ENABLED=true
#- JWT_SECRET=secret
#- JWT_HEADER=Authorization
#- JWT_IN_BODY=true
ports:
- '80:80'
- '443:443'
stdin_open: true
restart: always
stop_grace_period: 60s
volumes:
- /var/www/onlyoffice/Data
- /var/log/onlyoffice
- /var/lib/onlyoffice/documentserver/App_Data/cache/files
- /var/www/onlyoffice/documentserver-example/public/files
- /usr/share/fonts
onlyoffice-rabbitmq:
container_name: onlyoffice-rabbitmq
image: rabbitmq
restart: always
expose:
- '5672'
onlyoffice-postgresql:
container_name: onlyoffice-postgresql
image: postgres:12
environment:
- POSTGRES_DB=onlyoffice
- POSTGRES_USER=onlyoffice
- POSTGRES_HOST_AUTH_METHOD=trust
restart: always
expose:
- '5432'
volumes:
- postgresql_data:/var/lib/postgresql
volumes:
postgresql_data:
что ж собираем соответствующие образы.
redis есть в репозитории astra поэтому сборка этого образа ничего интересного из себя не представляет. банальный apt install и копирование конфигурационных файлов.
А вот с postgresql все интереснее. Официальный образ postgresql на основе которого будет создаваться не имеет возможности настроить slave сервер, а в production все же рекомендуется иметь master и slave сервер СУБД. Есть некий bitnami образ postgresql, позволяющий настроить slave сервер и еще множество параметров, но там много bash скриптов, не поддающихся быстрому аудиту, что неприемлемо. Что ж делаю небольшую модификацию в docker-entrypoint.sh официального dockerfile postgresql для нормальной поддержки slave. Параметр называю также как и в bitnami образе, чтобы потом не было путаницы.
добавляю новые переменные в процедуру docker_setup_env
docker_setup_env() {
file_env 'POSTGRESQL_REPLICATION_USER'
file_env 'POSTGRESQL_REPLICATION_PASSWORD'
file_env 'MASTER_HOST'
...
модифицирую процедуру pg_setup_hba_conf добавляя
if [ $POSTGRESQL_REPLICATION_USER ]; then
echo "host replication $POSTGRESQL_REPLICATION_USER all $POSTGRES_HOST_AUTH_METHOD" >> "$PGDATA/pg_hba.conf"
fi
ну и модифицирую main_ добавляя
if [ "$MASTER_HOST" ]; then
# su - postgres -c "pg_basebackup --host="$MASTER_HOST" --username="$POSTGRESQL_REPLICATION_USER" --pgdata="$PGDATA" --wal-method=stream --write-recovery-conf -w"
sleep 10
pg_basebackup --pgdata="$PGDATA" --wal-method=stream --write-recovery-conf -w -d postgresql://$POSTGRESQL_REPLICATION_USER:$POSTGRESQL_REPLICATION_PASSWORD@$MASTER_HOST
else
if [ "$POSTGRESQL_REPLICATION_USER" ]; then
docker_process_sql <<<"CREATE ROLE $POSTGRESQL_REPLICATION_USER WITH REPLICATION PASSWORD '$POSTGRESQL_REPLICATION_PASSWORD' LOGIN;"
fi
Ну и наконец модифицируем Dockerfile из docker-docсumetserver меняя каманду установку onlyoffice на :
COPY onlyoffice-documentserver_8.3.2-3_amd64.deb /
RUN apt-get -y update && \
DEBIAN_FRONTEND=noninteractive DS_DOCKER_INSTALLATION=1 apt-get install /ttf-mscorefonts-installer_3.6_all.deb \
netcat-openbsd /onlyoffice-documentserver_8.3.2-3_amd64.deb unzip cron libaio1 libboost-regex-dev libnspr4 libnss3 net-tools sudo supervisor unixodbc-dev -y
предварительно положив в папку артефакт onlyoffice-documentserver_8.3.2-3_amd64.deb.
Теперь имеется возможность запустить document server. Но это еще не конец. document serer только предоставляет возможность редактировать документы, но без дополнительных систем хранения и аутентификации он бесполезен. Что ж, продолжаем.
Далее я пытаюсь собрать onlyoffice community server.
В инструкции все просто. перейти в директорию build и запустить скрипт Build.sh на деле же при попытке компиляции на astra linux выдается ошибка:
/CommunityServer/web/studio/ASC.Web.Studio/Core/HelpCenter/BaseHelpCenterStorage.cs(295,26): error CS1705: Assembly 'ASC.Common' with identity 'ASC.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' uses 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' which has a higher version than referenced assembly 'System.Net.Http' with identity 'System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' [/CommunityServer/web/studio/ASC.Web.Studio/ASC.Web.Studio.csproj]
Опускаю попытки модернизировать этот проект и перенести его на более современный dotnet. Результатом как минимум стал еще не принятый pull request, преобразующий проекты visual studio, их кстати аж 63 в, так называемые, sdk style project.
И вдруг в процессе поисков решения ошибки я понимаю, что все уже сделано! И на том же github аккаунте onlyoffice существует проект docspace, уже модернизированный и нацеленный на dotnet 8.
Ну что ж пробую собрать этот проект. Этот проект уже более осовременен и разбит на микросервисы, каждый из которых запакован в отдельный образ docker, которых немало. Собирается вся эта красота с помощью вспомогательных скриптов вынесенных в отдельный репозиторий с названием docSpace-buildtools.
Переходим в директорию buildtools/install/docker, модифицируем Dockerfile под свои нужды (astra linux) и запускаем команду: docker build --target base -t oo-base-img . Такое нужно будет повторить для каждого target, поскольку в этом docker файле применен принцип многостадийной сборки для оптимизации размеров готовых docker образов и повышения уровня их безопасности способом копирования только необходимого из среды сборки.
Сборка снова не поддается. ругается на то, что код отличается от head.
Поскольку сборка происходит в docker контейнере вооружаемся sed и добавляем следующие строчки, ведь мы ранее уже получили последнюю версию из своей ветки git и делать это в python коде нет необходимости:
run sed -i 's/result += fetchCommits(REPO_CLIENT_URL, CLIENT)/#result += fetchCommits(REPO_CLIENT_URL, CLIENT)/' ${SRC_PATH}/buildtools/debuginfo.py
run sed -i 's/result += fetchCommits(REPO_SERVER_URL, SERVER)/#result += fetchCommits(REPO_SERVER_URL, SERVER)/' ${SRC_PATH}/buildtools/debuginfo.py
run sed -i 's/result += fetchCommits(REPO_BUILDTOOLS_URL, BUILDTOOLS)/#result += fetchCommits(REPO_BUILDTOOLS_URL, BUILDTOOLS)/' ${SRC_PATH}/buildtools/debuginfo.py
Ах да перед этим еще надо добавить java21 не из oracle, а из репозиториев lab50, поскольку в репозиториях астра есть только java 17, а с 17 версией проект не собирается, так как использует api, появившиеся в java 21, от которых непросто быстро избавиться:
RUN touch /etc/apt/sources.list.d/gosjava.list; echo 'deb http://packages.lab50.net/gosjava/21 alse17 main' >> /etc/apt/sources.list.d/gosjava.list
RUN wget -qO - http://packages.lab50.net/lab50.asc | apt-key add -
RUN apt update; apt install -y gosjava-21-jdk; rm -rf /var/lib/apt/lists/*
Ну и доставляем парочку необходимых пакетов jsonpath-ng и multipledispatch, быстро портированных с debian копированием с packages.debian.org необходимых файлов для сборки (*.dsc, .tar.gz, orig, .tar.gz) и сборкой командой dpkg-source -x *.dcs, переходом в папку с распакованным исходным кодом, установкой необходимых зависимостей времени компиляции и запуском команды dpkg-buildpackage. Это самый быстрый путь, поскольку astra linux является деривативном debian linux и многие пакеты от debian подходят к astra.
Теперь возникает другая ошибка на функциях split:
CS0121: The call is ambiguous between the following methods or properties ...Split...
Причем эта ошибка возникает на dotnet sdk версии до 8.0.304, а на astra linux стоит 8.0.100
Меняю в коде везде Split(['|']) на ('|'). Например:
foreach (var to in m.Reciever.Split(['|'], StringSplitOptions.RemoveEmptyEntries))
на
foreach (var to in m.Reciever.Split('|', StringSplitOptions.RemoveEmptyEntries))
Создаю pull request с исправлениями в основную ветку only office и bug report в поддержку astra linux.
Ну все, теперь то должно собраться, но нет. Пока я возился с разрешением этих ошибок разработчики only office docspase обновили target platform до dotneet9 и теперь требetется создавать ветку dotnet8, менять все строки <TargetFramework>net9.0</TargetFramework>
на <TargetFramework>net8.0</TargetFramework>
и снова пересобирать.
Все форки и правки, кроме последнего docspace, поскольку он еще до конца не собирается, опубликованы в моем github аккаунте (kazan417) вместе с множеством других docker образов проектов, портированных на астра.
На Habr пишу впервые, поэтому прошу сильно не бить, но конструктивная критика и рекомендации приветствуются.
Публикую статью, поскольку хочется попасть на конкурс #сезон open source, а времени уже совсем нет. Поэтому продолжение следует...