805 미니서버 구축기
| parent_topic | 800-프로젝트 |
| types | 실습 도구 |
| contexts | 프로젝트 |
| tags | |
| period | 2024.10 ~ 진행중 |
| environment | Ubuntu Server + Docker |
미니서버 구축기
집에서 운영하는 미니 PC로 개인 서버를 구축하는 프로젝트
시작 동기
왜 미니서버인가
- 개인 데이터 관리: 클라우드 의존성을 줄이고 데이터를 직접 관리하고 싶었다
- 학습 목적: 서버 운영 전반을 실습하며 배우고 싶었다
- 파일 공유/백업: NAS 기능과 함께 서비스 배포까지 하고 싶었다
클라우드 비용을 계속 내야 하고 데이터가 남의 손에 있는 게 불안하지 않아?
미니 PC 하나 사서 직접 운영하면 장기적으로 비용도 절약되고 배우는 것도 많다
목표 구성
- 안정적인 서버 운영 환경 구축
- Docker 기반으로 서비스 컨테이너화
- 모니터링 시스템 구축 (Prometheus + Grafana)
- SMB를 통한 파일 공유/백업 시스템
- 보안 강화 (SSH, 방화벽, ACL)
기술 스택
| 분류 | 기술 |
|---|---|
| OS | Ubuntu Server |
| 컨테이너 | Docker, Docker Compose |
| 리버스 프록시 | Nginx (호스트 설치) |
| 모니터링 | Prometheus, Grafana, Node Exporter |
| 데이터베이스 | MySQL (호스트 설치) |
| 파일 공유 | SMB/CIFS, SSH |
진행 단계
1단계: 하드웨어 및 OS 설치
2단계: 네트워크 구성
- 공유기 포트포워딩 설정
- Hairpin NAT 해결 과정
- ISP 포트 차단 대응
3단계: 보안 설정
- 서버 보안강화 - 접근
- SSH 키 기반 인증
- UFW 방화벽 설정
- ACL을 통한 접근 제어
4단계: 배포 환경
- 서버 배포 flow 만들기
- Docker Compose 구성
- GitHub Actions CI/CD
5단계: 모니터링 구축
아키텍처
[호스트]
├── Nginx (리버스 프록시)
├── MySQL (데이터베이스)
├── Node Exporter
└── Docker
├── Prometheus
├── Grafana
├── Spring Apps
└── 기타 서비스
왜 이렇게 구성했냐면
| 컴포넌트 | 설치 위치 | 이유 |
|---|---|---|
| Nginx | 호스트 | 진입점이라 Docker 죽어도 동작해야 함 |
| MySQL | 호스트 | 데이터 안전성, I/O 성능 |
| Node Exporter | 호스트 | 호스트 메트릭 수집 |
| Prometheus | Docker | 스토리지 볼륨만 관리하면 OK |
| Grafana | Docker | stateless, 이식성 좋음 |
| Apps | Docker | 관리 편함, 격리 |
삽질 포인트
3시간 삽질한 끝에 알아낸 것: ISP가 445, 22 같은 well-known 포트를 차단한다
교훈: 외부 포트를 다른 번호로 매핑해서 사용해야 한다
현재 상태
완료된 것
- 안정적인 서버 운영 환경 (Docker)
- Grafana 모니터링 대시보드
- SMB 파일 공유/백업
진행 중
- Loki를 통한 로그 수집
- 알림 규칙 설정
- SSL 인증서 자동 갱신
장점과 단점
장점
- 개인 데이터를 직접 관리할 수 있다
- 학습 효과가 크다 (네트워크, 보안, Docker 등)
- 장기적으로 비용 절약
단점
- 초기 설정이 복잡하다
- 정전/장애 시 직접 대응 필요
- 소음, 전력 문제 (소음, 발열 등)
- 외부에서 접근 시 보안 위험