fix(scripts): جلوگیری از خرابی Basic Auth با کوتیشن‌کردن مقدارهای دارای $

docker compose مقادیر .env را خودش تفسیر می‌کند؛ هش htpasswd شامل $apr1$...
است و بدون کوتیشن، $apr1 و بخش‌های بعدی به‌عنوان متغیر خالی جایگزین می‌شدند
(برچسب تبدیل به preview:/OBoRS/... می‌شد) و پیش‌نمایش خصوصی هرگز رمز را
نمی‌پذیرفت. حالا env_set مقدارهای دارای $ را تک‌کوتیشن می‌گذارد و env_get
کوتیشن را برمی‌دارد.
This commit is contained in:
aramesh-site deploy
2026-09-27 10:41:00 +00:00
parent 275c3d6bb3
commit 87b744c9c7
+9 -3
View File
@@ -21,25 +21,31 @@ cd "$(dirname "$0")/.."
ENV_FILE=.env
[ -f "$ENV_FILE" ] || { echo "فایل .env پیدا نشد — اول bash scripts/gen-env.sh" >&2; exit 1; }
# مقدار فعلی یک کلید در .env (یا خالی)
# مقدار فعلی یک کلید در .env (یا خالی) — کوتیشن تک‌نویسه‌ای هم برداشته می‌شود
env_get() {
local key="$1"
sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1
sed -n "s/^${key}=//p" "$ENV_FILE" | tail -1 | sed -e "s/^'//" -e "s/'\$//"
}
# تنظیم/جایگزینی یک کلید در .env (بدون آسیب به بقیه خطوط)
# نکتهٔ مهم: docker compose مقادیر .env را خودش تفسیر می‌کند؛ هش htpasswd شامل
# $apr1$... است و اگر کوتیشن نخورد، $apr1 و بخش‌های بعدی به‌عنوان متغیر خالی
# جایگزین می‌شوند و Basic Auth هرگز رمز را نمی‌پذیرد. پس هر مقدار دارای $ را
# تک‌کوتیشن می‌گذاریم (compose کوتیشن را برمی‌دارد و مقدار را عیناً می‌خواند).
env_set() {
local key="$1" value="$2"
if grep -q "^${key}=" "$ENV_FILE"; then
# جداکننده | تا کاراکترهای ویژه مقدار (مثل / و $) مشکلی نسازند
python3 - "$ENV_FILE" "$key" "$value" <<'PY'
import io, sys
path, key, value = sys.argv[1], sys.argv[2], sys.argv[3]
if "$" in value:
value = "'" + value + "'"
lines = io.open(path, encoding="utf-8").read().split("\n")
out = [f"{key}={value}" if line.startswith(f"{key}=") else line for line in lines]
io.open(path, "w", encoding="utf-8", newline="\n").write("\n".join(out))
PY
else
if [ "${value#*\$}" != "$value" ]; then value="'$value'"; fi
printf '\n%s=%s\n' "$key" "$value" >> "$ENV_FILE"
fi
}