## 들어가며
재택근무나 분산 처리 환경에서 집에 있는 PC를 작업 서버로 활용하고 싶은 경우가 있습니다. 특히 Windows 환경에서 Node.js 기반 워커 프로세스를 안정적으로 운영하려면 몇 가지 까다로운 문제를 해결해야 합니다. 이 글에서는 실제 운영 환경에서 검증된 원격 워커 설정 방법을 공유합니다.
## 기본 아키텍처
원격 PC를 작업 서버로 활용하기 위한 기본 구조는 다음과 같습니다:
```
원격 PC (VPN 연결)
→ 중앙 프록시 서버
→ 메시지 큐 (Kafka 등)
→ 데이터베이스 (PostgreSQL 등)
```
이 구조에서 핵심은 **안전한 VPN 연결**과 **프로세스 자동 재시작**입니다.
## VPN 선택: Tailscale을 추천하는 이유
Tailscale은 WireGuard 기반의 제로 설정 VPN으로, 다음과 같은 장점이 있습니다:
- NAT 뒤에 있는 PC도 P2P 연결 가능
- 별도의 포트포워딩 설정 불필요
- 각 기기마다 고정 내부 IP 할당 (100.x.x.x 대역)
- 무료 플랜으로도 충분히 활용 가능
## Windows에서 PM2 자동 시작의 함정
Linux에서는 `pm2 startup` 명령으로 쉽게 자동 시작을 설정할 수 있지만, **Windows는 다릅니다**.
### 실패하는 방법: pm2-windows-service
`pm2-installer-win64.exe`나 `pm2-windows-service`를 사용하면 서비스 등록은 되지만 실제로는:
- 서비스가 시작되어도 프로세스가 보이지 않음
- SSH로 접속 시 PM2 상태 확인 불가
- 사용자 세션과 서비스 세션이 분리되어 관리 어려움
### 성공하는 방법: Task Scheduler + PM2_HOME 환경변수
다음 접근 방식이 훨씬 안정적입니다:
```powershell
# 1. PM2_HOME 전역 설정
[System.Environment]::SetEnvironmentVariable(
'PM2_HOME',
'C:\ProgramData\pm2',
[System.EnvironmentVariableTarget]::Machine
)
# 2. Task Scheduler에 시작 작업 등록
$action = New-ScheduledTaskAction -Execute 'pm2' -Argument 'resurrect'
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -RunLevel Highest
Register-ScheduledTask -TaskName 'PM2_Startup' `
-Action $action `
-Trigger $trigger `
-Principal $principal
```
**핵심 포인트**:
- `PM2_HOME`을 `C:\ProgramData\pm2`로 설정하면 모든 사용자 세션에서 동일한 PM2 인스턴스 공유
- Task Scheduler는 Windows Service보다 권한 및 환경변수 관리가 용이
- `pm2 save` 후 `pm2 resurrect`로 재부팅 시 프로세스 복원
## 자동화 스크립트 예시
실제 운영에서 사용하는 PowerShell 설치 스크립트 구조:
```powershell
param(
[Parameter(Mandatory=$true)]
[string]$WorkerType,
[Parameter(Mandatory=$true)]
[string]$WorkerId
)
# 1. 필수 소프트웨어 확인
if (-not (Get-Command node -ErrorAction SilentlyContinue)) {
Write-Error "Node.js가 설치되지 않았습니다"
exit 1
}
# 2. PM2 전역 설치
npm install -g pm2
# 3. 워커 프로세스 시작
pm2 start worker.js --name $WorkerId
pm2 save
# 4. Task Scheduler 등록
# (위의 코드 사용)
Write-Host "설치 완료. 재부팅 후 자동 시작됩니다."
```
## 트러블슈팅 가이드
### PM2 상태가 SSH에서 보이지 않을 때
```powershell
# 매번 세션마다 설정
$env:PM2_HOME = "C:\ProgramData\pm2"
pm2 status
# 또는 PowerShell 프로필에 추가
echo '$env:PM2_HOME = "C:\ProgramData\pm2"' >> $PROFILE
```
### 메시지 처리가 안 될 때
1. VPN 연결 상태 확인: `tailscale status`
2. 프록시 서버 연결 확인: `Test-NetConnection 프록시IP -Port 포트번호`
3. PM2 로그 확인: `pm2 logs --lines 100`
### 인증 오류 발생 시
CLI 도구의 인증은 자동화하기 어려운 경우가 많습니다. 첫 설치 시에는 수동으로 로그인 필요:
```powershell
# 대화형 로그인 (브라우저 팝업)
claude login # 또는 다른 CLI 도구
```
## 결론 및 체크리스트
Windows PC를 원격 워커로 활용하기 위한 핵심 요소:
- ✅ Tailscale 등 안정적인 VPN 연결
- ✅ PM2_HOME을 `C:\ProgramData\pm2`로 전역 설정
- ✅ Task Scheduler로 시작 작업 등록 (Windows Service 사용 금지)
- ✅ `pm2 save`로 프로세스 목록 저장
- ✅ CLI 인증은 최초 1회 수동 수행
이 방식으로 설정하면 재부팅 후에도 자동으로 워커가 시작되며, SSH 접속 시에도 일관된 PM2 상태를 확인할 수 있습니다.
## 다음 단계
- 모니터링: PM2 Plus나 커스텀 헬스체크 구현
- 로그 관리: PM2 로그 로테이션 설정 (`pm2 install pm2-logrotate`)
- 보안 강화: Tailscale ACL로 접근 제어 설정