homelab ops · self-hosted · production-grade

홈랩 서버를
체계적으로 운영합니다

단일 베어메탈 호스트 위에서 37개 컨테이너·14+ 서비스를 돌리며, 권한 격리·중앙 시크릿·관측성·자동 백업·ChatOps·GitOps를 하나의 일관된 운영 체계로 묶었습니다.

37Docker 컨테이너
7권한 격리 계정
14+운영 서비스

취미로 시작했지만, "흩어진 서비스 모음"이 아니라 운영 가능한 시스템이 되도록 설계·문서화·자동화에 공을 들였습니다.

아키텍처

외부 트래픽은 포트 노출 없이 터널로만 들어오고, 내부는 역할별로 분리됩니다.

🌐 인터넷
↓ Cloudflare Tunnel (포트 미개방)
🔀 nginx 리버스 프록시 + 보안 헤더
apps · 운영 서비스
웹 서비스백엔드 API 봇 / 자동화영상 처리
infra · 기반
Infisical모니터링 스택 NextcloudDiscord 봇 백업
데이터 · 상태
PostgreSQLMariaDB MongoDBRedis TimescaleDB

※ 아래 인프라 살펴보기의 화면은 민감정보를 가린 큐레이션 캡처입니다. 원본 대시보드·자격증명은 비공개로 관리합니다.

관리 체계

"여러 도구를 쓴다"가 아니라, 각 축마다 원칙과 안전장치를 둡니다.

🔐

권한 책임 분리 (Least-Privilege)

운영 도메인별 전용 계정 7종 + 래퍼 명령(svcctl·deployctl·edgectl·logctl)으로 root 없이 작업. sudoers 화이트리스트·rootless docker로 자격증명 유출 시 폭발 반경 최소화.

🗝️

중앙 시크릿 관리

Infisical 셀프호스팅 + Machine Identity. 코드·레포에 평문 비밀 0, 백업 자격증명은 런타임 주입으로 디스크/로그 미경유.

📊

관측성 (Observability)

Prometheus·Grafana·Loki·Promtail·cAdvisor·node-exporter·Dozzle. 메트릭+로그 일원화, 90일 로그 보존, 컨테이너별 자원 추적.

🤖

ChatOps · 원격 운영

Discord 봇으로 폰에서 운영 — 통합 대시보드·능동 알림·버튼 제어·로그 검색. 사용자/채널 화이트리스트 + 모든 동작 감사 로그.

💾

백업 & DR

restic 증분·암호화 → GCS 오프사이트. 구성요소별 부분 실패 격리(하나 실패해도 나머지 진행), Healthchecks.io로 침묵 실패 감지.

🚀

GitOps · CI/CD

GitHub Actions → 래퍼 기반 무권한 배포(deployctl), GHCR 이미지 풀 모델. 배포 주체에 docker 그룹(=root 동등)을 주지 않음.

🛡️

보안 하드닝

ufw + fail2ban, SSH 키 전용, Cloudflare Tunnel로 포트 비노출, 응답 보안 헤더(HSTS·nosniff·X-Frame). 정기 보안 감사 백로그 운영.

📦

IaC · 문서화

단일 관리 레포에 compose·스크립트·런북 통합. 복구 절차·핸드오프 컨텍스트·작업 로그를 꾸준히 기록해 "재구축 가능한 서버"를 지향.

인프라 살펴보기

직접 만든 자동화와 실제 운영 화면을 하나씩 소개합니다.

monitoring

해석형 운영 리포트

지표를 그냥 나열하지 않고 🟢🟡🔴 판정 + 직전 대비 증감 + 에러 최다 컨테이너를 함께 보냅니다. "숫자만 보고 뭐가 문제인지 모르는" 알림 피로를 없애는 게 목표.

  • 임계 기반 자동 판정(load는 15분 평균으로 오탐 방지)
  • Loki 24h 윈도우 집계 + 종합 한 줄 평가
  • 급성 이상은 실시간 능동 알림이 별도로 push
디스코드 운영 리포트 임베드 — 호스트 자원·컨테이너·보안·백업 판정 요약
chatops

디스코드 운영 봇

SSH 없이 폰에서 서버를 운영합니다. 컨테이너 상태·로그 검색·재시작·디스크 회수까지 버튼 탭으로, 위험 동작은 화이트리스트 + 2단계 확인.

  • /dashboard 호스트 자원 + 컨테이너 통합 뷰
  • /digest 지난 24h 요약 · /cleanup 안전 디스크 회수
  • 다운/unhealthy 시 원인 로그까지 첨부해 자동 알림
디스코드 봇 능동 알림 — 컨테이너 다운 감지 및 로그·재시작 버튼 UI
resilience

부분 실패 격리 백업

여러 DB·파일을 백업할 때 하나가 실패해도 전체가 멈추지 않게 구성요소를 독립적으로 처리하고, 스냅샷은 무조건 수행합니다. 결과는 구성요소별 ✅/❌ + 종합 판정으로 통지.

  • 전(全)-or-무 중단 제거 → 부분 성공 보존
  • 오프사이트(GCS) + 증분·암호화(restic)
  • 침묵 실패를 막는 외부 헬스 핑
구성요소별 백업 완료 알림 — restic 스냅샷·로그 백업·Nextcloud 콜드스토어 순차 통지
security

Cloudflare Tunnel · 제로 트러스트 엣지

서버는 인바운드 포트를 하나도 열지 않습니다. 아웃바운드 터널로만 트래픽이 들어오고, 보안 인사이트·캐시율·트래픽까지 한 대시보드에서 봅니다.

  • 포트 스캔 자체가 불가능한 구조(IP 비노출)
  • 도메인별 암호화 요청 비율·에러율 실시간 확인
  • Zero Trust로 내부 도구 접근까지 VPN 없이 통제
Cloudflare 대시보드 — 보안 인사이트·캐시율·트래픽 개요
observability

Dozzle · 컨테이너 로그 실시간 뷰어

컨테이너 38개의 로그를 SSH 없이 웹에서 바로 검색합니다. 장애가 나면 "어느 컨테이너가, 언제부터, 무슨 로그를" 순으로 빠르게 좁혀갑니다.

  • 컨테이너별 CPU·메모리 추이 한눈에
  • 키워드 로그 검색
  • 디스코드 알림에서 로그 링크로 바로 이동
Dozzle — 컨테이너 38개 통합 로그 뷰어
observability

Grafana · 호스트·컨테이너 자원 대시보드

Prometheus·cAdvisor·node-exporter로 모은 지표를 한 화면에서 봅니다. 순간 스파이크와 추세를 구분해 진짜 이상 신호만 남깁니다.

  • CPU·메모리 사용/평균/피크 동시 표시
  • 네트워크 수신·발신 트래픽 추적
  • 컨테이너별 드릴다운
Grafana — CPU·메모리·네트워크 대시보드
secrets

Infisical · 중앙 시크릿 관리

Dev/Staging/Production 환경을 분리한 셀프호스팅 시크릿 매니저. 코드·레포에는 평문 비밀이 하나도 없습니다.

  • Machine Identity로 서비스가 런타임에 직접 주입받음
  • 환경별 접근 범위 분리
  • 변경 이력을 Audit Log로 추적
Infisical — 환경별 시크릿 관리 화면
resilience

healthchecks.io · 백업 침묵 실패 감지

백업 스크립트가 성공했다고 알리지도 않고 조용히 안 도는 "침묵 실패"를 외부에서 잡습니다. 정해진 시간에 핑이 안 오면 그 자체가 경보입니다.

  • 크론이 죽어도 "핑의 부재"로 감지
  • 구성요소별 체크 분리 — 부분 실패도 바로 노출
healthchecks.io — 백업 핑 외부 감시
resilience

UptimeRobot · 외부 가동시간 모니터링

서버 안이 아니라 바깥에서 도메인이 살아있는지 5분마다 확인합니다. 네트워크·DNS·터널까지 포함한, 사용자가 실제로 보는 상태를 잽니다.

  • 다운 발생 시 즉시 알림
  • 업타임 히스토리 추적
UptimeRobot — 외부 가동시간 모니터링
chatops

/help · 운영 명령어 한 화면 정리

대시보드부터 로그 검색·재시작·위험 동작까지 — 뭘 칠 수 있는지 봇이 스스로 안내합니다. 새 기기에서도 명령어를 외울 필요가 없습니다.

  • 조회·검색·조작 명령을 카테고리로 정리
  • 위험 동작(재시작·정리)은 별도 표시로 구분
디스코드 봇 /help 명령 — 운영 커맨드 전체 목록