const { Client } = require('ssh2'); const fs = require('fs'); const path = require('path'); const config = { host: 'hs.yifenbao.cn', port: 22, username: 'root', password: 'Torch1112' }; const conn = new Client(); const h5Dir = './dist/build/h5'; function collectFiles(dir, prefix = '') { const files = []; const items = fs.readdirSync(dir); for (const item of items) { const fullPath = path.join(dir, item); const stats = fs.statSync(fullPath); const relPath = prefix ? path.join(prefix, item) : item; if (stats.isDirectory()) { files.push(...collectFiles(fullPath, relPath)); } else { files.push({ local: fullPath, remote: `/www/huishou/dist/build/h5/${relPath}` }); } } return files; } conn.on('ready', async () => { console.log('SSH连接成功'); try { const files = collectFiles(h5Dir); console.log(`\n=== 准备上传 ${files.length} 个文件 ===`); conn.sftp(async (err, sftp) => { if (err) { console.error('SFTP错误:', err.message); conn.end(); return; } for (const file of files) { await new Promise((resolve) => { const dir = path.dirname(file.remote); sftp.mkdir(dir, { recursive: true }, () => { const readStream = fs.createReadStream(file.local); const writeStream = sftp.createWriteStream(file.remote); writeStream.on('close', () => { console.log(`✓ ${file.local}`); resolve(); }); writeStream.on('error', () => { console.log(`✗ ${file.local}`); resolve(); }); readStream.pipe(writeStream); }); }); } console.log('\n=== 文件上传完成 ==='); await new Promise((resolve) => { conn.exec('docker cp /www/huishou/dist/build/h5/. huishou:/usr/share/nginx/html/h5/', (err, stream) => { if (err) { console.error('docker cp错误:', err.message); resolve(); return; } stream.on('close', () => { console.log('✓ 文件已复制到容器'); resolve(); }); }); }); await new Promise((resolve) => { conn.exec('curl -s http://localhost:4001/h5/ | head -20', (err, stream) => { if (err) { console.error('测试访问错误:', err.message); resolve(); return; } stream.stdout.on('data', (data) => process.stdout.write(data)); stream.on('close', () => { console.log('\n=== H5访问测试完成 ==='); resolve(); }); }); }); conn.end(); }); } catch (error) { console.error('部署失败:', error.message); conn.end(); } }); conn.on('error', (err) => { console.error('SSH连接错误:', err.message); }); conn.connect(config);