사용중인 도커 시리즈 14 Ghostfolio
📋 Ghostfolio: “고통스럽지만 놓을 수 없는” 사용기1. 장점 (The Good: 왜 이 고생을 하는가
- 데이터 주권 (Privacy & Ownership):금융 데이터는 가장 민감한 개인정보입니다. Ghostfolio는 오픈 소스이며 내 시놀로지 NAS에 직접 설치(Self-hosting)하므로, 내 자산 내역이 외부 서버에 저장되거나 광고 타겟팅에 이용될 걱정이 없습니다. “내 돈 데이터는 내 서버에”라는 원칙을 지킬 수 있죠.

- 포괄적인 자산 관리:주식, ETF뿐만 아니라 암호화폐, 현금, 부동산까지 한곳에서 관리할 수 있습니다. 특히 다양한 통화(USD, KRW 등)를 지원하여 해외 주식 비중이 높은 투자자에게 매우 유리합니다.

- 아름다운 UI와 인사이트:단순한 가계부를 넘어 포트폴리오 비중, 배당금 추이, 성과 분석(Benchmarking)을 시각적으로 아주 깔끔하게 보여줍니다. 한 번 설정해두면 보고 싶을 때마다 뿌듯한 대시보드를 볼 수 있습니다.

- 확장성과 자동화:Docker로 올렸기 때문에 DB(PostgreSQL)에 직접 접속하거나 API를 이용해 데이터를 가공할 수 있습니다. (예: 아까 고민하셨던 UUID를 DB에서 직접 찾는 작업 등)시놀로지 NAS(DSM) 환경에서 도커는 현재 ‘Container Manager’라는 이름으로 통합되어 제공되고 있습니다. 블로그에 설치 과정을 정리하실 때 도움이 되도록, 가장 대중적인 GUI 방식과 숙련자를 위한 Docker Compose 방식 두 가지로 나누어 설명해 드립니다.
- 1. 패키지 센터를 통한 기본 설치 (GUI)
가장 기초적인 단계로, 시놀로지 OS인 DSM 내에서 도커 엔진을 활성화하는 과정입니다.
패키지 센터 실행: DSM에 접속하여 ‘패키지 센터’를 엽니다.
Container Manager 검색: 검색창에 ‘Container Manager'(이전 버전은 ‘Docker’)를 입력합니다.
설치: ‘설치’ 버튼을 클릭합니다. 설치가 완료되면 메인 메뉴에 아이콘이 생성됩니다.
권한 설정: 설치 과정에서 공유 폴더(/docker) 생성 안내가 나오면 승인합니다. 이 폴더는 컨테이너의 설정 파일과 데이터를 보관하는 핵심 장소가 됩니다.
2. Docker Compose를 활용한 스마트한 설치 (추천)
Ghostfolio나 *arr(Sonarr, Radarr) 시리즈처럼 여러 개의 컨테이너(DB, Redis, Web 등)가 함께 돌아가야 하는 서비스는 개별적으로 설치하기보다docker-compose.yml파일을 이용하는 것이 훨씬 효율적입니다.
왜 Compose를 쓰는가?
복구 용이성: NAS를 초기화해도 YAML 파일 하나만 있으면 모든 설정을 1초 만에 복구할 수 있습니다.
연결 관리: DB와 앱 간의 네트워크 설정을 자동으로 처리해 줍니다.
버전 관리: 이미지 업데이트가 매우 간편합니다.
실행 방법 (Container Manager 기준)
프로젝트 생성: Container Manager 실행 > ‘프로젝트’ 메뉴 > ‘생성’ 클릭.
경로 지정:/docker/서비스이름폴더를 선택합니다.
YAML 작성: 소스 선택에서 ‘docker-compose.yml 생성’을 선택하고 설정 값을 입력합니다.
실행: ‘다음’을 눌러 빌드를 시작하면 필요한 이미지들을 자동으로 내려받고 실행합니다.
3. 설치 시 반드시 챙겨야 할 ‘꿀팁’ (블로그 포인트)
블로그 글에 이 내용을 포함하면 독자들에게 훨씬 전문적인 느낌을 줄 수 있습니다.
A. PUID와 PGID 설정
시놀로지 내부의 파일 권한 문제로 인해 컨테이너가 파일을 읽거나 쓰지 못하는 경우가 많습니다. 이를 방지하기 위해 사용자 계정의 ID 값을 환경 변수로 넣어주는 것이 필수입니다.
SSH 접속 후id명령어로 본인의 계정 ID(보통 1026 등)를 확인하여 적용하세요.
B. 볼륨 매핑(Volume Mapping)의 중요성
컨테이너는 삭제되면 내부 데이터도 사라집니다. 따라서 중요한 데이터(설정값, DB 데이터 등)는 반드시 NAS의 실제 폴더(/docker/...)와 연결(Mount)해야 합니다.
예시:/docker/ghostfolio/data↔/app/data
C. 메모리 제한 설정
DS918+ 같은 모델은 여러 컨테이너를 동시에 돌리면 메모리 점유율이 급격히 올라갑니다. 특정 컨테이너가 자원을 독식하지 않도록 컨테이너당 메모리 제한을 적절히 걸어주는 것이 시스템 전체 안정성에 좋습니다.
단점 (The Bad: 무엇이 나를 힘들게 하는가?)
- 불안정한 외부 데이터 의존성:Yahoo Finance나 Coingecko 같은 무료 API를 사용하다 보니, 이번처럼 티커가 바뀌거나 API 응답이 늦어지면 로그에 에러가 쏟아집니다. “공짜 점심은 없다”는 것을 뼈저리게 느끼게 하죠.
- 높은 유지보수 비용(시간):상용 앱은 돈을 내면 알아서 다 해주지만, 셀프 호스팅은 에러 로그를 분석하고, 도커 컨테이너를 관리하고, DB를 손보는 시간을 내가 직접 ‘지불’해야 합니다.
- 리소스 관리의 어려움:DS918+ 같은 NAS 환경에서는 다른 서비스(Plex, Tdarr 등)와 자원을 공유해야 합니다.

마지막으로 노가다 고생 끝이 나고 이 앱과 연동하면

고생한 보람이 있다고 생각이 듭니다. ㅎㅎ
어째든 계속해서 업데이트를 해야 되는게 좀 어렵지만. 데일리 트래이딩 하신다면 어렵겠지만 크게 많이 사고 팔지 않으면 처음 셋업 할때 노가다에 비해 훨씬 수월 합니다.
참고로 노가다를 줄이기 위해 자동화를 만들었는데 참고 해보세요.
최종 파일 구성
~/Documents/Claude/Projects/ghostfolio/
├── schwab_to_ghostfolio.py ← Schwab CSV → Ghostfolio CSV 변환
├── import_to_ghostfolio.py ← 변환된 CSV → Ghostfolio API 푸시
├── wipe_ghostfolio_activities.py ← Ghostfolio 기존 거래 전체 삭제
├── process_inbox.sh ← 자동화 워커 (변환+푸시+알림)
├── com.user.schwab-watcher.plist ← launchd 등록 파일
├── install_watcher.sh ← 한 방 설치
├── .env.ghostfolio.example ← 설정 템플릿
├── inbox/ ← Schwab CSV 떨어뜨림
├── outbox/ ← 변환된 Ghostfolio CSV
└── archive/ ← 원본 자동 백업
단계별 진행
1단계 — Ghostfolio 접속 정보 입력 (1회)
터미널에서:
bash
cd ~/Documents/Claude/Projects/ghostfolio
cp .env.ghostfolio.example .env.ghostfolio
open -e .env.ghostfolio
세 가지 값을 채워주세요:
| 항목 | 어디서 찾나 |
|---|---|
GHOSTFOLIO_URL | http://시놀로지IP:3333 (현재 docker-compose의 포트) |
GHOSTFOLIO_ACCESS_TOKEN | Ghostfolio 로그인 후 우상단 메뉴 → My Ghostfolio → Show Security Token |
GHOSTFOLIO_ACCOUNT_ID | 비워두면 됩니다 (선택사항) |
2단계 — 워처 설치 (1회)
bash
bash ~/Documents/Claude/Projects/ghostfolio/install_watcher.sh
이제 inbox/에 파일을 떨어뜨리면 자동으로 변환 + 푸시 + 알림까지 처리됩니다.
3단계 — 기존 데이터 초기화
먼저 현재 거래 수만 확인해보고 (안전):
bash
cd ~/Documents/Claude/Projects/ghostfolio
python3 wipe_ghostfolio_activities.py
현재 거래 수: 87 같은 메시지가 나오면 정상. 진짜 다 지울 거면:
bash
python3 wipe_ghostfolio_activities.py --yes-i-am-sure
한 번 지우면 복구 못 합니다. 시놀로지 Postgres 볼륨을 백업해두면 더 안전해요:
cp -r /volume2/docker/ghostfolio/db /volume2/docker/ghostfolio/db_backup_$(date +%F)
4단계 — 과거 거래내역 일괄 재임포트
Schwab에서 과거 분량까지 CSV로 받으세요. Schwab는 기간을 길게 잡으면 한 파일에 다 받을 수 있고, 안 되면 연도별로 끊어서 여러 파일로 받아도 됩니다.
받은 CSV들을 전부 inbox/에 드래그하면 끝이에요. 워처가 하나씩 처리하면서:
- 변환 →
outbox/ - API 푸시 → Ghostfolio에 자동 입력
- 원본 백업 →
archive/ - macOS 알림으로 진행 상황 표시
watcher.log에서 실시간으로 진행 확인 가능:
bash
tail -f ~/Documents/Claude/Projects/ghostfolio/watcher.log
평소 사용 (이후)
Schwab에서 거래내역 다운로드 → inbox/ 폴더로 드래그. 그게 전부예요. Ghostfolio에서 새로고침하면 거래가 들어와 있습니다.
주의사항 한 가지
중복 임포트 주의: 같은 기간의 CSV를 두 번 떨어뜨리면 거래가 중복으로 들어갈 수 있어요. 안전하게 가시려면:
- 일괄 재임포트 시 기간이 겹치지 않게 CSV 받기
- 또는 한 번 잘못되면
wipe로 다시 깨끗이 시작
준비되시면 위 순서대로 진행해보시고, 어디서 막히면 그 로그(watcher.log 또는 터미널 에러)를 보여주세요. 특히 1~2단계에서 API 토큰 받기와 푸시 동작 확인이 가장 자주 막히는 부분이에요.
저는 Schwab에서 주식 거래를 하고 있는데 cvs 파일을 다운 받아 진행 하였습니다. 각자 이용하시는 거래 은행에 내역을 다운 받으셔서 위에 내용을 참고 하셔서 AI 에게 만들어 달라고 시키면 금방 만들어 드립니다. ㅎㅎ


