Files
Pier_v1/RAG/design-model-box-sample_2/deploy-server.bat
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

175 lines
9.3 KiB
Batchfile

@echo off
setlocal DisableDelayedExpansion
if defined DMS_GIT_AUTH_MODE goto git_auth
rem Run on a Windows deployment server with Git and Docker Linux containers.
rem No token, AI login, or model data is embedded in this file.
if /I "%~1"=="--help" goto help
set "DMS_REPOSITORY=https://gitea.hmac.kr/is-div/design-model-box-sample_2.git"
set "DMS_SERVICE_URL=http://10.14.12.22/box-sample"
set "DMS_HOST_PORT=5092"
set "DMS_BIND_IP=0.0.0.0"
set "DMS_GITEA_USERNAME=Hyein"
set "DMS_GITEA_TOKEN_FILE=%~dp0gitea-token.txt"
set "DMS_AI_AUTH_FILE=%~dp0codex-auth.json"
set "GIT_ASKPASS=%~f0"
set "GIT_TERMINAL_PROMPT=0"
set "DMS_DEPLOY_SOURCE=%~dp0deploy-source"
set "DMS_COMPOSE_FILE="
set "DMS_FAILED_STEP=prerequisite check"
where git >nul 2>&1
if errorlevel 1 goto failed
where docker >nul 2>&1
if errorlevel 1 goto failed
where powershell >nul 2>&1
if errorlevel 1 goto failed
docker compose version >nul 2>&1
if errorlevel 1 goto failed
docker info >nul 2>&1
if errorlevel 1 goto failed
echo Repository: %DMS_REPOSITORY%
echo This script runs HERE, not on a remote server.
echo Run this file ON deployment server 10.14.12.22, not on your personal PC.
echo Intended public service: %DMS_SERVICE_URL%
echo Server port: %DMS_HOST_PORT% - prefix gateway: 8080 - internal application: 8097
echo Requires approved intranet firewall and access controls.
echo Seven shared saved models are installed from the repository cache bundle.
echo Existing server work is preserved. AI credentials are NOT downloaded.
set "DMS_FAILED_STEP=deployment server address check"
powershell -NoProfile -NonInteractive -Command "if (@(Get-NetIPAddress -AddressFamily IPv4 -ErrorAction Stop).IPAddress -notcontains '10.14.12.22') {Write-Error 'Run this file on deployment server 10.14.12.22, not on your local PC.'; exit 1}"
if errorlevel 1 goto failed
set "DMS_FAILED_STEP=source download or update"
if not exist "%DMS_GITEA_TOKEN_FILE%" (
echo Missing private gitea-token.txt beside this script. Never upload that file to Git.
goto failed
)
set "DMS_GIT_AUTH_MODE=1"
if exist "%DMS_DEPLOY_SOURCE%" goto update
git -c credential.helper= clone -- "%DMS_REPOSITORY%" "%DMS_DEPLOY_SOURCE%"
if errorlevel 1 goto failed
goto source_ready
:update
if not exist "%DMS_DEPLOY_SOURCE%\.git" (
echo Destination exists but is not the deployment clone. Nothing was overwritten.
goto failed
)
set "DMS_FAILED_STEP=repository origin verification"
rem Capture Git output directly; do not depend on CMD pipe/findstr encoding.
powershell -NoProfile -NonInteractive -Command "$ErrorActionPreference='Stop'; $lines=@(& git -C $env:DMS_DEPLOY_SOURCE remote get-url origin); if ($LASTEXITCODE -ne 0) {Write-Host 'Git could not read origin.'; exit 2}; if ($lines.Count -ne 1) {Write-Host 'Expected one origin URL.'; exit 3}; $actual=([string]$lines[0]).Trim(); $expected=$env:DMS_REPOSITORY.Trim(); if (-not [string]::Equals($actual,$expected,[StringComparison]::Ordinal)) {Write-Host 'Origin URL differs from the configured repository. No change made.'; exit 4}; Write-Host 'Repository origin verified.'"
if errorlevel 1 (
echo Repository origin verification failed. Nothing was overwritten.
goto failed
)
set "DMS_FAILED_STEP=source download or update"
git -C "%DMS_DEPLOY_SOURCE%" status --porcelain >nul
if errorlevel 1 goto failed
for /f "delims=" %%S in ('git -C "%DMS_DEPLOY_SOURCE%" status --porcelain') do (
echo Deployment clone has local changes. Preserve or resolve them before deploying.
goto failed
)
git -c credential.helper= -C "%DMS_DEPLOY_SOURCE%" pull --ff-only
if errorlevel 1 goto failed
:source_ready
set "DMS_GIT_AUTH_MODE="
if not exist "%DMS_DEPLOY_SOURCE%\Dockerfile" goto failed
if not exist "%DMS_DEPLOY_SOURCE%\compose.yaml" goto failed
if not exist "%DMS_DEPLOY_SOURCE%\deployment\subpath_gateway.py" goto failed
if not exist "%DMS_DEPLOY_SOURCE%\deployment\configure-caddy.ps1" goto failed
set "DMS_FAILED_STEP=Caddy administration preflight"
powershell -NoProfile -NonInteractive -Command "$ErrorActionPreference='Stop'; Invoke-WebRequest -UseBasicParsing -Uri 'http://localhost:2019/config/' -TimeoutSec 10 | Out-Null"
if errorlevel 1 goto failed
echo Deploying commit:
git -C "%DMS_DEPLOY_SOURCE%" rev-parse HEAD
set "DMS_FAILED_STEP=temporary Compose configuration"
for /f "delims=" %%T in ('powershell -NoProfile -NonInteractive -Command "[System.IO.Path]::GetTempFileName()"') do set "DMS_COMPOSE_FILE=%%T"
if not defined DMS_COMPOSE_FILE goto failed
rem A separate Compose file replaces the original localhost port mapping.
rem A fixed project name keeps the named data volume stable across updates.
>"%DMS_COMPOSE_FILE%" (
echo services:
echo studio:
echo build:
echo context: "${DMS_DEPLOY_CONTEXT}"
echo ports:
echo - "${DMS_BIND_IP}:${DMS_HOST_PORT}:8080"
echo command: ["python", "deployment/subpath_gateway.py"]
echo environment:
echo DMS_DATA_DIR: /data
echo volumes:
echo - studio-data:/data
echo - studio-ai-auth:/root/.codex
echo restart: unless-stopped
echo volumes:
echo studio-data:
echo studio-ai-auth:
)
set "DMS_DEPLOY_CONTEXT=%DMS_DEPLOY_SOURCE:\=/%"
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" config --quiet
if errorlevel 1 goto failed
set "DMS_FAILED_STEP=image build"
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" build
if errorlevel 1 goto failed
set "DMS_FAILED_STEP=container start"
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" up -d --no-build
if errorlevel 1 goto failed
set "DMS_FAILED_STEP=HTTP readiness check"
if not exist "%DMS_AI_AUTH_FILE%" goto ai_auth_check
set "DMS_FAILED_STEP=private AI authentication import"
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" exec -T studio python deployment/install_ai_auth.py < "%DMS_AI_AUTH_FILE%"
if errorlevel 1 goto failed
:ai_auth_check
set "DMS_FAILED_STEP=AI authentication status check"
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" exec -T studio codex login status
if errorlevel 1 (
echo AI login is not ready. Place your private codex-auth.json beside this launcher and run again.
goto failed
)
set "DMS_FAILED_STEP=HTTP readiness check"
powershell -NoProfile -NonInteractive -Command "$url='http://127.0.0.1:'+$env:DMS_HOST_PORT+'/box-sample/'; for ($i=0; $i -lt 30; $i++) {try {$r=Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 5; if ($r.StatusCode -eq 200 -and $r.Headers['X-DMS-Deployment'] -eq 'box-sample') {exit 0}} catch {}; Start-Sleep -Seconds 2}; exit 1"
if errorlevel 1 goto failed
set "DMS_FAILED_STEP=Caddy service route and public URL verification"
powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "%DMS_DEPLOY_SOURCE%\deployment\configure-caddy.ps1"
if errorlevel 1 goto failed
docker compose -p drawing-model-studio --project-directory "%DMS_DEPLOY_SOURCE%" -f "%DMS_COMPOSE_FILE%" ps
del /q "%DMS_COMPOSE_FILE%"
echo HTTP page responds on server port %DMS_HOST_PORT%.
echo Direct server URL: http://10.14.12.22:%DMS_HOST_PORT%/box-sample/
echo Verified public URL: %DMS_SERVICE_URL%/
echo AI login is recognized. Network access, DWG conversion and actual model generation need separate verification.
echo Keep codex-auth.json and gitea-token.txt private. Never commit or publicly share them.
echo This script does not configure HTTPS, firewall rules or automatic Gitea triggers.
start "" "%DMS_SERVICE_URL%/"
pause
exit /b 0
:failed
echo FAILED: %DMS_FAILED_STEP%.
echo No data volume was deleted. No automatic rollback was attempted.
echo If container start failed, inspect Docker status/logs before retrying.
if defined DMS_COMPOSE_FILE if exist "%DMS_COMPOSE_FILE%" del /q "%DMS_COMPOSE_FILE%"
pause
exit /b 1
:help
echo Usage: deploy-server.bat
echo Run on a Windows deployment server with Git, PowerShell and Docker Compose.
echo Uses Docker Linux containers and downloads the Gitea default branch.
echo Target server: 10.14.12.22 - published port: 5092 - prefix gateway: 8080.
echo Intended public service: http://10.14.12.22/box-sample/
echo Refuses deployment when the target IP is not assigned to this Windows host.
echo Configures only the /box-sample route through the existing local Caddy admin API.
echo Stops on unavailable administration or conflicting/shared authentication rules.
echo Gitea login reads private gitea-token.txt beside this script. Never commit the token file.
echo First AI setup imports private codex-auth.json into a persistent server-only volume.
echo Updated server AI credentials are preserved on later deployments.
echo Run again to fast-forward the clean deployment clone and rebuild.
echo Keep this file in the same directory between deployments.
echo No automatic deployment occurs when Gitea changes.
exit /b 0
:git_auth
set "DMS_GIT_AUTH_PROMPT=%~1"
powershell -NoProfile -NonInteractive -Command "if ($env:DMS_GIT_AUTH_PROMPT -match '^Username') {[Console]::WriteLine($env:DMS_GITEA_USERNAME); exit 0}; if ($env:DMS_GIT_AUTH_PROMPT -notmatch '^Password') {exit 1}; if (-not (Test-Path -LiteralPath $env:DMS_GITEA_TOKEN_FILE -PathType Leaf)) {exit 1}; $token=[IO.File]::ReadAllText($env:DMS_GITEA_TOKEN_FILE).Trim(); if ([string]::IsNullOrWhiteSpace($token)) {exit 1}; [Console]::WriteLine($token)"
exit /b %errorlevel%