간단한 서비스는 데스크탑을 서버로 써도 되지 않을까
집에 있던 맥미니로 이력서 검토 서비스를 운영해본 기록
Photo by CHUTTERSNAP on Unsplash
Codex로 이것저것 만들다 보니 나 혼자 쓰기에는 꽤 괜찮은 서비스가 몇 개 생겼다. 문제는 그다음이었다. 로컬에서 잘 돌아가는 것과 매일 접속해서 쓸 수 있게 두는 것은 다른 얘기였다. 작은 서비스를 하나 만들 때마다 서버를 빌리기도 부담스러웠다.
이번에 올려본 것은 이력서 원문을 보존하면서 수정할 위치와 근거를 제안하는 resume-agent다. 집에는 원격 접속용으로 늘 켜두는 맥미니가 있었다. 간단한 서비스라면 여기서 돌려봐도 되지 않을까 싶었다.
집에 있던 맥미니로 해보기
맥미니는 M4, 메모리 16GB, 내장 저장소 256GB인 기본 모델이다. 저장 공간이 부족해서 2TB 외장 SSD를 연결해 쓰고 있었다. 여러 사람이 동시에 쓰는 서비스라면 이 사양을 다시 따져봐야겠지만, 우선은 초대받은 소수만 사용할 예정이었다.
처음에는 AI 서비스니까 서버 사양도 높아야 한다고 생각했다. 그런데 작업을 나눠보니 AI 추론은 OpenAI API에서 하고, 맥미니는 문서 추출과 OCR, 파일 저장, API 응답을 맡는다. 지금 단계에서는 CPU보다 외부 접속과 백업을 어떻게 할지가 더 신경 쓰였다.
물론 맥미니를 쓴다고 운영비가 0원이 되는 건 아니다. 전기 사용량은 따로 측정하지 않았다. 이미 켜두던 컴퓨터를 활용하는 대신, 문제가 생기면 내가 직접 챙겨야 한다.
집 안의 API를 밖에서 부르기
공유기 포트를 열어 집 안의 맥미니로 바로 연결하는 방법도 있다. 나는 그 대신 Cloudflare를 거치기로 했다. 사이트 화면은 Cloudflare Worker에서 전달하고, 이력서를 저장하거나 검토할 때 필요한 /api/* 요청만 맥미니로 보낸다.
Access가 로그인 여부를 확인하고, Worker의 VPC Service에서 Tunnel을 거쳐 FastAPI로 요청을 전달한다. 맥미니의 cloudflared가 바깥으로 연결을 유지하고 있어서 공유기 인바운드 포트나 고정 공인 IP가 필요하지 않았다. API 서버는 맥미니 안의 127.0.0.1:8000에서만 듣는다. Tunnel과 VPC Service 설정은 각각 따로 해줘야 했다.
Tunnel을 붙였다고 인증이 끝나는 건 아니었다. 입구에서는 Access가 사용자를 확인하고, FastAPI에서도 토큰과 계정 상태를 검증한다. 내가 관리용 SSH에 쓰는 Tailscale은 웹 사용자가 들어오는 경로와 별개다.
이력서 원본과 첨부 파일은 외장 SSD에 두고, SQLite에는 파일 위치와 소유자 등의 정보를 기록했다. 검토할 내용은 서버에서 OpenAI API로 보낸다. 집에 파일을 저장한다고 해서 AI에 전달하는 데이터까지 모두 집 안에만 남는 것은 아니다.
잘 돌아가다가도 백업에서 막혔다
외장 SSD 하나에 원본과 백업을 같이 두면 디스크가 고장 났을 때 둘 다 잃는다. 그래서 예약 백업과 배포 전 백업을 암호화해 맥미니 내장 디스크에 저장하도록 했다. 같은 디스크에 두는 것보다는 낫지만, 맥미니 자체가 고장 나거나 없어지면 이 사본도 함께 사라진다.
설정할 때는 터미널에서 잘 되던 백업이 launchd에서 실행되면 실패했다. 외장 볼륨 접근 권한이 달랐기 때문이다. 실행 주체와 권한을 정리한 뒤에야 백업이 돌아갔다. 서버를 재시작할 때 자식 Python 프로세스가 남는 문제도 있었다. launchd가 실제 API 프로세스를 관리하도록 실행 방식을 바꿨다.
배포는 프런트엔드를 Cloudflare에 올리고, 백엔드는 맥미니가 검사를 통과한 코드를 가져오는 방식이다. 백엔드를 바꾸기 전에는 서버를 멈추고 백업한다. 백업이 실패하면 새 버전을 시작하지 않는다. Cloudflare 배포 토큰에 VPC Service 연결 권한이 빠져 배포가 실패한 적도 있었다. 이런 문제는 로컬에서 기능을 만들 때는 보이지 않았다.
아직 확인할 것들
2026년 9월 말에는 로그인, API 연결, 상태 확인, 프런트·백엔드 배포와 백업·재시작까지 확인했다. DB를 다른 위치에 복원해 무결성을 확인하고 가상 첨부 파일도 복원해봤다. 다만 실제 사용자 자료를 포함해 처음부터 끝까지 복원하는 시험은 하지 않았다. AI 검토와 OCR의 전체 사용 흐름, 재부팅 후 로그인과 외장 SSD 연결까지 자동으로 회복되는지도 더 확인해야 한다. 지금 서버는 사용자 로그인 이후 실행되는 launchd에 의존한다.
집 인터넷이나 전원이 끊기면 사이트 화면은 열려도 API는 쓸 수 없다. 지금은 나와 초대받은 소수가 쓸 서비스라 일단 운영해보려 한다. 사용자가 늘거나 항상 켜져 있어야 하는 서비스가 되면 그때는 다른 방법을 찾아야 할 것 같다.
설정과 당시 검증 범위는 resume-agent 운영 기록에 남겨뒀다.