# 파일 서버 구축 상세 문서

**작성일**: 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*
