Compare commits
8 Commits
7f37402561
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| a85322da58 | |||
| c4ae1ab3e6 | |||
| 672a99ef80 | |||
| d2b145576b | |||
| e1af7285a1 | |||
| 6993ab9397 | |||
| 280ed02790 | |||
| a128207762 |
@@ -2,6 +2,10 @@
|
||||
.env
|
||||
.env.local
|
||||
|
||||
# 로컬 전용 스크립트 (자격증명 포함 가능)
|
||||
push-gitea.bat
|
||||
run-local.bat
|
||||
|
||||
# Python
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+175
-35
@@ -1,25 +1,5 @@
|
||||
/* ── Pretendard 폰트 ─────────────────────────────── */
|
||||
@font-face {
|
||||
font-family: "Pretendard";
|
||||
src: url("/static/fonts/Pretendard-Thin.ttf") format("truetype");
|
||||
font-weight: 100;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Pretendard";
|
||||
src: url("/static/fonts/Pretendard-Regular.ttf") format("truetype");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Pretendard";
|
||||
src: url("/static/fonts/Pretendard-Bold.ttf") format("truetype");
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
/* ── Pretendard 폰트 (CDN) ───────────────────────── */
|
||||
@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard/packages/pretendard/dist/web/static/pretendard.css");
|
||||
|
||||
/* ── 디자인 토큰 ─────────────────────────────────── */
|
||||
:root {
|
||||
@@ -44,7 +24,7 @@
|
||||
|
||||
body {
|
||||
font-family: "Pretendard", "Segoe UI", "Apple SD Gothic Neo", system-ui, sans-serif;
|
||||
font-size: 15px;
|
||||
font-size: 16px;
|
||||
color: var(--text);
|
||||
background: var(--bg);
|
||||
min-height: 100vh;
|
||||
@@ -108,7 +88,7 @@ a { color: inherit; text-decoration: none; }
|
||||
.brand-logo-mark svg { color: #fff; }
|
||||
|
||||
.brand-name {
|
||||
font-size: 20px;
|
||||
font-size: 22px;
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
letter-spacing: -.3px;
|
||||
@@ -134,19 +114,25 @@ a { color: inherit; text-decoration: none; }
|
||||
}
|
||||
|
||||
.brand-headline {
|
||||
font-size: clamp(28px, 3.2vw, 42px);
|
||||
font-size: clamp(32px, 3.6vw, 48px);
|
||||
font-weight: 700;
|
||||
color: #fff;
|
||||
line-height: 1.25;
|
||||
line-height: 1.2;
|
||||
letter-spacing: -.5px;
|
||||
margin-bottom: 16px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.brand-desc {
|
||||
font-size: 15px;
|
||||
color: rgba(255,255,255,.55);
|
||||
line-height: 1.7;
|
||||
max-width: 380px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.brand-desc-nowrap {
|
||||
font-size: 14px;
|
||||
color: rgba(255,255,255,.55);
|
||||
white-space: nowrap;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.brand-divider {
|
||||
@@ -186,16 +172,16 @@ a { color: inherit; text-decoration: none; }
|
||||
}
|
||||
|
||||
.form-title {
|
||||
font-size: clamp(22px, 2.8vw, 30px);
|
||||
font-size: clamp(24px, 3vw, 32px);
|
||||
font-weight: 700;
|
||||
color: var(--navy);
|
||||
letter-spacing: -.4px;
|
||||
line-height: 1.2;
|
||||
margin-bottom: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.form-subtitle {
|
||||
font-size: 14px;
|
||||
font-size: 15px;
|
||||
color: var(--muted);
|
||||
line-height: 1.6;
|
||||
margin-bottom: 36px;
|
||||
@@ -561,16 +547,16 @@ a { color: inherit; text-decoration: none; }
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 17px;
|
||||
font-size: 19px;
|
||||
font-weight: 700;
|
||||
color: var(--navy);
|
||||
letter-spacing: -.3px;
|
||||
line-height: 1.35;
|
||||
margin-bottom: 8px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.card-desc {
|
||||
font-size: 13px;
|
||||
font-size: 14px;
|
||||
color: var(--muted);
|
||||
line-height: 1.6;
|
||||
flex: 1;
|
||||
@@ -598,6 +584,160 @@ a { color: inherit; text-decoration: none; }
|
||||
.menu-card:hover .card-link { gap: 8px; }
|
||||
|
||||
|
||||
/* ════════════════════════════════════════════════════
|
||||
브랜드 패널 — 움직이는 도형
|
||||
════════════════════════════════════════════════════ */
|
||||
|
||||
.brand-shapes {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.shape { position: absolute; }
|
||||
|
||||
/* 1. 큰 원 테두리 — 우측 상단 */
|
||||
.shape-1 {
|
||||
width: 360px;
|
||||
height: 360px;
|
||||
border: 3px solid rgba(30, 86, 160, .28);
|
||||
border-radius: 50%;
|
||||
top: -90px;
|
||||
right: -70px;
|
||||
animation: shapeFloat1 16s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* 2. 다이아몬드 — 좌측 하단 */
|
||||
.shape-2 {
|
||||
width: 130px;
|
||||
height: 130px;
|
||||
background: rgba(30, 86, 160, .12);
|
||||
border: 3px solid rgba(30, 86, 160, .3);
|
||||
border-radius: 20px;
|
||||
bottom: 90px;
|
||||
left: -45px;
|
||||
animation: shapeFloat2 13s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* 3. 중간 원 — 중앙 우측 */
|
||||
.shape-3 {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
border: 3px solid rgba(255, 255, 255, .14);
|
||||
border-radius: 50%;
|
||||
top: 40%;
|
||||
right: 12%;
|
||||
animation: shapeFloat3 11s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* 4. 둥근 사각형 테두리 — 하단 */
|
||||
.shape-4 {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
border: 3px solid rgba(30, 86, 160, .22);
|
||||
border-radius: 36px;
|
||||
bottom: -60px;
|
||||
right: 16%;
|
||||
animation: shapeFloat4 15s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* 5. 작은 원 채움 — 상단 좌측 */
|
||||
.shape-5 {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
background: rgba(30, 86, 160, .2);
|
||||
border: 2px solid rgba(30, 86, 160, .35);
|
||||
border-radius: 50%;
|
||||
top: 20%;
|
||||
left: 16%;
|
||||
animation: shapeFloat5 9s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* 6. 세모 — 우측 중하단 */
|
||||
.shape-6 {
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
background: rgba(30, 86, 160, .14);
|
||||
clip-path: polygon(50% 0%, 0% 100%, 100% 100%);
|
||||
bottom: 28%;
|
||||
right: 6%;
|
||||
animation: shapeFloat6 12s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* King 텍스트 — 반짝이며 유동 */
|
||||
.shape-king {
|
||||
font-size: 30px;
|
||||
font-weight: 700;
|
||||
color: rgba(255, 255, 255, .9);
|
||||
letter-spacing: 4px;
|
||||
text-transform: none;
|
||||
top: 28%;
|
||||
right: 7%;
|
||||
animation: kingFloat 13s ease-in-out infinite, kingSparkle 2.4s ease-in-out infinite;
|
||||
white-space: nowrap;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
@keyframes shapeFloat1 {
|
||||
0%, 100% { transform: translate(0, 0); }
|
||||
25% { transform: translate(-22px, 32px); }
|
||||
50% { transform: translate(16px, 22px); }
|
||||
75% { transform: translate(-10px, -18px); }
|
||||
}
|
||||
@keyframes shapeFloat2 {
|
||||
0%, 100% { transform: rotate(45deg) translate(0, 0); }
|
||||
33% { transform: rotate(68deg) translate(22px, -26px); }
|
||||
66% { transform: rotate(28deg) translate(-18px, 22px); }
|
||||
}
|
||||
@keyframes shapeFloat3 {
|
||||
0%, 100% { transform: translate(0, 0); }
|
||||
50% { transform: translate(28px, -34px); }
|
||||
}
|
||||
@keyframes shapeFloat4 {
|
||||
0%, 100% { transform: rotate(12deg) translate(0, 0); }
|
||||
40% { transform: rotate(24deg) translate(-22px, -14px); }
|
||||
80% { transform: rotate(2deg) translate(18px, 10px); }
|
||||
}
|
||||
@keyframes shapeFloat5 {
|
||||
0%, 100% { transform: translate(0, 0) scale(1); }
|
||||
33% { transform: translate(16px, -20px) scale(1.2); }
|
||||
66% { transform: translate(-12px, 14px) scale(0.85); }
|
||||
}
|
||||
@keyframes shapeFloat6 {
|
||||
0%, 100% { transform: translate(0, 0) rotate(0deg); }
|
||||
33% { transform: translate(-18px, -22px) rotate(20deg); }
|
||||
66% { transform: translate(14px, 10px) rotate(-15deg); }
|
||||
}
|
||||
@keyframes shapeFloat7 {
|
||||
0%, 100% { transform: translate(0, 0) rotate(0deg) scale(1); }
|
||||
33% { transform: translate(-20px, -18px) rotate(36deg) scale(1.15); }
|
||||
66% { transform: translate(14px, 16px) rotate(-18deg) scale(0.9); }
|
||||
}
|
||||
@keyframes kingFloat {
|
||||
0%, 100% { transform: translate(0, 0); }
|
||||
20% { transform: translate(-65px, 50px); }
|
||||
40% { transform: translate(55px, -40px); }
|
||||
60% { transform: translate(-45px, -60px); }
|
||||
80% { transform: translate(70px, 30px); }
|
||||
}
|
||||
@keyframes kingSparkle {
|
||||
0%, 100% {
|
||||
text-shadow:
|
||||
0 0 8px rgba(255, 255, 255, .6),
|
||||
0 0 18px rgba(99, 179, 237, .5);
|
||||
opacity: .75;
|
||||
}
|
||||
50% {
|
||||
text-shadow:
|
||||
0 0 16px rgba(255, 255, 255, 1),
|
||||
0 0 36px rgba(99, 179, 237, 1),
|
||||
0 0 56px rgba(147, 197, 253, .9),
|
||||
0 0 80px rgba(59, 130, 246, .6);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* ════════════════════════════════════════════════════
|
||||
반응형
|
||||
════════════════════════════════════════════════════ */
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
|
||||
<!-- 좌측: 브랜드 패널 -->
|
||||
<aside class="brand-panel">
|
||||
<!-- 움직이는 배경 도형 -->
|
||||
<div class="brand-shapes" aria-hidden="true">
|
||||
<div class="shape shape-1"></div>
|
||||
<div class="shape shape-2"></div>
|
||||
<div class="shape shape-3"></div>
|
||||
<div class="shape shape-4"></div>
|
||||
<div class="shape shape-5"></div>
|
||||
<div class="shape shape-6"></div>
|
||||
<div class="shape shape-king">King</div>
|
||||
</div>
|
||||
|
||||
<div class="brand-logo">
|
||||
<div class="brand-logo-mark">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"
|
||||
@@ -21,19 +32,17 @@
|
||||
<rect x="14" y="14" width="7" height="7" rx="1"/>
|
||||
</svg>
|
||||
</div>
|
||||
<span class="brand-name">DBX Corp</span>
|
||||
<span class="brand-name">DBX Corporation</span>
|
||||
</div>
|
||||
|
||||
<div class="brand-body">
|
||||
<p class="brand-tag">Internal Portal</p>
|
||||
<h1 class="brand-headline">업무 포털<br>시스템</h1>
|
||||
<p class="brand-desc">
|
||||
DBX Corp 임직원 전용 업무 통합 포털입니다.
|
||||
</p>
|
||||
<p class="brand-desc">DBX Corporation 임직원 전용 업무 통합 포털입니다.</p>
|
||||
<div class="brand-divider"></div>
|
||||
</div>
|
||||
|
||||
<p class="brand-footer">© 2026 DBX Corp. All rights reserved.</p>
|
||||
<p class="brand-footer">© 2026 DBX Corporation. All rights reserved.</p>
|
||||
</aside>
|
||||
|
||||
<!-- 우측: 오류 패널 -->
|
||||
|
||||
@@ -11,6 +11,17 @@
|
||||
|
||||
<!-- 좌측: 브랜드 패널 -->
|
||||
<aside class="brand-panel">
|
||||
<!-- 움직이는 배경 도형 -->
|
||||
<div class="brand-shapes" aria-hidden="true">
|
||||
<div class="shape shape-1"></div>
|
||||
<div class="shape shape-2"></div>
|
||||
<div class="shape shape-3"></div>
|
||||
<div class="shape shape-4"></div>
|
||||
<div class="shape shape-5"></div>
|
||||
<div class="shape shape-6"></div>
|
||||
<div class="shape shape-king">King</div>
|
||||
</div>
|
||||
|
||||
<div class="brand-logo">
|
||||
<div class="brand-logo-mark">
|
||||
<svg width="20" height="20" viewBox="0 0 24 24" fill="none"
|
||||
@@ -21,26 +32,24 @@
|
||||
<rect x="14" y="14" width="7" height="7" rx="1"/>
|
||||
</svg>
|
||||
</div>
|
||||
<span class="brand-name">DBX Corp</span>
|
||||
<span class="brand-name">DBX Corporation</span>
|
||||
</div>
|
||||
|
||||
<div class="brand-body">
|
||||
<p class="brand-tag">Internal Portal</p>
|
||||
<h1 class="brand-headline">업무 포털<br>시스템</h1>
|
||||
<p class="brand-desc">
|
||||
DBX Corp 임직원 전용 업무 통합 포털입니다.<br>
|
||||
회사 Google Workspace 계정으로 인증 후 이용하실 수 있습니다.
|
||||
</p>
|
||||
<p class="brand-desc">DBX Corporation 임직원 전용 업무 통합 포털입니다.</p>
|
||||
<p class="brand-desc-nowrap">회사 Google Workspace 계정으로 인증 후 이용하실 수 있습니다.</p>
|
||||
<div class="brand-divider"></div>
|
||||
</div>
|
||||
|
||||
<p class="brand-footer">© 2026 DBX Corp. All rights reserved.</p>
|
||||
<p class="brand-footer">© 2026 DBX Corporation. All rights reserved.</p>
|
||||
</aside>
|
||||
|
||||
<!-- 우측: 로그인 폼 -->
|
||||
<main class="form-panel">
|
||||
<div class="form-box">
|
||||
<p class="form-eyebrow">DBX Corp</p>
|
||||
<p class="form-eyebrow">DBX Corporation</p>
|
||||
<h2 class="form-title">업무 포털 로그인</h2>
|
||||
<p class="form-subtitle">
|
||||
회사 Google Workspace 계정으로 로그인하세요.<br>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>업무 포털 — DBX Corp</title>
|
||||
<title>업무 포털 — DBX Corporation</title>
|
||||
<link rel="stylesheet" href="/static/styles.css" />
|
||||
</head>
|
||||
<body>
|
||||
@@ -21,7 +21,7 @@
|
||||
</svg>
|
||||
</div>
|
||||
<div class="header-brand-text">
|
||||
<span class="header-company">DBX Corp</span>
|
||||
<span class="header-company">DBX Corporation</span>
|
||||
<span class="header-portal">업무 포털</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+2
-2
@@ -5,7 +5,7 @@ services:
|
||||
container_name: dbx-main
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
# NPM이 192.168.0.194:8000 으로 프록시 → 컨테이너 8000으로 전달
|
||||
- "8000:8000"
|
||||
# NPM이 192.168.0.194:8080 으로 프록시 → 컨테이너 8000으로 전달
|
||||
- "8080:8000"
|
||||
env_file:
|
||||
- .env
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name dbx.no1king.freeddns.org;
|
||||
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name dbx.no1king.freeddns.org;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/dbx.no1king.freeddns.org/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/dbx.no1king.freeddns.org/privkey.pem;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
@echo off
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo.
|
||||
echo [1/2] Checking for sensitive files...
|
||||
echo.
|
||||
|
||||
set FOUND=0
|
||||
|
||||
:: git? ??? ??(tracked)?? ?? ?? ??
|
||||
for %%F in (
|
||||
.env
|
||||
.env.local
|
||||
.env.production
|
||||
.env.secret
|
||||
) do (
|
||||
git ls-files --error-unmatch "%%F" >nul 2>&1
|
||||
if not errorlevel 1 (
|
||||
echo [ERROR] Sensitive file is tracked by git: %%F
|
||||
set FOUND=1
|
||||
)
|
||||
)
|
||||
|
||||
:: ??? ?? ?? ??? git? ????? ??
|
||||
for %%P in (
|
||||
*.pem *.key *.p12 *.pfx id_rsa id_ed25519
|
||||
*secret* *password* *credential* *token* *apikey* *api_key*
|
||||
db.conf database.conf
|
||||
) do (
|
||||
git ls-files "%%P" 2>nul | findstr /r "." >nul 2>&1
|
||||
if not errorlevel 1 (
|
||||
echo [ERROR] Sensitive file pattern tracked by git: %%P
|
||||
set FOUND=1
|
||||
)
|
||||
)
|
||||
|
||||
if %FOUND%==1 (
|
||||
echo.
|
||||
echo ============================================================
|
||||
echo PUSH BLOCKED: Sensitive file found in git.
|
||||
echo.
|
||||
echo Remove it with:
|
||||
echo git rm --cached ^<filename^>
|
||||
echo git commit -m "remove sensitive file"
|
||||
echo.
|
||||
echo Then add it to .gitignore to prevent future accidents.
|
||||
echo ============================================================
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo No sensitive files detected. Safe to push.
|
||||
echo.
|
||||
|
||||
echo [2/2] Pushing to Gitea...
|
||||
echo https://gitea.no1king.freeddns.org/king/dbx-main.git
|
||||
echo.
|
||||
|
||||
git push -u origin master
|
||||
|
||||
if %errorlevel%==0 (
|
||||
echo.
|
||||
echo [OK] Push complete.
|
||||
echo https://gitea.no1king.freeddns.org/king/dbx-main
|
||||
echo.
|
||||
) else (
|
||||
echo.
|
||||
echo [ERROR] Push failed. Check your credentials or network.
|
||||
echo.
|
||||
)
|
||||
pause
|
||||
@@ -1,63 +0,0 @@
|
||||
@echo off
|
||||
cd /d "%~dp0"
|
||||
|
||||
set PROJECT=dbx-main
|
||||
set COMPOSE=docker compose -p %PROJECT% -f docker-compose.local.yml
|
||||
|
||||
if "%1"=="stop" goto STOP
|
||||
if "%1"=="logs" goto LOGS
|
||||
if "%1"=="ps" goto PS
|
||||
if "%1"=="restart" goto RESTART
|
||||
|
||||
:START
|
||||
if not exist ".env.local" (
|
||||
echo.
|
||||
echo [ERROR] .env.local not found.
|
||||
echo Copy .env.local.example and fill in the values:
|
||||
echo.
|
||||
echo copy .env.local.example .env.local
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo.
|
||||
echo Starting DBX Main Page (local)...
|
||||
echo.
|
||||
%COMPOSE% up --build -d
|
||||
if %errorlevel%==0 (
|
||||
echo.
|
||||
echo [OK] Running at http://localhost:8080
|
||||
echo.
|
||||
echo Logs : run-local.bat logs
|
||||
echo Stop : run-local.bat stop
|
||||
echo.
|
||||
)
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:STOP
|
||||
echo.
|
||||
echo Stopping container...
|
||||
%COMPOSE% down
|
||||
echo.
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:LOGS
|
||||
%COMPOSE% logs -f
|
||||
exit /b
|
||||
|
||||
:PS
|
||||
echo.
|
||||
%COMPOSE% ps
|
||||
echo.
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:RESTART
|
||||
echo.
|
||||
echo Restarting...
|
||||
%COMPOSE% restart
|
||||
echo.
|
||||
pause
|
||||
exit /b
|
||||
@@ -1,52 +0,0 @@
|
||||
# DBX 메인 페이지 — 로컬 실행 스크립트
|
||||
# 사용법: .\run-local.ps1 [명령어]
|
||||
#
|
||||
# .\run-local.ps1 → 시작 (코드 변경 시 자동 재빌드)
|
||||
# .\run-local.ps1 stop → 중지
|
||||
# .\run-local.ps1 logs → 로그 보기
|
||||
# .\run-local.ps1 ps → 상태 확인
|
||||
# .\run-local.ps1 restart → 재시작
|
||||
|
||||
$PROJECT = "dbx-main"
|
||||
$COMPOSE = "docker compose -p $PROJECT -f docker-compose.local.yml"
|
||||
|
||||
switch ($args[0]) {
|
||||
"stop" {
|
||||
Write-Host "컨테이너 중지 중..." -ForegroundColor Yellow
|
||||
Invoke-Expression "$COMPOSE down"
|
||||
}
|
||||
"logs" {
|
||||
Invoke-Expression "$COMPOSE logs -f"
|
||||
}
|
||||
"ps" {
|
||||
Invoke-Expression "$COMPOSE ps"
|
||||
}
|
||||
"restart" {
|
||||
Write-Host "재시작 중..." -ForegroundColor Yellow
|
||||
Invoke-Expression "$COMPOSE restart"
|
||||
}
|
||||
default {
|
||||
# .env.local 없으면 안내 후 종료
|
||||
if (-not (Test-Path ".env.local")) {
|
||||
Write-Host ""
|
||||
Write-Host "❌ .env.local 파일이 없습니다." -ForegroundColor Red
|
||||
Write-Host " .env.local.example 을 복사하여 값을 채워주세요:" -ForegroundColor Yellow
|
||||
Write-Host " copy .env.local.example .env.local" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "🚀 DBX 메인 페이지 로컬 시작..." -ForegroundColor Cyan
|
||||
Invoke-Expression "$COMPOSE up --build -d"
|
||||
|
||||
if ($LASTEXITCODE -eq 0) {
|
||||
Write-Host ""
|
||||
Write-Host "✅ 실행 중 → http://localhost:8080" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host " 로그 보기 : .\run-local.ps1 logs" -ForegroundColor Gray
|
||||
Write-Host " 중지 : .\run-local.ps1 stop" -ForegroundColor Gray
|
||||
Write-Host ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user