#!/usr/bin/env bash get_single_host_proxy_mode_id() { local proxy_mode="${1}" case "${proxy_mode}" in "Traefik (HTTP, built-in proxy)") printf 'traefik-http\n' ;; "Traefik (HTTPS + Let's Encrypt)") printf 'traefik-https\n' ;; "nginx-proxy (HTTP)") printf 'nginxproxy-http\n' ;; "nginx-proxy + acme-companion (HTTPS)") printf 'nginxproxy-https\n' ;; "Caddy (external reverse proxy)") printf 'caddy-external\n' ;; "No reverse proxy (direct :8080)") printf 'no-proxy\n' ;; *) return 1 ;; esac } get_single_host_proxy_overrides() { local proxy_mode="${1}" case "${proxy_mode}" in "Traefik (HTTP, built-in proxy)") printf 'overrides/compose.proxy.yaml\n' ;; "Traefik (HTTPS + Let's Encrypt)") printf 'overrides/compose.https.yaml\n' ;; "nginx-proxy (HTTP)") printf 'overrides/compose.nginxproxy.yaml\n' ;; "nginx-proxy + acme-companion (HTTPS)") printf 'overrides/compose.nginxproxy.yaml\noverrides/compose.nginxproxy-ssl.yaml\n' ;; "Caddy (external reverse proxy)" | "No reverse proxy (direct :8080)") printf 'overrides/compose.noproxy.yaml\n' ;; *) return 1 ;; esac } get_single_host_database_id() { local database_choice="${1}" case "${database_choice}" in "MariaDB (recommended)") printf 'mariadb\n' ;; "PostgreSQL") printf 'postgres\n' ;; *) return 1 ;; esac } get_single_host_database_override() { local database_choice="${1}" case "${database_choice}" in "MariaDB (recommended)") printf 'overrides/compose.mariadb.yaml\n' ;; "PostgreSQL") printf 'overrides/compose.postgres.yaml\n' ;; *) return 1 ;; esac } get_single_host_redis_id() { local redis_choice="${1}" case "${redis_choice}" in "Include Redis (recommended)") printf 'enabled\n' ;; "Skip Redis (experienced users only)") printf 'disabled\n' ;; *) return 1 ;; esac } get_single_host_redis_override() { local redis_choice="${1}" case "${redis_choice}" in "Include Redis (recommended)") printf 'overrides/compose.redis.yaml\n' ;; "Skip Redis (experienced users only)") printf '' ;; *) return 1 ;; esac } persist_single_host_env_file() { local stack_dir="${1}" local env_lines="${2}" local env_path="" local env_tmp_path="" local generated_at="" env_path="$(get_stack_env_path "${stack_dir}")" env_tmp_path="${env_path}.tmp" generated_at="$(get_current_utc_timestamp)" if ! { printf '# Generated by easy-docker wizard at %s\n' "${generated_at}" printf '# Adjust values as needed for this stack.\n' if [ -n "${env_lines}" ]; then printf '\n%s\n' "${env_lines}" else printf '\n# No additional environment variables configured by the wizard.\n' fi } >"${env_tmp_path}"; then rm -f -- "${env_tmp_path}" >/dev/null 2>&1 || true return 1 fi if ! mv -- "${env_tmp_path}" "${env_path}"; then rm -f -- "${env_tmp_path}" >/dev/null 2>&1 || true return 1 fi return 0 } persist_single_host_selection_metadata() { local stack_dir="${1}" local proxy_mode_id="${2}" local database_id="${3}" local redis_id="${4}" local compose_files_lines="${5}" local apps_json_object="${6}" local env_lines="${7}" local metadata_path="" local metadata_tmp_path="" local schema_version="" local stack_name="" local setup_type="" local created_at="" local updated_at="" local compose_files_json="" local env_json_object="" metadata_path="${stack_dir}/metadata.json" metadata_tmp_path="${metadata_path}.tmp" schema_version="$(get_metadata_number_field "${metadata_path}" "schema_version" || true)" if [ -z "${schema_version}" ]; then schema_version="1" fi stack_name="$(get_metadata_string_field "${metadata_path}" "stack_name" || true)" if [ -z "${stack_name}" ]; then stack_name="${stack_dir##*/}" fi setup_type="$(get_metadata_string_field "${metadata_path}" "setup_type" || true)" if [ -z "${setup_type}" ]; then setup_type="production" fi created_at="$(get_metadata_string_field "${metadata_path}" "created_at" || true)" if [ -z "${created_at}" ]; then created_at="$(get_current_utc_timestamp)" fi updated_at="$(get_current_utc_timestamp)" compose_files_json="$(build_compose_files_json_array "${compose_files_lines}")" env_json_object="$(build_env_json_object "${env_lines}")" if [ -z "${apps_json_object}" ]; then return 1 fi if ! cat >"${metadata_tmp_path}" </dev/null 2>&1 || true return 1 fi if ! mv -- "${metadata_tmp_path}" "${metadata_path}"; then rm -f -- "${metadata_tmp_path}" >/dev/null 2>&1 || true return 1 fi return 0 } save_single_host_selection() { local stack_dir="${1}" local proxy_mode="${2}" local database_choice="${3}" local redis_choice="${4}" local proxy_mode_id="" local database_id="" local redis_id="" local database_override="" local redis_override="" local proxy_overrides="" local compose_files_lines="" local env_lines="" local apps_metadata_json_object="" local collect_env_status=0 proxy_mode_id="$(get_single_host_proxy_mode_id "${proxy_mode}")" || return 1 database_id="$(get_single_host_database_id "${database_choice}")" || return 1 redis_id="$(get_single_host_redis_id "${redis_choice}")" || return 1 database_override="$(get_single_host_database_override "${database_choice}")" || return 1 redis_override="$(get_single_host_redis_override "${redis_choice}")" || return 1 proxy_overrides="$(get_single_host_proxy_overrides "${proxy_mode}")" || return 1 compose_files_lines="$(printf 'compose.yaml\n%s' "${database_override}")" if [ -n "${redis_override}" ]; then compose_files_lines="$(printf '%s\n%s' "${compose_files_lines}" "${redis_override}")" fi compose_files_lines="$(printf '%s\n%s' "${compose_files_lines}" "${proxy_overrides}")" if ! collect_single_host_env_lines env_lines apps_metadata_json_object "${stack_dir}" "${proxy_mode_id}" "${database_id}"; then collect_env_status=$? return "${collect_env_status}" fi if ! persist_single_host_env_file "${stack_dir}" "${env_lines}"; then return 1 fi if ! persist_single_host_selection_metadata \ "${stack_dir}" \ "${proxy_mode_id}" \ "${database_id}" \ "${redis_id}" \ "${compose_files_lines}" \ "${apps_metadata_json_object}" \ "${env_lines}"; then return 1 fi if ! persist_stack_apps_json_from_metadata_apps "${stack_dir}"; then return 1 fi return 0 }