kairos
만나고 싶은 사람과의 약속을 자동으로 제안하는 개인 자동화 파이프라인
개인기획·개발·배포 단독2026.05 — 현재
PythonJavaScriptNaver Maps APIKakao Local APINotion APIGoogle Calendar API
프로젝트 소개
만나고 싶은 사람은 있는데 “그냥 만나자”는 명분이 약해서 말을 못 꺼내는 문제를 풀고 싶었다. 장소와 활동(콘텐츠)을 먼저 정하고, 그 콘텐츠를 함께할 사람을 구하는 방향으로 뒤집었다. 인스타그램에서 공유한 장소 게시글을 자동으로 수집·정제하고, 캘린더 여유 시간과 겹쳐서 “이 사람과 이 장소, 이 시간에” 형태의 약속 제안까지 자동으로 만들어주는 개인 자동화 파이프라인이다.
아키텍처
30분 주기 cron 파이프라인 3단계로 구성했다:
- dedup — 인스타 공유 게시글의 재캡처·크로스포스트 중복 제거
- enrich — Apify 로 인스타 게시글 스크레이핑 → LLM 으로 캡션에서 장소 추출(캡션에 장소가 없으면 이미지 vision 폴백) → Kakao Local API 로 좌표·분류 조회 → Notion DB 기록
- export — 완료된 항목을 정적 JSON 으로 내보내 지도 웹(Naver Maps v3 + 마커 클러스터링)에서 읽는다. 브라우저에서 Notion API 를 직접 호출할 수 없어(CORS) 이 우회가 필요했다.
별도로 만나고 싶은 사람 목록 × Google Calendar 여유 시간 × 장소를 매칭해 약속 제안을 생성하는 스케줄러가 있고, 실제 연락 후 확정되면 전용 캘린더에 기록해 다른 기기에서 단방향으로 확인할 수 있게 했다.
기술적 판단 — Docker/OCI 이관을 검토 후 폐기
여러 개인 프로젝트를 클라우드 서버 한 대에 Docker + CI/CD 로 통합 관리하는 안을 브레인스토밍한 적이 있다. 이미지 저장량 증가 추세, 클라우드 서버 디스크 여유, 홈서버 디스크 여유를 실측까지 해봤는데 결론은 “이관 안 함”이었다. 홈서버는 이미 소유한 하드웨어라 스토리지 한계비용이 0인데, 클라우드로 옮기면 새 인증·새 CI/CD 파이프라인 같은 관리 포인트만 늘고 실질 이득은 스토리지 비용 절감 정도라 애초에 이득이 성립하지 않았다. 인프라를 바꾸는 게 항상 정답은 아니라는 걸 숫자로 확인한 경험이었다.
트러블슈팅 — macOS 홈서버엔 setsid 가 없다
배포 자동화에 setsid nohup ./serve.sh … 로 서버를 데몬화하는 코드를 넣었는데, 실제 배포 전까지 실행된 적이 없어 문제가 숨어있었다. 정작 배포 시점에 setsid: command not found 로 실패했고, 재시작 스텝이 기존 서버를 먼저 죽인 뒤였어서 그대로 서비스가 다운됐다. setsid 는 리눅스 전용이고 홈서버는 macOS 였던 게 원인. nohup … </dev/null & ; disown 조합으로 바꿔 SSH 세션 종료 후에도 프로세스가 살아남게 고쳤다. 이후로는 배포 대상 OS 를 먼저 확인하고 셸 스크립트를 쓴다.