Настроювання NextCloud + ONLYOFFICE на одному сервері за допомогою Docker

Привіт, Хабре! представляю вашій увазі переклад статті "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/certifica. У цьому місці повинні знаходитися папки для 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Настроювання NextCloud + ONLYOFFICE на одному сервері за допомогою Docker

Крок 4: з'єднання NextCloud та ONLYOFFICE

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

Після цього прямуйте в Налаштування через меню в правому верхньому кутку, і ви повинні будете знайти елемент ONLYOFFICE в лівому меню. Зайдіть до нього. Вам необхідно буде прописати адреси, як зазначено нижче.

Налаштування інтеграційної програмиНастроювання NextCloud + ONLYOFFICE на одному сервері за допомогою Docker

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

Після збереження, NextCloud протестує з'єднання і, якщо все вірно, покаже вам налаштування, пов'язані з інтеграцією, наприклад, які типи файлів можуть редагуватися цією інтеграцією. Налаштуйте так, як вважаєте за потрібне.

Завершальний крок: де шукати редактор

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

Меню створення файлівНастроювання NextCloud + ONLYOFFICE на одному сервері за допомогою Docker

доповнення 1

Повний вміст docker-compose.yml можна знайти тут: https://pastebin.com/z1Ti1fTZ

Джерело: habr.com

Додати коментар або відгук