mirror of
https://github.com/opencloud-eu/opencloud-compose.git
synced 2026-10-07 11:28:15 +08:00
Compare commits
92 Commits
2bd0b17c3e
...
renovate/m
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f10d63c572 | ||
|
|
d6efecf176 | ||
|
|
05b2aefa97 | ||
|
|
34555ec2db | ||
|
|
0cd92a3d59 | ||
|
|
2d423cca0c | ||
|
|
a38dc348f4 | ||
|
|
e6ae9deb4f | ||
|
|
8f80c01d7e | ||
|
|
55ee3523a0 | ||
|
|
53e3c0d95b | ||
|
|
87e3c61615 | ||
|
|
2d992b77de | ||
|
|
81e347d300 | ||
|
|
fcfc216f16 | ||
|
|
2b10bd8cb9 | ||
|
|
442017268a | ||
|
|
b31c3943fd | ||
|
|
cb23d6af18 | ||
|
|
8a1193f2d4 | ||
|
|
18dc807be0 | ||
|
|
0fab6e73a0 | ||
|
|
871b6ae4c8 | ||
|
|
f8b24d5200 | ||
|
|
8826153af8 | ||
|
|
6ed456d3df | ||
|
|
c092407fcd | ||
|
|
8f79c17270 | ||
|
|
dc14e7e10a | ||
|
|
323b2c4aa4 | ||
|
|
887e63e8a6 | ||
|
|
a6e883bcf2 | ||
|
|
49f5ce9d52 | ||
|
|
e824bd17db | ||
|
|
1721922f52 | ||
|
|
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 | ||
|
|
e92718ffa0 | ||
|
|
8c43842e7b | ||
|
|
cc49b063c0 | ||
|
|
7cf59a62a9 | ||
|
|
32b328218f | ||
|
|
c814f08cd5 |
32
.env.example
32
.env.example
@@ -10,24 +10,24 @@ INSECURE=true
|
|||||||
## Features ##
|
## Features ##
|
||||||
# The following variable is a convenience variable to enable or disable features of this compose project.
|
# The following variable is a convenience variable to enable or disable features of this compose project.
|
||||||
# Example: if you want to use traefik and letsencrypt, you can set the variable to
|
# Example: if you want to use traefik and letsencrypt, you can set the variable to
|
||||||
#COMPOSE_FILE=docker-compose.yml:traefik/opencloud.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:traefik/opencloud.yml
|
||||||
# This enables you to just run `docker compose up -d` and the compose files will be added to the stack.
|
# This enables you to just run `docker compose up -d` and the compose files will be added to the stack.
|
||||||
# As alternative approach you can run `docker compose -f docker-compose.yml -f docker-compose.traefik.yml up -d`
|
# As alternative approach you can run `docker compose -f docker-compose.yml -f docker-compose.traefik.yml up -d`
|
||||||
# Default: OpenCloud and Collabora with traefik and letsencypt
|
# Default: OpenCloud and Collabora with traefik and letsencypt
|
||||||
# This needs DNS entries for the domain names used in the .env file.
|
# This needs DNS entries for the domain names used in the .env file.
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml
|
||||||
# If you want to use the external proxy, you can use the following combination.
|
# If you want to use the external proxy, you can use the following combination.
|
||||||
# DNS entries and certificates need to be managed by the external environment.
|
# DNS entries and certificates need to be managed by the external environment.
|
||||||
# The domain names need to be entered into the .env file.
|
# The domain names need to be entered into the .env file.
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:external-proxy/opencloud.yml:external-proxy/collabora.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/collabora.yml:external-proxy/opencloud.yml:external-proxy/collabora.yml
|
||||||
# Keycloak Shared User Directory
|
# Keycloak Shared User Directory
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/ldap-keycloak.yml:traefik/ldap-keycloak.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/ldap-keycloak.yml:traefik/ldap-keycloak.yml
|
||||||
# External IDP
|
# External IDP
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/external-idp.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/collabora.yml:traefik/opencloud.yml:traefik/collabora.yml:idm/external-idp.yml
|
||||||
# Euro Office with traefik and letsencrypt
|
# Euro Office with traefik and letsencrypt
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/euroffice.yml:traefik/opencloud.yml:traefik/euroffice.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/euro-office.yml:traefik/opencloud.yml:traefik/euro-office.yml
|
||||||
# Euro Office with external proxy (Nginx, Caddy, etc.)
|
# Euro Office with external proxy (Nginx, Caddy, etc.)
|
||||||
#COMPOSE_FILE=docker-compose.yml:weboffice/euroffice.yml:external-proxy/opencloud.yml:external-proxy/euroffice.yml
|
#COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:weboffice/euro-office.yml:external-proxy/opencloud.yml:external-proxy/euro-office.yml
|
||||||
|
|
||||||
## Traefik Settings ##
|
## Traefik Settings ##
|
||||||
# Note: Traefik is always enabled and can't be disabled.
|
# Note: Traefik is always enabled and can't be disabled.
|
||||||
@@ -87,7 +87,7 @@ TRAEFIK_LOG_LEVEL=
|
|||||||
# For production releases: "opencloudeu/opencloud"
|
# For production releases: "opencloudeu/opencloud"
|
||||||
# For rolling releases: "opencloudeu/opencloud-rolling"
|
# For rolling releases: "opencloudeu/opencloud-rolling"
|
||||||
# Defaults to production if not set otherwise
|
# Defaults to production if not set otherwise
|
||||||
OC_DOCKER_IMAGE=opencloudeu/opencloud
|
OC_DOCKER_IMAGE=opencloudeu/opencloud-rolling
|
||||||
# The openCloud container version.
|
# The openCloud container version.
|
||||||
# Defaults to the latest version-tag. Use git pull to update.
|
# Defaults to the latest version-tag. Use git pull to update.
|
||||||
OC_DOCKER_TAG=
|
OC_DOCKER_TAG=
|
||||||
@@ -383,9 +383,23 @@ KC_DB_PASSWORD=
|
|||||||
# - ./config/ldap/ldif/30_demo_users.ldif:/ldifs/30_demo_users.ldif
|
# - ./config/ldap/ldif/30_demo_users.ldif:/ldifs/30_demo_users.ldif
|
||||||
# - ./config/ldap/ldif/40_demo_groups.ldif:/ldifs/40_demo_groups.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
|
# Then add it to: COMPOSE_FILE=docker-compose.yml:yjs/yjs.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.
|
# WARNING: Do not use in production.
|
||||||
|
|
||||||
|
### Yjs Settings ###
|
||||||
|
# The yjs server relays updates between users editing the same file.
|
||||||
|
# It is enabled by default via yjs/yjs.yml in the COMPOSE_FILE variable.
|
||||||
|
# The browser reaches it under https://{OC_DOMAIN}/yjs, the OpenCloud proxy forwards it.
|
||||||
|
# Docker image to use for the yjs container.
|
||||||
|
#YJS_DOCKER_IMAGE=opencloudeu/yjs
|
||||||
|
# Docker tag to pull for the yjs container.
|
||||||
|
#YJS_DOCKER_TAG=
|
||||||
|
# URL the yjs server uses to reach OpenCloud. Defaults to "http://opencloud:9200".
|
||||||
|
#YJS_OPENCLOUD_URL=
|
||||||
|
# Grace period in milliseconds for a graceful shutdown. Defaults to "15000".
|
||||||
|
# Keep it below the stop_grace_period set in yjs/yjs.yml.
|
||||||
|
#YJS_SHUTDOWN_GRACE_PERIOD_MS=
|
||||||
|
|
||||||
### Radicale Setting ###
|
### Radicale Setting ###
|
||||||
# Radicale is a small open-source CalDAV (calendars, to-do lists) and CardDAV (contacts) server.
|
# 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
|
# When enabled OpenCloud is configured as a reverse proxy for Radicale, providing all authenticated
|
||||||
|
|||||||
33
README.md
33
README.md
@@ -147,12 +147,12 @@ Include Euro Office for document editing using either method:
|
|||||||
|
|
||||||
Using `-f` flags:
|
Using `-f` flags:
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose.yml -f weboffice/euroffice.yml -f traefik/opencloud.yml -f traefik/euroffice.yml up -d
|
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`:
|
Or by setting in `.env`:
|
||||||
```
|
```
|
||||||
COMPOSE_FILE=docker-compose.yml:weboffice/euroffice.yml:traefik/opencloud.yml:traefik/euroffice.yml
|
COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:traefik/opencloud.yml:traefik/euro-office.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
> **For local development only**: Add to `/etc/hosts`:
|
> **For local development only**: Add to `/etc/hosts`:
|
||||||
@@ -195,6 +195,22 @@ By default, OpenCloud Compose uses `apache/tika:latest` which provides:
|
|||||||
|
|
||||||
The base variant is recommended for most use cases. If you need advanced features like specialized OCR processing or specific image format support, you can override the image by setting `TIKA_IMAGE=apache/tika:latest-full` in your `.env` file.
|
The base variant is recommended for most use cases. If you need advanced features like specialized OCR processing or specific image format support, you can override the image by setting `TIKA_IMAGE=apache/tika:latest-full` in your `.env` file.
|
||||||
|
|
||||||
|
### With the Yjs Server
|
||||||
|
|
||||||
|
The yjs server enables collaborative editing of files. The browser connects to `wss://{OC_DOMAIN}/yjs`. The OpenCloud proxy forwards this route to the yjs container, so no extra DNS entry or port is needed.
|
||||||
|
|
||||||
|
Using `-f` flags:
|
||||||
|
```bash
|
||||||
|
docker compose -f docker-compose.yml -f yjs/yjs.yml -f traefik/opencloud.yml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Or by setting in `.env`:
|
||||||
|
```
|
||||||
|
COMPOSE_FILE=docker-compose.yml:yjs/yjs.yml:traefik/opencloud.yml
|
||||||
|
```
|
||||||
|
|
||||||
|
The service keeps documents in memory only. All users of one file must reach the same instance, so run a single instance.
|
||||||
|
|
||||||
### With Radicale
|
### With Radicale
|
||||||
|
|
||||||
Enable CalDAV (calendars, to-do lists) and CardDAV (contacts) server.
|
Enable CalDAV (calendars, to-do lists) and CardDAV (contacts) server.
|
||||||
@@ -271,12 +287,12 @@ The WOPI server runs inside the OpenCloud process and is served on the OpenCloud
|
|||||||
To use Euro Office instead of Collabora behind an external proxy, swap the web office compose files:
|
To use Euro Office instead of Collabora behind an external proxy, swap the web office compose files:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose -f docker-compose.yml -f weboffice/euroffice.yml -f external-proxy/opencloud.yml -f external-proxy/euroffice.yml up -d
|
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`:
|
Or by setting in `.env`:
|
||||||
```
|
```
|
||||||
COMPOSE_FILE=docker-compose.yml:weboffice/euroffice.yml:external-proxy/opencloud.yml:external-proxy/euroffice.yml
|
COMPOSE_FILE=docker-compose.yml:weboffice/euro-office.yml:external-proxy/opencloud.yml:external-proxy/euro-office.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
This exposes the necessary ports:
|
This exposes the necessary ports:
|
||||||
@@ -286,7 +302,7 @@ This exposes the necessary ports:
|
|||||||
As with Collabora, the WOPI server is served on the OpenCloud port (9200) under the `/wopi` and `/collaboration` paths and needs no separate port.
|
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]
|
> [!WARNING]
|
||||||
> `external-proxy/euroffice.yml` binds the exposed ports to `127.0.0.1` only. If your external proxy runs on a different host, use `external-proxy/euroffice-exposed.yml`, which binds to all interfaces (`0.0.0.0`). Only expose these ports when you know what you are doing.
|
> `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:**
|
**Please note:**
|
||||||
If you're using **Nginx Proxy Manager (NPM)**, you **should NOT** activate **"Block Common Exploits"** for the Proxy Host.
|
If you're using **Nginx Proxy Manager (NPM)**, you **should NOT** activate **"Block Common Exploits"** for the Proxy Host.
|
||||||
@@ -319,12 +335,12 @@ OpenCloud Compose supports adding SSL certificates for public domains and develo
|
|||||||
### Use Let's Encrypt with ACME Challenge
|
### Use Let's Encrypt with ACME Challenge
|
||||||
|
|
||||||
1. **Enable Let's Encrypt**:
|
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)
|
- Set `TRAEFIK_SERVICES_TLS_CONFIG="tls.certresolver=letsencrypt"` to use Let's Encrypt (default value)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# In your .env file
|
# 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"
|
TRAEFIK_SERVICES_TLS_CONFIG="tls.certresolver=letsencrypt"
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -412,7 +428,7 @@ Key variables:
|
|||||||
| `LDAP_BIND_PASSWORD` | LDAP password for the bind user | admin |
|
| `LDAP_BIND_PASSWORD` | LDAP password for the bind user | admin |
|
||||||
| `KC_DB_USERNAME` | Database user for keycloak | keycloak |
|
| `KC_DB_USERNAME` | Database user for keycloak | keycloak |
|
||||||
| `KC_DB_PASSWORD` | Database password 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_SERVICES_TLS_CONFIG` | Tell traefik and the services which TLS config to use | tls.certresolver=letsencrypt |
|
||||||
| `TRAEFIK_CERTS_DIR` | Directory for custom certificates. | ./certs |
|
| `TRAEFIK_CERTS_DIR` | Directory for custom certificates. | ./certs |
|
||||||
|
|
||||||
@@ -466,6 +482,7 @@ This repository uses a modular approach with multiple compose files:
|
|||||||
- `traefik/` - Traefik reverse proxy configurations
|
- `traefik/` - Traefik reverse proxy configurations
|
||||||
- `external-proxy/` - Configuration for external reverse proxies
|
- `external-proxy/` - Configuration for external reverse proxies
|
||||||
- `radicale/` - Radicale configuration
|
- `radicale/` - Radicale configuration
|
||||||
|
- `yjs/` - Yjs server configuration (collaborative editing)
|
||||||
- `config/` - Configuration files for OpenCloud, Keycloak, and LDAP
|
- `config/` - Configuration files for OpenCloud, Keycloak, and LDAP
|
||||||
|
|
||||||
## Advanced Usage
|
## Advanced Usage
|
||||||
|
|||||||
@@ -1,38 +1,51 @@
|
|||||||
:root {
|
:root {
|
||||||
--pf-global--primary-color--100: #e2baff;
|
--pf-v5-global--primary-color--100: #e2baff;
|
||||||
--pf-global--primary-color--200: #e2baff;
|
--pf-v5-global--primary-color--200: #e2baff;
|
||||||
--pf-global--primary-color--dark-100: #e2baff;
|
--pf-v5-global--primary-color--dark-100: #e2baff;
|
||||||
--pf-global--Color--light-100: #20434f;
|
--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-face {
|
||||||
font-family: OpenCloud;
|
font-family: Inter;
|
||||||
src: url('../fonts/OpenCloud500-Regular.woff2') format('woff2');
|
src: url('../fonts/Inter-Variable.woff2') format('woff2');
|
||||||
font-weight: normal;
|
font-weight: 100 900;
|
||||||
font-style: normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
@font-face {
|
|
||||||
font-family: OpenCloud;
|
|
||||||
src: url('../fonts/OpenCloud750-Bold.woff2') format('woff2');
|
|
||||||
font-weight: bold;
|
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: "OpenCloud", "Open Sans", Helvetica, Arial, sans-serif;
|
background: url(../img/background.png) no-repeat center fixed !important;
|
||||||
background: url(../img/background.png) no-repeat center !important;
|
|
||||||
background-size: cover !important;
|
background-size: cover !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.kc-logo-text {
|
.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;
|
background-size: contain;
|
||||||
width: 400px;
|
|
||||||
margin: 0 !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#kc-header-wrapper{
|
.kc-logo-text span {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#kc-header-wrapper {
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
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')
|
setLogoUrl('https://opencloud.eu')
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
parent=keycloak
|
parent=keycloak.v2
|
||||||
import=common/keycloak
|
import=common/keycloak
|
||||||
|
|
||||||
styles=css/login.css css/theme.css
|
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-CNZX96BL.css
Normal file
2
config/opencloud/apps/maps/assets/src-CNZX96BL.css
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
config/opencloud/apps/maps/js/hostInit-C_d58ZzI.mjs
Normal file
1
config/opencloud/apps/maps/js/hostInit-C_d58ZzI.mjs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./preload-helper-DYl5dUZ5.mjs";await(await e(()=>import(`./remoteEntry-BXGAhFe2.mjs`),[],import.meta.url)).init();
|
||||||
@@ -1 +0,0 @@
|
|||||||
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-CXnzN4cY.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/ox":{name:`@opencloud-eu/web-client/ox`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-client/ox' 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}},"@opencloud-eu/web-pkg/editor":{name:`@opencloud-eu/web-pkg/editor`,version:void 0,scope:[`default`],loaded:!1,from:`maps`,async get(){throw Error(`[Module Federation] Shared module '@opencloud-eu/web-pkg/editor' 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 +0,0 @@
|
|||||||
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 +0,0 @@
|
|||||||
import{t as e}from"./src-CIfRBuLG.mjs";export{e as default};
|
|
||||||
1
config/opencloud/apps/maps/js/maps-z34tTD6Z.mjs
Normal file
1
config/opencloud/apps/maps/js/maps-z34tTD6Z.mjs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./src-Bjkk5jHv.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=function(e,t){return new URL(e,t).href},t={},n=function(n,r,i){let a=Promise.resolve();if(r&&r.length>0){let n=document.getElementsByTagName(`link`),o=document.querySelector(`meta[property=csp-nonce]`),s=o?.nonce||o?.getAttribute(`nonce`);function c(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function l(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,new URL(`../../../src/node/plugins/importAnalysisBuild.ts`,import.meta.url)).href}a=c(r.map(r=>{if(r=e(r,i),r=l(r),r in t)return;t[r]=!0;let a=r.endsWith(`.css`);for(let e=n.length-1;e>=0;e--){let t=n[e];if(t.href===r&&(!a||t.rel===`stylesheet`))return}let o=document.createElement(`link`);if(o.rel=a?`stylesheet`:`modulepreload`,a||(o.as=`script`),o.crossOrigin=``,o.href=r,s&&o.setAttribute(`nonce`,s),document.head.appendChild(o),a)return new Promise((e,t)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>t(Error(`Unable to preload CSS for ${r}`)))})}))}function o(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return a.then(e=>{for(let t of e||[])t.status===`rejected`&&o(t.reason);return n().catch(o)})};export{n as t};
|
||||||
@@ -1 +0,0 @@
|
|||||||
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};
|
|
||||||
@@ -1,2 +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]);
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./localSharedImportMap-BrxIqYlq.mjs","./dist-CXnzN4cY.mjs","./preload-helper-DYl5dUZ5.mjs","./virtualExposes-BsjVAkf0.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};
|
import{t as e}from"./dist-CXnzN4cY.mjs";import{t}from"./preload-helper-DYl5dUZ5.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-BrxIqYlq.mjs`),__vite__mapDeps([0,1,2]),import.meta.url),c}async function d(){return l??=t(()=>import(`./virtualExposes-BsjVAkf0.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};
|
||||||
@@ -1 +0,0 @@
|
|||||||
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};
|
|
||||||
825
config/opencloud/apps/maps/js/src-Bjkk5jHv.mjs
Normal file
825
config/opencloud/apps/maps/js/src-Bjkk5jHv.mjs
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
|||||||
import{t as e}from"./src-CIfRBuLG.mjs";export{e as default};
|
|
||||||
1
config/opencloud/apps/maps/js/src-z34tTD6Z.mjs
Normal file
1
config/opencloud/apps/maps/js/src-z34tTD6Z.mjs
Normal file
@@ -0,0 +1 @@
|
|||||||
|
import{t as e}from"./src-Bjkk5jHv.mjs";export{e as default};
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/src-D755RU42.css"])))=>i.map(i=>d[i]);
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../assets/src-CNZX96BL.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};
|
import{t as e}from"./preload-helper-DYl5dUZ5.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-z34tTD6Z.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,7 @@
|
|||||||
{
|
{
|
||||||
"entrypoint": "js/remoteEntry-lxWu31Tr.mjs"
|
"name": "web-app-maps",
|
||||||
}
|
"version": "3.1.0",
|
||||||
|
"description": "OpenCloud Web Maps",
|
||||||
|
"license": "AGPL-3.0",
|
||||||
|
"entrypoint": "js/remoteEntry-BXGAhFe2.mjs"
|
||||||
|
}
|
||||||
@@ -25,6 +25,7 @@ directives:
|
|||||||
- 'https://${EURO_OFFICE_DOMAIN|euro-office.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
|
# This is needed for the external-sites web extension when embedding sites
|
||||||
- 'https://docs.opencloud.eu'
|
- 'https://docs.opencloud.eu'
|
||||||
|
- 'https://${IDP_DOMAIN|keycloak.opencloud.test}${TRAEFIK_PORT_HTTPS}/'
|
||||||
img-src:
|
img-src:
|
||||||
- '''self'''
|
- '''self'''
|
||||||
- 'data:'
|
- 'data:'
|
||||||
@@ -48,6 +49,7 @@ directives:
|
|||||||
style-src:
|
style-src:
|
||||||
- '''self'''
|
- '''self'''
|
||||||
- '''unsafe-inline'''
|
- '''unsafe-inline'''
|
||||||
|
- 'blob:'
|
||||||
worker-src:
|
worker-src:
|
||||||
- "'self'"
|
- "'self'"
|
||||||
- 'blob:'
|
- 'blob:'
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
# This adds four additional routes to the proxy. Forwarding
|
# This adds additional routes to the proxy. Forwarding
|
||||||
# request on '/carddav/', '/caldav/' and the respective '/.well-knwown'
|
# request on '/carddav/', '/caldav/' and the respective '/.well-knwown'
|
||||||
# endpoints to the radicale container and setting the required headers.
|
# endpoints to the radicale container and setting the required headers.
|
||||||
|
# '/yjs' is forwarded to the yjs container.
|
||||||
additional_policies:
|
additional_policies:
|
||||||
- name: default
|
- name: default
|
||||||
routes:
|
routes:
|
||||||
|
- endpoint: /yjs
|
||||||
|
backend: http://yjs:1234
|
||||||
|
unprotected: true
|
||||||
- endpoint: /caldav/
|
- endpoint: /caldav/
|
||||||
backend: http://radicale:5232
|
backend: http://radicale:5232
|
||||||
remote_user_header: X-Remote-User
|
remote_user_header: X-Remote-User
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
opencloud:
|
opencloud:
|
||||||
# renovate: depName=opencloudeu/opencloud
|
# renovate: depName=opencloudeu/opencloud-rolling
|
||||||
image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud}:${OC_DOCKER_TAG:-7.2.4}
|
image: ${OC_DOCKER_IMAGE:-opencloudeu/opencloud-rolling}:${OC_DOCKER_TAG:-8.1.0}
|
||||||
# changelog: https://github.com/opencloud-eu/opencloud/tree/main/changelog
|
# changelog: https://github.com/opencloud-eu/opencloud/tree/main/changelog
|
||||||
# release notes: https://docs.opencloud.eu/opencloud_release_notes.html
|
# release notes: https://docs.opencloud.eu/opencloud_release_notes.html
|
||||||
user: ${OC_CONTAINER_UID_GID:-1000:1000}
|
user: ${OC_CONTAINER_UID_GID:-1000:1000}
|
||||||
@@ -58,6 +58,7 @@ services:
|
|||||||
OC_DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE}
|
OC_DEFAULT_LANGUAGE: ${DEFAULT_LANGUAGE}
|
||||||
volumes:
|
volumes:
|
||||||
- ./config/opencloud/csp.yaml:/etc/opencloud/csp.yaml
|
- ./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
|
- ./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
|
# configure the .env file to use own paths instead of docker internal volumes
|
||||||
- ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud
|
- ${OC_CONFIG_DIR:-opencloud-config}:/etc/opencloud
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
opencloud:
|
opencloud:
|
||||||
environment:
|
environment:
|
||||||
# bind to all interfaces
|
# bind to all interfaces
|
||||||
PROXY_HTTP_ADDR: "0.0.0.0:9200"
|
PROXY_HTTP_ADDR: "0.0.0.0:9200"
|
||||||
ports:
|
ports:
|
||||||
# expose the opencloud server on localhost
|
# expose the opencloud server on localhost
|
||||||
- "127.0.0.1:9200:9200"
|
- "127.0.0.1:9200:9200"
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:17.10-alpine
|
image: postgres:17.11-alpine
|
||||||
networks:
|
networks:
|
||||||
opencloud-net:
|
opencloud-net:
|
||||||
volumes:
|
volumes:
|
||||||
@@ -78,7 +78,7 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
keycloak:
|
keycloak:
|
||||||
image: quay.io/keycloak/keycloak:26.6.4
|
image: quay.io/keycloak/keycloak:26.8.0
|
||||||
networks:
|
networks:
|
||||||
opencloud-net:
|
opencloud-net:
|
||||||
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
||||||
|
|||||||
45
renovate.json
Normal file
45
renovate.json
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
|
"dependencyDashboard": true,
|
||||||
|
"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$/",
|
||||||
|
"/^yjs\\/yjs\\.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
|
restart: always
|
||||||
logging:
|
logging:
|
||||||
driver: ${LOG_DRIVER:-local}
|
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:
|
opencloud:
|
||||||
environment:
|
environment:
|
||||||
@@ -18,3 +30,6 @@ services:
|
|||||||
SEARCH_EXTRACTOR_TYPE: tika
|
SEARCH_EXTRACTOR_TYPE: tika
|
||||||
SEARCH_EXTRACTOR_TIKA_TIKA_URL: http://tika:9998
|
SEARCH_EXTRACTOR_TIKA_TIKA_URL: http://tika:9998
|
||||||
FRONTEND_FULL_TEXT_SEARCH_ENABLED: "true"
|
FRONTEND_FULL_TEXT_SEARCH_ENABLED: "true"
|
||||||
|
depends_on:
|
||||||
|
tika:
|
||||||
|
condition: service_healthy
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:17.10-alpine
|
image: postgres:17.11-alpine
|
||||||
networks:
|
networks:
|
||||||
opencloud-net:
|
opencloud-net:
|
||||||
volumes:
|
volumes:
|
||||||
@@ -15,7 +15,7 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
keycloak:
|
keycloak:
|
||||||
image: quay.io/keycloak/keycloak:26.6.4
|
image: quay.io/keycloak/keycloak:26.8.0
|
||||||
networks:
|
networks:
|
||||||
opencloud-net:
|
opencloud-net:
|
||||||
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
command: [ "start", "--spi-connections-http-client-default-disable-trust-manager=${INSECURE:-false}", "--import-realm" ]
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ services:
|
|||||||
- "traefik.http.services.opencloud.loadbalancer.server.port=9200"
|
- "traefik.http.services.opencloud.loadbalancer.server.port=9200"
|
||||||
- "traefik.http.routers.opencloud.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
- "traefik.http.routers.opencloud.${TRAEFIK_SERVICES_TLS_CONFIG}"
|
||||||
traefik:
|
traefik:
|
||||||
image: traefik:v3.6.14
|
image: traefik:v3.7.14
|
||||||
# release notes: https://github.com/traefik/traefik/releases
|
# release notes: https://github.com/traefik/traefik/releases
|
||||||
user: ${TRAEFIK_CONTAINER_UID_GID:-0:0}
|
user: ${TRAEFIK_CONTAINER_UID_GID:-0:0}
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ services:
|
|||||||
WOPI_ENABLED: "true"
|
WOPI_ENABLED: "true"
|
||||||
# self-signed certificates
|
# self-signed certificates
|
||||||
USE_UNAUTHORIZED_STORAGE: "${INSECURE:-false}"
|
USE_UNAUTHORIZED_STORAGE: "${INSECURE:-false}"
|
||||||
|
JWT_SECRET: "${EURO_OFFICE_JWT_SECRET}"
|
||||||
volumes:
|
volumes:
|
||||||
# Mount local TrueType fonts so the container can use system fonts
|
# 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).
|
# (e.g. Microsoft fonts like Arial, Calibri, Cambria by installing the `ttf-mscorefonts-installer` package).
|
||||||
23
yjs/yjs.yml
Normal file
23
yjs/yjs.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
services:
|
||||||
|
opencloud:
|
||||||
|
environment:
|
||||||
|
WEB_OPTION_YJS_SERVER_URL: wss://${OC_DOMAIN:-cloud.opencloud.test}${TRAEFIK_PORT_HTTPS:+:}${TRAEFIK_PORT_HTTPS:-}/yjs
|
||||||
|
volumes:
|
||||||
|
# the /yjs route is configured in the proxy
|
||||||
|
- ./config/opencloud/proxy.yaml:/etc/opencloud/proxy.yaml
|
||||||
|
yjs:
|
||||||
|
# renovate: depName=opencloudeu/yjs
|
||||||
|
image: ${YJS_DOCKER_IMAGE:-opencloudeu/yjs}:${YJS_DOCKER_TAG:-1.1.0}
|
||||||
|
user: ${OC_CONTAINER_UID_GID:-1000:1000}
|
||||||
|
networks:
|
||||||
|
opencloud-net:
|
||||||
|
environment:
|
||||||
|
PORT: '1234'
|
||||||
|
# internal address, no TLS between the containers
|
||||||
|
OPENCLOUD_URL: ${YJS_OPENCLOUD_URL:-http://opencloud:9200}
|
||||||
|
SHUTDOWN_GRACE_PERIOD_MS: '${YJS_SHUTDOWN_GRACE_PERIOD_MS:-15000}'
|
||||||
|
logging:
|
||||||
|
driver: ${LOG_DRIVER:-local}
|
||||||
|
restart: always
|
||||||
|
stop_grace_period: 20s
|
||||||
Reference in New Issue
Block a user