IT/Cloud & AI

시놀로지NAS에서 OpenClaw 활용하기 (DS220+ / Telegram bot)

TIENE 2026. 2. 19. 15:00

 

 

2023년 초에 구입해서 NAS 서버로 사용 중인 DS220+를 사용하고 있다. 파일/사진 백업 및 16GB를 증설해서 가상 머신을 통해 외부에서 내부에 접근하기 편하게 설정을 해놓았는데, 달리 활용할 줄 몰라서 아까웠다.

그런데 요즘 OpenClaw가 뜨거운 감자로 급부상하고 있다. OpenClaw로 개인AI비서처럼 활용하는 많은 사람들을 보고 나 또한 도전해보고 싶었고, 마침 편하게 쉬고 있는 내 시놀로지 나스를 굴려보기로 한다. 들리는 소문에 의하면 OpenClaw를 가성비로 최대한 활용하기 위해 맥미니로 선정되어서 중고가격이 소폭 상승 혹은 감가방어가 되고 있다고 한다. (가성비 극강이라고 한다.)

 

각설하고, OpenClaw는 많은 OS를 지원하는데 그 중에서 제일 가벼운 ubuntu로 선정했다. 메모리 4GB를 부여해서 돌리려면 ubuntu말고 대안이 없다..

 

1. Download Station에서 ubuntu-24.04.4-live-server-amd64.iso.torrent으로 ubuntu 이미지 내려받기

 

 

https://ubuntu.com/download/alternative-downloads

 

2. Virtual Machine Manager에서 ubuntu설치하기

 

 

 

3. 포트포워딩으로 외부에서도 작업할 수 있도록 설정하기

- [공인IP]:2222 -> [OpenClaw서버]:22으로 접근할 수 있도록 포트포워딩 설정을 한다.

- Virtual Machine Manager에서 콘솔 접속하면 작업하기가 너무 귀찮다(복붙이 불가)

- 정상적으로 외부에서 접속이 가능한지 터미널 프로그램으로 확인해본다

 

4. OpenClaw 설치하기

- Gemini에게 물어보니 이렇게 정리해주었다. 따라서 설치한다.

======================================================================================

패키지 목록 업데이트

sudo apt update && sudo apt upgrade -y

 

OpenClaw 온보딩: 설치 후 초기 설정(AI 모델 선택, 텔레그램 연동 등)을 다시 진행할 때
openclaw onboard

 

OpenClaw 상태 확인: 서비스가 정상적으로 돌고 있는지 확인
openclaw gateway status

 

금융 데이터 및 텔레그램 라이브러리 설치

pip install yfinance pyupbit python-telegram-bot --break-system-packages

 

최신 Gemini SDK 설치: 구글 AI 모델을 사용하기 위한 필수 라이브러리

pip install -U google-genai --break-system-packages

 

데이터 처리 및 크롤링 라이브러리 설치

pip install pandas beautifulsoup4 lxml --break-system-packages

 

시간대 설정: 알림이 정확한 시간에 오도록 서버 시간을 서울로 맞추기

sudo timedatectl set-timezone Asia/Seoul

===================================================================================

 

5. 텔레그램 Bot 생성

- BotFather에서 /newbot을 입력 후, 새로 생성하는 bot의 이름은 bot으로 끝나면 된다.

 

- 생성되면 HTTP API 토큰을 부여하는데 이 토큰을 복사해둔다.

 

- OpenClaw 설치 과정 중, Telegram을 선택하게 되면 bot token을 넣어야 하는데 아까 복사한 Token을 붙여넣는다.

 

 

6. 새로 생성한 bot으로 가서 채팅을 입력하면,  페어링 코드를 받는다. 이 페어링 코드를 openclaw에서 입력해 등록한다.

===========================================================================================

텔레그램 페어링 승인:봇에게 받은 보안 코드를 입력해 본인을 '주인'으로 등록

openclaw pairing approve telegram [페어링코드]

===========================================================================================

 

7. python 스크립트 작성 

예시 : 미국 주식 및 코인 가격 알려주기

import yfinance as yf
import pyupbit
import asyncio
import requests
from telegram import Bot

# 1. 설정 (기존 정보 유지)
TOKEN = "BotFather 토큰"
CHAT_ID = "생성한 Bot Pairing Code"

def get_change_emoji(change):
    return "🔺 " if change > 0 else "🔻 " if change < 0 else "🔹 "

async def send_report():
    bot = Bot(token=TOKEN)

    # 2. 환율 정보 가져오기 (Yahoo Finance)
    ex_ticker = yf.Ticker("USDKRW=X")
    exchange_rate = ex_ticker.fast_info['last_price']

    # 3. 미국 주식 데이터 수집 (환산가 포함)
    symbols = ["NVDA", "AAPL", "TSLA", "TSLL"]
    stock_msg = "🇺 🇸  **US Stocks (Prev. Close):**\n"

    for symbol in symbols:
        ticker = yf.Ticker(symbol)
        hist = ticker.history(period="2d")
        if len(hist) >= 2:
            current = hist['Close'].iloc[-1]
            prev = hist['Close'].iloc[-2]
            change_pct = ((current - prev) / prev) * 100
            krw_price = current * exchange_rate # 원화 환산
            emoji = get_change_emoji(change_pct)
            stock_msg += f"- {symbol}: ${current:.2f} ({krw_price:,.0f}원) {emoji} {change_pct:+.2f}%\n"

    # 4. 코인 데이터 수집 (Upbit)
    btc_current = pyupbit.get_current_price("KRW-BTC")
    btc_days = pyupbit.get_ohlcv("KRW-BTC", interval="day", count=2)
    btc_prev = btc_days['close'].iloc[-2]
    btc_change_pct = ((btc_current - btc_prev) / btc_prev) * 100
    btc_emoji = get_change_emoji(btc_change_pct)

    # 5. 경제 지표 및 메시지 구성
    # (참고: Fear & Greed Index는 외부 API를 사용하거나 간략한 텍스트로 대체 가능)
    message = (
        "📊  **Daily Financial Report**\n\n"
        f"💵  **Exchange Rate:** 1$ = {exchange_rate:.2f} KRW\n\n"
        f"{stock_msg}\n"
        f"🪙  **Crypto (Upbit):**\n"
        f"- BTC: {btc_current:,.0f} KRW {btc_emoji} {btc_change_pct:+.2f}%\n\n"
        "Have a great day! 🚀 "
    )

    await bot.send_message(chat_id=CHAT_ID, text=message, parse_mode='Markdown')

if __name__ == "__main__":
    asyncio.run(send_report())

 

이렇게 텔레그램으로 받을 수 있다. 이제부터는 창의력 / 생산력 싸움이라는 생각이 든다. 이런 걸 해보질 않아서 일단 다른 사람들의 자동화 시스템을 엿보려고 한다.

 

8. Gemini API 키 연동

- 위 파이선 스크립트를 crontab으로 스케쥴링을 하면 매 시간마다 무료 API를 통해서 정보를 알려줄 수 있는데, AI의 요약을 통한 자동화는 유료 API가 필요하다. (이 말이 맞는지 모르겠다)

- 마침 Gemini를 구독하고 있고 갓구글선생님께서 일정 금액을 무료로 지원하고 있다.

- Google AI Studio에서 API키를 OpenClaw에서 실행할 python3에 넣으면 OpenClaw가 Gemini에게 일을 시키고 이 결과값을 텔레그램으로 던져줄 수 있다.

 

9. Gemini에게 1000개의 경제 단어를 무작위로 선정한 후, 뜻과 선정한 단어가 포함된 기사의 문장과 사용 예문 그리고 각 문장의 한국어 해설을 던져달라고 했다.

import asyncio
from telegram import Bot
from google import genai

# 1. 설정
TOKEN = "BotFather 토큰"
CHAT_ID = "생성한 Bot Pairing Code"
GEMINI_API_KEY = "Gemini API Key 값"

client = genai.Client(api_key=GEMINI_API_KEY)

async def send_gemini_report():
    bot = Bot(token=TOKEN)

    # Gemini에게 '금융 영단어 1000개 수준'의 전문가 역할을 부여
    prompt = """
    You are an expert in Business English and Financial Journalism. 
    Select ONE advanced vocabulary word from the 'Top 1000 Financial Terms' (e.g., Yield Curve, Arbitrage, Quantitative Easing, Insolvency, etc.).
    
    [Instructions]
    1. Do NOT use introductory remarks.
    2. Provide a realistic sentence that would appear in a 'Wall Street Journal' or 'CNBC' article using that word.
    3. Ensure the Korean translation is natural and fits the financial context.

    [Output Format]
    🔤  **Word**: [Selected Word]
    📝  **Meaning**: [Korean Meaning]
    
    🏛️  **In the News**: 
    "[Provide a realistic news sentence using the word]"
    ([금융 문맥에 맞는 자연스러운 한국어 번역])
    
    ✍️  **Usage Example**: 
    "[Another formal usage example]"
    ([자연스러운 한국어 번역])
    """

    try:
        response = client.models.generate_content(
            model="gemini-2.0-flash",
            contents=prompt
        )
        ai_content = response.text.strip()

        final_text = (
            "✨  **Daily High-Level Finance English** ✨ \n\n"
            f"{ai_content}\n\n"
        )

        await bot.send_message(chat_id=CHAT_ID, text=final_text, parse_mode='Markdown')
        print("리포트 전송 완료")
    except Exception as e:
        print(f"에러 발생: {e}")

if __name__ == "__main__":
    asyncio.run(send_gemini_report())

 

 

 

10. 이렇게 만들어서 crontab -e에서 아래와 같이 스케쥴링하면 원하는 시간에 텔레그램으로 받을 수 있다.

보니까 자동으로 네이버에서 구매를 한다던지, 텔레그램으로 받은 내용을 노션에 재정리하던지 사용법은 무궁무진했다. 

 

OpenClaw에게 권한을 부여하는 만큼 편리하지만, 그만큼 보안 위험도 크다고 들었다. OpenClaw는 스킬이라는 것도 제공하는데, 스킬을 설치할 때, 보안에 대한 이슈는 없는지 확인은 꼭 해봐야겠다.