UNPKG

geoapify-mcp-server

Version:

Geoapify API MCP Server for location-based services - 一键部署的地理位置服务

208 lines (169 loc) 5.08 kB
#!/usr/bin/env node /** * 部署CLI脚本 */ const { spawn } = require('child_process'); const path = require('path'); const fs = require('fs'); // 颜色输出 const colors = { green: '\x1b[32m', red: '\x1b[31m', yellow: '\x1b[33m', blue: '\x1b[34m', cyan: '\x1b[36m', reset: '\x1b[0m' }; function log(color, message) { console.log(`${colors[color]}${message}${colors.reset}`); } function parseArgs() { const args = process.argv.slice(2); const options = { local: false, docker: false, production: false, port: '50001', verbose: false }; args.forEach(arg => { if (arg === '--local') options.local = true; if (arg === '--docker') options.docker = true; if (arg === '--production') options.production = true; if (arg === '--verbose') options.verbose = true; if (arg.startsWith('--port=')) options.port = arg.split('=')[1]; }); return options; } function runCommand(command, args = [], options = {}) { return new Promise((resolve, reject) => { const child = spawn(command, args, { stdio: 'inherit', cwd: options.cwd || process.cwd(), env: { ...process.env, ...options.env } }); child.on('close', (code) => { if (code === 0) { resolve(); } else { reject(new Error(`Command failed with code ${code}`)); } }); child.on('error', reject); }); } async function checkPrerequisites() { log('blue', '🔍 检查系统环境...'); // 检查Node.js try { await runCommand('node', ['--version']); log('green', '✓ Node.js 已安装'); } catch (error) { log('red', '❌ Node.js 未安装'); throw new Error('请先安装 Node.js 16+'); } // 检查npm try { await runCommand('npm', ['--version']); log('green', '✓ npm 已安装'); } catch (error) { log('red', '❌ npm 未安装'); throw new Error('请先安装 npm'); } } async function installDependencies() { log('blue', '📦 安装依赖...'); // 设置npm镜像源 await runCommand('npm', ['config', 'set', 'registry', 'https://registry.npmmirror.com']); // 安装依赖 await runCommand('npm', ['install', '--production']); log('green', '✓ 依赖安装完成'); } async function setupEnvironment() { log('blue', '⚙️ 配置环境...'); // 创建.env文件 if (!fs.existsSync('.env')) { fs.copyFileSync('.env.example', '.env'); log('green', '✓ 创建 .env 文件'); } // 创建日志目录 if (!fs.existsSync('logs')) { fs.mkdirSync('logs', { recursive: true }); log('green', '✓ 创建日志目录'); } } async function startServer(options) { log('blue', '🚀 启动服务器...'); const env = { NODE_ENV: options.production ? 'production' : 'development', PORT: options.port, GEOAPIFY_API_KEY: '3234bd7e35264a8aa29fc15e89f8f76f', LOG_LEVEL: options.verbose ? 'debug' : 'info' }; await runCommand('node', ['src/server.js'], { env }); } async function deployLocal(options) { log('cyan', '💻 本地部署模式'); await checkPrerequisites(); await installDependencies(); await setupEnvironment(); log('green', '✅ 本地部署完成'); log('yellow', '使用以下命令启动服务:'); log('cyan', ` npx geoapify-mcp-server start --port ${options.port}`); log('cyan', ' 或者:'); log('cyan', ' npm start'); } async function deployDocker(options) { log('cyan', '🐳 Docker部署模式'); // 检查Docker try { await runCommand('docker', ['--version']); log('green', '✓ Docker 已安装'); } catch (error) { throw new Error('请先安装 Docker'); } try { await runCommand('docker-compose', ['--version']); log('green', '✓ Docker Compose 已安装'); } catch (error) { throw new Error('请先安装 Docker Compose'); } // 运行Docker部署脚本 const scriptPath = path.join(__dirname, 'docker-deploy.sh'); if (fs.existsSync(scriptPath)) { await runCommand('bash', [scriptPath, options.production ? 'prod' : 'dev']); } else { // 直接使用docker-compose const composeFile = options.production ? 'docker-compose.prod.yml' : 'docker-compose.yml'; await runCommand('docker-compose', ['-f', composeFile, 'up', '-d']); } log('green', '✅ Docker部署完成'); } async function quickDeploy(options) { log('cyan', '⚡ 快速部署模式'); await checkPrerequisites(); await installDependencies(); await setupEnvironment(); await startServer(options); } async function main() { const options = parseArgs(); log('cyan', '🌍 Geoapify MCP Server 部署工具'); console.log(''); try { if (options.docker) { await deployDocker(options); } else if (options.local) { await deployLocal(options); } else { await quickDeploy(options); } } catch (error) { log('red', `❌ 部署失败: ${error.message}`); process.exit(1); } } if (require.main === module) { main(); } module.exports = { main, deployLocal, deployDocker, quickDeploy };