refactor: migrate server provisioning to Cloud Orchestrator service

- Remove Queue-based server provisioning (moved to cloud-orchestrator)
- Add manage_server tool with Service Binding to Cloud Orchestrator
- Add CDN cache hit rate estimation based on tech_stack
- Always display bandwidth info (show "포함 범위 내" when no overage)
- Add language auto-detection (ko, ja, zh, en)
- Update system prompt to always call tools fresh
- Add Server System documentation to CLAUDE.md

BREAKING: Server provisioning now requires cloud-orchestrator service

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-01-26 12:26:21 +09:00
parent 5413605347
commit 87c92e1ed1
27 changed files with 695 additions and 4584 deletions

View File

@@ -1,52 +0,0 @@
-- Migration 003: Add server management tables
-- Purpose: Cloud server order tracking
-- Date: 2026-01-23
-- Reference: CLAUDE.md "Server Management System"
--
-- Background:
-- Telegram 봇을 통해 클라우드 서버 주문 내역을 기록하고 관리합니다.
-- 예치금 시스템과 통합하여 자동 결제를 지원합니다.
-- 서버 사양(cloud_providers, instance_specs)은 별도 외부 시스템에서 관리합니다.
-- Step 1: Create server_orders table (order lifecycle tracking)
CREATE TABLE IF NOT EXISTS server_orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
spec_id INTEGER NOT NULL,
status TEXT NOT NULL DEFAULT 'pending' CHECK(status IN ('pending', 'provisioning', 'active', 'failed', 'cancelled', 'terminated')),
region TEXT NOT NULL,
provider_instance_id TEXT,
ip_address TEXT,
root_password TEXT,
price_paid INTEGER NOT NULL,
error_message TEXT,
provisioned_at DATETIME,
terminated_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Step 2: Create user_servers table (ownership mapping)
CREATE TABLE IF NOT EXISTS user_servers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
order_id INTEGER UNIQUE NOT NULL,
provider_id INTEGER NOT NULL,
label TEXT,
verified INTEGER DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (order_id) REFERENCES server_orders(id)
);
-- Step 3: Create indexes for efficient queries
CREATE INDEX IF NOT EXISTS idx_server_orders_user ON server_orders(user_id);
CREATE INDEX IF NOT EXISTS idx_server_orders_status ON server_orders(status, created_at DESC);
CREATE INDEX IF NOT EXISTS idx_user_servers_user ON user_servers(user_id);
CREATE INDEX IF NOT EXISTS idx_user_servers_provider ON user_servers(provider_id);
-- Verification Queries (주석으로 제공)
-- SELECT * FROM server_orders WHERE user_id = 1 ORDER BY created_at DESC;
-- SELECT * FROM user_servers WHERE user_id = 1;

View File

@@ -1,97 +0,0 @@
-- CLOUD_DB Schema for local development
-- Auto-generated from production
CREATE TABLE IF NOT EXISTS providers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL UNIQUE,
display_name TEXT NOT NULL,
api_base_url TEXT,
last_sync_at TEXT,
sync_status TEXT NOT NULL DEFAULT 'pending' CHECK (sync_status IN ('pending', 'syncing', 'success', 'error')),
sync_error TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS regions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
provider_id INTEGER NOT NULL,
region_code TEXT NOT NULL,
region_name TEXT NOT NULL,
country_code TEXT,
latitude REAL,
longitude REAL,
available INTEGER NOT NULL DEFAULT 1,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (provider_id) REFERENCES providers(id) ON DELETE CASCADE,
UNIQUE(provider_id, region_code)
);
CREATE TABLE IF NOT EXISTS instance_types (
id INTEGER PRIMARY KEY AUTOINCREMENT,
provider_id INTEGER NOT NULL,
instance_id TEXT NOT NULL,
instance_name TEXT NOT NULL,
vcpu INTEGER NOT NULL,
memory_mb INTEGER NOT NULL,
storage_gb INTEGER NOT NULL,
transfer_tb REAL,
network_speed_gbps REAL,
gpu_count INTEGER DEFAULT 0,
gpu_type TEXT,
instance_family TEXT CHECK (instance_family IN ('general', 'compute', 'memory', 'storage', 'gpu')),
metadata TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
FOREIGN KEY (provider_id) REFERENCES providers(id) ON DELETE CASCADE,
UNIQUE(provider_id, instance_id)
);
CREATE TABLE IF NOT EXISTS pricing (
id INTEGER PRIMARY KEY AUTOINCREMENT,
instance_type_id INTEGER NOT NULL,
region_id INTEGER NOT NULL,
hourly_price REAL NOT NULL,
monthly_price REAL NOT NULL,
currency TEXT NOT NULL DEFAULT 'USD',
available INTEGER NOT NULL DEFAULT 1,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
hourly_price_krw REAL,
monthly_price_krw REAL,
hourly_price_retail REAL,
monthly_price_retail REAL,
FOREIGN KEY (instance_type_id) REFERENCES instance_types(id) ON DELETE CASCADE,
FOREIGN KEY (region_id) REFERENCES regions(id) ON DELETE CASCADE,
UNIQUE(instance_type_id, region_id)
);
-- Seed test data
INSERT OR IGNORE INTO providers (id, name, display_name, api_base_url, sync_status) VALUES
(1, 'linode', 'Linode (Akamai)', 'https://api.linode.com/v4', 'success'),
(2, 'vultr', 'Vultr', 'https://api.vultr.com/v2', 'success');
INSERT OR IGNORE INTO regions (id, provider_id, region_code, region_name, country_code, available) VALUES
(1, 1, 'ap-northeast', 'Tokyo 2, JP', 'JP', 1),
(2, 1, 'ap-south', 'Singapore, SG', 'SG', 1),
(3, 2, 'nrt', 'Tokyo', 'JP', 1),
(4, 2, 'sgp', 'Singapore', 'SG', 1);
INSERT OR IGNORE INTO instance_types (id, provider_id, instance_id, instance_name, vcpu, memory_mb, storage_gb, transfer_tb, instance_family) VALUES
(1, 1, 'g6-nanode-1', 'Nanode 1GB', 1, 1024, 25, 1, 'general'),
(2, 1, 'g6-standard-1', 'Linode 2GB', 1, 2048, 50, 2, 'general'),
(3, 1, 'g6-standard-2', 'Linode 4GB', 2, 4096, 80, 4, 'general'),
(4, 2, 'vc2-1c-1gb', 'Cloud Compute 1GB', 1, 1024, 25, 1, 'general'),
(5, 2, 'vc2-1c-2gb', 'Cloud Compute 2GB', 1, 2048, 55, 2, 'general'),
(6, 2, 'vc2-2c-4gb', 'Cloud Compute 4GB', 2, 4096, 80, 3, 'general');
INSERT OR IGNORE INTO pricing (id, instance_type_id, region_id, hourly_price, monthly_price, monthly_price_krw, available) VALUES
(1, 1, 1, 0.0075, 5.0, 7500, 1),
(2, 2, 1, 0.018, 12.0, 18000, 1),
(3, 3, 1, 0.036, 24.0, 36000, 1),
(4, 1, 2, 0.0075, 5.0, 7500, 1),
(5, 4, 3, 0.007, 5.0, 7500, 1),
(6, 5, 3, 0.015, 10.0, 15000, 1),
(7, 6, 3, 0.03, 20.0, 30000, 1),
(8, 4, 4, 0.007, 5.0, 7500, 1);