클로드 코드 + NAS 운영 가이드
Mac Studio · Synology 2대 · 자체 호스팅 인프라
최종 갱신: 2026-05-11
1. 시스템 개요
1.1 핵심 자산
| 자산 | 역할 | 위치 |
| Mac Studio | 주 작업기, 클로드 코드 운영, 자동화 스크립트 호스트 | 로컬 |
| NAS 1 — sysadcom (RS822+) | 웹 호스팅, 24/7 서비스, Docker 메인 | 외부 도메인 sysadcom.dscloud.me |
| NAS 2 — live79bambu (RS815+) | 대용량 저장(영화), 백업 | 외부 도메인 live79bambu.dscloud.me |
1.2 NAS 스펙 비교
| 항목 | sysadcom (메인) | live79bambu (서브) |
| 모델 | RS822+ (2022) | RS815+ (2015) |
| CPU | AMD Ryzen V1500B (Zen, 4코어 2.2GHz) | Intel Atom C2538 (4코어 2.4GHz) |
| RAM | 32 GB | 2 GB |
| 저장 용량 | 37 TB | 14 TB |
| DSM 버전 | 7.3.2 | 7.1.1 |
| 인터넷 회선 | 1 Gbps | 10 Gbps |
| 외부 노출 포트 | 80 (HTTP), 5001 (DSM) | 5001 (DSM) |
| 실측 다운로드 속도 | ~561 Mbps | ~679 Mbps |
2. 호스팅된 웹사이트 (sysadcom)
2.1 사이트 인벤토리
| 호칭 | NAS 경로 | URL | 용도 |
| 보안 2급 | /web/portfolio/ | http://sysadcom.dscloud.me/portfolio/ | 토스 포트폴리오 실시간 보고서 |
| 로네 (Ronnefeldt) | /web/Ronnefeldt/ | http://sysadcom.dscloud.me/Ronnefeldt/ | 로네펠트 선릉점 직원 관리 SPA |
| 라이브 (Office Live) | /web/Office Live/ | http://sysadcom.dscloud.me/Office%20Live/ | HLS 라이브 스트리밍 (LG UltraFine 카메라) |
| 댄스 | /web/dance/ | http://sysadcom.dscloud.me/dance/ | 댄스 관련 (용도 미상) |
2.2 보안 2급 (토스 포트폴리오)
사용자: 배은광 — 한국 주식 투자자 (한국투자증권 A 계좌, 토스증권 B 계좌)
데이터 흐름
토스 watchlists 페이지 (Tampermonkey 오버레이)
↓ 10초마다 가격 읽기
iCloud Drive (~/Library/Mobile Documents/com~apple~CloudDocs/Code Claude/보안 2급/)
├── portfolio_data.json
└── daily.json
↓ launchd 30초마다 sync (~/bin/sync-icloud-to-nas.sh)
NAS sysadcom — Web Station
└── /web/portfolio/
↓ HTTP fetch
보고서: http://sysadcom.dscloud.me/portfolio/
구성 파일
index.html — 메인 (보유 + Daily P&L + 카드 링크)
trades-history.html — 매매 내역
cashflow.html — 현금 흐름
daily-pl.html — 일별 P&L + 차트
trades.html — 거래 입력 (NAS 로그인)
bo-an-2-geum-icloud.user.js — Tampermonkey 오버레이 (~32KB)
portfolio_data.json / trades.json / daily.json — 데이터 (로컬이 원본)
보안 2급.html — 오버레이가 10초마다 자동 생성하는 시점 스냅샷
주요 디자인 결정
- 시간대: 한국 시간(KST = UTC+9)
- 언어: 종목명 한글, 나머지 영어
- 시작 손익 0: 평단을 현재가로 박아 시작 시점 손익 0
- Daily P&L: 전일 대비 (토스의 change% 사용)
- 매매 수익: 평균단가법으로 매도 시점에 매칭
- 현금 흐름: 단순 거래금만 (수수료 무시)
2.3 Ronnefeldt (로네펠트 선릉점 직원 관리)
타입: 단일 HTML SPA (~140KB), 한국어, 클라이언트 사이드 저장(localStorage)
주요 기능
- 관리자 비밀번호 로그인 (개발 중엔 우회)
- Today's Schedule — 오늘의 직원 시프트 + 시간 막대 그래프 + 현재 시간 표시 (펄스 애니메이션 + "지금" 라벨)
- Schedule — 월 단위 달력 (PC: 직원 이름 칩, 모바일: 점), 날짜 선택 시 그날 직원 시프트 카드 (시프트 바 그래픽 포함)
- 휴무 신청 — 직원이 본인 이름 버튼 클릭 → 날짜·사유 입력. 관리자/대표가 ✓/✗ 승인. X 버튼으로 본인이 취소도 가능
- 업무 체크리스트 — 오픈/미들/마감 별
- 인수인계 메모
- 공지/채팅 + 빠른 템플릿
- 인건비 (시급 × 시간)
- 직원 추가/삭제
권한 시스템
- 대표 (ceo) / 관리자 (manager) / 직원 (staff) 3단계
- 모바일 헤더 로고 또는 사이드바 "선릉 [권한]" 탭 → 권한 순환 변경 (대표 → 관리자 → 직원 → 대표)
- 토스트 알림으로 변경된 권한 표시
배포 전략 (B+C 조합)
자동 백업 + 클라이언트 자동 페일오버
~/bin/ronnefeldt-deploy.sh 가 배포 직전에 현재 NAS index.html → ronnefeldt-pro.html로 자동 백업
- index.html 맨 위에 페일오버 스크립트 — JS 에러나 5초 init 타임아웃 시 자동으로 ronnefeldt-pro.html로 redirect
- 실패 시 1줄로 수동 복구 가능:
cp ronnefeldt-pro.html index.html
2.4 Office Live (HLS 라이브 스트림)
| 구성 | 내용 |
| 소스 | LG UltraFine 카메라 + 디스플레이 마이크 |
| 인코딩 | H.264 720p @15fps + AAC stereo 48kHz |
| 세그먼트 | 2초 단위 .ts, 5개 rolling window (delete_segments) |
| 워터마크 | 좌하단 실시간 시각 |
| 운영 스크립트 | ~/bin/live-stream.sh (launchd 24/7), ~/bin/live-record-daemon.sh (트리거 녹화) |
| 자동 청소 | ~/bin/live-cleanup.sh — launchd 1시간 주기, 5분+ 묵은 .ts 일괄 삭제 |
| 외부 시청 URL | http://sysadcom.dscloud.me/Office%20Live/ |
오디오 함정: LG UltraFine 마이크는 native mono 48kHz. ffmpeg 입력 단에 -ac 2 -ar 44100 강제하면 0 채널 빈 오디오로 출력됨. 입력은 그대로 받고 출력 단에서만 -ac 2 -ar 48000 변환할 것.
3. 자동화 / launchd 인프라
3.1 토스 자동 로그인
| 스크립트 | 역할 |
~/bin/toss-prefill.sh | 토스 signin 폼 자동 채우기 (이름, 생년월일, 주민첫글자, 휴대폰, 통신사, 약관 마스터) |
~/bin/toss-prefill-cg.py | CGEvent 기반 입력 (잠금화면/원격 환경 우회용) |
~/bin/toss-watchdog.sh | launchd 60초 주기, 로그아웃 감지 시 prefill 자동 재실행, SMS rate limit 회피 5분 cooldown |
~/bin/toss-health-check.sh | launchd 2시간 주기, 탭/오버레이/데이터 sync 상태 점검 + 자동 복구 |
~/bin/toss-popup-daemon.sh | Chrome OTP 자동완성 popup 좌표 클릭 |
~/bin/toss-icloud-folder.sh | 오버레이 "iCloud 폴더 선택" 클릭 자동화 (NSOpenPanel) |
중요 함정
- 잠금화면/디스플레이 sleep에서 AppleScript keystroke 막힘 → CGEvent로 우회
- /remote-control 환경에서 idle 카운트 안 됨 → watchdog에서 idle 게이팅 제거
- SMS Continuity popup은 OS-level UI라 잠금 상태에서 표시 안 됨 → Mac 깨어있는 조건 필수
- iCloud 폴더 권한 자동 부여 불가 (한글 경로 IME 분해 함정) → 한 번 수동 + IndexedDB 핸들 자동 복원
3.2 라이브 스트림 인프라
~/Library/LaunchAgents/com.sysadcom.live-stream.plist — ffmpeg 자동 시작/재시작
~/Library/LaunchAgents/com.sysadcom.live-cleanup.plist — 1시간 주기 NAS 청소
- m3u8 정체 감시 watchdog — 15초 동안 갱신 없으면 ffmpeg 강제 종료 → launchd 재시작 트리거
3.3 NAS 동기화
~/bin/sync-icloud-to-nas.sh — 30초마다 iCloud → NAS (portfolio_data.json + daily.json + sync-status.json)
~/Library/LaunchAgents/com.sysadcom.boanusgeum.sync.plist — 30초 주기 트리거
3.4 Ronnefeldt 배포
~/bin/ronnefeldt-deploy.sh
1. NAS의 현재 index.html 다운로드
2. 그것을 ronnefeldt-pro.html로 업로드 (직전 작동 버전 백업)
3. 로컬 index.html을 새 NAS index.html로 업로드
4. 두 URL 모두 health check (HTTP 200)
4. NAS 접근 및 인증
4.1 자격증명 (Keychain)
| 서비스명 | 대상 | 계정 |
nas-portfolio-sync | sysadcom NAS (FileStation/DSM API) | user + pass |
nas-live79bambu | live79bambu NAS | user + pass + host (QuickConnect URL) |
FileStation API 패턴
NAS_HOST="https://sysadcom.dscloud.me:5001"
NAS_USER=$(security find-generic-password -s nas-portfolio-sync -a user -w)
NAS_PASS=$(security find-generic-password -s nas-portfolio-sync -a pass -w)
# Login → SYNO.API.Auth (session=FileStation, format=sid)
# List → SYNO.FileStation.List (folder_path=...)
# Upload → SYNO.FileStation.Upload
4.2 외부 접속 메커니즘
| NAS | 외부 도메인 | 외부 노출 포트 |
| sysadcom | sysadcom.dscloud.me | 80 (Web Station), 5001 (DSM HTTPS) |
| live79bambu | live79bambu.dscloud.me | 5001 (DSM HTTPS만) |
4.3 Tailscale (영화 시청용 가상 망)
- 두 NAS에 Tailscale 패키지 설치됨 (v1.58.2)
- live79bambu Tailscale IP:
100.84.81.75
- sysadcom Tailscale IP: (별도 확인 필요)
- 각 클라이언트(PC/iPhone/Android)에 Tailscale 설치 + 같은 계정 로그인 → SMB-like 접속 가능
4.4 video 공유 (live79bambu)
숨김 공유 — 직원에게 안 보이게 의도 설계
- SMB 브라우저 목록에 안 나타남 (hidden=true)
- 권한: Claude / 배은광만 r/w. 다른 직원 모두 deny
- 직접 경로 접근만 가능:
smb://100.84.81.75/video + Claude/Rz2127vc
- iPhone VLC / Infuse Pro / Windows VLC 모두 위 직접 경로로 접속
영화 폴더 인벤토리
- F1.The.Movie.2025.2160p (4K)
- Game.of.Thrones
- go pro
- Superman.2025.1080p
- 김지웅
5. 클로드 코드 운영 컨벤션
5.1 워크스페이스 (iCloud Drive)
~/Library/Mobile Documents/com~apple~CloudDocs/Code Claude/ 가 마스터 작업 폴더.
Code Claude/
├── CLAUDE.md ← 단일 마스터 인덱스 (한 개 파일 정책)
├── 보안 2급/ ← 토스 포트폴리오 프로젝트
├── Ronnefeldt/ ← 로네펠트 사이트 작업 사본
│ ├── index.html
│ ├── ronnefeldt-pro.html
│ └── img/
└── (PDF 매뉴얼 3개)
5.2 메모리 시스템
- 위치:
~/.claude/projects/-Users-macstudio/memory/
- 인덱스:
MEMORY.md (각 대화 시작 시 자동 로드)
- 유형: user / feedback / project / reference
- 현재 등록된 프로젝트 메모리:
- 클로드 전용 작업 폴더
- NAS web 사이트 4개 + 별칭
- 로네펠트 직원 관리 사이트
- 토스 포트폴리오 시스템
- 토스 원격/잠금 블로커
- 토스 signin 폼 구조
5.3 원격 제어 — /remote-control
- Mac 터미널에서
/remote-control 실행 → claude.ai/code/session_XXX URL 발급
- 휴대폰/다른 PC 브라우저에서 그 URL 열면 같은 세션 이어쓰기 가능
- 한 번에 한 기기만 사용 권장 (충돌 방지)
- 네트워크/슬립으로 끊기면
/remote-control 재실행으로 새 URL 발급
6. 운영 노하우 / 주의사항
6.1 FileVault + 자동 로그인 함정
- FileVault ON 상태에서 무인 부팅 후 외부 CRD 접속 불가 (LaunchAgent는 사용자 세션 필요)
- 옛날에도 "리부팅 후 외부 접속"이 자동으로 된 적은 없음 — 사용자가 부팅 후 로컬 로그인했을 때만 가능
- 완전 무인 외부 접속 원하면: FileVault OFF + 자동 로그인 ON (보안 ↓)
6.2 NAS API 한계
- SYNO.Core.Package.Installation API는 외부 호출 시 403/103 에러 (DSM 보안 강화)
- 패키지 설치는 DSM UI에서 직접 (수동) 필요
- FileStation/공유 폴더 API는 admin 계정으로 정상 작동
6.3 외부 접속 경로별 한계
| 경로 | 한계 |
| QuickConnect | 브라우저 전용. API 자동화 안 됨 |
| DDNS:5001 (DSM) | API 정상. 다만 패키지 설치 등 일부 제한 |
| DDNS:80 (Web Station) | sysadcom만 노출. live79bambu는 라우터 작업 후 가능 |
| Tailscale | SMB/IP 직접 접근. 모든 포트 사용 가능 |
6.4 트랜스코딩 vs 직재생
- live79bambu CPU(Atom)는 트랜스코딩 무리
- 해결: 클라이언트 측에서 모든 코덱 native 재생 (Infuse Pro / VLC)
- 트랜스코딩 자체를 피하면 CPU 무관, 10Gbps 네트워크 풀 활용
7. 자주 쓰는 명령
토스 동기화 로그
tail -f ~/Library/Logs/sync-icloud-to-nas.log
tail -f ~/Library/Logs/toss-watchdog.log
tail -f ~/Library/Logs/toss-health-check.log
tail -f ~/Library/Logs/live-stream.log
tail -f ~/Library/Logs/live-cleanup.log
NAS 데이터 확인
curl -s "http://sysadcom.dscloud.me/portfolio/portfolio_data.json" | python3 -m json.tool
curl -s "http://sysadcom.dscloud.me/portfolio/trades.json" | python3 -m json.tool
Ronnefeldt 배포
~/bin/ronnefeldt-deploy.sh
localStorage 리셋 (오버레이 코드 변경 후)
// 토스 페이지 F12 → Console
localStorage.removeItem('_portfolio_holdings');
localStorage.removeItem('_portfolio_buy_prices');
이전 세션 이어가기
claude --resume <session-id>
# 세션 파일 위치: ~/.claude/projects/-Users-macstudio/*.jsonl
8. 라이브 사이트 URL 모음
| 사이트 | URL |
| 📊 보안 2급 (포트폴리오) | http://sysadcom.dscloud.me/portfolio/ |
| 🍵 로네펠트 직원 관리 | http://sysadcom.dscloud.me/Ronnefeldt/ |
| 📺 Office Live (라이브 스트림) | http://sysadcom.dscloud.me/Office%20Live/ |
| 💃 dance | http://sysadcom.dscloud.me/dance/ |
| 🎬 영화 (Tailscale 후) | smb://100.84.81.75/video |
| 🔧 sysadcom DSM | https://sysadcom.dscloud.me:5001 |
| 🔧 live79bambu DSM | https://live79bambu.dscloud.me:5001 |
이 문서는 클로드 코드와 함께한 작업 이력을 종합한 것입니다. 변경사항은 Code Claude/CLAUDE.md의 "최근 작업" 섹션과 메모리 시스템에서 추적됩니다.