Phase 3 ํ์. ์ฌ์ฉ์ ๋ช ๋ น(์์๊ด๋ฆฌ์) ๊ธฐ๋ฐ 10 ํ๋ณด ์ค 6๊ฐ ์์จ ์งํ (Cloudflare DNS / ์นด์นด์คยทWeChatยทLINE ๊ณต์ ์ฑ๋ / Case Study ํ์ ๋์ / Plausible/GA4 ๊ณ์ / MN ๋ฒ์ญ์ ์ฌ์ฉ์ ์ก์ ). 7 task ๋ชจ๋ PASS โ ์๋ ๋ต์ฅ ์ฝ๋ / Discord ๋ถ๊ธฐ / Web Vitals ์ธก์ / Service Worker / A/B variant ์ค ์ฝํ ์ธ + E2E ๊ฒ์ฆ.
| ํญ๋ชฉ | ๊ฒฐ๊ณผ |
|---|---|
| Inquiry ์๋ ๋ต์ฅ | nodemailer ์ค์น + STARIUM_SMTP_* env ์ถ๊ฐ + locale๋ณ ko/zh/en ํ ํ๋ฆฟ + auto_reply_sent_at ๊ธฐ๋ก. ํ ์๊ฒฉ์ฆ๋ช invalid (Gmail App Password ์ฌ์ฉ์ ์ก์ ํ์) โ ์ฝ๋๋ ํ์ฑ, valid ์๊ฒฉ์ฆ๋ช ์ ๋ ฅ ์ ์ฆ์ ์๋ |
| Discord webhook ๋ถ๊ธฐ | DISCORD_WEBHOOK_URL env ๋ณด์ (hermes phase 5 ์์กด) โ inquiry POST ํ ์๋ ๋ฐ์ก |
| Core Web Vitals | LCP / FCP / CLS / INP 4๊ฐ ์ธก์ (์์ฒด PerformanceObserver) โ /api/event web_vital ์๋ ์์ง |
| Service Worker | /starium-global/sw.js (2.1KB, stale-while-revalidate HTML + cache-first ์ด๋ฏธ์ง/CSS) + manifest.json + Service-Worker-Allowed header |
| A/B variant ์ค ์ฝํ ์ธ | hero_cta_v1 ์คํ ์๋ ์์: visitor_id (localStorage) + sessionStorage ์บ์ + variant B = bg-rose-500 (vs ๊ธฐ์กด bg-slate-900) + data-track-cta ์๋ ์ฒจ๋ถ |
| sitemap | 48 URLs ์ ์ง |
| ํ์ด์ง ์ดํฉ | 53 (Phase 3 ๋๋น ๋ณํ ์์, ๊ธฐ๋ฅ ์ถ๊ฐ๋ง) |
| ํธ๋ ์ด๋ฉ / ์๋น์ค | ๋ชจ๋ active |
A-1 Inquiry ์๋ ๋ต์ฅ:
/etc/star365-worker.env์ STARIUM_SMTP_* ์ ๋์ฌ๋ก ๋ณต์ฌnpm i nodemailer (paperclip)/starium-global/api/inquiry ๋์ nodemailer.createTransport.sendMail + locale๋ณ ko/zh/en ํ
ํ๋ฆฟ + UPDATE auto_reply_sent_atInvalid login: 534-5.7.9 Please log in with your web browser โ Gmail ์ผ๋ฐ ๋น๋ฐ๋ฒํธ โ App Password ํ์. ์ฝ๋๋ ํ์ฑ, ์ฌ์ฉ์๊ฐ valid SMTP ์๊ฒฉ์ฆ๋ช
์
๋ ฅ ์ ์ฆ์ ์๋A-2 Discord webhook ๋ถ๊ธฐ:
DISCORD_WEBHOOK_URL ์ด๋ฏธ /etc/star365-worker.env์ ์กด์ฌ (hermes phase 5 ์์กด)๐จ Starium Global ์ ๊ท ๋ฌธ์ #{id} {locale_flag} + type/name/email/phone/messageA-3 Core Web Vitals:
PerformanceObserver (web-vitals ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฏธ์ฌ์ฉ โ ์ธ๋ถ ์์กด์ฑ 0)/api/event web_vital ์ด๋ฒคํธ๋ก ์๋ ์์ง โ starium_global_events ํ
์ด๋ธA-4 Service Worker (PWA):
/starium-global/sw.js 2.1 KB/starium-global + tw.min.css.webp/.avif/.jpg/.png/.svg/.css/.woff2CACHE_LIMIT=60)/starium-global (root scope ๋ถ์ฌ)STARIUM_AB(experiment_key) ํจ์ ๋
ธ์ถ โ /api/ab-assign ์๋ ํธ์ถ + sessionStorage ์บ์window.STARIUM_VARIANT = {experiment, variant} ์๋ ์ค์ STARIUM_TRACK ์๋์ผ๋ก meta์ variant ์ฒจ๋ถ (/api/event)bg-slate-900 (๊ธฐ์กด)bg-rose-500 (๊ฐ์กฐ ์์)data-track-cta="hero_cta_v1_{A|B}" ์๋ ์ถ๊ฐ โ click ์ถ์ /starium-global/sw.js (Service Worker 2.1 KB)/starium-global/manifest.json (PWA manifest)/tmp/sg-build/sg-client-v2.js (ํตํฉ ํด๋ผ์ด์ธํธ ์คํฌ๋ฆฝํธ โ ์ถ์ + Web Vitals + SW register + A/B)/opt/star365-ceo/server.mjs: +sw.js / manifest ๋ผ์ฐํธ + inquiry POST ์๋ ๋ต์ฅ + Discord webhook ๋ถ๊ธฐ (~80 LOC)/etc/star365-worker.env: +STARIUM_SMTP_HOST/PORT/USER/PASSWORD (gunja SMTP์์ ๋ณต์ฌ)/opt/star365-ceo/node_modules/nodemailer ์ ๊ท dep/starium-global๋ก ์ ํ (๋ค๋ฅธ path ์ํฅ 0)# Gmail App Password (https://myaccount.google.com/apppasswords) ๋๋ SendGrid ๊ฐ์
# /etc/star365-worker.env ํธ์ง:
sudo nano /etc/star365-worker.env
# STARIUM_SMTP_PASSWORD=<App Password 16 char> ๊ฐฑ์ ํ
sudo systemctl restart star365-ceo
CEO_KEY=$(cat /root/.ceo_access_key)
psql "postgres://paperclip:REDACTED-20260611@localhost:5432/star365_hub" -c "
SELECT meta->>'name' AS metric, meta->>'rating' AS rating, COUNT(*),
AVG((meta->>'value')::int) AS avg_ms, percentile_disc(0.75) WITHIN GROUP (ORDER BY (meta->>'value')::int) AS p75
FROM starium_global_events
WHERE event_type='web_vital' AND created_at > NOW() - INTERVAL '7 days'
GROUP BY 1,2 ORDER BY 1,2"
CEO_KEY=$(cat /root/.ceo_access_key)
curl -sk -H "X-CEO-Key: $CEO_KEY" "https://ceo.star365.site/api/starium-global/ab-results?experiment_key=hero_cta_v1"
/opt/star365-hq/docs/04-report/starium-global-phase4-20260509.md (ํ ํ์ผ)starium-global-phase4-20260509.md