Привет, Хабр! представляю вашему вниманию перевод статьи «Setting up NextCloud and ONLYOFFICE on a single server with Docker».

Сложно недооценивать пользу онлайновых пакетов офисных приложений наподобие Google Docs и облачных хранилищ в жизни технически ориентированных людей (tech-oriented people). Технологии получили настолько широкое распространение, что даже компания Microsoft, уже длительное время доминирующая на рынке офисных приложений, в последнее время сосредоточилась на разработке веб-приложения Office 365 и убеждении пользователей перейти на подписную модель использования собственных сервисов. Тех, кого интересует процесс установки и настройки собственного хранилища приглашаем под кат.

Некоторое время назад мы ознакомились с решениями для облачного хранения и пакетами офисных веб-приложений с открытым ресурсным кодом, которые достаточно легко могли бы быть внедрены для использования в микропредприятии. Основная мотивация хранения всей документации онлайн — это сведение объема бумажного документооборота к минимуму, и внедрение положительных бизнес-практик, не смотря на малый объем операций. Обратная сторона монеты в том, что аренда облачного сервера для предоставления данного сервиса менее безопасна, чем хранение непосредственно на территории предприятия, так как у вас нет никаких средств аудита физического доступа к вашему серверу или трафику. Следовательно, также требуется шифрование end-to-end и программное обеспечение с открытым ресурсным кодом.

Приняв во внимание всю доступную информацию о решениях с открытым ресурсным кодом, мы нашли два действующих проекта (с коммитами в git репозитории за прошедшие 12 месяцев), разработанных для облачного хранения: NextCloud и OwnCloud, и единственный активный пакет офисных приложений ONLYOFFICE. У обоих средств для облачного хранения функционал примерно одинаков, и решение выбрать NextCloud было основано на существовании доказательств, того, что оно может быть интегрировано с ONLYOFFICE для комфортного взаимодействия пользователя с ПО. Однако, когда мы начали развертывание сервисов, дефицит информации по интеграции вышеупомянутых сервисов стал очевидным. Мы нашли 3 обучающих видео о том, как произвести интеграцию:


Ни одно из трех видео не ответило на вопрос установки сервиса документов ONLYOFFICE на том же физическом сервере, что и NextCloud с общим nginx. Вместо этого, они использовали такие технологии разделения, как использование раздельных портов для api сервиса документов. Другим предложенным вариантом было развертывание отдельного сервера для сервиса документов с ручной настройкой конфигурации встроенного в сервис документов инстанса nginx для установки ключа доступа (предварительно известный ключ доступа, подтверждающий право доступа к облаку данных) и сертификатов TLS. Вышеописанные подходы были признаны не безопасными и не достаточно эффективными, поэтому мы произвели интеграцию NextCloud, ONLYOFFICE и общего nginx, который разделяет запросы по доменным именам, с помощью docker-compose. Здесь приведена пошаговая информация о том, как это сделать.

Шаг 1: контейнер nginx


Это очень простая установка, но этот шаг требует самого большого количества работы, для конфигурации обратного прокси сервера. Сначала мы создали конфигурацию docker-compose для образа nginx:stable.

version: '2'
services:
  nginx:
    image : nginx:stable
    restart: always
    volumes:
      - ./nginx/nginx-vhost.conf:/etc/nginx/conf.d/default.conf:ro
      - ./nginx/certificates:/mycerts 
    ports:
      - 443:443
      - 80:80

Это создает контейнер с портами 80 и 443, открытыми для публичного доступа, делает мэппинг конфигурации на nginx/nginx-vhost.conf и определяет хранилище для сертификатов, сгенерированных как самоподписанные сертификаты или с использованием Сertbot от Let’s encrypt в /nginx/certificates. В этом месте должны находиться папки для office.yourdomain.com и cloud.yourdomain.com с файлами fullchain1.pem и privkey1.pem в каждой для цепочки сертификатов и частного ключа сервера соответственно. Вы можете прочитать больше о том, как сгенерировать самоподписанный сертификат здесь www.akadia.com/services/ssh_test_certificate.html (переименование .key и .crt в .pem работает без конвертации файловой структуры для nginx).

После этого мы определили файл vhost. Сначала мы определяем поведение порта 80 как простое перенаправление на https, т.к. мы не хотим разрешать никакой http трафик

server {
    listen 80;
    location / {
        return 301
            https://$host$request_uri;
    }
}

Затем мы создали два виртуальных сервера на порту 443 для наших сервисов:

server {
    listen 443 ssl;
    server_name cloud.yourdomain.com ;
    root /var/www/html;

    ssl_certificate     /mycerts/cloud.yourdomain.com/fullchain1.pem;
    ssl_certificate_key /mycerts/cloud.yourdomain.com/privkey1.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://app:80;
    }
}
server {
    listen 443 ssl;
    server_name office.yourdomain.com;
    root /var/www/html;

    ssl_certificate     /mycerts/office.yourdomain.com/fullchain1.pem;
    ssl_certificate_key /mycerts/office.yourdomain.com/privkey1.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://onlyoffice:80;
    }
}

Шаг 2: сервис документов


Теперь нам нужно добавить контейнер сервиса документов в наш docker-compose.yml. Конфигурировать здесь особо нечего.

services:
...
  onlyoffice:
    image: onlyoffice/documentserver
    restart: always

Но не забудьте связать контейнер nginx с сервисом документов:

services:
...
  nginx:
    ...
    depends_on:
      - onlyoffice

Шаг 3: NextCloud


Сначала добавляем новые сервисы:

services:
...
  db:
    image: mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - /data/nextcloud_db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=#put some password here
      - MYSQL_PASSWORD=#put some other password here
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
  app:
    image: nextcloud
    depends_on:
      - db
      - onlyoffice
    restart: always

и добавляем ссылку на nginx:

services:
...
  nginx:
    ...
    depends_on:
      - app 

Теперь пора загрузить контейнеры.

docker-compose up -d  

Через некоторое время, nginx начнет переадресовывать вас на внешний интерфейс NextCloud, который по умолчанию является станицей конфигурации. Вам необходимо будет ввести имя пользователя и пароль для вашего первого администрирующего пользователя и учетные данные базы данных, которые вы указали в docker-compose.yml После того, как настройка окончена, вы сможете залогиниться. В нашем случае ожидание заняло почти минуту и потребовало дополнительного обновления страницы входа, перед тем, как мы смогли зайти в облачный сервис.

Окно настроек сервиса NextCloud
image

Шаг 4: соединение NextCloud и ONLYOFFICE


На этом шаге вам будет необходимо установить приложение для NextCloud, которое подключает функционал ONLYOFFICE. Начнем с панели управления приложениями в верхнем правом углу меню. Найдите приложение ONLYOFFICE (в разделе “Офис и текст” (Office & text) или с использованием поиска), установите и активируйте его.

После этого направляйтесь в Установки (Settings) через меню в правом верхнем углу, и вы должны будете найти элемент ONLYOFFICE в левом меню. Зайдите в него. Вам будет необходимо прописать адреса, как указано ниже.

Настройки интеграционного приложения
image

Первый адрес используется для ссылки на некоторые файлы js и css напрямую из запущенного в браузере приложения (это то, для чего нам необходимо открыть доступ к сервису ONLYOFFICE через nginx). Секретный ключ не используется, потому что мы доверяем слою изоляции Docker больше, чем постоянному ключу аутентификации. Третий адрес используется контейнером NextCloud для прямого подключения к ONLYOFFICE API, и он использует внутреннее имя хоста по умолчанию из Docker. Ну и последнее поле используется для того, чтобы ONLYOFFICE смог делать запросы обратно к NextCloud API, используя внешний IP-адрес или внутренний адрес Docker, если вы используете сети Docker, но в нашем случае это не используется. Удостоверьтесь, что настройки вашего фаервола позволяют данные виды взаимодействий.

После сохранения, NextCloud протестирует соединение и, если все верно, покажет вам настройки, связанные с интеграцией — например, какие типы файлов могут редактироваться данной интеграцией. Настройте так, как считаете нужным.

Завершающий шаг: где искать редактор


Если вы вернетесь в папки вашего облачного хранилища и нажмете на “+” для создания нового файла, то вам будет доступна новая опция создания документа, таблицы или презентации. С их помощью вы создадите и сразу сможете редактировать данные типы файлов, используя ONLYOFFICE.

Меню создания файлов
image


Дополнение 1


Полное содержимое docker-compose.yml можно найти здесь: https://pastebin.com/z1Ti1fTZ

Комментарии (12)


  1. Rat4er
    14.08.2019 19:47

    Уважаемый KsanaC, не могли бы Вы разместить docker-файлы в каком либо хранилище и предоставить ссылки на них. Был бы очень благодарен.


    1. KsanaC Автор
      14.08.2019 19:51

      Добавила ссылку на объединенный docker-compose.yml. Dockerfile в данном проекте, на сколько я понимаю, не используются.


      1. Rat4er
        14.08.2019 19:55

        Премного благодарен)


  1. 13werwolf13
    15.08.2019 06:33

    Господи, ну объясните мне тупому зачем все пихают докер туда где он не нужен?


    1. Wernisag
      15.08.2019 07:38

      Модно, стильно, молодежно


    1. mikes
      15.08.2019 17:15

      Потому что можно не думая о том как чё устроено собирать из кубиков "сервисы". Но правда потом если че не так, то и ставим крест на проекте ибо что? Прикольно, никто не знает как это все устроено.


    1. ilyapirogov
      15.08.2019 17:32

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


      1. 13werwolf13
        15.08.2019 20:09

        Вот со многим могу согласиться, но слова "докер" и "продакшн" не должны встречаться.
        Докер годится для тестирования, для презентации, для вызывания жжения пониже спины… Но никак не для прода.


        1. ilyapirogov
          15.08.2019 20:53

          Возможно, вы и правы и у DevOps крупных компаний именно это чувство и вызывает слово docker. Однако если говорить за себя, то я — не DevOps, мои сервера — не google.com, а я никому никогда не гарантировал 99.[9]% uptime.


          Зато я ценю свое время, удобство и простоту деплоя. По этому, для моих home projects — это практически панацея.


          Наверное, в этом ракурсе docker можно сравнить с Arduino. Профессиональные железнячники ругают Arduino за то, что это overhead и overprice и что с таким-то микроконтроллером и программатором можно сделать все намного проще и компактнее, в то время как любители продолжают делать на основе Arduino всякие интересные штуки и умные девайсы просто для себя и не знают проблем.


  1. ilyapirogov
    15.08.2019 17:31

    Промахнулся веткой


  1. Schalker
    16.08.2019 22:23

    Согласен с комментариями. Зачем загонять Nextcloud в Докер?


    1. KsanaC Автор
      17.08.2019 15:58

      С моей точки зрения у этого есть как минимум 2 преимущества: простота установки сервисов и повышение уровня безопасности систему в целом за счет изоляции отдельных компонентов системы друг от друга и от основной операционной системы. По сути докер это просто база туториалов по настройке того или иного сервиса. Если по какой-то причине использовать докер нет желания, то можно как минимум пользоваться скриптами из Dockerfile в качестве туториала — что и в какой последовательности устанавливать.

      Из личного опыта — была ситуация, когда клиенту требовалось установить и настроить среду для лемматизации финского языка omorfi. У этой среды есть неудобные зависимости-библиотеки, которых нет в стандартных репозиториях и которые необходимо собирать вручную. Кроме того это было необходимо сделать в суловиях отсутствия доступа к целевой системе. То есть объяснить клиенту в чате что скачивать, куда устанавливать без адекватной обратной связи. Вот тут переносимость образов докер оказалась просто незаменима. Dockerfile был собран и проверен на локальной машине после чего передан клиенту. После чего проблема была решена за 20 минут.