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

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
| 영역 | 적용 내용 |
|---|---|
| TLS | Certbot / 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 Score | SSL 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