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:
867
Doc/FILE_SERVER_SETUP_2025-12-05.md
Normal file
867
Doc/FILE_SERVER_SETUP_2025-12-05.md
Normal 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
157
Doc/관세.md
Normal 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
566
Doc/에스크로.md
Normal 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*
|
||||
Reference in New Issue
Block a user