2026年3月25日 星期三

樹莓派Tailscale設定,免費內網穿透VPN

Tailscale是一款開源的虛擬區域網路(virtual LAN)軟體,可將多個裝置組成虛擬內網,互相連線,存取共享資源。

舉例來說,你可以用Tailscale連線到自架的Rustdesk遠端桌面,或是SSH遠端登入主機。過程只需要透過一組虛擬區域IP遠端連線,再也不需要port forwarding,將機器暴露到公網了。
因此就利用這個工具架設在樹莓派中, 從任何地方來控制樹莓派!

使用前需要到Tailscale公司的網站註冊一個帳號。Tailscale有免費版與付費版方案。免費版方案最多加入100個裝置,最多邀請3名帳號加入自己的網路。

你的使用者帳號會有自己的虛擬區網,稱之為「Tailnet」。你會將所有的裝置都加入進去,形成一個虛擬區網。原理圖如下:

# 樹莓派安裝:
curl -fsSL https://tailscale.com/install.sh | sh
# 安裝後設定開機自動啟用Tailscale服務:
sudo systemctl enable --now tailscaled
# 檢查服務狀態
sudo systemctl status tailscaled
sudo tailscale up
# Windows安裝
Tailscale支援Windows 10以上系統。至官網下載exe安裝。

安裝完後
兩個裝置都登入同個帳號把裝置加進去!

可透過SSH操作:
FTP運行:
VNC連線:




利用telegram來控制 crontab 任務的啟動或關閉

既然用了telegram bot就想說用這個tool來控制系統中的crontab任務列表
先查看crontab -l
再利用crontab -e

再透過 python code:
import logging
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Application, CommandHandler, CallbackQueryHandler, ContextTypes
from crontab import CronTab

# --- 設定區 ---
TOKEN = 'your bot token'
USER_ID = your chat id 不是字串

# 初始化日誌
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', level=logging.INFO)

def get_cron_keyboard():
    cron = CronTab(user=True)
    keyboard = []
   
    for index, job in enumerate(cron):
        status_icon = "🟢 啟用中" if job.is_enabled() else "🔴 已暫停"
       
        # --- 自定義名稱邏輯 ---
        cmd = job.command
        if "email_notify_v2.py" in cmd:
            display_name = "任務通知 V2"
        elif "email_notify.py" in cmd:
            display_name = "任務通知 V1"
        else:
            # 如果不是以上兩個,就顯示指令的前 20 個字
            display_name = cmd.split('/')[-1][:20]
        # ---------------------

        label = f"{status_icon} | {display_name}"
        keyboard.append([InlineKeyboardButton(label, callback_data=str(index))])
   
    return InlineKeyboardMarkup(keyboard) if keyboard else None

async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """驗證身分並列出所有任務清單"""
    if update.effective_user.id != USER_ID:
        return
   
    markup = get_cron_keyboard()
    if markup:
        await update.message.reply_text("📋 **當前系統排程清單**\n點擊按鈕即可切換 啟動/暫停:",
                                      reply_markup=markup, parse_mode='Markdown')
    else:
        await update.message.reply_text("目前系統中沒有任何 Crontab 任務。")

async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """處理按鈕點擊:切換任務狀態"""
    query = update.callback_query
    if query.from_user.id != USER_ID:
        await query.answer("權限不足")
        return

    await query.answer()
    job_index = int(query.data)
   
    # 重新讀取並操作
    cron = CronTab(user=True)
    try:
        job = cron[job_index]
        # 切換開關
        job.enable(not job.is_enabled())
        # 寫回系統
        cron.write()
       
        # 更新訊息與按鈕狀態
        await query.edit_message_text(
            text="✅ **狀態已更新**\n點擊下方按鈕繼續管理:",
            reply_markup=get_cron_keyboard(),
            parse_mode='Markdown'
        )
    except IndexError:
        await query.edit_message_text("❌ 找不到該任務,可能已被手動刪除。")

if __name__ == '__main__':
    app = Application.builder().token(TOKEN).build()
   
    app.add_handler(CommandHandler("start", start))
    app.add_handler(CallbackQueryHandler(button_callback))
   
    print("Bot 啟動中... 請在 Telegram 輸入 /start")
    app.run_polling()

運作情形

這樣控制定時任務就方便了!!!

樹莓派Pi5與openclaw的另類定時任務 不用浪費API token

在我的系統中openclaw設定三個agent, 個別用了以下的模型如下圖

連動各別的telegram bot如下三張圖

但是發現若是在openclaw中設定 manager 跟engineer的定時任務會一直浪費 API token
若是設定在local agent 本機模型ollama中, 運行時又會把cpu資料耗掉吃得滿百100%如下圖
所以就想說 不再openclaw agent上設定cron定時任務, 改放在樹莓派系統本身的例行性工作排程crontab中, 這樣不會用到API token也不用ollama模型觸發而且openclaw main agent 也管控得到
crontab 這個指令所設定的工作將會循環的一直進行下去! 可循環的時間為分鐘、小時、每週、每月或每年等. 用法網路上很多教學可參考!



我的定時任務是檢查系統是否有reboot重啟, 若有則發送email 跟 telegram 的訊息!!
每 30 分鐘執行一次命令:
/usr/bin/python3 /home/pi/.openclaw/workspace/skills/my-skill/email_notify.py
執行結果會寫入日誌:/home/pi/.openclaw/workspace-local/logs/email_notify.log

2026年3月6日 星期五

Raspberry Pi5 安裝本機模型 ollama 的速度測試

本機模型 ollama
1. 安裝 curl -fsSL https://ollama.com/install.sh | sh
輸入 ollama --version 確認安裝成功
ollama version is 0.17.4

2. 確認 Ollama 正在運行
curl http://localhost:11434
# 應該會回傳 "Ollama is running"
如果沒有回應,代表 Ollama 服務尚未啟動
執行 systemctl start ollama

3. 下載 qwen2.5:1.5b 模型(選擇適合自己的模型)
ollama pull qwen2.5:1.5b

4. 直接用它聊天測試
ollama run qwen2.5:1.5b

看起來, 速度還不錯
接下來 配置到 openclaw 小龍蝦去!!!