본문 바로가기
AI 활용기

맥미니로 24시간 도는 AI 에이전트 만들기 (1) — 구축기

by Bookman 2026. 6. 23.

집에 놀고 있는 Mac mini가 한 대 있다면, 그걸 항상 켜져 있는 개인 AI 에이전트 서버로 바꿀 수 있습니다. 외출 중에 스마트폰으로 명령을 던지면 집에 있는 맥미니가 받아서 처리하고, 결과를 메신저로 돌려보내는 구조입니다.

여기서 핵심은 비용 절감이 아닙니다. 클라우드 API를 쓰는 이상 어차피 일정한 비용은 나갑니다. 이 시스템의 진짜 가치는 **"항상 켜져 있는, 나만의 두뇌"**를 갖는 데 있습니다. 내가 정의한 워크플로우를 기억하고, 내가 자는 동안에도 작업을 돌리고, 내 도구(파일·메일·일정)에 직접 손을 댈 수 있는 상주형 에이전트 — 이게 단발성으로 챗봇에 질문하는 것과 근본적으로 다른 점입니다.

이 글은 그 구축 과정을 3편에 걸쳐 정리한 기록의 첫 편입니다. 사용한 도구는 Nous Research의 Hermes Agent입니다. 터미널 기반 에이전트 프레임워크로, 로컬 모델과 클라우드 모델을 자유롭게 붙이고 Discord·Telegram 같은 메신저를 인터페이스로 쓸 수 있습니다.

이번 편에서는 설치부터 헤드리스(모니터 없이 상시 가동) 운영, 원격 접속, Discord 연동까지 다룹니다.

하드웨어

  • Mac mini M4 (non-Pro), 24GB 통합 메모리, 1TB SSD

핵심 제약은 24GB 메모리입니다. 이게 나중에 로컬 모델 선택을 강하게 제약하는데, 그 얘기는 2편에서 자세히 다루겠습니다. 구축 단계 자체에는 문제가 없습니다.

0. 터미널 열기 — 기초부터

이 글의 거의 모든 작업은 터미널에서 이뤄집니다. macOS에서 터미널을 여는 방법은 두 가지입니다.

  • Spotlight: Cmd + Space를 누르고 "터미널" 또는 "Terminal"을 입력한 뒤 Enter
  • Finder: 응용 프로그램 → 유틸리티 → 터미널.app

터미널을 열면 다음과 비슷한 프롬프트가 보입니다.

사용자이름@기기이름 ~ %

여기에 명령어를 입력하고 Enter를 치면 실행됩니다. 이 글에 나오는 코드 블록 안의 명령들이 전부 여기에 입력하는 것들입니다. 참고로 맥미니의 기본 셸은 zsh이며, 프롬프트 끝의 %가 그 표시입니다.

1. Hermes Agent 설치

설치는 한 줄입니다. 터미널에 그대로 입력합니다.

curl -fsSL https://hermes-agent.nousresearch.com/install.sh | bash

설치가 끝나면 셸 설정을 다시 읽어야 hermes 명령을 인식합니다. 가장 확실한 방법은 터미널 창을 완전히 닫았다가 새로 여는 것이고, 창을 유지하고 싶다면 다음을 입력합니다.

source ~/.zshrc

설치 마법사가 quick setup / full setup을 묻습니다. quick setup을 권합니다. 공식 가이드도 "먼저 깨끗한 대화 한 건이 되게 만들고, 그다음에 게이트웨이·크론·스킬을 얹어라"고 권고합니다. 처음부터 모든 걸 한 번에 설정하면, 어디서 막혔을 때 원인 추적이 어렵습니다.

설치 후 가장 먼저 할 일은 터미널에서 대화 한 건이 정상 작동하는지 확인하는 것입니다.

hermes

이렇게 입력하면 대화 화면이 뜨고, 아무 말이나 보내서 응답이 오는지 봅니다. 처음에는 모델이 연결되지 않아 "No inference provider configured" 같은 메시지가 뜰 수 있는데, 그건 정상입니다. 모델 연결은 2편의 주제입니다. 여기서는 "Hermes 자체가 설치되어 실행된다"는 것만 확인하면 됩니다. 대화 화면에서 나올 때는 /quit을 입력합니다.

만약 command not found: hermes가 뜬다면 PATH가 아직 안 잡힌 것입니다. which hermes로 경로가 잡혔는지 확인하고, 안 잡혔으면 설치 안내에 나온 export PATH=... 줄이 ~/.zshrc에 들어갔는지 점검합니다. 가장 간단한 해결책은 역시 터미널 새 창을 여는 것입니다.

2. 헤드리스 운영 — 모니터 없이 상시 가동

맥미니를 서버로 쓰려면 모니터·키보드 없이 24시간 켜둬야 합니다. 네 가지를 설정합니다.

(1) 잠자기 끄기

모니터를 빼면 맥이 잠들어 에이전트가 죽습니다. 이를 막는 명령입니다.

sudo pmset -a disablesleep 1

sudo가 붙으면 관리자 비밀번호를 묻습니다. 입력해도 화면에 글자가 보이지 않는데, 이는 보안을 위한 정상 동작입니다. 그대로 비밀번호를 치고 Enter를 누르면 됩니다. 나중에 되돌리려면 끝의 1을 0으로 바꿔 실행합니다. 제대로 적용됐는지는 다음으로 확인합니다.

pmset -g | grep SleepDisabled

SleepDisabled 1이 나오면 적용된 것입니다.

(2) 자동 로그인

정전이나 재부팅 후 사람 손 없이 로그인 화면을 통과해야 합니다. 시스템 설정 → 사용자 및 그룹 → "자동으로 로그인"에서 본인 계정을 지정합니다. 이게 가장 자주 빠지는 단계입니다. 자동 로그인이 안 되면 재부팅 후 로그인 화면에서 멈춰 에이전트가 뜨지 않습니다.

(3) 원격 로그인(SSH)

시스템 설정 → 일반 → 공유 → 원격 로그인을 켭니다. 켜면 그 아래에 ssh 사용자@주소 형태의 접속 정보가 표시되니 메모해 둡니다.

(4) 더미 HDMI

맥미니는 모니터를 빼면 "디스플레이 없음"으로 인식해 일부 기능이 달라집니다. 수천 원짜리 더미 HDMI 플러그를 HDMI 포트에 꽂으면, 항상 가상 디스플레이가 연결된 것으로 인식해 GUI 세션이 유지됩니다. 헤드리스 안정성에 의외로 큰 역할을 합니다.

재부팅 테스트 — 빼기 전에 반드시

설정을 마쳤으면 모니터를 연결한 상태에서 재부팅 테스트를 한 번 돌리는 것을 강력히 권합니다.

sudo reboot

1~2분 뒤, 자동 로그인으로 바탕화면까지 자동으로 올라오는지, 그리고 에이전트가 자동으로 다시 떠서 폰 메신저에 응답하는지를 눈으로 확인합니다. 즉 "전원이 나갔다 들어와도 알아서 복구되는지"를 검증하는 것입니다. 이게 통과해야 안심하고 모니터를 뺄 수 있습니다. 검증 없이 그냥 빼면, 문제가 생겨도 화면이 없어서 진단조차 못 하는 상황에 빠집니다.

막혔던 지점: launchd 자동 실행

게이트웨이(메신저 연결 프로세스)를 그냥 실행하면 터미널 창을 닫는 순간 죽습니다. macOS에서는 Linux의 systemd 대신 launchd를 씁니다. Hermes 설치 마법사에서 "launchd 서비스로 자동 시작" 옵션에 동의하면, 부팅 시 자동 실행과 비정상 종료 시 재시작이 자동으로 등록됩니다.

✓ Service installed and loaded!
✓ Service started

등록 후 상태는 다음으로 확인합니다.

hermes gateway status

한 가지 주의할 점이 있습니다. 등록된 설정에 LimitLoadToSessionType = Aqua가 잡히는데, 이는 "GUI 로그인 세션에서만 실행"을 뜻합니다. 따라서 자동 로그인이 안 돼 있으면 재부팅 후 게이트웨이가 뜨지 않습니다. 위 (2)번 자동 로그인이 중요한 이유가 여기에 있습니다.

3. 원격 접속 — Tailscale

외출 중에도 맥미니를 제어하려면 원격 접속이 필요합니다. 공유기 포트포워딩을 직접 여는 것은 보안상 위험하므로, Tailscale을 권합니다. 본인 기기끼리만 보이는 사설 네트워크(메시 VPN)를 만들어줘서, 포트를 인터넷에 노출하지 않고도 어디서든 SSH로 들어갈 수 있습니다.

설치는 간단합니다.

  1. 맥미니, 노트북, 폰에 각각 Tailscale을 설치합니다 (tailscale.com/download 또는 앱스토어).
  2. 세 기기를 같은 계정으로 로그인합니다. 이것이 유일한 규칙입니다.
  3. 로그인하면 각 기기가 100.x.x.x 형태의 고정 가상 IP를 받습니다.

이 IP는 와이파이/유선 전환, 집 공인 IP 변경, 재부팅과 무관하게 불변입니다. 이제 노트북 터미널에서 다음과 같이 접속합니다.

ssh 사용자명@100.x.x.x

비밀번호를 넣고 들어가면, 노트북에서 맥미니 앞에 앉은 것과 동일하게 모든 명령을 쓸 수 있습니다. 프롬프트가 사용자명@기기명 ~ %로 바뀌면 원격 접속에 성공한 것입니다. Tailscale 앱에서 "로그인 시 자동 시작"을 켜두면 재부팅 후에도 알아서 다시 연결됩니다.

팁: Tailscale 관리자 콘솔에서 MagicDNS를 켜면 IP 대신 기기 이름으로 접속할 수 있습니다 (ssh 사용자명@기기이름). 숫자를 외울 필요가 없어 편합니다.

4. Discord 연동 — 일상 인터페이스

SSH는 본격적인 관리용이고, 일상적인 대화는 Discord가 편합니다. 폰에서 봇에게 메시지만 보내면 되니까요.

봇 생성

Discord Developer Portal(discord.com/developers/applications)에서 New Application → Bot을 생성합니다. 여기서 가장 중요한 단계가 Privileged Gateway Intents입니다.

  • Message Content Intent → ON
  • Server Members Intent → ON
  • 반드시 Save Changes를 누릅니다.

Message Content Intent가 꺼져 있으면 봇이 온라인으로 떠도 메시지 내용을 읽지 못합니다. 제가 가장 오래 헤맨 지점이 바로 이것이었습니다.

그다음 Bot 페이지의 Token 섹션에서 Reset Token으로 봇 토큰을 발급받아 복사해 둡니다. 토큰은 한 번만 표시되므로 안전한 곳에 보관하고, 절대 공개하거나 저장소에 커밋하지 않습니다.

봇 초대와 User ID

Installation 탭에서 봇을 본인 서버에 초대합니다. 이때 **"서버에 추가(Guild Install)"**를 선택해야 합니다("내 앱에 추가"는 다른 방식입니다). 초대 시 메시지 보내기·채널 보기·메시지 기록 보기 권한을 포함해야 봇이 채널에서 동작합니다.

본인 User ID는 Discord 설정 → 고급 → 개발자 모드를 켠 뒤, 본인 이름을 우클릭 → "ID 복사"로 얻습니다.

게이트웨이 연결

준비한 토큰과 User ID로 게이트웨이를 설정합니다. SSH 또는 맥미니 터미널에서:

hermes gateway setup    # Discord 선택 → 토큰 + User ID 입력
hermes gateway          # 게이트웨이 실행

DISCORD_ALLOWED_USERS에 본인 ID만 넣어 접근을 제한합니다. 이걸 비워두면 게이트웨이가 안전상 응답을 전부 차단하므로, 반드시 본인 ID를 지정합니다.

막혔던 지점들 — 봇이 온라인인데 응답이 없을 때

봇이 분명히 온라인인데 응답이 없어서 한참을 헤맸습니다. 원인은 두 가지였습니다.

첫째, 멘션. 서버 채널에서는 봇이 기본적으로 @봇이름으로 멘션해야만 응답합니다. 그냥 메시지를 치면 무시합니다. 게다가 @봇이름을 텍스트로 타이핑만 하면 멘션으로 인식되지 않습니다 — @를 입력한 뒤 뜨는 자동완성 목록에서 봇을 마우스로 클릭해서 넣어야 진짜 멘션입니다(파란색 알약 모양). 참고로 DM은 멘션 없이도 항상 응답하므로, 연동 테스트는 DM으로 하는 것이 가장 깔끔합니다.

둘째, 진단은 로그로. 봇이 응답하지 않을 때는 추측하지 말고 로그부터 봐야 합니다. 게이트웨이의 표준 로그와 에러 로그는 다음 위치에 쌓입니다.

tail -f ~/.hermes/logs/gateway.log        # 표준 로그
tail -f ~/.hermes/logs/gateway.error.log  # 에러 로그

tail -f로 로그를 실시간으로 켜둔 채 메시지를 보내면, 봇이 메시지를 받기는 하는지(받지 못하면 권한/Intent 문제), 받고도 처리에서 실패하는지(모델 문제)를 즉시 구분할 수 있습니다. 참고로 에러 로그에서 본 SIGTERM 종료나 "Opus codec not found" 같은 경고는 대부분 무해합니다 — 전자는 재시작 시 정상 종료 기록이고, 후자는 음성 기능 관련 경고일 뿐 텍스트 동작과 무관합니다.

게이트웨이를 다시 시작해야 할 때는 강제로 프로세스를 죽이지 말고 정식 명령을 씁니다.

hermes gateway restart

이 명령은 SSH로 실행해도 SSH 세션이 끊기지 않습니다(게이트웨이와 SSH는 별개 프로세스입니다).

1편 정리

여기까지 하면 "전원이 나갔다 들어와도, 모니터가 없어도, 외출 중에도 폰으로 명령할 수 있는" 상시 가동 에이전트의 토대가 완성됩니다. 체크리스트로 정리하면 다음과 같습니다.

  • Hermes 설치 → hermes로 터미널 대화 검증
  • 잠자기 끄기 / 자동 로그인 / SSH / 더미 HDMI
  • 재부팅 테스트로 자동 복구 검증
  • Tailscale로 원격 SSH
  • Discord 봇 연동 (Intent + 권한 + 멘션 규칙 주의)

이 토대의 의미는 단순합니다. 이제 이 기기는 내가 신경 쓰지 않아도 24시간 깨어 있는 두뇌가 됩니다. 다음 2편에서는 이 두뇌에 어떤 모델을 어떻게 붙일지 — 로컬 모델과 클라우드 API를 섞는 하이브리드 구성, 그리고 24GB 메모리라는 현실적 벽과 씨름한 기록을 다루겠습니다.