Описан вариант реализации:
/StorageДля создания нового 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 нужно клонировать репозиторий 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
На данном этапе первичная настройка завершена.
Предварительно необходимо:
Отличается в зависимости от хостера, для примера инструкция Beget
Зависит от роутера, для примера TP-Link Omada
В данном примере веб-интерфейс 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
После этих настроек должно быть следующее:
Если не отображаются 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, пользуясь документацией к расширению