Selaa lähdekoodia

feat: Refactor environment setup and update project documentation

This commit introduces significant changes to the environment setup and project documentation:

-   **`setup_environment.sh` Updates:**
    -   Now generates secure passwords for Nextcloud database (root user, regular user) and the Nextcloud admin user.
    -   Adds generated passwords to the `docker/.env` file.
    -   Adds generated passwords to the encrypted credentials file.
    -   Creates a separate .env file in scripts/setup/keycloak for the setup_realm.js
-   **`docker-compose.yml` Updates:**
    -   Added Nextcloud and Nextcloud-db services.
    -   Configured Nextcloud to use a separate database.
    -   Configured networks for Nextcloud and Keycloak.
-   **`project_documentation.md` Updates:**
    -   Added detailed descriptions of the new environment setup process.
    -   Added details about the usage of the  `.env` files.
    -   Updated Keycloak Setup Section.
    -   Added more details to the Installation instructions.

These changes improve the automation of the setup process and provide comprehensive documentation for Keycloak and Nextcloud.
mrx8086 11 kuukautta sitten
vanhempi
commit
47099a95e2

+ 2 - 1
.gitignore

@@ -1 +1,2 @@
-data/keycloak/db/
+data/
+config/nextcloud/

+ 56 - 19
config/nginx/sites-available/nextcloud

@@ -1,9 +1,12 @@
-# nginx nextcloud configuration (/etc/nginx/sites-available/nextcloud)
+upstream nextcloud_upstream {
+    server 172.19.0.3:80;  # Die IP wird später durch die tatsächliche Container-IP ersetzt
+}
+
 server {
     listen 80;
     server_name cloud.mrx8086.com;
-
-    # Weiterleitung von HTTP zu HTTPS
+    
+    # Redirect HTTP to HTTPS
     return 301 https://$host$request_uri;
 }
 
@@ -11,28 +14,62 @@ server {
     listen 443 ssl;
     server_name cloud.mrx8086.com;
 
-    # SSL Zertifikate einbinden
+    # SSL Configuration
     ssl_certificate /etc/nginx/ssl/mrx8086.com/fullchain.pem;
     ssl_certificate_key /etc/nginx/ssl/mrx8086.com/privkey.pem;
+    ssl_session_timeout 1d;
+    ssl_session_tickets off;
 
-    # Empfohlene SSL Einstellungen (optional)
+    # Modern SSL configuration
     ssl_protocols TLSv1.2 TLSv1.3;
-    ssl_prefer_server_ciphers on;
-    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
-    ssl_session_cache shared:SSL:10m;
-    ssl_session_timeout 10m;
+    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
+    ssl_prefer_server_ciphers off;
 
+    # Security headers
+    add_header X-Content-Type-Options nosniff always;
+    add_header X-XSS-Protection "1; mode=block" always;
+    add_header X-Frame-Options SAMEORIGIN always;
     add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
-    add_header X-Content-Type-Options nosniff;
-    add_header X-Frame-Options DENY;
-    add_header X-XSS-Protection "1; mode=block";
+    
+    # Content Security Policy für Nextcloud
+    add_header Content-Security-Policy "frame-ancestors 'self'; default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self'; media-src 'self';" always;
 
+    # Proxy settings
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_set_header X-Forwarded-Host $host;
+    proxy_set_header X-Forwarded-Port 443;
+    proxy_set_header Host $host;
+    proxy_http_version 1.1;
+
+    # Nextcloud specific settings
+    client_max_body_size 512M;
+    fastcgi_buffers 64 4K;
+    
+    # Root location
     location / {
-        proxy_pass http://127.0.0.1:8081;
-        proxy_set_header Host $host;
-        proxy_set_header X-Real-IP $remote_addr;
-        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-        proxy_set_header X-Forwarded-Proto https;
-        proxy_set_header X-Forwarded-Port 443;
+        proxy_pass http://nextcloud_upstream;
+        
+        # WebSocket support
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+        
+        # Timeouts
+        proxy_connect_timeout 60s;
+        proxy_send_timeout 60s;
+        proxy_read_timeout 60s;
     }
-}
+
+    # Block sensitive paths
+    location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) {
+        deny all;
+        return 404;
+    }
+
+    # Deny access to hidden files
+    location ~ /\. {
+        deny all;
+        return 404;
+    }
+}

+ 7 - 0
docker/.env

@@ -5,3 +5,10 @@ KEYCLOAK_ADMIN_PASSWORD=9aD5Fddh457QqmvQqr6Rb8bu
 # Keycloak Database
 KC_DB_USERNAME=keycloak
 KC_DB_PASSWORD=DLcXcKuw8F4GFH2KYbj8xHFx
+
+# Nextcloud Configuration
+NEXTCLOUD_DB_USER=nextcloud
+NEXTCLOUD_DB_PASSWORD=YeTn4f1IIM9a7I3Q7oZNaEhs
+NEXTCLOUD_DB_ROOT_PASSWORD=rY26aXw9uMOqz2BjtevQ4oKB
+NEXTCLOUD_ADMIN_USER=admin
+NEXTCLOUD_ADMIN_PASSWORD=jTjRBEJb2ZSAH0iJoqeZijYL

+ 45 - 1
docker/docker-compose.yml

@@ -4,7 +4,7 @@ services:
   keycloak:
     build:
       context: .
-      dockerfile: Containerfile
+      dockerfile: keycloak.Containerfile
       args:
         KC_DB_USERNAME: ${KC_DB_USERNAME}
         KC_DB_PASSWORD: ${KC_DB_PASSWORD}
@@ -58,6 +58,50 @@ services:
       timeout: 5s
       retries: 5
 
+# In docker-compose.yml ergänzen:
+  nextcloud:
+    image: nextcloud:latest
+    container_name: nextcloud
+    restart: unless-stopped
+    environment:
+      - MYSQL_HOST=nextcloud-db
+      - MYSQL_DATABASE=nextcloud
+      - MYSQL_USER=${NEXTCLOUD_DB_USER}
+      - MYSQL_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
+      - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
+      - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
+      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.mrx8086.com
+      - OVERWRITEPROTOCOL=https
+      - OVERWRITEHOST=cloud.mrx8086.com
+      - OVERWRITEWEBROOT=/
+      - TRUSTED_PROXIES=172.18.0.0/16
+    volumes:
+      - ../data/nextcloud:/var/www/html
+      - ../config/nextcloud/config:/var/www/html/config
+      - ../config/nextcloud/custom_apps:/var/www/html/custom_apps
+      - ../config/nextcloud/data:/var/www/html/data
+    networks:
+      - nextcloud-network
+    depends_on:
+      - nextcloud-db
+
+  nextcloud-db:
+    image: mariadb:10.6
+    container_name: nextcloud-db
+    restart: unless-stopped
+    command: --transaction-isolation=READ-COMMITTED --log-bin=ROW
+    environment:
+      - MYSQL_ROOT_PASSWORD=${NEXTCLOUD_DB_ROOT_PASSWORD}
+      - MYSQL_DATABASE=nextcloud
+      - MYSQL_USER=${NEXTCLOUD_DB_USER}
+      - MYSQL_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
+    volumes:
+      - ../data/nextcloud-db:/var/lib/mysql
+    networks:
+      - nextcloud-network
+
 networks:
   keycloak-network:
     driver: bridge
+  nextcloud-network:
+    driver: bridge

+ 0 - 0
docker/Containerfile → docker/keycloak.Containerfile


+ 73 - 15
docs/context/configuration/docker-compose.yml

@@ -1,26 +1,31 @@
+version: '3.9'
+
 services:
   keycloak:
-    image: quay.io/keycloak/keycloak:nightly
+    build:
+      context: .
+      dockerfile: Containerfile
+      args:
+        KC_DB_USERNAME: ${KC_DB_USERNAME}
+        KC_DB_PASSWORD: ${KC_DB_PASSWORD}
     container_name: keycloak
     environment:
-      # Bootstrap Admin Credentials
-      KC_BOOTSTRAP_ADMIN_USERNAME: admin
-      KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
-      # Database Configuration
       KC_DB: postgres
       KC_DB_URL: jdbc:postgresql://keycloak-db:5432/keycloak
       KC_DB_USERNAME: ${KC_DB_USERNAME}
       KC_DB_PASSWORD: ${KC_DB_PASSWORD}
-      # Hostname and Proxy Configuration
-      KC_HOSTNAME_STRICT: "false"
-      KC_HOSTNAME_STRICT_HTTPS: "true"
-      KC_HOSTNAME_DEFAULT_ADMIN: auth.mrx8086.com
-      KC_PROXY: "edge"
-      # Additional Settings
+      KC_PROXY_HEADERS: xforwarded
+      KC_PROXY_ADDRESS_FORWARDING: "true"
       KC_HTTP_ENABLED: "true"
-      KC_HTTPS_REQUIRED: "external"
-    command:
-      - start-dev
+      KC_HOSTNAME_STRICT: "false"
+      KC_PROXY: edge
+      KC_FEATURES: "token-exchange,scripts,preview,admin-api"
+      KC_HEALTH_ENABLED: "true"
+      KC_METRICS_ENABLED: "true"
+      KC_HOSTNAME: https://auth.mrx8086.com
+      KC_BOOTSTRAP_ADMIN_USERNAME: admin
+      KC_BOOTSTRAP_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
+    command: ["start-dev"]  # Für Entwicklung; entferne "-dev" für Produktion
     ports:
       - "8080:8080"
     volumes:
@@ -29,7 +34,11 @@ services:
       - keycloak-network
     depends_on:
       - keycloak-db
-    restart: unless-stopped
+    healthcheck:
+      test: ["CMD", "curl", "-f", "http://localhost:8080/health/ready"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
 
   keycloak-db:
     image: postgres:15
@@ -43,7 +52,56 @@ services:
     networks:
       - keycloak-network
     restart: unless-stopped
+    healthcheck:
+      test: ["CMD-SHELL", "pg_isready -U ${KC_DB_USERNAME} -d keycloak"]
+      interval: 10s
+      timeout: 5s
+      retries: 5
+
+# In docker-compose.yml ergänzen:
+  nextcloud:
+    image: nextcloud:latest
+    container_name: nextcloud
+    restart: unless-stopped
+    environment:
+      - MYSQL_HOST=nextcloud-db
+      - MYSQL_DATABASE=nextcloud
+      - MYSQL_USER=${NEXTCLOUD_DB_USER}
+      - MYSQL_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
+      - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
+      - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
+      - NEXTCLOUD_TRUSTED_DOMAINS=cloud.mrx8086.com
+      - OVERWRITEPROTOCOL=https
+      - OVERWRITEHOST=cloud.mrx8086.com
+      - OVERWRITEWEBROOT=/
+      - TRUSTED_PROXIES=172.18.0.0/16
+    volumes:
+      - ../data/nextcloud:/var/www/html
+      - ../config/nextcloud/config:/var/www/html/config
+      - ../config/nextcloud/custom_apps:/var/www/html/custom_apps
+      - ../config/nextcloud/data:/var/www/html/data
+    networks:
+      - nextcloud-network
+    depends_on:
+      - nextcloud-db
+
+  nextcloud-db:
+    image: mariadb:10.6
+    container_name: nextcloud-db
+    restart: unless-stopped
+    command: --transaction-isolation=READ-COMMITTED --log-bin=ROW
+    environment:
+      - MYSQL_ROOT_PASSWORD=${NEXTCLOUD_DB_ROOT_PASSWORD}
+      - MYSQL_DATABASE=nextcloud
+      - MYSQL_USER=${NEXTCLOUD_DB_USER}
+      - MYSQL_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
+    volumes:
+      - ../data/nextcloud-db:/var/lib/mysql
+    networks:
+      - nextcloud-network
 
 networks:
   keycloak-network:
+    driver: bridge
+  nextcloud-network:
     driver: bridge

+ 35 - 22
docs/context/project_documentation.md

@@ -245,11 +245,30 @@ Für jeden Service existiert eine dedizierte NGINX-Konfiguration. In der Develop
 - Die SSL Zertifikate für die Development Umgebung werden als selbsignierte Zertifikate generiert und in `/config/nginx/ssl/mrx8086.com/` abgelegt.
 - In der Staging und Production Umgebung werden die Zertifikate über Let's Encrypt oder eine andere Zertifizierungsstelle verwaltet.
 
+#### Umgebungsvariablen
+Es werden zwei `.env`-Dateien verwendet:
+Eine im `docker/` Verzeichnis für die Docker-Konfiguration und eine im `scripts/setup/keycloak/` für das `setup_realm.js`-Skript.
+
+**`docker/.env`:**
+- `KEYCLOAK_ADMIN_PASSWORD`: Das Passwort für den Keycloak Admin-Benutzer.
+- `KC_DB_USERNAME`: Der Benutzername für die Keycloak-Datenbank.
+- `KC_DB_PASSWORD`: Das Passwort für die Keycloak-Datenbank.
+
+**`scripts/setup/keycloak/.env`:**
+- `KEYCLOAK_URL`: Die URL zum Keycloak-Server (z.B. `https://auth.mrx8086.com`).
+- `KEYCLOAK_ADMIN_USER`: Der Benutzername des Keycloak-Administrators (z.B. `admin`).
+- `KEYCLOAK_ADMIN_PASSWORD`: Das Passwort des Keycloak-Administrators (generiert durch das Skript).
+- `NEXTCLOUD_CLIENT_ID`: Die Client-ID für Nextcloud (z.B. `nextcloud`).
+- `PAPERLESS_CLIENT_ID`: Die Client-ID für Paperless (z.B. `paperless`).
+- `NODERED_CLIENT_ID`: Die Client-ID für Node-RED (z.B. `nodered`).
+- `TESTADMIN_PASSWORD`: Das Passwort für den Testadmin User.
+- `TESTUSER_PASSWORD`: Das Passwort für den Testuser User.
+
+Die Passwörter in der `.env` Datei im `scripts/setup/keycloak` werden vom `setup_environment.sh` Skript generiert.
+
 #### Keycloak-Konfiguration
 
-Keycloak ist als zentrale Authentifizierungsstelle konfiguriert. Die Realm-Konfiguration, Clients und Benutzer werden über das `setup_realm.js` Skript definiert.
-Die Keycloak Konfigurationen sind in einer eigenen Sektion beschrieben. Diese werden mit dem `setup_realm.js` Script Konfiguriert.
-Die Umgebungsvariablen für das Script sind in einer `.env` Datei abgelegt.
+Keycloak ist als zentrale Authentifizierungsstelle konfiguriert. Die Realm-Konfiguration, Clients und Benutzer werden über das `setup_realm.js` Skript definiert, die Konfiguration wird über die `.env` Datei im `/scripts/setup/keycloak` Verzeichnis angepasst.
 
 ##### Realm-Konfiguration
 - **Realm-Name:** `office-automation`
@@ -306,17 +325,6 @@ Die folgenden Clients werden über das Skript konfiguriert:
 -   **Entwicklungsumgebung (`dev`):** Für lokale Entwicklung werden selbsignierte SSL-Zertifikate verwendet.
 -   **Staging/Produktionsumgebung (`staging`, `production`):** Hier werden SSL-Zertifikate über Let's Encrypt oder eine ähnliche Zertifizierungsstelle verwaltet.
 
-#### Umgebungsvariablen
-Die folgenden Umgebungsvariablen werden für die Konfiguration des Projekts verwendet:
-- `KEYCLOAK_URL`: Die URL zum Keycloak Server (z.B. https://auth.mrx8086.com)
-- `KEYCLOAK_ADMIN_USER`: Der Benutzername des Keycloak Administrators (z.B. admin).
-- `KEYCLOAK_ADMIN_PASSWORD`: Das Passwort des Keycloak Administrators.
-- `NEXTCLOUD_CLIENT_ID`: Die Client ID für Nextcloud. (z.B. nextcloud)
-- `PAPERLESS_CLIENT_ID`: Die Client ID für Paperless (z.B. paperless).
-- `NODERED_CLIENT_ID`: Die Client ID für Node-RED (z.B. nodered).
-- `TESTADMIN_PASSWORD`: Das Passwort für den Testadmin User (default initial123!).
-- `TESTUSER_PASSWORD`: Das Passwort für den Testuser User (default initial123!).
-
 ## Installationsanleitung
 #### Voraussetzungen
 - Docker Version: `[VERSION]`
@@ -326,18 +334,24 @@ Die folgenden Umgebungsvariablen werden für die Konfiguration des Projekts verw
   - Speicher: `[ANFORDERUNG]`
 - Für die Ausführung des `setup_realm.js` Skriptes wird `Node.js` benötigt
 - Die genaue Version von `Node.js` wird zu einem späteren Zeitpunkt dokumentiert.
+- Vor dem starten müssen die Passwörter generiert und die `.env` Dateien erstellt werden. Hierzu wird das `setup_environment.sh` verwendet. Dieses Skript sollte **nicht in der Produktionsumgebung** verwendet werden.
+- Das Skript erstellt die benötigten Verzeichnisse, generiert zufällige Passwörter, speichert diese verschlüsselt ab, und erstellt die benötigten `.env` Dateien.
+- Für die Ausführung des `setup_realm.js` Skriptes wird `Node.js` und `npm` benötigt
+- Die benötigten Node Module `dotenv` und `axios` können mit `npm install dotenv axios` installiert werden.
+- Die `.env` Dateien werden im `/docker` und im `/scripts/setup/keycloak` Verzeichnis abgelegt.
 
 #### Keycloak-Installation
-1.  Stelle sicher das Docker installiert ist und läuft.
-2.  Kopiere die `docker-compose.yml` Datei in das Docker Verzeichnis
-3.  Kopiere die `.env` Datei in das Docker Verzeichnis und passe diese an.
-4.  Führe `docker-compose up -d` im Docker Verzeichnis aus um Keycloak zu starten.
+1.  Führe das `setup_environment.sh` Skript aus, um die .env Dateien, die Passwörter zu generieren und die Credentials zu verschlüsseln.
+2.  Kopiere die `docker-compose.yml` Datei in das `docker/` Verzeichnis.
+3.  Kopiere die `.env` Datei in das `docker/` Verzeichnis.
+4.  Führe `docker-compose up -d` im `docker/` Verzeichnis aus um Keycloak zu starten.
 
 #### Ausführen von `setup_realm.js`
 1.  Stelle sicher, dass Node.js und npm installiert sind.
-2.  Kopiere die `setup_realm.js` Datei in das `/scripts/install` Verzeichnis.
+2.  Wechsle in das `/scripts/setup/keycloak` Verzeichnis.
 3.  Installiere die benötigten npm Pakete mit `npm install dotenv axios`.
-4.  Führe das Skript mit `node /scripts/install/setup_realm.js` aus. Dies erstellt den Keycloak-Realm, die Clients und die Testbenutzer.
+4.  Führe das Skript mit `node setup_realm.js` aus. Dies erstellt den Keycloak-Realm, die Clients und die Testbenutzer.
+    * Das Script befindet sich im `/scripts/setup/keycloak` Verzeichnis
 
 ## Workflows
 #### Dokumentenverarbeitung
@@ -383,5 +397,4 @@ Details zur Wartung und dem Monitoring werden in späteren Schritten dokumentier
 - Log-Analyse
 - Fehlerbehandlung
 - Support-Prozesse
-Details zu bekannten Problemen und zur Fehlerbehandlung werden in späteren Schritten dokumentiert.
-```
+Details zu bekannten Problemen und zur Fehlerbehandlung werden in späteren Schritten dokumentiert.

+ 45 - 1
docs/context/scripts/setup_environment.sh

@@ -7,10 +7,13 @@ cd "${PROJECT_ROOT}"
 # Define directories relative to project root
 CREDENTIALS_DIR="config/credentials"
 DOCKER_DIR="docker"
+KEYCLOAK_SCRIPTS_DIR="scripts/setup/keycloak"
+
 
 # Create necessary directories
 mkdir -p "${CREDENTIALS_DIR}"
 mkdir -p "${DOCKER_DIR}"
+mkdir -p "${KEYCLOAK_SCRIPTS_DIR}"
 
 # Function to generate secure passwords
 generate_password() {
@@ -23,6 +26,14 @@ SETUP_DATE=$(date '+%Y-%m-%d_%H-%M-%S')
 # Generate passwords
 KEYCLOAK_ADMIN_PASSWORD=$(generate_password)
 KC_DB_PASSWORD=$(generate_password)
+TESTADMIN_PASSWORD=$(generate_password)
+TESTUSER_PASSWORD=$(generate_password)
+NEXTCLOUD_DB_ROOT_PASSWORD=$(generate_password)
+NEXTCLOUD_DB_USER=$(generate_password)
+NEXTCLOUD_DB_PASSWORD=$(generate_password)
+NEXTCLOUD_ADMIN_USER=$(generate_password)
+NEXTCLOUD_ADMIN_PASSWORD=$(generate_password)
+
 
 # Create .env file in docker directory
 cat > "${DOCKER_DIR}/.env" << EOL
@@ -33,6 +44,26 @@ KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD}
 # Keycloak Database
 KC_DB_USERNAME=keycloak
 KC_DB_PASSWORD=${KC_DB_PASSWORD}
+
+# Nextcloud Database
+NEXTCLOUD_DB_ROOT_PASSWORD=${NEXTCLOUD_DB_ROOT_PASSWORD}
+NEXTCLOUD_DB_USER=${NEXTCLOUD_DB_USER}
+NEXTCLOUD_DB_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
+NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
+NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
+EOL
+
+# Create .env file for keycloak setup script
+cat > "${KEYCLOAK_SCRIPTS_DIR}/.env" << EOL
+# Generated on ${SETUP_DATE}
+KEYCLOAK_URL=https://auth.mrx8086.com
+KEYCLOAK_ADMIN_USER=admin
+KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD}
+NEXTCLOUD_CLIENT_ID=nextcloud
+PAPERLESS_CLIENT_ID=paperless
+NODERED_CLIENT_ID=nodered
+TESTADMIN_PASSWORD=${TESTADMIN_PASSWORD}
+TESTUSER_PASSWORD=${TESTUSER_PASSWORD}
 EOL
 
 # Create encrypted credentials documentation
@@ -46,6 +77,18 @@ Password: ${KEYCLOAK_ADMIN_PASSWORD}
 Keycloak Database Credentials:
 Username: keycloak
 Password: ${KC_DB_PASSWORD}
+Test Admin Credentials:
+Password: ${TESTADMIN_PASSWORD}
+Test User Credentials:
+Password: ${TESTUSER_PASSWORD}
+
+Nextcloud Database Credentials:
+Root Password: ${NEXTCLOUD_DB_ROOT_PASSWORD}
+User: ${NEXTCLOUD_DB_USER}
+Password: ${NEXTCLOUD_DB_PASSWORD}
+Nextcloud Admin Credentials:
+Username: ${NEXTCLOUD_ADMIN_USER}
+Password: ${NEXTCLOUD_ADMIN_PASSWORD}
 EOL
 
 # Encrypt credentials file
@@ -54,7 +97,8 @@ rm "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt"
 
 echo "Environment setup completed!"
 echo "Credentials have been saved and encrypted in: ${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.gpg"
-echo ".env file has been created in: ${DOCKER_DIR}/.env"
+echo ".env file for docker-compose has been created in: ${DOCKER_DIR}/.env"
+echo ".env file for setup_realm.js has been created in: ${KEYCLOAK_SCRIPTS_DIR}/.env"
 echo ""
 echo "To view credentials, use:"
 echo "gpg -d ${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.gpg"