mirror of
https://github.com/opencloud-eu/opencloud-compose.git
synced 2026-08-07 12:28:43 +08:00
Compare commits
161 Commits
web/issues
...
db3ddbdf32
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
db3ddbdf32 | ||
|
|
1fbb2380cc | ||
|
|
34129ff018 | ||
|
|
0f89106b89 | ||
|
|
2b51cb53c0 | ||
|
|
eab3b7e584 | ||
|
|
c4023ff553 | ||
|
|
aac9a1e2f5 | ||
|
|
e6a0e8e2e6 | ||
|
|
1ecdd0e32a | ||
|
|
bcf59c86fd | ||
|
|
7cd7c57bd9 | ||
|
|
213dde31c8 | ||
|
|
dabd81377c | ||
|
|
8d2d89f283 | ||
|
|
189f17f6e0 | ||
|
|
27fd367113 | ||
|
|
fffcec12a8 | ||
|
|
42b4343d6e | ||
|
|
5666410706 | ||
|
|
62131f972b | ||
|
|
274195c6ad | ||
|
|
49ba000f6e | ||
|
|
d759e5a332 | ||
|
|
d7fcd3da64 | ||
|
|
325dce2f53 | ||
|
|
0221cfd91b | ||
|
|
c096f66dfd | ||
|
|
e6d987501e | ||
|
|
2f81c5f62c | ||
|
|
670d978c1c | ||
|
|
d952c2849b | ||
|
|
13b9489c52 | ||
|
|
e8b8511477 | ||
|
|
70e7679bc3 | ||
|
|
0d62d41894 | ||
|
|
16bd598d4d | ||
|
|
bc0a74dd5a | ||
|
|
b8a0a98a51 | ||
|
|
b914288032 | ||
|
|
09e0d8f32a | ||
|
|
aab87f13a7 | ||
|
|
aebf5882f4 | ||
|
|
f292460d32 | ||
|
|
f0277501f0 | ||
|
|
76e41a4848 | ||
|
|
46ad111b94 | ||
|
|
9cac2bd525 | ||
|
|
d965660599 | ||
|
|
f3f0ece32a | ||
|
|
b138f37c98 | ||
|
|
3314522ef9 | ||
|
|
9cee17c253 | ||
|
|
e92718ffa0 | ||
|
|
5268ad506b | ||
|
|
8c43842e7b | ||
|
|
913920dd33 | ||
|
|
792bcd336e | ||
|
|
73b02b77d8 | ||
|
|
4d3e787e2d | ||
|
|
cda4138e7d | ||
|
|
c5ab316d45 | ||
|
|
b3b820f32b | ||
|
|
0636b2c871 | ||
|
|
03ba22ed4e | ||
|
|
4531d137ef | ||
|
|
d853a59078 | ||
|
|
75941df428 | ||
|
|
38f4ea52a5 | ||
|
|
5a1d9d4b9b | ||
|
|
217099947f | ||
|
|
03a4587c90 | ||
|
|
539d514bbb | ||
|
|
cc49b063c0 | ||
|
|
8564cb046f | ||
|
|
9eeaee4743 | ||
|
|
882953cdcc | ||
|
|
cc3de9830b | ||
|
|
7cf59a62a9 | ||
|
|
521e600b86 | ||
|
|
2bb11ee1a5 | ||
|
|
40081db318 | ||
|
|
ddfef44b34 | ||
|
|
3838584876 | ||
|
|
8cafd254bb | ||
|
|
fd966a5527 | ||
|
|
270374d9e1 | ||
|
|
459b5ba9ff | ||
|
|
17012ada58 | ||
|
|
0ddef8a7f1 | ||
|
|
12f855c9ce | ||
|
|
1e760a19d6 | ||
|
|
d2663a1113 | ||
|
|
c3caf7e65b | ||
|
|
5998ffbc96 | ||
|
|
29749588de | ||
|
|
781ae4c8b4 | ||
|
|
f62678fc9b | ||
|
|
32b328218f | ||
|
|
c814f08cd5 | ||
|
|
372bc44e63 | ||
|
|
3813131dfd | ||
|
|
b5eb7bb7ca | ||
|
|
f0b1565edb | ||
|
|
892839eace | ||
|
|
f01a8969bf | ||
|
|
87cbdc05e3 | ||
|
|
86f1d6fb7e | ||
|
|
212f87a89c | ||
|
|
68ddb4eb79 | ||
|
|
6da37f5ba5 | ||
|
|
b6bde225d4 | ||
|
|
4f1ff44446 | ||
|
|
8ac4a770a6 | ||
|
|
4121da5547 | ||
|
|
6008e82a84 | ||
|
|
c600ac4988 | ||
|
|
1f5991578b | ||
|
|
376f06c4e3 | ||
|
|
6ab45a8594 | ||
|
|
938faf9a53 | ||
|
|
1e23a63910 | ||
|
|
39a3bcd45d | ||
|
|
932e794fd2 | ||
|
|
279b2cde68 | ||
|
|
4cbeb8ea38 | ||
|
|
1c94d436e4 | ||
|
|
2b1476950b | ||
|
|
8a30076bc0 | ||
|
|
bfd87b4bc0 | ||
|
|
060f8d09ca | ||
|
|
ec431ee2f8 | ||
|
|
2075573ac5 | ||
|
|
c5f235a54e | ||
|
|
daabcb9515 | ||
|
|
b3c2b06b5f | ||
|
|
a5c06c10cc | ||
|
|
61e128d975 | ||
|
|
958b21d80a | ||
|
|
93fa72b3a8 | ||
|
|
94db919f1d | ||
|
|
33c3861012 | ||
|
|
bc2b6b4a90 | ||
|
|
d146f60855 | ||
|
|
85e2c4aa35 | ||
|
|
70fa25573f | ||
|
|
55035e0a81 | ||
|
|
8f09fd66fd | ||
|
|
1dbce867e1 | ||
|
|
d0a9e71a89 | ||
|
|
634c95d5ed | ||
|
|
820ce2747f | ||
|
|
1eeabd5bcb | ||
|
|
69b1555af9 | ||
|
|
f480b7d6ed | ||
|
|
25af2c9f6f | ||
|
|
41b721b42b | ||
|
|
5ededbd4c9 | ||
|
|
98294c2dee | ||
|
|
1a4f302855 | ||
|
|
de88ca037b |
68
.env.example
68
.env.example
@@ -24,6 +24,10 @@ INSECURE=true
|
||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/ldap-keycloak.yml:traefik/ldap-keycloak.yml
|
||||
# External IDP
|
||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/external-idp.yml
|
||||
# Euro Office with traefik and letsencrypt
|
||||
#COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:traefik/opencloud.yml:traefik/euro-office.yml
|
||||
# Euro Office with external proxy (Nginx, Caddy, etc.)
|
||||
#COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:external-proxy/opencloud.yml:external-proxy/euro-office.yml
|
||||
|
||||
## Traefik Settings ##
|
||||
# Note: Traefik is always enabled and can't be disabled.
|
||||
@@ -58,8 +62,8 @@ TRAEFIK_SERVICES_TLS_CONFIG="tls.certresolver=letsencrypt"
|
||||
# certificates:
|
||||
# - certFile: /certs/opencloud.test.crt
|
||||
# keyFile: /certs/opencloud.test.key
|
||||
# stores:
|
||||
# - default
|
||||
# stores:
|
||||
# - default
|
||||
#
|
||||
# The certificates need to be copied into ./certs/, the absolute path inside the container is /certs/.
|
||||
# You can also use TRAEFIK_CERTS_DIR=/path/on/host to set the path to the certificates directory.
|
||||
@@ -85,7 +89,7 @@ TRAEFIK_LOG_LEVEL=
|
||||
# Defaults to production if not set otherwise
|
||||
OC_DOCKER_IMAGE=opencloudeu/opencloud-rolling
|
||||
# The openCloud container version.
|
||||
# Defaults to "latest" and points to the latest stable tag.
|
||||
# Defaults to the latest version-tag. Use git pull to update.
|
||||
OC_DOCKER_TAG=
|
||||
# The default id used in opencloud containers is 1000 for user and group.
|
||||
# If you want to change the default, use the following variable and the format [UID]:[GID].
|
||||
@@ -215,9 +219,9 @@ TIKA_IMAGE=
|
||||
# Domain of Collabora, where you can find the frontend.
|
||||
# Defaults to "collabora.opencloud.test"
|
||||
COLLABORA_DOMAIN=
|
||||
# Domain of the wopiserver which handles Collabora.
|
||||
# Defaults to "wopiserver.opencloud.test"
|
||||
WOPISERVER_DOMAIN=
|
||||
# NOTE: The WOPI server runs inside the main OpenCloud process and is served by
|
||||
# the OpenCloud proxy on the main OpenCloud domain (OC_DOMAIN) under the /wopi and
|
||||
# /collaboration paths. It no longer needs its own domain.
|
||||
# Admin user for Collabora.
|
||||
# Defaults to "admin".
|
||||
# Collabora Admin Panel URL:
|
||||
@@ -239,6 +243,21 @@ COLLABORA_SSL_VERIFICATION=false
|
||||
COLLABORA_HOME_MODE=
|
||||
|
||||
|
||||
### Euro Office Settings ###
|
||||
# Domain of Euro Office, where you can find the document server.
|
||||
# Defaults to "euro-office.opencloud.test"
|
||||
EURO_OFFICE_DOMAIN=
|
||||
# JWT Secret for Euro Office. IMPORTANT: Change this for production!
|
||||
# Defaults to "changeme"
|
||||
EURO_OFFICE_JWT_SECRET=
|
||||
# Euro Office Docker image.
|
||||
# Defaults to "ghcr.io/euro-office/documentserver"
|
||||
EURO_OFFICE_DOCKER_IMAGE=
|
||||
# Euro Office Docker tag.
|
||||
# Defaults to "latest"
|
||||
EURO_OFFICE_DOCKER_TAG=
|
||||
|
||||
|
||||
### Virusscanner Settings ###
|
||||
# IMPORTANT: If you enable antivirus, you also MUST configure the START_ADDITIONAL_SERVICES
|
||||
# envvar in the OpenCloud Settings above by adding 'antivirus' to the list.
|
||||
@@ -304,6 +323,14 @@ LDAP_BIND_PASSWORD=
|
||||
|
||||
## Autoprovisioning Mode ##
|
||||
# Use together with idm/external-idp.yml
|
||||
# Role assignment driver for the proxy. Defaults to "oidc".
|
||||
# Possible values: "oidc", "default"
|
||||
# When set to "oidc", roles are assigned based on OIDC claims.
|
||||
# When set to "default", all users get the 'user' role assigned.
|
||||
PROXY_ROLE_ASSIGNMENT_DRIVER=
|
||||
# Assign the default 'user' role to new users. Defaults to "false".
|
||||
# Set to "true" when using PROXY_ROLE_ASSIGNMENT_DRIVER=default
|
||||
GRAPH_ASSIGN_DEFAULT_USER_ROLE=
|
||||
# If you want to use a keycloak for local testing, you can use testing/external-keycloak.yml and testing/ldap-manager.yml
|
||||
# Domain of your Identity Provider.
|
||||
IDP_DOMAIN=
|
||||
@@ -313,6 +340,23 @@ IDP_DOMAIN=
|
||||
IDP_ISSUER_URL=
|
||||
# Url of the account edit page from your Identity Provider.
|
||||
IDP_ACCOUNT_URL=
|
||||
# Global Client ID: You can override this by specifying a custom client ID, or leave it blank to use the OC defaults, as described in the documentation
|
||||
#OC_OIDC_CLIENT_ID=
|
||||
# Declares which property should be used for the oidc claim
|
||||
# Example: "roles"
|
||||
PROXY_ROLE_ASSIGNMENT_OIDC_CLAIM=
|
||||
# Defines the OIDC client scope
|
||||
# Example: "openid profile email roles"
|
||||
OC_OIDC_CLIENT_SCOPES=
|
||||
# Client specific environment vars
|
||||
#WEBFINGER_WEB_OIDC_CLIENT_ID=
|
||||
#WEBFINGER_WEB_OIDC_CLIENT_SCOPES=
|
||||
#WEBFINGER_IOS_OIDC_CLIENT_ID=
|
||||
#WEBFINGER_IOS_OIDC_CLIENT_SCOPES=
|
||||
#WEBFINGER_ANDROID_OIDC_CLIENT_ID=
|
||||
#WEBFINGER_ANDROID_OIDC_CLIENT_SCOPES=
|
||||
#WEBFINGER_DESKTOP_OIDC_CLIENT_ID=
|
||||
#WEBFINGER_DESKTOP_OIDC_CLIENT_SCOPES=
|
||||
|
||||
## Shared User Directory Mode ##
|
||||
# Use together with idm/ldap-keycloak.yml and traefik/ldap-keycloak.yml
|
||||
@@ -330,6 +374,18 @@ KC_DB_USERNAME=
|
||||
# Keycloak Database password. Defaults to "keycloak".
|
||||
KC_DB_PASSWORD=
|
||||
|
||||
## Demo Users ##
|
||||
# Enable demo users and groups in the shared LDAP directory.
|
||||
# To enable, create custom/ldap-keycloak-demo-users.yml with:
|
||||
# services:
|
||||
# ldap-server:
|
||||
# volumes:
|
||||
# - ./config/ldap/ldif/30_demo_users.ldif:/ldifs/30_demo_users.ldif
|
||||
# - ./config/ldap/ldif/40_demo_groups.ldif:/ldifs/40_demo_groups.ldif
|
||||
#
|
||||
# Then add it to: COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/ldap-keycloak.yml:traefik/ldap-keycloak.yml:custom/ldap-keycloak-demo-users.yml
|
||||
# WARNING: Do not use in production.
|
||||
|
||||
### Radicale Setting ###
|
||||
# Radicale is a small open-source CalDAV (calendars, to-do lists) and CardDAV (contacts) server.
|
||||
# When enabled OpenCloud is configured as a reverse proxy for Radicale, providing all authenticated
|
||||
|
||||
77
README.md
77
README.md
@@ -12,6 +12,7 @@ OpenCloud Compose offers a modular approach to deploying OpenCloud with several
|
||||
- **Standard deployment** with Traefik reverse proxy and Let's Encrypt certificates or certificates from files
|
||||
- **External proxy** support for environments with existing reverse proxies (like Nginx, Caddy, etc.)
|
||||
- **Collabora Online** integration for document editing
|
||||
- **Euro Office** integration for document editing
|
||||
- **Keycloak and LDAP** integration for centralized identity management
|
||||
- **Full text search** with Apache Tika for content extraction and metadata analysis
|
||||
- **Monitoring** with metrics endpoints for observability and performance monitoring
|
||||
@@ -107,9 +108,12 @@ This setup includes:
|
||||
|
||||
### With Collabora Online
|
||||
|
||||
> [!NOTE]
|
||||
> Collabora Online and [Euro Office](#with-euro-office) are mutually exclusive web office backends — both use the same `collaboration` (WOPI) service, which runs inside the main OpenCloud process. Enable only one of them at a time.
|
||||
|
||||
Include Collabora for document editing using either method:
|
||||
|
||||
> **DNS Requirements**: This setup requires DNS entries for the main OpenCloud domain, Collabora subdomain, and WOPI server subdomain. Configure DNS A/AAAA records for your domains (e.g., `cloud.example.com`, `collabora.example.com`, `wopiserver.example.com`) or use a wildcard DNS entry (`*.example.com`).
|
||||
> **DNS Requirements**: This setup requires DNS entries for the main OpenCloud domain and the Collabora subdomain. The WOPI server is served by OpenCloud on the main domain, so it does not need its own subdomain. Configure DNS A/AAAA records for your domains (e.g., `cloud.example.com`, `collabora.example.com`) or use a wildcard DNS entry (`*.example.com`).
|
||||
|
||||
Using `-f` flags:
|
||||
```bash
|
||||
@@ -124,9 +128,44 @@ COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:tr
|
||||
> **For local development only**: Add to `/etc/hosts`:
|
||||
> ```
|
||||
> 127.0.0.1 collabora.opencloud.test
|
||||
> 127.0.0.1 wopiserver.opencloud.test
|
||||
> ```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **Upgrading from a previous setup**: The `collaboration` (WOPI) service no longer runs as a separate container or on its own `wopiserver.*` domain — it now runs inside the main OpenCloud process and is served by the OpenCloud proxy on the main domain under the `/wopi` and `/collaboration` paths. When upgrading:
|
||||
> - Pull the latest compose files and recreate the stack (`docker compose up -d`). The old `collaboration` container is removed automatically.
|
||||
> - You can retire the `wopiserver.*` DNS entry (and its `/etc/hosts` line), its reverse-proxy/Traefik route, and the `WOPISERVER_DOMAIN` variable in `.env` — all are now unused.
|
||||
> - If you run behind an external proxy, make sure it forwards `/wopi` and `/collaboration` on the OpenCloud domain to OpenCloud (port 9200). Forwarding the whole OpenCloud domain, as already configured, covers this.
|
||||
|
||||
### With Euro Office
|
||||
|
||||
> [!NOTE]
|
||||
> Euro Office and [Collabora Online](#with-collabora-online) are mutually exclusive web office backends — both use the same `collaboration` (WOPI) service, which runs inside the main OpenCloud process. Enable only one of them at a time.
|
||||
|
||||
Include Euro Office for document editing using either method:
|
||||
|
||||
> **DNS Requirements**: This setup requires DNS entries for the main OpenCloud domain and the Euro Office subdomain. The WOPI server is served by OpenCloud on the main domain, so it does not need its own subdomain. Configure DNS A/AAAA records for your domains (e.g., `cloud.example.com`, `euro-office.example.com`) or use a wildcard DNS entry (`*.example.com`).
|
||||
|
||||
Using `-f` flags:
|
||||
```bash
|
||||
docker compose -f docker-compose.yml -f weboffice/euro-office.yml -f traefik/opencloud.yml -f traefik/euro-office.yml up -d
|
||||
```
|
||||
|
||||
Or by setting in `.env`:
|
||||
```
|
||||
COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:traefik/opencloud.yml:traefik/euro-office.yml
|
||||
```
|
||||
|
||||
> **For local development only**: Add to `/etc/hosts`:
|
||||
> ```
|
||||
> 127.0.0.1 euro-office.opencloud.test
|
||||
> ```
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Set a strong `EURO_OFFICE_JWT_SECRET` in your `.env` file for production. The default value (`changeme`) is intended for local development only.
|
||||
|
||||
> [!NOTE]
|
||||
> Upgrading from a previous setup? See [Upgrading from a previous setup](#with-collabora-online) under Collabora Online — the WOPI server changes (no more separate container or `wopiserver.*` domain) apply to Euro Office as well.
|
||||
|
||||
### With Full Text Search
|
||||
|
||||
Enable full text search capabilities with Apache Tika using either method:
|
||||
@@ -226,7 +265,28 @@ COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:external-proxy/opencloud
|
||||
This exposes the necessary ports:
|
||||
- OpenCloud: 9200
|
||||
- Collabora: 9980
|
||||
- WOPI server: 9300
|
||||
|
||||
The WOPI server runs inside the OpenCloud process and is served on the OpenCloud port (9200) under the `/wopi` and `/collaboration` paths, so no separate port needs to be exposed for it.
|
||||
|
||||
To use Euro Office instead of Collabora behind an external proxy, swap the web office compose files:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.yml -f weboffice/euro-office.yml -f external-proxy/opencloud.yml -f external-proxy/euro-office.yml up -d
|
||||
```
|
||||
|
||||
Or by setting in `.env`:
|
||||
```
|
||||
COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:external-proxy/opencloud.yml:external-proxy/euro-office.yml
|
||||
```
|
||||
|
||||
This exposes the necessary ports:
|
||||
- OpenCloud: 9200
|
||||
- Euro Office: 9900
|
||||
|
||||
As with Collabora, the WOPI server is served on the OpenCloud port (9200) under the `/wopi` and `/collaboration` paths and needs no separate port.
|
||||
|
||||
> [!WARNING]
|
||||
> `external-proxy/euro-office.yml` binds the exposed ports to `127.0.0.1` only. If your external proxy runs on a different host, use `external-proxy/euro-office-exposed.yml`, which binds to all interfaces (`0.0.0.0`). Only expose these ports when you know what you are doing.
|
||||
|
||||
**Please note:**
|
||||
If you're using **Nginx Proxy Manager (NPM)**, you **should NOT** activate **"Block Common Exploits"** for the Proxy Host.
|
||||
@@ -259,12 +319,12 @@ OpenCloud Compose supports adding SSL certificates for public domains and develo
|
||||
### Use Let's Encrypt with ACME Challenge
|
||||
|
||||
1. **Enable Let's Encrypt**:
|
||||
- Set `TRAEFIK_LETSENCRYPT_EMAIL` to your email address for the ACME challenge
|
||||
- Set `TRAEFIK_ACME_MAIL` to your email address for the ACME challenge
|
||||
- Set `TRAEFIK_SERVICES_TLS_CONFIG="tls.certresolver=letsencrypt"` to use Let's Encrypt (default value)
|
||||
|
||||
```bash
|
||||
# In your .env file
|
||||
TRAEFIK_LETSENCRYPT_EMAIL=devops@your-domain.tld
|
||||
TRAEFIK_ACME_MAIL=devops@your-domain.tld
|
||||
TRAEFIK_SERVICES_TLS_CONFIG="tls.certresolver=letsencrypt"
|
||||
```
|
||||
|
||||
@@ -341,7 +401,10 @@ Key variables:
|
||||
| `OC_DATA_DIR` | Data directory path | (Docker volume) |
|
||||
| `INSECURE` | Skip certificate validation | true |
|
||||
| `COLLABORA_DOMAIN` | Collabora domain | collabora.opencloud.test |
|
||||
| `WOPISERVER_DOMAIN` | WOPI server domain | wopiserver.opencloud.test |
|
||||
| `EURO_OFFICE_DOMAIN` | Euro Office document server domain | euro-office.opencloud.test |
|
||||
| `EURO_OFFICE_JWT_SECRET` | JWT secret for Euro Office (change for production!) | changeme |
|
||||
| `EURO_OFFICE_DOCKER_IMAGE` | Euro Office Docker image | ghcr.io/euro-office/documentserver |
|
||||
| `EURO_OFFICE_DOCKER_TAG` | Euro Office Docker tag | latest |
|
||||
| `TIKA_IMAGE` | Apache Tika image tag | apache/tika:slim |
|
||||
| `KEYCLOAK_DOMAIN` | Keycloak domain | keycloak.opencloud.test |
|
||||
| `KEYCLOAK_ADMIN` | Keycloak admin username | kcadmin |
|
||||
@@ -349,7 +412,7 @@ Key variables:
|
||||
| `LDAP_BIND_PASSWORD` | LDAP password for the bind user | admin |
|
||||
| `KC_DB_USERNAME` | Database user for keycloak | keycloak |
|
||||
| `KC_DB_PASSWORD` | Database password for keycloak | keycloak |
|
||||
| `TRAEFIK_LETSENCRYPT_EMAIL` | Email Address for the Let's Encrypt ACME challenge | example@example.org |
|
||||
| `TRAEFIK_ACME_MAIL` | Email Address for the Let's Encrypt ACME challenge | example@example.org |
|
||||
| `TRAEFIK_SERVICES_TLS_CONFIG` | Tell traefik and the services which TLS config to use | tls.certresolver=letsencrypt |
|
||||
| `TRAEFIK_CERTS_DIR` | Directory for custom certificates. | ./certs |
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@ services:
|
||||
ANTIVIRUS_SCANNER_TYPE: clamav
|
||||
volumes:
|
||||
- clamav-socket:/var/run/clamav
|
||||
depends_on:
|
||||
clamav:
|
||||
condition: service_healthy
|
||||
clamav:
|
||||
image: clamav/clamav:${CLAMAV_DOCKER_TAG:-latest}
|
||||
environment:
|
||||
@@ -26,6 +29,10 @@ services:
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
restart: always
|
||||
healthcheck:
|
||||
test: sh -c "[ -S /tmp/clamd.sock ]"
|
||||
timeout: 1s
|
||||
retries: 20
|
||||
volumes:
|
||||
clamav-db:
|
||||
clamav-socket:
|
||||
|
||||
71
config/euro-office/app-registry.yaml
Normal file
71
config/euro-office/app-registry.yaml
Normal file
@@ -0,0 +1,71 @@
|
||||
app_registry:
|
||||
mimetypes:
|
||||
- mime_type: application/pdf
|
||||
extension: pdf
|
||||
name: PDF
|
||||
description: PDF document
|
||||
icon: ''
|
||||
default_app: ''
|
||||
allow_creation: false
|
||||
- mime_type: application/vnd.oasis.opendocument.text
|
||||
extension: odt
|
||||
name: OpenDocument
|
||||
description: OpenDocument text document
|
||||
icon: ''
|
||||
default_app: Collabora
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.oasis.opendocument.spreadsheet
|
||||
extension: ods
|
||||
name: OpenSpreadsheet
|
||||
description: OpenDocument spreadsheet document
|
||||
icon: ''
|
||||
default_app: Collabora
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.oasis.opendocument.presentation
|
||||
extension: odp
|
||||
name: OpenPresentation
|
||||
description: OpenDocument presentation document
|
||||
icon: ''
|
||||
default_app: Collabora
|
||||
- mime_type: application/vnd.oasis.opendocument.graphics
|
||||
extension: odg
|
||||
name: OpenGraphics
|
||||
description: OpenDocument graphics document
|
||||
icon: ''
|
||||
default_app: Collabora
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||
extension: docx
|
||||
name: Microsoft Word
|
||||
description: Microsoft Word document
|
||||
icon: ''
|
||||
default_app: Euro-Office
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.openxmlformats-officedocument.wordprocessingml.form
|
||||
extension: docxf
|
||||
name: Form Document
|
||||
description: Form Document
|
||||
icon: ''
|
||||
default_app: Euro-Office
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||
extension: xlsx
|
||||
name: Microsoft Excel
|
||||
description: Microsoft Excel document
|
||||
icon: ''
|
||||
default_app: Euro-Office
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||
extension: pptx
|
||||
name: Microsoft PowerPoint
|
||||
description: Microsoft PowerPoint document
|
||||
icon: ''
|
||||
default_app: Euro-Office
|
||||
allow_creation: true
|
||||
- mime_type: application/vnd.jupyter
|
||||
extension: ipynb
|
||||
name: Jupyter Notebook
|
||||
description: Jupyter Notebook
|
||||
icon: ''
|
||||
default_app: ''
|
||||
allow_creation: true
|
||||
@@ -1,38 +1,51 @@
|
||||
:root {
|
||||
--pf-global--primary-color--100: #e2baff;
|
||||
--pf-global--primary-color--200: #e2baff;
|
||||
--pf-global--primary-color--dark-100: #e2baff;
|
||||
--pf-global--Color--light-100: #20434f;
|
||||
--pf-v5-global--primary-color--100: #e2baff;
|
||||
--pf-v5-global--primary-color--200: #e2baff;
|
||||
--pf-v5-global--primary-color--dark-100: #e2baff;
|
||||
--pf-v5-c-button--m-secondary--Color: #e2baff;
|
||||
--pf-v5-global--Color--light-100: #20434f;
|
||||
--pf-v5-global--FontFamily--text: "Inter", "RedHatText", helvetica, arial, sans-serif;
|
||||
--pf-v5-global--FontFamily--heading: "Inter", "RedHatDisplay", helvetica, arial, sans-serif;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: OpenCloud;
|
||||
src: url('../fonts/OpenCloud500-Regular.woff2') format('woff2');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: OpenCloud;
|
||||
src: url('../fonts/OpenCloud750-Bold.woff2') format('woff2');
|
||||
font-weight: bold;
|
||||
font-family: Inter;
|
||||
src: url('../fonts/Inter-Variable.woff2') format('woff2');
|
||||
font-weight: 100 900;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: "OpenCloud", "Open Sans", Helvetica, Arial, sans-serif;
|
||||
background: url(../img/background.png) no-repeat center !important;
|
||||
background: url(../img/background.png) no-repeat center fixed !important;
|
||||
background-size: cover !important;
|
||||
}
|
||||
|
||||
.kc-logo-text {
|
||||
background-image: url(../img/logo.svg) !important;
|
||||
display: block;
|
||||
width: 300px;
|
||||
height: 63px;
|
||||
background: url('../img/logo.svg') no-repeat center;
|
||||
background-size: contain;
|
||||
width: 400px;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
#kc-header-wrapper{
|
||||
.kc-logo-text span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#kc-header-wrapper {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.pf-v5-c-login__main-header {
|
||||
border-top: 4px solid var(--pf-v5-global--primary-color--100);
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.pf-v5-c-login__container {
|
||||
grid-template-columns: 34rem;
|
||||
grid-template-areas:
|
||||
"header"
|
||||
"main";
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -16,4 +16,4 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
}
|
||||
|
||||
setLogoUrl('https://opencloud.eu')
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
parent=keycloak
|
||||
parent=keycloak.v2
|
||||
import=common/keycloak
|
||||
|
||||
styles=css/login.css css/theme.css
|
||||
scripts=js/script.js
|
||||
scripts=js/script.js
|
||||
|
||||
3
config/opencloud/apps.yaml
Normal file
3
config/opencloud/apps.yaml
Normal file
@@ -0,0 +1,3 @@
|
||||
maps:
|
||||
config:
|
||||
folderViewEnabled: false
|
||||
2
config/opencloud/apps/maps/assets/src-D755RU42.css
Normal file
2
config/opencloud/apps/maps/assets/src-D755RU42.css
Normal file
File diff suppressed because one or more lines are too long
4
config/opencloud/apps/maps/js/dist-r7AkbZvS.mjs
Normal file
4
config/opencloud/apps/maps/js/dist-r7AkbZvS.mjs
Normal file
File diff suppressed because one or more lines are too long
1
config/opencloud/apps/maps/js/hostInit-E45YfNWJ.mjs
Normal file
1
config/opencloud/apps/maps/js/hostInit-E45YfNWJ.mjs
Normal file
@@ -0,0 +1 @@
|
||||
import{t as e}from"./preload-helper-DafEc2pQ.mjs";await(await e(()=>import(`./remoteEntry-lxWu31Tr.mjs`),[],import.meta.url)).init();
|
||||
@@ -0,0 +1 @@
|
||||
import"./dist-r7AkbZvS.mjs";var e={"@opencloud-eu/web-client":{name:`@opencloud-eu/web-client`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-client/graph":{name:`@opencloud-eu/web-client/graph`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/graph' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-client/graph/generated":{name:`@opencloud-eu/web-client/graph/generated`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/graph/generated' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-client/ocs":{name:`@opencloud-eu/web-client/ocs`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/ocs' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-client/sse":{name:`@opencloud-eu/web-client/sse`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/sse' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-client/webdav":{name:`@opencloud-eu/web-client/webdav`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/webdav' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"@opencloud-eu/web-pkg":{name:`@opencloud-eu/web-pkg`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-pkg' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},luxon:{name:`luxon`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module 'luxon' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},pinia:{name:`pinia`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module 'pinia' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},vue:{name:`vue`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module 'vue' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}},"vue3-gettext":{name:`vue3-gettext`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module 'vue3-gettext' must be provided by host`)},shareConfig:{singleton:!0,requiredVersion:`*`,import:!1}}},t=[];export{t as usedRemotes,e as usedShared};
|
||||
1
config/opencloud/apps/maps/js/maps-BAf8IhJ5.mjs
Normal file
1
config/opencloud/apps/maps/js/maps-BAf8IhJ5.mjs
Normal file
@@ -0,0 +1 @@
|
||||
import{t as e}from"./src-CIfRBuLG.mjs";export{e as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
var e=`__mf_init____mf__virtual/maps__mf_v__runtimeInit__mf_v__.js__`,t=globalThis[e];if(!t){let n,r,i=new Promise((e,t)=>{n=e,r=t});t=globalThis[e]={initPromise:i,initResolve:n,initReject:r},typeof window>`u`&&n({loadRemote:function(){return Promise.resolve(void 0)},loadShare:function(){return Promise.resolve(void 0)}})}var n=await t.initPromise.then(e=>e.loadShare(`vue3-gettext`,{customShareInfo:{shareConfig:{singleton:!0,strictVersion:!1,requiredVersion:`*`}}})).then(e=>typeof e==`function`?e():e);n.__esModule,n.default;var{createGettext:r,defineGettextConfig:i,makePO:a,parseSrc:o,tokenize:s,useGettext:c}=n;export{c as t};
|
||||
@@ -0,0 +1 @@
|
||||
var e=`__mf_init____mf__virtual/maps__mf_v__runtimeInit__mf_v__.js__`,t=globalThis[e];if(!t){let n,r,i=new Promise((e,t)=>{n=e,r=t});t=globalThis[e]={initPromise:i,initResolve:n,initReject:r},typeof window>`u`&&n({loadRemote:function(){return Promise.resolve(void 0)},loadShare:function(){return Promise.resolve(void 0)}})}var n=await t.initPromise.then(e=>e.loadShare(`vue`,{customShareInfo:{shareConfig:{singleton:!0,strictVersion:!1,requiredVersion:`*`}}})).then(e=>typeof e==`function`?e():e);n.__esModule,n.default;var{compile:r,Transition:i,TransitionGroup:a,VueElement:ee,createApp:te,createSSRApp:ne,defineCustomElement:re,defineSSRCustomElement:ie,hydrate:ae,initDirectivesForSSR:oe,nodeOps:se,patchProp:ce,render:le,useCssModule:ue,useCssVars:de,useHost:fe,useShadowRoot:pe,vModelCheckbox:me,vModelDynamic:he,vModelRadio:ge,vModelSelect:_e,vModelText:o,vShow:s,withKeys:c,withModifiers:l,EffectScope:u,ReactiveEffect:d,TrackOpTypes:f,TriggerOpTypes:p,customRef:m,effect:h,effectScope:g,getCurrentScope:_,getCurrentWatcher:v,isProxy:y,isReactive:b,isReadonly:x,isRef:S,isShallow:C,markRaw:w,onScopeDispose:T,onWatcherCleanup:E,proxyRefs:D,reactive:O,readonly:k,ref:A,shallowReactive:j,shallowReadonly:M,shallowRef:N,stop:P,toRaw:F,toRef:I,toRefs:ve,toValue:ye,triggerRef:be,unref:L,camelize:xe,capitalize:Se,normalizeClass:R,normalizeProps:Ce,normalizeStyle:we,toDisplayString:z,toHandlerKey:Te,BaseTransition:Ee,BaseTransitionPropsValidators:De,Comment:Oe,DeprecationTypes:ke,ErrorCodes:Ae,ErrorTypeStrings:je,Fragment:Me,KeepAlive:Ne,Static:Pe,Suspense:Fe,Teleport:Ie,Text:Le,assertNumber:Re,callWithAsyncErrorHandling:ze,callWithErrorHandling:Be,cloneVNode:Ve,compatUtils:He,computed:B,createBlock:V,createCommentVNode:H,createElementBlock:U,createElementVNode:W,createHydrationRenderer:Ue,createPropsRestProxy:We,createRenderer:Ge,createSlots:Ke,createStaticVNode:qe,createTextVNode:Je,createVNode:Ye,defineAsyncComponent:Xe,defineComponent:G,defineEmits:Ze,defineExpose:K,defineModel:Qe,defineOptions:$e,defineProps:et,defineSlots:tt,devtools:nt,getCurrentInstance:rt,getTransitionRawChildren:it,guardReactiveProps:at,h:ot,handleError:st,hasInjectionContext:ct,hydrateOnIdle:lt,hydrateOnInteraction:ut,hydrateOnMediaQuery:dt,hydrateOnVisible:ft,initCustomFormatter:pt,inject:mt,isMemoSame:ht,isRuntimeOnly:gt,isVNode:_t,mergeDefaults:vt,mergeModels:yt,mergeProps:bt,nextTick:xt,onActivated:St,onBeforeMount:Ct,onBeforeUnmount:q,onBeforeUpdate:wt,onDeactivated:Tt,onErrorCaptured:Et,onMounted:J,onRenderTracked:Dt,onRenderTriggered:Ot,onServerPrefetch:kt,onUnmounted:Y,onUpdated:At,openBlock:X,popScopeId:jt,provide:Mt,pushScopeId:Nt,queuePostFlushCb:Pt,registerRuntimeCompiler:Ft,renderList:It,renderSlot:Lt,resolveComponent:Rt,resolveDirective:zt,resolveDynamicComponent:Bt,resolveFilter:Vt,resolveTransitionHooks:Ht,setBlockTracking:Ut,setDevtoolsHook:Wt,setTransitionHooks:Gt,ssrContextKey:Kt,ssrUtils:qt,toHandlers:Jt,transformVNodeArgs:Yt,useAttrs:Xt,useId:Zt,useModel:Qt,useSSRContext:$t,useSlots:en,useTemplateRef:Z,useTransitionState:tn,version:nn,warn:rn,watch:Q,watchEffect:an,watchPostEffect:on,watchSyncEffect:sn,withAsyncContext:cn,withCtx:$,withDefaults:ln,withDirectives:un,withMemo:dn,withScopeId:fn}=n;export{G as _,Z as a,A as c,z as d,B as f,W as g,U as h,X as i,L as l,H as m,J as n,Q as o,V as p,Y as r,$ as s,q as t,R as u};
|
||||
@@ -0,0 +1 @@
|
||||
var e=`modulepreload`,t=function(e,t){return new URL(e,t).href},n={},r=function(r,i,a){let o=Promise.resolve();if(i&&i.length>0){let r=document.getElementsByTagName(`link`),s=document.querySelector(`meta[property=csp-nonce]`),c=s?.nonce||s?.getAttribute(`nonce`);function l(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}o=l(i.map(i=>{if(i=t(i,a),i in n)return;n[i]=!0;let o=i.endsWith(`.css`),s=o?`[rel="stylesheet"]`:``;if(a)for(let e=r.length-1;e>=0;e--){let t=r[e];if(t.href===i&&(!o||t.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;let l=document.createElement(`link`);if(l.rel=o?`stylesheet`:e,o||(l.as=`script`),l.crossOrigin=``,l.href=i,c&&l.setAttribute(`nonce`,c),document.head.appendChild(l),o)return new Promise((e,t)=>{l.addEventListener(`load`,e),l.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${i}`)))})}))}function s(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return o.then(e=>{for(let t of e||[])t.status===`rejected`&&s(t.reason);return r().catch(s)})};export{r as t};
|
||||
2
config/opencloud/apps/maps/js/remoteEntry-lxWu31Tr.mjs
Normal file
2
config/opencloud/apps/maps/js/remoteEntry-lxWu31Tr.mjs
Normal file
@@ -0,0 +1,2 @@
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./localSharedImportMap-CALnqYrs.mjs","./dist-r7AkbZvS.mjs","./preload-helper-DafEc2pQ.mjs","./virtualExposes-CZMUMkHF.mjs"])))=>i.map(i=>d[i]);
|
||||
import{t as e}from"./dist-r7AkbZvS.mjs";import{t}from"./preload-helper-DafEc2pQ.mjs";typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var n=`__mf_init____mf__virtual/maps__mf_v__runtimeInit__mf_v__.js__`,r=globalThis[n];if(!r){let e,t,i=new Promise((n,r)=>{e=n,t=r});r=globalThis[n]={initPromise:i,initResolve:e,initReject:t},typeof window>`u`&&e({loadRemote:function(){return Promise.resolve(void 0)},loadShare:function(){return Promise.resolve(void 0)}})}var i=r.initResolve,a={},o=`default`,s=`maps`,c,l;async function u(){return c??=t(()=>import(`./localSharedImportMap-CALnqYrs.mjs`),__vite__mapDeps([0,1,2]),import.meta.url),c}async function d(){return l??=t(()=>import(`./virtualExposes-CZMUMkHF.mjs`).then(e=>e.default??e),__vite__mapDeps([3,2]),import.meta.url),l}async function f(t={},n=[]){let{usedShared:r,usedRemotes:c}=await u(),l=e({name:s,remotes:c,shared:r,plugins:[],shareStrategy:`version-first`});var d=a[o];if(d||=a[o]={from:s},!(n.indexOf(d)>=0)){n.push(d),l.initShareScopeMap(`default`,t),i(l);try{await Promise.all(await l.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:n}))}catch(e){console.error(`[Module Federation]`,e)}return l}}async function p(e){let t=await d();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return t[e]().then(e=>()=>e)}export{p as get,f as init};
|
||||
@@ -0,0 +1 @@
|
||||
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));export{c as n,o as t};
|
||||
808
config/opencloud/apps/maps/js/src-CIfRBuLG.mjs
Normal file
808
config/opencloud/apps/maps/js/src-CIfRBuLG.mjs
Normal file
File diff suppressed because one or more lines are too long
1
config/opencloud/apps/maps/js/src-D0iZetHT.mjs
Normal file
1
config/opencloud/apps/maps/js/src-D0iZetHT.mjs
Normal file
@@ -0,0 +1 @@
|
||||
import{t as e}from"./src-CIfRBuLG.mjs";export{e as default};
|
||||
@@ -0,0 +1,2 @@
|
||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/src-D755RU42.css"])))=>i.map(i=>d[i]);
|
||||
import{t as e}from"./preload-helper-DafEc2pQ.mjs";var t={},n=new Set;async function r(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][data-mf-href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.setAttribute(`data-mf-href`,t),r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var i={".":async()=>{await r(`.`);let t=await e(()=>import(`./maps-BAf8IhJ5.mjs`),__vite__mapDeps([0]),import.meta.url),n={};return Object.assign(n,t),Object.defineProperty(n,`__esModule`,{value:!0,enumerable:!1}),n}};export{i as default};
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"entrypoint": "js/maps-uKkx1qsf.js"
|
||||
}
|
||||
"entrypoint": "js/remoteEntry-lxWu31Tr.mjs"
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ directives:
|
||||
- 'https://raw.githubusercontent.com/opencloud-eu/awesome-apps/'
|
||||
- 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
- 'https://update.opencloud.eu/'
|
||||
- 'https://tile.openstreetmap.org/'
|
||||
default-src:
|
||||
- '''none'''
|
||||
font-src:
|
||||
@@ -21,8 +22,10 @@ directives:
|
||||
- 'https://embed.diagrams.net/'
|
||||
# In contrary to bash and docker the default is given after the | character
|
||||
- 'https://${COLLABORA_DOMAIN|collabora.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
- 'https://${EURO_OFFICE_DOMAIN|euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
# This is needed for the external-sites web extension when embedding sites
|
||||
- 'https://docs.opencloud.eu'
|
||||
- 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
img-src:
|
||||
- '''self'''
|
||||
- 'data:'
|
||||
@@ -31,6 +34,7 @@ directives:
|
||||
- 'https://tile.openstreetmap.org/'
|
||||
# In contrary to bash and docker the default is given after the | character
|
||||
- 'https://${COLLABORA_DOMAIN|collabora.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
- 'https://${EURO_OFFICE_DOMAIN|euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||
manifest-src:
|
||||
- '''self'''
|
||||
media-src:
|
||||
@@ -45,3 +49,6 @@ directives:
|
||||
style-src:
|
||||
- '''self'''
|
||||
- '''unsafe-inline'''
|
||||
worker-src:
|
||||
- "'self'"
|
||||
- 'blob:'
|
||||
|
||||
@@ -23,14 +23,6 @@ add_arg "--entryPoints.https.address=:${TRAEFIK_PORT_HTTPS:-443}"
|
||||
add_arg "--entryPoints.https.transport.respondingTimeouts.readTimeout=12h"
|
||||
add_arg "--entryPoints.https.transport.respondingTimeouts.writeTimeout=12h"
|
||||
add_arg "--entryPoints.https.transport.respondingTimeouts.idleTimeout=3m"
|
||||
# allow encoded characters
|
||||
# required for WOPI/Collabora and file operations with supported encoded characters
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedSlash=true"
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedQuestionMark=true"
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedPercent=true"
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedSemicolon=true"
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedHash=true"
|
||||
add_arg "--entryPoints.https.http.encodedCharacters.allowEncodedBackSlash=true"
|
||||
# docker provider (get configuration from container labels)
|
||||
add_arg "--providers.docker.endpoint=unix:///var/run/docker.sock"
|
||||
add_arg "--providers.docker.exposedByDefault=false"
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
---
|
||||
services:
|
||||
opencloud:
|
||||
image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud-rolling}:${OC_DOCKER_TAG:-latest}
|
||||
# renovate: depName=opencloudeu/opencloud-rolling
|
||||
image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud-rolling}:${OC_DOCKER_TAG:-7.4.0}
|
||||
# changelog: https://github.com/opencloud-eu/opencloud/tree/main/changelog
|
||||
# release notes: https://docs.opencloud.eu/opencloud_release_notes.html
|
||||
user: ${OC_CONTAINER_UID_GID:-1000:1000}
|
||||
@@ -57,6 +58,7 @@ services:
|
||||
OC_DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE}
|
||||
volumes:
|
||||
- ./config/opencloud/csp.yaml:/etc/opencloud/csp.yaml
|
||||
- ./config/opencloud/apps.yaml:/etc/opencloud/apps.yaml
|
||||
- ./config/opencloud/banned-password-list.txt:/etc/opencloud/banned-password-list.txt
|
||||
# configure the .env file to use own paths instead of docker internal volumes
|
||||
- ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
---
|
||||
# only expose the ports when you know what you are doing!
|
||||
services:
|
||||
collaboration:
|
||||
ports:
|
||||
# expose the wopi server on all interfaces
|
||||
- "0.0.0.0:9300:9300"
|
||||
collabora:
|
||||
ports:
|
||||
# expose the collabora server on all interfaces
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
---
|
||||
services:
|
||||
collaboration:
|
||||
ports:
|
||||
# expose the wopi server on localhost
|
||||
- "127.0.0.1:9300:9300"
|
||||
collabora:
|
||||
ports:
|
||||
# expose the collabora server on localhost
|
||||
|
||||
7
external-proxy/euro-office-exposed.yml
Normal file
7
external-proxy/euro-office-exposed.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
# only expose the ports when you know what you are doing!
|
||||
services:
|
||||
euro-office:
|
||||
ports:
|
||||
# expose the euro-office document server on all interfaces
|
||||
- "0.0.0.0:9900:80"
|
||||
6
external-proxy/euro-office.yml
Normal file
6
external-proxy/euro-office.yml
Normal file
@@ -0,0 +1,6 @@
|
||||
---
|
||||
services:
|
||||
euro-office:
|
||||
ports:
|
||||
# expose the euro-office document server on localhost
|
||||
- "127.0.0.1:9900:80"
|
||||
@@ -1,9 +1,9 @@
|
||||
---
|
||||
services:
|
||||
opencloud:
|
||||
environment:
|
||||
# bind to all interfaces
|
||||
PROXY_HTTP_ADDR: "0.0.0.0:9200"
|
||||
ports:
|
||||
# expose the opencloud server on localhost
|
||||
- "127.0.0.1:9200:9200"
|
||||
environment:
|
||||
# bind to all interfaces
|
||||
PROXY_HTTP_ADDR: "0.0.0.0:9200"
|
||||
ports:
|
||||
# expose the opencloud server on localhost
|
||||
- "127.0.0.1:9200:9200"
|
||||
|
||||
@@ -14,8 +14,18 @@ services:
|
||||
GRAPH_LDAP_REFINT_ENABLED: "true" # osixia has refint enabled.
|
||||
FRONTEND_READONLY_USER_ATTRIBUTES: "user.onPremisesSamAccountName,user.displayName,user.mail,user.passwordProfile,user.accountEnabled,user.appRoleAssignments"
|
||||
PROXY_OIDC_REWRITE_WELLKNOWN: "true"
|
||||
WEB_OIDC_CLIENT_ID: ${OC_OIDC_CLIENT_ID:-web}
|
||||
PROXY_ROLE_ASSIGNMENT_DRIVER: "oidc"
|
||||
OC_OIDC_CLIENT_ID: ${OC_OIDC_CLIENT_ID}
|
||||
OC_OIDC_CLIENT_SCOPES: ${OC_OIDC_CLIENT_SCOPES}
|
||||
PROXY_ROLE_ASSIGNMENT_OIDC_CLAIM: ${PROXY_ROLE_ASSIGNMENT_OIDC_CLAIM:-roles}
|
||||
WEBFINGER_WEB_OIDC_CLIENT_ID: ${WEBFINGER_WEB_OIDC_CLIENT_ID:-web}
|
||||
WEBFINGER_WEB_OIDC_CLIENT_SCOPES: ${WEBFINGER_WEB_OIDC_CLIENT_SCOPES:-openid profile email}
|
||||
WEBFINGER_ANDROID_OIDC_CLIENT_ID: ${WEBFINGER_ANDROID_OIDC_CLIENT_ID:-OpenCloudAndroid}
|
||||
WEBFINGER_ANDROID_OIDC_CLIENT_SCOPES: ${WEBFINGER_ANDROID_OIDC_CLIENT_SCOPES:-openid profile email offline_access}
|
||||
WEBFINGER_IOS_OIDC_CLIENT_ID: ${WEBFINGER_IOS_OIDC_CLIENT_ID:-OpenCloudIOS}
|
||||
WEBFINGER_IOS_OIDC_CLIENT_SCOPES: ${WEBFINGER_IOS_OIDC_CLIENT_SCOPES:-openid profile email offline_access}
|
||||
WEBFINGER_DESKTOP_OIDC_CLIENT_ID: ${WEBFINGER_DESKTOP_OIDC_CLIENT_ID:-OpenCloudDesktop}
|
||||
WEBFINGER_DESKTOP_OIDC_CLIENT_SCOPES: ${WEBFINGER_DESKTOP_OIDC_CLIENT_SCOPES:-openid profile email offline_access}
|
||||
PROXY_ROLE_ASSIGNMENT_DRIVER: ${PROXY_ROLE_ASSIGNMENT_DRIVER:-oidc}
|
||||
OC_OIDC_ISSUER: ${IDP_ISSUER_URL:-https://keycloak.opencloud.test/realms/openCloud}
|
||||
# This specifies to start all services except idm and idp. These are replaced by external services.
|
||||
OC_EXCLUDE_RUN_SERVICES: idm,idp
|
||||
@@ -37,7 +47,7 @@ services:
|
||||
OC_LDAP_DISABLE_USER_MECHANISM: "attribute"
|
||||
OC_ADMIN_USER_ID: ""
|
||||
SETTINGS_SETUP_DEFAULT_ASSIGNMENTS: "false"
|
||||
GRAPH_ASSIGN_DEFAULT_USER_ROLE: "false"
|
||||
GRAPH_ASSIGN_DEFAULT_USER_ROLE: ${GRAPH_ASSIGN_DEFAULT_USER_ROLE:-false}
|
||||
GRAPH_USERNAME_MATCH: "none"
|
||||
# We need to set the IDP_DOMAIN to allow the CSP rules to be set correctly
|
||||
IDP_DOMAIN: ${IDP_DOMAIN:-keycloak.opencloud.test}
|
||||
@@ -45,6 +55,7 @@ services:
|
||||
WEB_OPTION_ACCOUNT_EDIT_LINK_HREF: ${IDP_ACCOUNT_URL}
|
||||
ldap-server:
|
||||
image: bitnamilegacy/openldap:2.6
|
||||
# Bitnami images require GID 0 to write to internal socket and PID directories
|
||||
networks:
|
||||
opencloud-net:
|
||||
entrypoint: [ "/bin/sh", "/opt/bitnami/scripts/openldap/docker-entrypoint-override.sh", "/opt/bitnami/scripts/openldap/run.sh" ]
|
||||
|
||||
@@ -23,19 +23,19 @@ services:
|
||||
# Keycloak IDP specific configuration
|
||||
PROXY_AUTOPROVISION_ACCOUNTS: "false"
|
||||
PROXY_ROLE_ASSIGNMENT_DRIVER: "oidc"
|
||||
OC_OIDC_ISSUER: https://${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}/realms/openCloud
|
||||
OC_OIDC_ISSUER: https://${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}/realms/openCloud
|
||||
PROXY_OIDC_REWRITE_WELLKNOWN: "true"
|
||||
WEB_OIDC_CLIENT_ID: ${OC_OIDC_CLIENT_ID:-web}
|
||||
PROXY_USER_OIDC_CLAIM: "uuid"
|
||||
PROXY_USER_CS3_CLAIM: "userid"
|
||||
WEB_OPTION_ACCOUNT_EDIT_LINK_HREF: "https://${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}/realms/openCloud/account"
|
||||
WEB_OPTION_ACCOUNT_EDIT_LINK_HREF: "https://${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}/realms/openCloud/account"
|
||||
# admin and demo accounts must be created in Keycloak
|
||||
OC_ADMIN_USER_ID: ""
|
||||
SETTINGS_SETUP_DEFAULT_ASSIGNMENTS: "false"
|
||||
GRAPH_ASSIGN_DEFAULT_USER_ROLE: "false"
|
||||
GRAPH_USERNAME_MATCH: "none"
|
||||
# This is needed to set the correct CSP rules for OpenCloud
|
||||
IDP_DOMAIN: ${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}
|
||||
IDP_DOMAIN: ${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
|
||||
ldap-server:
|
||||
image: bitnamilegacy/openldap:2.6
|
||||
@@ -64,7 +64,7 @@ services:
|
||||
restart: always
|
||||
|
||||
postgres:
|
||||
image: postgres:17-alpine
|
||||
image: postgres:17.10-alpine
|
||||
networks:
|
||||
opencloud-net:
|
||||
volumes:
|
||||
@@ -78,7 +78,7 @@ services:
|
||||
restart: always
|
||||
|
||||
keycloak:
|
||||
image: quay.io/keycloak/keycloak:26.3.3
|
||||
image: quay.io/keycloak/keycloak:26.7.1
|
||||
networks:
|
||||
opencloud-net:
|
||||
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
||||
@@ -89,7 +89,7 @@ services:
|
||||
- "./config/keycloak/themes/opencloud:/opt/keycloak/themes/opencloud"
|
||||
environment:
|
||||
LDAP_ADMIN_PASSWORD: ${LDAP_BIND_PASSWORD:-admin}
|
||||
OC_DOMAIN: ${OC_DOMAIN:-cloud.opencloud.test}
|
||||
OC_DOMAIN: ${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
KC_HOSTNAME: ${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}
|
||||
KC_DB: postgres
|
||||
KC_DB_URL: "jdbc:postgresql://postgres:5432/keycloak"
|
||||
|
||||
43
renovate.json
Normal file
43
renovate.json
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"platformAutomerge": true,
|
||||
"enabledManagers": ["docker-compose", "custom.regex"],
|
||||
"baseBranchPatterns": ["main", "stable-4.0", "stable-7.2"],
|
||||
"packageRules": [
|
||||
{
|
||||
"matchManagers": ["docker-compose", "custom.regex"],
|
||||
"labels": ["Type:Dependencies", "Bot:Renovate"]
|
||||
},
|
||||
{
|
||||
"matchManagers": ["docker-compose"],
|
||||
"matchUpdateTypes": ["patch"],
|
||||
"automerge": true
|
||||
},
|
||||
{
|
||||
"matchBaseBranches": ["stable-4.0", "stable-7.2"],
|
||||
"matchUpdateTypes": ["major", "minor"],
|
||||
"enabled": false
|
||||
},
|
||||
{
|
||||
"matchPackageNames": ["postgres"],
|
||||
"matchManagers": ["docker-compose"],
|
||||
"allowedVersions": "/^17\\.\\d+-alpine$/"
|
||||
}
|
||||
],
|
||||
"docker-compose": {
|
||||
"managerFilePatterns": ["/.+\\.ya?ml$/"]
|
||||
},
|
||||
"customManagers": [
|
||||
{
|
||||
"customType": "regex",
|
||||
"managerFilePatterns": [
|
||||
"/^docker-compose\\.yml$/",
|
||||
"/^weboffice\\/collabora\\.yml$/"
|
||||
],
|
||||
"matchStrings": [
|
||||
"# renovate: depName=(?<depName>[^\\s]+)\\n\\s+image: \\$\\{[^}]+\\}:\\$\\{[^}]+-(?<currentValue>[0-9]+\\.[0-9]+\\.[0-9]+)\\}"
|
||||
],
|
||||
"datasourceTemplate": "docker"
|
||||
}
|
||||
]
|
||||
}
|
||||
59
search/opensearch.yml
Normal file
59
search/opensearch.yml
Normal file
@@ -0,0 +1,59 @@
|
||||
---
|
||||
services:
|
||||
opencloud:
|
||||
environment:
|
||||
# Point the search service at OpenSearch instead of the embedded bleve index.
|
||||
SEARCH_ENGINE_TYPE: open-search
|
||||
SEARCH_ENGINE_OPEN_SEARCH_CLIENT_ADDRESSES: http://opensearch:9200
|
||||
SEARCH_ENGINE_OPEN_SEARCH_CLIENT_INSECURE: "true"
|
||||
SEARCH_ENGINE_OPEN_SEARCH_RESOURCE_INDEX_NAME: ${OPENSEARCH_RESOURCE_INDEX:-opencloud-resources}
|
||||
depends_on:
|
||||
opensearch:
|
||||
condition: service_healthy
|
||||
|
||||
opensearch:
|
||||
image: ${OPENSEARCH_DOCKER_IMAGE:-opensearchproject/opensearch}:${OPENSEARCH_DOCKER_TAG:-2.19.5}
|
||||
environment:
|
||||
discovery.type: single-node
|
||||
bootstrap.memory_lock: "true"
|
||||
OPENSEARCH_JAVA_OPTS: ${OPENSEARCH_JAVA_OPTS:--Xms512m -Xmx512m}
|
||||
# Security plugin is disabled: OpenSearch is only reachable on the
|
||||
# internal opencloud-net bridge and no port is published to the host.
|
||||
# Do NOT enable a published port or expose this via the reverse proxy
|
||||
# without first enabling and configuring the security plugin.
|
||||
DISABLE_SECURITY_PLUGIN: "true"
|
||||
DISABLE_INSTALL_DEMO_CONFIG: "true"
|
||||
# Disable the disk-based shard allocation watermarks. By default OpenSearch
|
||||
# marks indices read-only when the host disk is <5% free, which silently
|
||||
# turns bulk upserts into no-ops. Fine to disable on a single-node dev box.
|
||||
cluster.routing.allocation.disk.threshold_enabled: "false"
|
||||
ulimits:
|
||||
memlock:
|
||||
soft: -1
|
||||
hard: -1
|
||||
nofile:
|
||||
soft: 65536
|
||||
hard: 65536
|
||||
networks:
|
||||
opencloud-net:
|
||||
volumes:
|
||||
- ${OPENSEARCH_DATA_DIR:-opensearch-data}:/usr/share/opensearch/data
|
||||
healthcheck:
|
||||
# Single-node clusters can't go green (replicas have nowhere to land), so
|
||||
# yellow is the healthy state. Still gates opencloud until opensearch accepts
|
||||
# requests.
|
||||
test:
|
||||
[
|
||||
"CMD-SHELL",
|
||||
"curl -sf 'http://localhost:9200/_cluster/health?wait_for_status=yellow&timeout=5s' > /dev/null || exit 1"
|
||||
]
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 24
|
||||
start_period: 60s
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
restart: always
|
||||
|
||||
volumes:
|
||||
opensearch-data:
|
||||
@@ -11,6 +11,18 @@ services:
|
||||
restart: always
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"bash",
|
||||
"-c",
|
||||
"exec 3<>/dev/tcp/127.0.0.1/9998 && printf 'GET /tika HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 && grep '200 OK' <&3",
|
||||
]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 5s
|
||||
|
||||
opencloud:
|
||||
environment:
|
||||
@@ -18,3 +30,6 @@ services:
|
||||
SEARCH_EXTRACTOR_TYPE: tika
|
||||
SEARCH_EXTRACTOR_TIKA_TIKA_URL: http://tika:9998
|
||||
FRONTEND_FULL_TEXT_SEARCH_ENABLED: "true"
|
||||
depends_on:
|
||||
tika:
|
||||
condition: service_healthy
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17-alpine
|
||||
image: postgres:17.10-alpine
|
||||
networks:
|
||||
opencloud-net:
|
||||
volumes:
|
||||
@@ -15,7 +15,7 @@ services:
|
||||
restart: always
|
||||
|
||||
keycloak:
|
||||
image: quay.io/keycloak/keycloak:26.3.3
|
||||
image: quay.io/keycloak/keycloak:26.7.1
|
||||
networks:
|
||||
opencloud-net:
|
||||
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
||||
|
||||
@@ -5,15 +5,6 @@ services:
|
||||
opencloud-net:
|
||||
aliases:
|
||||
- ${COLLABORA_DOMAIN:-collabora.opencloud.test}
|
||||
- ${WOPISERVER_DOMAIN:-wopiserver.opencloud.test}
|
||||
collaboration:
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.collaboration.entrypoints=https"
|
||||
- "traefik.http.routers.collaboration.rule=Host(`${WOPISERVER_DOMAIN:-wopiserver.opencloud.test}`)"
|
||||
- "traefik.http.routers.collaboration.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||
- "traefik.http.routers.collaboration.service=collaboration"
|
||||
- "traefik.http.services.collaboration.loadbalancer.server.port=9300"
|
||||
collabora:
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
@@ -21,4 +12,5 @@ services:
|
||||
- "traefik.http.routers.collabora.rule=Host(`${COLLABORA_DOMAIN:-collabora.opencloud.test}`)"
|
||||
- "traefik.http.routers.collabora.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||
- "traefik.http.routers.collabora.service=collabora"
|
||||
- "traefik.http.routers.collabora.middlewares=hsts-header"
|
||||
- "traefik.http.services.collabora.loadbalancer.server.port=9980"
|
||||
|
||||
18
traefik/euro-office.yml
Normal file
18
traefik/euro-office.yml
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
services:
|
||||
traefik:
|
||||
networks:
|
||||
opencloud-net:
|
||||
aliases:
|
||||
- ${EURO_OFFICE_DOMAIN:-euro-office.opencloud.test}
|
||||
euro-office:
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.euro-office.entrypoints=https"
|
||||
- "traefik.http.routers.euro-office.rule=Host(`${EURO_OFFICE_DOMAIN:-euro-office.opencloud.test}`)"
|
||||
- "traefik.http.routers.euro-office.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||
- "traefik.http.routers.euro-office.service=euro-office"
|
||||
- "traefik.http.services.euro-office.loadbalancer.server.port=80"
|
||||
# websockets can't be opened when this is omitted
|
||||
- "traefik.http.middlewares.euro-office.headers.customrequestheaders.X-Forwarded-Proto=https"
|
||||
- "traefik.http.routers.euro-office.middlewares=euro-office"
|
||||
@@ -12,4 +12,5 @@ services:
|
||||
- "traefik.http.routers.keycloak.rule=Host(`${KEYCLOAK_DOMAIN:-keycloak.opencloud.test}`)"
|
||||
- "traefik.http.routers.keycloak.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||
- "traefik.http.routers.keycloak.service=keycloak"
|
||||
- "traefik.http.routers.keycloak.middlewares=hsts-header"
|
||||
- "traefik.http.services.keycloak.loadbalancer.server.port=8080"
|
||||
|
||||
@@ -3,13 +3,20 @@ services:
|
||||
opencloud:
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
# define middleware here, to make sure its loaded with the first defined container (opencloud)
|
||||
# if defined in the traefik container with a disabled dashboard it won't be loaded fast enough
|
||||
- "traefik.http.middlewares.hsts-header.headers.stsSeconds=31536000"
|
||||
- "traefik.http.middlewares.hsts-header.headers.stsIncludeSubdomains=true"
|
||||
- "traefik.http.middlewares.hsts-header.headers.stsPreload=true"
|
||||
- "traefik.http.middlewares.hsts-header.headers.forceSTSHeader=true"
|
||||
- "traefik.http.routers.opencloud.entrypoints=https"
|
||||
- "traefik.http.routers.opencloud.rule=Host(`${OC_DOMAIN:-cloud.opencloud.test}`)"
|
||||
- "traefik.http.routers.opencloud.service=opencloud"
|
||||
- "traefik.http.routers.opencloud.middlewares=hsts-header"
|
||||
- "traefik.http.services.opencloud.loadbalancer.server.port=9200"
|
||||
- "traefik.http.routers.opencloud.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||
traefik:
|
||||
image: traefik:v3.6.4
|
||||
image: traefik:v3.7.10
|
||||
# release notes: https://github.com/traefik/traefik/releases
|
||||
user: ${TRAEFIK_CONTAINER_UID_GID:-0:0}
|
||||
networks:
|
||||
|
||||
@@ -6,79 +6,98 @@ services:
|
||||
# this is needed for setting the correct CSP header
|
||||
COLLABORA_DOMAIN: ${COLLABORA_DOMAIN:-collabora.opencloud.test}
|
||||
TRAEFIK_PORT_HTTPS: ${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
# 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
|
||||
# run the collaboration (WOPI) service inside the main opencloud process,
|
||||
# appended to any user defined services in START_ADDITIONAL_SERVICES
|
||||
OC_ADD_RUN_SERVICES: ${START_ADDITIONAL_SERVICES:-}${START_ADDITIONAL_SERVICES:+,}collaboration
|
||||
# make collabora the secure view app
|
||||
FRONTEND_APP_HANDLER_SECURE_VIEW_APP_ADDR: eu.opencloud.api.collaboration
|
||||
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}
|
||||
user: ${OC_CONTAINER_UID_GID:-1000:1000}
|
||||
networks:
|
||||
opencloud-net:
|
||||
depends_on:
|
||||
opencloud:
|
||||
condition: service_started
|
||||
collabora:
|
||||
condition: service_healthy
|
||||
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}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
# collaboration service configuration; the WOPI endpoint is served by the
|
||||
# opencloud proxy on the opencloud domain (/wopi and /collaboration routes),
|
||||
# so no separate wopiserver domain, route or port is needed
|
||||
COLLABORATION_WOPI_SRC: https://${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
COLLABORATION_APP_NAME: "CollaboraOnline"
|
||||
COLLABORATION_APP_PRODUCT: "Collabora"
|
||||
COLLABORATION_APP_ADDR: https://${COLLABORA_DOMAIN:-collabora.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
COLLABORATION_APP_ICON: https://${COLLABORA_DOMAIN:-collabora.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}/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}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
|
||||
# One-shot service that generates the WOPI proof key on first start and
|
||||
# keeps it in a named volume, like the proofKeyGeneration feature of the
|
||||
# collabora-online helm chart.
|
||||
# To rotate the key, remove the volume and start again:
|
||||
# docker compose down collabora && docker volume rm <project>_collabora-proof-key
|
||||
collabora-proof-key:
|
||||
image: alpine/openssl:3.5.7
|
||||
entrypoint: ["/bin/sh"]
|
||||
command:
|
||||
- -ec
|
||||
- |
|
||||
if [ ! -s /proof/proof_key ]; then
|
||||
openssl genrsa -traditional -out /proof/proof_key.tmp 4096
|
||||
chown 1001:1001 /proof/proof_key.tmp
|
||||
chmod 400 /proof/proof_key.tmp
|
||||
mv /proof/proof_key.tmp /proof/proof_key
|
||||
echo "WOPI proof key generated"
|
||||
else
|
||||
echo "WOPI proof key already exists"
|
||||
fi
|
||||
volumes:
|
||||
# configure the .env file to use own paths instead of docker internal volumes
|
||||
- ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud
|
||||
- collabora-proof-key:/proof
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
restart: always
|
||||
restart: "no"
|
||||
|
||||
collabora:
|
||||
image: collabora/code:25.04.7.1.1
|
||||
image: collabora/code:26.04.2.4.1
|
||||
# release notes: https://www.collaboraonline.com/release-notes/
|
||||
networks:
|
||||
opencloud-net:
|
||||
depends_on:
|
||||
collabora-proof-key:
|
||||
condition: service_completed_successfully
|
||||
environment:
|
||||
aliasgroup1: https://${WOPISERVER_DOMAIN:-wopiserver.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
DONT_GEN_SSL_CERT: "YES"
|
||||
extra_params: |
|
||||
--o:ssl.enable=${COLLABORA_SSL_ENABLE:-true} \
|
||||
--o:ssl.ssl_verification=${COLLABORA_SSL_VERIFICATION:-true} \
|
||||
--o:ssl.termination=true \
|
||||
--o:welcome.enable=false \
|
||||
--o:net.frame_ancestors=${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-} \
|
||||
--o:net.lok_allow.host[14]=${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-} \
|
||||
# WOPI host allowlist; the WOPI endpoint is served by the opencloud proxy on the opencloud domain
|
||||
aliasgroup1: https://${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
extra_params: >
|
||||
--o:ssl.enable=${COLLABORA_SSL_ENABLE:-true}
|
||||
--o:ssl.ssl_verification=${COLLABORA_SSL_VERIFICATION:-true}
|
||||
--o:ssl.termination=true
|
||||
--o:welcome.enable=false
|
||||
--o:net.frame_ancestors=${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
--o:net.lok_allow.host[14]=${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
--o:home_mode.enable=${COLLABORA_HOME_MODE:-false}
|
||||
username: ${COLLABORA_ADMIN_USER:-admin}
|
||||
password: ${COLLABORA_ADMIN_PASSWORD:-admin}
|
||||
cap_add:
|
||||
- MKNOD
|
||||
- SYS_ADMIN
|
||||
security_opt:
|
||||
- seccomp=unconfined
|
||||
- apparmor:unconfined
|
||||
volumes:
|
||||
# Mount local TrueType fonts so the container can use system fonts
|
||||
# (e.g. Microsoft fonts like Arial, Calibri, Cambria by installing the `ttf-mscorefonts-installer` package).
|
||||
- /usr/share/fonts/truetype:/usr/share/fonts/truetype/more:ro
|
||||
- /usr/share/fonts/truetype:/opt/cool/systemplate/usr/share/fonts/truetype/more:ro
|
||||
# WOPI proof key generated by the collabora-proof-key service.
|
||||
- type: volume
|
||||
source: collabora-proof-key
|
||||
target: /etc/coolwsd/proof_key
|
||||
read_only: true
|
||||
volume:
|
||||
subpath: proof_key
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
restart: always
|
||||
entrypoint: [ '/bin/bash', '-c' ]
|
||||
command: [ 'coolconfig generate-proof-key && /start-collabora-online.sh' ]
|
||||
healthcheck:
|
||||
test: [ "CMD", "curl", "-f", "http://localhost:9980/hosting/discovery" ]
|
||||
# --use-env-vars makes the probe read extra_params, so it probes with
|
||||
# the same http/https scheme the server actually runs with; without it
|
||||
# the probe falls back to coolwsd.xml where ssl.enable defaults to true
|
||||
test: ["CMD", "/usr/bin/coolwsd", "--probe", "--use-env-vars"]
|
||||
interval: 15s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
volumes:
|
||||
collabora-proof-key:
|
||||
|
||||
53
weboffice/euro-office.yml
Normal file
53
weboffice/euro-office.yml
Normal file
@@ -0,0 +1,53 @@
|
||||
---
|
||||
services:
|
||||
|
||||
opencloud:
|
||||
environment:
|
||||
# this is needed for setting the correct CSP header
|
||||
EURO_OFFICE_DOMAIN: ${EURO_OFFICE_DOMAIN:-euro-office.opencloud.test}
|
||||
TRAEFIK_PORT_HTTPS: ${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
# run the collaboration (WOPI) service inside the main opencloud process,
|
||||
# appended to any user defined services in START_ADDITIONAL_SERVICES
|
||||
OC_ADD_RUN_SERVICES: ${START_ADDITIONAL_SERVICES:-}${START_ADDITIONAL_SERVICES:+,}collaboration
|
||||
# collaboration service configuration; the WOPI endpoint is served by the
|
||||
# opencloud proxy on the opencloud domain (/wopi and /collaboration routes),
|
||||
# so no separate wopiserver domain, route or port is needed
|
||||
COLLABORATION_WOPI_SRC: https://${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
COLLABORATION_APP_NAME: "Euro-Office"
|
||||
COLLABORATION_APP_PRODUCT: "OnlyOffice"
|
||||
COLLABORATION_APP_ADDR: https://${EURO_OFFICE_DOMAIN:-euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}
|
||||
COLLABORATION_APP_ICON: https://${EURO_OFFICE_DOMAIN:-euro-office.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}/web-apps/apps/documenteditor/main/resources/img/favicon.ico
|
||||
COLLABORATION_APP_INSECURE: "${INSECURE:-true}"
|
||||
COLLABORATION_CS3API_DATAGATEWAY_INSECURE: "${INSECURE:-true}"
|
||||
COLLABORATION_APP_PROOF_DISABLE: "true"
|
||||
volumes:
|
||||
- ./config/euro-office/app-registry.yaml:/etc/opencloud/app-registry.yaml
|
||||
|
||||
euro-office:
|
||||
image: ${EURO_OFFICE_DOCKER_IMAGE:-ghcr.io/euro-office/documentserver}:${EURO_OFFICE_DOCKER_TAG:-latest}
|
||||
# changelog https://github.com/EURO-office/DocumentServer/releases
|
||||
networks:
|
||||
opencloud-net:
|
||||
environment:
|
||||
WOPI_ENABLED: "true"
|
||||
# self-signed certificates
|
||||
USE_UNAUTHORIZED_STORAGE: "${INSECURE:-false}"
|
||||
volumes:
|
||||
# Mount local TrueType fonts so the container can use system fonts
|
||||
# (e.g. Microsoft fonts like Arial, Calibri, Cambria by installing the `ttf-mscorefonts-installer` package).
|
||||
- /usr/share/fonts/truetype:/usr/share/fonts/truetype/more:ro
|
||||
logging:
|
||||
driver: ${LOG_DRIVER:-local}
|
||||
restart: always
|
||||
healthcheck:
|
||||
test:
|
||||
[
|
||||
"CMD",
|
||||
"bash",
|
||||
"-c",
|
||||
"exec 3<>/dev/tcp/127.0.0.1/80 && printf 'GET /hosting/discovery HTTP/1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n' >&3 && cat <&3 | head -1 | grep -q '200 OK'"
|
||||
]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 120s
|
||||
Reference in New Issue
Block a user