Инструменты пользователя

Инструменты сайта


virtualization:lxc:openloud

Это старая версия документа!


OpenCloud + OpenOffice + NPM

Описан вариант реализации:

  • На сервере запущен Proxmox 8.4.13
  • На хосте Proxmox создан ZFS vdev и примонтирован в /Storage
  • OpenCloud запускается через Docker внутри LXC контейнера с Ubuntu
  • Для работы с документами запущен OnlyOffice Document Server в отдельном LXC контейнере
  • В качестве reverse proxy вместо Traefik используется Nginx Proxy Manager, который идет в стандартной конфигурации (ссылка на LXC)
  • В качестве места хранения данных используется отдельный dataset на хосте PVE, который монтируется в контейнер с OpenCloud с помощью mount point

Установка OpenOffice

Для создания нового LXC контейнера с OnlyOffice Document Server нужно запустить на хосте PVE скрипт установки:

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/onlyoffice.sh)"

Затем нужно включить WOPI в конфигурационном файле через nano /etc/onlyoffice/documentserver/local.json, для этого в разделе wopi изменить enable на true:

  "wopi": {
    "enable": true,
    "privateKey": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwg>
    "privateKeyOld": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBK>
    "publicKey": "BgIAAACkAABSU0ExAAgAAAEAAQDZocibvNv/R5sjTZe0QWZ41k5gI/ZPzQFuYNu4Uo8>
    "publicKeyOld": "BgIAAACkAABSU0ExAAgAAAEAAQDZocibvNv/R5sjTZe0QWZ41k5gI/ZPzQFuYNu4>
    "modulus": "lTD2Ffrausy6KKVy7aiofW6rMw5I1z68LboVUIsF4b50Nj9YoEou4blmXfaX7MRgiU5ZT>
    "modulusOld": "lTD2Ffrausy6KKVy7aiofW6rMw5I1z68LboVUIsF4b50Nj9YoEou4blmXfaX7MRgiU>
    "exponent": 65537,
    "exponentOld": 65537
  },

После чего нужно перезапустить сервис:

systemctl restart ds-docservice.service

Необходимо присвоить статический IP-адрес, либо сделать DHCP reservation на роутере - этот адрес пригодится при настройке NPM в дальнейшем.

Примечание: возможен также запуск OO DS в отдельном контейнере без отдельного хоста, но такой вариант не проверялся.

OpenCloud в Docker

Для запуска OpenCloud через Docker нужно клонировать репозиторий https://github.com/opencloud-eu/opencloud-compose:

git clone https://github.com/opencloud-eu/opencloud-compose.git
cd opencloud-compose

Затем скопировать образец файла, содержащего значения переменных окружения:

cp .env.example .env

После чего внести изменения через nano .env, указав значения переменных:

Переменная Значение
OC_DOMAIN Домен, по которому осуществляется доступ к OpenCloud через reverse proxy (например, oc.domain.ru)
DEMO_USERS Указать false, чтобы не создавать демонстрационных пользователей
INITIAL_ADMIN_PASSWORD Длинный и сложный пароль, который будет создан для первого пользователя OpenCloud. Создать, например, можно через tr -dc 'A-Za-z0-9!?%=' < /dev/urandom | head -c 32
LOG_PRETTY true, чтобы логи были более удобочитаемыми
COLLABORA_DOMAIN Домен, по которому осуществляется доступ к OpenOffice через reverse proxy (например, oo.oc.domain.ru)
WOPISERVER_DOMAIN Домен, по которому осуществляется доступ к WOPI server через reverse proxy (например, wopi.oc.domain.ru). В данном случае он будет запускаться в стеке opencloud на отдельном порту

Далее нужно создать два дополнительных файла для OnlyOffice, по аналогии с имеющимися.

nano weboffice/oo.yml

---
services:

  opencloud:
    environment:
      # this is needed for setting the correct CSP header
      COLLABORA_DOMAIN: ${COLLABORA_DOMAIN:-collabora.opencloud.test}
      # expose nats and the reva gateway for the collaboration service
      NATS_NATS_HOST: 0.0.0.0
      GATEWAY_GRPC_ADDR: 0.0.0.0:9142
      # make collabora the secure view app
      FRONTEND_APP_HANDLER_SECURE_VIEW_APP_ADDR: eu.opencloud.api.collaboration.CollaboraOnline
      GRAPH_AVAILABLE_ROLES: "b1e2218d-eef8-4d4c-b82d-0f1a1b48f3b5,a8d5fe5e-96e3-418d-825b-534dbdf22b99,fb6c3e19-e378-47e5-b277-9732f9de6e21,58c63c02-1d89-4572-916a-870abc5a1b7d,2d00ce52-1fc2-4dbc-8b95-a73b73395f5a,1c996275-f1c9-4e71-abdf-a42f6495e960,312c0871-5ef7-4b3a-85b6-0e4074c64049,aa97fe03-7980-45ac-9e50-b325749fd7e6"

  collaboration:
    image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud-rolling}:${OC_DOCKER_TAG:-latest}
    networks:
      opencloud-net:
    depends_on:
      opencloud:
        condition: service_started
    entrypoint:
      - /bin/sh
    command: [ "-c", "opencloud collaboration server" ]
    environment:
      COLLABORATION_GRPC_ADDR: 0.0.0.0:9301
      COLLABORATION_HTTP_ADDR: 0.0.0.0:9300
      MICRO_REGISTRY: "nats-js-kv"
      MICRO_REGISTRY_ADDRESS: "opencloud:9233"
      COLLABORATION_WOPI_SRC: https://${WOPISERVER_DOMAIN:-wopiserver.opencloud.test}
      COLLABORATION_APP_NAME: "OnlyOfficeName"
      COLLABORATION_APP_PRODUCT: "OnlyOffice"
      COLLABORATION_APP_ADDR: https://${COLLABORA_DOMAIN:-collabora.opencloud.test}
      COLLABORATION_APP_ICON: https://${COLLABORA_DOMAIN:-collabora.opencloud.test}/favicon.ico
      COLLABORATION_APP_INSECURE: "${INSECURE:-true}"
      COLLABORATION_CS3API_DATAGATEWAY_INSECURE: "${INSECURE:-true}"
      COLLABORATION_LOG_LEVEL: ${LOG_LEVEL:-info}
      OC_URL: https://${OC_DOMAIN:-cloud.opencloud.test}
    volumes:
      # configure the .env file to use own paths instead of docker internal volumes
      - ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud
    logging:
      driver: ${LOG_DRIVER:-local}
    restart: always

nano external-proxy/oo.yml

---
services:
  collaboration:
    ports:
      # expose the wopi server
      - "9300:9300"

После чего нужно запустить стек командой:

docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml up -d

Результат команды должен быть примерно таким:

root@docker:~/opencloud-compose# docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml up -d
[+] Running 8/8
 ✔ collaboration Pulled                                                          6.7s 
   ✔ 0368fd46e3c6 Already exists                                                 0.0s 
   ✔ 5fc4e13002df Pull complete                                                  3.0s 
   ✔ b6f4dd128c04 Pull complete                                                  3.0s 
   ✔ f97f18512833 Pull complete                                                  3.0s 
   ✔ 4f4fb700ef54 Pull complete                                                  3.0s 
   ✔ 689386fb247f Pull complete                                                  3.9s 
 ✔ opencloud Pulled                                                              6.7s 
[+] Running 5/5
 ✔ Network opencloud-compose_opencloud-net      Created                          0.0s 
 ✔ Volume "opencloud-compose_opencloud-config"  Created                          0.0s 
 ✔ Volume "opencloud-compose_opencloud-data"    Created                          0.0s 
 ✔ Container opencloud-compose-opencloud-1      Started                          4.0s 
 ✔ Container opencloud-compose-collaboration-1  Started                          0.6s 

На данном этапе первичная настройка завершена.

Настройка Nginx Proxy Manager

Предварительно необходимо:

  • внести A-записи oc.domain.ru, oo.oc.domain.ru, wopi.oc.domain.ru у хостера DNS, которые указывают на публичный статичный IP провайдера
  • реализовать форвардинг на роутере в сторону IP адреса Nginx Proxy Manager
  • создать отдельный Access List

Внесение A-записей

Отличается в зависимости от хостера, для примера инструкция Beget

Форвардинг на NPM

Зависит от роутера, для примера TP-Link Omada

Access List

В данном примере веб-интерфейс NPM находится по адресу http://proxy.home.lan, публичный IP 1.2.3.4.

Перейти по http://proxy.home.lan/nginx/access. Справа сверху нажать кнопку Add Access List. На вкладке Detail в поле Name задать имя, например 'Local plus static ext IP'. На вкладке Access с помощью кнопки Add добавить записи:

allow   192.168.0.1/16
allow   1.2.3.4/32
deny    all (добавляется автоматически по умолчанию)

Нужно добавить хосты и получить валидные SSL-сертификаты (domain.ru заменить на свой):

Хост Протокол Адрес Порт Cache assets Websockets support Block common exploits Access list SSL/Force SSL SSL/HTTP/2 Support
oc.domain.ru http <docker ip> 9200 On On Off Publicly Accessible On On
oo.oc.domain.ru http <onlyoffice ds ip> 80 On On Off Local plus static ext IP On On
wopi.oc.domain.ru http <docker ip> 9300 On On Off Local plus static ext IP On On

<docker ip> - хост, на котором запущен Docker с OpenCloud <onlyoffice ds> - хост, на котором запущен OnlyOffice Document Server в LXC

После этих настроек должно быть следующее:

  • должен быть доступен OpenCloud по адресу oc.domain.ru
  • по адресам oo.oc.domain.ru & wopi.oc.domain.ru должно отдаваться 403 Forbidden
  • работает OnlyOffice Document Server, т.е. имеется возмжность создавать и редактировать документы в браузере

Если не отображаются PDF файлы, то стоит попробовать изменить настройки расширения uBlock Origin для сайта, если таковой имеется.

Подготовка хранилища

На данном этапе все данные хранятся в docker volumes, что не очень удобно. В данном примере рассмотрена настройка на ZFS на хосте.

Создаем отдельный вложенный датасет OpenCloud в датасете Storage, присваиваем нужные права на хосте PVE и пробрасываем в контейнер с docker (в данном случае он имеет ID 103):

zfs create Storage/OpenCloud
chown -R 101000:110000 /Storage/OpenCloud
pct set 103 -mp0 /Storage/OpenCloud/,mp=/mnt/opencloud

После чего в контейнере 103 вносим изменения в файл .env (необходимо раскомментировать эти переменные и задать им значения):

OC_CONFIG_DIR=/mnt/opencloud/config/
OC_DATA_DIR=/mnt/opencloud/data/

Перезапустить контейнеры той же командой, которой запускали в первый раз:

docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml up -d

После первого запуска будут созданы директории config & data, но будет ошибка полномочий:

root@docker:~/opencloud-compose# docker compose logs -f
opencloud-1 exited with code 1
opencloud-1  | 2025/09/16 09:16:44 Could not create config: open /etc/opencloud/opencloud.yaml: permission denied
opencloud-1  | The jwt_secret has not been set properly in your config for opencloud. Make sure your /etc/opencloud config contains the proper values (e.g. by using 'opencloud init --diff' and applying the patch or setting a value manually in the config/corresponding environment variable).

Нужно остановить контейнеры:

docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml down

На хосте PVE еще раз присвоить владельца и группу (это id root внутри docker):

chown -R 101000:110000 /Storage/OpenCloud

Повторно запустить контейнеры и проверить логи:

docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml up -d
docker compose logs -f

Далее нужно зайти на oc.domain.ru, загрузить файл 'file-sample_150kB.pdf' для теста и проверить на хосте, что он появился:

root@pve:/# find /Storage/OpenCloud/data/ -name "file-sample_150kB.pdf"
/Storage/OpenCloud/data/storage/users/users/47a79e02-f54d-495f-9b8b-cd122717eace/file-sample_150kB.pdf

Далее можно удалить теперь уже ненужные docker volumes:

root@docker:~/opencloud-compose# docker volume rm opencloud-compose_opencloud-config opencloud-compose_opencloud-data
opencloud-compose_opencloud-config
opencloud-compose_opencloud-data

Наверняка есть более правильный и удобный способ добиться желаемого меньшим количеством приседаний, если кто-то знает - просьба сообщить :)

Установка расширений

Расширения находятся в отдельном репозитории.

Заходим в Releases https://github.com/opencloud-eu/web-extensions/releases и находим нужное расширение. Для примера возьмем https://github.com/opencloud-eu/web-extensions/releases/tag/unzip-v1.0.2

Копируем ссылку https://github.com/opencloud-eu/web-extensions/releases/download/unzip-v1.0.2/unzip-1.0.2.zip на unzip-1.0.2.zip

На хосте docker в директории opencloud-compose скачиваем и распаковываем в соответствующую директорию расширение и перезапускаем контейнеры:

wget -q -O tmp.zip https://github.com/opencloud-eu/web-extensions/releases/download/unzip-v1.0.2/unzip-1.0.2.zip && unzip tmp.zip -d config/opencloud/apps && rm tmp.zip
docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml down
docker compose -f docker-compose.yml -f weboffice/oo.yml -f external-proxy/opencloud.yml -f external-proxy/oo.yml up -d

Для теста в OpenCloud загружаем этот же архив unzip-1.0.2.zip и проверяем, что при нажатии правой кнопки мыши появился пункт меню Extract here.

По аналогии устанавливаем другие расширения, изменяя адрес в команде wget.

Некоторые расширения (например, external-sites) требуют конфигурации после установки. После распаковки архива нужно изменить файл настроек с помощью nano config/opencloud/apps/external-sites/manifest.json, пользуясь документацией к расширению

virtualization/lxc/openloud.1758016757.txt.gz · Последнее изменение: ape364