매일 아침 정해진 시각, 텔레그램으로 메시지가 옵니다. 오늘 최저·최고 기온, 강수 확률, 보유 종목 손익, 그날 일정. 출근하는 날엔 버스 도착 시각도 함께 옵니다.
봇 자체를 만드는 건 사실 그리 어렵지 않았습니다. 진짜 고민은 그 다음이었습니다. “이걸 24시간 어디서 돌리지?” 처음엔 집에 있는 시놀로지 나스에 올렸다가, 결국 오라클 클라우드 무료 서버로 옮겼습니다. 이 글은 그 이사 과정에서 직접 겪은 나스와 무료 클라우드의 현실적인 장단점 기록입니다.
이 봇이 하는 일
거창한 서비스가 아니라, 아침 루틴을 한 화면으로 줄이려고 만든 개인용 봇입니다. 날씨 앱 → 증권 앱 → 캘린더 → 버스 앱을 순서대로 열던 걸, 텔레그램 메시지 하나로 합쳤습니다.
- 날씨 — 기상청 단기예보로 오늘 최저·최고 기온, 비 오는 시간대, 하루 하늘 흐름
- 주식 포트폴리오 — 증권사 API로 보유 종목 현재가와 손익을 한눈에 (개인 대시보드용)
- 출근 길찾기 — 카카오 길찾기로 지금/30분 뒤 사무실까지 예상 소요 시간
- 일정 — 애플 캘린더를 매일 새벽 자동 동기화해 그날 일정 요약
- 버스 알림 — 출근하는 날, 집 앞 정류장 버스 도착 시각을 시간 맞춰 알림

기능을 붙이는 것보다, 이 봇을 꺼지지 않고 매일 같은 시각에 동작하게 만드는 것이 훨씬 어려웠습니다. 그게 결국 “어디서 돌리느냐”의 문제였습니다.
진짜 문제는 ‘어디서 24시간 돌리느냐’였다
개인이 만든 봇·스크립트는 결국 항상 켜져 있는 컴퓨터 위에서 돌아야 합니다. 노트북은 닫으면 꺼지고, 데스크톱을 24시간 켜두기엔 전기와 소음이 부담입니다. 그래서 보통 세 가지를 고민하게 됩니다.
- 집에 있는 기기 — 라즈베리파이, 또는 이미 켜져 있는 NAS
- 무료 클라우드 — 오라클 Always Free, 구글/AWS 프리티어
- 유료 VPS — 월 몇천 원짜리 가상 서버
저는 마침 집에 시놀로지 나스가 24시간 켜져 있었습니다. “이미 켜져 있는데 여기 올리면 공짜 아닌가?” 자연스럽게 1번부터 시작했습니다.
1막 — 집 시놀로지 나스에서 시작
나스의 장점은 분명했습니다. 이미 켜져 있고, 추가 비용이 0원입니다. 도커도 돌릴 수 있고, 집 네트워크 안이라 내부 파일 접근도 편합니다. 봇을 올리고 며칠은 잘 돌았습니다.
문제는 “잘 돌다가 조용히 멈추는” 패턴이었습니다.
함정 1: 재시작하면 예약 알람이 전부 사라진다
텔레그램 봇의 예약 알람(버스 도착 알림 등)은 메모리에만 존재했습니다. 나스가 재부팅되거나 봇이 어떤 이유로 재시작되면, 예약해둔 알람이 통째로 사라집니다. 오후에 봇이 재시작되면 그날 퇴근 버스 알림은 조용히 없어졌습니다.
해결: 봇이 켜질 때마다 캘린더에서 오늘 일정을 다시 읽어, 현재 시각 이후의 알람만 골라 자동 재등록합니다. “봇이 켜지면 오늘 남은 알람을 항상 복원한다”는 원칙을 코드로 넣었습니다.
함정 2: 개발 환경과 실행 환경의 경로가 다르다
개발은 맥에서 하고, 실행은 나스에서 했습니다. 맥에서 나스 파일을 마운트하면 /Volumes/... 경로로 접근하는데, 봇 자체는 나스 안에서 도니 그 경로가 없습니다. “나스가 마운트됐는지” 확인하는 로직을 맥 경로 기준으로 짜놨더니, 정작 나스 안에서는 항상 “마운트 안 됨”으로 판단해 날씨·일정 기능을 통째로 건너뛰고 있었습니다. 한동안 왜 브리핑이 절반만 오는지 몰랐습니다.
해결: 나스 고유 경로(
/volume1/존재 여부)로 실행 환경을 감지하고, 환경에 따라 파일 경로를 다르게 처리합니다.
결정타: 메모리 부족(OOM)과 불규칙한 재시작
위 두 가지는 코드로 막았습니다. 하지만 못 막은 게 있었습니다. 나스는 봇만 돌리는 기기가 아닙니다. 사진 백업, 파일 공유, 도커 컨테이너 여러 개가 메모리를 나눠 씁니다. 메모리가 빠듯해질 때마다 봇 프로세스가 OOM으로 죽거나 나스가 불규칙하게 재시작됐고, 그때마다 위에서 만든 “복원 로직”이 돌긴 했지만 근본적으로 봇이 자꾸 죽는다는 사실 자체는 바뀌지 않았습니다. “안정적으로 매일 같은 시각”이라는 목표와는 거리가 있었습니다.
2막 — 오라클 클라우드 무료 서버(Always Free)로
결국 봇만 따로, 죽지 않는 전용 자리가 필요했습니다. 그래서 오라클 클라우드의 Always Free 등급으로 옮겼습니다.
오라클 Always Free의 ARM 인스턴스는 4코어 / 24GB 메모리를 평생 무료로 줍니다. 개인 봇 하나 돌리는 데는 차고 넘치는 스펙이고, 다른 서비스와 메모리를 다툴 일도 없습니다. 봇을 systemd 서비스로 등록해두니, 서버가 재부팅돼도 알아서 다시 뜨고 죽으면 자동으로 되살아납니다. 나스에서 그렇게 시달리던 “조용히 멈춤”이 사라졌습니다.
리전은 싱가포르를 골랐습니다. 무료 인스턴스 재고가 한국(춘천)보다 잡기 수월했고, 한국과의 지연 시간도 체감상 문제없는 수준이었습니다.
다만, 해외 리전이라 생긴 새 함정
공짜 점심은 없었습니다. 옮기고 나니 기상청 API 호출이 약 50% 확률로 타임아웃나기 시작했습니다. 해외 IP ↔ 기상청 서버 구간의 간헐적인 네트워크 문제였습니다. requests를 httpx로 바꾸고 짧은 타임아웃 + 재시도를 넣어 해결했는데, 이 부분은 따로 깊게 다뤘습니다.
👉 기상청 단기예보 API 실전 가이드 — 최저기온이 안 나오는 진짜 이유 — 격자 좌표, 발표 시각, 새벽에만 나오는 최저기온, 그리고 이 해외 서버 타임아웃까지 코드와 함께.
나스 vs 오라클 무료 서버 — 직접 써보고 정리
| 항목 | 집 시놀로지 나스 | 오라클 클라우드 (Always Free) |
|---|---|---|
| 비용 | 0원 (이미 보유) | 0원 (평생 무료 등급) |
| 안정성 | 다른 작업과 메모리 경쟁 → 잦은 재시작 | 전용 인스턴스 → 24시간 안정 |
| 스펙 | 나스 사양에 종속, 여유 적음 | ARM 4코어 / 24GB로 넉넉 |
| 상시 실행 | 별도 설정 필요, 재시작에 취약 | systemd로 자동 부팅·자동 복구 |
| 집 네트워크 접근 | 내부 파일·기기에 바로 접근 | 외부라 별도 연결 필요 |
| 국내 API 지연 | 빠름 (국내) | 해외 리전이라 간헐 타임아웃 가능 |
정리하면 이렇습니다. 집 안의 파일·기기를 직접 다뤄야 하는 작업이라면 나스가 유리합니다. 하지만 단순히 24시간 죽지 않고 돌기만 하면 되는 봇·스크립트라면, 오라클 무료 서버가 훨씬 마음 편합니다. 다른 작업과 자원을 다투지 않는 “전용 자리”라는 게 생각보다 컸습니다.
결론
봇을 만드는 것보다 어디서 돌릴지가 더 어려웠다는 게, 직접 해보기 전엔 몰랐던 부분입니다. 집 나스로 시작해 무료 클라우드로 옮기고 나서야 “매일 아침 같은 시각, 빠짐없이”가 비로소 가능해졌습니다. 같은 고민 — 내가 만든 걸 어디서 24시간 돌리지 — 앞에 선 분이라면, 이 시행착오가 한 단계 건너뛰는 데 도움이 되길 바랍니다.
관련 글: 기상청 단기예보 API 실전 가이드 — 이 봇의 날씨 기능을 만들며 겪은 기상청 API 함정 정리. (버스 알림 API 연동기는 별도 글로 예정)