클로드 코드 + NAS 운영 가이드

Mac Studio · Synology 2대 · 자체 호스팅 인프라
최종 갱신: 2026-07-08 (Office Live 복구 + 애플에너지 대시보드/자동화/위젯/메모 통합)

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)
CPUAMD Ryzen V1500B (Zen, 4코어 2.2GHz)Intel Atom C2538 (4코어 2.4GHz)
RAM32 GB2 GB
저장 용량37 TB14 TB
DSM 버전7.3.27.1.1
인터넷 회선1 Gbps10 Gbps
외부 노출 포트80 (HTTP), 5001 (DSM)5001 (DSM)
실측 다운로드 속도~561 Mbps~679 Mbps

2. 호스팅된 웹사이트 (sysadcom)

2.1 사이트 인벤토리 + 2중화 URL

호칭NAS 경로메인 (sysadcom)백업 (live79bambu)용도
/web/index.htmlhttp://sysadcom.dscloud.me/— (의도적 미공개)sysadcom 메인 인덱스 (카드형 허브)
보안 2급/web/portfolio/http://sysadcom.dscloud.me/portfolio/http://live79bambu.dscloud.me:8080/portfolio/토스 포트폴리오 실시간 보고서
로네 (Ronnefeldt)/web/Ronnefeldt/http://sysadcom.dscloud.me/Ronnefeldt/http://live79bambu.dscloud.me:8080/Ronnefeldt/로네펠트 선릉점 직원 관리 SPA
기술문서 (Manual, 통합)/web/Manual/http://sysadcom.dscloud.me/Manual/http://live79bambu.dscloud.me:8080/Manual/통합 허브 — 운영 매뉴얼 + 부동산 문서
(구 /web/Dongseon/ 통합 / 2026-05-17)
· index.html 카드 허브
· operation-manual.html 운영 매뉴얼 (이 문서)
· ulsan-sincheon-apartments.html 부동산
라이브 (Office Live)/web/Office Live/http://sysadcom.dscloud.me/Office%20Live/— (라이브 스트림이라 미러 의미 없음)HLS 라이브 스트리밍 (LG UltraFine 카메라)
애플에너지 (수력발전)/web/appleenergy/https://sysadcom.dscloud.me/appleenergy/수력발전 업무일지 대시보드 (2026-07-08 신설)
86 (Toyota86)/web/toyota86/https://sysadcom.dscloud.me/toyota86/토요타86 차량 정비이력 (단일 index.html)
✅ 자동 미러 (2중화)
launchd com.sysadcom.web-mirror.plist30분 주기로 메인 → 백업 NAS 폴더 sync.
대상: portfolio, Manual, Ronnefeldt (Ronnefeldt는 추가로 deploy 직후 즉시 미러).
백업 NAS는 메인 index.html 의도적으로 삭제 — URL 직접 알아야 접근 (실수 노출 방지).
스크립트: ~/bin/sync-web-to-live79.sh · 로그: ~/Library/Logs/sync-web-to-live79.log

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/

구성 파일

주요 디자인 결정

2.3 Ronnefeldt (로네펠트 선릉점 직원 관리)

타입: 단일 HTML SPA (~140KB), 한국어, 클라이언트 사이드 저장(localStorage)

주요 기능

권한 시스템

배포 전략 (B+C 조합)

자동 백업 + 클라이언트 자동 페일오버

2.4 Office Live (HLS 라이브 스트림)

구성내용
소스LG UltraFine 카메라 (장치 이름으로 고정) + 무음 오디오 (anullsrc 합성) — 2026-07-08 재작성
인코딩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 일괄 삭제
외부 시청 URLhttp://sysadcom.dscloud.me/Office%20Live/

ffmpeg 입력부 (2026-07-08 확정 버전)

-f avfoundation -framerate 15 -capture_cursor 0 -i "LG UltraFine 디스플레이 카메라" \
-f lavfi -i "anullsrc=r=48000:cl=stereo" \
-map 0:v -map 1:a
⚠️ 장치 지정 함정 (2026-07 장애 원인 ①): avfoundation 장치를 숫자 인덱스(-i "0:1")로 지정하면 아이폰 연속성 카메라가 붙고 떨어질 때마다 인덱스가 밀려 Invalid audio device index 크래시루프에 빠진다. 반드시 장치 이름 문자열로 지정할 것.
⚠️ LG "디스플레이 오디오"는 마이크가 아니다 (장애 원인 ②): 오디오 장치 목록의 "LG UltraFine 디스플레이 오디오"는 출력(스피커)이라 캡처하면 샘플이 하나도 안 나와 ffmpeg 전체가 무한 hang된다 (세그먼트 0개 → watchdog 무한 재시작). 방송은 원래 무음이므로 anullsrc 무음 합성 트랙으로 대체 — 어떤 오디오 장치에도 의존하지 않아 절대 안 깨진다.
⚠️ LG UltraFine 카메라 하드웨어 wedge (장애 원인 ③): 카메라가 열리고 픽셀포맷 협상까지 되는데 프레임이 0개 나오는 상태. USB 인식 정상, TCC 권한 정상, 데몬 정상 — 순수 하드웨어 먹통. 로그에 "부팅 45초 경과했으나 m3u8 미생성 — 장치 stall"이 반복되면 이 증상. 해결: 모니터 Thunderbolt 케이블 재연결 또는 Mac 재부팅 (카메라 데몬은 root 소유라 소프트웨어 리셋 불가).
✅ 복구 절차 요약 (방송 멈췄을 때)
  1. tail ~/Library/Logs/live-stream.log — 에러 종류 확인
  2. Invalid audio device index → 스크립트가 구버전(인덱스 방식)으로 롤백된 것. 이름 고정 + anullsrc로 수정
  3. m3u8 미생성 stall 반복 + 로컬 /tmp/livestream/에 .ts 없음 → 카메라 wedge → TB 케이블 재연결/재부팅
  4. 복구 검증: ls /tmp/livestream/ 세그먼트 생성 + NAS m3u8 MEDIA-SEQUENCE 전진 + 세그먼트 HTTP 200

(구) 오디오 함정 참고: LG UltraFine 마이크 직접 캡처 시절에는 입력 단 -ac 2 -ar 44100 강제 시 0채널 빈 오디오 문제가 있었음. 현재는 무음 합성으로 전환되어 해당 없음.

2.5 애플에너지 (수력발전 업무일지 대시보드) — 2026-07-08 신설

배경: 애플에너지(주) = 수력발전소 운영사 (발전기 5호기). 2019.09부터 일별 업무일지 xlsx 2,400여 개를 파싱해 웹 대시보드로 제공.

데이터 흐름

Synology Drive 동기화 폴더 (원본 일지 xlsx, 일별 1파일)
  ~/Library/CloudStorage/SynologyDrive-OfficeApple/애플에너지(주)/업무일지/업무일지/
    ↓ launchd 10분 주기 변경 감지 (~/bin/appleenergy-journal-sync.sh)
parse_journal.py 재파싱
    ├── journal.json  (전체 일지 ~1MB — 대시보드용)
    └── widget.json   (경량 요약 1.5KB — iOS 위젯용)
    ↓ FileStation 업로드
NAS /web/appleenergy/  →  https://sysadcom.dscloud.me/appleenergy/

구성 파일 (Code Claude/애플에너지/)

iOS 위젯 (Scriptable)

특이사항 메모 (memo.php) 설계·함정

⚠️ 브라우저→DSM(:5001) 직접 API 호출은 CORS로 차단됨 — DSM이 CORS 헤더를 안 보내므로 웹페이지에서 FileStation 직접 업로드 불가. 해결 = 같은 오리진의 PHP 엔드포인트(Web Station PHP 8.2)로 저장. 단 http 유저에게 해당 폴더 쓰기 권한을 DSM에서 수동 부여해야 함(1회). Synology nginx가 4xx/5xx 본문을 자체 에러페이지로 바꿔치기하므로 PHP는 항상 200 + JSON으로 응답하게 설계.
운영 주의

3. 자동화 / launchd 인프라

3.1 토스 자동 로그인

스크립트역할
~/bin/toss-prefill.sh토스 signin 폼 자동 채우기 (이름, 생년월일, 주민첫글자, 휴대폰, 통신사, 약관 마스터)
~/bin/toss-prefill-cg.pyCGEvent 기반 입력 (잠금화면/원격 환경 우회용)
~/bin/toss-watchdog.shlaunchd 60초 주기, 로그아웃 감지 시 prefill 자동 재실행, SMS rate limit 회피 5분 cooldown
~/bin/toss-health-check.shlaunchd 2시간 주기, 탭/오버레이/데이터 sync 상태 점검 + 자동 복구
~/bin/toss-popup-daemon.shChrome OTP 자동완성 popup 좌표 클릭
~/bin/toss-icloud-folder.sh오버레이 "iCloud 폴더 선택" 클릭 자동화 (NSOpenPanel)

중요 함정

3.2 라이브 스트림 인프라

3.3 NAS 동기화

3.4 애플에너지 업무일지 자동 동기화 — 2026-07-08 신설

3.5 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-syncsysadcom NAS (FileStation/DSM API)user + pass
nas-live79bambulive79bambu NASuser + 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외부 도메인외부 노출 포트
sysadcomsysadcom.dscloud.me80 (Web Station), 5001 (DSM HTTPS)
live79bambulive79bambu.dscloud.me5001 (DSM HTTPS만)

4.3 Tailscale (영화 시청용 가상 망)

4.4 video 공유 (live79bambu)

숨김 공유 — 직원에게 안 보이게 의도 설계

영화 폴더 인벤토리

5. 클로드 코드 운영 컨벤션

5.1 워크스페이스 (iCloud Drive)

~/Library/Mobile Documents/com~apple~CloudDocs/Code Claude/ 가 마스터 작업 폴더.

Code Claude/
├── CLAUDE.md                        ← 단일 마스터 인덱스 (한 개 파일 정책)
├── 보안 2급/                          ← 토스 포트폴리오 프로젝트
├── Ronnefeldt/                       ← 로네펠트 사이트 작업 사본
├── Toyota86/                         ← 토요타86 정비이력 사이트
├── 애플에너지/                         ← 수력발전 업무일지 대시보드 (index.html + parse_journal.py + journal.json)
├── Manual/                           ← 이 운영 매뉴얼 (NAS /web/Manual/ 원본)
├── nas-home/                         ← NAS 홈 허브(index.html) 편집 원본
└── (PDF 매뉴얼 3개)

5.2 메모리 시스템

5.3 원격 제어 — /remote-control

6. 운영 노하우 / 주의사항

6.1 FileVault + 자동 로그인 함정

6.2 NAS API 한계

6.3 외부 접속 경로별 한계

경로한계
QuickConnect브라우저 전용. API 자동화 안 됨
DDNS:5001 (DSM)API 정상. 다만 패키지 설치 등 일부 제한
DDNS:80 (Web Station)sysadcom만 노출. live79bambu는 라우터 작업 후 가능
TailscaleSMB/IP 직접 접근. 모든 포트 사용 가능

6.4 트랜스코딩 vs 직재생

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
tail -f ~/Library/Logs/appleenergy-journal-sync.log

Office Live 상태 점검 (한 줄)

# 시퀀스가 몇 초 간격으로 전진하면 정상, 멈춰 있으면 §2.4 복구 절차
curl -s "http://sysadcom.dscloud.me/Office%20Live/stream.m3u8" | grep MEDIA-SEQUENCE
ls -lt /tmp/livestream/ | head   # 로컬 세그먼트 생성 확인

애플에너지 일지 수동 갱신

# 평소엔 launchd 10분 주기 자동. 즉시 반영하고 싶을 때:
~/bin/appleenergy-journal-sync.sh

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/
⚡ 애플에너지 (수력발전 대시보드)https://sysadcom.dscloud.me/appleenergy/
🚗 Toyota86 (정비이력)https://sysadcom.dscloud.me/toyota86/
🏠 홈 허브 (카드 인덱스, 비번 0429)https://sysadcom.dscloud.me/
💃 dancehttp://sysadcom.dscloud.me/dance/
🎬 영화 (Tailscale 후)smb://100.84.81.75/video
🔧 sysadcom DSMhttps://sysadcom.dscloud.me:5001
🔧 live79bambu DSMhttps://live79bambu.dscloud.me:5001

이 문서는 클로드 코드와 함께한 작업 이력을 종합한 것입니다. 변경사항은 Code Claude/CLAUDE.md의 "최근 작업" 섹션과 메모리 시스템에서 추적됩니다.