OpenCloud

OpenCloud

apps.detail.types.app from junkerderprovinz's Repository

apps.detail.sections.overview

OpenCloud - a modern, self-hosted file sync and share platform (a lightweight OpenCloud/ownCloud-family server) - packaged as a genuine one-click Unraid app. The official OpenCloud image has no PUID/PGID support and needs a manual init step, so a fresh install normally fails with "permission denied". This wrapper fixes that: it runs the one-time init for you, heals the appdata permissions and runs as your chosen PUID/PGID (99/100 = nobody/users by default). What's pre-configured: • One-click: auto-runs 'opencloud init' on first boot, then the server - nothing to do on the console. • Permission heal: root-created appdata folders are handed to your PUID/PGID automatically. • Serves HTTPS itself on port 9200 (self-signed by default) - no reverse proxy required. • Two channels via the Repository tag: :production (default, stable) and :rolling (newest features). Getting started: • Set an Admin Password below - it is applied on the first start. Log in as user "admin". • FIRST START takes a moment: the container generates its config and a self-signed certificate. Wait for the "OPENCLOUD IS READY" banner in the container log, then open the WebUI. • Open the WebUI at https://[IP]:9200 and accept the self-signed certificate once. Notes: • Public URL: Unraid does NOT auto-fill the "Public URL" field. Set it to https://YOUR-SERVER-IP:9200 (your Unraid LAN IP), or your external https URL behind a reverse proxy. Leaving the placeholder lets the container guess its own IP so it still starts, but client logins only work reliably once it is correct. • Storage driver: keep it on 'posix' (the default). A blank driver or the unsupported 'local' driver makes files show up but stay greyed out (not openable/downloadable). The Data folder must sit on a filesystem with extended-attribute support - the Unraid array and cache/pool disks have it; if files stay greyed out on an exotic share, move Data to a normal appdata/cache-backed path. • Use a FRESH, empty Data folder. Do NOT point Data at an old OpenCloud/oCIS data directory: the on-disk layout differs between versions and the storage backends (local vs S3) are not interchangeable, so the server crash-loops (symptom in the log: search 'cannot open index, metadata missing'). There is no in-place migration between storage backends - to keep old files, start fresh and re-upload them. • Rolling channel: change the Repository tag from ':production' to ':rolling' to track the newest OpenCloud builds. Keep your appdata backed up before switching. • Reverse proxy: if you terminate TLS in front of OpenCloud, set "OpenCloud terminates TLS" to 'false' (advanced) and set the Public URL to your external https URL (e.g. https://cloud.example.com). Then "Allow self-signed TLS" can be 'false'. Your proxy must connect to the container over plain HTTP on port 9200 (not HTTPS) once "OpenCloud terminates TLS" is 'false'. • PUID/PGID default to 99/100 (nobody/users on Unraid). S3 object storage (optional, advanced): • OpenCloud can store file BLOBS in any S3-compatible bucket (MinIO, AWS, Backblaze B2, Wasabi). Set the "Storage driver" to 'decomposeds3' and fill the S3 endpoint / region / access key / secret key / bucket fields. Keep the driver on 'posix' (the default) for normal local storage - do NOT leave it blank. • IMPORTANT: only the file blobs go to S3. The file-tree METADATA always stays on the local Data volume - so that volume is required even with S3 and MUST be backed up. Losing it orphans your S3 objects (they are opaque IDs with no folder structure). • OpenCloud does NOT use a database (no MySQL/Postgres) - do not look for one. State lives in the local metadata tree plus an embedded message bus. How to get the S3 bucket + keys: • Bucket (MinIO): in the MinIO console click "Create Bucket" (top left), name it e.g. 'opencloud' - that is your bucket name. It must exist BEFORE first start; the container does not create it. • Keys (MinIO): the current MinIO Community Edition console has NO "Access Keys" page - only the object browser. Two ways to get an access/secret key: (a) EASIEST - just use your MinIO ROOT credentials directly: access key = MINIO_ROOT_USER, secret key = MINIO_ROOT_PASSWORD (the values you set on your MinIO container; check its Docker template). (b) CLEANER - create a dedicated, revocable service account with the mc CLI: run 'mc alias set my http://MINIO-IP:9000 ROOT-USER ROOT-PASS' then 'mc admin user svcacct add my ROOT-USER' - it prints a fresh Access Key + Secret Key. • Endpoint (MinIO): use the S3 API URL http://MINIO-IP:9000 (port 9000 - the API, not the 9001 web console) and region 'default'. • AWS S3 / Backblaze B2 / Wasabi: create a bucket in the provider console, then create an access key (AWS: IAM access key; B2/Wasabi: an application/API key). Use the provider's https endpoint and the bucket's region. • If uploads fail with a checksum error on a non-AWS endpoint, add STORAGE_USERS_DECOMPOSEDS3_PUT_OBJECT_DISABLE_CONTENT_SHA256=true as an extra variable. Source on GitHub: https://github.com/junkerderprovinz/opencloud This is an independent, community-maintained packaging of OpenCloud and is not affiliated with OpenCloud GmbH.

OpenCloud

Build  Lint  Docker Pulls  Image Size  Arch  OpenCloud  Unraid  License: AGPL-3.0


A plug-and-play Docker image that turns the official OpenCloud server into a genuine one-click Unraid app: it runs the required first-boot init for you, heals the appdata permissions and honours Unraid's PUID/PGID — no console, no chown, no config-file editing required.


Buy me a coffee


Table of Contents

  1. Overview
  2. Quick Start
  3. Configuration
  4. Production vs Rolling
  5. How the Wrapper Works
  6. Reverse Proxy
  7. Building Locally
  8. Updating
  9. Troubleshooting
  10. Architecture
  11. Contributing / License
  12. License
  13. Support this project

1. Overview

OpenCloud is a modern, self-hosted file sync-and-share platform (an actively developed member of the ownCloud/Infinite-Scale family). The official opencloudeu/opencloud image is excellent, but it is not built for a one-click NAS install:

  • it runs its binary as a fixed UID with no PUID/PGID support, so on a fresh Unraid box the root-owned bind mounts make the very first boot fail with "permission denied" writing /etc/opencloud/opencloud.yaml and /var/lib/opencloud/nats;
  • it requires a one-time opencloud init to be run by hand before opencloud server will start.

This image is a thin wrapper around the official one that fixes exactly those two things and nothing else:

  • Auto-init — runs opencloud init once on first boot (idempotent on later boots).
  • Permission heal — creates the config/data dirs and hands them to your PUID:PGID, and repairs a previously root-owned tree once (sentinel-guarded, so it never recursively re-chowns your whole data set on every start).
  • PUID / PGID — drops privileges to Unraid's nobody:users (99:100) by default via a static gosu.
  • Two channels:production (stable, default) and :rolling (newest builds), from the same wrapper.
  • Multi-arch — amd64 and arm64.

The wrapper does not fork, patch or repackage OpenCloud itself — it layers a tiny entrypoint on top of the unmodified upstream image, so you always run real, current OpenCloud.

OpenCloud web UI — the file browser
The OpenCloud web UI: your personal space with files, folders and spaces.

OpenCloud sign-in page
Sign in as admin with the password you set in the Unraid template.


2. Quick Start

Step 1 — Install the template

On Unraid: Apps → search for OpenCloudInstall. The Community Applications template is published from the unraid-apps feed.

To load it by hand:

mkdir -p /boot/config/plugins/dockerMan/templates-user && \
curl -fsSL -o /boot/config/plugins/dockerMan/templates-user/my-OpenCloud.xml \
  https://raw.githubusercontent.com/junkerderprovinz/unraid-apps/main/opencloud/opencloud.xml

Step 2 — Set the admin password and paths

In the template, the only field you must set is Admin Password (IDM_ADMIN_PASSWORD) — it becomes the password for the built-in admin user on first start. The two volumes default to /mnt/user/appdata/opencloud/{config,data}; adjust the data path to a share with room to grow.

Step 3 — Start and wait for the banner

Hit Apply. The first start takes a moment while the container generates its config and a self-signed certificate. Watch the container log for:

  OpenCloud
  OPENCLOUD IS READY

Step 4 — Open the WebUI

Open https://<unraid-ip>:9200/ and accept the self-signed certificate once. Log in as admin with the password you set.

Plain Docker (no Unraid)
docker run -d \
  --name opencloud \
  --restart unless-stopped \
  -p 9200:9200 \
  -e PUID=99 -e PGID=100 \
  -e IDM_ADMIN_PASSWORD='change-me-please' \
  -e OC_URL='https://192.168.1.10:9200' \
  -e OC_INSECURE=true \
  -v /mnt/user/appdata/opencloud/config:/etc/opencloud \
  -v /mnt/user/appdata/opencloud/data:/var/lib/opencloud \
  junkerderprovinz/opencloud:production

Set OC_URL to how clients reach the server (its IP:port, or your proxied hostname).


3. Configuration

Variable Default Description
IDM_ADMIN_PASSWORD (required) Password for the built-in admin user — applied on first init. Set this.
OC_URL https://192.168.1.10:9200 Required. Public URL clients use to reach OpenCloud, and the OIDC login issuer — must be https. Set your server's real LAN IP:9200, or your external hostname behind a reverse proxy. Unraid does not auto-fill this.
OC_INSECURE true Accept the container's self-signed cert. Set false when a proxy provides a valid cert.
OC_LOG_LEVEL info Log verbosity — info, warn, error, debug.
IDM_CREATE_DEMO_USERS false Seed demo users (test only — unsafe for real use).
PROXY_TLS true OpenCloud terminates TLS itself on 9200. Set false behind a TLS-terminating proxy (see §6).
PUID 99 User ID OpenCloud runs as — Unraid's nobody.
PGID 100 Group ID — Unraid's users.
Port Purpose Volume Purpose
9200 HTTPS WebUI / API (self-signed by default) /etc/opencloud Config (opencloud.yaml + secrets)
/var/lib/opencloud Data — user files, index, nats bus

No database. OpenCloud is not Nextcloud — it has no MySQL/Postgres and needs none. State lives in the local storage tree on the /var/lib/opencloud volume plus an embedded NATS bus. Don't add a database container; there's nothing to point it at.

Files show up but are greyed out / won't open? The storage driver is wrong. Keep STORAGE_USERS_DRIVER=posix (the default) — never leave it blank and never use local; both leave files visible but unreadable. Also make sure the Data volume is on a filesystem with extended-attribute support (the Unraid array and cache/pool disks have it). The driver is fixed at first init — to change it, start with a fresh Data folder.


S3 object storage (optional)

OpenCloud can keep file blobs in any S3-compatible bucket (MinIO, AWS S3, Backblaze B2, Wasabi) while the metadata stays local. Set the storage driver to decomposeds3 and add the connection variables. Keep the driver on posix (the default) for normal local storage — do not leave it blank.

Variable Example Description
STORAGE_USERS_DRIVER decomposeds3 Set to decomposeds3 for S3 blob storage. Default is posix (local) — never leave it blank or use local, both grey out files.
STORAGE_USERS_DECOMPOSEDS3_ENDPOINT http://192.168.1.10:9000 S3 endpoint. Internal http:// URL for self-hosted MinIO; the provider's https:// endpoint for AWS/B2/Wasabi.
STORAGE_USERS_DECOMPOSEDS3_REGION default default for most MinIO installs; the provider region (us-east-1, …) otherwise.
STORAGE_USERS_DECOMPOSEDS3_ACCESS_KEY Access key ID.
STORAGE_USERS_DECOMPOSEDS3_SECRET_KEY Secret access key.
STORAGE_USERS_DECOMPOSEDS3_BUCKET opencloud Bucket name — create it first, the container does not.

Where those values come from:

  • MinIO (self-hosted). In the MinIO console click Create Bucket (top left) and name it (e.g. opencloud) — that is your bucket name. The current MinIO Community Edition console has no Access Keys page (only the object browser), so for the keys either:

    • Easiest: use your MinIO root credentials directly — access key = MINIO_ROOT_USER, secret key = MINIO_ROOT_PASSWORD (the values you set on your MinIO container; check its Docker template).
    • Cleaner (dedicated, revocable key): create a service account with the mc CLI — mc alias set my http://<minio-ip>:9000 <root-user> <root-pass> then mc admin user svcacct add my <root-user>, which prints a fresh Access Key + Secret Key.

    Point the endpoint at the API port http://<minio-ip>:9000 (not the 9001 console) with region default.

  • AWS S3 / Backblaze B2 / Wasabi. Create a bucket in the provider console, then create an access key (AWS: an IAM access key; B2/Wasabi: an application/API key). Use the provider's https:// endpoint and the bucket's region.

The metadata always stays local. decomposeds3 puts only the blob bytes in S3; the file tree, xattrs and the blob→object mapping live on /var/lib/opencloud. That volume is therefore required and must be backed up even with S3 — losing it orphans your S3 objects (they are opaque IDs with no folder structure). There is no all-on-S3 mode. OpenCloud's system/metadata store (STORAGE_SYSTEM_DRIVER) stays decomposed (local) and needs no change.

MinIO note: if uploads fail with a checksum error on a non-AWS endpoint, add STORAGE_USERS_DECOMPOSEDS3_PUT_OBJECT_DISABLE_CONTENT_SHA256=true. This wrapper's S3 path is verified end-to-end against MinIO (blob lands in the bucket, metadata on the local volume).


Web office (optional)

OpenCloud can edit documents in the browser, but it ships no office engine: it speaks the WOPI protocol to a separate document-server container. This wrapper wires that up from three template fields (all advanced, default off).

  1. Run a document server (its own container):
    • Euro Office (euro-office) — the sovereign OnlyOffice fork, image ghcr.io/euro-office/documentserver, port 80. Set WOPI_ENABLED=true. There is a one-click Unraid template for it in the junkerderprovinz feed (search Euro Office in Community Applications). OpenCloud itself makes Euro Office the default editor for MS formats (docx/xlsx/pptx).
    • Collabora Online (CODE) (collabora) — image collabora/code, port 9980. A maintained community CA template exists (search Collabora in Community Applications); set its WOPI host allowlist (aliasgroup1 / domain) to your OpenCloud URL. Best for ODF (odt/ods/odp).
    • OnlyOffice Document Server (onlyoffice) — image onlyoffice/documentserver, port 80; set WOPI_ENABLED=true. A community CA template exists.
  2. Point OpenCloud at it: set Web office suite to euro-office, collabora or onlyoffice, Office document server URL to the server's browser-reachable URL, and an Office WOPI secret. For OnlyOffice and Euro Office that secret must equal the document server's JWT secret (JWT_SECRET / EURO_OFFICE_JWT_SECRET); for Collabora it is not required.
  3. Reverse proxy: forward /wopi and /collaboration to OpenCloud on port 9200, and make sure OpenCloud and the document server can reach each other over the network.

Under the hood the wrapper turns on OpenCloud's built-in collaboration service (OC_ADD_RUN_SERVICES=collaboration), sets the COLLABORATION_* variables, registers it as the secure-view/edit handler and exposes the secure-view role. Leave Web office suite on off (the default) if you do not need document editing.

Full-text search (Apache Tika, optional)

OpenCloud already has a built-in search: out of the box it matches file and folder names and metadata (tags, media type, …). It does not look inside file contents on its own. Apache Tika is not a second search engine, it is a text-extractor that OpenCloud's search service uses to read the text out of documents (PDF, Word, Excel, PowerPoint, ODF, …) so a search word inside a file is found too. (The TIKA=:tika.yml / TIKA_IMAGE lines you may have seen belong to OpenCloud's official docker-compose deployment — this Unraid wrapper has no .env; the two template fields below do the wiring instead.)

  1. Run Apache Tika (its own container). Ready-made Tika templates exist in Community Applications (search Tika) — install one (image apache/tika, port 9998; a -full tag additionally does OCR of scanned images). Note its network-reachable address, e.g. http://<TIKA_IP>:9998.
  2. Turn it on: set Full-text search (Tika) to true and Tika server URL to that address, then Apply. The wrapper points OpenCloud's search extractor at Tika and switches full-text search on for you.

Under the hood the wrapper sets SEARCH_EXTRACTOR_TYPE=tika, SEARCH_EXTRACTOR_TIKA_TIKA_URL and FRONTEND_FULL_TEXT_SEARCH_ENABLED=true (plus SEARCH_EXTRACTOR_CS3SOURCE_INSECURE=true for the internal LAN cert). Only files uploaded or changed after this are content-indexed; existing files are not re-indexed automatically, so re-upload or edit a file to test. See the OpenCloud search docs.


4. Production vs Rolling

Two channels are built from this wrapper, differing only in the upstream base image:

Tag Base image For
junkerderprovinz/opencloud:production opencloudeu/opencloud (pinned stable) Default. The stable OpenCloud release line (currently the 7.2.x train).
junkerderprovinz/opencloud:rolling opencloudeu/opencloud-rolling (pinned) Newest OpenCloud releases (currently 7.4.x). Recommended for large-folder sync.

Which channel? The stable :production train moves slowly and, as of 7.2.x, does not yet carry the incremental-fsync fix (reva#720) for the large-folder sync abort on slow storage (issue #3027). That fix ships from 7.3.0, which OpenCloud publishes only on the rolling image. So on array/FUSE-backed appdata, or if you push large folders (tens of GB) from a desktop client, run :rolling. Placing the data volume on a fast SSD/NVMe pool also avoids the stall.

Switch by changing the Repository tag in the Unraid template (:production -> :rolling). Back up your appdata before switching channels. Renovate opens a PR for each new upstream release (you merge it after a look at the release notes), and the weekly rebuild picks up upstream and Alpine security patches.


5. How the Wrapper Works

The entrypoint runs as root only long enough to prepare the volumes, then drops to your user:

  1. Permission heal. Creates /etc/opencloud + /var/lib/opencloud if missing and chowns them to PUID:PGID. The config dir is small and always fully healed; the data dir is only chown -R'd once (or after a PUID/PGID change), tracked by a .uid-heal sentinel — so a large data set is never recursively re-owned on every boot. The nats bus dir is always re-asserted (small, must stay writable).
  2. Init. Runs opencloud init as the target user (writes opencloud.yaml, consuming IDM_ADMIN_PASSWORD). Idempotent — it harmlessly errors once the config exists.
  3. Hand-off. Prints the ready banner, then execs opencloud server dropped to PUID:PGID via a static gosu (copied from the upstream tianon/gosu image — no package manager needed in the base).

6. Reverse Proxy

By default OpenCloud serves HTTPS itself on 9200 with a self-signed certificate — ideal for a direct LAN install. To put it behind a reverse proxy that terminates TLS (Traefik, NGINX Proxy Manager, SWAG, …):

  • set PROXY_TLS=false (OpenCloud then serves plain HTTP for the proxy to wrap),
  • set OC_URL to your external URL, e.g. https://cloud.example.com,
  • set OC_INSECURE=false (your proxy presents a valid certificate),
  • point the proxy upstream at the container's port 9200.

Desktop or mobile client login returns 403 Forbidden while the browser works? The native clients sign in through a loopback OIDC redirect (redirect_uri=http://127.0.0.1:<port>, per RFC 8252). Many reverse-proxy "block exploits" filters reject a literal http:// inside a query string. In NGINX Proxy Manager this is the "Block Common Exploits" toggle: its block-exploits.conf contains if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 403; }. The web UI avoids it (its redirect is URL-encoded), the desktop client trips it (plain http:// loopback). Switch that toggle off for the OpenCloud host and the client login succeeds. OpenCloud brings its own auth and CSRF protection, so the crude regex filter is redundant here.


7. Building Locally

git clone https://github.com/junkerderprovinz/opencloud.git
cd opencloud

# production channel (default base pin)
docker build -t opencloud:dev .

# rolling channel (reads the BASE_ROLLING pin from the Dockerfile)
docker build --build-arg BASE="$(grep -oE 'ARG BASE_ROLLING=[^[:space:]]+' Dockerfile | cut -d= -f2)" -t opencloud:rolling .

# multi-arch (amd64 + arm64) — needs buildx
docker buildx build --platform linux/amd64,linux/arm64 -t opencloud:dev --load .

just recipes mirror the CI flows — just build, just build-rolling, just smoke, just lint.


8. Updating

docker pull junkerderprovinz/opencloud:production
docker stop opencloud && docker rm opencloud
# re-create with the same template / docker run args

On Unraid: Docker tab → the container → Force Update. Your /etc/opencloud and /var/lib/opencloud are untouched. The image is rebuilt weekly for upstream OpenCloud and Alpine patches.


9. Troubleshooting

Crash loop with search: cannot open index, metadata missing

The container starts, heals ownership, then crash-loops and the WebUI never comes up. This means the Data volume is pointing at a non-fresh OpenCloud/oCIS data directory — an old install, or a data set created with a different storage backend (local vs S3). The layouts are not interchangeable and there is no in-place migration between backends, so the search service can't open its index and takes the whole server down.

Fix: give it a fresh, empty Data folder. Move the old directory aside (mv /mnt/user/opencloud /mnt/user/opencloud.old) and let a new empty one be created, then restart. To keep old files, start fresh and re-upload them through the web UI. This is not a bug in the wrapper or the image — a clean data dir boots normally, S3 included.

Large-folder sync from the desktop client stalls or aborts

Syncing a large folder (tens of GB) from the desktop client stalls partway and the client connection just drops. The cause is slow fsync on the Data volume, not the network. The Data volume holds the embedded NATS message bus, the file-tree metadata and the transient upload staging, all of them fsync-heavy. On slow storage (the Unraid array, or any /mnt/user share through the shfs FUSE union) the fsync storm freezes, postprocessing fails and the server drops the client (upstream issue #3027).

Fix: put the Data volume on a fast SSD/NVMe pool, not the array. With a decomposeds3/S3 backend only this small metadata volume needs fast storage (the file blobs go to your S3 bucket, so it stays small and grows with file count, not size). The reva incremental-fsync change (reva#720) also helps and ships from OpenCloud 7.3.0, which is on the :rolling channel (§4).

First start seems stuck / WebUI not reachable yet

The first boot runs opencloud init and generates a self-signed certificate — give it a moment. Watch the log for the OPENCLOUD IS READY banner, then open https://<ip>:9200/.

Browser warns about the certificate

That is expected with the default self-signed certificate (OC_INSECURE=true). Accept it once, or put OpenCloud behind a reverse proxy with a real certificate (see §6).

"permission denied" in the log

The wrapper heals ownership on start, but a data set created earlier as a different user can need a one-time repair. Stop the container, delete /var/lib/opencloud/.uid-heal, and start again to force a full re-chown to your PUID:PGID.

I forgot / want to change the admin password

IDM_ADMIN_PASSWORD is read on every start and overrides the stored admin password, so just set it in the template and restart.

Login loops or "redirect URI" errors behind a proxy

OC_URL must exactly match the URL in your browser (scheme + host + port). Set OC_URL to your external https URL and PROXY_TLS=false (see §6).


10. Architecture

┌──────────────────────────────────────────────────────────────┐
│  opencloudeu/opencloud[:production] | opencloud-rolling        │
│  (Alpine base + the OpenCloud binary, unmodified)             │
│  ┌────────────────────────────────────────────────────────┐  │
│  │  entrypoint.sh  (runs as root)                          │  │
│  │   ↓ mkdir + chown /etc/opencloud, /var/lib/opencloud    │  │
│  │   ↓ one-time data heal (sentinel-guarded)               │  │
│  │   ↓ gosu PUID:PGID  opencloud init  (|| true)           │  │
│  │   ↓ print "OPENCLOUD IS READY" banner                   │  │
│  │   ↓ exec gosu PUID:PGID  opencloud server               │  │
│  └────────────────────────────────────────────────────────┘  │
│      static gosu  ← COPY --from=tianon/gosu (multi-stage)     │
└──────────────────────────────────────────────────────────────┘

11. Contributing / License

Pull requests welcome. Issues: https://github.com/junkerderprovinz/opencloud/issues.

Licensing — dual:

  • This wrapper repository (Dockerfile, entrypoint.sh, print-banner.sh, Unraid template, README and banner/icon artwork) is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).
  • OpenCloud itself and the bundled gosu binary are Apache-2.0; the Alpine base and its packages keep their own licenses. When you run, redistribute or rebuild the resulting image you must comply with all of those, not only this wrapper's AGPL-3.0 license. See NOTICE.

The OpenCloud logo and wordmark are the property of OpenCloud GmbH, used unmodified to identify the upstream project. This is an independent, community-maintained packaging and is not affiliated with or endorsed by OpenCloud GmbH.

Credits

  • OpenCloud — the file sync-and-share platform this image wraps
  • gosu — clean, static privilege-drop for the entrypoint

12. License

Copyright (C) 2026 Junker der Provinz.

This repository packages OpenCloud as a container for Unraid. The packaging in this repository (Dockerfile, scripts, theme, web assets and everything else original here) is free software under the GNU Affero General Public License v3.0 (AGPL-3.0); see LICENSE. If you distribute it, or run a modified version as a network service, you must release your source under the same AGPL-3.0 terms and keep the existing copyright and attribution notices intact.

Scope. The AGPL applies to this repository's own code and assets. OpenCloud itself is a separate project under its own license and name; this repository does not claim it. The banner, logo, theme and other branding original to this repository remain reserved: a fork must use its own branding and may not present itself as this project.


13. Support this project

If this template saves you a setup hassle or a debug night, consider buying me a coffee:

Buy me a coffee

apps.marketingCta.appInstallTitle

apps.marketingCta.appInstallDescription

apps.installHelp.stepOpen apps.installHelp.stepSearchApp apps.installHelp.stepReview apps.installHelp.stepInstall

apps.detail.sections.categories

apps.downloadStats.title

1,203
apps.downloadStats.metrics.totalDownloads

apps.detail.sections.related

apps.detail.sections.details

apps.detail.details.repository
junkerderprovinz/opencloud:production
apps.detail.details.lastUpdated2026-07-27
apps.detail.details.firstSeen2026-07-28

apps.detail.sections.runtime

apps.detail.details.webui
https://[IP]:[PORT:9200]/
apps.detail.details.network
bridge
apps.detail.details.shell
sh
apps.detail.details.privileged
false
apps.detail.details.extraParams
--restart=unless-stopped

apps.detail.sections.configuration

WebUI PortPorttcp

HTTPS port of the OpenCloud WebUI / API (self-signed cert by default). Open https://[IP]:9200 and accept the certificate once.

apps.detail.config.target
9200
apps.detail.config.default
9200
apps.detail.config.value
9200
ConfigPathrw

Persistent OpenCloud configuration (opencloud.yaml + generated secrets). Created and initialised on first start.

apps.detail.config.target
/etc/opencloud
apps.detail.config.default
/mnt/user/appdata/opencloud/config
apps.detail.config.value
/mnt/user/appdata/opencloud/config
DataPathrw

Persistent OpenCloud data: file-tree metadata, the search index, the internal NATS message bus and transient upload staging (plus the file blobs, unless you use an S3/decomposeds3 backend). IMPORTANT: this volume is fsync-heavy, so keep it on a FAST SSD/NVMe pool. The default appdata path is fine only if your appdata is cache-backed (the usual Unraid setup); do NOT point it at the array or a slow /mnt/user share, or large-folder syncs from the desktop client will stall and abort (upstream issue #3027). With decomposeds3/S3 only this small metadata volume needs to be fast; the file blobs go to your S3 bucket, so this stays small and does not grow with file size (only with file count).

apps.detail.config.target
/var/lib/opencloud
apps.detail.config.default
/mnt/user/appdata/opencloud/data
apps.detail.config.value
/mnt/user/appdata/opencloud/data
Admin PasswordVariable

Password for the built-in 'admin' user. REQUIRED. Applied on the first start (during init). Choose a strong value - this is the login for your whole cloud.

apps.detail.config.target
IDM_ADMIN_PASSWORD
Public URLVariable

REQUIRED. The URL clients use to reach OpenCloud, and the login (OIDC) issuer. Unraid does NOT auto-fill this: replace YOUR-SERVER-IP with your Unraid server's LAN IP, e.g. https://192.168.1.10:9200 (keep the https:// and the :9200 port). Behind a reverse proxy set your external https URL instead, e.g. https://cloud.example.com. Must be https. If you leave the placeholder, the container falls back to its own IP so it still boots, but client logins may not work until you set the real address.

apps.detail.config.target
OC_URL
apps.detail.config.default
https://YOUR-SERVER-IP:9200
apps.detail.config.value
https://YOUR-SERVER-IP:9200
Allow self-signed TLSVariable

'true' (default) accepts the container's self-signed certificate - correct for a direct Unraid install. Set 'false' when a reverse proxy provides a valid certificate.

apps.detail.config.target
OC_INSECURE
apps.detail.config.default
true|false
apps.detail.config.value
true
Log LevelVariable

Verbosity of the container log.

apps.detail.config.target
OC_LOG_LEVEL
apps.detail.config.default
info|warn|error|debug
apps.detail.config.value
info
Create Demo UsersVariable

'true' seeds a set of demo users (alan, mary, ...) with well-known passwords - handy for testing, unsafe for real use. Keep 'false' for a real deployment.

apps.detail.config.target
IDM_CREATE_DEMO_USERS
apps.detail.config.default
false|true
apps.detail.config.value
false
OpenCloud terminates TLSVariable

'true' (default) = OpenCloud serves HTTPS itself on 9200 (self-signed) - correct for a direct Unraid install. Set 'false' when a reverse proxy terminates TLS in front of the container; then also set the Public URL to your external https URL and 'Allow self-signed TLS' to 'false'.

apps.detail.config.target
PROXY_TLS
apps.detail.config.default
true|false
apps.detail.config.value
true
User IDVariable

User-ID OpenCloud runs as. Default 99 (nobody on Unraid). The wrapper heals appdata ownership to match on start.

apps.detail.config.target
PUID
apps.detail.config.default
99
apps.detail.config.value
99
Group IDVariable

Group-ID. Default 100 (users on Unraid).

apps.detail.config.target
PGID
apps.detail.config.default
100
apps.detail.config.value
100
Storage driverVariable

How OpenCloud stores your files. Keep 'posix' (the default) for a normal local install - files live on the Data volume. Choose 'decomposeds3' ONLY to keep file blobs in an S3 bucket (then fill the five S3 fields below); even then the metadata tree stays on the local Data volume and must be backed up. Do NOT leave this blank and never type 'local' - both break file access (files appear but are greyed out and cannot be opened or downloaded). The driver is fixed at first start; to change it, start with a fresh Data folder.

apps.detail.config.target
STORAGE_USERS_DRIVER
apps.detail.config.default
posix|decomposeds3
apps.detail.config.value
posix
S3 endpointVariable

S3 API endpoint URL. Self-hosted MinIO: the internal http URL on the API port 9000, e.g. http://192.168.1.10:9000 (NOT the 9001 console port). AWS/B2/Wasabi: their https endpoint. Only used when the driver above is 'decomposeds3'.

apps.detail.config.target
STORAGE_USERS_DECOMPOSEDS3_ENDPOINT
S3 regionVariable

Bucket region. Use 'default' for most MinIO installs, or your provider's region (e.g. eu-central-1) for AWS/B2/Wasabi. Only used with the 'decomposeds3' driver.

apps.detail.config.target
STORAGE_USERS_DECOMPOSEDS3_REGION
apps.detail.config.default
default|us-east-1|us-east-2|us-west-1|us-west-2|eu-central-1|eu-west-1|eu-west-2|eu-north-1|ap-southeast-1|ap-southeast-2|ap-northeast-1|ca-central-1|sa-east-1
apps.detail.config.value
default
S3 access keyVariable

Access key ID for the bucket. MinIO Community Edition has no Access Keys page in the console, so the easiest key is your MinIO ROOT user (MINIO_ROOT_USER, set on your MinIO container). For a dedicated key use the mc CLI: 'mc admin user svcacct add my ROOT-USER'. AWS: an IAM access key; B2/Wasabi: an application/API key.

apps.detail.config.target
STORAGE_USERS_DECOMPOSEDS3_ACCESS_KEY
S3 secret keyVariable

The secret that pairs with the access key. If you use MinIO root creds, this is your MINIO_ROOT_PASSWORD; if you made an mc service account, it is printed once when you create it. Stored masked.

apps.detail.config.target
STORAGE_USERS_DECOMPOSEDS3_SECRET_KEY
S3 bucketVariable

Name of the S3 bucket to store blobs in. Create it FIRST - the container does not. MinIO: console -&gt; Buckets -&gt; Create Bucket. AWS/B2/Wasabi: create a bucket in the provider console. Enter that exact name here.

apps.detail.config.target
STORAGE_USERS_DECOMPOSEDS3_BUCKET
Web office suiteVariable

Browser document editing. 'off' (default) = none. 'collabora' = Collabora Online / CODE (port 9980); 'onlyoffice' = OnlyOffice Document Server; 'euro-office' = Euro Office, the sovereign OnlyOffice fork (image ghcr.io/euro-office/documentserver). The editor itself ALWAYS runs as a SEPARATE container that you install and point to below - this only turns on OpenCloud's built-in WOPI service and wires it up. For OnlyOffice and Euro Office the WOPI secret below MUST equal the document server's JWT secret. See the README 'Web office' section for the document-server setup and reverse-proxy notes.

apps.detail.config.target
OFFICE
apps.detail.config.default
off|collabora|onlyoffice|euro-office
apps.detail.config.value
off
Office document server URLVariable

Browser-reachable URL of your Collabora / OnlyOffice document-server container, e.g. https://collabora.example.com (or http://192.168.1.10:9980 on a plain LAN). Only used when 'Web office suite' is not 'off'.

apps.detail.config.target
OFFICE_SERVER_URL
Office WOPI secretVariable

A shared secret used to sign the WOPI tokens. Pick any long random string. For OnlyOffice and Euro Office this MUST match the document server's JWT secret (its JWT_SECRET / EURO_OFFICE_JWT_SECRET). For Collabora it is not required. Only used when 'Web office suite' is not 'off'.

apps.detail.config.target
OFFICE_WOPI_SECRET
Full-text search (Tika)Variable

Search inside file CONTENTS (PDF, Word, Excel, ...), not just file names. 'false' (default) = OpenCloud's normal name/metadata search. 'true' = content search via Apache Tika. Tika ALWAYS runs as a SEPARATE container that you install and point to below: install a Tika template from Community Applications (search 'Tika'), image apache/tika, port 9998 (a '-full' tag also OCRs scanned images). NOTE: only files uploaded or changed AFTER you enable this are content-indexed; existing files are not re-indexed automatically (re-upload or edit them). See the README 'Full-text search' section.

apps.detail.config.target
FULLTEXT_SEARCH
apps.detail.config.default
false|true
apps.detail.config.value
false
Tika server URLVariable

Network-reachable URL of your Apache Tika container, e.g. http://192.168.1.10:9998. Only used when 'Full-text search (Tika)' is 'true'.

apps.detail.config.target
TIKA_URL