# Windows 부팅 자동 시작 서비스 (LivekitDev) > 작성: 2026-07-20 > 갱신: 2026-07-26 > 목적: Windows 시작 시 **자동으로 올라오는** LivekitDev 스택·관련 항목 인벤토리 이 머신은 Meet/홈페이지가 **재부팅 후에도 502 없이** 살아 있도록 NSSM 서비스 + 헬스 스케줄 작업으로 상주한다. --- ## 한눈에 보기 | 구분 | 이름 | 트리거 | 포트 / 역할 | 현재 상태 (점검 시점) | |------|------|--------|-------------|----------------------| | Windows 서비스 | **LivekitDevServer** | 부팅 (Automatic) | TCP **7880**, **7881** / UDP **50000–60000** — LiveKit SFU | Running | | Windows 서비스 | **LivekitDevMeet** | 부팅 (**Delayed** Automatic) | TCP **3000** — Next.js Meet | Running | | Windows 서비스 | **LivekitDevCaddy** | 부팅 (Automatic) | TCP **80**, **443**, **7443**, **8443** — TLS·리버스 프록시·홈 정적 | Running | | 작업 스케줄러 | **LivekitDev-Stack-Ensure** | 부팅 +90초, **5분마다** | 중지된 서비스 기동 / 포트 죽으면 재시작 | Ready | | Windows 서비스 | **AudiverisWeb** *(다른 프로젝트)* | 부팅 (Automatic) | TCP **8080** — OMR Web | Running | | 작업 스케줄러 | **AudiverisWeb-Ensure** *(다른 프로젝트)* | 부팅 +1분, 5분마다 | Audiveris 헬스 | Ready | | 작업 스케줄러 | **Start WSL Ubuntu (for Caddy)** | **로그온** | WSL Ubuntu 깨우기 (`/bin/true`) — *레거시* | Ready | | 작업 스케줄러 | **WSL Caddy Autostart** | **로그온** | WSL 안 `systemctl start caddy` — *레거시* | Ready | **Startup 폴더** (공용/사용자): LivekitDev 관련 항목 없음. **레지스트리 Run**: LivekitDev 관련 항목 없음 (보안 클라이언트 등만 존재). --- ## 1. LivekitDev 핵심 서비스 (NSSM) 공통: - 래퍼: `C:\Developments\LivekitDev\tools\nssm\nssm-2.24\win64\nssm.exe` - 계정: **LocalSystem** - 의존: **Tcpip** (Meet는 추가로 **LivekitDevServer**) - 종료 시: NSSM **AppExit → Restart** - SCM 실패 복구: 5s / 15s / 30s 재시작 (`sc failure`) - 로그: `C:\Developments\LivekitDev\logs\` | 서비스 이름 | DisplayName | 시작 유형 | 실행 내용 | |-------------|-------------|-----------|-----------| | `LivekitDevServer` | LivekitDev LiveKit SFU | Automatic | `livekit\bin\livekit-server.exe --config config.yaml --bind 0.0.0.0 --node-ip <공인IP>` (작업 디렉터리 `livekit\`) | | `LivekitDevMeet` | LivekitDev Meet (Next.js) | **Automatic (Delayed)** | `node.exe …\next\dist\bin\next start -p 3000 -H 0.0.0.0` (작업 디렉터리 `meet\`) | | `LivekitDevCaddy` | LivekitDev Caddy (Homepage + Meet edge) | Automatic | `caddy.exe run --config Caddyfile` (작업 디렉터리 루트) | ### Meet 환경 변수 (서비스) 설치 스크립트가 NSSM `AppEnvironmentExtra`로 넣음: - `NODE_ENV=production` - `PORT=3000` - `LIVEKIT_API_KEY=devkey` - `LIVEKIT_API_SECRET=secret` - `LIVEKIT_URL=wss://meet.dev.tictechtoeai.com:7443` pnpm/corepack 미사용 (대화형 Y/n 대기 방지). ### 부팅 순서 (의도) ``` [부팅] ├─ LivekitDevServer (즉시 Automatic) → :7880 ├─ LivekitDevCaddy (즉시 Automatic) → :80/:443/:7443/:8443 └─ LivekitDevMeet (Delayed + DependOn LivekitDevServer) → :3000 └─ +90초 후 LivekitDev-Stack-Ensure 가 한 번 더 점검 ``` Caddy는 백엔드보다 먼저 떠도 되며, 그때 Meet/LiveKit이 아직 없으면 일시 502가 날 수 있다. Ensure 작업이 보완한다. --- ## 2. 헬스 체크 작업 | 항목 | 값 | |------|-----| | 작업 이름 | `LivekitDev-Stack-Ensure` | | 실행 | `powershell.exe -File C:\Developments\LivekitDev\scripts\ensure_stack.ps1` | | 계정 | **SYSTEM** (Highest) | | 트리거 1 | **At startup**, Delay **PT90S** (90초) | | 트리거 2 | 5분 간격 반복 (장기) | | 로그 | `logs\ensure-stack.log` | 동작 요약 (`ensure_stack.ps1`): 1. `LivekitDevServer` → `LivekitDevMeet` → `LivekitDevCaddy` 순으로 Stopped면 `Start-Service` 2. 서비스는 Running인데 포트가 닫혀 있으면 `Restart-Service` - 7880 (Server), 3000 (Meet), 443 (Caddy) 수동 실행: ```powershell C:\Developments\LivekitDev\start_all_services.bat # 또는 powershell -NoProfile -ExecutionPolicy Bypass -File C:\Developments\LivekitDev\scripts\ensure_stack.ps1 ``` --- ## 3. 공개 URL (서비스가 살아 있을 때) | URL | 용도 | 뒷단 | |-----|------|------| | https://dev.tictechtoeai.com/ | 홈 (정적) | Caddy → `homepage/dist` | | https://meet.dev.tictechtoeai.com/ | Meet UI | Caddy → `127.0.0.1:3000` | | wss://meet.dev.tictechtoeai.com:7443 | LiveKit 시그널 | Caddy → `127.0.0.1:7880` | | http://127.0.0.1:7880/ | LiveKit 헬스 (`OK`) | 직접 | --- ## 4. 방화벽 (설치 시 생성) `install_stack_services.ps1`이 없으면 생성: | 규칙 이름 | 포트 | |-----------|------| | LivekitDev-FW-TCP-80 | 80 | | LivekitDev-FW-TCP-443 | 443 | | LivekitDev-FW-TCP-7443 | 7443 | | LivekitDev-FW-TCP-8443 | 8443 | | LivekitDev-FW-TCP-7880 | 7880 | | LivekitDev-FW-TCP-7881 | 7881 | | LivekitDev-FW-TCP-3000 | 3000 | | LivekitDev-FW-UDP-50000-60000 | 50000–60000 UDP | --- ## 5. 자동 시작 안 하는 것 (수동) | 구성 요소 | 비고 | |-----------|------| | **avatar_bot** | Python 수동 (`avatar_bot/avatar_bot.py`) | | **Wav2Lip / SadTalker** | 오프라인 생성 파이프라인, 상주 아님 | | **Flutter `livekit_video_call`** | 정적 빌드 산출물; Caddy가 파일만 서빙 (프로세스 없음) | | **docs-site (Astro)** | 개발용 `npm run dev` 만, 서비스 아님 | | **ComfyUI** | 이 스택과 무관, 별도 | --- ## 6. 같은 머신 관련 자동 시작 (LivekitDev 밖) ### AudiverisWeb (VisionIvyDev) | 항목 | 값 | |------|-----| | 서비스 | `AudiverisWeb` — Automatic, Running | | 포트 | **8080** (`audiveris-web-*.jar`) | | 헬스 작업 | `AudiverisWeb-Ensure` — 부팅 +1분, 5분마다 | | 스크립트 | `C:\Developments\VisionIvyDev\audiverisdev\audiveris-web\ensure_service.ps1` | | NSSM 바이너리 | LivekitDev 트리의 `tools\nssm\...` 를 공유 사용 중 | LivekitDev 문서 범위 밖이지만, **부팅 시 같이 올라오는** 개발 서비스이므로 인벤토리에 표기. ### 레거시: WSL Caddy (로그온 시) | 작업 | 트리거 | 동작 | |------|--------|------| | `Start WSL Ubuntu (for Caddy)` | 사용자 로그온 | `wsl -d Ubuntu -u root --exec /bin/true` | | `WSL Caddy Autostart` | 사용자 로그온 | WSL 안에서 `systemctl start caddy` + sleep 유지 | 현재 프로덕션 에지는 **Windows 네이티브 `LivekitDevCaddy`** 이다. WSL Caddy 작업은 **예전 구성 잔존**일 수 있다. 포트 80/443 충돌이 나면 이 작업들을 비활성화 검토: ```powershell Disable-ScheduledTask -TaskName 'WSL Caddy Autostart' Disable-ScheduledTask -TaskName 'Start WSL Ubuntu (for Caddy)' ``` (비활성화 전에 WSL 쪽 Caddy가 실제로 바인딩하는지 확인.) --- ## 7. 설치 / 재설치 (관리자) ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File C:\Developments\LivekitDev\scripts\install_stack_services.ps1 ``` 이 스크립트가 하는 일: 1. NSSM으로 세 서비스 설치(재설치) + 로그 로테이션 + 자동 재시작 2. Meet Delayed Auto + LiveKit 의존 3. SCM failure recovery 4. 방화벽 규칙 5. `LivekitDev-Stack-Ensure` 작업 등록 (구 homepage 전용 작업 제거) 6. 서비스 즉시 기동 관련 파일: | 경로 | 역할 | |------|------| | `scripts/install_stack_services.ps1` | 설치·재설치 | | `scripts/ensure_stack.ps1` | 헬스/복구 | | `scripts/install_caddy_service.ps1` | Caddy만 (구형/부분) | | `start_all_services.bat` | Ensure 수동 실행 + 상태 출력 | | `start_all.bat` | **구형** 일괄 배치 (경로 D:\ 주의) — 상주 구성 이후에는 `start_all_services.bat` 권장 | --- ## 8. 일상 점검 명령 ```powershell # 서비스 상태 Get-Service LivekitDevServer, LivekitDevMeet, LivekitDevCaddy | Format-Table Name, Status, StartType # 작업 Get-ScheduledTask LivekitDev-Stack-Ensure | Get-ScheduledTaskInfo # 리슨 포트 Get-NetTCPConnection -State Listen -LocalPort 80,443,3000,7443,7880,7881 | Select-Object LocalPort, OwningProcess | Sort-Object LocalPort # 공개 curl.exe -sI https://meet.dev.tictechtoeai.com/ curl.exe -s "https://meet.dev.tictechtoeai.com/api/connection-details?roomName=t&participantName=p" ``` 재시작: ```powershell Restart-Service LivekitDevServer Restart-Service LivekitDevMeet Restart-Service LivekitDevCaddy ``` --- ## 9. 코드 수정 후 ```powershell # Meet cd C:\Developments\LivekitDev\meet pnpm build Restart-Service LivekitDevMeet # Homepage (Caddy file_server가 dist 직접 읽음 — 재시작 선택) cd C:\Developments\LivekitDev\homepage npm run build # LiveKit 설정/바이너리 교체 후 Restart-Service LivekitDevServer ``` --- ## 10. 과거 장애 메모 | 현상 | 원인 | |------|------| | 외부 Meet 502 | Caddy만 살아 있고 Meet(:3000)·LiveKit(:7880) 종료 | | 수동 기동 후 사라짐 | 터미널/에이전트 Job에 묶인 자식 프로세스 종료 | | pnpm 서비스 멈춤 | Corepack 대화형 Y/n 대기 → **node next start** 로 전환 | 방화벽·DNS·TLS는 정상인데 Meet만 502인 경우가 위와 같았다. 상주 서비스 + Ensure로 완화. --- ## 11. 체크리스트 (재부팅 후) - [ ] `Get-Service LivekitDev*` 세 개 모두 **Running** - [ ] `:443`, `:3000`, `:7880` LISTEN - [ ] https://meet.dev.tictechtoeai.com/ 200 - [ ] connection-details API 응답 - [ ] (선택) `logs\ensure-stack.log` 최근 줄에 `ok=True` - [ ] (선택) WSL Caddy 작업이 네이티브 Caddy와 충돌하지 않는지