Summary: - Successfully deployed complete system to Aliyun SAE (2025-12-25) - All services running: Python microservice + Node.js backend + Frontend Nginx + CLB - Public access available at http://8.140.53.236/ Major Achievements: 1. Python microservice deployed (v1.0, internal IP: 172.17.173.66:8000) 2. Node.js backend deployed (v1.3, internal IP: 172.17.173.73:3001) - Fixed 4 critical issues: bash path, config directory, pino-pretty, ES Module 3. Frontend Nginx deployed (v1.0, internal IP: 172.17.173.72:80) 4. CLB load balancer configured (public IP: 8.140.53.236) New Documentation (9 docs): - 11-Node.js backend SAE deployment config checklist (21 env vars) - 12-Node.js backend SAE deployment operation manual - 13-Node.js backend image fix record (config directory) - 14-Node.js backend pino-pretty fix - 15-Node.js backend deployment success summary - 16-Frontend Nginx deployment success summary - 17-Complete deployment practical manual 2025 edition (1800 lines) - 18-Deployment documentation usage guide - 19-Daily update quick operation manual (670 lines) Key Fixes: - Environment variable name correction: EXTRACTION_SERVICE_URL (not PYTHON_SERVICE_URL) - Dockerfile fix: added COPY config ./config - Logger configuration: conditional pino-pretty for dev only - Health check fix: ES Module compatibility (require -> import) Updated Files: - System status document updated with full deployment info - Deployment progress overview updated with latest IPs - All 3 Docker services' Dockerfiles and configs refined Verification: - All health checks passed - Tool C 7 features working correctly - Literature screening module functional - Response time < 1 second BREAKING CHANGE: Node.js backend internal IP changed from 172.17.173.71 to 172.17.173.73 Closes #deployment-milestone
181 lines
4.8 KiB
JavaScript
181 lines
4.8 KiB
JavaScript
/**
|
||
* 创建 Tool C AI对话历史表
|
||
*
|
||
* 执行方式:node scripts/create-tool-c-ai-history-table.mjs
|
||
*/
|
||
|
||
import { PrismaClient } from '@prisma/client';
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function createAiHistoryTable() {
|
||
console.log('========================================');
|
||
console.log('开始创建 Tool C AI对话历史表');
|
||
console.log('========================================\n');
|
||
|
||
try {
|
||
// 1. 检查表是否已存在
|
||
console.log('[1/4] 检查表是否已存在...');
|
||
const checkResult = await prisma.$queryRawUnsafe(`
|
||
SELECT EXISTS (
|
||
SELECT FROM information_schema.tables
|
||
WHERE table_schema = 'dc_schema'
|
||
AND table_name = 'dc_tool_c_ai_history'
|
||
) as exists
|
||
`);
|
||
|
||
const tableExists = checkResult[0].exists;
|
||
|
||
if (tableExists) {
|
||
console.log('✅ 表已存在: dc_schema.dc_tool_c_ai_history');
|
||
console.log('\n如需重新创建,请手动执行: DROP TABLE dc_schema.dc_tool_c_ai_history CASCADE;\n');
|
||
return;
|
||
}
|
||
|
||
console.log('✅ 表不存在,准备创建\n');
|
||
|
||
// 2. 创建表
|
||
console.log('[2/4] 创建表 dc_tool_c_ai_history...');
|
||
await prisma.$executeRawUnsafe(`
|
||
CREATE TABLE dc_schema.dc_tool_c_ai_history (
|
||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||
session_id VARCHAR(255) NOT NULL,
|
||
user_id VARCHAR(255) NOT NULL,
|
||
role VARCHAR(50) NOT NULL,
|
||
content TEXT NOT NULL,
|
||
|
||
-- Tool C特有字段
|
||
generated_code TEXT,
|
||
code_explanation TEXT,
|
||
execute_status VARCHAR(50),
|
||
execute_result JSONB,
|
||
execute_error TEXT,
|
||
retry_count INTEGER DEFAULT 0,
|
||
|
||
-- LLM相关
|
||
model VARCHAR(100),
|
||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||
)
|
||
`);
|
||
console.log('✅ 表创建成功\n');
|
||
|
||
// 3. 创建索引
|
||
console.log('[3/4] 创建索引...');
|
||
await prisma.$executeRawUnsafe(`
|
||
CREATE INDEX idx_dc_tool_c_ai_history_session_id
|
||
ON dc_schema.dc_tool_c_ai_history(session_id)
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
CREATE INDEX idx_dc_tool_c_ai_history_user_id
|
||
ON dc_schema.dc_tool_c_ai_history(user_id)
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
CREATE INDEX idx_dc_tool_c_ai_history_created_at
|
||
ON dc_schema.dc_tool_c_ai_history(created_at)
|
||
`);
|
||
console.log('✅ 索引创建成功\n');
|
||
|
||
// 4. 添加注释
|
||
console.log('[4/4] 添加表注释...');
|
||
await prisma.$executeRawUnsafe(`
|
||
COMMENT ON TABLE dc_schema.dc_tool_c_ai_history
|
||
IS 'Tool C (科研数据编辑器) AI对话历史表'
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
COMMENT ON COLUMN dc_schema.dc_tool_c_ai_history.session_id
|
||
IS '关联Tool C Session ID'
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
COMMENT ON COLUMN dc_schema.dc_tool_c_ai_history.generated_code
|
||
IS 'AI生成的Pandas代码'
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
COMMENT ON COLUMN dc_schema.dc_tool_c_ai_history.execute_status
|
||
IS '执行状态: pending/success/failed'
|
||
`);
|
||
await prisma.$executeRawUnsafe(`
|
||
COMMENT ON COLUMN dc_schema.dc_tool_c_ai_history.retry_count
|
||
IS '自我修正重试次数'
|
||
`);
|
||
console.log('✅ 注释添加成功\n');
|
||
|
||
// 5. 验证表创建
|
||
console.log('========================================');
|
||
console.log('验证表结构');
|
||
console.log('========================================\n');
|
||
|
||
const columns = await prisma.$queryRawUnsafe(`
|
||
SELECT column_name, data_type, is_nullable
|
||
FROM information_schema.columns
|
||
WHERE table_schema = 'dc_schema'
|
||
AND table_name = 'dc_tool_c_ai_history'
|
||
ORDER BY ordinal_position
|
||
`);
|
||
|
||
console.log('表结构:');
|
||
console.table(columns);
|
||
|
||
const indexes = await prisma.$queryRawUnsafe(`
|
||
SELECT indexname, indexdef
|
||
FROM pg_indexes
|
||
WHERE schemaname = 'dc_schema'
|
||
AND tablename = 'dc_tool_c_ai_history'
|
||
`);
|
||
|
||
console.log('\n索引:');
|
||
console.table(indexes);
|
||
|
||
console.log('\n========================================');
|
||
console.log('🎉 Tool C AI对话历史表创建成功!');
|
||
console.log('========================================\n');
|
||
console.log('表名: dc_schema.dc_tool_c_ai_history');
|
||
console.log(`列数: ${columns.length}`);
|
||
console.log(`索引数: ${indexes.length}\n`);
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ 创建表失败:', error.message);
|
||
console.error('\n详细错误:');
|
||
console.error(error);
|
||
process.exit(1);
|
||
} finally {
|
||
await prisma.$disconnect();
|
||
}
|
||
}
|
||
|
||
// 执行
|
||
createAiHistoryTable()
|
||
.then(() => {
|
||
console.log('脚本执行完成');
|
||
process.exit(0);
|
||
})
|
||
.catch((error) => {
|
||
console.error('脚本执行失败:', error);
|
||
process.exit(1);
|
||
});
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|