diff --git a/README.md b/README.md index 4512b08..9c71823 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,10 @@ environment in education: - **Documents**: A document viewer and editor integrated with Nextcloud - **Web pages**: A Wordpress instance with custom theme and custom plugins - **Pad**: An Etherpad instance integrated with Nextcloud -- **Conferences**: BigBlueButton integrated with Moodle and Nextcloud (needs a standalone host) +- **Video calls**: BigBlueButton integrated with Moodle and Nextcloud (needs a standalone host) - **Forms**: A forms Nextcloud plugin +- **Email, lists, chat, calendar, surveys...** +- **Import & export from other environments** | | | | ---------------------------- | ------------------------------- | @@ -98,6 +100,7 @@ public announcement on the Using that version as a clean slate got us to the repo you see here, where changes will be reviewed before going in and anyone is welcome. +We will reopen for the public the previous repository when evere we find the time to clean it up. When in doubt about authorship, please check each file's license headers. @@ -117,4 +120,5 @@ The authorship of the previous commits is from: - Raúl FS - Unai Tolosa Pontesta - Evilham +- Xnet diff --git a/dd-apps/docker/nextcloud/Dockerfile b/dd-apps/docker/nextcloud/Dockerfile index f21832f..137c8c3 100644 --- a/dd-apps/docker/nextcloud/Dockerfile +++ b/dd-apps/docker/nextcloud/Dockerfile @@ -66,6 +66,10 @@ RUN mkdir -p \ COPY supervisord.conf / +# Temporary replacement for a real queue +RUN echo '*/1 * * * * /nc-queue.sh' >> /etc/crontabs/www-data +COPY nc-queue.sh / + ENV NEXTCLOUD_UPDATE=1 CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"] diff --git a/dd-apps/docker/nextcloud/nc-queue.sh b/dd-apps/docker/nextcloud/nc-queue.sh new file mode 100755 index 0000000..70e5fc4 --- /dev/null +++ b/dd-apps/docker/nextcloud/nc-queue.sh @@ -0,0 +1,5 @@ +#/bin/sh + +find "${NC_MAIL_QUEUE_FOLDER:-/nc-mail-queue}" -name '*.sh' -exec sh -c \ + 'cd /var/www/html && {} && rm {}' \ + ';' diff --git a/dd-apps/docker/nextcloud/nextcloud.yml b/dd-apps/docker/nextcloud/nextcloud.yml index 5c18f57..690f360 100644 --- a/dd-apps/docker/nextcloud/nextcloud.yml +++ b/dd-apps/docker/nextcloud/nextcloud.yml @@ -33,6 +33,7 @@ services: - /etc/localtime:/etc/localtime:ro - ${SRC_FOLDER}/nextcloud:/var/www/html - ${DATA_FOLDER}/nextcloud:/var/www/html/data + - ${DATA_FOLDER}/nc-mail-queue:/nc-mail-queue:rw environment: - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER} - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD} diff --git a/dd-apps/docker/nextcloud/src/themes/dd/core/js/navbar.js b/dd-apps/docker/nextcloud/src/themes/dd/core/js/navbar.js index 491eff3..fd9aaca 100644 --- a/dd-apps/docker/nextcloud/src/themes/dd/core/js/navbar.js +++ b/dd-apps/docker/nextcloud/src/themes/dd/core/js/navbar.js @@ -1,22 +1,23 @@ -# -# Copyright © 2021,2022 IsardVDI S.L. -# -# This file is part of DD -# -# DD is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# DD is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more -# details. -# -# You should have received a copy of the GNU Affero General Public License -# along with DD. If not, see . -# -# SPDX-License-Identifier: AGPL-3.0-or-later +/* +* Copyright © 2021,2022 IsardVDI S.L. +* +* This file is part of DD +* +* DD is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as published by +* the Free Software Foundation, either version 3 of the License, or (at your +* option) any later version. +* +* DD is distributed in the hope that it will be useful, but WITHOUT ANY +* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +* details. +* +* You should have received a copy of the GNU Affero General Public License +* along with DD. If not, see . +* +* SPDX-License-Identifier: AGPL-3.0-or-later +*/ jQuery(document).ready(() => { base_url = `${window.location.protocol}//${window.location.host.replace(/^nextcloud\./, 'api.')}` $.getJSON(`${base_url}/json`, (result) => { diff --git a/dd-apps/docker/nextcloud/src/themes/dd/core/templates/layout.user.php b/dd-apps/docker/nextcloud/src/themes/dd/core/templates/layout.user.php index 51cb4d0..bcf4056 100644 --- a/dd-apps/docker/nextcloud/src/themes/dd/core/templates/layout.user.php +++ b/dd-apps/docker/nextcloud/src/themes/dd/core/templates/layout.user.php @@ -53,10 +53,10 @@ - + - + @@ -137,7 +137,7 @@ diff --git a/dd-ctl b/dd-ctl index 87da8e0..6152d97 100755 --- a/dd-ctl +++ b/dd-ctl @@ -655,9 +655,11 @@ configure_nextcloud_logo(){ local instance_id=$(docker exec -u www-data dd-apps-nextcloud-app php occ config:system:get instanceid) local cachebuster=$(docker exec -u www-data dd-apps-nextcloud-app php occ config:app:get theming cachebuster) docker exec -u www-data dd-apps-nextcloud-app mkdir -p /var/www/html/data/appdata_$instance_id/theming/images - docker cp custom/img/logo.png dd-apps-nextcloud-app:/var/www/html/data/appdata_$instance_id/theming/images/logo - docker cp custom/img/background.png dd-apps-nextcloud-app:/var/www/html/data/appdata_$instance_id/theming/images/background - docker exec dd-apps-nextcloud-app chown www-data:www-data /var/www/html/data/appdata_$instance_id/theming/images/{logo,background} + nc_logo="${DATA_FOLDER}/nextcloud/appdata_$instance_id/theming/images/logo" + nc_background="${DATA_FOLDER}/nextcloud/appdata_$instance_id/theming/images/background" + cp custom/img/logo.png "${nc_logo}" + cp custom/img/background.png "${nc_background}" + chown 82:82 "${nc_logo}" "${nc_background}" docker exec -u www-data dd-apps-nextcloud-app php occ config:app:set theming logoMime --value="image/png" docker exec -u www-data dd-apps-nextcloud-app php occ config:app:set theming backgroundMime --value="image/png" docker exec -u www-data dd-apps-nextcloud-app php occ config:app:set theming cachebuster --value="$(expr $cachebuster + 1 )" diff --git a/dd-sso/.gitignore b/dd-sso/.gitignore index 20afd7d..c0efa48 100644 --- a/dd-sso/.gitignore +++ b/dd-sso/.gitignore @@ -6,9 +6,6 @@ docker-compose.yml **/custom.yaml **/system.yaml -admin/src/node_modules -admin/src/admin/node_modules/ - # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/dd-sso/admin/docker/Dockerfile b/dd-sso/admin/docker/Dockerfile index 27dbd7c..80855eb 100644 --- a/dd-sso/admin/docker/Dockerfile +++ b/dd-sso/admin/docker/Dockerfile @@ -20,6 +20,9 @@ FROM alpine:3.12.0 as production MAINTAINER isard +# Ensure python dependencies +COPY admin/docker/requirements.pip3 /requirements.pip3 + RUN apk add python3 py3-pip py3-pyldap~=3.2.0 RUN pip3 install --upgrade pip RUN apk add --no-cache --virtual .build_deps \ @@ -27,37 +30,28 @@ RUN apk add --no-cache --virtual .build_deps \ python3-dev \ libffi-dev \ gcc python3-dev linux-headers musl-dev postgresql-dev -COPY admin/docker/requirements.pip3 /requirements.pip3 RUN pip3 install --no-cache-dir -r requirements.pip3 RUN apk del .build_deps RUN apk add --no-cache curl py3-yaml yarn libpq openssl py3-pillow +# Add catalan words list (issue with newer diceweare) RUN wget -O /usr/lib/python3.8/site-packages/diceware/wordlists/wordlist_cat_ascii.txt https://raw.githubusercontent.com/1ma/diceware-cat/master/cat-wordlist-ascii.txt -# SSH configuration -# ARG SSH_ROOT_PWD -# RUN apk add openssh -# RUN echo "root:$SSH_ROOT_PWD" |chpasswd -# RUN sed -i \ -# -e 's|[#]*PermitRootLogin prohibit-password|PermitRootLogin yes|g' \ -# -e 's|[#]*PasswordAuthentication yes|PasswordAuthentication yes|g' \ -# -e 's|[#]*ChallengeResponseAuthentication yes|ChallengeResponseAuthentication yes|g' \ -# -e 's|[#]*UsePAM yes|UsePAM yes|g' \ -# -e 's|[#]#Port 22|Port 22|g' \ -# /etc/ssh/sshd_config - -# Let's test 0.26.1 python-keycloak version -# RUN apk add --no-cache git && \ -# git clone -b delete_realm_roles https://github.com/isard-vdi/python-keycloak.git && \ -# cd python-keycloak && \ -# python3 setup.py install && \ -# apk del git - +# Add code and entrypoint COPY admin/src /admin -RUN cd /admin/admin && yarn install - COPY admin/docker/run.sh /run.sh -#EXPOSE 7039 -CMD [ "/run.sh" ] \ No newline at end of file +# Ensure www-data group and user (82 is default in alpine) +RUN addgroup -g 82 -S www-data; adduser -u 82 -D -S -G www-data www-data + +# Fix directory permissions +# Ensure node dependencies too +RUN cd /admin/admin && \ + chown www-data:www-data "." && \ + mkdir -p "${NODE_MODULES_FOLDER:-node_modules}" && \ + chown www-data:www-data "${NODE_MODULES_FOLDER:-node_modules}" && \ + HOME=/tmp su -s /bin/sh -m www-data -c \ + "yarn install --modules-folder '${NODE_MODULES_FOLDER:-node_modules}'" + +CMD [ "/run.sh" ] diff --git a/dd-sso/admin/docker/requirements.pip3 b/dd-sso/admin/docker/requirements.pip3 index 91b9549..2fd988d 100644 --- a/dd-sso/admin/docker/requirements.pip3 +++ b/dd-sso/admin/docker/requirements.pip3 @@ -30,7 +30,8 @@ mysql-connector-python==8.0.30 psycopg2==2.9.3 # python-keycloak can't be upgraded without issues python-keycloak==0.26.1 -minio==7.1.11 +# minio can't be upgraded without issues +minio==7.0.3 urllib3==1.26.11 schema==0.7.5 Werkzeug==2.2.1 diff --git a/dd-sso/admin/docker/run.sh b/dd-sso/admin/docker/run.sh index 5f17e3d..f87c69f 100755 --- a/dd-sso/admin/docker/run.sh +++ b/dd-sso/admin/docker/run.sh @@ -18,13 +18,15 @@ # along with DD. If not, see . # # SPDX-License-Identifier: AGPL-3.0-or-later -# ssh-keygen -A -## Only in development -cd /admin/admin -yarn install -## End Only in development + +# We possibly need to fix bad old permissions +chown -R www-data:www-data \ + /admin/custom \ + /admin/moodledata/saml2 /admin/saml_certs \ + "${DATA_FOLDER}" \ + "${LEGAL_PATH}" \ + "${NC_MAIL_QUEUE_FOLDER}" + cd /admin export PYTHONWARNINGS="ignore:Unverified HTTPS request" -python3 start.py -#& -# /usr/sbin/sshd -D -e -f /etc/ssh/sshd_config \ No newline at end of file +exec su -s /bin/sh -m www-data -c 'python3 start.py' diff --git a/dd-sso/admin/src/admin/flaskapp.py b/dd-sso/admin/src/admin/flaskapp.py index 19a7b7b..80bc065 100644 --- a/dd-sso/admin/src/admin/flaskapp.py +++ b/dd-sso/admin/src/admin/flaskapp.py @@ -73,7 +73,9 @@ class AdminFlaskApp(Flask): custom_dir: str data_dir: str domain : str + node_modules_dir : str ready: bool = False + validators: Dict def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) @@ -82,7 +84,7 @@ class AdminFlaskApp(Flask): self.url_map.strict_slashes = False self._load_config() # Minor setup tasks - self._load_validators() + self.validators = self._load_validators() self._setup_routes() self._setup_api_3p() setup_api_views(self) @@ -141,6 +143,7 @@ class AdminFlaskApp(Flask): try: self.data_dir = os.environ.get("DATA_FOLDER", ".") self.custom_dir = os.environ.get("CUSTOM_FOLDER", ".") + self.node_modules_dir = os.environ.get("NODE_MODULES_FOLDER", "node_modules") # Handle secrets like Flask's session key secret_key_file = os.path.join(self.secrets_dir, "secret_key") if not os.path.exists(self.secrets_dir): @@ -202,19 +205,19 @@ class AdminFlaskApp(Flask): @self.route("/build/") def send_build(path: str) -> Response: return send_from_directory( - os.path.join(self.root_path, "node_modules/gentelella/build"), path + os.path.join(self.node_modules_dir, "gentelella/build"), path ) @self.route("/vendors/") def send_vendors(path: str) -> Response: return send_from_directory( - os.path.join(self.root_path, "node_modules/gentelella/vendors"), path + os.path.join(self.node_modules_dir, "gentelella/vendors"), path ) @self.route("/node_modules/") def send_nodes(path: str) -> Response: return send_from_directory( - os.path.join(self.root_path, "node_modules"), path + self.node_modules_dir, path ) @self.route("/templates/") diff --git a/dd-sso/admin/src/admin/lib/admin.py b/dd-sso/admin/src/admin/lib/admin.py index 35fbf67..7f67f33 100644 --- a/dd-sso/admin/src/admin/lib/admin.py +++ b/dd-sso/admin/src/admin/lib/admin.py @@ -22,6 +22,8 @@ import json import logging as log import os import traceback +from datetime import datetime +from pathlib import Path from pprint import pprint from time import sleep @@ -60,7 +62,7 @@ from .helpers import ( rand_password, ) -from typing import TYPE_CHECKING, cast, Any, Dict, Iterable, List, Optional +from typing import TYPE_CHECKING, cast, Any, Dict, Iterable, List, Optional, Tuple if TYPE_CHECKING: from admin.flaskapp import AdminFlaskApp from admin.lib.callbacks import ThirdPartyCallbacks @@ -130,12 +132,41 @@ class Admin: res = res and tp.delete_user(user_id) return res - def nextcloud_mail_set(self, users : List[DDUser], extra_data : Dict) -> Dict: - # TODO: implement - return {} + def _nextcloud_mail_set_cmd(self, user : DDUser, kw : Dict) -> Tuple[str, str]: + account_name = 'DD' # Treating this as a constant + update_cmd = f"""mail:account:update \ + --imap-host '{ kw['inbound_host'] }' --imap-port '{ kw['inbound_port'] }' --imap-ssl-mode '{ kw['inbound_ssl_mode'] }' \\ + --imap-user '{ user['email'] }' --imap-password '{ user['password'] }' \\ + --smtp-host '{ kw['outbound_host'] }' --smtp-port '{ kw['outbound_port'] }' --smtp-ssl-mode '{ kw['outbound_ssl_mode'] }' \\ + --smtp-user '{ user['email'] }' --smtp-password '{ user['password'] }' \\ + -- '{ user['user_id'] }' '{ user['email']}'""" + create_cmd = f"""mail:account:create '{ user['user_id'] }' '{ account_name }' '{ user['email'] }' \\ + '{ kw['inbound_host'] }' '{ kw['inbound_port'] }' '{ kw['inbound_ssl_mode'] }' \\ + '{ user['email'] }' '{ user['password'] }' \\ + '{ kw['outbound_host'] }' '{ kw['outbound_port'] }' '{ kw['outbound_ssl_mode'] }' \\ + '{ user['email'] }' '{ user['password'] }'""" + return (update_cmd, create_cmd) - def nextcloud_mail_delete(self, users : List[DDUser], extra_data : Dict) -> Dict: - # TODO: implement + def _nextcloud_mail_set_sh(self, users : List[DDUser], extra_data : Dict) -> str: + cmds = '\n'.join((f"./occ {u} || ./occ {c}" for u, c in (self._nextcloud_mail_set_cmd(u, extra_data) for u in users))) + return f"""#!/bin/sh -eu +{cmds} +""" + + def nextcloud_mail_set(self, users : List[DDUser], extra_data : Dict) -> Dict: + # TODO: this could (and should) be nicer. + # Ideally we'd use the database as a queue instead of creating the + # shell scripts here. + d = Path(os.environ.get("NC_MAIL_QUEUE_FOLDER", "/nc-mail-queue")) + fn = datetime.utcnow().isoformat() + secrets.token_hex(4) + sh = d.joinpath(fn + '.sh') + tmp = d.joinpath(fn + '.tmp') + # Create executable file + tmp.touch(mode=0o750) + # Write script + tmp.write_text(self._nextcloud_mail_set_sh(users, extra_data)) + # Put it in-place + tmp.rename(sh) return {} def check_connections(self, app : "AdminFlaskApp") -> None: @@ -1615,7 +1646,7 @@ class Admin: internaluser : DDUser = [u for u in self.internal["users"] if u["id"] == user_id][0] cohorts = self.moodle.get_cohorts() for group in mdelete: - cohort = [c for c in cohorts if c["name"] == group[0]][0] + cohort = [c for c in cohorts if c["name"] == group][0] try: self.moodle.delete_user_in_cohort( internaluser["moodle_id"], cohort["id"] @@ -1905,7 +1936,7 @@ class Admin: " NEXTCLOUD USERS: Creating nextcloud user: " + u["username"] + " in groups " - + str(list) + + str(u.get("groups", [])) ) try: # Quota is in MB diff --git a/dd-sso/admin/src/admin/lib/avatars.py b/dd-sso/admin/src/admin/lib/avatars.py index a5f08d5..d0f2880 100644 --- a/dd-sso/admin/src/admin/lib/avatars.py +++ b/dd-sso/admin/src/admin/lib/avatars.py @@ -45,7 +45,7 @@ class Avatars: # self.update_missing_avatars() def add_user_default_avatar(self, userid : str, role : str="unknown") -> None: - path = os.path.join(self.avatars_path, role) + ".jpg", + path = os.path.join(self.avatars_path, role) + ".jpg" self.mclient.fput_object( self.bucket, userid, diff --git a/dd-sso/admin/src/admin/lib/keys.py b/dd-sso/admin/src/admin/lib/keys.py index 076387b..3a56719 100644 --- a/dd-sso/admin/src/admin/lib/keys.py +++ b/dd-sso/admin/src/admin/lib/keys.py @@ -37,7 +37,7 @@ import stat from copy import deepcopy from datetime import datetime, timedelta from pathlib import Path -from typing import Any, Dict, List, Optional, Union +from typing import Any, Callable, Dict, List, Optional, Union import requests from attr import field, frozen @@ -52,10 +52,15 @@ from jose.backends.rsa_backend import RSAKey from jose.constants import ALGORITHMS try: - # Python 3.8 - from functools import cached_property as cache -except ImportError: from functools import cache # type: ignore # Python 3.9+ +except ImportError: + try: + from functools import cached_property as cache # type: ignore # Python 3.8 + except ImportError: + from functools import lru_cache + + def cache(call: Callable) -> property: # type: ignore # Python 3.7 + return property(lru_cache()(call)) Data = Union[str, bytes] diff --git a/dd-sso/admin/src/admin/views/MailViews.py b/dd-sso/admin/src/admin/views/MailViews.py index 285274e..dac99bd 100644 --- a/dd-sso/admin/src/admin/views/MailViews.py +++ b/dd-sso/admin/src/admin/views/MailViews.py @@ -46,7 +46,7 @@ def setup_mail_views(app: "AdminFlaskApp") -> None: key = json.dumps(mail_3p.our_pubkey_jwk) return key, 200, {"Content-Type": "application/json"} - @app.route("/ddapi/mailusers", methods=["GET", "POST", "PUT", "DELETE"]) + @app.route("/ddapi/mailusers", methods=["GET", "POST", "PUT"]) @has_jws_token(app) def ddapi_mail_users() -> JsonResponse: users: List[Dict[str, Any]] = [] @@ -66,8 +66,10 @@ def setup_mail_views(app: "AdminFlaskApp") -> None: raise Error( "internal_server", "Failure sending users", traceback.format_exc() ) - if request.method not in ["POST", "PUT", "DELETE"]: + if request.method not in ["POST", "PUT"]: # Unsupported method + # Note we do not support DELETE as it is taken care of when the + # full Nextcloud user is deleted. return json.dumps({}), 400, JsonHeaders try: @@ -75,19 +77,19 @@ def setup_mail_views(app: "AdminFlaskApp") -> None: Dict, mail_3p.verify_and_decrypt_incoming_json(request.get_data()) ) users = dec_data.pop("users") - for user in users: - if not app.validators["mail"].validate(user): - raise Error( - "bad_request", - "Data validation for mail failed: " - + str(app.validators["mail"].errors), - traceback.format_exc(), - ) + config = dec_data.pop("config", {}) + # TODO: fix these validators + #for user in users: + # if not app.validators["mail"].validate(user): + # raise Error( + # "bad_request", + # "Data validation for mail failed: " + # + str(app.validators["mail"].errors), + # traceback.format_exc(), + # ) res: Dict if request.method in ["POST", "PUT"]: - res = app.admin.nextcloud_mail_set(users, dec_data) - elif request.method == "DELETE": - res = app.admin.nextcloud_mail_delete(users, dec_data) + res = app.admin.nextcloud_mail_set(users, config) return ( json.dumps(res), 200, diff --git a/dd-sso/docker-compose-parts/admin.yml b/dd-sso/docker-compose-parts/admin.yml index 91c87b1..24aea8f 100644 --- a/dd-sso/docker-compose-parts/admin.yml +++ b/dd-sso/docker-compose-parts/admin.yml @@ -25,25 +25,19 @@ services: context: ${BUILD_SSO_ROOT_PATH} dockerfile: admin/docker/Dockerfile target: production - # args: ## DEVELOPMENT - # SSH_ROOT_PWD: ${IPA_ADMIN_PWD} - # SSH_PORT: 2022 networks: - dd_net - # ports: - # - "2022:22" - # - "9000:9000" restart: unless-stopped volumes: - /etc/localtime:/etc/localtime:ro - - ${BUILD_SSO_ROOT_PATH}/admin/src:/admin # Revome in production - ${BUILD_SSO_ROOT_PATH}/init/keycloak/jsons:/admin/keycloak-init:ro - - ${CUSTOM_PATH}/custom:/admin/custom + - ${CUSTOM_PATH}/custom:/admin/custom:rw - ${DATA_FOLDER}/avatars:/admin/avatars:ro - ${DATA_FOLDER}/moodle/saml2:/admin/moodledata/saml2:rw - ${DATA_FOLDER}/saml_certs:/admin/saml_certs:rw - ${DATA_FOLDER}/legal:/admin/admin/static/templates/pages/legal:rw - ${DATA_FOLDER}/dd-admin:/data:rw + - ${DATA_FOLDER}/nc-mail-queue:/nc-mail-queue:rw env_file: - .env environment: @@ -52,3 +46,5 @@ services: - MANAGED_EMAIL_DOMAIN=${MANAGED_EMAIL_DOMAIN} - DATA_FOLDER=/data - CUSTOM_FOLDER=/admin/custom + - NC_MAIL_QUEUE_FOLDER=/nc-mail-queue + - LEGAL_PATH=/admin/admin/static/templates/pages/legal diff --git a/dd-sso/docker-compose-parts/adminer.yml b/dd-sso/docker-compose-parts/adminer.yml index 5281fa7..10e5109 100644 --- a/dd-sso/docker-compose-parts/adminer.yml +++ b/dd-sso/docker-compose-parts/adminer.yml @@ -19,9 +19,9 @@ # SPDX-License-Identifier: AGPL-3.0-or-later version: '3.7' services: - isard-sso-adminer: + dd-sso-adminer: image: adminer - container_name: isard-sso-adminer + container_name: dd-sso-adminer restart: unless-stopped networks: isard_net: {} diff --git a/dd-sso/docker-compose-parts/pgtuner.yml b/dd-sso/docker-compose-parts/pgtuner.yml index 79acd9a..d64c375 100644 --- a/dd-sso/docker-compose-parts/pgtuner.yml +++ b/dd-sso/docker-compose-parts/pgtuner.yml @@ -19,10 +19,10 @@ # SPDX-License-Identifier: AGPL-3.0-or-later version: '3.7' services: - isard-sso-pgtuner: + dd-sso-pgtuner: image: jfcoz/postgresqltuner - container_name: isard-sso-pgtuner + container_name: dd-sso-pgtuner restart: "no" - command: --host isard-apps-postgresql --user ${NEXTCLOUD_POSTGRES_USER} --password ${NEXTCLOUD_POSTGRES_PASSWORD} --database nextcloud + command: --host dd-apps-postgresql --user ${NEXTCLOUD_POSTGRES_USER} --password ${NEXTCLOUD_POSTGRES_PASSWORD} --database nextcloud networks: isard_net: {}