Files
AutonetSellCar/Doc/FILE_SERVER_SETUP_2025-12-05.md
AutonetSellCar Deploy 1f0dcb1ddb 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>
2025-12-30 13:24:39 +09:00

868 lines
25 KiB
Markdown

# 파일 서버 구축 상세 문서
**작성일**: 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*