All apps · 0 apps
Euro-Office
Docker app from junkerderprovinz's Repository
Overview
Readme
View on GitHub
A plug-and-play Unraid Community Applications template for Euro Office, the sovereign European document server. It edits Word, Excel and PowerPoint files (and their OpenDocument equivalents) in the browser and plugs straight into OpenCloud over WOPI. Install from the Unraid Apps tab, set one shared secret, done.
Maintained solo, in whatever spare time there is. Questions via the support thread, bugs, ideas and feature requests via GitHub issues. If it's useful to you, a coffee is always welcome.
Table of Contents
- What is this?
- Why this image exists
- Features
- Quick Start on Unraid
- Wiring it to OpenCloud
- Configuration
- Updating
- Troubleshooting
- Contributing / License
- Support this project
1. What is this?
Euro Office is a sovereign, European document server for browser-based editing of text documents, spreadsheets and presentations. It is a maintained fork of the OnlyOffice Document Server, so it speaks the same OnlyOffice and WOPI APIs and drops straight into OpenCloud, Nextcloud or ownCloud.
This repository is not a fork of Euro Office. It builds a thin wrapper image
around the upstream
ghcr.io/euro-office/documentserver,
adding exactly one thing: a small supervisor program that repairs the ownership
of the Data volume on boot. Section 2 explains why that is needed. The Unraid
template lives in
unraid-apps
and points at the wrapper image published here.
This is not a standalone app. It is the editor back-end for a file server. On its own it only serves an internal welcome page. You point your cloud (the OpenCloud container) at it, and then edit files that live in that cloud.
2. Why this image exists
The upstream image ships with a real permission bug. The chown -R ds:ds step
that should hand ownership of the Data volume to the ds user, the account
every internal service actually runs as, is commented out in the vendor's own
build. On a freshly bind-mounted Data folder, which is exactly what Unraid
creates, the document server's admin panel and in some configurations editing
itself fail with a permission error.
This image adds one thing to the upstream image and nothing else: a small
supervisor program that re-asserts Data's ownership during the first seconds
of boot, before the ds-* services start. ENTRYPOINT and the vendor's own
entrypoint.sh are untouched. See
unraid-apps#7 for
the report that turned this up.
3. Features
- ✅ Edits .docx / .xlsx / .pptx and .odt / .ods / .odp right in the browser
- ✅ WOPI protocol pre-enabled (
WOPI_ENABLED=true), so OpenCloud can open and save documents - ✅ One shared JWT secret signs every request between cloud and editor
- ✅ Sensible Unraid defaults: HTTP on a mapped port, optional persistence volumes,
--restart=unless-stopped - ✅ Reverse-proxy friendly, terminate TLS in front and hand the editor plain HTTP
- ✅ Bundles its own database and converter, no external services to run
- ✅ AGPL-3.0 wrapper, fork and adapt it under the same license
4. Quick Start on Unraid
This is a plug-and-play Community Applications template. No SSH, no config-file editing.
Step 1: install from Apps
In the Unraid Web UI:
- Go to the Apps tab.
- Search for
Euro Office. - Click Install.
Step 2: set the JWT secret
The template's one required field is the JWT secret. Pick a long random
string and remember it, you will paste the same value into OpenCloud in the
next section. Leave Enable WOPI on true.
Hit Apply. First start pulls the image and warms up the bundled database and converter, this takes a minute or two on the very first boot.
Step 3: wait for the server to be ready
Open a shell and confirm the WOPI discovery endpoint answers with XML:
curl -s http://<unraid-ip>:9900/hosting/discovery | head -c 200
Once that returns an <wopi-discovery> document, the editor is ready. Then wire
it to OpenCloud (next section).
Manual install (pre-CA-listing)
Until this repo is accepted into the Community Applications index, you can load the template by hand. Run this once on the Unraid console or via SSH:
mkdir -p /boot/config/plugins/dockerMan/templates-user && \
curl -fsSL -o /boot/config/plugins/dockerMan/templates-user/my-Euro-Office.xml \
https://raw.githubusercontent.com/junkerderprovinz/unraid-apps/main/euro-office/euro-office.xml
Then in the Unraid Web UI: Docker → Add Container → in the Template dropdown, pick Euro-Office under User templates.
Plain Docker (no Unraid)
docker run -d \
--name euro-office \
--restart unless-stopped \
-p 9900:80 \
-e WOPI_ENABLED=true \
-e JWT_ENABLED=true \
-e JWT_SECRET=change-me-to-a-long-random-string \
ghcr.io/euro-office/documentserver:latest
5. Wiring it to OpenCloud
Euro Office is the editor; OpenCloud is the cloud that stores your files. Connect them in the OpenCloud template:
| OpenCloud field | Value |
|---|---|
| Web office suite | euro-office |
| Office document server URL | http://<euro-office-ip>:9900 (or your reverse-proxy https URL) |
| Office WOPI secret | the same string you set as the JWT secret here |
The two secrets must be identical, that is what lets the cloud and the editor trust each other. After applying both containers, open a document in OpenCloud, it now opens in Euro Office. OpenCloud uses Euro Office for Microsoft formats by default and Collabora for OpenDocument, but Euro Office edits both.
[!TIP] Behind the internet, put Euro Office behind a reverse proxy that terminates TLS (e.g.
https://office.example.com) and use that https URL in OpenCloud. If OpenCloud itself uses a self-signed certificate, set Allow self-signed upstream =trueon this container so the editor can fetch documents from it.
6. Configuration
| Variable | Default | Description |
|---|---|---|
JWT_SECRET |
(required) | Shared secret that signs cloud ↔ editor traffic. Must equal OpenCloud's Office WOPI secret. |
WOPI_ENABLED |
true |
Enables the WOPI protocol OpenCloud uses. Keep true. |
JWT_ENABLED |
true |
Require the signed JWT on every request. Keep true; only disable for isolated LAN testing. |
USE_UNAUTHORIZED_STORAGE |
false |
Set true when the cloud serves a self-signed certificate. |
Ports & Volumes
| Port | Purpose | Volume (optional) | Purpose | |
|---|---|---|---|---|
80 → 9900 |
Document server HTTP / WOPI | /var/www/euro-office/Data |
Keys, fonts cache, forgotten files | |
/var/log/euro-office |
Server logs, leave unmounted, see below | |||
/var/lib/postgresql |
Bundled database, leave unmounted, see below |
Data is optional: for a pure WOPI back-end the editor is effectively stateless
(your documents live in OpenCloud), mount it only to persist the internal cache
across restarts. It is empty inside the image, so a bind mount there hides
nothing.
Logs and Database are different and default to unmounted on purpose. The
image ships both directories pre-built, and a bind mount from an empty host
folder hides what is inside them, which stops the container from starting: over
/var/log/euro-office it hides the log tree nginx writes to, over
/var/lib/postgresql it hides the already-initialised database (see
Troubleshooting for both). Leave them blank unless the
folder already holds a copy of what the image put there. Clearing Logs costs
you nothing, the Unraid log button still shows everything the server prints.
7. Updating
On Unraid: Docker tab → click the container → Force Update. Euro Office
tracks the upstream ghcr.io/euro-office/documentserver:latest image. To pin a
specific version, set an explicit tag in the template's Repository field
(Advanced View).
8. Troubleshooting
Documents won't open in OpenCloud ("error finding app providers" / editor never loads)
- Confirm the discovery endpoint answers:
curl -s http://<ip>:9900/hosting/discovery | headshould return<wopi-discovery>XML. If it times out, the server is still starting, wait a minute after first boot. - The JWT secret here and OpenCloud's Office WOPI secret must be byte-for-byte identical. A mismatch fails silently.
- Make sure OpenCloud's Office document server URL is reachable from the OpenCloud container (use the LAN IP or a resolvable proxy hostname, not
localhost).
"Download failed" when saving, or the editor can't fetch the file
- If OpenCloud uses a self-signed certificate, set Allow self-signed upstream =
true(USE_UNAUTHORIZED_STORAGE=true) on this container. - If you front OpenCloud with a reverse proxy, make sure the URL you gave OpenCloud is the one the editor can actually reach.
First start is slow / high CPU right after boot
- Normal. The bundled database and converter warm up on the first start. It settles once
/hosting/discoveryreturns XML, usually within a minute or two.
Container loops "PostgreSQL ... is not accessible or does not exist" and never starts
- The Database field (Advanced View) has a path in it. The image ships with an already-initialised database baked in; mounting a fresh empty folder over
/var/lib/postgresqlhides it, and the entrypoint has no way to initialise a database in an empty volume (upstream bug, no fix yet: euro-office/documentserver#299). - Fix: open the container's Edit page, switch on Advanced View, clear the Database field completely, then Apply. The container starts normally within a minute using the bundled database, which simply resets on the next recreate, fine for WOPI use with OpenCloud.
- Only fill in Database if that folder already contains a working euro-office Postgres data directory (for example one copied out of a running container first).
Container loops "Starting nginx nginx ...fail!" on a fresh install
- The Logs field (Advanced View) has a path in it. The image builds its log tree at
/var/log/euro-office/documentserver(that is wherenginx.error.logand one folder per service live), and the entrypoint never recreates it. Mounting a fresh empty folder over/var/log/euro-officehides the whole tree, so nginx aborts withopen() "/var/log/euro-office/documentserver/nginx.error.log" failed (2: No such file or directory). The entrypoint runs underset -e, so that one failure ends the boot and--restart=unless-stoppedstarts the same failure over again. - Fix: open the container's Edit page, switch on Advanced View, clear the Logs field completely, then Apply. The container comes up within a minute and
/hosting/discoverystarts answering. - You do not lose the logs: the Unraid log button on the container shows everything the server prints either way.
- Only fill in Logs if that folder already contains the log tree copied out of a running container first.
9. Contributing / License
Pull requests welcome. Issues: https://github.com/junkerderprovinz/euro-office/issues.
Licensing, dual:
- This wrapper (Dockerfile,
chown-heal.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). - Euro Office itself is developed by the Euro Office project and retains its upstream license, see https://github.com/euro-office/documentserver. When you run, redistribute or rebuild the resulting container image, you must comply with all upstream licenses, not only with this wrapper's AGPL-3.0.
Credits
- Euro Office, the sovereign European document server
- OnlyOffice, the document server Euro Office builds on
- OpenCloud, the cloud this editor pairs with
- Unraid Community Applications, the best app store in self-hosting
10. Support this project
Questions? Check the support thread. Bugs, ideas or feature requests? Please open a GitHub issue.
This is a one-person project. I put a lot of time and effort into building and maintaining it, in whatever free time I have. If it's helped you, I'd genuinely appreciate the support: you're welcome to buy me a coffee.
Install Euro-Office on Unraid in a few clicks.
Find Euro-Office in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/junkerderprovinz/euro-office:latestRuntime arguments
- Web UI
http://[IP]:[PORT:80]/- Network
bridge- Shell
sh- Privileged
- false
- Extra Params
--restart=unless-stopped
Template configuration
HTTP port the document server listens on. This is the address your cloud (OpenCloud) talks to and the URL that must return XML at /hosting/discovery. Behind a reverse proxy, point the proxy at this port.
- Target
- 80
- Default
- 9900
- Value
- 9900
Shared secret that signs every request between your cloud and this editor. REQUIRED. Pick a long random string. It MUST be identical to the 'Office WOPI secret' you set in the OpenCloud template. Keep it secret.
- Target
- JWT_SECRET
Turns on the WOPI protocol that OpenCloud uses to open and save documents. Keep 'true' - with 'false' OpenCloud cannot use this editor.
- Target
- WOPI_ENABLED
- Default
- true|false
- Value
- true
Require the signed JWT on every request. Keep 'true' for security. Only set 'false' for isolated testing on a trusted LAN.
- Target
- JWT_ENABLED
- Default
- true|false
- Value
- true
Set 'true' when your cloud (OpenCloud) serves a self-signed certificate, so the editor can fetch and save documents from it. Leave 'false' when the cloud has a valid certificate or you talk to it over plain http.
- Target
- USE_UNAUTHORIZED_STORAGE
- Default
- false|true
- Value
- false
Optional. Persistent document-server data (keys, fonts cache, forgotten files). Recommended for a permanent install; can be omitted for a purely stateless WOPI backend.
- Target
- /var/www/euro-office/Data
- Default
- /mnt/user/appdata/euro-office/data
- Value
- /mnt/user/appdata/euro-office/data
Leave BLANK for a normal install. The image builds its log tree at /var/log/euro-office/documentserver (nginx.error.log plus one folder per service). Mounting an EMPTY folder over /var/log/euro-office hides that tree, nginx then cannot open its error log and fails with 'Starting nginx nginx ...fail!', and because the entrypoint stops on that error the container crash-loops on every boot. You lose nothing by leaving this blank: the Unraid log button still shows everything the server prints. Only set a path here if it already contains the log tree copied out of a running container first.
- Target
- /var/log/euro-office
Leave BLANK for a normal install. The image ships with an already-initialised database baked in; mounting an EMPTY folder here hides that database and the container fails to start with 'PostgreSQL ... is not accessible or does not exist' on every boot (an upstream bug: the entrypoint cannot initialise a database in a fresh empty volume - see euro-office/documentserver#299). Without this mount the DB simply resets on container recreate, which is fine for WOPI use with OpenCloud. Only set a path here if it already contains a working euro-office Postgres data directory copied out of a running container first.
- Target
- /var/lib/postgresql
Only used once you fill in 'TLS certificate' and 'TLS private key' below. From that moment the document server serves the editor over https on THIS port, and the plain 'WebUI Port' above stops serving the editor entirely - it turns into a redirect that drops the port number, so http://[IP]:9900 bounces to https://[IP], which on an Unraid box is the Unraid WebUI. Point OpenCloud's 'Office document server URL' at https://[THIS-SERVER-IP]:9943 in that case. Without TLS this mapping is harmless: nothing listens on container port 443, so you can leave it as it is or remove it.
- Target
- 443
- Default
- 9943
- Value
- 9943
Optional. Folder holding the TLS certificate and private key used by the two fields below. Leave it as it is if you are not using TLS - an empty folder here changes nothing, because /certs is not a directory the image ships. Drop cert.pem and key.pem into /mnt/user/appdata/euro-office/certs on the server, then set the two fields below to /certs/cert.pem and /certs/key.pem. Mounted READ-ONLY: the server only ever reads them. Do NOT put certificates in the Data folder instead - this wrapper re-asserts ownership of that whole tree to the container's internal 'ds' user for the first 30 seconds of every boot, so your certificate files would get their host-side ownership rewritten on each start.
- Target
- /certs
- Default
- /mnt/user/appdata/euro-office/certs
- Value
- /mnt/user/appdata/euro-office/certs
Leave BLANK for plain HTTP (the default). Fill this in to let the document server serve HTTPS itself, which is REQUIRED when your cloud runs on https - otherwise the browser silently blocks the editor as mixed content and shows only 'this content is blocked, contact the site owner', with nothing in either service's log. Put the certificate in the 'Certificates' folder above and enter its IN-CONTAINER path here, e.g. /certs/cert.pem (not the /mnt/user/... path). A self-signed certificate is fine on a LAN. If you use Unraid's own combined *_unraid_bundle.pem, which holds the certificate and the key in ONE file, point this field AND 'TLS private key' at that same file. IMPORTANT: this and 'TLS private key' must BOTH be set and both files must exist, or TLS is skipped SILENTLY and the server stays on plain http. Also map the 'HTTPS Port' above - the editor moves to port 443 once TLS is on. After Apply, check the container log for the line 'SSL enabled with cert=': if it is missing, one of the two paths is wrong.
- Target
- SSL_CERTIFICATE_PATH
Leave BLANK for plain HTTP (the default). IN-CONTAINER path to the private key belonging to 'TLS certificate' above, e.g. /certs/key.pem. The key must NOT be passphrase-protected - encrypted keys are not supported by the document server, so generate it with openssl's '-nodes' option. With Unraid's combined *_unraid_bundle.pem, enter that same file path in both fields. Both this and 'TLS certificate' must be filled in and both files must exist, or TLS is skipped SILENTLY and the server stays on plain http.
- Target
- SSL_KEY_PATH
Only has any effect once TLS is configured above. 'true' (the default) tells browsers to remember to use https for this host for a year. Set 'false' if this container shares a hostname with other services you still reach over plain http, e.g. unraid.example.com - the browser stores that rule per HOSTNAME and ignores the port, so it would force https on your Unraid WebUI and everything else on that name too. It does nothing at all when you reach the editor by IP address or with a self-signed certificate, because browsers ignore HSTS in both of those cases.
- Target
- ONLYOFFICE_HTTPS_HSTS_ENABLED
- Default
- true|false
- Value
- true