diff --git a/.env.example b/.env.example index fe4bb8b..5b462d6 100644 --- a/.env.example +++ b/.env.example @@ -22,6 +22,12 @@ ONLYOFFICE_PROJECT_ID=33 # oo mails uses ONLYOFFICE_URL/USER/PASS above (Workspace Mail addon). +# deploy/docker-compose.rclone-webdav.yml — rclone FUSE mount of the oo-webdav +# sidecar. Reuses ONLYOFFICE_USER and accepts ONLYOFFICE_PASSWORD (alias +# ONLYOFFICE_PASS). Set ONLYOFFICE_WEBDAV_URL only if the sidecar is not on +# the default docker bridge address. See docs/rclone-webdav.md. +# ONLYOFFICE_WEBDAV_URL=http://172.17.0.1:8098/webdav + # cmd/office TUI — optional Document Server for DOCX→HTML preview: # ONLYOFFICE_DOCS_URL=https://docs.example.com # ONLYOFFICE_DOCS_SECRET= diff --git a/deploy/docker-compose.rclone-webdav.yml b/deploy/docker-compose.rclone-webdav.yml new file mode 100644 index 0000000..469bcb1 --- /dev/null +++ b/deploy/docker-compose.rclone-webdav.yml @@ -0,0 +1,70 @@ +# rclone WebDAV mount of the oo-webdav sidecar (OnlyOffice Documents). +# +# The sidecar publishes the portal's WebDAV tree on the docker bridge +# (http://172.17.0.1:8098, prefix /webdav). rclone mounts it inside this +# container as a normal filesystem. +# +# Credentials are OnlyOffice portal credentials (the same the `oo` CLI uses). +# Export them before `docker compose up`, e.g. +# set -a; . .secrets/oo.env; set +a +# or copy .env.example to .env and fill it. Only names live in git. +# +# docker compose -f deploy/docker-compose.rclone-webdav.yml up -d +# docker exec rclone-webdav ls /mnt/onlyoffice +# docker compose -f deploy/docker-compose.rclone-webdav.yml down +# +# The mount point is the named volume `onlyoffice-mnt`; join it from another +# container with `external_volumes` to read the tree without the API. +name: rclone-webdav + +services: + rclone-webdav: + image: rclone/rclone:latest + container_name: rclone-webdav + restart: unless-stopped + # rclone mount needs FUSE. The remote is defined on the fly via flags for + # the mount; the same credentials are written to an rclone config so that + # `docker exec rclone-webdav rclone ls webdav:` works without flags. + entrypoint: ["/bin/sh", "-c"] + command: + - | + set -eu + : "$${ONLYOFFICE_USER:?ONLYOFFICE_USER is required}" + : "$${ONLYOFFICE_PASSWORD:?ONLYOFFICE_PASSWORD is required}" + obscured=$$(rclone obscure "$${ONLYOFFICE_PASSWORD}") + mkdir -p /config/rclone + cat > /config/rclone/rclone.conf < '/mnt/onlyoffice/Meine Dokumente/rclone-smoke-$TS/hello.txt'" +# ждём появления на сервере (host HTTP, мимо монтирования): +GET /webdav/Meine%20Dokumente/rclone-smoke-$TS/hello.txt -> 200 (через 7s) +server bytes: rclone-webdav round-trip 20260916-212459 +# читаем обратно через монтирование: +mount read: rclone-webdav round-trip 20260916-212459 +MATCH: yes + +$ docker exec rclone-webdav rm -f \ + "/mnt/onlyoffice/Meine Dokumente/rclone-smoke-$TS/hello.txt" +GET /webdav/Meine%20Dokumente/rclone-smoke-$TS/hello.txt -> 404 (через 1s) + +# пустой каталог: rmdir через монтирование на сервер не доходит, +# удаляем напрямую: +$ docker exec rclone-webdav rclone rmdir "webdav:Meine Dokumente/rclone-smoke-$TS" +PROPFIND rclone-smoke-20260916-212459/ -> 404 +no rclone-smoke leftovers +``` + +Вывод: запись → чтение → удаление файла подтверждены. Файл удалён. + +## Ограничения + +- Нужен FUSE: `SYS_ADMIN` + `/dev/fuse`. На хосте без FUSE не поедет. +- Сайдкар слушает docker-bridge `172.17.0.1:8098`, публично не выставлен. + Только localhost/локальные контейнеры. +- Запись идёт через VFS write-back (по умолчанию ~5s). Перед проверкой + «файл на сервере» опрашивать сервер, не доверять сразу после `write`. +- `rmdir` через монтирование НЕ доходит до `oo-webdav` (пустой каталог + остаётся на сервере). Удалять каталоги напрямую: + `rclone rmdir webdav:` или `rclone purge webdav:`. +- VFS-кэш растёт в томе `rclone-cache`; ограничить `--vfs-cache-max-size`. +- Блокировок между редактором OnlyOffice и монтированием нет. Не редактировать + один и тот же файл одновременно. +- Данные не шифруются на диске хоста в `rclone-cache` (том Docker).