Initial commit: AutonetSellCar platform with deployment system

- Frontend: Next.js 14 with TypeScript
- Backend: FastAPI with SQLAlchemy
- Agent: Carmodoo sync agent
- Deployment: Docker Compose based staging/production setup
- Scripts: Automated deployment with rollback support

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
AutonetSellCar Deploy
2025-12-30 13:24:39 +09:00
commit 1f0dcb1ddb
224 changed files with 55119 additions and 0 deletions

View File

@@ -0,0 +1,867 @@
# 파일 서버 구축 상세 문서
**작성일**: 2025-12-05
**서버**: Server3 (192.168.0.203)
**운영체제**: Ubuntu 22.04.5 LTS Server
---
## 목차
1. [아키텍처 개요](#아키텍처-개요)
2. [기술 스택](#기술-스택)
3. [하드웨어 구성](#하드웨어-구성)
4. [디스크 설정](#디스크-설정)
5. [Samba 파일 서버](#samba-파일-서버)
6. [Nextcloud 클라우드](#nextcloud-클라우드)
7. [NPM 프록시 설정](#npm-프록시-설정)
8. [보안 설정](#보안-설정)
9. [문제 해결](#문제-해결)
10. [유지보수](#유지보수)
---
## 아키텍처 개요
### 시스템 구성도
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 파일 서버 아키텍처 │
└─────────────────────────────────────────────────────────────────────────────┘
┌──────────────────┐
│ 인터넷 (WAN) │
└────────┬─────────┘
┌────────▼─────────┐
│ 공유기 (Router) │
│ 59.14.158.123 │
│ │
│ 포트포워딩: │
│ 80,443 → :201 │
│ 81 → :201 │
│ 203 → :203:22 │
└────────┬─────────┘
┌────────────────────────┼────────────────────────┐
│ │ │
┌────────▼────────┐ ┌────────▼────────┐ ┌────────▼────────┐
│ Server1 │ │ Server2 │ │ Server3 │
│ 192.168.0.201 │ │ 192.168.0.202 │ │ 192.168.0.203 │
│ │ │ │ │ │
│ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐ │
│ │ NPM │ │ │ │ MongolCar │ │ │ │ Grantech │ │
│ │ :80/443 │──┼──────┼──│ :3000 │ │ │ │ :3001 │ │
│ └───────────┘ │ │ └───────────┘ │ │ ├───────────┤ │
│ │ │ │ │ │ FastAPI │ │
│ ┌───────────┐ │ │ │ │ │ :8001 │ │
│ │ PostgreSQL│ │ │ │ │ ├───────────┤ │
│ │ :5432 │ │ │ │ │ │ Nextcloud │ │
│ └───────────┘ │ │ │ │ │ :8080 │ │
│ │ │ │ │ ├───────────┤ │
│ ┌───────────┐ │ │ │ │ │ Samba │ │
│ │ Redis │ │ │ │ │ │ :445 │ │
│ │ :6379 │ │ │ │ │ └───────────┘ │
│ └───────────┘ │ │ │ │ │
└─────────────────┘ └─────────────────┘ │ ┌───────────┐ │
│ │ 10TB HDD │ │
│ │ /data │ │
│ └───────────┘ │
└─────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ 데이터 접근 경로 │
└─────────────────────────────────────────────────────────────────────────────┘
┌──────────────┐ ┌──────────────────────┐
│ 내부 사용자 │──── SMB (445) ────────────────────▶│ │
│ (사무실) │ \\192.168.0.203\share │ │
│ │ X: 드라이브 (공유) │ /data (10TB) │
│ │ Y: 드라이브 (개인) │ ├── /share │
└──────────────┘ │ │ (공유 폴더) │
│ │ │
┌──────────────┐ │ └── /damon │
│ 외부 사용자 │──── HTTPS (443) ──────────────────▶│ (개인 폴더) │
│ (외부) │ cloud.grantech.kr │ │
│ │ Nextcloud 웹 인터페이스 └──────────────────────┘
└──────────────┘
```
### 접근 방식별 특징
| 구분 | Samba (SMB) | Nextcloud |
|------|-------------|-----------|
| 접근 방식 | Windows 탐색기 | 웹 브라우저 / 앱 |
| 네트워크 | 내부망 전용 | 외부망 가능 |
| 속도 | 매우 빠름 (LAN) | 상대적으로 느림 |
| 보안 | 내부망 보호 | HTTPS 암호화 |
| 동기화 | 없음 (직접 접근) | 자동 동기화 가능 |
| 모바일 | 불가 | iOS/Android 앱 |
---
## 기술 스택
### 운영체제 및 기반
| 구성요소 | 버전 | 설명 |
|----------|------|------|
| Ubuntu Server | 22.04.5 LTS | 장기 지원 버전 (2027년까지) |
| Linux Kernel | 5.15.x | HWE (Hardware Enablement) |
| Docker | 27.x | 컨테이너 런타임 |
| Docker Compose | 2.x | 멀티 컨테이너 관리 |
### 파일 시스템
| 구성요소 | 선택 | 이유 |
|----------|------|------|
| 파일시스템 | XFS | 대용량 파일/디스크 최적화, 빠른 I/O |
| 마운트 옵션 | defaults | 일반적인 사용 패턴 |
| 백업 우선순위 | 0 | 덤프 사용 안함 |
| fsck 순서 | 2 | 루트 이후 검사 |
#### XFS vs ext4 비교
```
┌─────────────────────────────────────────────────────────────────┐
│ 파일시스템 비교 │
├─────────────────┬─────────────────┬─────────────────────────────┤
│ 항목 │ XFS │ ext4 │
├─────────────────┼─────────────────┼─────────────────────────────┤
│ 최대 파일 크기 │ 8 EB │ 16 TB │
│ 최대 볼륨 크기 │ 8 EB │ 1 EB │
│ 대용량 파일 I/O │ 우수 │ 보통 │
│ 작은 파일 처리 │ 보통 │ 우수 │
│ 온라인 확장 │ 지원 │ 지원 │
│ 온라인 축소 │ 미지원 │ 지원 │
│ 메타데이터 저널 │ 지원 │ 지원 │
│ 엔터프라이즈 │ 권장 │ 일반용 │
└─────────────────┴─────────────────┴─────────────────────────────┘
선택: XFS - 10TB 대용량 디스크에 적합, 엔터프라이즈 환경 표준
```
### 파일 공유
| 구성요소 | 버전 | 역할 |
|----------|------|------|
| Samba | 4.15.x | SMB/CIFS 파일 공유 |
| Nextcloud | Latest | 웹 기반 클라우드 스토리지 |
| MariaDB | 10.6 | Nextcloud 데이터베이스 |
### 네트워크 서비스
| 구성요소 | 포트 | 역할 |
|----------|------|------|
| SMB | 445 | Windows 파일 공유 |
| HTTP | 8080 | Nextcloud 내부 포트 |
| HTTPS | 443 | NPM 리버스 프록시 |
---
## 하드웨어 구성
### 서버 사양
```
┌─────────────────────────────────────────────────────────────────┐
│ Server3 하드웨어 │
├─────────────────┬───────────────────────────────────────────────┤
│ CPU │ (기존 사양) │
│ RAM │ (기존 사양) │
│ 시스템 디스크 │ /dev/nvme0n1 또는 /dev/sdb (기존) │
│ 데이터 디스크 │ /dev/sda - 10TB HDD │
│ 네트워크 │ 1Gbps Ethernet │
│ IP 주소 │ 192.168.0.203 (고정) │
└─────────────────┴───────────────────────────────────────────────┘
```
### 스토리지 레이아웃
```
┌─────────────────────────────────────────────────────────────────┐
│ 디스크 레이아웃 │
└─────────────────────────────────────────────────────────────────┘
/dev/sda (10TB HDD)
└── /dev/sda1 (전체 용량)
└── 마운트: /data
├── /data/share ← 공유 폴더 (모든 사용자)
│ ├── 문서/
│ ├── 프로젝트/
│ └── 백업/
└── /data/damon ← 개인 폴더 (damon 전용)
├── 개인문서/
└── 설정백업/
```
---
## 디스크 설정
### 1. 디스크 확인
```bash
# 연결된 디스크 확인
lsblk
# 출력 예시:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
# sda 8:0 0 9.1T 0 disk
# ├─sda1 8:1 0 9.1T 0 part
# sdb 8:16 0 465.8G 0 disk
# └─sdb1 8:17 0 465.8G 0 part /
# 디스크 상세 정보
sudo fdisk -l /dev/sda
```
### 2. 파티션 생성
```bash
# GPT 파티션 테이블 생성 (2TB 이상 필수)
sudo parted /dev/sda mklabel gpt
# 전체 디스크를 하나의 파티션으로
sudo parted /dev/sda mkpart primary 0% 100%
# 파티션 확인
sudo parted /dev/sda print
# 출력:
# Model: ATA ST10000VN0008 (scsi)
# Disk /dev/sda: 10.0TB
# Sector size (logical/physical): 512B/4096B
# Partition Table: gpt
#
# Number Start End Size File system Name Flags
# 1 1049kB 10.0TB 10.0TB primary
```
### 3. XFS 파일시스템 생성
```bash
# XFS 포맷
sudo mkfs.xfs /dev/sda1
# 출력:
# meta-data=/dev/sda1 isize=512 agcount=10, agsize=268435455 blks
# = sectsz=4096 attr=2, projid32bit=1
# = crc=1 finobt=1, sparse=1, rmapbt=0
# = reflink=1 bigtime=0 inobtcount=0
# data = bsize=4096 blocks=2441609211, imaxpct=5
# = sunit=0 swidth=0 blks
# naming =version 2 bsize=4096 ascii-ci=0, ftype=1
# log =internal log bsize=4096 blocks=521728, version=2
# = sectsz=4096 sunit=1 blks, lazy-count=1
# realtime =none extsz=4096 blocks=0, rtextents=0
```
### 4. 마운트 포인트 생성 및 마운트
```bash
# 마운트 디렉토리 생성
sudo mkdir -p /data
# 수동 마운트 (테스트)
sudo mount /dev/sda1 /data
# 마운트 확인
df -h /data
# 출력:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 9.1T 68G 9.1T 1% /data
```
### 5. 자동 마운트 설정 (fstab)
```bash
# UUID 확인
sudo blkid /dev/sda1
# 출력:
# /dev/sda1: UUID="998ba6f8-57ee-402c-97a7-6f11f998dd7f" TYPE="xfs" ...
# fstab 편집
sudo nano /etc/fstab
# 추가할 라인:
UUID=998ba6f8-57ee-402c-97a7-6f11f998dd7f /data xfs defaults 0 2
# fstab 검증
sudo mount -a
# 재부팅 후에도 마운트 유지됨
```
### 6. 디렉토리 구조 생성
```bash
# 공유 폴더 생성
sudo mkdir -p /data/share
sudo mkdir -p /data/damon
# 권한 설정
sudo chown damon:damon /data/share
sudo chown damon:damon /data/damon
sudo chmod 775 /data/share
sudo chmod 700 /data/damon
```
---
## Samba 파일 서버
### 1. Samba 설치
```bash
# 패키지 설치
sudo apt update
sudo apt install -y samba samba-common-bin
# 서비스 상태 확인
sudo systemctl status smbd
sudo systemctl status nmbd
```
### 2. 사용자 생성
```bash
# 시스템 사용자 생성 (이미 있으면 생략)
sudo adduser grantech_YWJ
# Samba 사용자 등록 (비밀번호 설정)
sudo smbpasswd -a damon
# Password: (입력)
sudo smbpasswd -a grantech_YWJ
# Password: 8561
# 사용자 활성화
sudo smbpasswd -e damon
sudo smbpasswd -e grantech_YWJ
```
### 3. Samba 설정
```bash
sudo nano /etc/samba/smb.conf
```
#### 전체 설정 파일
```ini
# /etc/samba/smb.conf
# Samba 설정 파일 - Grantech 파일 서버
#======================= Global Settings =======================
[global]
workgroup = WORKGROUP
server string = Grantech File Server
# 보안 설정
security = user
map to guest = never
# 로깅
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
panic action = /usr/share/samba/panic-action %d
# 인증
server role = standalone server
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
pam password change = yes
# 성능 최적화
socket options = TCP_NODELAY IPTOS_LOWDELAY
read raw = yes
write raw = yes
# 문자셋 (한글 지원)
unix charset = UTF-8
dos charset = CP949
#======================= Share Definitions =======================
# 공유 폴더 - 모든 등록 사용자 접근 가능
[share]
comment = Grantech Shared Drive
path = /data/share
browseable = yes
read only = no
writable = yes
valid users = damon, grantech_YWJ
create mask = 0664
directory mask = 0775
force group = damon
# 개인 폴더 - damon 전용 (검색 불가)
[damon]
comment = Damon Private Storage
path = /data/damon
browseable = no
read only = no
writable = yes
valid users = damon
create mask = 0600
directory mask = 0700
```
### 4. 설정 검증 및 서비스 재시작
```bash
# 설정 문법 검사
testparm
# 출력:
# Load smb config files from /etc/samba/smb.conf
# Loaded services file OK.
# ...
# 서비스 재시작
sudo systemctl restart smbd nmbd
# 부팅 시 자동 시작 설정
sudo systemctl enable smbd nmbd
```
### 5. 방화벽 설정
```bash
# UFW가 활성화된 경우
sudo ufw allow samba
# 또는 개별 포트
sudo ufw allow 139/tcp
sudo ufw allow 445/tcp
sudo ufw allow 137/udp
sudo ufw allow 138/udp
```
### 6. Windows 클라이언트 연결
#### 네트워크 드라이브 매핑
```
X: 드라이브 (공유)
경로: \\192.168.0.203\share
사용자: damon 또는 grantech_YWJ
Y: 드라이브 (개인)
경로: \\192.168.0.203\damon
사용자: damon
```
#### PowerShell 명령어
```powershell
# 공유 드라이브 연결
net use X: \\192.168.0.203\share /user:damon /persistent:yes
# 개인 드라이브 연결
net use Y: \\192.168.0.203\damon /user:damon /persistent:yes
# 연결 확인
net use
```
---
## Nextcloud 클라우드
### 1. Docker Compose 설정
```bash
# 디렉토리 생성
mkdir -p ~/nextcloud
cd ~/nextcloud
```
#### docker-compose.yml
```yaml
# ~/nextcloud/docker-compose.yml
version: '3'
services:
# Nextcloud 애플리케이션
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: unless-stopped
ports:
- "8080:80"
volumes:
# Nextcloud 데이터
- ./data:/var/www/html
# 외부 스토리지 마운트 (Samba 공유 폴더 연동)
- /data/share:/external/share
- /data/damon:/external/damon
environment:
- MYSQL_HOST=db
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud123
depends_on:
- db
networks:
- nextcloud-net
# MariaDB 데이터베이스
db:
image: mariadb:10.6
container_name: nextcloud-db
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=rootpass123
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud123
volumes:
- ./db:/var/lib/mysql
networks:
- nextcloud-net
networks:
nextcloud-net:
driver: bridge
```
### 2. Nextcloud 시작
```bash
# 컨테이너 시작
cd ~/nextcloud
docker compose up -d
# 상태 확인
docker compose ps
# 출력:
# NAME IMAGE STATUS PORTS
# nextcloud nextcloud:latest Up 2 hours 0.0.0.0:8080->80/tcp
# nextcloud-db mariadb:10.6 Up 2 hours 3306/tcp
# 로그 확인
docker compose logs -f nextcloud
```
### 3. 초기 설정
1. 브라우저에서 `http://192.168.0.203:8080` 접속
2. 관리자 계정 생성
- Username: admin
- Password: (안전한 비밀번호)
3. 데이터베이스 설정 (자동 감지됨)
### 4. 외부 스토리지 연동
Nextcloud 관리자 → 앱 → External storage support 활성화
외부 스토리지 설정:
```
폴더명: 공유 폴더
외부 스토리지: 로컬
설정: /external/share
적용 대상: 모든 사용자
폴더명: 개인 폴더
외부 스토리지: 로컬
설정: /external/damon
적용 대상: admin
```
### 5. 설치된 앱
| 앱 | 용도 |
|----|------|
| Calendar | 일정 관리, CalDAV 동기화 |
| Contacts | 연락처 관리, CardDAV 동기화 |
| Notes | 메모/노트 작성 |
---
## NPM 프록시 설정
### Server1 (192.168.0.201) NPM 설정
#### cloud.grantech.kr 프록시 호스트
```
Domain Names: cloud.grantech.kr
Scheme: http
Forward Hostname/IP: 192.168.0.203
Forward Port: 8080
Websockets Support: ON
Block Common Exploits: ON
SSL:
- SSL Certificate: Let's Encrypt
- Force SSL: ON
- HTTP/2 Support: ON
```
### DNS 설정 (dotname.co.kr)
```
Type: A
Host: cloud
Value: 59.14.158.123
TTL: 3600
```
### 접속 URL
- 내부: http://192.168.0.203:8080
- 외부: https://cloud.grantech.kr
---
## 보안 설정
### 접근 제어
```
┌─────────────────────────────────────────────────────────────────┐
│ 보안 계층 구조 │
└─────────────────────────────────────────────────────────────────┘
[인터넷]
┌──────────────────┐
│ 공유기 방화벽 │ ← 포트포워딩으로 제한된 포트만 허용
│ (NAT) │ 80, 443, 81, 201-203
└────────┬─────────┘
┌──────────────────┐
│ NPM (HTTPS) │ ← SSL/TLS 암호화
│ Let's Encrypt │ 도메인 기반 라우팅
└────────┬─────────┘
┌──────────────────┐
│ Docker Network │ ← 컨테이너 격리
│ │
└────────┬─────────┘
┌──────────────────┐
│ Nextcloud Auth │ ← 사용자 인증
│ │ 2FA 가능
└──────────────────┘
[내부망만]
┌──────────────────┐
│ Samba (SMB) │ ← 내부망만 접근 가능
│ 사용자 인증 │ 사용자별 권한 분리
└──────────────────┘
```
### 사용자 권한
| 사용자 | Samba share | Samba damon | Nextcloud |
|--------|-------------|-------------|-----------|
| damon | ✅ 읽기/쓰기 | ✅ 읽기/쓰기 | ✅ 전체 |
| grantech_YWJ | ✅ 읽기/쓰기 | ❌ 접근불가 | ⚠️ 제한적 |
### 파일 권한
```bash
# /data/share - 공유 폴더
drwxrwxr-x damon damon /data/share
# 새 파일: 0664 (rw-rw-r--)
# 새 디렉토리: 0775 (rwxrwxr-x)
# /data/damon - 개인 폴더
drwx------ damon damon /data/damon
# 새 파일: 0600 (rw-------)
# 새 디렉토리: 0700 (rwx------)
```
---
## 문제 해결
### Samba 연결 문제
#### 증상: "네트워크 경로를 찾을 수 없습니다"
```bash
# 서버에서 확인
sudo systemctl status smbd
# 포트 확인
sudo netstat -tlnp | grep 445
# Windows에서 테스트
ping 192.168.0.203
```
#### 증상: "로그온 실패"
```bash
# Samba 사용자 확인
sudo pdbedit -L
# 비밀번호 재설정
sudo smbpasswd -a username
```
#### 증상: "권한이 없습니다"
```bash
# 디렉토리 권한 확인
ls -la /data/share
# 권한 수정
sudo chmod 775 /data/share
sudo chown damon:damon /data/share
```
### Nextcloud 문제
#### 증상: 502 Bad Gateway
```bash
# 컨테이너 상태 확인
docker compose ps
# 컨테이너 재시작
docker compose restart nextcloud
```
#### 증상: 외부 스토리지 접근 불가
```bash
# 컨테이너 내부 권한 확인
docker exec nextcloud ls -la /external/
# 권한 수정 (호스트에서)
sudo chmod 755 /data/share
```
### 로그 확인
```bash
# Samba 로그
sudo tail -f /var/log/samba/log.smbd
# Nextcloud 로그
docker compose logs -f nextcloud
# 시스템 로그
sudo journalctl -u smbd -f
```
---
## 유지보수
### 일일 점검
```bash
# 디스크 사용량
df -h /data
# 서비스 상태
sudo systemctl status smbd
docker compose ps
# 현재 Samba 연결
sudo smbstatus
```
### 백업 전략
```bash
# 중요 설정 파일 백업
sudo cp /etc/samba/smb.conf /data/share/backup/
sudo cp /etc/fstab /data/share/backup/
cp ~/nextcloud/docker-compose.yml /data/share/backup/
# Nextcloud 데이터베이스 백업
docker exec nextcloud-db mysqldump -u nextcloud -pnextcloud123 nextcloud > backup.sql
```
### 업데이트
```bash
# Samba 업데이트
sudo apt update && sudo apt upgrade samba
# Nextcloud 업데이트
cd ~/nextcloud
docker compose pull
docker compose up -d
```
---
## 부록: 명령어 요약
### 서비스 관리
```bash
# Samba
sudo systemctl start|stop|restart|status smbd
sudo systemctl enable smbd
# Docker (Nextcloud)
docker compose up -d
docker compose down
docker compose restart
docker compose logs -f
```
### 사용자 관리
```bash
# Samba 사용자 추가
sudo smbpasswd -a username
# Samba 사용자 삭제
sudo smbpasswd -x username
# Samba 사용자 목록
sudo pdbedit -L
```
### 디스크 관리
```bash
# 용량 확인
df -h /data
# 디렉토리별 용량
du -sh /data/*
# inode 확인
df -i /data
```
---
## 변경 이력
| 날짜 | 변경 내용 | 작업자 |
|------|-----------|--------|
| 2025-12-05 | 초기 구축 및 문서 작성 | Claude |
---
*문서 작성일: 2025-12-05*

157
Doc/관세.md Normal file
View File

@@ -0,0 +1,157 @@
# 몽골 차량 수입 관세 및 세금 가이드
> 작성일: 2025년 12월
> 대상: 한국 → 몽골 중고차 수출 시 몽골 현지 관세 및 세금
---
## 1. 기본 세금 구조
| 세목 | 세율 | 과세 기준 |
|------|------|----------|
| **관세 (Import Duty)** | **5%** | CIF 가격 기준 |
| **부가가치세 (VAT)** | **13%** | (CIF + 관세) 기준 |
| **특별소비세 (Excise Tax)** | **$500 ~ $4,000+** | 배기량·연식별 차등 |
---
## 2. 특별소비세 상세
몽골 정부는 2006년 특별소비세법을 제정하여 수입 승용차에 대해 **연식**과 **엔진 배기량**에 따라 차등적으로 특별소비세를 부과하고 있습니다.
### 2.1 연식별 특별소비세 배율
| 연식 | 세율 배율 | 비고 |
|------|----------|------|
| 3년 이하 | 기본 세율 | 가장 낮음 |
| 4~9년 | 기본 세율 × 1.5~2배 | 중간 수준 |
| **10년 이상** | **기본 세율 × 2~3배** | ⚠️ 가장 높음 |
> ⚠️ **중요**: 연식 10년 이상 중고차는 9년 이하 차량 대비 특별소비세가 **2~3배** 부과됩니다.
> 따라서 **9년 이하 차량 수출을 강력히 권장**합니다.
### 2.2 배기량별 특별소비세 기준 (추정)
| 배기량 | 9년 이하 | 10년 이상 |
|--------|----------|----------|
| 1,500cc 이하 | $500 ~ $800 | $1,500 ~ $2,400 |
| 1,501 ~ 2,500cc | $800 ~ $1,500 | $2,400 ~ $4,000 |
| 2,501 ~ 3,000cc | $1,200 ~ $2,000 | $3,600 ~ $6,000 |
| 3,000cc 초과 | $1,500 ~ $2,500 | $4,500 ~ $7,500 |
---
## 3. 친환경 차량 세금 감면
| 차량 유형 | 혜택 내용 |
|----------|----------|
| **하이브리드 차량** | 특별소비세 50% 감면 또는 전면 면제 |
| **LPG 차량** | 특별소비세 전면 면제 |
| **전기차 (EV)** | 특별소비세 감면 |
> 2010년 특별소비세법 개정으로 친환경 HYBRID 및 LPG 차량에 대한 특별소비세가 전면 철폐되었습니다.
---
## 4. 세금 계산 예시
### 예시 1: 2018년식 현대 싼타페 (2,200cc)
**조건**: CIF 가격 $5,000, 연식 7년
| 항목 | 계산식 | 금액 |
|------|--------|------|
| 관세 (5%) | $5,000 × 5% | $250 |
| 특별소비세 | 7년 차, 2,200cc 기준 | 약 $1,200 |
| 부가가치세 (13%) | ($5,000 + $250) × 13% | $682 |
| **총 세금** | | **$2,132** |
### 예시 2: 2012년식 기아 쏘렌토 (2,400cc)
**조건**: CIF 가격 $3,500, 연식 13년 (10년 초과)
| 항목 | 계산식 | 금액 |
|------|--------|------|
| 관세 (5%) | $3,500 × 5% | $175 |
| 특별소비세 | 13년 차, 2,400cc (10년 초과 할증) | 약 $3,000 |
| 부가가치세 (13%) | ($3,500 + $175) × 13% | $478 |
| **총 세금** | | **$3,653** |
> ⚠️ 10년 초과 차량은 차량 가격보다 세금이 더 높을 수 있습니다.
---
## 5. 일-몽 EPA (경제동반자협정) 영향
| 구분 | 내용 |
|------|------|
| 체결 시기 | 2015년 체결, 2016년 6월 발효 |
| 3년 이하 차량 | 관세 5% **전면 철폐** |
| 3년 초과 중고차 | 6~20년에 걸쳐 **단계적 철폐** |
> **참고**: 한국은 현재 몽골과 FTA가 체결되지 않아 일본산 차량 대비 관세 측면에서 불리할 수 있습니다.
> 한-몽 FTA 협상이 진행 중이며, 체결 시 양국 간 교역이 활성화될 것으로 기대됩니다.
---
## 6. 차량 유형별 총 세금 요약
| 차량 유형 | 연식 | 관세+세금 예상 |
|----------|------|---------------|
| 소형차 (1,500cc 이하) | 9년 이하 | $1,500 ~ $2,500 |
| 소형차 (1,500cc 이하) | 10년 이상 | $3,000 ~ $5,000 |
| 중형차 (2,500cc 이하) | 9년 이하 | $2,000 ~ $3,500 |
| 중형차 (2,500cc 이하) | 10년 이상 | $4,000 ~ $7,000 |
| SUV (2,500cc 이하) | 9년 이하 | $2,500 ~ $4,000 |
| SUV (2,500cc 이하) | 10년 이상 | $5,000 ~ $8,000 |
| 대형차 (3,000cc 초과) | 9년 이하 | $3,500 ~ $5,000 |
| 대형차 (3,000cc 초과) | 10년 이상 | $7,000 ~ $12,000 |
---
## 7. 기타 비용
| 항목 | 예상 비용 |
|------|----------|
| 몽골 통관 수수료 | $50 ~ $100 |
| 세관 검사비 | $30 ~ $50 |
| 서류 처리비 | $20 ~ $50 |
| 차량 등록비 | $50 ~ $100 |
---
## 8. 수출 시 핵심 체크포인트
### ✅ 권장 사항
- [x] **9년 이하 차량** 수출 - 특소세 절감
- [x] **하이브리드/LPG 차량** 우선 - 세금 감면 혜택
- [x] **소형 배기량** 차량 - 특소세 최소화
- [x] **좌핸들 차량** - 몽골 우측통행 적합
### ⚠️ 주의 사항
- [ ] 10년 이상 차량 - 특소세 2~3배 급증
- [ ] 대배기량 차량 - 특소세 부담 증가
- [ ] 우핸들 차량 - 향후 수입 제한 논의 중
---
## 9. 참고 자료
- KOTRA 울란바토르 무역관
- 몽골 관세청 (Mongolian Customs)
- 몽골 특별소비세법 (2006년 제정, 2010년 개정)
- PWC Mongolia Tax Guide
- 몽골 도로교통개발부
---
## 10. 면책 조항
> 본 문서의 세율 및 금액은 참고용이며, 실제 세금은 몽골 관세청의 최신 규정 및 환율에 따라 달라질 수 있습니다.
> 정확한 세금 산출을 위해서는 몽골 현지 통관 대행업체 또는 관세사와 상담하시기 바랍니다.
---
*문서 작성: Grantech Co., Ltd.*

566
Doc/에스크로.md Normal file
View File

@@ -0,0 +1,566 @@
# USDC 에스크로 서비스 조사 결과
## 개요
중고차 거래 특성상 **구매자 보호**(차량 확보 전 대금 지불 불안)와 **판매자 보호**(차량 인도 후 미수금 위험)를 모두 해결해야 합니다.
---
## 1. 사용 가능한 USDC 에스크로 서비스
### Option A: Circle Refund Protocol (추천 ⭐)
Circle에서 2025년 4월 출시한 스마트 컨트랙트 기반 에스크로 프로토콜
**특징:**
- **비수탁형(Non-Custodial)**: 제3자가 자금을 직접 보유하지 않음
- **중재자 시스템**: 분쟁 발생 시 중재자가 수령자에게 전달 또는 발신자에게 환불만 가능
- **락업 기간 설정**: 일정 기간 후 자동 해제
- **오픈소스**: GitHub에 코드 공개
**작동 방식:**
```
구매자 → USDC 예치 → 스마트 컨트랙트(락업)
[조건 충족 확인]
판매자에게 USDC 전달 또는 환불
```
**비용:** 무료 (Gas fee만 발생)
**참고 링크:**
- https://www.circle.com/blog/refund-protocol-non-custodial-dispute-resolution-for-stablecoin-payments
- https://github.com/circlefin/stablecoin-evm
---
### Option B: Uniscrow
블록체인 에스크로 전문 서비스
**특징:**
- Ethereum + USDC 기반
- API, SDK, White Label 제공
- 자동화된 KPI 기반 결제 (API로 조건 검증)
- 법인/스타트업 지원
**비용:** 거래액의 1% (최소 $20)
**적합 시나리오:** 빠른 도입이 필요할 때
**참고 링크:**
- https://uniscrow.com/
- https://uniscrow.com/blockchain-escrow-payment/
---
### Option C: Guaranty Escrow
20년 이상 에스크로 경험을 가진 기업
**특징:**
- BitGo 기관급 멀티시그 커스터디
- USDC, USDT 지원
- 규제 준수 (미국 기준)
- 24/7 자산 보호
**비용:** 문의 필요 (기관 수준 서비스)
**참고 링크:**
- https://www.guaranty-escrow.com/1031-exchange-aspen/stablecoin-escrow-company/
---
### Option D: 자체 스마트 컨트랙트 개발
Circle의 오픈소스 코드를 활용한 커스텀 솔루션
**장점:**
- 완전한 커스터마이징
- 수수료 없음 (Gas만)
- 비즈니스 로직 직접 구현
**단점:**
- 개발 및 보안 감사 필요
- 스마트 컨트랙트 취약점 위험
---
## 2. AutonetSellCar 맞춤 에스크로 플로우 제안
```
┌─────────────────────────────────────────────────────────────────┐
│ 차량 구매 에스크로 플로우 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ [1단계] 구매자: USDC를 에스크로 컨트랙트에 예치 │
│ └→ 상태: "대금 예치 완료" (구매자 보호) │
│ │
│ [2단계] Grantech: 예치 확인 후 한국 딜러에게 차량 대금 지불 │
│ └→ 상태: "차량 확보 중" │
│ │
│ [3단계] 차량 인천항 도착 & 선적 │
│ └→ 상태: "운송 중" (B/L 업로드) │
│ │
│ [4단계] 몽골 통관 완료 & 인도 │
│ └→ 상태: "인도 완료" │
│ │
│ [5단계] 구매자 인수 확인 (앱에서 버튼 클릭) │
│ └→ 에스크로 해제 → Grantech에 USDC 전달 │
│ │
│ [분쟁 시] 중재자(Grantech 또는 제3자)가 증거 검토 후 결정 │
│ │
└─────────────────────────────────────────────────────────────────┘
```
---
## 3. 코인 월렛 통합 방안
### 추천 스택: WalletConnect + Wagmi
**지원 월렛:**
- MetaMask
- Coinbase Wallet
- Trust Wallet
- Rainbow
- 200+ 기타 월렛
**설치:**
```bash
npm install wagmi viem @web3modal/wagmi @tanstack/react-query
```
**구현 예시:**
```typescript
// Web3 Provider 설정
import { createWeb3Modal } from '@web3modal/wagmi/react'
import { defaultWagmiConfig } from '@web3modal/wagmi/react/config'
const config = defaultWagmiConfig({
chains: [mainnet, polygon, arbitrum, base],
projectId: 'YOUR_WALLETCONNECT_PROJECT_ID',
metadata: {
name: 'AutonetSellCar',
description: 'Korean Used Car Export Platform',
url: 'https://autonetsellcar.com',
icons: ['https://autonetsellcar.com/logo.png']
}
})
// 컴포넌트에서 사용
function ConnectButton() {
const { address, isConnected } = useAccount()
const { connect } = useConnect()
return (
<button onClick={() => open()}>
{isConnected ? `${address.slice(0,6)}...` : 'Connect Wallet'}
</button>
)
}
```
**참고 링크:**
- https://docs.walletconnect.com/web3modal/nextjs/about
---
## 4. 추천 구현 전략
### Phase 1: 빠른 MVP (1-2주)
- **Uniscrow API** 연동
- 기본 월렛 연결 (WalletConnect)
- 구매 플로우에 에스크로 통합
### Phase 2: 자체 솔루션 (1-2개월)
- Circle Refund Protocol 기반 커스텀 스마트 컨트랙트
- 배송 상태와 연동된 자동 해제 조건
- 분쟁 해결 대시보드
### Phase 3: 고급 기능
- 다중 서명(Multi-sig) 에스크로
- 부분 해제 (단계별 결제)
- 보험 연동
---
## 5. 블록체인 선택
| 체인 | Gas Fee | 속도 | USDC 지원 | 추천도 |
|------|---------|------|-----------|--------|
| **Base** | $0.01 미만 | 빠름 | ✅ | ⭐⭐⭐ |
| Polygon | $0.01-0.05 | 빠름 | ✅ | ⭐⭐⭐ |
| Arbitrum | $0.05-0.20 | 빠름 | ✅ | ⭐⭐ |
| Ethereum | $1-50 | 느림 | ✅ | ⭐ |
**추천:** Circle이 만든 **Base** 체인 - 저렴한 Gas, 빠른 속도, USDC 네이티브 지원
---
## 6. 에스크로 스마트 컨트랙트 예시 (Solidity)
```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
contract CarEscrow is ReentrancyGuard {
IERC20 public usdc;
enum EscrowState { Created, Funded, Shipped, Delivered, Completed, Disputed, Refunded }
struct Escrow {
address buyer;
address seller;
uint256 amount;
EscrowState state;
uint256 createdAt;
string vehicleId;
}
mapping(uint256 => Escrow) public escrows;
uint256 public escrowCount;
address public arbiter;
event EscrowCreated(uint256 indexed escrowId, address buyer, address seller, uint256 amount);
event EscrowFunded(uint256 indexed escrowId);
event VehicleShipped(uint256 indexed escrowId);
event VehicleDelivered(uint256 indexed escrowId);
event EscrowCompleted(uint256 indexed escrowId);
event EscrowRefunded(uint256 indexed escrowId);
event DisputeRaised(uint256 indexed escrowId);
constructor(address _usdc, address _arbiter) {
usdc = IERC20(_usdc);
arbiter = _arbiter;
}
// 에스크로 생성 및 USDC 예치
function createEscrow(
address _seller,
uint256 _amount,
string memory _vehicleId
) external nonReentrant returns (uint256) {
require(_amount > 0, "Amount must be greater than 0");
require(usdc.transferFrom(msg.sender, address(this), _amount), "Transfer failed");
escrowCount++;
escrows[escrowCount] = Escrow({
buyer: msg.sender,
seller: _seller,
amount: _amount,
state: EscrowState.Funded,
createdAt: block.timestamp,
vehicleId: _vehicleId
});
emit EscrowCreated(escrowCount, msg.sender, _seller, _amount);
emit EscrowFunded(escrowCount);
return escrowCount;
}
// 판매자: 차량 선적 완료 표시
function markShipped(uint256 _escrowId) external {
Escrow storage escrow = escrows[_escrowId];
require(msg.sender == escrow.seller, "Only seller");
require(escrow.state == EscrowState.Funded, "Invalid state");
escrow.state = EscrowState.Shipped;
emit VehicleShipped(_escrowId);
}
// 구매자: 차량 인수 확인 → 판매자에게 대금 전달
function confirmDelivery(uint256 _escrowId) external nonReentrant {
Escrow storage escrow = escrows[_escrowId];
require(msg.sender == escrow.buyer, "Only buyer");
require(escrow.state == EscrowState.Shipped, "Invalid state");
escrow.state = EscrowState.Completed;
require(usdc.transfer(escrow.seller, escrow.amount), "Transfer failed");
emit VehicleDelivered(_escrowId);
emit EscrowCompleted(_escrowId);
}
// 분쟁 제기
function raiseDispute(uint256 _escrowId) external {
Escrow storage escrow = escrows[_escrowId];
require(
msg.sender == escrow.buyer || msg.sender == escrow.seller,
"Only buyer or seller"
);
require(
escrow.state == EscrowState.Funded || escrow.state == EscrowState.Shipped,
"Invalid state"
);
escrow.state = EscrowState.Disputed;
emit DisputeRaised(_escrowId);
}
// 중재자: 분쟁 해결
function resolveDispute(uint256 _escrowId, bool _releaseToBuyer) external nonReentrant {
require(msg.sender == arbiter, "Only arbiter");
Escrow storage escrow = escrows[_escrowId];
require(escrow.state == EscrowState.Disputed, "Not disputed");
if (_releaseToBuyer) {
escrow.state = EscrowState.Refunded;
require(usdc.transfer(escrow.buyer, escrow.amount), "Transfer failed");
emit EscrowRefunded(_escrowId);
} else {
escrow.state = EscrowState.Completed;
require(usdc.transfer(escrow.seller, escrow.amount), "Transfer failed");
emit EscrowCompleted(_escrowId);
}
}
}
```
---
## 7. 참고 자료
- [Circle Refund Protocol](https://www.circle.com/blog/refund-protocol-non-custodial-dispute-resolution-for-stablecoin-payments)
- [Circle Stablecoin EVM GitHub](https://github.com/circlefin/stablecoin-evm)
- [Uniscrow Blockchain Escrow](https://uniscrow.com/blockchain-escrow-payment/)
- [Guaranty Escrow Stablecoin Services](https://www.guaranty-escrow.com/1031-exchange-aspen/stablecoin-escrow-company/)
- [WalletConnect Web3Modal Docs](https://docs.walletconnect.com/web3modal/nextjs/about)
- [Propy Onchain Escrow](https://www.inman.com/2024/10/24/propy-advances-onchain-escrow/)
---
---
# USDC 대금 수령 시 국내 법적 검토
## 결론 요약
| 항목 | 현재 상태 | 위험도 |
|------|----------|--------|
| VASP 등록 의무 | **해당 가능성 높음** | 🔴 높음 |
| 외국환거래법 | **2025 하반기 신고 의무화** | 🔴 높음 |
| 법인세 | **과세 대상** | 🟡 중간 |
| 부가가치세 | **불명확 (해석 필요)** | 🟡 중간 |
| 자금세탁방지 | **Travel Rule 적용** | 🔴 높음 |
---
## 8. 가상자산사업자(VASP) 등록 의무
### 현행법 (특금법)
특금법 제2조에 따르면, **가상자산의 매도, 매수, 교환, 이전, 보관, 관리, 중개, 알선** 등의 영업을 하는 자는 가상자산사업자로 신고해야 합니다.
**Grantech 해당 여부 분석:**
| 행위 | VASP 해당? | 설명 |
|------|-----------|------|
| USDC 수령 (대금결제) | △ 불명확 | 단순 수령은 해당 안 될 수 있음 |
| USDC → 원화 환전 | ✅ 해당 | 교환 행위로 해석 가능 |
| 에스크로 보관 | ✅ 해당 | 보관/관리로 해석 가능 |
| 고객 월렛 제공 | ✅ 해당 | 관리 서비스로 해석 |
### VASP 등록 요건
1. **ISMS 인증** (한국인터넷진흥원) - 102개 심사 항목
2. **실명확인 입출금계정** - 은행과 계약 필요
3. **대표자/임원 결격사유 없음**
4. **AML/KYC 체계 구축**
### 미등록 시 처벌
> **최대 5년 이하 징역 또는 5천만원 이하 벌금**
---
## 9. 외국환거래법 적용
### 2025년 개정 사항 (중요!)
2025년 하반기부터 **가상자산 국제거래 신고 의무화**가 시행됩니다.
**신고 의무 내용:**
- 국제 가상자산 거래 사업자는 **사전 등록** 필요
- **매월** 한국은행에 거래 보고서 제출
- 데이터는 국세청, 관세청, 금융당국과 공유
**위반 시 문제:**
- 국제 가상자산 거래의 **88%가 불법 외환거래**로 적발 (관세청 추정)
-**1.65조원** 규모의 외환범죄가 가상자산 관련
### Grantech 리스크
```
몽골 구매자 → USDC 송금 → Grantech (한국)
[외국환거래법 적용 대상]
```
---
## 10. 세금 문제
### 법인세 (해당)
법인이 가상자산을 취득/처분하면 **법인세 과세 대상**입니다.
```
USDC 수령 시점: 시가로 원화 환산 → 수익 인식
USDC 처분 시점: 취득가와 처분가 차이 → 손익 인식
```
**취득가액 평가방법:**
- 거래소 경유: **이동평균법**
- 그 외: **선입선출법**
### 부가가치세 (불명확)
현재 가상자산 결제에 대한 부가세 규정이 명확하지 않습니다.
**쟁점:**
- 차량 판매 대금을 USDC로 받으면 과세표준은?
- USDC → 원화 환전 시 부가세 적용?
**권장:** 세무사 자문 필요
---
## 11. 디지털자산기본법 (2025-2026)
### 2025년 6월 통과
디지털자산기본법(DABA)이 통과되어 **2026년 1월 시행** 예정입니다.
**주요 내용:**
- 스테이블코인 발행자 **자본금 50억원** 요구
- 거래소의 자체 스테이블코인 발행 **금지**
- 은행이 51% 이상 지분 보유해야 스테이블코인 발행 가능
- **원화 스테이블코인** 규제 도입
### Grantech 영향
- USDC는 **외국 스테이블코인**으로 분류
- 사용 자체는 금지되지 않으나, **규제 준수 부담 증가**
---
## 12. 자금세탁방지 (AML)
### Travel Rule 강화
2025년 11월부터 **모든 금액**에 Travel Rule 적용 (기존 100만원 미만 면제 폐지)
**의무 사항:**
- 송금인/수취인 정보 확인
- 거래소 간 정보 공유
- 의심거래 보고 (STR)
---
## 13. 법적 리스크 최소화 방안
### Option A: 직접 USDC 수령 (고위험)
```
[필요 조치]
1. VASP 등록 (ISMS 인증, 실명계좌)
2. 외국환거래 신고
3. AML/KYC 시스템 구축
4. 세무 자문
[예상 비용] 1-2억원 이상 + 6개월 이상 소요
[위험] VASP 등록 심사 1년 이상 지연 중
```
### Option B: 제3자 결제대행 활용 (중위험)
```
[구조]
구매자 → USDC → 결제대행사(해외 VASP) → 원화 → Grantech
[장점]
- VASP 등록 불필요
- 외국환거래법 리스크 감소
[단점]
- 수수료 발생 (1-3%)
- 결제대행사 의존
```
**가능한 서비스:**
- Circle 비즈니스 계정
- Coinbase Commerce
- BitPay
### Option C: 해외 법인 설립 (저위험)
```
[구조]
구매자 → USDC → Grantech Mongolia LLC → 한국 법인
[장점]
- 한국 VASP 규제 회피
- 몽골에서 합법적 운영
[단점]
- 해외법인 설립/운영 비용
- 이전가격 세무 이슈
```
### Option D: 원화 결제만 수령 (무위험)
```
[구조]
구매자 → 현지 거래소에서 USDC → 원화 환전 → 송금 → Grantech
[장점]
- 모든 규제 회피
- 기존 외환 시스템 활용
[단점]
- 고객 불편
- 송금 수수료 발생
```
---
## 14. 권장 사항
### 단기 (즉시)
1. **세무사/법무사 자문** 받기
2. **Option D** (원화 결제)로 시작
3. 규제 동향 모니터링
### 중기 (6개월 내)
1. **Option B** (결제대행) 검토
2. 해외 결제대행사 계약
3. 몽골 규제 환경 조사
### 장기 (1년 이상)
1. 디지털자산기본법 시행 후 재검토
2. **Option A** (VASP 등록) 또는 **Option C** (해외법인) 결정
---
## 15. 법적 검토 참고 자료
- [한국 가상자산법과 스테이블코인 전망](https://bd-notes2155.com/blog/2025/11/13/korea-virtual-asset-law-stablecoin-outlook-2026/)
- [Korea Digital Asset Basic Act](https://www.thekoreanlawblog.com/2025/09/korean-digital-asset-basic-act.html)
- [Korea Stablecoin Regulation Framework](https://law.asia/korea-stablecoin-regulation-framework/)
- [가상자산 사업자 등록 절차](https://www.coinbro.blog/2025/06/vasp-registration-guide.html)
- [Korea Foreign Exchange Transactions Regulations](https://www.lexology.com/library/detail.aspx?g=e4901a9c-d89b-4337-9d09-1e9d01fc4ccf)
- [South Korea Cross-Border Crypto Monitoring](https://www.blockhead.co/2024/10/28/south-korea-to-monitor-cross-border-crypto-transactions/)
- [가상자산 과세 유예 2027년](https://kbthink.com/crypto/crypto-tax.html)
- [특금법 VASP 갱신 심사 지연](https://www.ajunews.com/view/20251202082307835)
---
*작성일: 2025-12-15*
*법적 검토 추가: 2025-12-15*