geoapify-mcp-server
Version:
Geoapify API MCP Server for location-based services - 一键部署的地理位置服务
208 lines (169 loc) • 5.08 kB
JavaScript
/**
* 部署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 };