노트북으로 홈서버 구축하기 - Fail2ban으로 SSH 브루트포스 공격 차단하기 (8편)

얼마나 많이 들어오나 OCI 서버는 공인 IP가 직접 노출돼 있어서 설치 직후부터 SSH 로그인 시도가 들어온다. auth.log를 열어봤다가 깜짝 놀랐다. sudo grep "Failed password" /var/log/auth.log | tail -20 Invalid user admin, Invalid user guest, Invalid user root 같은 로그가 수분 간격으로 끊임없이 들어오고 있었다. 전 세계 봇들이 24시간 SSH 로그인을 시도하는 것이다. 방치하면 언젠가 뚫릴 수 있고, 서버 리소스도 낭비된다. Fail2ban이란? 로그 파일을 모니터링하다가 일정 횟수 이상 로그인에 실패한 IP를 자동으로 방화벽에서 차단하는 도구다. ...

2026년 3월 30일 · 3 분 · 541 단어 · Chanyeol

노트북으로 홈서버 구축하기 - Grafana + Prometheus로 서버 모니터링하기 (7편)

구성 개요 모니터링 스택은 세 가지로 구성된다. Prometheus — 메트릭 수집 및 저장 Grafana — 대시보드 시각화 Node Exporter — 서버 시스템 메트릭 노출 (CPU, RAM, 디스크, 네트워크 등) Prometheus와 Grafana는 홈서버에서 Docker로 실행하고, Node Exporter는 홈서버와 OCI 서버 양쪽에 systemd로 설치했다. 두 서버가 Tailscale VPN으로 연결돼 있으니 Prometheus가 VPN을 통해 OCI 메트릭도 수집할 수 있다. 서비스 포트 Prometheus 19090 Grafana 13000 Node Exporter 19100 1. 디렉토리 생성 mkdir ~/monitoring && cd ~/monitoring 2. docker-compose.yml 작성 services: prometheus: image: prom/prometheus:latest container_name: prometheus restart: unless-stopped ports: - "19090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--storage.tsdb.retention.time=30d' grafana: image: grafana/grafana:latest container_name: grafana restart: unless-stopped ports: - "13000:3000" volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=your_password_here - GF_SERVER_ROOT_URL=http://100.64.0.10:13000 volumes: prometheus_data: grafana_data: version: "3.8" 은 Docker Compose v2부터 obsolete라 생략했다. 넣어도 동작하지만 경고가 뜬다. ...

2026년 3월 29일 · 3 분 · 582 단어 · Chanyeol

노트북으로 홈서버 구축하기 - Portainer CE로 Docker GUI 관리하기 (6편)

왜 Portainer인가 Filebrowser, Immich, Vaultwarden, Prometheus, Grafana… 서비스가 하나씩 늘어나다 보니 컨테이너가 어느새 8개가 넘었다. 매번 SSH 접속해서 docker ps, docker logs, docker compose restart 치는 게 점점 번거로워졌다. Portainer CE는 Docker를 웹 UI로 관리할 수 있는 오픈소스 도구다. 컨테이너 시작/중지/재시작, 실시간 로그 확인, 볼륨/네트워크 관리까지 브라우저에서 다 된다. CE(Community Edition)는 무료다. 설치 1. 디렉토리 생성 mkdir -p ~/portainer && cd ~/portainer 2. docker-compose.yml 작성 services: portainer: image: portainer/portainer-ce:latest container_name: portainer restart: always ports: - "19000:9000" - "18000:8000" volumes: - /var/run/docker.sock:/var/run/docker.sock - portainer_data:/data volumes: portainer_data: 핵심은 /var/run/docker.sock을 마운트하는 것이다. 이를 통해 Portainer가 호스트의 Docker 데몬에 직접 접근할 수 있다. ...

2026년 3월 28일 · 2 분 · 290 단어 · Chanyeol

노트북으로 홈서버 구축하기 - Vaultwarden으로 비밀번호 자체 호스팅하기 (5편)

Vaultwarden이란? Bitwarden의 오픈소스 서버 구현체다. 공식 Bitwarden 앱, 브라우저 확장 프로그램과 100% 호환되면서, 내 서버에서 직접 운영할 수 있다. 구글 비밀번호 관리자를 쭉 써왔는데, 비밀번호를 외부 서비스에 맡기는 게 항상 마음에 걸렸다. 홈서버가 생겼으니 직접 호스팅하기로 했다. 설치 1. 디렉토리 생성 mkdir -p ~/vaultwarden && cd ~/vaultwarden 2. docker-compose.yml 작성 services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: always ports: - "11000:80" volumes: - vaultwarden_data:/data environment: - DOMAIN=https://vault.yourdomain.com - SIGNUPS_ALLOWED=true volumes: vaultwarden_data: DOMAIN에 실제 접근할 도메인을 설정해야 한다. Vaultwarden이 HTTPS 환경에서 동작한다고 인식해야 브라우저 확장 연동이 정상적으로 된다. ...

2026년 3월 27일 · 2 분 · 346 단어 · Chanyeol

노트북으로 홈서버 구축하기 - Immich로 구글 포토 대체하기 (4편)

Immich란? 구글 포토와 거의 동일한 UX를 제공하는 자체 호스팅 사진 관리 서비스다. 얼굴 인식, 지도 뷰, 앨범, 공유 기능까지 있고 모바일 앱도 있어서 자동 백업이 된다. 구글 포토 유료 요금제를 쓰고 있었는데 이걸로 완전히 대체했다. 설치 과정 1. 디렉토리 생성 mkdir ~/immich && cd ~/immich 2. docker-compose.yml 및 .env 다운로드 Immich 공식에서 제공하는 파일을 그대로 받아서 쓴다. wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env 3. .env 파일 수정 vi .env 아래 두 경로를 수정한다. ...

2026년 3월 26일 · 3 분 · 509 단어 · Chanyeol

노트북으로 홈서버 구축하기 - 외장 SSD 마운트 + Filebrowser 원격 파일 관리 (3편)

외장 SSD 마운트 집에 1TB SSD가 남아있어서 홈서버 스토리지로 활용하기로 했다. 기존에 Windows에서 쓰던 드라이브라 NTFS 포맷이다. 디스크 확인 lsblk 어떤 디바이스명으로 잡혔는지 확인한다. 파티션 포맷 확인: sudo blkid /dev/nvme1n1p2 NTFS로 확인됐으니 마운트를 진행한다. 마운트 sudo apt install ntfs-3g -y sudo mkdir /mnt/data sudo mount /dev/nvme1n1p2 /mnt/data 마운트 후 확인해보니 Could not mount read-write, trying read-only 메시지가 떴다. 읽기 전용으로 마운트된 것이다. Windows에서 쓰던 드라이브라 더티 플래그가 남아있어서 발생하는 문제다. ...

2026년 3월 25일 · 3 분 · 508 단어 · Chanyeol

노트북으로 홈서버 구축하기 - Ubuntu Server 설치 + Tailscale VPN (2편)

OS 선택 Windows를 그대로 쓸까, Linux native로 갈까 고민했다. Docker 운영이 메인이고 서버답게 쓰려면 Linux가 맞다. Ubuntu Server 24.04 LTS로 결정했다. Ubuntu Server 설치 준비물 Ventoy — USB를 부팅 드라이브로 만들어주는 도구다. 일반적인 방식은 ISO를 USB에 굽는 방식인데, Ventoy는 USB 하나에 여러 ISO를 넣고 부팅 시 선택할 수 있어서 훨씬 편하다. Ventoy 다운로드: https://github.com/ventoy/Ventoy/releases Ubuntu Server 24.04 LTS ISO 다운로드: https://ubuntu.com/download/server 설치 순서 1. Ventoy2Disk.exe 실행 USB를 꽂고 Ventoy2Disk.exe를 실행한다. 사용할 USB를 선택하고 Install을 누른다. ...

2026년 3월 24일 · 2 분 · 310 단어 · Chanyeol

노트북으로 홈서버 구축하기 - 왜 홈서버인가? (1편)

왜 홈서버를 만들게 됐나 개인 블로그를 운영하면서 OCI(Oracle Cloud) 무료 인스턴스 하나를 쭉 써왔다. 1 vCPU, 1GB RAM짜리라 Hugo 정적 블로그 서빙에는 충분했는데, 문제는 점점 하고 싶은 게 늘어난다는 것이다. 사진 파일이 쌓이면서 개인 NAS가 필요해졌다 사이드 프로젝트 돌릴 서버가 필요했다 비밀번호 관리도 외부 서비스 말고 직접 하고 싶었다 클라우드로 커버하면 되지 않냐 싶지만, 스토리지가 좀 붙으면 요금이 눈에 띄게 올라간다. 마침 집에 안 쓰는 노트북이 하나 있었고, 거기서부터 홈서버 구축기가 시작됐다. ...

2026년 3월 24일 · 2 분 · 399 단어 · Chanyeol

로컬 LLM Ollama와 Spring Boot 연동하기: 서버 설정과 성능 최적화 (2편)

[Dev-Fortune] 시리즈 다시보기 1편: 기획부터 스택 선정까지 2편: 로컬 LLM Ollama 연동 3편: RAG와 Vector Store 구축 4편: 프롬프트 엔지니어링 실전 5편: 스트리밍 API 구현 6편: 전체 워크플로우 분석 7편: 프로젝트 회고와 로드맵 1. 서론: 왜 유료 클라우드 API 대신 로컬 LLM인가? AI 서비스를 기획할 때 가장 먼저 떠올리는 솔루션은 OpenAI의 ChatGPT API나 Anthropic의 Claude API입니다. 이들 상용 모델은 현존 최고의 성능을 자랑하지만, 개발 단계나 프로토타입 검증 시점에는 치명적인 걸림돌이 따릅니다. ...

2026년 3월 18일 · 4 분 · 784 단어 · Chanyeol

Spring Boot 예외 처리 통일하기 — @ControllerAdvice와 @ExceptionHandler

1. 서론: 왜 예외 처리를 통일해야 하는가? API를 개발하다 보면 다양한 예외 상황이 발생합니다. 데이터가 없는 경우, 입력값이 잘못된 경우, 서버 내부 로직 오류 등이 대표적입니다. 이때 각 컨트롤러에서 try-catch로 예외를 개별 처리하면 다음과 같은 문제가 발생합니다. 코드 중복: 비슷한 예외 처리 로직이 여러 컨트롤러에 반복됩니다. 응답 일관성 부족: 어떤 API는 JSON으로 에러를 주는데, 어떤 API는 HTML 에러 페이지를 주는 등 응답 형식이 제각각이 됩니다. 비즈니스 로직 집중도 저하: 예외 처리 코드가 섞여 있어 핵심 로직을 파악하기 힘듭니다. Spring은 이를 우아하게 해결할 수 있도록 @ControllerAdvice와 @ExceptionHandler를 제공합니다. ...

2026년 3월 17일 · 2 분 · 401 단어 · Chanyeol