diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 16e7a8a1..1fb20f98 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -183,3 +183,12 @@ updates: labels: - 3. to review - dependencies +- package-ecosystem: "docker" + directory: "/Containers/whiteboard" + schedule: + interval: "daily" + time: "12:00" + open-pull-requests-limit: 10 + labels: + - 3. to review + - dependencies diff --git a/Containers/apache/Caddyfile b/Containers/apache/Caddyfile index 8e7e4a21..d635f329 100644 --- a/Containers/apache/Caddyfile +++ b/Containers/apache/Caddyfile @@ -51,6 +51,12 @@ https://{$ADDITIONAL_TRUSTED_DOMAIN}:443, reverse_proxy {$TALK_HOST}:8081 } + # Whiteboard + route /whiteboard/* { + uri strip_prefix /whiteboard + reverse_proxy {$WHITEBOARD_HOST}:3002 + } + # Nextcloud route { header Strict-Transport-Security max-age=31536000; diff --git a/Containers/nextcloud/entrypoint.sh b/Containers/nextcloud/entrypoint.sh index 0d58d02b..c092d4bf 100644 --- a/Containers/nextcloud/entrypoint.sh +++ b/Containers/nextcloud/entrypoint.sh @@ -851,5 +851,22 @@ else fi fi +# Whiteboard app +if [ "$WHITEBOARD_ENABLED" = 'yes' ]; then + if ! [ -d "/var/www/html/custom_apps/whiteboard" ]; then + php /var/www/html/occ app:install whiteboard + elif [ "$(php /var/www/html/occ config:app:get whiteboard enabled)" != "yes" ]; then + php /var/www/html/occ app:enable whiteboard + php /var/www/html/occ config:app:set whiteboard collabBackendUrl --value="https://$NC_DOMAIN/whiteboard" + php /var/www/html/occ config:app:set whiteboard jwt_secret_key --value="$WHITEBOARD_SECRET" + elif [ "$SKIP_UPDATE" != 1 ]; then + php /var/www/html/occ app:update whiteboard + fi +else + if [ "$REMOVE_DISABLED_APPS" = yes ] && [ -d "/var/www/html/custom_apps/whiteboard" ]; then + php /var/www/html/occ app:remove whiteboard + fi +fi + # Remove the update skip file always rm -f "$NEXTCLOUD_DATA_DIR"/skip.update diff --git a/Containers/whiteboard/Dockerfile b/Containers/whiteboard/Dockerfile new file mode 100644 index 00000000..d854f53e --- /dev/null +++ b/Containers/whiteboard/Dockerfile @@ -0,0 +1,8 @@ +# syntax=docker/dockerfile:latest +FROM ghcr.io/nextcloud-releases/whiteboard:v1.0.1 + +COPY --chmod=775 start.sh /start.sh + +ENTRYPOINT ["/start.sh"] + +LABEL com.centurylinklabs.watchtower.enable="false" diff --git a/Containers/whiteboard/start.sh b/Containers/whiteboard/start.sh new file mode 100644 index 00000000..73a6dd18 --- /dev/null +++ b/Containers/whiteboard/start.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +# Only start container if nextcloud is accessible +while ! nc -z "$REDIS_HOST" 6379; do + echo "Waiting for redis to start..." + sleep 5 +done + +# Set a default for redis db index +if [ -z "$REDIS_DB_INDEX" ]; then + REDIS_DB_INDEX=0 +fi + +export REDIS_URL="redis://:$REDIS_HOST_PASSWORD@$REDIS_HOST/$REDIS_DB_INDEX" + +# Run it +npm run server:start + +exec "$@" diff --git a/php/containers.json b/php/containers.json index 4d447d83..89d23679 100644 --- a/php/containers.json +++ b/php/containers.json @@ -8,7 +8,8 @@ "nextcloud-aio-collabora", "nextcloud-aio-talk", "nextcloud-aio-nextcloud", - "nextcloud-aio-notify-push" + "nextcloud-aio-notify-push", + "nextcloud-aio-whiteboard" ], "display_name": "Apache", "image": "nextcloud/aio-apache", @@ -37,7 +38,8 @@ "TZ=%TIMEZONE%", "APACHE_MAX_SIZE=%APACHE_MAX_SIZE%", "APACHE_MAX_TIME=%NEXTCLOUD_MAX_TIME%", - "NOTIFY_PUSH_HOST=nextcloud-aio-notify-push" + "NOTIFY_PUSH_HOST=nextcloud-aio-notify-push", + "WHITEBOARD_HOST=nextcloud-aio-whiteboard" ], "volumes": [ { @@ -148,7 +150,8 @@ "TURN_SECRET", "SIGNALING_SECRET", "FULLTEXTSEARCH_PASSWORD", - "IMAGINARY_SECRET" + "IMAGINARY_SECRET", + "WHITEBOARD_SECRET" ], "volumes": [ { @@ -224,7 +227,9 @@ "APACHE_PORT=%APACHE_PORT%", "ADDITIONAL_TRUSTED_PROXY=%CADDY_IP_ADDRESS%", "THIS_IS_AIO=true", - "IMAGINARY_SECRET=%IMAGINARY_SECRET%" + "IMAGINARY_SECRET=%IMAGINARY_SECRET%", + "WHITEBOARD_SECRET=%WHITEBOARD_SECRET%", + "WHITEBOARD_ENABLED=%WHITEBOARD_ENABLED%" ], "stop_grace_period": 600, "restart": "unless-stopped", @@ -746,6 +751,39 @@ "cap_drop": [ "NET_RAW" ] + }, + { + "container_name": "nextcloud-aio-whiteboard", + "image_tag": "%AIO_CHANNEL%", + "display_name": "Whiteboard", + "image": "nextcloud/aio-whiteboard", + "init": true, + "expose": [ + "3002" + ], + "internal_port": "3002", + "environment": [ + "TZ=%TIMEZONE%", + "NEXTCLOUD_URL=https://%NC_DOMAIN%", + "JWT_SECRET_KEY=%WHITEBOARD_SECRET%", + "STORAGE_STRATEGY=redis", + "REDIS_HOST=nextcloud-aio-redis", + "REDIS_HOST_PASSWORD=%REDIS_PASSWORD%" + ], + "secrets": [ + "WHITEBOARD_SECRET", + "REDIS_PASSWORD" + ], + "restart": "unless-stopped", + "profiles": [ + "whiteboard" + ], + "networks": [ + "nextcloud-aio" + ], + "cap_drop": [ + "NET_RAW" + ] } ] } diff --git a/php/public/disable-whiteboard.js b/php/public/disable-whiteboard.js new file mode 100644 index 00000000..50e1215d --- /dev/null +++ b/php/public/disable-whiteboard.js @@ -0,0 +1,5 @@ +document.addEventListener("DOMContentLoaded", function(event) { + // Whiteboard + let whiteboard = document.getElementById("whiteboard"); + whiteboard.disabled = true; +}); diff --git a/php/public/index.php b/php/public/index.php index 1c997f3b..9614419e 100644 --- a/php/public/index.php +++ b/php/public/index.php @@ -125,6 +125,7 @@ $app->get('/containers', function (Request $request, Response $response, array $ 'is_dri_device_enabled' => $configurationManager->isDriDeviceEnabled(), 'is_talk_recording_enabled' => $configurationManager->isTalkRecordingEnabled(), 'is_docker_socket_proxy_enabled' => $configurationManager->isDockerSocketProxyEnabled(), + 'is_whiteboard_enabled' => $configurationManager->isWhiteboardEnabled(), ]); })->setName('profile'); $app->get('/login', function (Request $request, Response $response, array $args) use ($container) { diff --git a/php/public/options-form-submit.js b/php/public/options-form-submit.js index 1b70df98..52f3ca74 100644 --- a/php/public/options-form-submit.js +++ b/php/public/options-form-submit.js @@ -66,4 +66,8 @@ document.addEventListener("DOMContentLoaded", function(event) { dockerSocketProxy.addEventListener('change', makeOptionsFormSubmitVisible); // dockerSocketProxy.addEventListener('change', handleDockerSocketProxyWarning); } + + // Whiteboard + let whiteboard = document.getElementById("whiteboard"); + whiteboard.addEventListener('change', makeOptionsFormSubmitVisible); }); diff --git a/php/src/ContainerDefinitionFetcher.php b/php/src/ContainerDefinitionFetcher.php index 57ccd205..1cd4b17c 100644 --- a/php/src/ContainerDefinitionFetcher.php +++ b/php/src/ContainerDefinitionFetcher.php @@ -95,6 +95,10 @@ class ContainerDefinitionFetcher if (!$this->configurationManager->isDockerSocketProxyEnabled()) { continue; } + } elseif ($entry['container_name'] === 'nextcloud-aio-whiteboard') { + if (!$this->configurationManager->isWhiteboardEnabled()) { + continue; + } } $ports = new ContainerPorts(); @@ -200,6 +204,10 @@ class ContainerDefinitionFetcher if (!$this->configurationManager->isDockerSocketProxyEnabled()) { continue; } + } elseif ($value === 'nextcloud-aio-whiteboard') { + if (!$this->configurationManager->isWhiteboardEnabled()) { + continue; + } } $dependsOn[] = $value; } diff --git a/php/src/Controller/ConfigurationController.php b/php/src/Controller/ConfigurationController.php index e786697a..835d7b62 100644 --- a/php/src/Controller/ConfigurationController.php +++ b/php/src/Controller/ConfigurationController.php @@ -120,6 +120,11 @@ class ConfigurationController } else { $this->configurationManager->SetDockerSocketProxyEnabledState(0); } + if (isset($request->getParsedBody()['whiteboard'])) { + $this->configurationManager->SetWhiteboardEnabledState(1); + } else { + $this->configurationManager->SetWhiteboardEnabledState(0); + } } if (isset($request->getParsedBody()['delete_collabora_dictionaries'])) { diff --git a/php/src/Data/ConfigurationManager.php b/php/src/Data/ConfigurationManager.php index b2093839..527904fb 100644 --- a/php/src/Data/ConfigurationManager.php +++ b/php/src/Data/ConfigurationManager.php @@ -164,6 +164,21 @@ class ConfigurationManager $this->WriteConfig($config); } + public function isWhiteboardEnabled() : bool { + $config = $this->GetConfig(); + if (isset($config['isWhiteboardEnabled']) && $config['isWhiteboardEnabled'] === 1) { + return true; + } else { + return false; + } + } + + public function SetWhiteboardEnabledState(int $value) : void { + $config = $this->GetConfig(); + $config['isWhiteboardEnabled'] = $value; + $this->WriteConfig($config); + } + public function SetClamavEnabledState(int $value) : void { $config = $this->GetConfig(); $config['isClamavEnabled'] = $value; diff --git a/php/src/Docker/DockerActionManager.php b/php/src/Docker/DockerActionManager.php index 8b2e8a3e..6bb7f70e 100644 --- a/php/src/Docker/DockerActionManager.php +++ b/php/src/Docker/DockerActionManager.php @@ -417,6 +417,12 @@ class DockerActionManager if (in_array('caddy', $communityContainers, true)) { $replacements[1] = gethostbyname('nextcloud-aio-caddy'); } + } elseif ($out[1] === 'WHITEBOARD_ENABLED') { + if ($this->configurationManager->isWhiteboardEnabled()) { + $replacements[1] = 'yes'; + } else { + $replacements[1] = ''; + } } else { $secret = $this->configurationManager->GetSecret($out[1]); if ($secret === "") { diff --git a/php/templates/containers.twig b/php/templates/containers.twig index 1160551b..3a2eceb0 100644 --- a/php/templates/containers.twig +++ b/php/templates/containers.twig @@ -597,6 +597,11 @@ {% else %}
{% endif %} + {% if is_whiteboard_enabled == true %} + + {% else %} + + {% endif %} @@ -612,6 +617,7 @@ + {% endif %} {% if is_collabora_enabled == true and isAnyRunning == false and was_start_button_clicked == true %}