setup_environment.sh 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #!/bin/bash
  2. set -e
  3. # Ensure we're in the project root directory
  4. PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
  5. # Define directories relative to project root
  6. CREDENTIALS_DIR="${PROJECT_ROOT}/config/credentials"
  7. DOCKER_DIR="${PROJECT_ROOT}/docker"
  8. KEYCLOAK_SETUP_DIR="${PROJECT_ROOT}/scripts/setup/keycloak"
  9. ANSIBLE_PLAYBOOK="${PROJECT_ROOT}/ansible/site.yml"
  10. ANSIBLE_INVENTORY="${PROJECT_ROOT}/ansible/inventory/staging/hosts"
  11. NEXTCLOUD_DATA_DIR="${PROJECT_ROOT}/data/nextcloud/data"
  12. TEMP_FILE=$(mktemp)
  13. KEYCLOAK_DB_DIR="${PROJECT_ROOT}/data/keycloak-db"
  14. # Create necessary directories
  15. sudo mkdir -p "${CREDENTIALS_DIR}"
  16. sudo mkdir -p "${DOCKER_DIR}"
  17. sudo mkdir -p "${KEYCLOAK_SETUP_DIR}"
  18. # Initialize password variables
  19. KEYCLOAK_ADMIN_PASSWORD=""
  20. KC_DB_PASSWORD=""
  21. TESTADMIN_PASSWORD=""
  22. TESTUSER_PASSWORD=""
  23. TESTSERVICEUSER_PASSWORD=""
  24. KEYCLOAK_NEXTCLOUD_CLIENT_SECRET=""
  25. # Function to read a password from a .env file
  26. read_password_from_env() {
  27. local env_file="$1"
  28. local variable_name="$2"
  29. if [ -f "$env_file" ]; then
  30. grep "^${variable_name}=" "$env_file" | cut -d '=' -f2
  31. fi
  32. }
  33. # Function to generate secure passwords
  34. generate_password() {
  35. openssl rand -base64 32
  36. }
  37. # Function to generate password if empty
  38. generate_password_if_empty() {
  39. local variable_name="$1"
  40. eval "local value=\$$variable_name"
  41. if [ -z "$value" ]; then
  42. eval "$variable_name=\"$(generate_password)\""
  43. echo ">>> Generiertes Passwort für: $variable_name"
  44. fi
  45. }
  46. # Function to create .env file
  47. create_env_file() {
  48. local env_file="$1"
  49. local content="$2"
  50. if [ ! -f "$env_file" ]; then
  51. echo "$content" > "$env_file"
  52. echo ">>> .env file created: $env_file"
  53. else
  54. echo ">>> .env file already exists: $env_file"
  55. fi
  56. }
  57. echo ">>> Überprüfe bestehende .env Dateien und lese Passwörter..."
  58. # Try reading passwords from existing .env files
  59. if [ -f "$DOCKER_DIR/.env" ]; then
  60. KC_DB_PASSWORD=$(read_password_from_env "$DOCKER_DIR/.env" "KC_DB_PASSWORD")
  61. KEYCLOAK_ADMIN_PASSWORD=$(read_password_from_env "$DOCKER_DIR/.env" "KEYCLOAK_ADMIN_PASSWORD")
  62. fi
  63. if [ -f "$KEYCLOAK_SETUP_DIR/.env" ]; then
  64. KEYCLOAK_ADMIN_PASSWORD=$(read_password_from_env "$KEYCLOAK_SETUP_DIR/.env" "KEYCLOAK_ADMIN_PASSWORD") # Überschreibt ggf. den Wert aus docker/.env
  65. TESTADMIN_PASSWORD=$(read_password_from_env "$KEYCLOAK_SETUP_DIR/.env" "TESTADMIN_PASSWORD")
  66. TESTUSER_PASSWORD=$(read_password_from_env "$KEYCLOAK_SETUP_DIR/.env" "TESTUSER_PASSWORD")
  67. TESTSERVICEUSER_PASSWORD=$(read_password_from_env "$KEYCLOAK_SETUP_DIR/.env" "TESTSERVICEUSER_PASSWORD")
  68. KEYCLOAK_NEXTCLOUD_CLIENT_SECRET=$(read_password_from_env "$KEYCLOAK_SETUP_DIR/.env" "KEYCLOAK_NEXTCLOUD_CLIENT_SECRET")
  69. fi
  70. echo ">>> Generiere neue Passwörter für fehlende Werte..."
  71. # Generate passwords if they are still empty
  72. generate_password_if_empty KEYCLOAK_ADMIN_PASSWORD
  73. generate_password_if_empty KC_DB_PASSWORD
  74. generate_password_if_empty TESTADMIN_PASSWORD
  75. generate_password_if_empty TESTUSER_PASSWORD
  76. generate_password_if_empty TESTSERVICEUSER_PASSWORD
  77. generate_password_if_empty KEYCLOAK_NEXTCLOUD_CLIENT_SECRET
  78. # Date for documentation
  79. SETUP_DATE=$(date '+%Y-%m-%d_%H-%M-%S')
  80. # Create credentials content
  81. CREDENTIALS_CONTENT=$(cat <<EOL
  82. Setup Date: ${SETUP_DATE}
  83. Keycloak Admin Credentials:
  84. Username: admin
  85. Password: ${KEYCLOAK_ADMIN_PASSWORD}
  86. Keycloak Database Credentials:
  87. Username: keycloak
  88. Password: ${KC_DB_PASSWORD}
  89. Test User Credentials:
  90. Admin Password: ${TESTADMIN_PASSWORD}
  91. User Password: ${TESTUSER_PASSWORD}
  92. Service User Password: ${TESTSERVICEUSER_PASSWORD}
  93. Nextcloud Client Secret: ${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}
  94. EOL
  95. )
  96. # Store credentials hash
  97. CREDENTIALS_HASH=$(echo "$CREDENTIALS_CONTENT" | sha256sum | awk '{print $1}')
  98. echo "$CREDENTIALS_HASH" > "${CREDENTIALS_DIR}/credentials_hash.txt"
  99. echo ">>> Credentials hash stored in: ${CREDENTIALS_DIR}/credentials_hash.txt"
  100. # Set GPG PASSPHRASE
  101. export GPG_PASSPHRASE=$(generate_password)
  102. # Set GPG agent environment variable
  103. export GPG_TTY=$(tty)
  104. echo ">>> Trying openssl encryption first"
  105. # Alternative Verschlüsselung mit Openssl
  106. echo "$CREDENTIALS_CONTENT" > "$TEMP_FILE"
  107. if openssl enc -aes-256-cbc -pbkdf2 -salt -in "$TEMP_FILE" -out "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.enc" -k "$GPG_PASSPHRASE" ; then
  108. echo ">>> Credentials encrypted successfully using openssl"
  109. mv "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.enc" "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.gpg"
  110. else
  111. echo ">>> Openssl encryption failed, trying gpg"
  112. # Attempt to kill existing gpg agent
  113. gpgconf --kill gpg-agent 2>/dev/null
  114. echo ">>> Attempting to manually start gpg-agent with pinentry-curses"
  115. gpg-agent --daemon --pinentry-program /usr/bin/pinentry-curses
  116. gpg-connect-agent /bye 2>/dev/null
  117. eval $(gpg-agent --daemon)
  118. gpg-connect-agent updatestartuptty /bye 2>/dev/null
  119. # Attempt to encrypt credentials using GPG with error handling
  120. if echo "$CREDENTIALS_CONTENT" | gpg --symmetric --cipher-algo AES256 -vvv -o "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.gpg" ; then
  121. echo ">>> Credentials encrypted successfully using gpg."
  122. else
  123. echo ">>> GPG encryption failed. Attempting GPG encryption with password workaround."
  124. # Attempt encryption with passphrase workaround
  125. if echo "$CREDENTIALS_CONTENT" | gpg --batch --passphrase "$GPG_PASSPHRASE" --symmetric --cipher-algo AES256 -vvv -o "${CREDENTIALS_DIR}/credentials_${SETUP_DATE}.txt.gpg"; then
  126. echo ">>> Credentials encrypted successfully using gpg with passphrase workaround."
  127. else
  128. echo ">>> GPG encryption with passphrase workaround failed"
  129. exit 1
  130. fi
  131. fi
  132. fi
  133. rm "$TEMP_FILE"
  134. # Create .env file in docker directory
  135. DOCKER_ENV_CONTENT=$(cat <<EOL
  136. # Generated on ${SETUP_DATE}
  137. # Keycloak Admin
  138. KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD}
  139. # Keycloak Database
  140. KC_DB_USERNAME=keycloak
  141. KC_DB_PASSWORD=${KC_DB_PASSWORD}
  142. EOL
  143. )
  144. create_env_file "$DOCKER_DIR/.env" "$DOCKER_ENV_CONTENT"
  145. # Create .env file in scripts/setup/keycloak directory
  146. KEYCLOAK_ENV_CONTENT=$(cat <<EOL
  147. KEYCLOAK_URL=https://auth.mrx8086.com
  148. KEYCLOAK_ADMIN_USER=admin
  149. KEYCLOAK_ADMIN_PASSWORD=${KEYCLOAK_ADMIN_PASSWORD}
  150. NEXTCLOUD_CLIENT_ID=nextcloud
  151. PAPERLESS_CLIENT_ID=paperless
  152. NODERED_CLIENT_ID=nodered
  153. TESTADMIN_PASSWORD=${TESTADMIN_PASSWORD}
  154. TESTUSER_PASSWORD=${TESTUSER_PASSWORD}
  155. TESTSERVICEUSER_PASSWORD=${TESTSERVICEUSER_PASSWORD}
  156. KEYCLOAK_NEXTCLOUD_CLIENT_SECRET=${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}
  157. EOL
  158. )
  159. create_env_file "$KEYCLOAK_SETUP_DIR/.env" "$KEYCLOAK_ENV_CONTENT"
  160. echo ">>> Environment setup completed!"
  161. # --------------- KEYCLOAK KONFIGURATION ---------------
  162. echo ">>> Keycloak Konfiguration..."
  163. cd "$KEYCLOAK_SETUP_DIR"
  164. echo ">>> Starte setup_realm.js"
  165. node setup_realm.js
  166. cd "$PROJECT_ROOT"
  167. # --------------- NEXTCLOUD KONFIGURATION ---------------
  168. echo ">>> Nextcloud Konfiguration..."
  169. # Verify if variable is set from earlier in the script
  170. echo ">>> Debug: Checking original variable..."
  171. echo ">>> Debug: KEYCLOAK_NEXTCLOUD_CLIENT_SECRET = ${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}"
  172. # Try reading from .env file if variable is empty
  173. if [ -z "${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}" ]; then
  174. echo ">>> Debug: Variable is empty, trying to read from .env file..."
  175. KEYCLOAK_NEXTCLOUD_CLIENT_SECRET=$(grep KEYCLOAK_NEXTCLOUD_CLIENT_SECRET "${KEYCLOAK_SETUP_DIR}/.env" | cut -d '=' -f2)
  176. echo ">>> Debug: Value from .env file = ${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}"
  177. fi
  178. # Ensure we have a value
  179. if [ -z "${KEYCLOAK_NEXTCLOUD_CLIENT_SECRET}" ]; then
  180. echo ">>> Error: Could not get client secret value"
  181. exit 1
  182. fi
  183. # Escape special characters in the secret for JSON
  184. ESCAPED_SECRET=$(echo "$KEYCLOAK_NEXTCLOUD_CLIENT_SECRET" | sed 's/["\]/\\&/g')
  185. echo ">>> Debug: Escaped secret = $ESCAPED_SECRET"
  186. # Create the extra vars
  187. EXTRA_VARS="{\"client_secret\": \"$ESCAPED_SECRET\"}"
  188. echo ">>> Debug: Extra vars = $EXTRA_VARS"
  189. # Run Ansible with the extra vars
  190. sudo ansible-playbook \
  191. -i "$ANSIBLE_INVENTORY" \
  192. "$ANSIBLE_PLAYBOOK" \
  193. --extra-vars "$EXTRA_VARS" \
  194. -v
  195. echo ">>> Fertig"