#!/usr/bin/env bash # ============================================================================ # Incudal 本地 .env 初始化脚本 # # 用法: # bash scripts/init-env.sh # # 行为: # - 如果 .env 不存在,创建 .env # - 如果 .env 已存在,只补齐缺失或空值的关键变量 # - 不覆盖已有非空配置,避免破坏已部署实例 # ============================================================================ set -euo pipefail ENV_FILE="${ENV_FILE:-.env}" log() { echo "[✓] $1" >&2 } info() { echo "[i] $1" >&2 } gen_password() { openssl rand -hex 64 | cut -c "1-${1:-24}" } gen_secret() { printf 'A1!%s' "$(openssl rand -hex 64)" | cut -c "1-${1:-48}" } get_env_value() { local key="$1" if [[ ! -f "$ENV_FILE" ]]; then return 0 fi grep -E "^${key}=" "$ENV_FILE" 2>/dev/null | tail -n 1 | cut -d'=' -f2- || true } set_env_if_missing() { local key="$1" local value="$2" local label="$3" local current current="$(get_env_value "$key")" if [[ -n "$current" ]]; then return 0 fi if grep -qE "^${key}=" "$ENV_FILE" 2>/dev/null; then local tmp_file tmp_file="$(mktemp)" awk -v key="$key" -v value="$value" ' BEGIN { replaced = 0 } $0 ~ "^" key "=" && replaced == 0 { print key "=" value replaced = 1 next } { print } ' "$ENV_FILE" > "$tmp_file" cat "$tmp_file" > "$ENV_FILE" rm -f "$tmp_file" else printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE" fi log "已自动补充 ${label}: ${key}" } if [[ ! -f "$ENV_FILE" ]]; then cat > "$ENV_FILE" <