Ver Fonte

Phase C: rebrand to antooza.com / user-facing brand gaemi-tooza

- Domains -> antooza.com, site name/logo/footer/manifest -> gaemi-tooza (Korean)
- Jenkins secret IDs, WinSW antooza-frontend, localStorage/BroadcastChannel keys antooza-*
- npm run build green

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
KIM-JINO5 há 3 semanas atrás
pai
commit
41d49cc3c8

+ 4 - 4
CLAUDE.md

@@ -2,7 +2,7 @@
 
 ## Project Overview
 
-DPOT - Next.js 15 App Router 기반 Creators Support and donate platform frontend (https://dpot.web.or.kr)
+ANTOOZA(개미투자) - Next.js 15 App Router 기반 커머스·커뮤니티 플랫폼 frontend (https://antooza.com)
 
 - **Framework**: Next.js 15.3+ (App Router, Server Components)
 - **React**: 19.1+
@@ -177,6 +177,6 @@ npm run lint
 ```
 
 ## 사용 Domain
-- https://dpot.web.or.kr -> 사용자 단 사용 URL
-- https://admin.dpot.web.or.kr  -> 관리자 단 사용 URL
-- https://api.dpot.web.or.kr -> 사용자 단 통신 API URL
+- https://antooza.com -> 사용자 단 사용 URL
+- https://admin.antooza.com  -> 관리자 단 사용 URL
+- https://api.antooza.com -> 사용자 단 통신 API URL

+ 10 - 10
Jenkinsfile

@@ -1,11 +1,11 @@
 // =====================================================================
-// DPOT Frontend Jenkinsfile (Next.js 15 standalone + WinSW + IIS reverse proxy)
+// ANTOOZA Frontend Jenkinsfile (Next.js 15 standalone + WinSW + IIS reverse proxy)
 //   - Branches:        main / dev  -> deploy
 //                      others      -> build/test only
 //   - Agent:           CTL-Window-Server (Node v24)
-//   - Deploy path:     F:\IIS\DPOT\Front
-//   - Process:         WinSW service 'dpot-frontend' (node server.js on :3000)
-//   - IIS:             DPOT-Front site reverse-proxies HTTPS:443 -> 127.0.0.1:3000
+//   - Deploy path:     F:\IIS\ANTOOZA\Front
+//   - Process:         WinSW service 'antooza-frontend' (node server.js on :3000)
+//   - IIS:             ANTOOZA-Front site reverse-proxies HTTPS:443 -> 127.0.0.1:3000
 // =====================================================================
 
 pipeline {
@@ -18,9 +18,9 @@ pipeline {
   }
 
   environment {
-    DEPLOY_ROOT = 'F:\\IIS\\DPOT\\Front'
-    RELEASES    = 'F:\\IIS\\DPOT\\_releases'
-    SVC_NAME    = 'dpot-frontend'
+    DEPLOY_ROOT = 'F:\\IIS\\ANTOOZA\\Front'
+    RELEASES    = 'F:\\IIS\\ANTOOZA\\_releases'
+    SVC_NAME    = 'antooza-frontend'
   }
 
   stages {
@@ -49,10 +49,10 @@ pipeline {
       steps {
         script {
           // Backend 패턴과 동일: 브랜치별로 Jenkins Secret File 주입
-          //   dev  → DEV-DPOT-FRONTEND-ENV  (dev-api.dpot.live)
-          //   main → PROD-DPOT-FRONTEND-ENV (api.dpot.live)
+          //   dev  → DEV-ANTOOZA-FRONTEND-ENV  (dev-api.antooza.com)
+          //   main → PROD-ANTOOZA-FRONTEND-ENV (api.antooza.com)
           // .env.production 은 .gitignore 됨 (Backend 의 appsettings.Production.json 처럼 빌드 시점에만 존재).
-          def credId = (env.BRANCH_NAME == 'main') ? 'PROD-DPOT-FRONTEND-ENV' : 'DEV-DPOT-FRONTEND-ENV'
+          def credId = (env.BRANCH_NAME == 'main') ? 'PROD-ANTOOZA-FRONTEND-ENV' : 'DEV-ANTOOZA-FRONTEND-ENV'
           echo "[env] Using Jenkins Secret File: ${credId}"
           withCredentials([file(credentialsId: credId, variable: 'CFG')]) {
             bat 'chcp 65001 >NUL && copy /Y "%CFG%" .env.production >NUL && for %%I in (.env.production) do @echo [env] .env.production injected (%%~zI bytes)'

+ 6 - 6
Jenkinsfile.prod

@@ -1,10 +1,10 @@
 // =====================================================================
-// DPOT Frontend Jenkinsfile (PROD)
+// ANTOOZA Frontend Jenkinsfile (PROD)
 //   - Branches:        main only (dev 는 Frontend/Jenkinsfile 사용)
 //   - Agent:           PROD-Window-Server (Node v24)
 //   - Deploy path:     C:\workspace\IIS\Front
-//   - Process:         WinSW service 'dpot-frontend' (node server.js on :3000)
-//   - IIS:             DPOT-Front site reverse-proxies HTTPS:443 -> 127.0.0.1:3000
+//   - Process:         WinSW service 'antooza-frontend' (node server.js on :3000)
+//   - IIS:             ANTOOZA-Front site reverse-proxies HTTPS:443 -> 127.0.0.1:3000
 // =====================================================================
 
 pipeline {
@@ -19,7 +19,7 @@ pipeline {
   environment {
     DEPLOY_ROOT = 'C:\\workspace\\IIS\\Front'
     RELEASES    = 'C:\\workspace\\IIS\\_releases'
-    SVC_NAME    = 'dpot-frontend'
+    SVC_NAME    = 'antooza-frontend'
   }
 
   stages {
@@ -44,8 +44,8 @@ pipeline {
     stage('Inject Env (Secret File)') {
       steps {
         script {
-          // PROD 전용 — 항상 PROD-DPOT-FRONTEND-ENV 사용
-          def credId = 'PROD-DPOT-FRONTEND-ENV'
+          // PROD 전용 — 항상 PROD-ANTOOZA-FRONTEND-ENV 사용
+          def credId = 'PROD-ANTOOZA-FRONTEND-ENV'
           echo "[env] Using Jenkins Secret File: ${credId}"
           withCredentials([file(credentialsId: credId, variable: 'CFG')]) {
             bat 'chcp 65001 >NUL && copy /Y "%CFG%" .env.production >NUL && for %%I in (.env.production) do @echo [env] .env.production injected (%%~zI bytes)'

+ 2 - 2
app/(auth)/layout.tsx

@@ -25,7 +25,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
     return (
         <div className="grid grid-rows-[1fr_20px] items-center justify-items-center min-h-screen p-4 sm:p-20 font-[family-name:var(--font-geist-sans)]">
             <div className="flex flex-col items-center gap-10">
-                <Link href="/" className="auth-logo inline-block" aria-label="DPOT 홈">
+                <Link href="/" className="auth-logo inline-block" aria-label="개미투자 홈">
                     <Logo size="lg" />
                 </Link>
                 <GoogleOAuthProvider clientId={config?.external?.googleClientId ?? ''} nonce="" locale="ko">
@@ -34,7 +34,7 @@ export default function Layout({ children }: { children: React.ReactNode }) {
             </div>
             <address>
                 <hr />
-                <small>© 2025 DPOT. All rights reserved.</small>
+                <small>© 2025 개미투자. All rights reserved.</small>
             </address>
         </div>
     );

+ 5 - 5
app/(main)/(account)/sns-link/page.tsx

@@ -17,7 +17,7 @@ import {
 	DialogTitle
 } from '@/components/ui/dialog';
 
-const STATE_STORAGE_KEY = 'dpot-sns-google-state';
+const STATE_STORAGE_KEY = 'antooza-sns-google-state';
 const GOOGLE_AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth';
 const GOOGLE_SCOPES = 'openid email profile';
 
@@ -29,7 +29,7 @@ type ProviderMeta = {
 };
 
 const PROVIDERS: ProviderMeta[] = [
-	{ provider: 'Google', label: 'Google', description: 'Google 계정으로 dpot 에 빠르게 로그인할 수 있어요.', enabled: true },
+	{ provider: 'Google', label: 'Google', description: 'Google 계정으로 개미투자에 빠르게 로그인할 수 있어요.', enabled: true },
 	{ provider: 'Naver', label: 'Naver', description: '준비중입니다.', enabled: false },
 	{ provider: 'Kakao', label: 'Kakao', description: '준비중입니다.', enabled: false }
 ];
@@ -143,7 +143,7 @@ export default function SnsLinkPage()
 				if (res.data?.revoked) {
 					setStatusMessage(`${item.provider} 연동이 해제되었습니다.`);
 				} else {
-					setStatusMessage(`${item.provider} 연동을 해제했지만 Google 측 권한 회수 호출이 실패했습니다. 안전하게 하려면 Google 계정 설정의 "보안 → 타사 앱 액세스" 에서도 dpot 권한을 직접 제거해주세요.`);
+					setStatusMessage(`${item.provider} 연동을 해제했지만 Google 측 권한 회수 호출이 실패했습니다. 안전하게 하려면 Google 계정 설정의 "보안 → 타사 앱 액세스" 에서도 개미투자 권한을 직접 제거해주세요.`);
 				}
 				await loadItems();
 			} else {
@@ -180,7 +180,7 @@ export default function SnsLinkPage()
 		<div id="sns-link">
 			<h1>SNS 연결 관리</h1>
 			<p className="sns-link__intro">
-				외부 SNS 계정과 dpot 을 연결하면 빠른 로그인이 가능해집니다.
+				외부 SNS 계정과 개미투자를 연결하면 빠른 로그인이 가능해집니다.
 			</p>
 
 			{statusMessage && (
@@ -252,7 +252,7 @@ export default function SnsLinkPage()
 				<DialogHeader>
 					<DialogTitle>{confirmTarget?.provider} 연동을 해제할까요?</DialogTitle>
 					<DialogDescription>
-						해제하면 dpot 에 저장된 OAuth 토큰이 삭제되고 Google 측 권한도 회수됩니다.
+						해제하면 개미투자에 저장된 OAuth 토큰이 삭제되고 Google 측 권한도 회수됩니다.
 						언제든 다시 연동할 수 있습니다.
 					</DialogDescription>
 				</DialogHeader>

+ 3 - 3
app/(main)/docs/[code]/page.tsx

@@ -11,7 +11,7 @@ export async function generateMetadata({ params }: { params: Promise<{ code: str
 
 	if (!result.success || !result.data) {
 		return {
-			title: '문서를 찾을 수 없음 - DPOT'
+			title: '문서를 찾을 수 없음 - 개미투자'
 		};
 	}
 
@@ -19,10 +19,10 @@ export async function generateMetadata({ params }: { params: Promise<{ code: str
 	const plainText = doc.content
 		? doc.content.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim().slice(0, 160)
 		: doc.subject;
-	const canonicalUrl = `https://dpot.live/docs/${doc.code}`;
+	const canonicalUrl = `https://antooza.com/docs/${doc.code}`;
 
 	return {
-		title: `${doc.subject} - DPOT`,
+		title: `${doc.subject} - 개미투자`,
 		description: plainText,
 		alternates: { canonical: canonicalUrl },
 		robots: { index: true, follow: true },

+ 1 - 1
app/(main)/store/[id]/page.tsx

@@ -19,7 +19,7 @@ import type {
 } from '@/types/store';
 
 /** 최근 후원 채널 localStorage MRU. 최신 사용 순(newest first), 최대 5개. */
-const RECENT_KEY = 'dpot:recent-donation-channels';
+const RECENT_KEY = 'antooza:recent-donation-channels';
 const RECENT_MAX = 5;
 
 function loadRecent(): ChannelSearchRow[]

+ 1 - 1
app/(main)/watch/[identifier]/ChatSidebar.tsx

@@ -1,7 +1,7 @@
 'use client';
 
 /**
- * [DEPRECATED — 2026-04-26] dpot SignalR 채팅 사이드바
+ * [DEPRECATED — 2026-04-26] antooza SignalR 채팅 사이드바
  *
  * Watch 페이지에선 YouTube Live Chat iframe 으로 대체되어 사용 중지.
  * 코드는 quota 승인 후 재활성화를 위해 보존.

+ 2 - 2
app/(main)/watch/[identifier]/WatchView.tsx

@@ -10,7 +10,7 @@ import FollowButton from '@/app/component/FollowButton';
 import Link from 'next/link';
 import './style.scss';
 
-// [DEPRECATED] dpot SignalR 채팅 — YouTube Live Chat iframe 으로 대체.
+// [DEPRECATED] antooza SignalR 채팅 — YouTube Live Chat iframe 으로 대체.
 // quota 승인 후 재활성화 예정. 자세한 작업 목록: memory/plan_dpot_chat_reactivate_after_quota.md
 // import ChatSidebar from './ChatSidebar';
 
@@ -194,7 +194,7 @@ export default function WatchView({ channel }: Props)
 					videoId={isLive ? videoId : null}
 				/>
 				{/*
-				 * [DEPRECATED] dpot SignalR 채팅 — YouTube iframe 으로 대체.
+				 * [DEPRECATED] antooza SignalR 채팅 — YouTube iframe 으로 대체.
 				 * quota 승인 후 재활성화 예정.
 				 * <ChatSidebar channelSID={channel.channelSID} />
 				 */}

+ 1 - 1
app/(main)/watch/[identifier]/YouTubeChatIframe.tsx

@@ -15,7 +15,7 @@ type Props = {
  * - 라이브 중일 때만 정상 표시 (videoId 가 있어야 함)
  * - 비라이브 또는 환경변수 미설정 시 fallback UI
  *
- * Quota 비용: 0 — YouTube 자체 인프라 사용, dpot 의 quota 소비 없음.
+ * Quota 비용: 0 — YouTube 자체 인프라 사용, antooza 의 quota 소비 없음.
  */
 export default function YouTubeChatIframe({ videoId }: Props)
 {

+ 1 - 1
app/api/uploads/[...path]/route.ts

@@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from 'next/server';
 
 // 정적 리소스 호스트 (배너/팝업/회원 사진/게시판 이미지 등).
 // 로컬: NEXT_PUBLIC_RESOURCE_URL 미설정 시 API_URL 로 폴백 (API 가 wwwroot 정적 서빙).
-// dev/prod: dev-resource.dpot.live / resource.dpot.live 가 Admin/API uploads 통합 서빙.
+// dev/prod: dev-resource.antooza.com / resource.antooza.com 가 Admin/API uploads 통합 서빙.
 const RESOURCE_URL = process.env.NEXT_PUBLIC_RESOURCE_URL || process.env.API_URL;
 
 export async function GET(_: NextRequest, { params }: { params: Promise<{ path: string[] }> })

+ 1 - 1
app/auth/sns/google/callback/page.tsx

@@ -6,7 +6,7 @@ import { fetchApi } from '@/lib/utils/client';
 import { SnsConnectResponse } from '@/types/sns';
 import './style.scss';
 
-const STATE_STORAGE_KEY = 'dpot-sns-google-state';
+const STATE_STORAGE_KEY = 'antooza-sns-google-state';
 
 /**
  * Google OAuth Authorization Code 콜백.

+ 1 - 1
app/charge/page.tsx

@@ -131,7 +131,7 @@ export default function ChargePage()
 				methods: {
 					[selected.danalKey]: METHOD_CONFIGS[selected.danalKey]
 				},
-				orderName: `DPOT ${pointInput.toLocaleString()}(P) 충전`,
+				orderName: `개미투자 ${pointInput.toLocaleString()}(P) 충전`,
 				amount: order.amount,
 				merchantId: order.merchantID,
 				orderId: order.orderID,

+ 1 - 1
app/component/Footer.tsx

@@ -19,7 +19,7 @@ export default function Footer()
                     사업자 정보
                 </Link>
             </nav>
-            <p className={Styles.footerCopy}>© 2025 DPOT. All rights reserved.</p>
+            <p className={Styles.footerCopy}>© 2025 개미투자. All rights reserved.</p>
         </footer>
     );
 }

+ 1 - 1
app/component/Header.tsx

@@ -73,7 +73,7 @@ export default function Header({ sidebarOpen, onToggle }: Props)
 					</button>
 				)}
 
-				<Link href='/' className={Styles.logo} aria-label="DPOT 홈">
+				<Link href='/' className={Styles.logo} aria-label="개미투자 홈">
 					<Logo size="sm" />
 				</Link>
 

+ 3 - 3
app/component/Logo.tsx

@@ -6,10 +6,10 @@ type Props = {
 };
 
 export default function Logo({ size = 'md', className }: Props) {
-	const sizeClass = `dpot-logo--${size}`;
-	const classes = ['dpot-logo', sizeClass, className].filter(Boolean).join(' ');
+	const sizeClass = `antooza-logo--${size}`;
+	const classes = ['antooza-logo', sizeClass, className].filter(Boolean).join(' ');
 
 	return (
-		<span className={classes} aria-label="DPOT">DPOT</span>
+		<span className={classes} aria-label="개미투자">개미투자</span>
 	);
 }

+ 5 - 5
app/component/channel/ChannelSidebar.tsx

@@ -11,7 +11,7 @@ import { ChannelListItem, ChannelStatusUpdate } from '@/types/channel';
 import { buildChannelUrl, buildWatchUrl, formatHandle } from '@/lib/utils/channel';
 import useTheme from '@/hooks/useTheme';
 
-const STORAGE_KEY = 'dpot-sidebar-collapsed';
+const STORAGE_KEY = 'antooza-sidebar-collapsed';
 const PAGE_SIZE = 10;
 const WIDTH_EXPANDED = '220px';
 const WIDTH_COLLAPSED = '64px';
@@ -95,15 +95,15 @@ export default function ChannelSidebar({ initialChannels }: Props)
 	// collapsed 변경 시 html 루트의 CSS variable + 클래스 동기화 (layout grid가 반응)
 	useEffect(() => {
 		const root = document.documentElement;
-		root.style.setProperty('--dpot-sidebar-width', collapsed ? WIDTH_COLLAPSED : WIDTH_EXPANDED);
-		root.classList.toggle('dpot-sidebar-collapsed', collapsed);
+		root.style.setProperty('--antooza-sidebar-width', collapsed ? WIDTH_COLLAPSED : WIDTH_EXPANDED);
+		root.classList.toggle('antooza-sidebar-collapsed', collapsed);
 		try {
 			window.localStorage.setItem(STORAGE_KEY, String(collapsed));
 		} catch {}
 		return () => {
 			// unmount 시 원복 (전체 앱 재사용성 보장)
-			root.style.removeProperty('--dpot-sidebar-width');
-			root.classList.remove('dpot-sidebar-collapsed');
+			root.style.removeProperty('--antooza-sidebar-width');
+			root.classList.remove('antooza-sidebar-collapsed');
 		};
 	}, [collapsed]);
 

+ 1 - 1
app/layout.tsx

@@ -76,7 +76,7 @@ export async function generateMetadata(): Promise<Metadata> {
     const metaAdds = parseMetaAdds(config?.meta?.adds);
 
     return {
-        title: config?.basic?.siteName ?? 'dpot',
+        title: config?.basic?.siteName ?? '개미투자',
         description: config?.meta?.description ?? '',
         keywords: config?.meta?.keywords ?? '',
         authors: config?.meta?.author ? [{ name: config.meta.author }] : undefined,

+ 1 - 1
app/robots.ts

@@ -19,6 +19,6 @@ export default function robots(): MetadataRoute.Robots {
 				'/post/edit/',
 			],
 		},
-		sitemap: 'https://dpot.live/sitemap.xml',
+		sitemap: 'https://antooza.com/sitemap.xml',
 	};
 }

+ 1 - 1
app/sitemap.ts

@@ -1,7 +1,7 @@
 import { MetadataRoute } from 'next';
 import { fetchBoardList } from '@/lib/api/forum/board';
 
-const BASE_URL = 'https://dpot.web.or.kr';
+const BASE_URL = 'https://antooza.com';
 
 export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
 	// 정적 페이지

+ 1 - 1
app/styles/layout.module.scss

@@ -263,7 +263,7 @@
 	// PC: 좌측 채널 사이드바 + 메인 (2열)
 	@media (min-width: 1124px) {
 		grid-template-areas: "header header" "aside main" "aside footer";
-		grid-template-columns: var(--dpot-sidebar-width, 220px) minmax(0, 1fr);
+		grid-template-columns: var(--antooza-sidebar-width, 220px) minmax(0, 1fr);
 		transition: grid-template-columns 0.2s ease;
 	}
 

+ 1 - 1
app/styles/logo.scss

@@ -1,4 +1,4 @@
-.dpot-logo {
+.antooza-logo {
 	display: inline-block;
 	font-family: var(--font-brand), 'Archivo Black', system-ui, sans-serif;
 	font-weight: 400;

+ 1 - 1
contexts/cartProvider.tsx

@@ -3,7 +3,7 @@
 import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
 import type { ChannelSearchRow, ProductType } from '@/types/store';
 
-const STORAGE_KEY = 'dpot.cart.v1';
+const STORAGE_KEY = 'antooza.cart.v1';
 const MAX_QUANTITY_PER_LINE = 999;
 
 export interface CartItem {

+ 10 - 10
deploy/config-templates/README.md

@@ -6,9 +6,9 @@
 
 ```
 config-templates/
-├── dev/                            (CTL-Window-Server / dev.dpot.live)
+├── dev/                            (CTL-Window-Server / dev.antooza.com)
 │   └── .env.production.template
-└── prod/                           (PROD-Window-Server / dpot.live)
+└── prod/                           (PROD-Window-Server / antooza.com)
     └── .env.production.template
 ```
 
@@ -18,8 +18,8 @@ config-templates/
 
 | 환경 | credentialsId             | 사용 파일                                    | Jenkinsfile |
 |------|---------------------------|---------------------------------------------|-------------|
-| dev  | `DEV-DPOT-FRONTEND-ENV`   | `dev/.env.production.template` 채워서       | `Frontend/Jenkinsfile`      |
-| prod | `PROD-DPOT-FRONTEND-ENV`  | `prod/.env.production.template` 채워서      | `Frontend/Jenkinsfile.prod` |
+| dev  | `DEV-ANTOOZA-FRONTEND-ENV`   | `dev/.env.production.template` 채워서       | `Frontend/Jenkinsfile`      |
+| prod | `PROD-ANTOOZA-FRONTEND-ENV`  | `prod/.env.production.template` 채워서      | `Frontend/Jenkinsfile.prod` |
 
 ## 빌드 시 흐름
 
@@ -27,18 +27,18 @@ config-templates/
 2. `copy /Y "%CFG%" .env.production`
 3. `npm run build` — `NEXT_PUBLIC_*` 는 빌드 시 클라이언트 번들에 inline
 4. Deploy 단계에서 `.env.production` 을 배포 경로에도 복사 — 서버 사이드 (`API_URL`, `SIGNALR_CHAT_URL` 등) 가 런타임에 로드됨
-   - dev : `F:\IIS\DPOT\Front\`
+   - dev : `F:\IIS\ANTOOZA\Front\`
    - prod: `C:\workspace\IIS\Front\`
 
 ## dev → prod 차이 (참고)
 
 | 키 | dev | prod |
 |---|-----|------|
-| `NEXT_PUBLIC_SITE_URL` | `https://dev.dpot.live` | `https://dpot.live` |
-| `NEXT_PUBLIC_API_URL` / `API_URL` | `https://dev-api.dpot.live` | `https://api.dpot.live` |
-| `NEXT_PUBLIC_RESOURCE_URL` | `https://dev-resource.dpot.live` | `https://resource.dpot.live` |
-| `NEXT_PUBLIC_EMBED_DOMAIN` | `dev.dpot.live` | `dpot.live` |
-| `SIGNALR_CHAT_URL` / `SIGNALR_APP_URL` | `https://dev-api.dpot.live/hubs/{chat,app}` | `https://api.dpot.live/hubs/{chat,app}` |
+| `NEXT_PUBLIC_SITE_URL` | `https://dev.antooza.com` | `https://antooza.com` |
+| `NEXT_PUBLIC_API_URL` / `API_URL` | `https://dev-api.antooza.com` | `https://api.antooza.com` |
+| `NEXT_PUBLIC_RESOURCE_URL` | `https://dev-resource.antooza.com` | `https://resource.antooza.com` |
+| `NEXT_PUBLIC_EMBED_DOMAIN` | `dev.antooza.com` | `antooza.com` |
+| `SIGNALR_CHAT_URL` / `SIGNALR_APP_URL` | `https://dev-api.antooza.com/hubs/{chat,app}` | `https://api.antooza.com/hubs/{chat,app}` |
 
 ## 보안 노트
 

+ 2 - 2
deploy/iis/web.config

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  IIS reverse proxy + HTTPS-only enforcement for DPOT-Front.
-  Deploy location: F:\IIS\DPOT\Front\web.config (kept across Jenkins deploys via keep[]).
+  IIS reverse proxy + HTTPS-only enforcement for ANTOOZA-Front.
+  Deploy location: F:\IIS\ANTOOZA\Front\web.config (kept across Jenkins deploys via keep[]).
   Requires:
     - IIS URL Rewrite module
     - Application Request Routing (ARR) with Proxy enabled (Server-level)

+ 9 - 9
deploy/winsw/dpot-frontend.xml → deploy/winsw/antooza-frontend.xml

@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  WinSW config for DPOT Frontend (Next.js 15 standalone).
-  Deploy path: F:\IIS\DPOT\Front
+  WinSW config for ANTOOZA Frontend (Next.js 15 standalone).
+  Deploy path: F:\IIS\ANTOOZA\Front
   Required files in folder (after first Jenkins build pushes server.js + .next + public):
     - server.js              (from .next/standalone/)
     - .next/                 (server bundles + .next/static client assets)
     - public/                (public assets)
     - node_modules/          (minimal, from standalone)
-    - dpot-frontend.exe      (renamed WinSW v2 binary; kept by Jenkinsfile rollout)
-    - dpot-frontend.xml      (this file)
+    - antooza-frontend.exe      (renamed WinSW v2 binary; kept by Jenkinsfile rollout)
+    - antooza-frontend.xml      (this file)
     - web.config             (IIS reverse proxy config)
-  Install once: dpot-frontend.exe install
+  Install once: antooza-frontend.exe install
   Jenkinsfile then manages Start/Stop via Stop-Service / Start-Service.
 -->
 <service>
-  <id>dpot-frontend</id>
-  <name>DPOT Frontend (Next.js standalone)</name>
-  <description>Next.js production server for dev.dpot.live / dpot.live (port 3000)</description>
+  <id>antooza-frontend</id>
+  <name>ANTOOZA Frontend (Next.js standalone)</name>
+  <description>Next.js production server for dev.antooza.com / antooza.com (port 3000)</description>
 
   <executable>node</executable>
   <arguments>server.js</arguments>
-  <workingdirectory>F:\IIS\DPOT\Front</workingdirectory>
+  <workingdirectory>F:\IIS\ANTOOZA\Front</workingdirectory>
 
   <env name="NODE_ENV" value="production"/>
   <env name="PORT" value="3000"/>

+ 1 - 1
lib/utils/client.ts

@@ -29,7 +29,7 @@ type RefreshBroadcastMsg =
 	| { type: 'refresh-done'; nonce: string; success: boolean };
 
 const refreshChannel: BroadcastChannel|null = typeof window !== 'undefined' && typeof BroadcastChannel !== 'undefined'
-	? new BroadcastChannel('dpot-auth-refresh')
+	? new BroadcastChannel('antooza-auth-refresh')
 	: null;
 
 let externalRefreshWaiter: { promise: Promise<boolean>; resolve: (v: boolean) => void; nonce: string }|null = null;

+ 4 - 4
next.config.ts

@@ -20,22 +20,22 @@ const nextConfig: NextConfig = {
             },
 			{
 				protocol: "https",
-				hostname: "api.dpot.live",
+				hostname: "api.antooza.com",
 				pathname: "/uploads/**"
 			},
 			{
 				protocol: "https",
-				hostname: "dev-api.dpot.live",
+				hostname: "dev-api.antooza.com",
 				pathname: "/uploads/**"
 			},
 			{
 				protocol: "https",
-				hostname: "resource.dpot.live",
+				hostname: "resource.antooza.com",
 				pathname: "/uploads/**"
 			},
 			{
 				protocol: "https",
-				hostname: "dev-resource.dpot.live",
+				hostname: "dev-resource.antooza.com",
 				pathname: "/uploads/**"
 			},
 			{

+ 2 - 2
package-lock.json

@@ -1,11 +1,11 @@
 {
-    "name": "bitforum",
+    "name": "antooza",
     "version": "0.1.0",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
-            "name": "bitforum",
+            "name": "antooza",
             "version": "0.1.0",
             "dependencies": {
                 "@base-ui/react": "^1.4.0",

+ 1 - 1
package.json

@@ -1,5 +1,5 @@
 {
-    "name": "bitforum",
+    "name": "antooza",
     "version": "0.1.0",
     "private": true,
     "scripts": {

+ 2 - 2
public/manifest.json

@@ -1,6 +1,6 @@
 {
-	"name": "bitforum",
-	"short_name": "bitforum",
+	"name": "개미투자",
+	"short_name": "개미투자",
 	"start_url": "/",
 	"display": "standalone",
 	"background_color": "#ffffff",