시작하기

30초 만에 첫 봇 배포하기

웹 폴더 드래그, GitHub 연동, CLI 배포 3가지 방법과 환경변수 암호화, 실시간 로그 관제까지 완벽 가이드.

업데이트: 2026-10-08

DashCloud는 개인 컴퓨터나 노트북을 덮어도 24시간 365일 쉬지 않고 돌아가는 파이썬 및 Node.js 백그라운드 프로세스 전용 클라우드 런타임입니다.

프론트엔드 웹사이트나 정적 웹페이지는 Vercel이나 Cloudflare Pages에 올리고, 항상 켜져 있어야 하는 텔레그램 봇, 주기적 데이터 크롤러, 퀀트 자동매매 프로그램, AI 에이전트는 DashCloud의 상시 런타임에 분리 배포하는 것이 가장 모던하고 안정적인 아키텍처입니다.

복잡한 인프라 설정이나 Dockerfile 작성이 필요 없습니다

Ubuntu 리눅스 가상 서버를 대여하고 SSH 키를 발급받거나, 방화벽 포트를 열고 systemd 서비스 파일을 작성할 필요가 없습니다. 소스 코드 폴더를 대시보드 화면에 끌어다 놓기만 하면 런타임이 의존성을 스스로 감지해 10초 만에 상시 가동을 시작합니다.


3가지 배포 경로 비교

DashCloud는 개발 스타일(Web UI, Git 협업, 로컬 터미널)에 맞춰 3가지 직관적인 배포 경로를 지원합니다.

웹 대시보드 폴더 업로드 (가장 빠름)

Git 저장소를 만들지 않았거나 로컬에서 빠르게 프로토타입 봇을 검증하고 싶을 때 가장 추천하는 방식입니다.

  1. DashCloud 대시보드의 새 서비스 생성 화면으로 이동합니다.
  2. 로컬 컴퓨터의 프로젝트 작업 폴더(예: my-bot/)를 업로드 영역으로 드래그 앤 드롭합니다.
  3. 브라우저가 폴더 내 파일들을 클라이언트 단에서 압축(tar.gz)한 뒤 보안 API로 클라우드에 전송합니다.
  4. .git, node_modules, .venv, __pycache__ 같은 대용량 캐시 폴더는 브라우저 단계에서 자동으로 필터링되므로 수 메가바이트 이내로 1~2초 만에 초고속 업로드됩니다.

단계별 배포 상세 가이드

1

프로젝트 코드 및 의존성 파일 준비

DashCloud 런타임은 프로젝트 루트 경로에 위치한 표준 의존성 명세 파일을 자동으로 분석하여 컨테이너 기동 시 필요한 패키지를 자동으로 설치합니다.

파이썬 프로젝트는 진입점이 될 스크립트 파일(main.py, bot.py 또는 app.py)과 requirements.txt 파일을 같은 폴더에 준비합니다.

  • my-telegram-bot/
    • main.py # 메인 실행 진입점
    • requirements.txt # 설치할 파이썬 패키지 목록
    • .env # (선택) 로컬 테스트용 환경변수
    • data/ # (선택) 로컬 데이터 디렉터리
requirements.txt 예시
python-telegram-bot>=21.0
requests>=2.31.0
python-dotenv>=1.0.0
로컬 절대경로를 하드코딩하지 마세요

로컬 컴퓨터의 C:\Users\username\... 또는 /Users/name/... 같은 개인 PC 절대경로는 클라우드 컨테이너 환경에서 존재하지 않으므로 에러가 발생합니다. 코드 내 파일 경로는 항상 pathlib.Path(__file__).parent 또는 상대경로를 사용하세요.

2

런타임 환경 프리셋 선택

대시보드에서 프로젝트 성격에 맞는 최적의 고성능 런타임 환경을 선택합니다. 모든 런타임은 독립된 보안 샌드박스에서 격리 실행됩니다.

런타임 프리셋런타임 코드내장 엔진 및 라이브러리추천 워크로드
Python 3.12PYTHON_312Python 3.12, pip, make/g++/pkg-config, sqlite3/jq텔레그램 봇, 디스코드 봇, 경량 웹훅 수신기, 자동화 스크립트
Python 3.11PYTHON_311Python 3.11, pip, 동일 빌드 도구3.11 호환 패키지가 필요한 봇
Chromium + PythonCHROMIUM_PYTHONPython 3.12, Playwright, Chromium 헤드리스, Noto Sans CJK 한글 폰트쇼핑몰 최저가 스크래퍼, 동적 SPA 크롤링, 웹사이트 스크린샷 캡처
Node.js 22NODE_22Node.js 22 LTS, npmNode.js 기반 봇, Telegraf, Discord.js, 스트리밍 워커
Node.js 20NODE_20Node.js 20 LTS, npm20 LTS 호환 프로젝트, CCXT 트레이딩 봇

진입점 파일 이름(예: main.py 또는 index.js)을 입력창에 지정합니다. 비워두면 런타임 기본값이 사용됩니다 (Python 계열 main.py, Node 계열 index.js). Node 프로젝트에서 package.json에 "start" 스크립트가 있으면 npm start로 실행됩니다.

3

보안 환경변수 주입

봇 토큰, 거래소 API Key, 데이터베이스 비밀번호와 같은 민감한 비밀 값은 절대로 소스 코드나 깃허브에 노출되어서는 안 됩니다.

대시보드의 환경변수 입력 섹션에 키-값 쌍을 등록합니다.

환경변수 등록 예시
TELEGRAM_BOT_TOKEN=7123456789:AAF_example_token_abcdef123456
TELEGRAM_ADMIN_CHAT_ID=123456789
UPBIT_ACCESS_KEY=your_upbit_access_key_here
UPBIT_SECRET_KEY=your_upbit_secret_key_here
TZ=Asia/Seoul
환경변수 암호화 저장

DashCloud에 등록된 모든 환경 변수는 데이터베이스에 저장되는 즉시 AES-256-GCM 군사 등급 표준 알고리즘으로 암호화됩니다. 암호화된 시크릿은 프로젝트 컨테이너가 시작되는 순간 프로세스 메모리에만 복호화되어 안전하게 주입됩니다.

4

배포 실행 및 실시간 모니터링

배포하기 버튼을 클릭하면 클라우드 백그라운드에서 빌드 파이프라인이 즉시 시작됩니다:

  1. 컨테이너 프로비저닝: 격리된 보안 컨테이너 인스턴스가 할당됩니다.
  2. 의존성 설치: pip install -r requirements.txt 또는 npm install이 자동으로 실행됩니다(패키지 수에 따라 수십 초 이상 걸릴 수 있습니다).
  3. 영구 디스크 마운트: /app 디렉터리가 영구 볼륨에 연결됩니다.
  4. 프로세스 데몬 기동: 지정된 진입점이 백그라운드 데몬으로 전환되며 상태가 RUNNING으로 변경됩니다.

대시보드의 콘솔 로그 탭에서 프로세스의 print()나 console.log() 표준 출력을 밀리초 단위 실시간 웹소켓 스트림으로 즉시 확인할 수 있습니다.

5

웹훅 알림 연동 및 서비스 유지 관리

서비스가 정상 가동된 후, 외출 중이거나 수면 중에도 안심할 수 있도록 비상 알림을 설정합니다:

  • 장애 알림 웹훅: 프로젝트 설정 ➔ 알림 설정에서 Discord Webhook URL 또는 Telegram Chat ID를 등록해 두면, 예기치 못한 크래시나 프로세스 비정상 종료 시 에러 트레이스백과 함께 즉시 비상 경보가 발송됩니다.
  • 오픈베타 무료 정책: 오픈베타 기간에는 별도의 연장 없이 프로젝트가 계속 무료로 유지됩니다. 유료 플랜(Hobby/Pro)은 정식 출시 예정이며, 출시 전에는 결제와 플랜 전환이 열리지 않습니다.

30초 검증용 테스트 봇 코드

배포가 제대로 되는지 즉시 시험해 볼 수 있는 미니멀 텔레그램 봇 코드입니다.

main.py
import os
import sys
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
 
# 로깅 설정 (DashCloud 실시간 웹 콘솔에 출력됨)
logging.basicConfig(
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", 
    level=logging.INFO
)
logger = logging.getLogger(__name__)
 
async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    user_name = update.effective_user.first_name
    await update.message.reply_text(
        f"안녕하세요 {user_name}님! DashCloud 24시간 클라우드 런타임에서 정상 작동 중입니다. 🚀"
    )
 
async def status_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
    await update.message.reply_text("현재 시스템 상태: 정상 가동 중 (Uptime: 100%)")
 
def main():
    token = os.environ.get("TELEGRAM_BOT_TOKEN")
    if not token:
        logger.error("환경변수 TELEGRAM_BOT_TOKEN이 설정되지 않았습니다!")
        sys.exit(1)
 
    logger.info("텔레그램 봇 애플리케이션을 초기화합니다...")
    app = Application.builder().token(token).build()
 
    # 핸들러 등록
    app.add_handler(CommandHandler("start", start_command))
    app.add_handler(CommandHandler("status", status_command))
 
    logger.info("24/7 무중단 롱폴링 루프를 시작합니다...")
    # drop_pending_updates=True: 재기동 시 누적된 이전 메시지 중복 처리 방지
    app.run_polling(drop_pending_updates=True)
 
if __name__ == "__main__":
    main()

흔히 겪는 배포 에러와 1분 해결책

배포 도중 문제가 발생했다면 대시보드의 빌드 로그 및 콘솔 로그를 열고 아래 에러 패턴을 확인하세요.

1. ModuleNotFoundError: No module named '...'

  • 원인: 로컬 컴퓨터에는 설치되어 있던 패키지가 requirements.txt에 적혀있지 않아 클라우드 빌드 환경에서 누락된 경우입니다.
  • 해결법: 로컬 터미널에서 pip freeze > requirements.txt 명령을 실행하거나, 사용한 라이브러리 이름을 requirements.txt에 한 줄씩 추가한 뒤 다시 배포하세요.

2. 프로세스가 시작하자마자 Exit 0으로 꺼지는 현상

  • 원인: 백그라운드에서 24시간 대기하는 루프(run_polling(), while True: 등)가 없고 1회성 스크립트로 작성되어 코드가 끝까지 도달해 정상 종료된 경우입니다.
  • 해결법: 텔레그램 봇의 경우 app.run_polling()을 호출하고 있는지 확인하세요. 주기적 크롤러나 작업 스크립트라면 루프(while True: ... time.sleep(60))를 감싸거나 크론 스케줄 설정을 이용하세요.

3. KeyError: 'TELEGRAM_BOT_TOKEN'

  • 원인: 코드에서 os.environ["TELEGRAM_BOT_TOKEN"]을 참조하지만 대시보드 환경변수 메뉴에 해당 키를 등록하지 않은 경우입니다.
  • 해결법: 프로젝트 상세 ➔ 환경 변수 탭으로 이동하여 키 이름을 오타 없이 등록하고 재배포를 누르세요.

관련 블로그


다음 추천 문서