From 0883df7ab955061dcc3ee760fb9368f3aaa3676b Mon Sep 17 00:00:00 2001 From: icy Date: Thu, 6 Nov 2025 19:12:45 +0800 Subject: [PATCH] chore: load db credentials from .env in helper scripts --- scripts/import_beta_codes.sh | 91 +++++++++++++++++++++++++----------- scripts/view_pg_data.sh | 91 +++++++++++++++++++++--------------- 2 files changed, 116 insertions(+), 66 deletions(-) diff --git a/scripts/import_beta_codes.sh b/scripts/import_beta_codes.sh index 67826f9c..dab961ae 100755 --- a/scripts/import_beta_codes.sh +++ b/scripts/import_beta_codes.sh @@ -1,52 +1,87 @@ #!/bin/bash -set -e +set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" cd "$ROOT_DIR" -# 将beta_codes.txt刷到PostgreSQL数据库 -echo "🎟️ 导入beta_codes.txt到数据库" +echo "🎟️ 导入 beta_codes.txt 到 PostgreSQL" -# 检查文件 if [ ! -f "beta_codes.txt" ]; then - echo "❌ 找不到beta_codes.txt文件" + echo "❌ 找不到 beta_codes.txt 文件" exit 1 fi -# 检测docker命令 if command -v "docker-compose" &> /dev/null; then DOCKER_CMD="docker-compose" -else +elif command -v "docker" &> /dev/null && docker compose version &> /dev/null; then DOCKER_CMD="docker compose" +else + echo "❌ 错误:找不到 docker-compose 或 docker compose 命令" + exit 1 fi -# 统计数量 -TOTAL=$(cat beta_codes.txt | wc -l) -echo "📊 文件中共有 $TOTAL 个内测码" +ENV_FILE=".env" +if [ -f "$ENV_FILE" ]; then + echo "📁 加载 .env 配置..." + set -a + # shellcheck disable=SC1090 + source "$ENV_FILE" + set +a +else + echo "⚠️ 未找到 .env 文件,使用默认数据库配置" +fi -# 生成SQL -cat > import.sql << EOF -INSERT INTO beta_codes (code) VALUES -EOF +POSTGRES_HOST=${POSTGRES_HOST:-postgres} +POSTGRES_PORT=${POSTGRES_PORT:-5432} +POSTGRES_DB=${POSTGRES_DB:-nofx} +POSTGRES_USER=${POSTGRES_USER:-nofx} +POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-} +POSTGRES_SERVICE=${POSTGRES_SERVICE:-postgres} +POSTGRES_CONTAINER_NAME=${POSTGRES_CONTAINER_NAME:-nofx-postgres} -# 读取每行并生成INSERT语句 -cat beta_codes.txt | while read line; do - if [ -n "$line" ]; then - echo "('$line')," >> import.sql - fi -done +POSTGRES_CONTAINER=$($DOCKER_CMD ps -q "$POSTGRES_SERVICE" 2>/dev/null || true) +if [ -z "$POSTGRES_CONTAINER" ]; then + POSTGRES_CONTAINER=$(docker ps -q --filter "name=$POSTGRES_CONTAINER_NAME" | head -n 1) +fi -# 移除最后的逗号并添加冲突处理 -sed -i '$ s/,$//' import.sql -echo "ON CONFLICT (code) DO NOTHING;" >> import.sql +if [ -z "$POSTGRES_CONTAINER" ]; then + echo "❌ 找不到 PostgreSQL 容器 (${POSTGRES_SERVICE}/${POSTGRES_CONTAINER_NAME})" + echo "💡 请确认数据库服务已启动" + exit 1 +fi + +PG_ENV_ARGS=() +if [ -n "$POSTGRES_PASSWORD" ]; then + PG_ENV_ARGS=(--env "PGPASSWORD=$POSTGRES_PASSWORD") +fi + +SQL_PAYLOAD=$(python3 - <<'PY' +from pathlib import Path + +codes = [] +for line in Path('beta_codes.txt').read_text(encoding='utf-8').splitlines(): + code = line.strip() + if code and not code.startswith('#'): + codes.append(f"('{code}')") + +if codes: + values = ",\n".join(codes) + print(f"INSERT INTO beta_codes (code) VALUES\n{values}\nON CONFLICT (code) DO NOTHING;") +PY +) + +if [ -z "$SQL_PAYLOAD" ]; then + echo "⚠️ beta_codes.txt 中没有有效的内测码,已跳过导入" + exit 0 +fi + +TOTAL_CODES=$(grep -vc '^\s*$' beta_codes.txt || true) +echo "📊 检测到 $TOTAL_CODES 条内测码记录" -# 执行导入 echo "🔄 导入到数据库..." -$DOCKER_CMD exec -T postgres psql -U nofx -d nofx < import.sql +printf '%s\n' "$SQL_PAYLOAD" | docker exec -i "${PG_ENV_ARGS[@]}" "$POSTGRES_CONTAINER" \ + psql -v ON_ERROR_STOP=1 --pset pager=off -U "$POSTGRES_USER" -d "$POSTGRES_DB" echo "✅ 导入完成(重复的已跳过)" - -# 清理 -rm import.sql diff --git a/scripts/view_pg_data.sh b/scripts/view_pg_data.sh index feeee402..d6c1f06d 100755 --- a/scripts/view_pg_data.sh +++ b/scripts/view_pg_data.sh @@ -1,6 +1,6 @@ #!/bin/bash -set -e +set -euo pipefail # 保证从仓库根目录运行 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" @@ -22,51 +22,66 @@ else exit 1 fi +# 加载数据库配置 +ENV_FILE=".env" +if [ -f "$ENV_FILE" ]; then + echo "📁 加载 .env 配置..." + set -a + # shellcheck disable=SC1090 + source "$ENV_FILE" + set +a +else + echo "⚠️ 未找到 .env 文件,使用默认数据库配置" +fi + +POSTGRES_HOST=${POSTGRES_HOST:-postgres} +POSTGRES_PORT=${POSTGRES_PORT:-5432} +POSTGRES_DB=${POSTGRES_DB:-nofx} +POSTGRES_USER=${POSTGRES_USER:-nofx} +POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-} +POSTGRES_SERVICE=${POSTGRES_SERVICE:-postgres} +POSTGRES_CONTAINER_NAME=${POSTGRES_CONTAINER_NAME:-nofx-postgres} + +# 获取 PostgreSQL 容器 ID +POSTGRES_CONTAINER=$($DOCKER_COMPOSE_CMD ps -q "$POSTGRES_SERVICE" 2>/dev/null || true) +if [ -z "$POSTGRES_CONTAINER" ]; then + POSTGRES_CONTAINER=$(docker ps -q --filter "name=$POSTGRES_CONTAINER_NAME" | head -n 1) +fi + +if [ -z "$POSTGRES_CONTAINER" ]; then + echo "❌ 找不到 PostgreSQL 容器 (${POSTGRES_SERVICE}/${POSTGRES_CONTAINER_NAME})" + echo "💡 请确认数据库服务已启动" + exit 1 +fi + +PG_ENV_ARGS=() +if [ -n "$POSTGRES_PASSWORD" ]; then + PG_ENV_ARGS=(--env "PGPASSWORD=$POSTGRES_PASSWORD") +fi + +run_psql() { + local sql="$1" + docker exec -i "${PG_ENV_ARGS[@]}" "$POSTGRES_CONTAINER" \ + psql -v ON_ERROR_STOP=1 --pset pager=off -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c "$sql" +} + +echo "📋 数据库容器: $POSTGRES_CONTAINER" +echo "📋 连接参数: $POSTGRES_HOST:${POSTGRES_PORT}/$POSTGRES_DB (user: $POSTGRES_USER)" + echo "📊 数据库概览:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT relname as \"表名\", n_live_tup as \"记录数\" -FROM pg_stat_user_tables -WHERE n_live_tup > 0 -ORDER BY relname; -" +run_psql "SELECT relname AS \"表名\", n_live_tup AS \"记录数\" FROM pg_stat_user_tables WHERE n_live_tup > 0 ORDER BY relname;" echo -e "\n🤖 AI模型配置:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT id, name, provider, enabled, - CASE WHEN api_key != '' THEN '已配置' ELSE '未配置' END as api_key_status -FROM ai_models ORDER BY id; -" +run_psql "SELECT id, name, provider, enabled, CASE WHEN api_key != '' THEN '已配置' ELSE '未配置' END AS api_key_status FROM ai_models ORDER BY id;" echo -e "\n🏢 交易所配置:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT id, name, type, enabled, - CASE WHEN api_key != '' THEN '已配置' ELSE '未配置' END as api_key_status -FROM exchanges ORDER BY id; -" +run_psql "SELECT id, name, type, enabled, CASE WHEN api_key != '' THEN '已配置' ELSE '未配置' END AS api_key_status FROM exchanges ORDER BY id;" echo -e "\n⚙️ 关键系统配置:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT key, - CASE - WHEN LENGTH(value) > 50 THEN LEFT(value, 50) || '...' - ELSE value - END as value -FROM system_config -WHERE key IN ('beta_mode', 'api_server_port', 'default_coins', 'jwt_secret') -ORDER BY key; -" +run_psql "SELECT key, CASE WHEN LENGTH(value) > 50 THEN LEFT(value, 50) || '...' ELSE value END AS value FROM system_config WHERE key IN ('beta_mode', 'api_server_port', 'default_coins', 'jwt_secret') ORDER BY key;" echo -e "\n🎟️ 内测码统计:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT - CASE WHEN used THEN '已使用' ELSE '未使用' END as status, - COUNT(*) as count -FROM beta_codes -GROUP BY used -ORDER BY used; -" +run_psql "SELECT CASE WHEN used THEN '已使用' ELSE '未使用' END AS status, COUNT(*) AS count FROM beta_codes GROUP BY used ORDER BY used;" echo -e "\n👥 用户信息:" -$DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -c " -SELECT id, email, otp_verified, created_at FROM users ORDER BY created_at; -" +run_psql "SELECT id, email, otp_verified, created_at FROM users ORDER BY created_at;"