-- TTS 스케일아웃 v2: 인스턴스(docker) 단위 + 인스턴스 안에 3 워커(cloudflare 터널) 묶음. -- v1 (003) 의 slot_name 1:1 hostname 모델은 폐기. 메인 인스턴스가 docker 1대에 TTS -- 3 프로세스 띄우는 패턴과 일치시키기 위함. -- -- 사전 발급된 cloudflare 터널 7 인스턴스 × 3 워커 = 21개 (Phase 6). -- naming: tts4-1/2/3, tts5-1/2/3, ..., tts10-1/2/3 -- -- 실행 순서 (한 번): -- 1) 이 SQL (DROP + CREATE) -- 2) /tmp/seed-tts-instances-v2.sql (자격증명 21개 INSERT) DROP TABLE IF EXISTS public.tts_scale_instances CASCADE; CREATE TABLE public.tts_scale_instances ( -- 인스턴스 식별 (docker 1대 단위) instance_name TEXT PRIMARY KEY, -- 'tts4', 'tts5', ..., 'tts10' -- 인스턴스 내부 3 워커 (cloudflare 터널 + 포트). 예시: -- [ -- {"hostname": "tts4-1.stylevoicetalk.com", "tunnel_id": "uuid", "credentials_json": {...}, "port": 7860}, -- {"hostname": "tts4-2.stylevoicetalk.com", "tunnel_id": "uuid", "credentials_json": {...}, "port": 7861}, -- {"hostname": "tts4-3.stylevoicetalk.com", "tunnel_id": "uuid", "credentials_json": {...}, "port": 7862} -- ] workers JSONB NOT NULL, -- Vast.ai 인스턴스 매핑 (할당 시 채워짐) vast_instance_id BIGINT, vast_offer_id BIGINT, vast_dph DECIMAL(8,5), -- 상태 (인스턴스 단위) -- 'free' / 'creating' / 'pulling' / 'starting' / 'ready' / 'warm_stopped' / 'destroying' / 'failed' status TEXT NOT NULL DEFAULT 'free', status_detail TEXT, is_warm BOOLEAN NOT NULL DEFAULT false, assigned_at TIMESTAMPTZ, became_ready_at TIMESTAMPTZ, released_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_tts_scale_status_v2 ON public.tts_scale_instances(status) WHERE status IN ('free', 'warm_stopped'); CREATE OR REPLACE FUNCTION public.set_updated_at_tts_scale() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS trg_tts_scale_updated_at ON public.tts_scale_instances; CREATE TRIGGER trg_tts_scale_updated_at BEFORE UPDATE ON public.tts_scale_instances FOR EACH ROW EXECUTE FUNCTION public.set_updated_at_tts_scale(); ALTER TABLE public.tts_scale_instances ENABLE ROW LEVEL SECURITY; -- (정책 없음 — service_role 만 접근) -- system_settings 는 v1 그대로 사용 (warm_pool_enabled / max_instances). -- 단, v2 에서는 max_instances 가 docker 인스턴스 개수 (워커 개수가 아님). -- 7 슬롯 = 최대 7 인스턴스 = 21 워커. INSERT INTO public.system_settings(key, value) VALUES ('tts_scale_warm_pool_enabled', 'false'::jsonb), ('tts_scale_max_instances', '7'::jsonb) ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;