HWSS 로컬 실행 매뉴얼 · 커밋 0628b15a · 2026-10-07 14:42 KST 빌드
로컬 실행 매뉴얼
백엔드를 개인 PC 의 DB·파일로 띄우는 A 모드와 개발서버의 공용 DB·저장소로 띄우는 B 모드를 dev 기준으로 처음부터 끝까지 따라 합니다. 두 모드는 apps/hwss-api/.env 한 파일로 갈아탑니다. 프론트엔드·테스트벤치를 함께 띄우는 법과 Swagger·Grafana·이 문서 사이트의 로컬 접속도 여기 있습니다. 명령 블록 오른쪽 위 복사로 그대로 붙여 넣으세요.
시작하기
한눈에
백엔드 실행 모드 둘 · 로컬 접속 주소 · 명령은 hwss 저장소 루트 기준(각 블록의 cd 참고)
백엔드 실행 모드
A · 개인 로컬local | 내 PC 의 Docker PostgreSQL(5432)과 내 PC 의 runtime/ 폴더. 평소 개발은 이쪽. 무엇을 지워도 남에게 영향이 없습니다. |
B · 개발서버 공용local,dev-shared | 개발서버의 공용 PostgreSQL(SSH 터널 127.0.0.1:15432)과 개발서버 폴더를 SSHFS 로 마운트한 runtime/dev-shared/. 같은 테스트 데이터·같은 서류를 여러 사람이 볼 때, 공용 DB 에서 마이그레이션을 확인할 때. |
두 모드의 차이는 apps/hwss-api/.env 의 SPRING_PROFILES_ACTIVE 와 DB_* 네 줄뿐입니다. local 은 개발용 로그인 스텁을 켜고, dev-shared 는 DB 주소와 파일 폴더만 덮어씁니다. 위 탭으로 운영체제를 고르면 아래 모든 명령 블록이 바뀝니다.
로컬 접속 주소
http://localhost:3000
Swagger UIhttp://localhost:8080/swagger-ui.html
테스트벤치http://127.0.0.1:3300
Grafanahttp://localhost:3200
문서 사이트http://localhost:8788
http://localhost:8080/api/v1/… — 모드와 상관없이 같은 포트로그인은 어느 모드든 사번 H2016-0071(마이그레이션이 넣는 시드 시스템 관리자) / 비밀번호는 .env 의 AUTH_LOCAL_PASSWORD 값입니다.
시작하기
준비물
한 번만 · 공용 모드는 아래 두 줄이 더 필요
Git | 아무 버전. git --version |
Docker | Desktop·OrbStack·Colima 아무거나(docker CLI 만 쓴다). A 모드의 PostgreSQL 과 Grafana 스택이 컨테이너로 뜬다. docker run --rm hello-world |
JDK 17+ | Temurin 17~21. java -version. macOS: brew install --cask temurin@21 |
Node 22 · pnpm | corepack enable 하면 pnpm 은 자동 설치. 프론트엔드·테스트벤치가 쓴다 |
python3 | 문서 사이트 빌드(§문서 사이트). macOS 기본 포함 |
TailscaleB 모드 | 개발서버(10.252.253.115)에 닿는 VPN. 공용 모드는 VPN 없이는 뜨지 않는다 |
| SSH 비밀번호 · 공용 DB 비밀번호B 모드 | 개발서버 aiuser 계정의 비밀번호는 최초 설정 때 공개키 등록에 한 번만 쓴다. 공용 DB 비밀번호는 .env 에 적는다. 둘 다 팀의 승인된 경로로 받고 Git 에 넣지 않는다 |
시작하기
코드 받기 — dev 기준
기본 브랜치는 dev · 두 모드 모두 dev 에 들어 있다
# 처음 git clone https://github.com/fdxchatgpt/hwss-investigation-agent.git hwss cd hwss # 이미 받아 둔 경우 — dev 최신으로 git fetch origin git switch dev git pull --ff-only
아래의 모든 경로는 이렇게 받은 hwss 폴더를 기준으로 합니다. 다른 이름으로 받았다면 경로의 hwss 만 바꾸면 됩니다.
백엔드
A · 개인 로컬 — local
내 PC 의 PostgreSQL 컨테이너 + 내 PC 의 runtime/ 폴더
1PostgreSQL 띄우기
cd hwss-investigation-agent-backend
docker compose up -d # postgres:16 · DB/계정/비밀번호 모두 hwss · 5432
5432 를 다른 PostgreSQL 이 이미 쓰고 있으면(기동 로그에 role "hwss" does not exist) 컨테이너를 5433 으로 띄우고 아래 .env 의 DB_URL 포트를 5433 으로 바꿉니다 — §막힐 때.
2.env 만들기
cd hwss-investigation-agent-backend cp apps/hwss-api/.env.example apps/hwss-api/.env
cd hwss-investigation-agent-backend Copy-Item apps\hwss-api\.env.example apps\hwss-api\.env
복사한 apps/hwss-api/.env 를 열어 꺾쇠 자리를 채웁니다. 개인 로컬 값은 이렇습니다.
SPRING_PROFILES_ACTIVE=local DB_URL=jdbc:postgresql://127.0.0.1:5432/hwss DB_USERNAME=hwss DB_PASSWORD=hwss IMAGE_INCOMING_ROOT=runtime/incoming IMAGE_PROCESSING_ROOT=runtime/image-processing COLLECTION_STORAGE_ROOT=runtime/collections AUTH_JWT_SECRET=local-dev-only-secret-key-32bytes-min AUTH_LOCAL_PASSWORD=devpass
.env 는 Git 에서 제외돼 있고, 백엔드가 뜰 때 알아서 읽습니다(spring.config.import). DB_PASSWORD·AUTH_JWT_SECRET 은 기본값이 일부러 없어서 빠뜨리면 기동이 실패합니다. 상대 경로 runtime/… 은 apps/hwss-api/ 아래에 생깁니다.
3서버 기동
cd hwss-investigation-agent-backend ./gradlew :hwss-api:bootRun
cd hwss-investigation-agent-backend .\gradlew.bat :hwss-api:bootRun
로그에 The following 1 profile is active: "local", Successfully applied … migrations, Started HwssApiApplication 이 보이면 성공. http://localhost:8080/actuator/health 가 UP 입니다. 테이블은 앱이 기동하면서 Flyway 로 만듭니다.
백엔드
모드 전환
.env 를 둘 만들어 두고 복사 한 줄로 · 또는 한 번만 띄울 때는 환경변수로 덮어쓰기
.env 두 벌 두기 — 권장
apps/hwss-api/ 의 .env.* 는 .env.example 만 빼고 전부 Git 에서 제외됩니다. 모드별 파일을 하나씩 만들어 두고 쓸 것을 .env 로 복사합니다. 백엔드는 .env 만 읽습니다.
cd hwss-investigation-agent-backend/apps/hwss-api # 처음 한 번 — 지금 .env(개인 로컬 값)를 보관하고, 공용 값 파일을 만든다 cp .env .env.local-mode cp .env .env.dev-shared # 열어서 B 모드 네 줄로 고친다 # 공용 모드로 cp .env.dev-shared .env # 개인 로컬로 cp .env.local-mode .env
cd hwss-investigation-agent-backend\apps\hwss-api # 처음 한 번 — 지금 .env(개인 로컬 값)를 보관하고, 공용 값 파일을 만든다 Copy-Item .env .env.local-mode Copy-Item .env .env.dev-shared # 열어서 B 모드 네 줄로 고친다 # 공용 모드로 Copy-Item .env.dev-shared .env -Force # 개인 로컬로 Copy-Item .env.local-mode .env -Force
복사한 뒤 백엔드를 다시 띄우면 끝입니다. 테스트벤치(§테스트벤치)는 이 .env 를 읽으므로 같이 따라옵니다 — 두 파일을 환경 프로필로 등록해 두면 테스트벤치 쪽은 재시작도 필요 없습니다.
한 번만 — 환경변수로 덮어쓰기
OS 환경변수와 명령행 인자가 .env 보다 우선합니다. .env 는 개인 로컬인 채로 두고 이번 기동만 공용으로 띄울 때.
cd hwss-investigation-agent-backend SPRING_PROFILES_ACTIVE=local,dev-shared \ DB_URL=jdbc:postgresql://127.0.0.1:15432/hwss_dev \ DB_USERNAME=hwss_dev \ DB_PASSWORD=<공용 DB 비밀번호> \ ./gradlew :hwss-api:bootRun
cd hwss-investigation-agent-backend $env:SPRING_PROFILES_ACTIVE="local,dev-shared" $env:DB_URL="jdbc:postgresql://127.0.0.1:15432/hwss_dev" $env:DB_USERNAME="hwss_dev" $env:DB_PASSWORD="<공용 DB 비밀번호>" .\gradlew.bat :hwss-api:bootRun
지금 어느 모드인지는 기동 로그의 profiles are active 줄, 또는 테스트벤치 상단 바의 DB 표시(hwss@127.0.0.1:5432/hwss vs hwss_dev@127.0.0.1:15432/hwss_dev)로 압니다. Windows 의 $env: 값은 그 PowerShell 창이 닫힐 때까지 남으니 개인 로컬로 돌아갈 때는 새 창을 엽니다.
함께 띄우기
프론트엔드
모드와 무관 — 백엔드 8080 만 보고 있으면 된다 · 명령은 hwss-investigation-agent-frontend/ 에서
cd hwss-investigation-agent-frontend
corepack enable
pnpm install
pnpm dev # http://localhost:3000
http://localhost:3000 으로 열면 /login 으로 갑니다. 사번 H2016-0071 / 비밀번호는 .env 의 AUTH_LOCAL_PASSWORD. 브라우저는 같은 오리진의 /api/v1 만 부르고 Next.js 가 BACKEND_ORIGIN(기본 http://localhost:8080)으로 넘기므로, 백엔드가 A·B 어느 모드든 프론트는 손댈 것이 없습니다.
pnpm dev --port 3100 | 프로토타입(hwss-investigation-agent-prototype, 역시 3000)도 함께 띄울 때. 테스트벤치의 「원본 앱에서 열기」 주소(TESTBENCH_APP_URL)도 같이 맞춥니다. |
NEXT_PUBLIC_API_MOCKING=enabled pnpm dev | 백엔드 없이 — MSW 가 /api/v1 요청을 가로채 계약 모양의 목 응답을 줍니다. |
| 더 자세히 | 프론트엔드 가이드 · 로컬 실행 — 환경변수·pnpm 명령 전체. |
함께 띄우기
파이프라인 테스트벤치
별도 저장소 fdxchatgpt/hwss-pipeline-testbench · 기본 브랜치 dev · http://127.0.0.1:3300
접수 → 분류 → 추출 → 요약을 사건 단위로 되돌려 가며 반복하는 개발자 도구입니다. 백엔드의 DB 와 파일 폴더를 직접 읽고 고치므로, 백엔드가 쓰는 것과 같은 DB·같은 폴더를 보게 하는 것이 전부입니다. 그 방법은 백엔드 .env 파일 하나를 가리키는 것입니다.
1받아서 띄우기 — hwss 옆에
# hwss 와 같은 상위 폴더에서 git clone https://github.com/fdxchatgpt/hwss-pipeline-testbench.git cd hwss-pipeline-testbench cp .env.example .env.local pnpm install pnpm dev # http://127.0.0.1:3300
# hwss 와 같은 상위 폴더에서 (백엔드 env 파일을 bash 로 읽으므로 Git for Windows 의 bash 가 PATH 에 있어야 한다) git clone https://github.com/fdxchatgpt/hwss-pipeline-testbench.git cd hwss-pipeline-testbench Copy-Item .env.example .env.local pnpm install pnpm dev # http://127.0.0.1:3300
hwss 와 나란히 두는 이유: 연동 계약 파일(docs/specs/contracts/image-system-api.yaml)을 기본으로 ../hwss 에서 읽습니다. 다른 곳에 두면 .env.local 에 TESTBENCH_CONTRACT_REPO 로 알려 줍니다.
2.env.local — 백엔드 .env 를 가리킨다
# hwss 를 받은 경로로 바꾼다 TESTBENCH_BACKEND_ENV_FILE=~/IdeaProjects/hwss/hwss-investigation-agent-backend/apps/hwss-api/.env TESTBENCH_BACKEND_URL=http://localhost:8080 TESTBENCH_APP_URL=http://localhost:3000 TESTBENCH_DATA_DIR=~/hwss/testbench
테스트벤치는 이 파일에서 DB_URL·DB_USERNAME·DB_PASSWORD·파일 폴더·AUTH_LOCAL_PASSWORD 를 읽습니다. 화면 오른쪽 위에 지금 붙은 DB 와 백엔드가 항상 표시됩니다. 체크포인트는 TESTBENCH_DATA_DIR 아래 쌓입니다.
3개발 DB·저장소를 바라보게 하기
백엔드 .env 가 B 모드(SPRING_PROFILES_ACTIVE=local,dev-shared)면 테스트벤치도 저절로 공용 DB·저장소를 봅니다. 따로 적을 값이 없습니다.
| DB | .env 의 DB_URL 그대로 — 127.0.0.1:15432/hwss_dev. 터널 주소라 로컬 호스트로 인정됩니다(테스트벤치는 localhost 가 아닌 DB 를 기본 거부합니다 — 서버 IP 를 직접 적지 않습니다). |
| 수신·처리 폴더 | 백엔드의 dev-shared 규칙을 그대로 따릅니다 — DEV_SHARED_IMAGE_*_ROOT 가 있으면 그 값, 없으면 .env 가 있는 폴더 기준 runtime/dev-shared/incoming·runtime/dev-shared/image-processing(= SSHFS 마운트). 「환경」 화면의 수신 폴더 칸에서 풀린 경로를 확인합니다. |
| 상단 바 | hwss_dev@127.0.0.1:15432/hwss_dev 로 바뀌어 있으면 된 것입니다. |
두 모드를 번갈아 쓸 때는 §모드 전환의 .env.local-mode·.env.dev-shared 를 환경 프로필로 등록해 둡니다 — 「환경」 화면의 「+ 환경 추가」 에서 env 파일 경로를 적거나, 앱 폴더의 profiles.local.json 에 아래처럼 둡니다. 「이 환경으로」 를 누르면 재시작 없이 그 DB 로 붙습니다.
{
"profiles": [
{ "id": "local", "label": "개인 로컬",
"backendEnvFile": "~/IdeaProjects/hwss/hwss-investigation-agent-backend/apps/hwss-api/.env.local-mode" },
{ "id": "dev-shared", "label": "개발서버 공용",
"backendEnvFile": "~/IdeaProjects/hwss/hwss-investigation-agent-backend/apps/hwss-api/.env.dev-shared" }
]
}
주의 테스트벤치가 보는 DB 와 백엔드가 떠 있는 DB 는 같아야 합니다. 백엔드는 A 모드인데 테스트벤치만 공용 프로필을 고르면, 되돌린 결과가 화면에 안 보이거나 「실행」 이 엉뚱한 DB 의 사건을 찾습니다. 공용 DB 에서의 복원·되돌리기·사건 삭제는 남의 사건에도 그대로 적용됩니다 — 내 접수번호만 다룹니다. Studio 쪽 상태는 되돌릴 수 없다는 한계는 모드와 무관합니다.
자주 쓰는 것
/ | 사건 목록 — 단계 막대에서 「↺ 다시 실행」, 체크포인트 ☆ 로 테스트셋 지정. |
/intake | 서류 폴더를 골라 접수. 이미지시스템 데모 백엔드(TESTBENCH_IMAGE_DEMO_URL, 기본 18081)가 떠 있어야 합니다 — 띄우는 법은 docs/guides/image-system-demo-run-guide.md. |
/environments | 환경 프로필 추가·전환·「연결 시험」(설정·DB·백엔드·폴더를 한 번에 점검). |
/studio · /studio/flow | Studio 직접 호출·흐름 실행. 대상은 백엔드 .env 의 Studio 접속 정보에서 읽습니다(없으면 Studio 기능이 꺼집니다). |
/guide | 테스트벤치 자체 사용 가이드(예시 화면 포함). 더 자세한 원리는 저장소 README.md. |
로컬 접속
Swagger
백엔드가 떠 있으면 바로 · 모드와 무관
주소
http://localhost:8080/swagger-ui.html
OpenAPI JSONhttp://localhost:8080/v3/api-docs
헬스 체크http://localhost:8080/actuator/health
메트릭http://localhost:8080/actuator/prometheus
Swagger UI 는 /swagger-ui/index.html 로 이동해 열립니다. 세션 없이 열리고, "Try it out" 은 지금 연 호스트로 요청을 보냅니다. 백엔드 가이드의 컨트롤러 행에서 그 태그로 바로 가는 링크도 있습니다.
로그인이 필요한 API 부르기
조사자·관리자 API 는 세션 쿠키가 없으면 401 입니다. Swagger 에서 auth-controller → POST /api/v1/auth/login 을 먼저 실행하면 브라우저가 httpOnly 쿠키를 저장해 이후 요청에 자동으로 붙습니다.
{
"employeeNo": "H2016-0071",
"password": "devpass"
}
시드 시스템 관리자 H2016-0071 은 마이그레이션이 넣으므로 개인 DB 와 공용 DB 양쪽에 있습니다. 비밀번호는 .env 의 AUTH_LOCAL_PASSWORD. 이 로그인은 local 프로필이 켜져 있을 때만 됩니다 — 두 모드 모두 켜져 있습니다.
로컬 접속
Grafana — 관측 스택
선택 · Prometheus · Loki · Alloy 가 함께 뜬다 · 명령은 hwss 저장소 루트에서
1스택 띄우기
docker compose -f infra/observability/docker-compose.yml up -d
백엔드(8080)가 떠 있으면 Prometheus 가 15초마다 /actuator/prometheus 를 당겨가고, 1분 안에 Grafana → HWSS → "HWSS API Overview" 에 처리율·p95 지연·5xx·JVM 힙·Hikari 풀·외부 연동 지표가 그려집니다. 백엔드가 어느 DB 를 쓰든 상관없습니다. 내릴 때는 같은 명령의 down.
주소
http://localhost:3200
Prometheushttp://localhost:9090
http://localhost:3101 — 자체 화면은 없고 Grafana → Explore 에서 봅니다Grafana 계정은 admin / admin(로컬 전용). 데이터소스·대시보드는 프로비저닝돼 있습니다.
2백엔드 로그를 Loki 로 — 선택
bootRun 은 호스트 JVM 이라 컨테이너 로그 수집에 안 잡힙니다. 출력을 runtime/logs/ 로 흘리면 Alloy 가 파일을 읽어 {container="hwss-api"} 라벨로 보냅니다. LOG_FORMAT 은 Logback 이 Spring 보다 먼저 읽으므로 .env 가 아니라 셸 환경변수로 줍니다 — 나머지 값은 .env 가 채웁니다.
mkdir -p hwss-investigation-agent-backend/runtime/logs
cd hwss-investigation-agent-backend
LOG_FORMAT=json ./gradlew -q :hwss-api:bootRun | tee runtime/logs/app.log
New-Item -ItemType Directory -Force hwss-investigation-agent-backend\runtime\logs | Out-Null
cd hwss-investigation-agent-backend
$env:LOG_FORMAT="json"; .\gradlew.bat -q :hwss-api:bootRun | Tee-Object -FilePath runtime\logs\app.log
Grafana → Explore → 데이터소스 Loki → {container="hwss-api"} |= "ERROR". 한 요청의 줄만 보려면 응답 헤더 X-Request-Id 값으로 | json | mdc_requestId="…". 자세한 질의와 구성은 백엔드 가이드 · 관측 스택, 설정 파일은 infra/observability/README.md.
로컬 접속
문서 사이트 — 이 페이지를 로컬에서
python3 + git 만 있으면 된다 · 명령은 hwss 저장소 루트에서
정적 페이지만 — 가장 빠름
bash docs-site/build.sh python3 -m http.server -d docs-site/dist 8788
http://localhost:8788/ 이 홈, 이 매뉴얼은 /local-run/. 가이드는 지금 체크아웃된 코드에서 생성되므로 내 브랜치의 변경이 그대로 반영됩니다. gh 가 없거나 로그인돼 있지 않으면 PR·이슈 표시만 0 으로 나오고 빌드는 됩니다. 테스트 커버리지(/tests/)는 artifact 가 없으면 "측정 데이터 없음" 입니다.
댓글·담당 지정까지 — Wrangler
cp docs-site/.dev.vars.example docs-site/.dev.vars cd docs-site && npx wrangler@3 d1 migrations apply hwss-docs-comments --local cd docs-site && bash build.sh && npx --yes wrangler@3 pages dev --port 8788 --ip 127.0.0.1
로컬 D1 에 댓글이 저장되고, Access 로그인 대신 .dev.vars 의 이메일이 작성자가 됩니다. 운영 사이트는 hwss-docs.pages.dev — dev 머지 때 자동 배포라 PR 단계의 변경은 로컬에서만 확인할 수 있습니다.
docs-site/ 를 고친 PR 은 올리기 전에
node --test docs-site/test/*.test.mjs python3 -m unittest discover -s docs-site/generators -p "test_*.py"
CI 는 dev 머지 때만 돌아 PR 에서는 잡아 주지 않습니다. 구조·설정 전체는 docs-site/README.md.
도움
막힐 때
증상 → 원인 → 조치
role "hwss" does not exist / password authentication failed (A 모드) | 5432 를 다른 PostgreSQL(Homebrew 등)이 쓰고 있어 앱이 그쪽에 붙은 것. 컨테이너를 5433 으로: docker run -d --name hwss-postgres -e POSTGRES_DB=hwss -e POSTGRES_USER=hwss -e POSTGRES_PASSWORD=hwss -p 5433:5432 -v hwss-postgres-data:/var/lib/postgresql/data postgres:16-alpine 후 .env 의 DB_URL 포트를 5433 으로. |
기동 직후 Could not resolve placeholder 'DB_PASSWORD' / 'AUTH_JWT_SECRET' | 일부러 기본값이 없는 값입니다. apps/hwss-api/.env 가 있는지, 꺾쇠 자리를 채웠는지 봅니다. 저장소 루트·백엔드 루트·apps/hwss-api 어디서 띄워도 .env 는 찾습니다. |
127.0.0.1:15432 연결 거부 (B 모드) | ① Tailscale 이 연결돼 있는지 ② ssh hwss-dev-shared true 가 비밀번호 없이 되는지 ③ 터널 자동 시작 — macOS ~/Library/Logs/hwss-dev-shared-db-tunnel.error.log, Windows 작업 스케줄러 HWSS Dev Shared DB Tunnel. 등록이 깨졌으면 최초 설정 스크립트를 다시 실행합니다(끝난 단계는 건너뜁니다). |
runtime/dev-shared 가 비어 있음 (B 모드) | SSHFS 가 떨어진 것. macOS 는 LaunchAgent 가 60초마다 다시 붙입니다(~/Library/Logs/hwss-dev-shared-sshfs.error.log). Windows 는 예약 작업 HWSS Dev Shared Storage Mount. 안 돌아오면 설정 스크립트 재실행. |
Flyway validate 실패 — Detected resolved migration not applied / applied migration not resolved (B 모드) | 공용 DB 의 마이그레이션 이력과 내 코드가 다른 것. 내 브랜치에만 있는 마이그레이션을 공용 DB 에 올렸거나, 다른 사람이 먼저 올렸는데 내 코드가 옛 dev 입니다. git pull 로 dev 최신에 맞추고, 내 마이그레이션은 A 모드에서 검증한 뒤 PR 로 dev 에 넣고 나서 공용으로 갑니다. |
테스트벤치 DB 호스트 … 는 로컬이 아닙니다 | 백엔드 .env 의 DB_URL 에 서버 IP 를 직접 적은 것. 터널 주소 127.0.0.1:15432 를 씁니다. |
테스트벤치 IMAGE_INCOMING_ROOT=runtime/… 는 상대 경로라 쓸 수 없습니다 | 테스트벤치가 옛 버전입니다 — git pull(dev). 최신은 .env 가 있는 폴더 기준으로 풀고 dev-shared 규칙도 따릅니다. 급하면 .env.local 에 TESTBENCH_INCOMING_ROOT·TESTBENCH_PROCESSING_ROOT 를 절대 경로로. |
error getting credentials … docker-credential-desktop | Docker Desktop 을 지운 뒤 ~/.docker/config.json 에 credsStore: desktop 이 남은 것(OrbStack·Colima). macOS: sed -i '' 's/"desktop"/"osxkeychain"/' ~/.docker/config.json 또는 그 줄 삭제. |
프론트 Port 3000 is in use | 프로토타입이 3000 을 쓰고 있는 것. pnpm dev --port 3100. |
Grafana 대시보드 No data | Prometheus → Targets 의 hwss-api 가 DOWN 이면 백엔드가 안 떠 있거나 8080 이 아닙니다(타깃은 host.docker.internal:8080). |
절차의 정본은 docs/guides/dev-shared-local-setup.md(공용 모드)·docs/guides/local-dev-run-guide.md(개인 로컬·이미지시스템 데모)·서버 쪽 준비는 docs/guides/dev-shared-server-setup.md, 두 모드를 이렇게 나눈 근거는 docs/decisions/20261002-local-development-shared-resources.md. 값이 바뀌면 그 문서와 docs-site/generators/local_run_sections.html 을 함께 고칩니다. 섹션 제목 옆 말풍선으로 댓글을 남길 수 있습니다.