Intel N-100 미니 PC와 1TB HDD 한 장으로 가벼운 홈 서버를 꾸렸다. 6W TDP의 저전력 칩이 24시간 켜둬도 부담 없는 전기료를 약속한다. 거창한 워크스테이션이 아니라, 개인 프로젝트 한두 개를 안정적으로 띄울 만한 '책상 옆 작은 서버'가 목표다.
1. Ubuntu 설치
Ubuntu 24.04 LTS 서버 에디션을 USB로 부팅해 설치했다. GUI 없는 minimal 셋업으로 디스크와 메모리 점유를 최소화한다. 설치 단계에서 OpenSSH 서버 옵션을 켜두는 것만 잊지 않으면 이후 작업 전체가 원격으로 흘러간다.
2. SSH 연결
공유기 DHCP 예약으로 내부 IP를 고정한 뒤, `ssh-copy-id`로 키 기반 인증을 박았다. 비밀번호 로그인은 `sshd_config`에서 `PasswordAuthentication no`로 잠갔다. 외부에서 SSH를 직접 열지는 않는다 — 그건 Cloudflare Tunnel 차례.
3. Docker 설치
Docker Engine + Compose 플러그인을 공식 apt 저장소로 깐다. 컨테이너 단위 배포는 의존성 격리, 손쉬운 롤백, 동일한 환경 재현 세 가지를 한 번에 해결한다. 호스트는 가능한 한 깨끗하게 유지하고, 모든 워크로드는 컨테이너 안에서만 돌게 한다.
4. GitHub Push
로컬 개발 → `git push` → 원격 빌드라는 흐름을 잡았다. 서버는 GitHub 리포지토리에서 코드를 받기만 하고, 빌드와 컨테이너 기동은 다음 단계의 파이프라인이 처리한다. 권한은 deploy key 한 장으로 최소화.
5. 배포 파이프라인
서버에는 webhook 리스너 하나를 systemd 서비스로 띄웠다. GitHub Actions가 push 후 webhook을 호출하면 서버가 git pull → docker compose build → docker compose up -d 시퀀스를 자동 실행한다. 평균 배포 시간 약 10초.
6. 도메인 연결
메인 도메인 한 자리에 서브도메인을 끊어 서비스마다 분리했다. DNS는 Cloudflare로 위임해 TTL을 짧게 잡고, 추후 IP가 바뀌어도 빠르게 전파되도록 했다.
7. Cloudflare Tunnel
홈 네트워크에 포트를 여는 일 자체를 피하기 위해 Cloudflare Tunnel을 썼다. 서버에서 `cloudflared`가 Cloudflare로 outbound 연결을 만들고, 외부 트래픽은 그 터널을 통해 들어온다. 공유기 포트포워딩 0개, 노출된 공인 IP 0개로 외부 서비스가 가능해진다.
8. Mission Complete
작은 미니 PC 한 대가 GitHub과 Cloudflare 사이에서 자기 몫을 한다. 다음 단계는 모니터링(Grafana/Loki)과 백업(rsnapshot) 자동화. 24시간 fanless로 조용히 돌아가는 책상 옆 서버는, 클라우드에 모두 맡기지 않고 직접 손에 쥐고 있는 인프라의 첫 조각이다.
원문: 네이버 블로그 한강 (hangang_z) · 2026-02-19 최초 게시