집 한구석 서랍에 잠들어 있던 ThinkPad E15 Gen3로 홈서버를 구축한 지 어느덧 6개월이 흘렀습니다.

처음 홈서버 구축기 1편을 작성할 때만 해도 “과연 노트북 따위로 웹 서비스와 도커 컨테이너들을 다운 없이 안정적으로 굴릴 수 있을까?” 하는 의구심이 컸습니다. 하지만 지금 이 서버는 가족 사진 아카이빙(Immich), 비밀번호 자체 호스팅(Vaultwarden), 사내 업무 자동화 봇, 그리고 직접 개발한 컨테이너 대시보드까지 담당하는 개인 핵심 인프라로 완전히 자리 잡았습니다.

지난 6개월간 24시간 365일 체제로 돌리면서 스마트 플러그로 꼼꼼히 기록한 실제 전력 소비량과 전기세, 배터리 부풀림(스웰링) 방지 노하우, 그리고 새벽에 식은땀을 흘리게 만들었던 3번의 장애와 복구 과정을 정리해보았습니다.


1. 6개월간 운영한 시스템 스펙 및 아키텍처

먼저 현재 24시간 무중단 가동 중인 하드웨어 사양과 소프트웨어 구성입니다.

flowchart TD User["외부 접속 (모바일 / 사외)"] --> Cloudflare["Cloudflare DNS & Proxy"] Cloudflare --> OCI["Oracle Cloud (무료 티어 인스턴스)"] OCI -->|Tailscale 암호화 터널| ThinkPad["홈서버 (ThinkPad E15 Gen3)"] subgraph HomeLab["홈서버 내부 컨테이너 (Docker Compose)"] ThinkPad --> Immich["Immich (사진 백업)"] ThinkPad --> Vault["Vaultwarden (암호 관리)"] ThinkPad --> Monitoring["Prometheus & Grafana"] ThinkPad --> DB["PostgreSQL 16"] ThinkPad --> Custom["자체 제작 스프링 대시보드"] end
  • 기기: Lenovo ThinkPad E15 Gen3
  • CPU: AMD Ryzen 5 5600U (6코어 12스레드, 기본 2.3GHz / 최대 4.2GHz)
  • 메모리: 16GB DDR4 (온보드 8GB + 슬롯 8GB)
  • 스토리지: 내장 NVMe 256GB (Ubuntu Server 24.04 OS 및 도커 엔진) + 외장 USB SSD 1TB (/mnt/data 사진 데이터 및 DB 덤프)
  • 네트워크: Wi-Fi 연결 + Tailscale VPN Mesh Network
  • 외부 노출 방식: 오라클 클라우드 프리티어 인스턴스를 리버스 프록시로 두고, 홈서버와는 Tailscale 사설망으로 통신하여 공인 IP 개방 없이 안전하게 서비스

Ryzen 5 5600U는 6코어 12스레드를 지원하면서도 TDP가 15W 수준인 모바일 저전력 APU라, 10여 개 이상의 도커 컨테이너를 상시 띄워두는 홈서버 용도로는 최고의 가성비를 보여주었습니다.


2. 실측 데이터: 전기세, 소비 전력, 발열 관리

홈서버를 노트북으로 구축할 때 가장 많이 받는 질문이 “전기세 폭탄 맞지 않느냐”, “노트북 배터리 터지는 것 아니냐"는 걱정입니다.

스마트 플러그 실측 소비 전력

Tuya 스마트 플러그를 꽂아 6개월간 일일 전력 사용량을 실측했습니다.

  • 아이들(Idle) 상태: 약 7W ~ 9.5W (도커 14개 컨테이너 상시 구동)
  • 사진 업로드 및 Immich ML 얼굴 인식/인덱싱 동작 시: 약 22W ~ 27W (CPU 점유율 80% 구간)
  • 월평균 총 소비 전력량: 약 7.5 kWh ~ 8.8 kWh

일반 가정용 전기 요금 누진제 2단계(kWh당 약 214원)를 기준으로 계산했을 때, 월 전기세는 약 1,600원 ~ 1,900원 수준에 불과했습니다. 편의점 캔커피 한 잔 가격으로 16GB 램을 갖춘 나만의 클라우드 VPS를 굴리는 셈입니다.

배터리 스웰링 방지와 발열 제어

24시간 내내 전원 어댑터가 꽂혀 있으면 리튬이온 배터리가 부풀어 오르는 스웰링 현상이 발생할 수 있습니다. 씽크패드는 리눅스 환경에서도 배터리 충전 임계값을 커널 레벨에서 제어할 수 있습니다.

# 배터리 충전 시작 임계치 70%, 중지 임계치 75% 설정
echo 70 | sudo tee /sys/class/power_supply/BAT0/charge_control_start_threshold
echo 75 | sudo tee /sys/class/power_supply/BAT0/charge_control_end_threshold

이렇게 설정하면 배터리 잔량이 75%에 도달하는 순간 충전 회로가 완전히 차단되고 어댑터 직결 전원으로만 구동됩니다. 6개월이 지난 지금도 배터리 웨어율(Wear Level)은 5% 미만으로 매우 건강한 상태입니다.

또한 11편 성능 튜닝에서 다루었던 thinkfan 데몬을 통해 CPU 온도가 50도 이하일 때는 쿨링팬 RPM을 완전히 0으로 유지하도록 설정해, 침실 옆 책상 위에 두고도 팬 돌아가는 소리를 전혀 들을 수 없는 완전 무소음 환경을 유지하고 있습니다.


3. 6개월간 겪었던 실전 장애 TOP 3 복구기

아무리 세팅을 꼼꼼하게 해도 실제 운영 환경에서는 예상치 못한 장애가 터져 나왔습니다.

장애 1: 새벽 3시 디스크 100% 폭주로 전체 컨테이너 다운

어느 날 새벽 3시경 슬랙 모니터링 봇으로부터 모든 서비스 헬스체크가 실패했다는 알림이 쏟아졌습니다. SSH로 급히 서버에 붙어보니 터미널에서 탭(Tab) 자동완성조차 되지 않았습니다.

$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  235G  235G     0 100% /

ncdu 도구로 확인해보니 범인은 /var/lib/docker/containers/ 하위의 *-json.log 파일들이었습니다. 도커의 기본 로깅 드라이버는 크기 제한이 없어서, Immich의 머신러닝 프로세스와 백엔드 로그가 수개월간 누적되어 무려 180GB를 집어삼킨 것이었습니다.

해결 방법: 즉시 /etc/docker/daemon.json에 글로벌 로그 로테이션 옵션을 강제 적용하고 도커 데몬을 재시작했습니다.

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

각 컨테이너당 최대 150MB까지만 로그를 남기고 오래된 파일은 자동으로 회전(rotate)되도록 제한하여 영구적으로 재발을 차단했습니다.

장애 2: 공유기 펌웨어 업데이트 후 외부 접속 전면 마비

출장 중이던 주말, 갑자기 홈서버 내 모든 도메인이 열리지 않는 문제가 터졌습니다.

원인은 통신사 공유기가 야간에 펌웨어 자동 업데이트를 진행하면서 재부팅되었고, DHCP로 할당받던 홈서버의 로컬 IP가 192.168.0.15에서 192.168.0.82로 바뀌어버린 것이었습니다. Tailscale 데몬은 살아있었지만, 공유기 포트포워딩과 로컬 브릿지 라우팅이 꼬여 내부 통신이 단절되었습니다.

해결 방법:

  • 공유기 관리 페이지에서 홈서버의 MAC 주소에 대해 고정 IP(DHCP Reservation)를 할당했습니다.
  • 서버 내부 네트워크 설정도 Netplan을 사용해 고정 IP(static) 체계로 변경하여 공유기 상태와 무관하게 네트워크가 유지되도록 조치했습니다.

장애 3: 순간 정전 후 배터리 방전, 전원 복구 시 자동 켜짐 실패

아파트 단지 배전반 점검으로 약 4시간 동안 정전이 발생했던 날이 있었습니다. ThinkPad의 자체 배터리로 3시간 반 동안 무정전 상태를 훌륭히 방어했으나, 정전이 예상보다 길어지며 결국 배터리가 소진되어 서버가 정상 셧다운되었습니다.

문제는 30분 뒤 전기가 다시 들어왔는데도 서버가 켜지지 않았다는 점입니다. 일반 데스크톱 PC 메인보드에는 Restore AC Power Loss 옵션이 있어 전원이 공급되면 자동으로 켜지지만, 노트북 BIOS에는 이 기능이 없는 경우가 많습니다.

해결 방법: ThinkPad BIOS 전원 메뉴(Config -> Power)를 샅샅이 뒤져 다음 2가지 하드웨어 우회책을 적용했습니다:

  1. Power On with AC Attach: AC 어댑터 전원이 새롭게 인가되면 전원 버튼을 누르지 않아도 즉시 부팅되는 옵션 활성화
  2. Wake on LAN (WoL): 같은 공유기 망에 연결된 스마트 기기를 통해 매직 패킷으로 원격 부팅이 가능하도록 설정

이 조치 덕분에 이후 발생한 순간 정전 상황에서도 전기가 복구되자마자 1분 만에 모든 서비스가 정상적으로 셀프 힐링되었습니다.


4. 데이터 생존을 위한 3-2-1 백업 검증

홈서버 운영에서 가장 중요한 것은 하드웨어가 아니라 데이터입니다. 노트북 하드웨어가 물리적으로 고장 나더라도 30분 안에 새 머신에서 복구할 수 있는 백업 파이프라인을 구축해 두었습니다.

  1. DB 자동 덤프 (10편 백업 가이드 적용): 매일 새벽 4시 crontab으로 PostgreSQL 전체 데이터베이스를 압축 덤프(pg_dumpall | gzip).
  2. 외장 SSD 1차 rsync: 덤프 파일과 사진 원본 볼륨을 외장 1TB SSD(/mnt/data)로 실시간 동기화.
  3. 오라클 클라우드 오브젝트 스토리지 2차 암호화 전송: rclone 도구를 활용해 중요 설정과 DB 백업본을 AES-256으로 암호화한 뒤, OCI Always Free Object Storage(20GB 무료)로 매일 전송.

실제로 테스트용 가상머신에 OCI 백업 파일만 다운로드받아 docker compose up -d를 실행해본 결과, 15분 만에 사진과 암호 데이터가 온전히 복구되는 것을 검증했습니다.


5. 6개월 운영을 마치며

처음 홈서버를 올릴 때는 “내가 굳이 이런 고생을 사서 해야 하나?” 싶었던 순간도 있었습니다. 클라우드 관리형 서비스를 쓰면 클릭 몇 번으로 해결될 일들을 리눅스 커널 파라미터 뜯어보고, 도커 네트워크 브릿지 헤매며 하나하나 고쳐야 했기 때문입니다.

하지만 6개월 동안 직접 인프라의 바닥부터 운영해 본 경험은 그 어떤 기술 서적을 읽는 것보다 개발자로서의 시야를 넓혀주었습니다.

  • 시스템 자원의 한계를 체감하고 최적화하는 습관이 생겼습니다.
  • 장애가 터졌을 때 로그를 보고 원인을 역추적하는 트러블슈팅 역량이 비약적으로 성장했습니다.
  • 무엇보다 내 소중한 데이터와 비밀번호를 빅테크 기업에 의존하지 않고 내 방 안에서 안전하게 소유하고 있다는 심리적 독립감이 가장 큰 보상입니다.

집에 잠들어 있는 노트북이 있다면, 지금 당장 우분투 서버를 올려보시는 것을 진심으로 추천합니다.