File size: 3,313 Bytes
aa9892b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
-- 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;