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

25 KiB

파일 서버 구축 상세 문서

작성일: 2025-12-05 서버: Server3 (192.168.0.203) 운영체제: Ubuntu 22.04.5 LTS Server


목차

  1. 아키텍처 개요
  2. 기술 스택
  3. 하드웨어 구성
  4. 디스크 설정
  5. Samba 파일 서버
  6. Nextcloud 클라우드
  7. 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. 디스크 확인

# 연결된 디스크 확인
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. 파티션 생성

# 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 파일시스템 생성

# 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. 마운트 포인트 생성 및 마운트

# 마운트 디렉토리 생성
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)

# 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. 디렉토리 구조 생성

# 공유 폴더 생성
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 설치

# 패키지 설치
sudo apt update
sudo apt install -y samba samba-common-bin

# 서비스 상태 확인
sudo systemctl status smbd
sudo systemctl status nmbd

2. 사용자 생성

# 시스템 사용자 생성 (이미 있으면 생략)
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 설정

sudo nano /etc/samba/smb.conf

전체 설정 파일

# /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. 설정 검증 및 서비스 재시작

# 설정 문법 검사
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. 방화벽 설정

# 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 명령어

# 공유 드라이브 연결
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 설정

# 디렉토리 생성
mkdir -p ~/nextcloud
cd ~/nextcloud

docker-compose.yml

# ~/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 시작

# 컨테이너 시작
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


보안 설정

접근 제어

┌─────────────────────────────────────────────────────────────────┐
│                      보안 계층 구조                              │
└─────────────────────────────────────────────────────────────────┘

  [인터넷]
     │
     ▼
  ┌──────────────────┐
  │   공유기 방화벽   │  ← 포트포워딩으로 제한된 포트만 허용
  │   (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 읽기/쓰기 접근불가 ⚠️ 제한적

파일 권한

# /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 연결 문제

증상: "네트워크 경로를 찾을 수 없습니다"

# 서버에서 확인
sudo systemctl status smbd

# 포트 확인
sudo netstat -tlnp | grep 445

# Windows에서 테스트
ping 192.168.0.203

증상: "로그온 실패"

# Samba 사용자 확인
sudo pdbedit -L

# 비밀번호 재설정
sudo smbpasswd -a username

증상: "권한이 없습니다"

# 디렉토리 권한 확인
ls -la /data/share

# 권한 수정
sudo chmod 775 /data/share
sudo chown damon:damon /data/share

Nextcloud 문제

증상: 502 Bad Gateway

# 컨테이너 상태 확인
docker compose ps

# 컨테이너 재시작
docker compose restart nextcloud

증상: 외부 스토리지 접근 불가

# 컨테이너 내부 권한 확인
docker exec nextcloud ls -la /external/

# 권한 수정 (호스트에서)
sudo chmod 755 /data/share

로그 확인

# Samba 로그
sudo tail -f /var/log/samba/log.smbd

# Nextcloud 로그
docker compose logs -f nextcloud

# 시스템 로그
sudo journalctl -u smbd -f

유지보수

일일 점검

# 디스크 사용량
df -h /data

# 서비스 상태
sudo systemctl status smbd
docker compose ps

# 현재 Samba 연결
sudo smbstatus

백업 전략

# 중요 설정 파일 백업
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

업데이트

# Samba 업데이트
sudo apt update && sudo apt upgrade samba

# Nextcloud 업데이트
cd ~/nextcloud
docker compose pull
docker compose up -d

부록: 명령어 요약

서비스 관리

# 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

사용자 관리

# Samba 사용자 추가
sudo smbpasswd -a username

# Samba 사용자 삭제
sudo smbpasswd -x username

# Samba 사용자 목록
sudo pdbedit -L

디스크 관리

# 용량 확인
df -h /data

# 디렉토리별 용량
du -sh /data/*

# inode 확인
df -i /data

변경 이력

날짜 변경 내용 작업자
2025-12-05 초기 구축 및 문서 작성 Claude

문서 작성일: 2025-12-05