Files
nofx/import_default_patch.sh
T

151 lines
6.4 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.
#!/bin/bash
# 从SQLite导入default用户和系统默认数据到PostgreSQL
echo "🔧 从SQLite导入default用户和系统默认数据"
echo "========================================"
# 检查SQLite数据库文件
SQLITE_DB="config.db"
if [ ! -f "$SQLITE_DB" ]; then
echo "❌ 错误:找不到 SQLite 数据库文件 $SQLITE_DB"
exit 1
fi
# 检测Docker Compose命令
DOCKER_COMPOSE_CMD=""
if command -v "docker-compose" &> /dev/null; then
DOCKER_COMPOSE_CMD="docker-compose"
elif command -v "docker" &> /dev/null && docker compose version &> /dev/null; then
DOCKER_COMPOSE_CMD="docker compose"
else
echo "❌ 错误:找不到 docker-compose 或 docker compose 命令"
exit 1
fi
echo "📋 使用命令: $DOCKER_COMPOSE_CMD"
# 分析SQLite中的default用户数据
echo "📊 分析SQLite中的default用户数据..."
AI_MODEL_COUNT=$(sqlite3 $SQLITE_DB "SELECT COUNT(*) FROM ai_models WHERE user_id = 'default';" 2>/dev/null || echo "0")
EXCHANGE_COUNT=$(sqlite3 $SQLITE_DB "SELECT COUNT(*) FROM exchanges WHERE user_id = 'default';" 2>/dev/null || echo "0")
echo " 🤖 AI模型: $AI_MODEL_COUNT"
echo " 🏢 交易所: $EXCHANGE_COUNT"
if [ "$AI_MODEL_COUNT" -eq 0 ] && [ "$EXCHANGE_COUNT" -eq 0 ]; then
echo "⚠️ SQLite中没有default用户的数据,将跳过导入"
exit 0
fi
# 生成导入脚本
IMPORT_SQL="import_default_data.sql"
cat > $IMPORT_SQL << EOL
-- 从SQLite导入default用户和系统默认数据
-- 生成时间: $(date)
-- 设置时区
SET timezone = 'Asia/Shanghai';
-- 1. 创建default用户(如果不存在)
INSERT INTO users (id, email, password_hash, otp_secret, otp_verified, created_at, updated_at)
VALUES ('default', 'default@localhost', '', '', true, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
ON CONFLICT (id) DO NOTHING;
EOL
# 导出AI模型数据
if [ "$AI_MODEL_COUNT" -gt 0 ]; then
echo "🤖 导出AI模型数据..."
echo "-- AI模型数据 ($AI_MODEL_COUNT 条记录)" >> $IMPORT_SQL
echo "INSERT INTO ai_models (id, user_id, name, provider, enabled, api_key, custom_api_url, custom_model_name, created_at, updated_at) VALUES" >> $IMPORT_SQL
sqlite3 $SQLITE_DB "SELECT '(' || quote(id) || ', ' || quote(user_id) || ', ' || quote(name) || ', ' || quote(provider) || ', ' ||
CASE WHEN enabled = 1 THEN 'true' ELSE 'false' END || ', ' || quote(COALESCE(api_key, '')) || ', ' || quote(COALESCE(custom_api_url, '')) || ', ' ||
quote(COALESCE(custom_model_name, '')) || ', ' || quote(created_at) || ', ' || quote(updated_at) || '),'
FROM ai_models WHERE user_id = 'default';" | sed '$ s/,$//' >> $IMPORT_SQL
echo "ON CONFLICT (id) DO UPDATE SET user_id = EXCLUDED.user_id, name = EXCLUDED.name, provider = EXCLUDED.provider, enabled = EXCLUDED.enabled, api_key = EXCLUDED.api_key, custom_api_url = EXCLUDED.custom_api_url, custom_model_name = EXCLUDED.custom_model_name, updated_at = EXCLUDED.updated_at;" >> $IMPORT_SQL
echo "" >> $IMPORT_SQL
fi
# 导出交易所数据
if [ "$EXCHANGE_COUNT" -gt 0 ]; then
echo "🏢 导出交易所数据..."
echo "-- 交易所数据 ($EXCHANGE_COUNT 条记录)" >> $IMPORT_SQL
echo "INSERT INTO exchanges (id, user_id, name, type, enabled, api_key, secret_key, testnet, hyperliquid_wallet_addr, aster_user, aster_signer, aster_private_key, created_at, updated_at) VALUES" >> $IMPORT_SQL
sqlite3 $SQLITE_DB "SELECT '(' || quote(id) || ', ' || quote(user_id) || ', ' || quote(name) || ', ' || quote(type) || ', ' ||
CASE WHEN enabled = 1 THEN 'true' ELSE 'false' END || ', ' || quote(COALESCE(api_key, '')) || ', ' || quote(COALESCE(secret_key, '')) || ', ' ||
CASE WHEN testnet = 1 THEN 'true' ELSE 'false' END || ', ' || quote(COALESCE(hyperliquid_wallet_addr, '')) || ', ' ||
quote(COALESCE(aster_user, '')) || ', ' || quote(COALESCE(aster_signer, '')) || ', ' || quote(COALESCE(aster_private_key, '')) || ', ' ||
quote(created_at) || ', ' || quote(updated_at) || '),'
FROM exchanges WHERE user_id = 'default';" | sed '$ s/,$//' >> $IMPORT_SQL
echo "ON CONFLICT (id, user_id) DO UPDATE SET name = EXCLUDED.name, type = EXCLUDED.type, enabled = EXCLUDED.enabled, api_key = EXCLUDED.api_key, secret_key = EXCLUDED.secret_key, testnet = EXCLUDED.testnet, hyperliquid_wallet_addr = EXCLUDED.hyperliquid_wallet_addr, aster_user = EXCLUDED.aster_user, aster_signer = EXCLUDED.aster_signer, aster_private_key = EXCLUDED.aster_private_key, updated_at = EXCLUDED.updated_at;" >> $IMPORT_SQL
echo "" >> $IMPORT_SQL
fi
# 添加验证查询
cat >> $IMPORT_SQL << 'EOL'
-- 验证导入结果
SELECT '=== 导入完成验证 ===' as status;
SELECT 'default用户' as item, COUNT(*) as count FROM users WHERE id = 'default'
UNION ALL SELECT 'AI模型', COUNT(*) FROM ai_models WHERE user_id = 'default'
UNION ALL SELECT '交易所', COUNT(*) FROM exchanges WHERE user_id = 'default';
EOL
echo "✅ 生成导入脚本: $IMPORT_SQL"
# 确认执行
echo
echo "⚠️ 准备导入default用户和系统默认数据,包括:"
echo " 1. default用户账户"
echo " 2. $AI_MODEL_COUNT 个AI模型"
echo " 3. $EXCHANGE_COUNT 个交易所"
echo
read -p "确认执行导入? (y/N): " confirm
if [[ $confirm != [yY] ]]; then
echo "️ 已取消导入"
echo "手动执行命令: $DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx -f /tmp/$IMPORT_SQL"
exit 0
fi
# 检查PostgreSQL连接
echo "🔌 检查数据库连接..."
if ! $DOCKER_COMPOSE_CMD exec postgres pg_isready -U nofx > /dev/null 2>&1; then
echo "❌ PostgreSQL连接失败,请确保服务正在运行"
exit 1
fi
# 复制SQL脚本到容器
echo "📦 复制导入脚本到容器..."
POSTGRES_CONTAINER=$($DOCKER_COMPOSE_CMD ps -q postgres)
if [ -z "$POSTGRES_CONTAINER" ]; then
echo "❌ 找不到PostgreSQL容器"
exit 1
fi
docker cp $IMPORT_SQL ${POSTGRES_CONTAINER}:/tmp/$IMPORT_SQL
# 执行导入
echo "🔄 执行数据导入..."
if $DOCKER_COMPOSE_CMD exec postgres psql -U nofx -d nofx --pset pager=off -f /tmp/$IMPORT_SQL; then
echo
echo "✅ default用户和系统默认数据导入成功!"
echo
echo "📋 现在可以访问以下接口:"
echo " - GET /api/supported-models ($AI_MODEL_COUNT 个AI模型)"
echo " - GET /api/supported-exchanges ($EXCHANGE_COUNT 个交易所)"
echo
echo "🧹 清理导入文件..."
rm -f $IMPORT_SQL
$DOCKER_COMPOSE_CMD exec postgres rm -f /tmp/$IMPORT_SQL
else
echo "❌ 数据导入失败"
exit 1
fi
echo "🎉 导入完成!"