thread-master/deploy/scripts/_common.sh

125 lines
3.7 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# shellcheck disable=SC2034
# 共用:路徑、載入 env、log helper。由其他腳本 source。
set -euo pipefail
DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ROOT_DIR="$(cd "$DEPLOY_DIR/.." && pwd)"
BACKEND_DIR="$ROOT_DIR/apps/backend"
WEB_DIR="$ROOT_DIR/apps/web"
RUN_DIR="$DEPLOY_DIR/run"
COMPOSE_FILE="$DEPLOY_DIR/docker-compose.infra.yml"
PID_GATEWAY="$RUN_DIR/gateway.pid"
PID_WEB="$RUN_DIR/web.pid"
LOG_GATEWAY="$RUN_DIR/gateway.log"
LOG_WEB="$RUN_DIR/web.log"
mkdir -p "$RUN_DIR"
log() { printf '[deploy] %s\n' "$*"; }
err() { printf '[deploy] ERROR: %s\n' "$*" >&2; }
die() { err "$*"; exit 1; }
# 優先 .env.dev其次 .env
resolve_env_file() {
if [[ -n "${ENV_FILE:-}" && -f "$ENV_FILE" ]]; then
echo "$ENV_FILE"
return
fi
if [[ -f "$DEPLOY_DIR/.env.dev" ]]; then
echo "$DEPLOY_DIR/.env.dev"
return
fi
if [[ -f "$DEPLOY_DIR/.env" ]]; then
echo "$DEPLOY_DIR/.env"
return
fi
return 1
}
load_env() {
local f
if ! f="$(resolve_env_file)"; then
die "找不到 env。請先cp deploy/.env.example deploy/.env.dev 並填密鑰"
fi
log "env: $f"
set -a
# shellcheck disable=SC1090
source "$f"
set +a
# 別名正規化(給 gateway ApplyEnv / migrate
export MONGO_URI="${MONGO_URI:-${HAIXUN_MONGO_URI:-}}"
if [[ -z "${MONGO_URL:-}" ]]; then
if [[ -n "${MONGO_URI:-}" ]]; then
export MONGO_URL="$(
MONGO_URI="$MONGO_URI" MONGO_DATABASE="${MONGO_DATABASE:-haixun}" python3 -c "
import os, re
u = os.environ.get('MONGO_URI', '')
db = os.environ.get('MONGO_DATABASE', 'haixun')
if re.search(r'/\?', u):
print(re.sub(r'/\?', f'/{db}?', u, count=1))
elif re.search(r'/' + re.escape(db) + r'(\?|$)', u):
print(u)
else:
print(u.rstrip('/') + f'/{db}')
"
)"
else
local user="${MONGO_ROOT_USER:-haixun}"
local pass="${MONGO_ROOT_PASSWORD:-}"
local db="${MONGO_DATABASE:-haixun}"
export MONGO_URI="mongodb://${user}:${pass}@127.0.0.1:27017/?authSource=admin"
export MONGO_URL="mongodb://${user}:${pass}@127.0.0.1:27017/${db}?authSource=admin"
fi
fi
export REDIS_PASSWORD="${REDIS_PASSWORD:-${HAIXUN_REDIS_PASSWORD:-}}"
export HAIXUN_REDIS_PASSWORD="${HAIXUN_REDIS_PASSWORD:-$REDIS_PASSWORD}"
export AUTH_ACCESS_SECRET="${AUTH_ACCESS_SECRET:-${HAIXUN_JWT_ACCESS_SECRET:-}}"
export AUTH_REFRESH_SECRET="${AUTH_REFRESH_SECRET:-${HAIXUN_JWT_REFRESH_SECRET:-}}"
export HAIXUN_STORAGE_S3_ACCESS_KEY="${HAIXUN_STORAGE_S3_ACCESS_KEY:-${MINIO_ROOT_USER:-haixun}}"
export HAIXUN_STORAGE_S3_SECRET_KEY="${HAIXUN_STORAGE_S3_SECRET_KEY:-${MINIO_ROOT_PASSWORD:-}}"
export MINIO_ROOT_USER="${MINIO_ROOT_USER:-haixun}"
export MINIO_ROOT_PASSWORD="${MINIO_ROOT_PASSWORD:-$HAIXUN_STORAGE_S3_SECRET_KEY}"
export OBJECT_STORAGE_PUBLIC_BASE_URL="${OBJECT_STORAGE_PUBLIC_BASE_URL:-${HAIXUN_STORAGE_S3_PUBLIC_BASE_URL:-}}"
export HAIXUN_STORAGE_S3_PUBLIC_BASE_URL="${HAIXUN_STORAGE_S3_PUBLIC_BASE_URL:-$OBJECT_STORAGE_PUBLIC_BASE_URL}"
export PUBLIC_WEB_BASE="${PUBLIC_WEB_BASE:-http://127.0.0.1:5173}"
export GATEWAY_PORT="${GATEWAY_PORT:-8888}"
export WEB_PORT="${WEB_PORT:-5173}"
ENV_FILE_RESOLVED="$f"
}
compose() {
local f
f="$(resolve_env_file)" || die "no env"
docker compose --env-file "$f" -f "$COMPOSE_FILE" "$@"
}
pid_alive() {
local pid="${1:-}"
[[ -n "$pid" ]] && kill -0 "$pid" 2>/dev/null
}
kill_port() {
local port="$1"
local p
p="$(ss -tlnp 2>/dev/null | sed -n "s/.*:${port} .*pid=\([0-9]*\).*/\1/p" | head -1 || true)"
if [[ -n "$p" ]]; then
log "kill port :$port pid=$p"
kill "$p" 2>/dev/null || true
sleep 0.4
kill -9 "$p" 2>/dev/null || true
fi
}
require_cmd() {
command -v "$1" >/dev/null 2>&1 || die "需要指令:$1"
}