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