HWSS 로컬 실행 매뉴얼 · 커밋 0628b15a · 2026-10-07 14:42 KST 빌드

로컬 실행 매뉴얼

백엔드를 개인 PC 의 DB·파일로 띄우는 A 모드와 개발서버의 공용 DB·저장소로 띄우는 B 모드를 dev 기준으로 처음부터 끝까지 따라 합니다. 두 모드는 apps/hwss-api/.env 한 파일로 갈아탑니다. 프론트엔드·테스트벤치를 함께 띄우는 법과 Swagger·Grafana·이 문서 사이트의 로컬 접속도 여기 있습니다. 명령 블록 오른쪽 위 복사로 그대로 붙여 넣으세요.

2백엔드 실행 모드
8080 · 3000백엔드 · 프론트
3300테스트벤치
3200Grafana
8788문서 사이트

시작하기

한눈에

백엔드 실행 모드 둘 · 로컬 접속 주소 · 명령은 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 주소와 파일 폴더만 덮어씁니다. 위 탭으로 운영체제를 고르면 아래 모든 명령 블록이 바뀝니다.

로컬 접속 주소

로그인은 어느 모드든 사번 H2016-0071(마이그레이션이 넣는 시드 시스템 관리자) / 비밀번호는 .env 의 AUTH_LOCAL_PASSWORD 값입니다.

시작하기

준비물

한 번만 · 공용 모드는 아래 두 줄이 더 필요

Git아무 버전. git --version
DockerDesktop·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 · pnpmcorepack 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

복사한 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

로그에 The following 1 profile is active: "local", Successfully applied … migrations, Started HwssApiApplication 이 보이면 성공. http://localhost:8080/actuator/health 가 UP 입니다. 테이블은 앱이 기동하면서 Flyway 로 만듭니다.

백엔드

B · 개발서버 공용 — local,dev-shared

SSH 터널 127.0.0.1:15432 → 개발서버 공용 PostgreSQL · SSHFS → apps/hwss-api/runtime/dev-shared/

백엔드는 여전히 내 PC 의 JVM 에서 뜹니다. DB 와 파일만 개발서버 것을 씁니다 — 배포된 앱이 쓰는 hwss-postgres 와는 다른 컨테이너(hwss-postgres-shared, DB hwss_dev)라 배포 앱 데이터와 섞이지 않습니다. 터널과 마운트는 최초 설정 스크립트가 운영체제에 자동 시작으로 등록하므로, 그 뒤로는 VPN 만 켜면 됩니다.

1최초 1회 — Tailscale 연결 후 설정 스크립트

# hwss 저장소 루트에서. Homebrew 필요
chmod +x ./scripts/setup-dev-shared-macos.sh
./scripts/setup-dev-shared-macos.sh
설치macOS: macFUSE + SSHFS(brew install --cask sshfs-mac) · Windows: WinFsp + SSHFS-Win(WinGet). 설치·시스템 확장 승인 창이 뜨면 승인합니다.
SSH 키전용 키 ~/.ssh/hwss_dev_shared_ed25519 와 별칭 hwss-dev-shared(aiuser@10.252.253.115)를 만들고 공개키를 서버에 등록합니다. 이때 SSH 비밀번호를 한 번 입력합니다 — 저장하지 않습니다.
DB 터널127.0.0.1:15432 → 서버 루프백 15432. macOS 는 LaunchAgent, Windows 는 예약 작업 HWSS Dev Shared DB Tunnel 이 끊기면 다시 잇습니다.
SSHFS 마운트서버 /app/hwss-dev-shared 를 hwss-investigation-agent-backend/apps/hwss-api/runtime/dev-shared 에 붙입니다(Windows 는 내부 드라이브를 거쳐 같은 경로에 연결). 아래에 incoming·image-processing·collections 가 보입니다.

macFUSE 첫 설치 시스템 설정에서 확장을 승인하고 재시작을 요구하면 재시작 뒤 같은 스크립트를 다시 실행합니다. Windows 도 WinFsp 직후 드라이브 등록이 실패하면 재시작 후 재실행 — 이미 끝난 단계는 건너뜁니다.

2연결 확인 — 기동 전마다 한 번

nc -vz 127.0.0.1 15432
ls ./hwss-investigation-agent-backend/apps/hwss-api/runtime/dev-shared

포트가 열려 있고(succeeded / TcpTestSucceeded : True) 폴더 세 개가 보이면 준비된 것입니다. 안 되면 Tailscale 부터 봅니다 — §막힐 때.

3.env 를 공용 값으로

A 모드와 같은 apps/hwss-api/.env 에서 네 줄만 다릅니다. 파일 경로(IMAGE_*_ROOT·COLLECTION_STORAGE_ROOT)는 그대로 둬도 됩니다 — dev-shared 프로필이 runtime/dev-shared/… 로 덮어쓰고, 운영체제별 절대 경로를 적을 필요가 없습니다.

SPRING_PROFILES_ACTIVE=local,dev-shared
DB_URL=jdbc:postgresql://127.0.0.1:15432/hwss_dev
DB_USERNAME=hwss_dev
DB_PASSWORD=<공용 DB 비밀번호>
AUTH_JWT_SECRET=local-dev-only-secret-key-32bytes-min
AUTH_LOCAL_PASSWORD=devpass

4서버 기동 — A 모드와 같은 명령

cd hwss-investigation-agent-backend
./gradlew :hwss-api:bootRun

로그에 The following 2 profiles are active: "local", "dev-shared" 가 보여야 공용 모드입니다. dev-shared 프로필은 DB_URL·DB_USERNAME·DB_PASSWORD 에 기본값을 두지 않아, 빠뜨리면 엉뚱한 DB 에 조용히 붙는 대신 기동이 실패합니다.

마이그레이션Flyway 는 공용 DB 에도 기동 때 그대로 적용됩니다. 새 마이그레이션은 A 모드(개인 DB)에서 먼저 검증하고 공용으로 갑니다. dev 에 없는 내 브랜치의 마이그레이션을 공용 DB 에 올리면 다른 사람의 기동이 validate 에서 막힙니다.
공용 파일runtime/dev-shared/ 아래는 개발서버의 실제 폴더입니다. 지우면 모두에게서 사라집니다. 접수 서류 실험은 가급적 내 접수번호로만.
서버 쪽공용 DB 컨테이너·폴더를 서버에 처음 만드는 절차는 docs/guides/dev-shared-server-setup.md. 개발자는 할 일이 없습니다.

백엔드

모드 전환

.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

복사한 뒤 백엔드를 다시 띄우면 끝입니다. 테스트벤치(§테스트벤치)는 이 .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

지금 어느 모드인지는 기동 로그의 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 와 나란히 두는 이유: 연동 계약 파일(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/flowStudio 직접 호출·흐름 실행. 대상은 백엔드 .env 의 Studio 접속 정보에서 읽습니다(없으면 Studio 기능이 꺼집니다).
/guide테스트벤치 자체 사용 가이드(예시 화면 포함). 더 자세한 원리는 저장소 README.md.

로컬 접속

Swagger

백엔드가 떠 있으면 바로 · 모드와 무관

주소

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.

주소

Grafanahttp://localhost:3200 Prometheushttp://localhost:9090
Lokihttp://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

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-desktopDocker 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 dataPrometheus → 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 을 함께 고칩니다. 섹션 제목 옆 말풍선으로 댓글을 남길 수 있습니다.