AI 제작 가이드

“팔로우하면 링크 보내드려요” 자동 DM, 유료 기능을 무료로 직접 만들어 쓰기

개발자는 AI를 어떻게 쓸까? 2편
댓글 달면 팔로우했는지 확인하고 링크를 DM으로 보내주는 기능, 원래 자동 DM 서비스에서 돈 내야 쓰는 기능이에요. 저는 이걸 월 구독료 없이 직접 만들어서 쓰고 있어요.

먼저 솔직하게 말씀드리면

"댓글 달면 DM 보내주는 것"까지는 무료로 주는 서비스도 있어요. 그런데 많이들 쓰는 이 흐름은 보통 유료 플랜에 들어가 있어요.

팔로우 확인 후 링크 보내기 흐름: 댓글 → 팔로우 안내 DM → 버튼 클릭 → 팔로우 확인되면 링크 발송, 아니면 다시 안내
댓글 → 팔로우 안내 → 버튼 클릭 → 확인. 보통 유료 플랜에 들어 있는 흐름이에요.

댓글 → 팔로우 유도 → 확인 → 링크 전달. 팔로워를 늘리고 싶은 분들한테 제일 중요한 기능인데, 이게 유료예요. 이 문서는 이걸 공짜로 만드는 방법을 알려드려요.

이 문서는 제가 실제로 쓰고 있는 인스타그램 댓글 자동 DM 시스템을 어떻게 만들었는지, 개발을 전혀 몰라도 따라 할 수 있게 풀어 쓴 가이드입니다.

중요한 전제부터 말씀드릴게요.

코드는 여러분이 직접 짜지 않습니다. 이미 깃허브에 공개된 오픈소스를 가져오고, 나머지는 Claude Code나 Codex 같은 코딩 AI에게 시킵니다. 이 문서에 있는 프롬프트를 그대로 복사해서 붙여 넣으면 돼요.

여러분이 직접 해야 하는 건 딱 세 가지예요.

  1. 회원가입하고 버튼 누르기 (메타 개발자 사이트, 오라클 클라우드)
  2. AI가 물어보는 값 복사해서 넣어주기
  3. AI가 "이거 해주세요" 하는 것 따라 하기

1. 이걸로 뭘 할 수 있나요?

릴스 올리고 "팔로우하고 댓글에 자료 남겨주시면 DM으로 보내드릴게요!" 많이 보셨죠? 그걸 사람이 일일이 확인하고 보내는 게 아니라, 프로그램이 자동으로 해주는 거예요.

⭐ 핵심: 팔로우 확인 후 링크 보내기 (보통 유료 기능)

실제로 팔로워가 겪는 흐름은 이래요.

팔로워가 실제로 겪는 흐름: 댓글 → 공개 답글과 팔로우 안내 DM → 버튼 클릭 → 팔로우 여부 확인 → 링크 발송 또는 재안내
이미 팔로워라면 버튼 없이 바로 링크를 받아요.
  • 이미 팔로워인 사람은 버튼 누를 필요도 없이 바로 링크를 받아요.
  • 버튼 문구, 안내 메시지는 전부 내 마음대로 바꿀 수 있어요.
  • 링크 보내고 나서 몇 분 뒤에 "자료 잘 받으셨나요?" 같은 후속 메시지도 자동으로 보낼 수 있어요.

무료 서비스 vs 유료 서비스 vs 직접 만든 것

기능 무료 서비스 유료 플랜 직접 만든 것
댓글 키워드 → DM 자동 발송 ✅ (대부분) ✅ ✅
댓글에 공개 답글 서비스마다 다름 ✅ ✅
팔로우 확인 후 링크 전달 ❌ (보통) ✅ ✅ 무료
DM 버튼 / 후속 메시지 제한적 ✅ ✅
링크 클릭 통계 제한적 ✅ ✅
연락처 수·계정 수 제한 있음 요금에 따라 없음
월 비용 0원 매달 구독료 0원

💡 서비스별 무료/유료 범위는 자주 바뀌니까, 영상 보고 비교해보실 분은 각 서비스 요금제 페이지를 한 번 확인해보세요.

그 밖에 되는 것들

기능 설명
댓글 키워드 → DM 특정 단어(예: 링크, 자료, 가격)가 들어간 댓글에 자동으로 DM 발송
공개 답글 댓글 밑에 "DM 보냈어요!" 같은 답글 자동 작성 (여러 개 넣으면 번갈아 사용)
DM 자동 답장 누가 DM으로 특정 단어를 보내면 자동 답장
링크 클릭 통계 보낸 링크를 몇 명이 눌렀는지 확인
놓친 댓글 다시 줍기 인스타가 알림을 빠뜨려도 주기적으로 댓글을 다시 훑어서 처리

2. 왜 공짜로 되나요?

특히 팔로우 확인 같은 기능에 유료 서비스가 돈을 받는 이유를 풀어보면 결국 이 세 가지예요.

유료 서비스가 돈 받는 이유 우리는 어떻게 공짜로?
프로그램을 만든 비용 누군가 이미 만들어서 오픈소스(무료 공개)로 올려둠
24시간 켜져 있는 서버 비용 오라클 클라우드 무료 서버(Always Free) 사용
인스타 연동 인스타그램(메타)의 공식 API는 원래 무료 — "이 사람이 나를 팔로우하는지" 확인하는 것도 공식 API로 무료로 됩니다

그리고 "오픈소스를 내 상황에 맞게 고치는 일"은 원래 개발자가 필요했는데, 이제 AI가 대신 해줍니다. 이게 핵심이에요.

제가 쓴 오픈소스

  • OpenInstaDM — https://github.com/Xeven777/openinstadm
  • MIT 라이선스라서 개인/상업적으로 자유롭게 쓰고 고칠 수 있어요. (원작자 표기만 유지하면 됩니다)
  • 인스타그램 공식 API만 사용해요. 비밀번호를 넣거나 몰래 로그인하는 방식이 아니라서 계정 정지 걱정이 훨씬 적습니다.

3. 어떻게 돌아가나요? (식당으로 비유하기)

용어가 몇 개 나오는데, 식당으로 생각하면 쉬워요.

식당으로 이해하는 자동 DM 구조: 카운터(웹앱) → 주문표 꽂이(Redis) → 주방(워커) → 장부(PostgreSQL)
카운터(웹앱)와 주방(워커)이 둘 다 켜져 있어야 DM이 나가요.
식당 비유 실제 이름 하는 일
카운터 웹앱 (Next.js) 관리 화면 보여주기, 인스타 알림(웹훅) 받기
주방 워커 실제로 DM 보내기, 놓친 댓글 다시 확인하기
주문표 꽂이 Redis "보내야 할 DM" 목록을 잠깐 들고 있기
장부 PostgreSQL (데이터베이스) 모든 설정과 기록 저장
간판과 출입문 Caddy https:// 주소를 붙여서 손님(인스타 알림)을 카운터로 안내
건물 오라클 무료 서버 위 프로그램들을 24시간 켜두는 곳

⚠️ 카운터랑 주방이 둘 다 켜져 있어야 DM이 나가요. 웹앱만 켜두면 "댓글은 들어오는데 DM이 안 나가는" 상황이 생깁니다. 제일 흔한 실수예요.


4. 준비물

필수

준비물 비용 용도
인스타그램 프로페셔널 계정 (비즈니스 또는 크리에이터) 무료 개인 계정은 API를 못 써요
페이스북 계정 무료 메타 개발자 사이트 로그인용
깃허브(GitHub) 계정 무료 오픈소스 가져오기
Claude Code 또는 Codex 각 서비스 구독 코드 작업을 대신 해줄 AI
오라클 클라우드 계정 무료 (가입 시 카드 등록 필요, 과금 X) 24시간 서버
구글 계정 무료 관리 화면 로그인용 (구글 로그인)

있으면 좋은 것

준비물 비용 왜?
내 도메인 (원하는 이름 아무거나) 연 1~2만 원 주소가 고정돼서 관리가 편해요. 없어도 무료 주소로 가능
컴퓨터 (맥/윈도우) - 처음에 테스트할 때

💡 Claude Code나 Codex는 이미 다른 용도로 쓰고 계시다면 추가 비용이 없어요. 이 프로젝트 하나 하는 데 드는 AI 사용량은 많지 않습니다.


1단계 — 인스타 계정을 프로페셔널 계정으로 바꾸기

인스타 앱에서:

  1. 프로필 → 오른쪽 위 ☰ → 설정 및 활동
  2. 계정 유형 및 도구 → 프로페셔널 계정으로 전환
  3. 크리에이터 또는 비즈니스 선택 (둘 다 됩니다)

그리고 하나 더 켜주세요.

  1. 설정 및 활동 → 메시지 및 스토리 답장 → 메시지 제어 → 연결된 도구 → 메시지 액세스 허용 켜기

이걸 안 켜면 나중에 다 만들어놓고 DM만 안 나가는 상황이 생길 수 있어요.


2단계 — 오픈소스 내 것으로 가져오기

  1. 깃허브에 로그인
  2. https://github.com/Xeven777/openinstadm 접속
  3. 오른쪽 위 Fork 버튼 클릭 → Create fork
OpenInstaDM 깃허브 저장소 첫 화면. 오른쪽 위 Fork 버튼에 빨간 테두리 표시
OpenInstaDM 저장소 화면. 빨간 테두리가 Fork 버튼이에요.

이제 github.com/내아이디/openinstadm 이라는 내 복사본이 생겼어요. 여기서부터는 원본을 건드리지 않고 마음껏 고칠 수 있습니다.

💡 저장소를 Private(비공개)로 쓰고 싶다면, Fork 대신 새 비공개 저장소를 만들고 AI에게 "원본 코드를 이 저장소로 옮겨줘"라고 시키면 돼요. 제 저장소도 이렇게 비공개로 운영하고 있어요.


3단계 — AI 코딩 도구 준비하고 첫 대화하기

어떤 걸 쓸까?

도구 특징
Claude Code 터미널/데스크톱 앱/웹(claude.ai/code)에서 사용. 깃허브 저장소를 연결해서 클라우드에서 바로 작업 가능
Codex OpenAI의 코딩 AI. ChatGPT 앱/웹에서 깃허브 저장소를 연결해서 사용 가능

둘 중 아무거나 하나면 충분해요. 이 문서의 프롬프트는 둘 다에서 똑같이 쓸 수 있게 썼습니다.

첫 번째 프롬프트: "이게 뭔지 설명해줘"

저장소를 연결했으면, 바로 시키지 말고 먼저 설명부터 들어보세요. AI가 프로젝트를 이해하는 과정이기도 하고, 여러분도 전체 그림을 잡을 수 있어요.

이 저장소는 인스타그램 댓글 자동 DM 오픈소스(OpenInstaDM)야.
나는 개발을 전혀 모르는 사람이야.

1. 이 프로그램이 어떤 구성요소로 이뤄져 있는지 비전공자도 알 수 있게 설명해줘.
2. 이걸 실제로 돌리려면 내가 직접 해야 하는 일(회원가입, 키 발급 등)과
   네가 대신 해줄 수 있는 일을 나눠서 정리해줘.
3. 나는 최종적으로 오라클 클라우드 무료 서버(Always Free) 한 대에서
   웹앱, 워커, 데이터베이스, Redis를 전부 24시간 돌리고 싶어.
   이 목표 기준으로 단계별 계획을 세워줘.

아직 코드는 수정하지 마.

💡 "아직 코드는 수정하지 마" 한 줄이 중요해요. AI는 의욕이 넘쳐서 물어보기만 해도 이것저것 고치려고 하거든요. 계획을 먼저 듣고, 납득되면 진행시키는 습관을 들이면 사고가 훨씬 줄어요.

두 번째 프롬프트: "한국어 키워드 되게 해줘"

원본 오픈소스는 외국 개발자가 만들어서, 한글 키워드(링크, 자료)를 제대로 인식 못 하는 문제가 있었어요. 제가 실제로 고친 부분입니다.

댓글 키워드 매칭 로직을 찾아서, 한국어 키워드("링크", "자료", "가격" 등)가
제대로 인식되는지 확인해줘.

- 한글이 정규식 등에서 지워지거나 무시되는 부분이 있으면 고쳐줘.
- "링크!", "링크요", "링크 주세요" 처럼 앞뒤에 다른 글자가 붙어도 인식되게 해줘.
- 고친 다음 한국어 키워드 테스트를 추가하고, 테스트를 돌려서 통과하는 걸 보여줘.

4단계 — 내 컴퓨터에서 먼저 띄워보기

이 단계는 건너뛰고 바로 6~7단계(서버)로 가도 돼요. 다만 처음이라면 내 컴퓨터에서 관리 화면이 뜨는 걸 한 번 보는 게 이해에 큰 도움이 됩니다.

필요한 비밀키 만들기

이 프로그램에는 "비밀번호" 역할을 하는 값이 몇 개 필요해요. 직접 만들 필요 없이 AI에게 시키면 됩니다.

이 프로젝트를 내 컴퓨터에서 실행하고 싶어.

1. 필요한 프로그램(Node.js 22, PostgreSQL, Redis 등)이 설치돼 있는지 확인하고,
   없으면 설치 방법을 내 운영체제에 맞게 알려줘. 가능하면 네가 직접 설치해줘.
2. .env 파일을 만들어줘. NEXTAUTH_SECRET, CRON_SECRET, ENCRYPTION_KEY,
   WEBHOOK_VERIFY_TOKEN 같은 비밀값은 네가 안전하게 랜덤 생성해서 채워줘.
   (ENCRYPTION_KEY는 반드시 64자리 hex여야 해)
3. 내가 직접 발급받아야 하는 값(인스타 앱 ID 등)은 빈칸으로 두고,
   어디서 받아오는지 목록으로 정리해줘.
4. 데이터베이스 준비(마이그레이션)까지 끝내고,
   웹앱과 워커를 둘 다 실행하는 방법을 알려줘.

.env 파일은 절대 깃허브에 올리지 마.

관리 화면 로그인 설정 (구글 로그인)

관리 화면에 들어가려면 로그인이 필요해요. 가장 쉬운 건 구글 로그인입니다.

  1. https://console.cloud.google.com 접속 → 새 프로젝트 만들기
  2. API 및 서비스 → OAuth 동의 화면 설정 (외부, 앱 이름/이메일만 입력)
  3. 사용자 인증 정보 → OAuth 클라이언트 ID 만들기 → 유형: 웹 애플리케이션
  4. 승인된 리디렉션 URI에 추가:
  5. 내 컴퓨터용: http://localhost:3000/api/auth/callback/google
  6. 나중에 서버용: https://내주소/api/auth/callback/google
  7. 나온 클라이언트 ID, 클라이언트 보안 비밀번호를 AI에게 주면서:
구글 로그인용 값이야. .env에 GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET으로 넣어줘.
- GOOGLE_CLIENT_ID: (붙여넣기)
- GOOGLE_CLIENT_SECRET: (붙여넣기)

그리고 나 말고 다른 사람은 관리 화면에 로그인 못 하게 막는 방법이 있는지도 확인해줘.

⚠️ 비밀값을 AI 채팅에 붙여넣는 게 찜찜하다면, AI에게 "어느 파일 몇 번째 줄에 넣으면 되는지만 알려줘"라고 하고 직접 붙여넣어도 됩니다. 이쪽이 더 안전해요.


5단계 — 메타(인스타) 개발자 앱 만들기

여기가 제일 헷갈리는 구간이에요. 메타 개발자 사이트는 AI가 대신 클릭해줄 수 없어서 직접 해야 합니다. 천천히 따라오세요.

💡 메뉴 이름은 메타가 자주 바꿔요. 화면이 조금 달라도 당황하지 말고, 스크린샷을 찍어서 AI에게 "지금 이 화면인데 다음에 뭐 눌러야 해?" 하고 물어보면 됩니다.

5-1. 앱 만들기

  1. https://developers.facebook.com/apps 접속 → 페이스북으로 로그인 (처음이면 개발자 등록)
  2. 앱 만들기 클릭
  3. 앱 이름, 연락처 이메일 입력
  4. 사용 사례(Use case)에서 "Instagram에서 메시지 및 콘텐츠 관리" 선택
  5. 🚫 "Facebook 로그인으로 인증"이나 "마케팅 API"는 선택하지 마세요
  6. 앱 유형을 물어보면 비즈니스

5-2. 키 복사하기

아래 3개 값을 메모장에 복사해 두세요.

값 이름 어디에 있나
INSTAGRAM_APP_ID 왼쪽 메뉴 Instagram → Instagram 로그인을 통한 API 설정 → Instagram 앱 ID
INSTAGRAM_APP_SECRET 같은 화면 → Instagram 앱 시크릿 (표시 클릭)
FACEBOOK_APP_SECRET 앱 설정 → 기본 설정 → 앱 시크릿 코드 (표시 클릭)

⚠️ 페이스북 앱 ID와 인스타그램 앱 ID는 다른 값이에요! 이걸 헷갈리면 나중에 "Unsupported request" 에러가 납니다. 제일 많이 하는 실수예요.

5-3. 내 인스타 계정을 테스터로 등록하기

앱이 아직 "개발 모드"일 때는 허락된 계정만 연결할 수 있어요.

  1. 메타 대시보드 → 앱 역할 → 역할 → Instagram 테스터 → 테스터 추가 → 내 인스타 아이디 입력
  2. 📱 휴대폰 인스타 앱에서 (중요!)
  3. 프로필 → 설정 및 활동 → 웹사이트 권한(또는 앱 및 웹사이트) → 테스터 초대
  4. 방금 만든 앱의 초대를 수락

이걸 빼먹으면 "Insufficient Developer Role" 에러가 나요.

5-4. 주소 등록하기 (서버 주소가 생긴 뒤에!)

이 부분은 7단계에서 서버 주소(https://...)가 생긴 다음에 하면 돼요. 미리 알아만 두세요.

  1. Instagram → Instagram 로그인을 통한 API 설정 → 비즈니스 로그인 설정
  2. 리디렉션 URL: https://내주소/api/instagram/callback
  3. Instagram → 웹훅 구성
  4. 콜백 URL: https://내주소/api/webhook
  5. 확인 토큰: .env에 있는 WEBHOOK_VERIFY_TOKEN 값
  6. 확인 및 저장 클릭
  7. 구독 필드에서 comments, messages, messaging_postbacks 세 개 구독 클릭
  8. 앱 설정 → 기본 설정에 아래 주소 입력 (이 프로그램에 이미 페이지가 들어 있어요)
  9. 개인정보처리방침: https://내주소/privacy
  10. 서비스 약관: https://내주소/terms
  11. 데이터 삭제: https://내주소/data-deletion
  12. 맨 위 앱 모드를 개발 → 라이브(Live)로 전환

💡 왜 라이브로 바꿔요? 개발 모드에서는 테스터로 등록된 사람의 댓글만 알림이 오는 경우가 있어요. 내 팔로워들 댓글을 받으려면 라이브로 바꿔야 합니다. 내 계정에만 쓰는 거라면 앱 심사(App Review) 없이 라이브 전환만으로 충분해요.


6단계 — 오라클 무료 서버 만들기

"24시간 돌아가는 서버"가 필요한 이유: 내 컴퓨터를 끄면 DM도 멈추니까요. 오라클 클라우드는 평생 무료(Always Free) 서버를 주는데, 사양도 꽤 넉넉해서 이 정도 프로그램은 여유 있게 돌아가요.

6-1. 가입하기

  1. https://www.oracle.com/kr/cloud/free/ → 무료로 시작하기
  2. 정보 입력 + 카드 등록 (본인 확인용, Always Free 범위 안에서는 과금되지 않아요)
  3. 홈 리전(Home Region) 선택 — ⚠️ 나중에 못 바꿉니다!
  4. 한국이면 South Korea Central (Seoul) 또는 Chuncheon
  5. 서버 만들 때 "용량 부족" 에러가 자주 나는 리전도 있어요. 막히면 AI나 커뮤니티에 "요즘 오라클 프리티어 서울 리전 ARM 인스턴스 생성 잘 되나요?" 물어보세요.

6-2. 서버(인스턴스) 만들기

  1. 콘솔 메뉴 → 컴퓨트 → 인스턴스 → 인스턴스 생성
  2. 이미지: Ubuntu (22.04 또는 24.04)
  3. Shape(사양): Ampere (VM.Standard.A1.Flex) 선택 → OCPU 2개 이상, 메모리 12GB 이상 추천
  4. "Always Free 대상(Always Free-eligible)" 표시가 붙은 것만 고르세요
  5. Ampere가 계속 "Out of capacity"로 실패하면, 시간대를 바꿔 다시 시도하거나 VM.Standard.E2.1.Micro(AMD, 1GB)로 먼저 시작해도 돼요. 다만 메모리가 작아서 빌드할 때 버벅일 수 있어요.
  6. 참고로 다 띄워 놓고 실제로 쓰는 메모리는 1GB가 안 돼요(7단계 표 참고). 넉넉하게 잡는 건 빌드할 때 잠깐 메모리를 많이 쓰기 때문이에요.
  7. SSH 키 추가: "키 쌍 생성" → 개인 키 저장 (이 파일 잃어버리면 서버 못 들어가요! 잘 보관)
  8. 생성 → 몇 분 기다리면 공용 IP 주소가 나와요. 메모해 두세요.

6-3. 서버에 접속해보기

맥은 터미널, 윈도우는 PowerShell을 열고:

# 다운받은 키 파일 권한 설정 (맥/리눅스만)
chmod 400 ~/Downloads/ssh-key-xxxx.key

# 서버 접속 (공용 IP 자리에 아까 메모한 주소)
ssh -i ~/Downloads/ssh-key-xxxx.key ubuntu@공용IP

ubuntu@instance-xxxx:~$ 같은 글자가 보이면 성공이에요. 🎉

💡 Claude Code를 내 컴퓨터 터미널에서 쓰고 있다면, 이 접속 과정 자체도 AI에게 시킬 수 있어요. "이 키 파일로 오라클 서버 공용IP에 ssh 접속해서 작업해줘"라고 하면 됩니다.


7단계 — 서버에 올려서 24시간 돌리기

이제 서버 안에 "식당 전체(카운터·주방·주문표 꽂이·장부)"를 차립니다. 이 단계는 거의 전부 AI에게 시키면 돼요.

다 끝나면 서버에는 이렇게 올라가 있어요. 제 서버도 실제로 이 구성으로 돌아가고 있어요.

프로그램 하는 일 메모리
웹앱 (Next.js) 관리 화면 + 인스타 알림 받기 약 0.4GB
워커 인스타그램 DM 보내는 작업 프로그램 약 0.2GB
PostgreSQL, Redis 위 두 프로그램이 쓰는 데이터베이스 소량
Caddy 주소에 HTTPS(자물쇠)를 붙여 주는 프로그램 소량

💡 Docker는 없어도 돼요. PostgreSQL과 Redis를 서버에 바로 설치하면 구조가 단순하고 메모리도 덜 써요. Docker나 Tailscale 같은 도구는 이 구성에 필요 없어요.

7-1. 인터넷 주소(HTTPS) 정하기

인스타가 "새 댓글 왔어요!"라고 알려주려면 https://로 시작하는 고정 주소가 필요해요. 방법은 이렇게 있어요.

방법 비용 난이도 추천
A. 내 도메인 + Caddy 도메인 비용만 (연 1~2만 원) 중간. 오라클 방화벽에서 80·443 포트를 열어야 함 ⭐ 제가 쓰는 방식
B. 무료 서브도메인(DuckDNS 등) + Caddy 무료 A와 같음 완전 무료로 하고 싶으면
C. 내 도메인 + Cloudflare Tunnel 도메인 비용만 쉬움. 방화벽을 안 열어도 됨 포트를 열기 어려울 때

도메인은 원하는 걸 아무거나 쓰면 돼요. 새로 사도 되고, 이미 가진 도메인에 주소 하나를 추가해도 돼요. Caddy가 HTTPS 인증서를 알아서 발급하고 갱신해 줘서 따로 신경 쓸 게 없어요.

💡 오라클 서버 대신 Vercel 같은 다른 호스팅에 올리고 싶다면 그것도 괜찮아요. 다만 이 글은 오라클 서버 기준이라, 그 경우엔 AI에게 "이 프로젝트를 [쓰려는 서비스]에 배포하려면 뭐가 달라져?"라고 물어보면서 진행하세요. 워커는 24시간 켜져 있어야 해서 따로 돌릴 곳이 필요할 수 있어요.

⚠️ Cloudflare의 "임시 터널(trycloudflare.com)"은 서버를 재시작할 때마다 주소가 바뀌어요. 그때마다 메타 설정을 다시 해야 해서 24시간 운영용으로는 비추천입니다.

7-2. 서버 세팅 통째로 맡기기

아래 프롬프트에서 [ ] 부분만 내 상황에 맞게 바꿔서 붙여 넣으세요.

이 프로젝트를 오라클 클라우드 Always Free 서버(Ubuntu, ARM) 한 대에 배포하고 싶어.
나는 비전공자니까 각 단계에서 뭘 하는지 짧게 설명하면서 진행해줘.

[서버 정보]
- 접속: ssh -i [키파일 경로] ubuntu@[공용IP]
- 사용할 주소: [https://내가 정한 주소]  (방법 A: 내 도메인 + Caddy / B: DuckDNS + Caddy / C: Cloudflare Tunnel 중 [A])

[원하는 구성]
1. 서버에 Node.js 22, git, PostgreSQL, Redis를 설치해줘. Docker는 쓰지 않아.
2. PostgreSQL과 Redis는 외부 인터넷에서 접속 못 하게 막아줘.
   (서버 안에서만 접근 가능하게. 비밀번호도 강하게 설정)
3. 내 깃허브 저장소를 서버에 받아서 빌드해줘.
4. 웹앱(npm start)과 워커(npm run worker)를 둘 다 띄우고,
   서버가 재부팅되거나 프로그램이 죽어도 자동으로 다시 켜지게 해줘. (systemd 또는 pm2)
5. Caddy를 설치해서 HTTPS 주소가 웹앱(3000번 포트)으로 연결되게 해줘.
   인증서 발급·갱신도 자동으로 되게 하고, 방법 C를 고른 경우에는 Cloudflare Tunnel로 대신 연결해줘.
6. 매일 인스타 토큰 갱신 같은 정기 작업(/api/cron/*)이 돌아가게 해줘.
   Vercel이 아니라서 vercel.json의 crons는 안 돌아. scripts/cron.sh나 crontab으로 대신 돌려줘.
7. 마지막에 /api/health 주소로 DB, Redis, 워커가 전부 정상인지 확인해줘.

[주의]
- .env는 서버에만 만들고 깃허브에 절대 올리지 마.
- 웹앱과 워커는 반드시 같은 DATABASE_URL, REDIS_URL, ENCRYPTION_KEY를 써야 해.
- 오라클은 클라우드 콘솔 방화벽(보안 목록)이랑 서버 안 방화벽(iptables)이 따로 있어.
  Caddy용 80·443 포트는 둘 다 열어야 해. 내가 콘솔에서 직접 해야 하는 건 클릭 순서대로 알려줘.
- 3000번 포트나 DB·Redis 포트는 바깥에 열지 마. 바깥에서는 Caddy(80·443)로만 들어오게 해줘.
- 메모리가 부족하면 스왑(swap)을 추가해줘.

AI가 진행하다가 이런 걸 물어볼 거예요. 당황하지 말고 답해주면 됩니다.

AI가 물어보는 것 어디서 구하나
인스타 앱 ID/시크릿, 페이스북 앱 시크릿 5-2에서 메모한 값
구글 클라이언트 ID/시크릿 4단계에서 만든 값 (리디렉션 URI에 서버 주소도 추가!)
도메인 연결 (DNS) 도메인을 산 곳(가비아, Cloudflare 등)에서 내가 쓸 주소의 A 레코드를 서버 공용 IP로 지정. AI가 화면 순서대로 알려줘요
오라클 콘솔 작업 AI가 알려주는 순서대로 클릭

7-3. 메타에 주소 등록하기

서버 주소가 생겼으니 이제 5-4단계로 돌아가서 주소들을 등록하고 앱을 라이브로 바꿔주세요.

7-4. 잘 돌아가는지 확인

브라우저에서 https://내주소/api/health 를 열어보세요. 맨 위 status가 "ok"이고 항목들이 전부 정상(ok / healthy)이면 성공이에요. 하나라도 문제가 있으면 "degraded"로 나와요.

{
  "status": "ok",
  "checks": {
    "database": { "status": "ok" },
    "redis":    { "status": "ok" },
    "queue":    { "status": "ok" },
    "worker":   { "healthy": true }
  }
}

8단계 — 첫 자동 DM 캠페인 만들기

드디어 실제로 써볼 차례예요!

  1. https://내주소 접속 → 구글로 로그인
  2. 워크스페이스 만들기 → Instagram 연결 클릭 → 내 인스타 계정으로 로그인 & 권한 허용
  3. Campaigns(캠페인) → 새 캠페인
  4. 게시물 선택: 자동 DM을 걸 릴스/게시물
  5. 키워드: 자료, 링크 등 (여러 개 가능)
  6. 공개 답글: "DM 보내드렸어요! 📩" (여러 개 넣으면 돌아가면서 사용)
  7. DM 내용: "안녕하세요! 요청하신 자료예요 👉 https://..."
  8. ⭐ 팔로우 확인 켜기 — 캠페인 화면의 They will get 영역에서 a follow requirement first 스위치를 켜요
  9. 안내 메시지: "자료 보내드리기 전에 팔로우 한 번만 부탁드려요! 팔로우하셨으면 아래 버튼 눌러주세요 🙏"
  10. 버튼 문구: 기본값이 영어(i'm following)라서 "팔로우했어요"로 꼭 바꿔주세요
  11. (선택) Follow-up: 링크 보내고 몇 분 뒤 "자료 잘 받으셨나요? 😊" 같은 후속 메시지
  12. 활성화 켜기
  13. 팔로우 안 한 다른 계정으로 그 게시물에 자료 댓글 달아보기
  14. "팔로우 부탁드려요" DM + 버튼이 오면 성공
  15. 팔로우하지 않고 버튼 누르기 → 다시 안내가 오는지 확인
  16. 팔로우하고 버튼 누르기 → 링크가 오는지 확인

⚠️ 내 계정으로 내 게시물에 댓글 달면 DM이 안 와요. 자기 자신에게는 DM을 보낼 수 없거든요. 꼭 친구 계정이나 부계정으로 테스트하세요.

링크까지 받았다면… 축하합니다! 🎉 이제 유료 플랜에서나 되던 "팔로우 확인 후 링크 보내기"를 매달 구독료 없이 쓰실 수 있어요.


바로 쓰는 프롬프트 모음

만들고 나서 "이런 것도 되나?" 싶을 때 이렇게 시키면 돼요. AI와 대화하면서 계속 내 입맛대로 바꿔가는 게 이 방식의 진짜 장점이에요.

🔧 문제가 생겼을 때

댓글은 달렸는데 DM이 안 와. 서버에 접속해서 웹앱 로그, 워커 로그,
/api/health 결과를 확인하고 원인을 찾아줘. 고치기 전에 원인부터 설명해줘.
서버가 재부팅된 것 같아. 웹앱, 워커, DB, Redis, Caddy, 정기작업이
전부 다시 켜졌는지 확인해줘.

✨ 기능 추가/변경

관리 화면 메뉴랑 버튼들을 한국어로 바꿔줘.
문구만 바꾸고 기능은 건드리지 마.
DM 보낼 때 댓글 단 사람 이름을 넣어서 "OO님, 요청하신 자료예요!" 처럼
개인화하고 싶어. 이미 그런 기능이 있는지 먼저 확인하고, 없으면 만들어줘.
하루에 DM 몇 개 보냈는지, 링크는 몇 번 눌렸는지
일주일 단위로 보기 쉽게 정리해서 보여주는 화면이 있는지 확인해줘.

🔄 업데이트

원본 오픈소스(Xeven777/openinstadm)에 새로운 업데이트가 있는지 확인하고,
내가 고친 부분(한국어 키워드 등)이 깨지지 않게 합쳐줘.
합치기 전에 뭐가 바뀌는지 먼저 요약해줘.

🛡️ 점검

이 서버 보안 점검 한번 해줘.
- 외부에서 DB나 Redis 포트에 접근 가능한지
- .env 같은 비밀 파일이 깃허브에 올라간 적 있는지
- 불필요하게 열려 있는 포트가 있는지
문제가 있으면 위험도 순으로 알려주고, 고치기 전에 나한테 확인받아.

자주 막히는 곳 Q&A

Q. 인스타 연결할 때 "Insufficient Developer Role" 에러가 나요

내 인스타 계정이 메타 앱의 테스터로 등록 + 수락이 안 된 상태예요. 5-3단계를 다시 확인하세요. 특히 휴대폰 인스타 앱에서 초대 수락을 많이 빼먹어요.

Q. "Unsupported request - method type: get" 에러가 나요

거의 둘 중 하나예요.

  1. INSTAGRAM_APP_ID에 페이스북 앱 ID를 넣었다 → 인스타그램 앱 ID로 바꾸기
  2. 메타에 등록한 리디렉션 주소와 실제 주소가 한 글자라도 다르다 → https, 끝의 / 유무까지 똑같이 맞추기
Q. 웹훅 "확인 및 저장"이 실패해요
  • 메타에 입력한 확인 토큰과 서버 .env의 WEBHOOK_VERIFY_TOKEN이 같은지
  • 서버가 켜져 있고 https://내주소 가 브라우저에서 열리는지

확인하세요. 안 되면 AI에게 "메타 웹훅 검증이 실패해. 서버 로그 확인해줘"라고 하면 됩니다.

Q. `https://내주소`가 안 열리거나 "안전하지 않음"이 떠요

Caddy가 HTTPS 인증서를 못 받은 경우예요. 거의 둘 중 하나입니다.

  1. 도메인의 A 레코드가 아직 서버 공용 IP를 가리키지 않는다 → DNS 설정 확인 (바꾼 직후면 몇 분~몇 시간 기다리기)
  2. 80·443 포트가 막혀 있다 → 오라클 콘솔 보안 목록과 서버 안 iptables 둘 다 열렸는지 확인

AI에게 "Caddy가 인증서를 못 받는 것 같아. 로그 보고 원인 찾아줘"라고 하면 됩니다.

Q. 댓글은 관리 화면에 보이는데 DM이 안 나가요

워커(주방)가 꺼져 있을 확률이 90%예요. https://내주소/api/health에서 worker가 healthy인지 보세요. 꺼져 있으면 AI에게 "워커가 죽었어. 원인 찾고 다시 켜줘"라고 하세요.

Q. 워커 로그에 "Failed to decrypt Instagram access token"이 떠요

웹앱과 워커의 ENCRYPTION_KEY가 서로 달라요. 두 곳에 완전히 같은 값이 들어가야 합니다. 그리고 이 키는 한 번 정하면 절대 바꾸지 마세요. 바꾸면 이미 연결된 인스타 계정을 다시 연결해야 해요.

Q. 몇 주 지나니까 갑자기 DM이 안 나가요

인스타 연결 토큰은 약 60일마다 갱신이 필요해요. 프로그램이 매일 자동으로 갱신하도록 되어 있는데, 이 정기 작업(cron)이 서버에서 안 돌고 있으면 조용히 만료돼요. AI에게 "토큰 갱신 정기작업이 제대로 돌고 있는지 확인해줘"라고 하세요.

Q. 오라클 서버가 갑자기 꺼졌어요 / 사라졌어요

오라클은 무료 계정에서 오랫동안 거의 안 쓰는(CPU 사용량이 아주 낮은) 서버를 회수할 수 있다고 안내하고 있어요. 정책은 바뀔 수 있으니 오라클 공식 Always Free 안내를 한번 확인해 두세요. 걱정되면 계정을 종량제(Pay As You Go)로 업그레이드하는 방법도 있는데, Always Free 범위 안에서만 쓰면 여전히 요금은 0원이에요. (업그레이드 전 과금 조건은 꼭 직접 확인하세요!)

Q. 팔로우 확인은 100% 정확한가요?

팔로우 여부는 인스타 공식 API로 확인해요. 인스타가 "팔로우 안 함"이라고 답하면 링크를 주지 않고 다시 안내해요.

다만 계정이나 권한 상태 때문에 인스타가 팔로우 여부를 아예 알려주지 않는 경우가 가끔 있어요. 이때는 진짜 팔로워가 링크를 못 받는 일이 없도록 그냥 링크를 보내줘요. (이런 방식을 fail-open이라고 해요)

그래서 "팔로우를 늘리는 장치"로는 충분하지만, 팔로워 말고는 절대 보면 안 되는 자료를 지키는 잠금장치로는 쓰지 마세요.


꼭 지켜야 할 원칙

🔐 비밀값은 비밀로

  • .env 파일, 앱 시크릿, 오라클 SSH 키는 절대 깃허브·카톡·스크린샷에 올리지 마세요.
  • 실수로 올렸다면 지우는 걸로 끝이 아니라 새로 발급(재생성)해야 해요. AI에게 "비밀값이 노출된 것 같아. 어떤 걸 재발급해야 하는지 알려줘"라고 하세요.

📜 공식 API만 쓰기

  • 이 방식은 인스타그램 공식 API라서 안전한 편이지만, 메타의 정책을 어기면 앱이나 계정이 제한될 수 있어요.
  • 댓글 단 사람에게 1회 답장 하는 용도로 쓰세요. 광고 DM을 마구 보내는 스팸 용도는 안 됩니다.

🙏 오픈소스 예의 지키기

  • 원본 저장소의 LICENSE 파일(MIT)과 원작자 표기는 지우지 마세요.
  • 도움이 많이 됐다면 원본 저장소에 ⭐ 하나 눌러주세요.

🤖 AI는 "시키고, 확인하고, 승인"

  • 큰 작업은 항상 "먼저 계획만 말해줘 → 확인 → 진행해줘" 순서로.
  • 서버에서 무언가 삭제하거나 초기화하는 명령은 AI가 해도 된다고 해도 한 번 더 물어보세요. "이거 하면 기존 데이터 날아가?"

마무리

정리하면 이게 전부예요.

  1. 깃허브에서 이미 잘 만들어진 오픈소스를 찾는다
  2. AI에게 내 상황(한국어, 오라클 서버)에 맞게 고쳐달라고 한다
  3. 무료 서버에 올려서 24시간 돌린다

예전 같으면 개발자를 고용하거나 매달 구독료를 내야 했던 것들을, 이제는 이렇게 직접 만들어서 공짜로 쓸 수 있어요.

그리고 한 번 만들고 끝이 아니라, 쓰다가 불편한 게 생기면 그때그때 AI한테 "이거 이렇게 바꿔줘" 하면서 나만의 도구로 계속 키워가는 것, 그게 개발자가 AI를 쓰는 방식이에요.

작게 시작하고, 쓰면서 계속 내 방식으로 바꾸세요.