瀏覽代碼

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 月之前
父節點
當前提交
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"