# junggomoa.com 배포 가이드 (Traefik v2.11 + PostgreSQL) 서버 (`183.99.177.40`) 에 이미 떠있는 Traefik 이 80/443 + Let's Encrypt HTTPS + 글로벌 web→websecure redirect 까지 처리. 이 compose 는 **포트 직접 노출 안 하고** Traefik labels 만 붙여 attach. ## 0. 서버 환경 (이미 확인됨) - **OS**: Ubuntu (Linux 6.8.0) - **k3s** 1대 + **docker compose** 혼합 운영 - **Traefik** v2.11 — 컨테이너명 `traefik`, 네트워크 `traefik-net`, certresolver `le` - **사설 docker registry** `localhost:5000` - **Gitea** + **Act Runner** (CI 가능) - 호스트 5432 는 `invyone-db` 가 사용 중 → 우리 Postgres 는 내부 네트워크로만 ## 1. 소스 업로드 (로컬 → 서버) ```bash # 로컬 Mac 에서 rsync -avz --exclude='.git' --exclude='.idea' --exclude='__pycache__' \ --exclude='data/pgdata' --exclude='data/*.db' --exclude='*.log' \ /Users/chpark/tradeing/ chpark@183.99.177.40:~/tradeing/ ``` ## 2. 환경변수 (.env) 서버 `~/tradeing/.env`: ``` POSTGRES_PASSWORD=강한비밀번호로변경 TELEGRAM_TOKEN=실제토큰 # 최초 시드용 (이후엔 설정 메뉴에서 변경) TELEGRAM_CHAT_ID=실제chatid ``` ## 3. 빌드 + 기동 ```bash cd ~/tradeing chmod +x deploy.sh ./deploy.sh # 또는: docker compose build docker compose up -d docker compose ps docker compose logs -f app ``` Traefik 이 자동으로: - `http://junggomoa.com` → `https://` redirect - `https://junggomoa.com` → 이 컨테이너 8501 로 프록시 - Let's Encrypt 인증서 자동 발급/갱신 ## 4. 동작 확인 ```bash # 컨테이너 안 docker compose exec app curl -fsS http://127.0.0.1:8501/_stcore/health # Traefik 라우팅 등록 확인 curl -I https://junggomoa.com ``` 브라우저: ## 5. 데이터베이스 (PostgreSQL) 이번 컴포즈에 같이 올라가는 `tradeing-postgres` 컨테이너가: - 진입 신호 → `trades` 테이블에 `status=open` 으로 INSERT - 손절 hit → `status=stop_loss`, `pnl_pct` 자동 계산 - 30m/1h 반대 신호 → `status=reversal` - 캔들 forming 중 신호 사라짐 → `status=cancelled` - 발사된 모든 raw signal → `signal_events` 에 누적 **볼륨**: `~/tradeing/data/pgdata` (서버 영속). 백업 권장: ```bash docker compose exec postgres pg_dump -U tradeing tradeing > ~/backup/tradeing-$(date +%F).sql ``` **psql 직접 접근**: ```bash docker compose exec postgres psql -U tradeing -d tradeing \dt # 테이블 목록 SELECT count(*), status FROM trades GROUP BY status; ``` ## 6. 운영 | 작업 | 명령 | |---|---| | 로그 보기 | `docker compose logs -f app` | | 재시작 | `docker compose restart app` | | 정지 | `docker compose down` ( `-v` 붙이면 DB 볼륨까지 삭제, **주의**) | | 코드 변경 후 재배포 | `docker compose build app && docker compose up -d app` | | Postgres 진입 | `docker compose exec postgres psql -U tradeing -d tradeing` | | settings DB 백업 | `cp ~/tradeing/data/settings.db ~/backup/settings-$(date +%F).db` | | Postgres 덤프 | `docker compose exec postgres pg_dump -U tradeing tradeing > ~/backup/$(date +%F).sql` | ## 7. 화면 메뉴 - **📊 대시보드** — 차트 - **📈 트레이드 이력** — 진입/청산 이력 + 누적 PnL 차트 + 시간축/사유별 통계 - **⚙️ 설정** — 텔레그램 토큰/Chat ID, 모니터링 심볼, 알림 시간축, 쿨다운, 손절가 비율, 알림/리포트 ON-OFF (저장 즉시 반영) ## 8. 보안 권고 - SSH key 등록 (`ssh-copy-id`) 후 비밀번호 인증 disable 권장 - 노출됐던 SSH 비밀번호 변경 - `.env` 의 `POSTGRES_PASSWORD` 는 추측 불가능한 값으로 (compose 에서 외부 노출 안 되긴 하지만 컨테이너 escape 등 대비) ## 9. 트러블슈팅 | 증상 | 확인 | |---|---| | `network "traefik" declared as external, but could not be found` | `docker network ls` 에 실제 이름 확인 → compose 파일 수정 | | Traefik dashboard 에 라우터 없음 | `docker compose logs traefik` (다른 디렉토리) → label 오타 / certresolver 이름 | | 인증서 발급 실패 | DNS A 레코드 / 80 포트 외부 접근 가능 / Traefik certresolver 설정 | | WebSocket 끊김 | Traefik 은 기본적으로 WS 지원 — 별도 설정 불필요. 다른 미들웨어 (rate limit 등) 가 끊는지 확인 | | trades 테이블에 데이터 안 쌓임 | `docker compose logs app | grep trades_db` → connect 실패 메시지 / 알림이 발사 자체가 안 되는 건지 | | 텔레그램 안 옴 | 설정 메뉴에서 토큰 재입력 → 테스트 발송 버튼 / 컨테이너 로그 확인 |