Home-Lab CI/CD Server

Home-Lab CI/CD Server

GitHub Actions Self-hosted Runner, Nginx, Certbot, Fail2Ban로 60 초 안에 빌드-배포가 끝나는 홈서버입니다.
프로젝트 기여도 100%

1. Overview

개인 사이트를 효율적으로 관리하고 생산성을 높이기 위해 유휴 노트북 1대를 Ubuntu Server + Nginx + Jekyll 정적 사이트 호스팅 서버로 전환하고, Github Actions Self-Hosted Runner를 이용해 개인용 CI/CD 파이프라인을 구축했습니다. 외부 공인 IP는 DDNS kpryu.sytes.net로 매핑했고, TLS·iptables 방화벽·Google OTP 2FA·Fail2Ban 등으로 기본 하드닝을 완료했습니다.

Home-Server Architecture

Home Server Architecture

Home-Server CICD Architecture

Architecture of the self-hosted CI/CD pipeline

이 아키텍처가 제공하는 주요 효과는 다음과 같습니다.

  • 자동화: 어느 디바이스에서든 레포지토리에 푸시 시 자동 빌드 및 배포
  • 무중단배포: Nginx가 무중단으로 새 콘텐츠 서빙
  • 보안: Certbot으로 90일 주기로 TLS 인증서를 자동으로 갱신해주고, Fail2Ban으로 ssh brute-force를 차단해줍니다.
  • 모니터링: Node Exporter를 이용해 Fail2Ban 메트릭들을 외부로 노출하고, Prometheus와 Grafana를 사용해 모니터링 및 알람 기능을 제공합니다.

2. Problem Statement

코드 한 줄 바꿀 때마다 서버에 직접 들어가 빌드부터 배포까지 수작업 탓에 반복 입력, 휴먼에러 위험과 많은 시간이 소요되었습니다.

  • Problem Points
    • 잦은 배포 과정에서 수동적인 서버 접속 절차로 인한 반복적인 작업 필요
    • 휴먼에러 및 nginx 설정 중 서비스 중단
    • 평균 5분정도의 반복 작업, 잦은 변경으로 생산성 감소

3. Methods

Self-hosted Runner 도입 후 배포 사이클을 1분 내로 단축하였습니다.

  • Runner 상시 대기: 홈서버에 actions-runner 설치 및 systemd 서비스를 통해 서버 재부팅 시에도 자동으로 실행되도록 하여, 레포지토리 이벤트가 발생하면 즉시 Job을 실행하도록 하였습니다.
  • 빠른 빌드 및 배포: _site/ 산출물과 운영 디렉토리를 rsync --delete로 동기화하여 변경 파일만 전송하여 평균 5~10초면 완료되도록 하였습니다.
  • 무중단 서비스: Runner 계정에 nginx reload 명령에만 sudo 권한을 부여하여 비밀번호 없이 태스크가 실행되도록 하였습니다.

4. Security

영역적용 내용
TLSCertbot / Let’s Encrypt, 90 일 자동 갱신, SSL Labs A+
방화벽iptables 기본 DROP 정책 & 22·80·443·3000만 허용, ESTABLISHED 트래픽 허용
SSH단일 사용자 허용 + Google OTP 2FA
침입 차단Fail2Ban sshd jail – 5회 실패 시 24 h Ban
최근 1주 평균 500 건 차단
권한 관리Runner 전용 사용자, 필요 명령 1 개만 sudo 비밀번호 없이 허용

5. Summary

지표수치
빌드 → 배포60초 이내 (avg)
트래픽 비용0 KRW (자가 호스팅)
다운타임0초 (nginx reload)
SSL ScoreSSL Labs A+
방화벽 로그1 주 평균 500건의 IP 차단

6. Future Work

  • Monitoring: 현재 Fail2Ban 이벤트 기반 모니터링이지만, 웹서버의 접근 로그, 에러 로그 등을 Loki, Grafana 등 ELK 스택으로 수집하여 서비스의 이상 징후를 더 빠르게 감지하고 대응할 수 있도록 로그 모니터링 시스템을 확장할 예정입니다.

7. Used Skills

  • Ubuntu 22.04
  • Nginx
  • Jekyll/Hydejack
  • Github Actions
  • Self-hosted Runner
  • iptables
  • Fail2Ban
  • Google OTP
  • rsync
  • DDNS(No-IP)
  • Prometheus
  • Grafana