talk / backend /sql /003_tts_scale_instances.sql
user
Deploy StyleVoiceChat backend
aa9892b
Raw History Blame Contribute Delete
3.31 kB
-- TTS ์Šค์ผ€์ผ์•„์›ƒ ์Šฌ๋กฏ ํ…Œ์ด๋ธ” (Supabase SQL Editor์—์„œ ์‹คํ–‰)
--
-- ์‚ฌ์ „ ๋ฐœ๊ธ‰๋œ Cloudflare ํ„ฐ๋„ ์Šฌ๋กฏ(tts4-tts10) + Vast.ai ์ธ์Šคํ„ด์Šค ๋งคํ•‘.
-- ์šด์˜์ž๊ฐ€ admin ์—์„œ "TTS ์„œ๋ฒ„ ์ถ”๊ฐ€" ๋ˆ„๋ฅด๋ฉด free ์Šฌ๋กฏ 1๊ฐœ ๊ฐ€์ ธ์™€์„œ
-- Vast.ai ์— ์ƒˆ ์ธ์Šคํ„ด์Šค ๋งŒ๋“ค๊ณ , ๊ทธ ์ธ์Šคํ„ด์Šค์— ์Šฌ๋กฏ์˜ cloudflared ์ž๊ฒฉ์ฆ๋ช… ์ฃผ์ž….
CREATE TABLE IF NOT EXISTS public.tts_scale_instances (
-- Cloudflare ํ„ฐ๋„ ์Šฌ๋กฏ (์‚ฌ์ „ ๋ฐœ๊ธ‰, ์ ˆ๋Œ€ ์•ˆ ๋ฐ”๋€œ)
slot_name TEXT PRIMARY KEY, -- 'tts4', 'tts5', ...
hostname TEXT NOT NULL, -- 'tts4.stylevoicetalk.com'
tunnel_id TEXT NOT NULL, -- Cloudflare tunnel UUID
credentials_json JSONB NOT NULL, -- cloudflared credentials (TunnelID/AccountTag/TunnelSecret)
-- Vast.ai ์ธ์Šคํ„ด์Šค ๋งคํ•‘ (ํ• ๋‹น ์‹œ ์ฑ„์›Œ์ง)
vast_instance_id BIGINT, -- ํ• ๋‹น๋œ Vast ์ธ์Šคํ„ด์Šค ID (NULL = free)
vast_offer_id BIGINT, -- ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ID (์ฐธ์กฐ์šฉ)
vast_dph DECIMAL(8,5), -- $/hour ๋น„์šฉ
-- ์ƒํƒœ ์ถ”์ 
-- '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, -- warm pool ๋ฉค๋ฒ„์ธ์ง€ (stopped ์ƒํƒœ๋กœ ์œ ์ง€)
assigned_at TIMESTAMPTZ, -- Vast ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ์‹œ๊ฐ
became_ready_at TIMESTAMPTZ, -- /health 200 ๋„๋‹ฌ ์‹œ๊ฐ
released_at TIMESTAMPTZ, -- destroy ์™„๋ฃŒ ์‹œ๊ฐ
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- ๋นˆ ์Šฌ๋กฏ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ
CREATE INDEX IF NOT EXISTS idx_tts_scale_status ON public.tts_scale_instances(status)
WHERE status IN ('free', 'warm_stopped');
-- updated_at ์ž๋™ ๊ฐฑ์‹  ํŠธ๋ฆฌ๊ฑฐ
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();
-- RLS: service_role ๋งŒ ์ ‘๊ทผ (๊ด€๋ฆฌ์ž ์ „์šฉ ํ…Œ์ด๋ธ”)
ALTER TABLE public.tts_scale_instances ENABLE ROW LEVEL SECURITY;
-- (์ •์ฑ… ์ถ”๊ฐ€ ์•ˆ ํ•จ โ€” service_role ์€ RLS ์šฐํšŒ. ์ผ๋ฐ˜ user ์ ‘๊ทผ 0)
-- ์šด์˜์ž ์„ค์ •๊ฐ’ (warm pool toggle ๋“ฑ) โ€” ๋‹จ์ผ row ์˜ key/value
CREATE TABLE IF NOT EXISTS public.system_settings (
key TEXT PRIMARY KEY,
value JSONB NOT NULL,
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- ๊ธฐ๋ณธ๊ฐ’ โ€” warm pool ๋น„ํ™œ์„ฑ, max_instances=8 (cap)
INSERT INTO public.system_settings(key, value) VALUES
('tts_scale_warm_pool_enabled', 'false'::jsonb),
('tts_scale_max_instances', '8'::jsonb)
ON CONFLICT (key) DO NOTHING;
ALTER TABLE public.system_settings ENABLE ROW LEVEL SECURITY;