From fe775ca1c2a959d5fb9d700effbfbe2c13ab36aa Mon Sep 17 00:00:00 2001 From: cortex Date: Wed, 20 May 2026 15:17:30 +0100 Subject: [PATCH] final commit before setup refactoring --- init/scripts/compose_gen.sh | 45 ++++++++++++++++++++--------------- init/scripts/functions.sh | 47 +++++++++++++++++++++++++++++++++++-- init/scripts/set_env.sh | 38 ++++++++++++++++++++++-------- setup.sh | 3 +-- 4 files changed, 100 insertions(+), 33 deletions(-) diff --git a/init/scripts/compose_gen.sh b/init/scripts/compose_gen.sh index 3c2327e..f5936ed 100755 --- a/init/scripts/compose_gen.sh +++ b/init/scripts/compose_gen.sh @@ -13,7 +13,7 @@ require_file "$TEMPLATE_FILE" "Compose template" log_info "Configuring optional services..." -read -r -p "Enable LiveKit RTC Stack? (Y/n) [Y]: " LIVEKIT_INPUT +read -r -p "Enable LiveKit RTC Stack? (Used for Element call) (Y/n) [Y]: " LIVEKIT_INPUT LIVEKIT_INPUT="${LIVEKIT_INPUT:-Y}" if [[ "$LIVEKIT_INPUT" =~ ^[Yy]$ ]]; then INCLUDE_LIVEKIT=true @@ -29,39 +29,46 @@ EOF else INCLUDE_LIVEKIT=false fi +write_state LIVEKIT "$INCLUDE_LIVEKIT" echo "Select Web Client: 1) Element 2) Cinny 3) FluffyChat 4) None" read -r -p "Default [1]: " WEB_APP_INPUT WEB_APP_INPUT="${WEB_APP_INPUT:-1}" case "$WEB_APP_INPUT" in - 1) INCLUDE_ELEMENT=true; INCLUDE_CINNY=false; INCLUDE_FLUFFY=false ;; - 2) INCLUDE_ELEMENT=false; INCLUDE_CINNY=true; INCLUDE_FLUFFY=false ;; - 3) INCLUDE_ELEMENT=false; INCLUDE_CINNY=false; INCLUDE_FLUFFY=true ;; - *) INCLUDE_ELEMENT=false; INCLUDE_CINNY=false; INCLUDE_FLUFFY=false ;; + 1) INCLUDE_ELEMENT=true; INCLUDE_CINNY=false; INCLUDE_FLUFFY=false; write_state "APP" "ELEMENT" ;; + 2) INCLUDE_ELEMENT=false; INCLUDE_CINNY=true; INCLUDE_FLUFFY=false; write_state "APP" "CINNY" ;; + 3) INCLUDE_ELEMENT=false; INCLUDE_CINNY=false; INCLUDE_FLUFFY=true; write_state "APP" "FLUFFY" ;; + *) INCLUDE_ELEMENT=false; INCLUDE_CINNY=false; INCLUDE_FLUFFY=false; write_state "APP" "NONE" ;; esac echo "Select Reverse Proxy: 1) Traefik 2) nginx" read -r -p "Default [1]: " PROXY_INPUT PROXY_INPUT="${PROXY_INPUT:-1}" case "$PROXY_INPUT" in - 1) INCLUDE_NGINX=false; INCLUDE_TRAEFIK=true ;; - *) INCLUDE_NGINX=true; INCLUDE_TRAEFIK=false ;; + 2) + INCLUDE_NGINX=true + INCLUDE_TRAEFIK=false + write_state "PROXY" "NGINX" + ;; + *) + INCLUDE_NGINX=false + INCLUDE_TRAEFIK=true + write_state "PROXY" "TRAEFIK" + ;; esac - cp "$TEMPLATE_FILE" "$OUTPUT_FILE" -toggle_block() { - [[ "$3" == "true" ]] && sed -i "/$1/d; /$2/d" "$OUTPUT_FILE" || sed -i "/$1/,/$2/d" "$OUTPUT_FILE" -} +toggle_block "$OUTPUT_FILE" "# \[LIVEKIT_START\]" "# \[LIVEKIT_END\]" "$INCLUDE_LIVEKIT" +toggle_block "$OUTPUT_FILE" "# \[ELEMENT_START\]" "# \[ELEMENT_END\]" "$INCLUDE_ELEMENT" +toggle_block "$OUTPUT_FILE" "# \[CINNY_START\]" "# \[CINNY_END\]" "$INCLUDE_CINNY" +toggle_block "$OUTPUT_FILE" "# \[FLUFFYCHAT_START\]" "# \[FLUFFYCHAT_END\]" "$INCLUDE_FLUFFY" +toggle_block "$OUTPUT_FILE" "# \[NGINX_START\]" "# \[NGINX_END\]" "$INCLUDE_NGINX" +toggle_block "$OUTPUT_FILE" "# \[TRAEFIK_START\]" "# \[TRAEFIK_END\]" "$INCLUDE_TRAEFIK" -toggle_block "# \[LIVEKIT_START\]" "# \[LIVEKIT_END\]" "$INCLUDE_LIVEKIT" -toggle_block "# \[ELEMENT_START\]" "# \[ELEMENT_END\]" "$INCLUDE_ELEMENT" -toggle_block "# \[CINNY_START\]" "# \[CINNY_END\]" "$INCLUDE_CINNY" -toggle_block "# \[FLUFFYCHAT_START\]" "# \[FLUFFYCHAT_END\]" "$INCLUDE_FLUFFY" -toggle_block "# \[NGINX_START\]" "# \[NGINX_END\]" "$INCLUDE_NGINX" -toggle_block "# \[TRAEFIK_START\]" "# \[TRAEFIK_END\]" "$INCLUDE_TRAEFIK" - -[[ "$INCLUDE_TRAEFIK" == "true" ]] && sed -i "/# \[TRAEFIK_LABELS_START\]/d; /# \[TRAEFIK_LABELS_END\]/d" "$OUTPUT_FILE" || \ +if [[ "$INCLUDE_TRAEFIK" == "true" ]]; then + sed -i "/# \[TRAEFIK_LABELS_START\]/d; /# \[TRAEFIK_LABELS_END\]/d" "$OUTPUT_FILE" +else sed -i "/# \[TRAEFIK_LABELS_START\]/,/# \[TRAEFIK_LABELS_END\]/d" "$OUTPUT_FILE" +fi log_info "Compose file generated: $OUTPUT_FILE" diff --git a/init/scripts/functions.sh b/init/scripts/functions.sh index 5f42553..dd34c9d 100644 --- a/init/scripts/functions.sh +++ b/init/scripts/functions.sh @@ -51,8 +51,9 @@ write_state() { local value="$2" local init_file="${INIT_DIR}/init.ini" local upper_value + upper_key=$(echo "$key" | tr '[:lower:]' '[:upper:]') upper_value=$(echo "$value" | tr '[:lower:]' '[:upper:]') - echo "${key}=${upper_value}" >> "$init_file" + echo "${upper_key}=${upper_value}" >> "$init_file" } load_state() { @@ -64,6 +65,31 @@ load_state() { fi } +toggle_block() { + local target_file="$1" + local start_marker="$2" + local end_marker="$3" + local keep_markers="$4" # "true" or "false" + + if [[ -z "$target_file" ]]; then + echo "Error: Output file path is required for toggle_block." >&2 + return 1 + fi + + if [[ ! -f "$target_file" ]]; then + echo "Error: Target file '$target_file' not found." >&2 + return 1 + fi + + if [[ "$keep_markers" == "true" ]]; then + # Remove lines containing markers individually + sed -i "/${start_marker}/d; /${end_marker}/d" "$target_file" + else + # Remove block from start to end + sed -i "/${start_marker},/${end_marker}/d" "$target_file" + fi +} + clear_state() { local init_file="${INIT_DIR}/init.ini" > "$init_file" @@ -110,7 +136,6 @@ prompt_var() { final_value="$input" fi - # Escape special characters for .env file final_value="${final_value//\\/\\\\}" final_value="${final_value//\"/\\\"}" final_value="${final_value//\$/\\\$}" @@ -119,6 +144,24 @@ prompt_var() { echo "${var_name}=\"${final_value}\"" >> "$ENV_FILE" } +auto_var() { + local name="$1" + local default="$2" + local is_pass="$3" + + if [[ "$is_pass" == "yes" ]]; then + local secret + secret=$(generate_secret 32) + echo "${name}=\"${secret}\"" >> "$ENV_FILE" + log_info " Generated ${name}" + else + echo "${name}=\"${default}\"" >> "$ENV_FILE" + log_info " Set ${name} to default: ${default}" + fi +} + + + # --- File Permissions --- fix_ownership() { local target="$1" diff --git a/init/scripts/set_env.sh b/init/scripts/set_env.sh index bebcdfd..3086f56 100755 --- a/init/scripts/set_env.sh +++ b/init/scripts/set_env.sh @@ -5,22 +5,40 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source "${SCRIPT_DIR}/functions.sh" resolve_paths -require_command "openssl" || require_command "pwgen" - main() { > "$ENV_FILE" read -r -p "Base Domain (e.g. example.org) [example.org]: " DOMAIN_INPUT - BASE_DOMAIN="${DOMAIN_INPUT:-example.org}" + DOMAIN="${DOMAIN_INPUT:-example.org}" + auto_var "DOMAIN" $DOMAIN "no" + log_info "Base Domain set to: ${DOMAIN}" + + read -r -p "Auto-generate secure defaults for remaining fields? [Y/n]: " GEN_INPUT + GEN_INPUT="${GEN_INPUT:-Y}" + + if [[ "$GEN_INPUT" =~ ^[Yy]$ ]]; then + log_info "Generating secure defaults..." + + auto_var "USER_ID" "1000" "no" + auto_var "GROUP_ID" "1000" "no" + auto_var "VOLUME_PATH" "./matrix" "no" + auto_var "COUNTRY" "GB" "no" + auto_var "PG_USER" "postgres" "no" + auto_var "PG_PASSWORD" "generated" "yes" + auto_var "PG_USER_MATRIX" "matrix" "no" + auto_var "PG_DB_MATRIX" "synapse" "no" + auto_var "PG_PASSWORD_MATRIX" "generated" "yes" + auto_var "PG_USER_MAS" "mas" "no" + auto_var "PG_DB_MAS" "auth" "no" + auto_var "PG_PASSWORD_MAS" "generated" "yes" + + log_info "All fields auto-generated." + else + log_info "Manual entry mode." + + - cat >> "$ENV_FILE" <