# yaml-language-server: $schema=https://schema.zeabur.app/template.json
apiVersion: zeabur.com/v1
kind: Template
metadata:
    name: "OpenClaw \U0001F99E"
spec:
    description: "OpenClaw \U0001F99E (formerly Clawdbot, Moltbot) is a personal AI assistant that runs locally and connects to multiple messaging platforms (WhatsApp, Telegram, Slack, Discord, etc.) via a WebSocket-based Gateway architecture.\n"
    coverImage: https://raw.githubusercontent.com/openclaw/openclaw/main/docs/assets/openclaw-logo-text.png
    icon: https://raw.githubusercontent.com/openclaw/openclaw/main/docs/assets/pixel-lobster.svg
    variables:
        - key: PUBLIC_DOMAIN
          type: DOMAIN
          name: Domain
          description: What domain do you want to bind openclaw to?
        - key: ZEABUR_AI_HUB_API_KEY
          type: AI_HUB_KEY
          name: Zeabur AI Hub API Key (Recommended)
          description: Your Zeabur AI Hub API key for using Gemini/GPT/Claude/DeepSeek via AI Hub (optional, can be configured later)
    tags:
        - AI
        - Assistant
        - Chatbot
        - WhatsApp
        - Telegram
        - Slack
        - Discord
    readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E (formerly Clawdbot, Moltbot) is a personal AI assistant that runs locally and connects to multiple messaging platforms via a WebSocket-based Gateway architecture.\n\n⚠️ This template uses `ghcr.io/openclaw/openclaw:2026.3.2`. OpenClaw \U0001F99E is in rapid development, so there may be undiscovered bugs. Changing versions may also cause stability issues.\n\n⚠️ If you encounter any issues, feel free to check the [GitHub issues](https://github.com/openclaw/openclaw/issues) for solutions or to report new ones. For Zeabur platform-related issues, please contact Zeabur support.\n\n⚠️ macOS-specific software and packages (e.g. Homebrew) are not supported in this container environment. Please look for alternative solutions.\n\n⚠️ This template requires a [Dedicated Server](https://zeabur.com/docs/dedicated-server) on Zeabur. It cannot run on shared clusters.\n\n⚠️ This template is pre-configured and ready to use - no need to run `openclaw onboard`. If you want to reconfigure, open **Command** in Zeabur dashboard and run:\n```bash\nopenclaw onboard --gateway-bind lan\n```\nSee the [Wizard Reference](https://docs.openclaw.ai/reference/wizard) for all available flags.\n\n---\n\n## Recommended Resources\n- **Minimum**: 2 vCPU / 4 GB RAM\n- **Recommended**: 4 vCPU / 8 GB RAM\n\n## Feature Extensions\n- **Browser**: If you need browser features (web browsing, screenshots, etc.), deploy the [Browser Template](https://zeabur.com/templates/H8L4G1)\n- **Devbox**: If you need multi-language code execution (Python, Go, Rust, C/C++), deploy the [Devbox Template](https://zeabur.com/templates/ZBVZNH) to the same project\n\n## Usage\n1. After deployment, copy \"Web UI (with token)\" URL from the **Instructions** tab and paste it into your browser\n2. **Configure AI model** (choose one):\n   - **Zeabur AI Hub** (default model: `glm-4.7-flash`): If you entered the API Key during deployment, go directly to step 3. You can also add `ZEABUR_AI_HUB_API_KEY` later via **Variables** tab in Zeabur dashboard (restart service after adding).\n   - **Other providers** (Anthropic, OpenAI, etc.): If you did not enter a Zeabur AI Hub API Key, the default model is `anthropic/claude-opus-4-6`. Go to Web UI Settings or add API key via environment variables. See: https://docs.openclaw.ai/providers/anthropic\n3. Go to the **Chat** page to test if your AI model is working\n4. (Optional) Set up messaging platforms like Telegram, WhatsApp, etc.\n\nFor AI model configuration, see the [official documentation](https://docs.openclaw.ai/providers).\n\n### Model Switching & Failover\nThis template includes failover models that automatically switch when the primary model is unavailable. Default chain: `glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`.\n\nYou can manage models from **Web UI Chat** or **Command** in the Zeabur dashboard.\n\n**Via Web UI Chat** — type slash commands directly in the chat box:\n- `/model zeabur-ai/glm-4.7-flash` — change primary model\n- `/model` — view current model\n- `/models` — list model providers\n- `/models <provider>` — list models for a specific provider (e.g. `/models zeabur-ai`)\n\n**Via Command** (Zeabur dashboard) — same commands in the terminal:\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**Or edit the config file directly** (`~/.openclaw/config.json5`):\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\nAfter editing the config file, restart the service.\n\n### Adding External Model Providers\nBesides Zeabur AI Hub, you can add external providers like Anthropic, OpenAI, Google, etc.\n\n**Method 1: Environment variables** — add API keys via **Variables** tab in Zeabur dashboard:\n- `ANTHROPIC_API_KEY` — for Claude models\n- `OPENAI_API_KEY` — for GPT models\n- `GOOGLE_API_KEY` — for Gemini models\n\nAfter adding, restart the service, then switch model:\n- Web UI Chat: `/model anthropic/claude-opus-4-6`\n- Command: `openclaw models set anthropic/claude-opus-4-6`\n\n**Method 2: Auth token** — open **Command** in Zeabur dashboard:\n```bash\n# Paste an API key for a provider\nopenclaw models auth paste-token --provider anthropic\n\n# Or use interactive auth helper\nopenclaw models auth add\n```\n\n**Method 3: Config file** — edit `~/.openclaw/config.json5`:\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\nFor all supported providers, see the [official documentation](https://docs.openclaw.ai/providers).\n\n## Telegram Bot Setup\n**Getting your bot token from BotFather:**\n1. Open Telegram and search for [@BotFather](https://t.me/BotFather)\n2. Send `/newbot` to create a new bot\n3. Follow the prompts to set a name and username for your bot\n4. BotFather will send you a token (e.g., `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`)\n\n**Adding the token to Zeabur:**\n1. Go to your service's **Environment Variables** tab in Zeabur dashboard\n2. Add `TELEGRAM_BOT_TOKEN` with your bot token\n3. Restart the service\n4. The Telegram plugin will be auto-enabled on restart. If the bot does not start, go to **Settings → Config** and verify the plugin is enabled: `\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`. To disable, set `enabled` to `false`.\n\n**Pairing your Telegram account:**\n1. Send `/start` to your bot in Telegram\n2. The bot will reply with a pairing code (e.g., `JN4MSY23`)\n3. Approve the pairing using one of these methods:\n   - **Web Chat**: In the OpenClaw web interface chat box, type `openclaw pairing approve telegram <code>`\n   - **Terminal**: Open **Command** in Zeabur dashboard, run `openclaw pairing approve telegram <code>`\n4. You'll see: `Approved telegram sender <user-id>.`\n5. Now you can chat with the bot!\n\n## WhatsApp Setup\n**Step 1: Configure WhatsApp channel**\nAdd the following configuration via OpenClaw Web UI (Settings → Config) or paste it to chat:\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\nReplace `+15551234567` with your WhatsApp phone number (with country code). Restart the service after saving.\n\n**Step 2: Link WhatsApp**\n1. Open **Command** in Zeabur dashboard to access the container terminal\n2. Run: `openclaw channels login`\n3. A QR code will appear - scan it with WhatsApp on your phone\n4. Connection complete! You can now message yourself on WhatsApp to chat with OpenClaw\n\n## LINE Bot Setup\n**Creating a LINE Messaging API channel:**\n1. Create a [LINE Official Account](https://entry.line.biz/) if you don't have one\n2. Go to [LINE Developers Console](https://developers.line.biz/console/)\n3. Create or select a **Provider**\n4. Create a new **Messaging API** channel and link it to your LINE Official Account\n4. In the **Messaging API** tab, issue a **Channel access token** (long-lived)\n5. In the **Basic settings** tab, copy the **Channel secret**\n\n**Adding credentials to Zeabur:**\n1. Go to your service's **Environment Variables** tab in Zeabur dashboard\n2. Add `LINE_CHANNEL_ACCESS_TOKEN` with your channel access token\n3. Add `LINE_CHANNEL_SECRET` with your channel secret\n4. Restart the service\n5. The LINE plugin will be auto-enabled on restart. If the bot does not start, go to **Settings → Config** and verify the plugin is enabled: `\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**Setting up the webhook:**\n1. After restarting, your webhook URL is: `https://<your-domain>/line/webhook`\n2. In [LINE Developers Console](https://developers.line.biz/console/), go to your channel's **Messaging API** tab\n3. Set **Webhook URL** to `https://<your-domain>/line/webhook`\n4. Enable **Use webhook**\n5. (Recommended) Disable **Auto-reply messages** and **Greeting messages** in the LINE Official Account Manager\n\n**Pairing your LINE account:**\n1. Add your bot as a friend on LINE and send any message\n2. The bot will reply with a pairing code (e.g., `JN4MSY23`)\n3. Approve the pairing using one of these methods:\n   - **Web Chat**: In the OpenClaw web interface chat box, type `openclaw pairing approve line <code>`\n   - **Terminal**: Open **Command** in Zeabur dashboard, run `openclaw pairing approve line <code>`\n4. You'll see: `Approved line sender <user-id>.`\n5. Now you can chat with the bot on LINE!\n\nFor other messaging platforms (Discord, Slack, etc.), see the [Channels documentation](https://docs.openclaw.ai/channels).\n\n## AI Model Configuration\n\n**Verify your setup:**\n1. Your default model depends on deployment:\n   - With Zeabur AI Hub API Key → default model: `zeabur-ai/glm-4.7-flash`\n   - Without → default model: `anthropic/claude-opus-4-6` (requires API key)\n2. Open **Chat** page and send a test message\n3. If you get a response → model is working\n4. If you get an error → check that your API key is configured correctly\n\n**Switch model for current conversation** (via chat commands):\n- `/models` - View available models\n- `/model <model-id>` - Switch model for this conversation only (does not affect other conversations)\n\n**Change default model for all new conversations** (via Web UI Settings):\n- Go to Settings → Agents → Default model\n- **Tip:** Set a low-cost model as default (e.g., `gemini-2.5-flash-lite`, `gpt-5-nano`). If a model becomes unavailable, use `/new` to start a new conversation with the default model.\n\n**Add AI providers** (via Web UI Settings or environment variables):\n- Add API keys for other AI providers (e.g., Anthropic, OpenAI)\n- See: https://docs.openclaw.ai/providers\n\n**Modify Zeabur AI Hub models** (via Zeabur dashboard):\n- Go to **Settings** → **Configs** → Edit `/opt/openclaw/providers/zeabur-ai-hub.json5`, then restart the service (changes are synced on startup)\n- Older versions (without commands): Edit `/home/node/.openclaw/openclaw.json` via **Files** tab or Web UI Settings. Add the following to `models.providers.zeabur-ai.models` array:\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Security Note\nThe Web UI is a management tool for configuration, monitoring, and chat — messaging platforms (Telegram, WhatsApp, Discord, etc.) work independently without it. If you only use platforms that don't need inbound webhooks (Telegram, WhatsApp, Discord, Signal, iMessage), you can remove the domain binding in the Zeabur dashboard (**Networking** tab) to avoid exposing the gateway to the public internet. All management tasks can also be done via CLI in the Zeabur **Command** terminal (`openclaw config set`, `openclaw models set`, etc.). For private Web UI access without a public domain, see [Tailscale Private Network Access](#tailscale-private-network-access-optional). You can also set `OPENCLAW_GATEWAY_BIND` to `loopback` in the **Variables** tab (restart the service after) to restrict the gateway to local connections only.\n\nPlatforms that **require** a public domain (inbound webhook): LINE, Slack, Google Chat.\n\n## Data Persistence\nAll data is stored under `/home/node`:\n- `/home/node/.openclaw` - Configuration, sessions, devices, and credentials\n- `/home/node/.openclaw/workspace` - Workspace and memory files\n\n## Backup & Restore\n\U0001F4A1 **Tip:** We recommend creating a backup after completing your initial setup or making significant configuration changes.\n\n**Backup:**\n- **Method 1: Zeabur Backup Service (Recommended)** - Use Zeabur's built-in backup feature. See [Zeabur Backup Documentation](https://zeabur.com/docs/data-management/backup).\n- **Method 2: Manual Backup** - Open **Command** → Run `backup` → Download from `/home/node` in **Files** tab (e.g. `backup-1430.tar.gz`)\n  - Older versions (without commands): `cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**Restore:**\n1. Upload backup file to `/home/node` folder in **Files** tab\n2. Open **Command** and run:\n   - From Zeabur Backup Service: `restore <backup-file> --strip 2` (e.g. `restore data-2026-02-27.zip --strip 2`)\n   - From Manual Backup: `restore <backup-file>` (e.g. `restore backup-1430.tar.gz`)\n   - Older versions (without commands): `cd /home/node && tar -xzvf <backup-file>`\n3. Delete the uploaded backup file from `/home/node` in **Files** tab to free up disk space\n4. Restart service\n\n⚠️ Restore will overwrite existing configuration and data on the new service. Remember to also restore related environment variables (e.g. `TELEGRAM_BOT_TOKEN`). Channel backup/restore has only been tested with Telegram and WhatsApp.\n\n## Troubleshooting\n\n> Default startup command: `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### New deployments (with helper page)\nWhen the gateway stops, a helper page appears at the service URL with error details and steps to fix it:\n1. Check the **error logs** — the helper page shows recent logs inline; for complete logs, open the **Logs** tab in Zeabur Dashboard\n2. Fix the configuration — open the **Files** tab in Zeabur Dashboard, navigate to the config file (`/home/node/.openclaw/openclaw.json`), and correct the issue\n3. Click **Restart** in Zeabur Dashboard to apply the fix\n\n### Existing deployments (without helper page)\nIf your deployment does not have the helper page, follow these steps:\n1. Check the **Logs** tab in Zeabur Dashboard to find the error\n2. Go to **Settings** → **Command**, change the startup command to `sleep 3600`, then click **Restart** — this keeps the container running so you can edit files\n3. Fix the configuration — open the **Files** tab, navigate to the config file (`/home/node/.openclaw/openclaw.json`), and correct the issue\n4. Change the startup command back to `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` and click **Restart**\n\n> \U0001F4A1 To enable the helper page, redeploy from this template.\n\n### Updating OpenClaw Version\n1. Check the latest version at [OpenClaw releases](https://github.com/openclaw/openclaw/releases)\n2. In Zeabur Dashboard, go to **Settings** → **Service Image Source**\n3. Image: `ghcr.io/openclaw/openclaw`, Tag: change from the current version (e.g. `2026.2.26`) to the new version (e.g. `2026.3.2`)\n4. Click **Restart** to apply\n\n> ⚠️ Avoid using `latest` as the tag — it always pulls the newest release, which may introduce breaking changes or unexpected errors. Pin to a specific version for stability.\n5. Check the **Logs** tab to confirm the gateway started successfully\n\n> \U0001F4A1 The startup script automatically migrates your config on each boot — new settings (like `trustedProxies`, `dangerouslyDisableDeviceAuth`) are added if missing. Your existing settings are preserved.\n\n### \"device identity required\"\nThis means the Web UI has not been paired with a Gateway Token yet. Fix:\n- **Option 1:** In Zeabur Dashboard **Instructions** tab, copy the **Web UI (with Token)** URL and open it in your browser\n- **Option 2:** Open the Web UI **Overview** page and enter the Gateway Token there\n\nYou can find the Gateway Token in the Zeabur Dashboard **Instructions** tab or **Environment Variables** (`OPENCLAW_GATEWAY_TOKEN`).\n\n### \"disconnected (1008): pairing required\"\nThis means your device (browser/app) has not been paired with the gateway yet. To pair:\n1. Open the Web UI and complete the Gateway Token authentication (see above)\n2. Open **Command** in Zeabur dashboard to access the terminal, then run:\n   - `openclaw devices list` — view pending pairing requests and find the `requestId`\n   - `openclaw devices approve <requestId>` — approve the device\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\nThis error occurs after upgrading to image `2026.2.23` or later without updating the config. Fix: edit `/home/node/.openclaw/openclaw.json` and add `\"dangerouslyAllowHostHeaderOriginFallback\": true` under `gateway.controlUi`:\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\nThen restart the service. New deployments from this template already include this setting.\n\n## Tailscale Private Network Access (Optional)\n> ⚠️ This feature requires a fresh deployment from this template. Existing deployments do not have the Tailscale startup scripts — please redeploy to use this feature.\n\nInstead of a public domain, you can use [Tailscale](https://tailscale.com) to make OpenClaw accessible only within your private network (tailnet), without exposing it to the public internet.\n\n**Prerequisites:**\n- A Tailscale account (free plan works)\n- An Auth Key from [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) (recommended: Reusable + Ephemeral)\n\n**Step 1: Set environment variables**\nIn the Zeabur dashboard **Environment Variables** tab, add:\n- `TS_AUTHKEY` (required): Your Tailscale Auth Key (`tskey-auth-xxx`). Get one at [Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys). Without this, Tailscale setup is skipped entirely.\n- `TS_HOSTNAME` (optional): The machine name on your tailnet, which determines your access URL (`https://<TS_HOSTNAME>.<tailnet>.ts.net`). Defaults to `openclaw` if not set.\n\n**Step 2: Switch startup command**\nGo to **Settings** → **Command**, change to:\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\nRestart the service.\n\n**Step 3: Install Tailscale on your device**\nInstall [Tailscale](https://tailscale.com/download) on the device you want to access OpenClaw from (macOS, Windows, iOS, Android, Linux), and log in with the same Tailscale account used to create the Auth Key.\n\n**Step 4: First login to Web UI**\nOnce started, open in your browser (must be on the same tailnet):\n```\nhttps://<TS_HOSTNAME>.<your-tailnet>.ts.net\n```\nYou can find your tailnet DNS name at [Tailscale Admin Console → DNS](https://login.tailscale.com/admin/dns), or check the full URL in the service **Logs** on Zeabur dashboard.\n\nLog in using either method:\n- Append token to URL: `https://<TS_HOSTNAME>.<your-tailnet>.ts.net?token=<GATEWAY_TOKEN>`\n- Or enter the Gateway Token on the Web UI **Overview** page\n\nYou can find the Gateway Token in the Zeabur dashboard **Instructions** tab or **Environment Variables** (`OPENCLAW_GATEWAY_TOKEN`).\n\n**Step 5: Connect OpenClaw app (Optional, macOS example)**\n1. Install [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) and Tailscale on the same device\n2. Open OpenClaw app → **Settings → General** → select **Remote** mode\n3. Set Transport to **Direct (ws/wss)**\n4. Set Gateway URL to `wss://<TS_HOSTNAME>.<your-tailnet>.ts.net`\n5. First connection requires pairing approval — go to the Web UI **Nodes** page and click approve\n\nFor iOS and Android setup, see the [official documentation](https://docs.openclaw.ai/platforms).\n\n**Switch back to public domain mode:**\nChange the startup command back to `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` and restart.\n\n## Zeabur-Specific Configuration\nThis template pre-configures the following settings for Zeabur's cloud environment:\n\n- **`gateway.trustedProxies`**: Set to `[\"10.0.0.0/8\", \"172.16.0.0/12\"]` so the gateway correctly identifies client IPs behind Zeabur's reverse proxy. Without this, the Web UI may show \"device identity required\" errors.\n- **`dangerouslyDisableDeviceAuth`**: Disables Web UI device pairing (device pairing is designed for local networks; cloud deployments use Gateway Token authentication instead).\n- **`/usr/local/bin` symlinks**: The `openclaw`, `backup`, and `restore` commands are symlinked to `/usr/local/bin` so they work in Zeabur's **Command** terminal.\n- **`OPENCLAW_DISABLE_BONJOUR=1`**: Disables mDNS/Bonjour because Zeabur container hostnames can exceed the 63-byte DNS label limit. mDNS is only used for local network discovery and is not needed in cloud environments.\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**: Fixes Telegram connection issues in containerized environments (required for image versions `2026.2.17` and later).\n\n## Documentation\n- Documentation: https://docs.openclaw.ai\n- GitHub: https://github.com/openclaw/openclaw\n\n## Changelog\n**2026/3/4**\n- Upgrade image to `2026.3.2` — PDF tool, Ollama embeddings, Telegram streaming defaults to `partial`, container health endpoints (`/healthz`), OpenAI WebSocket-first transport, 200+ fixes and 20+ security hardening items across 3 releases (2026.3.1, 2026.3.2)\n- ⚠️ Breaking: plugins using `api.registerHttpHandler(...)` must migrate to `api.registerHttpRoute(...)`, Zalouser channel requires re-login (`openclaw channels login --channel zalouser`)\n\n**2026/3/2**\n- Add models: `claude-opus-4-6`, `minimax-m2.5`, `step-3.5-flash`\n- Replace models: `llama-3.3-70b` → `llama-3.1-8b`, `qwen-3-32` → `qwen-3-235b`\n- Fix API key rotation: changing `ZEABUR_AI_HUB_API_KEY` and restarting now takes effect (removed `envsubst`, runtime resolves `${VAR}` on startup)\n- Provider config synced from `/opt` on every startup — template model updates and Configs edits apply after restart\n- Add Security Note with `OPENCLAW_GATEWAY_BIND=loopback` guidance\n\n**2026/2/27**\n- Add `dangerouslyDisableDeviceAuth` — replace device pairing with Gateway Token authentication for cloud deployment\n- Default model: `zeabur-ai/glm-4.7-flash` with failover chain (grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini)\n- Add model switching, failover, and external provider documentation\n- Clean up environment variables (move defaults to startup script)\n- Auto-migrate existing configs (trustedProxies, auth settings)\n- Upgrade image to `2026.2.26` — Telegram DM allowlist inheritance fix, temp dir permissions fix for containers, CLI gateway `--force` in non-root Docker, Gemini model ID normalization, and additional security hardening\n\n**2026/2/26**\n- Upgrade image to `2026.2.25` — 100+ security fixes across 2026.2.23→2026.2.25, new providers (Kilo Gateway, Mistral, Volcano Engine), heartbeat `directPolicy` config, gateway WebSocket auth hardening, cross-channel routing isolation, Discord voice DAVE reliability, Telegram webhook hang fix, and numerous stability improvements\n\n**2026/2/24**\n- Upgrade image to `2026.2.23` — includes 30+ security fixes, new providers (Kilo Gateway, Mistral, Volcano Engine), unified channel streaming config, multilingual stop phrases, reasoning/thinking suppression across all channels, and numerous stability improvements\n- Add `dangerouslyAllowHostHeaderOriginFallback` to Control UI config — required for non-loopback deployments since 2026.2.23\n\n**2026/2/22**\n- Replace health check with auto-restart wrapper: gateway now restarts automatically on crash with a helper page showing error details and fix steps, with 5-second service recovery detection\n- Remove rescue mode (`rescue.sh`) — replaced by the helper page\n\n**2026/2/20**\n- Pin image tag to `2026.2.19` — add `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` env var to fix Telegram connection issues (required for image versions `2026.2.17` and later)\n\n**2026/2/16**\n- Switch image tag to `latest` to keep up with rapid security fixes\n\n**2026/2/15**\n- Add Tailscale private network access: users can switch to `start_gateway_tailscale.sh` for private HTTPS access via tailnet without exposing to public internet\n- Bump image to `2026.2.14`\n\n**2026/2/10**\n- Fix image gen skill: switch from `/v1/images/generations` to `/v1/chat/completions` API, default model to `gemini-2.5-flash-image`\n- Fix `gpt-oss-120b`, `llama-3.3-70b`, `qwen-3-32` HTTP 500: add `supportsStore: false` compat flag\n- Fix `gpt-oss-120b` reasoning flag (set to `true`)\n- Restore script now supports `.zip` format (Zeabur backup service)\n- Sync channel env vars (`TELEGRAM_BOT_TOKEN`, `DISCORD_BOT_TOKEN`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `LINE_CHANNEL_ACCESS_TOKEN`, `LINE_CHANNEL_SECRET`) into config at startup\n\n**2026/2/7**\n- Fix cron proactive notifications not delivered: auto-detect heartbeat target from configured channels at startup\n- Initialize HEARTBEAT.md with actionable content for new deployments (prevents heartbeat skip on empty file)\n\n**2026/2/4**\n- Use Zeabur configs for startup scripts (easier to maintain)\n- Add `backup` and `restore` global commands\n- Add auto-restart wrapper with fallback page for gateway crash recovery\n- Add 6 new Zeabur AI Hub models: gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Add store compatibility setting for Zeabur AI Hub Claude models\n\n**2026/2/2**\n- Add AI model configuration section (global vs conversation settings)\n- Add backup & restore section with Zeabur backup service\n- Add tip to backup after initial setup\n- Remove Google Gemini CLI patch (fixed upstream)\n- Remove ANTHROPIC_API_KEY and OPENAI_API_KEY from deployment variables to prevent OpenClaw from detecting empty API keys and failing (can be configured later via Web UI or environment variables)\n"
    resourceUsage:
        cpu: 2
        memory: 4096
    resourceRequirement:
        minConfig:
            cpu: 2
            ram: 4
        recommendedConfig:
            cpu: 4
            ram: 8
    services:
        - name: OpenClaw
          icon: https://raw.githubusercontent.com/openclaw/openclaw/main/docs/assets/pixel-lobster.svg
          template: PREBUILT
          spec:
            source:
                image: ghcr.io/openclaw/openclaw:2026.3.2
                command:
                    - /bin/sh
                    - -c
                    - /opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh
            ports:
                - id: web
                  port: 18789
                  type: HTTP
            volumes:
                - id: data
                  dir: /home/node
            instructions:
                - title: Web UI (with token)
                  content: ${ZEABUR_WEB_URL}?token=${OPENCLAW_GATEWAY_TOKEN}
                - title: Gateway Token
                  content: ${OPENCLAW_GATEWAY_TOKEN}
            env:
                HOME:
                    default: /home/node
                OPENCLAW_DISABLE_BONJOUR:
                    default: "1"
                OPENCLAW_GATEWAY_TOKEN:
                    default: ${PASSWORD}
                OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY:
                    default: "true"
                ZEABUR_AI_HUB_API_KEY:
                    default: ${ZEABUR_AI_HUB_API_KEY}
            configs:
                - path: /opt/openclaw/startup.sh
                  template: |
                    #!/bin/sh
                    set -e

                    echo "=== Setting up openclaw command ==="
                    WORKDIR="$(pwd)"
                    mkdir -p /home/node/bin
                    cat > /home/node/bin/openclaw << SCRIPT
                    #!/bin/sh
                    exec node ${WORKDIR}/dist/index.js "\$@"
                    SCRIPT
                    chmod +x /home/node/bin/openclaw
                    ln -sf /home/node/bin/openclaw /usr/local/bin/openclaw
                    ln -sf /opt/openclaw/backup.sh /home/node/bin/backup
                    ln -sf /opt/openclaw/restore.sh /home/node/bin/restore
                    ln -sf /home/node/bin/backup /usr/local/bin/backup
                    ln -sf /home/node/bin/restore /usr/local/bin/restore
                    export PATH="/home/node/bin:$PATH"
                    export NODE_ENV="${NODE_ENV:-production}"
                    export NODE_OPTIONS="${NODE_OPTIONS:---max-old-space-size=1024}"
                    echo "openclaw command ready at /home/node/bin/openclaw"

                    # Setup config directories
                    CONFIG_DIR="/home/node/.openclaw"
                    CONFIG_FILE="$CONFIG_DIR/openclaw.json"
                    PROVIDERS_DIR="$CONFIG_DIR/providers"
                    mkdir -p "$CONFIG_DIR" "$PROVIDERS_DIR"
                    chmod 700 "$CONFIG_DIR"

                    # Check if API key is a real value (not an unresolved template variable like '${ZEABUR_AI_HUB_API_KEY}')
                    HAS_AI_HUB_KEY=false
                    case "${ZEABUR_AI_HUB_API_KEY}" in '${'*'}') ;; '') ;; *) HAS_AI_HUB_KEY=true ;; esac

                    # Copy provider config from /opt (injected by Zeabur configs) on every start
                    # so template model-list updates and user Configs edits take effect
                    if [ "$HAS_AI_HUB_KEY" = true ] && [ -f /opt/openclaw/providers/zeabur-ai-hub.json5 ]; then
                      cp /opt/openclaw/providers/zeabur-ai-hub.json5 "$PROVIDERS_DIR/"
                      echo "Synced Zeabur AI Hub provider config from /opt"
                    fi

                    # Create initial config (only if not exists)
                    if [ ! -f "$CONFIG_FILE" ]; then
                      echo "Creating initial config..."
                      if [ "$HAS_AI_HUB_KEY" = true ]; then
                        cat > "$CONFIG_FILE" << 'EOF'
                    {
                      "gateway": { "trustedProxies": ["10.0.0.0/8", "172.16.0.0/12"], "controlUi": { "allowInsecureAuth": true, "dangerouslyAllowHostHeaderOriginFallback": true, "dangerouslyDisableDeviceAuth": true } },
                      "agents": { "defaults": { "model": { "primary": "zeabur-ai/glm-4.7-flash", "fallbacks": ["zeabur-ai/grok-4-fast-non-reasoning", "zeabur-ai/minimax-m2.5", "zeabur-ai/kimi-k2.5", "zeabur-ai/qwen-3-235b", "zeabur-ai/gpt-5-mini"] } } },
                      "models": {
                        "providers": { "$include": "./providers/zeabur-ai-hub.json5" }
                      }
                    }
                    EOF
                      else
                        cat > "$CONFIG_FILE" << 'EOF'
                    {
                      "gateway": { "trustedProxies": ["10.0.0.0/8", "172.16.0.0/12"], "controlUi": { "allowInsecureAuth": true, "dangerouslyAllowHostHeaderOriginFallback": true, "dangerouslyDisableDeviceAuth": true } }
                    }
                    EOF
                      fi
                      chmod 600 "$CONFIG_FILE"
                    else
                      echo "Config exists, checking for updates..."
                      # Add Zeabur AI Hub provider via $include if API key is set but provider not configured
                      if [ "$HAS_AI_HUB_KEY" = true ]; then
                        node -e "
                          const fs = require('fs');
                          const JSON5 = require('json5');
                          const configPath = '$CONFIG_FILE';

                          try {
                            const config = JSON5.parse(fs.readFileSync(configPath, 'utf8'));

                            // Check if zeabur-ai provider already exists (either directly or via \$include)
                            const hasZeaburAi = config.models?.providers?.['zeabur-ai'] ||
                              (config.models?.providers?.['\$include'] &&
                               String(config.models.providers['\$include']).includes('zeabur-ai'));

                            if (!hasZeaburAi) {
                              console.log('Adding Zeabur AI Hub provider via \$include...');

                              // Initialize models.providers if needed
                              if (!config.models) config.models = {};
                              if (!config.models.providers) config.models.providers = {};

                              // Add \$include reference
                              config.models.providers['\$include'] = './providers/zeabur-ai-hub.json5';

                              // Only set default model if user hasn't configured any model
                              if (!config.agents?.defaults?.model?.primary) {
                                if (!config.agents) config.agents = {};
                                if (!config.agents.defaults) config.agents.defaults = {};
                                config.agents.defaults.model = { primary: 'zeabur-ai/glm-4.7-flash', fallbacks: ['zeabur-ai/grok-4-fast-non-reasoning', 'zeabur-ai/minimax-m2.5', 'zeabur-ai/kimi-k2.5', 'zeabur-ai/qwen-3-235b', 'zeabur-ai/gpt-5-mini'] };
                                console.log('Default model set to zeabur-ai/glm-4.7-flash with fallbacks.');
                              } else {
                                console.log('Keeping existing default model: ' + config.agents.defaults.model.primary);
                              }

                              fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                              console.log('Zeabur AI Hub provider added.');
                            } else {
                              console.log('Zeabur AI Hub provider already configured.');
                            }
                          } catch (err) {
                            console.error('Warning: Failed to update config for Zeabur AI Hub:', err.message);
                            console.error('You may need to configure the provider manually via Web UI.');
                          }
                        "
                      fi

                      # Ensure gateway.trustedProxies is set for Zeabur reverse proxy
                      node -e "
                        const fs = require('fs');
                        const JSON5 = require('json5');
                        const configPath = '$CONFIG_FILE';
                        try {
                          const config = JSON5.parse(fs.readFileSync(configPath, 'utf8'));
                          if (!config.gateway) config.gateway = {};
                          let changed = false;
                          if (!config.gateway.trustedProxies) {
                            config.gateway.trustedProxies = ['10.0.0.0/8', '172.16.0.0/12'];
                            changed = true;
                            console.log('Added gateway.trustedProxies for Zeabur reverse proxy.');
                          }
                          if (!config.gateway.controlUi) config.gateway.controlUi = {};
                          if (!config.gateway.controlUi.dangerouslyDisableDeviceAuth) {
                            config.gateway.controlUi.dangerouslyDisableDeviceAuth = true;
                            changed = true;
                            console.log('Enabled dangerouslyDisableDeviceAuth for cloud deployment.');
                          }
                          if (!config.gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback) {
                            config.gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback = true;
                            changed = true;
                          }
                          if (!config.gateway.controlUi.allowInsecureAuth) {
                            config.gateway.controlUi.allowInsecureAuth = true;
                            changed = true;
                          }
                          if (changed) {
                            fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                            console.log('Gateway config updated.');
                          } else {
                            console.log('Gateway config already up to date.');
                          }
                        } catch (err) {
                          console.error('Warning: Failed to update gateway config:', err.message);
                        }
                      "
                      chmod 600 "$CONFIG_FILE" 2>/dev/null || true
                    fi

                    # Copy Zeabur image gen skill if API key is set
                    MANAGED_SKILLS_DIR="$CONFIG_DIR/skills"
                    if [ "$HAS_AI_HUB_KEY" = true ]; then
                      SKILL_DIR="$MANAGED_SKILLS_DIR/zeabur-image-gen"
                      if [ ! -d "$SKILL_DIR" ]; then
                        mkdir -p "$SKILL_DIR/scripts"
                        cp /opt/openclaw/skills/zeabur-image-gen/SKILL.md "$SKILL_DIR/"
                        cp /opt/openclaw/skills/zeabur-image-gen/scripts/generate_image.mjs "$SKILL_DIR/scripts/"
                        echo "Installed zeabur-image-gen skill"
                      fi
                    fi

                    # Sync channel env vars into config file so they're visible to config-based patches
                    if [ -f "$CONFIG_FILE" ]; then
                      node -e "
                        const fs = require('fs');
                        const JSON5 = require('json5');
                        const configPath = '$CONFIG_FILE';
                        const envMap = [
                          { env: 'TELEGRAM_BOT_TOKEN',        channel: 'telegram', key: 'botToken' },
                          { env: 'DISCORD_BOT_TOKEN',         channel: 'discord',  key: 'token' },
                          { env: 'SLACK_BOT_TOKEN',           channel: 'slack',    key: 'botToken' },
                          { env: 'SLACK_APP_TOKEN',           channel: 'slack',    key: 'appToken' },
                          { env: 'LINE_CHANNEL_ACCESS_TOKEN', channel: 'line',     key: 'channelAccessToken' },
                          { env: 'LINE_CHANNEL_SECRET',       channel: 'line',     key: 'channelSecret' },
                        ];
                        try {
                          const config = JSON5.parse(fs.readFileSync(configPath, 'utf8'));
                          let changed = false;
                          const enabledPlugins = new Set();
                          for (const { env, channel, key } of envMap) {
                            const val = process.env[env];
                            if (!val) continue;
                            if (!config.channels) config.channels = {};
                            if (!config.channels[channel]) config.channels[channel] = {};
                            if (config.channels[channel][key]) {
                              console.log(env + ': already set in config, skipping');
                            } else {
                              config.channels[channel][key] = val;
                              changed = true;
                              console.log(env + ' -> channels.' + channel + '.' + key);
                            }
                            enabledPlugins.add(channel);
                          }
                          // Auto-enable bundled channel plugins (they are disabled by default)
                          // Respect explicit enabled:false (user intentionally disabled the plugin)
                          for (const pluginId of enabledPlugins) {
                            if (!config.plugins) config.plugins = {};
                            if (!config.plugins.entries) config.plugins.entries = {};
                            const entry = config.plugins.entries[pluginId];
                            if (entry && entry.enabled === false) {
                              console.log('Plugin ' + pluginId + ': explicitly disabled, skipping');
                              continue;
                            }
                            if (!entry) config.plugins.entries[pluginId] = {};
                            if (config.plugins.entries[pluginId].enabled !== true) {
                              config.plugins.entries[pluginId].enabled = true;
                              changed = true;
                              console.log('Auto-enabled plugin: ' + pluginId);
                            }
                          }
                          if (changed) {
                            fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                            console.log('Channel config updated from env vars');
                          }
                        } catch (err) {
                          console.error('Warning: Failed to sync env vars to config:', err.message);
                        }
                      "
                    fi

                    # Patch heartbeat config: auto-detect channel and set explicit delivery target
                    # This fixes cron proactive notifications which require a resolved delivery target.
                    # Without this, heartbeat defaults to target:"last" which resolves to "none" if
                    # no one has messaged the bot yet.
                    if [ -f "$CONFIG_FILE" ]; then
                      node -e "
                        const fs = require('fs');
                        const JSON5 = require('json5');
                        const configPath = '$CONFIG_FILE';
                        try {
                          const config = JSON5.parse(fs.readFileSync(configPath, 'utf8'));
                          const channels = config.channels || {};
                          const heartbeat = config.agents?.defaults?.heartbeat;

                          // Skip if user already configured heartbeat target explicitly
                          if (heartbeat?.target && heartbeat.target !== 'last') {
                            console.log('Heartbeat target already set to: ' + heartbeat.target);
                          } else {
                            // Auto-detect first configured channel as heartbeat target
                            const channelPriority = ['telegram', 'whatsapp', 'discord', 'slack', 'line'];
                            let detected = null;
                            for (const ch of channelPriority) {
                              const chCfg = channels[ch];
                              if (chCfg && (chCfg.enabled !== false)) {
                                // Check channel has credentials configured
                                if (ch === 'telegram' && chCfg.botToken) { detected = ch; break; }
                                if (ch === 'whatsapp' && (chCfg.phoneNumberId || chCfg.enabled)) { detected = ch; break; }
                                if (ch === 'discord' && chCfg.token) { detected = ch; break; }
                                if (ch === 'slack' && chCfg.botToken) { detected = ch; break; }
                                if (ch === 'line' && chCfg.channelAccessToken) { detected = ch; break; }
                              }
                            }
                            if (detected) {
                              if (!config.agents) config.agents = {};
                              if (!config.agents.defaults) config.agents.defaults = {};
                              config.agents.defaults.heartbeat = {
                                ...(config.agents.defaults.heartbeat || {}),
                                target: detected,
                              };
                              fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                              console.log('Heartbeat target auto-set to: ' + detected);
                            } else {
                              console.log('No channel detected, heartbeat target unchanged (last)');
                            }
                          }
                        } catch (err) {
                          console.error('Warning: Failed to patch heartbeat config:', err.message);
                        }
                      "
                    fi

                    # Initialize workspace
                    OPENCLAW_WORKSPACE_DIR="${OPENCLAW_WORKSPACE_DIR:-/home/node/.openclaw/workspace}"
                    mkdir -p "${OPENCLAW_WORKSPACE_DIR}"
                    if [ ! -f "${OPENCLAW_WORKSPACE_DIR}/MEMORY.md" ]; then
                      echo "# Memory" > "${OPENCLAW_WORKSPACE_DIR}/MEMORY.md"
                    fi

                    # Ensure HEARTBEAT.md has actionable content for cron notifications.
                    # OpenClaw skips heartbeat when HEARTBEAT.md is effectively empty (only
                    # comments/headers), which silently blocks cron-triggered notifications.
                    # Only write for NEW workspaces to avoid overwriting existing user config.
                    HEARTBEAT_FILE="${OPENCLAW_WORKSPACE_DIR}/HEARTBEAT.md"
                    if [ ! -f "$HEARTBEAT_FILE" ]; then
                      printf '%s\n' '# HEARTBEAT.md' '' 'Check for pending notifications, cron job results, and system events.' 'If nothing needs attention, reply HEARTBEAT_OK.' > "$HEARTBEAT_FILE"
                      echo "HEARTBEAT.md initialized with actionable content"
                    fi
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/start_gateway.sh
                  template: |
                    #!/bin/sh
                    GATEWAY_LOG="/tmp/openclaw-gateway.log"
                    PORT="${OPENCLAW_GATEWAY_PORT:-18789}"

                    while true; do
                      echo "=== Starting OpenClaw Gateway ==="
                      node dist/index.js gateway --allow-unconfigured --bind "${OPENCLAW_GATEWAY_BIND:-lan}" --port "$PORT" --token "${OPENCLAW_GATEWAY_TOKEN}" 2>&1 | tee "$GATEWAY_LOG"
                      EXIT_CODE=$?
                      echo "=== Gateway exited (code: $EXIT_CODE), restarting in 1h... ==="

                      # Start fallback page on the same port
                      node /opt/openclaw/fallback.js "$PORT" "$EXIT_CODE" "$GATEWAY_LOG" &
                      FALLBACK_PID=$!

                      sleep 3600
                      kill $FALLBACK_PID 2>/dev/null
                      wait $FALLBACK_PID 2>/dev/null
                    done
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/fallback.html
                  template: "<!DOCTYPE html>\n<html lang=\"en\" class=\"dark\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta http-equiv=\"refresh\" content=\"60\">\n  <title>OpenClaw \U0001F99E Unavailable — Zeabur</title>\n  <link href=\"https://fonts.googleapis.com/css2?family=Albert+Sans:wght@400;500;600;700&family=Inter:wght@400;500&display=swap\" rel=\"stylesheet\">\n  <style>\n    :root{\n      --bg:#0F0E11;--surface:#19181B;--surface-hover:#212023;\n      --border:#322F37;--border-light:#3F3C44;\n      --text:#fff;--text-secondary:#B7B4BB;--text-tertiary:#7E7A85;--text-muted:#4C4851;\n      --violet:#6300FF;--violet-hover:#501ECB;--violet-subtle:rgba(99,0,255,.08);\n      --orange:#EE430E;--orange-subtle:rgba(238,67,14,.1);--orange-border:rgba(238,67,14,.2);\n      --success:#22D180;\n      --radius-lg:12px;--radius-xl:16px;\n    }\n    *{margin:0;padding:0;box-sizing:border-box}\n    body{font-family:'Albert Sans','Inter',sans-serif;background:var(--bg);color:var(--text-secondary);min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:1.5rem}\n\n    .page{max-width:480px;width:100%;text-align:center}\n\n    /* Zeabur logo */\n    .logo{margin-bottom:2rem;display:flex;justify-content:center}\n    .logo svg{height:28px;color:var(--text)}\n\n    /* Hero section */\n    .status-dot{display:inline-block;width:10px;height:10px;background:var(--orange);border-radius:50%;margin-right:8px;vertical-align:middle;position:relative}\n    .status-dot::after{content:'';position:absolute;inset:-3px;border-radius:50%;border:2px solid rgba(238,67,14,.3);animation:pulse-ring 2s ease-out infinite}\n    @keyframes pulse-ring{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(1.6)}}\n\n    h1{font-size:1.5rem;font-weight:700;color:var(--text);letter-spacing:-.02em;line-height:1.3;margin-bottom:.75rem}\n    .desc{font-size:.9375rem;line-height:1.6;color:var(--text-tertiary);margin-bottom:2rem;max-width:400px;margin-left:auto;margin-right:auto}\n\n    /* Steps card */\n    .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-xl);overflow:hidden;text-align:left;margin-bottom:1.5rem}\n    .card-header{padding:.875rem 1rem;border-bottom:1px solid var(--border);font-size:.8125rem;font-weight:600;color:var(--text);display:flex;align-items:center;gap:.5rem}\n    .card-header svg{width:16px;height:16px;color:var(--text-tertiary)}\n    .step{padding:.875rem 1rem;display:flex;gap:.75rem;align-items:flex-start}\n    .step+.step{border-top:1px solid var(--border)}\n    .step-num{flex-shrink:0;width:20px;height:20px;display:flex;align-items:center;justify-content:center;background:var(--violet-subtle);color:var(--violet);font-size:.6875rem;font-weight:700;border-radius:6px;margin-top:1px}\n    .step-content{flex:1;font-size:.8125rem;line-height:1.5;color:var(--text-secondary)}\n    .step-content strong{color:var(--text);font-weight:600}\n    .step-content a{color:var(--violet);text-decoration:none}\n    .step-content a:hover{text-decoration:underline}\n    .step-content code{font-family:'Inter',monospace;background:rgba(255,255,255,.05);padding:.0625rem .375rem;border-radius:4px;font-size:.75rem;color:var(--text-tertiary)}\n\n    /* Log viewer */\n    .log-box{margin-top:.625rem;background:var(--bg);border:1px solid var(--border);border-radius:var(--radius-lg);padding:.75rem;max-height:240px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}\n    .log-box::-webkit-scrollbar{width:3px}\n    .log-box::-webkit-scrollbar-track{background:transparent}\n    .log-box::-webkit-scrollbar-thumb{background:var(--border);border-radius:2px}\n    .log-box pre{font-family:'Inter',monospace;font-size:.6875rem;line-height:1.7;color:var(--text-muted);white-space:pre-wrap;word-break:break-all}\n\n  </style>\n</head>\n<body>\n  <div class=\"page\">\n    <!-- Zeabur logo -->\n    <div class=\"logo\">\n      <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"31.229\" height=\"24.403\" viewBox=\"0 0 31.229 24.403\"><g transform=\"translate(-289.741 -131.96)\"><g transform=\"translate(289.741 131.96)\"><path d=\"M301.875,151.848h19.1v8.963H289.741v-8.963h8.779l12.087-6.477H289.741v-8.963h31.229v8.963Z\" transform=\"translate(-289.741 -136.408)\" fill=\"#fff\"/><rect width=\"20.761\" height=\"8.963\" fill=\"#6300ff\"/><rect width=\"18.999\" height=\"8.963\" transform=\"translate(12.231 15.44)\" fill=\"#f40\"/></g></g></svg>\n    </div>\n\n    <!-- Status indicator + heading -->\n    <h1><span class=\"status-dot\"></span>OpenClaw \U0001F99E Unavailable</h1>\n    <p class=\"desc\">Your OpenClaw service ran into a problem and stopped. This is a Zeabur helper page — it will disappear automatically once the service is running again.</p>\n\n    <!-- How to fix it -->\n    <div class=\"card\">\n      <div class=\"card-header\">\n        <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M16.403 12.652a3 3 0 0 0 0-5.304 3 3 0 0 0-3.75-3.751 3 3 0 0 0-5.305 0 3 3 0 0 0-3.751 3.75 3 3 0 0 0 0 5.305 3 3 0 0 0 3.75 3.751 3 3 0 0 0 5.305 0 3 3 0 0 0 3.751-3.75Zm-2.546-4.46a.75.75 0 0 0-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 1 0-1.06 1.061l2.5 2.5a.75.75 0 0 0 1.137-.089l4-5.5Z\" clip-rule=\"evenodd\"/></svg>\n        How to fix it\n      </div>\n      <div class=\"step\">\n        <div class=\"step-num\">1</div>\n        <div class=\"step-content\">\n          <strong>Check the error message</strong> &mdash; see what went wrong below. For complete logs, go to your Zeabur Dashboard and open the <strong>Logs</strong> tab.\n          <div class=\"log-box\"><pre>{{LOGS}}</pre></div>\n        </div>\n      </div>\n      <div class=\"step\">\n        <div class=\"step-num\">2</div>\n        <div class=\"step-content\"><strong>If config invalid, fix the configuration</strong> &mdash; open the <strong>Files</strong> tab in your dashboard, navigate to the config file (`/home/node/.openclaw/openclaw.json`), and correct the issue. Then click <strong>Restart</strong>.</div>\n      </div>\n    </div>\n  </div>\n  <script>\n    setInterval(function(){\n      fetch(location.href,{method:'HEAD'}).then(function(r){\n        if(r.status!==503) location.reload();\n      }).catch(function(){});\n    },5000);\n  </script>\n</body>\n</html>\n"
                  permission: 420
                  envsubst: false
                - path: /opt/openclaw/fallback.js
                  template: |
                    const http = require('http');
                    const fs = require('fs');

                    const port = parseInt(process.argv[2], 10) || 18789;
                    const exitCode = process.argv[3] || 'unknown';
                    const logFile = process.argv[4] || '/tmp/openclaw-gateway.log';

                    function getLastLines(filePath, n) {
                      try {
                        const data = fs.readFileSync(filePath, 'utf8');
                        const lines = data.split('\n');
                        return lines.slice(-n).join('\n');
                      } catch (e) {
                        return '(no logs available)';
                      }
                    }

                    function escapeHtml(str) {
                      return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                    }

                    let template;
                    try {
                      template = fs.readFileSync('/opt/openclaw/fallback.html', 'utf8');
                    } catch (e) {
                      template = '<html><body><h1>OpenClaw is restarting (exit code: {{EXIT_CODE}})</h1><pre>{{LOGS}}</pre></body></html>';
                    }

                    const server = http.createServer((req, res) => {
                      const logs = escapeHtml(getLastLines(logFile, 50));
                      const html = template
                        .replace(/\{\{EXIT_CODE\}\}/g, escapeHtml(String(exitCode)))
                        .replace(/\{\{LOGS\}\}/g, logs);
                      res.writeHead(503, { 'Content-Type': 'text/html; charset=utf-8' });
                      res.end(html);
                    });

                    server.listen(port, '0.0.0.0', () => {
                      console.log('Fallback page serving on port ' + port);
                    });
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/backup.sh
                  template: |
                    #!/bin/sh
                    set -e
                    cd /home/node
                    BACKUP_FILE="backup-$(date +%H%M).tar.gz"
                    echo "Creating backup..."
                    tar -czvf "$BACKUP_FILE" .openclaw
                    echo ""
                    echo "=== Backup Complete ==="
                    echo "File: /home/node/$BACKUP_FILE"
                    echo "Download it from Files tab in Zeabur dashboard"
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/restore.sh
                  template: |
                    #!/bin/sh
                    set -e
                    if [ -z "$1" ]; then
                      echo "Usage: restore <backup-file> [--strip N]"
                      echo ""
                      echo "Supports .tar.gz and .zip formats."
                      echo ""
                      echo "Examples:"
                      echo "  restore backup-1430.tar.gz"
                      echo "  restore backup-xxxxx.zip"
                      echo "  restore backup-xxxxx.tar.gz --strip 2  # For Zeabur backup service files"
                      exit 1
                    fi
                    cd /home/node
                    BACKUP_FILE="$1"
                    if [ ! -f "$BACKUP_FILE" ]; then
                      echo "Error: File not found: $BACKUP_FILE"
                      exit 1
                    fi
                    case "$BACKUP_FILE" in
                      *.zip)
                        echo "Restoring from $BACKUP_FILE (zip)..."
                        TMPDIR=$(mktemp -d)
                        unzip -o "$BACKUP_FILE" -d "$TMPDIR"
                        if [ -d "$TMPDIR/data/data" ]; then
                          cp -a "$TMPDIR/data/data/." /home/node/
                        elif [ -d "$TMPDIR/data" ]; then
                          cp -a "$TMPDIR/data/." /home/node/
                        else
                          cp -a "$TMPDIR/." /home/node/
                        fi
                        rm -rf "$TMPDIR"
                        ;;
                      *.tar.gz|*.tgz)
                        if [ "$2" = "--strip" ] && [ -n "$3" ]; then
                          echo "Restoring from $BACKUP_FILE (strip-components=$3)..."
                          tar -xzvf "$BACKUP_FILE" --strip-components="$3" -C /home/node
                        else
                          echo "Restoring from $BACKUP_FILE..."
                          tar -xzvf "$BACKUP_FILE"
                        fi
                        ;;
                      *)
                        echo "Error: Unsupported format. Use .tar.gz or .zip"
                        exit 1
                        ;;
                    esac
                    echo ""
                    echo "=== Restore Complete ==="
                    echo "Please restart the service for changes to take effect."
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/setup-tailscale.sh
                  template: |
                    #!/bin/sh
                    set -e

                    # setup-tailscale.sh — Install and configure Tailscale for OpenClaw
                    # Enables HTTPS access via Tailscale + MagicDNS with OpenClaw's built-in
                    # Tailscale Serve integration (gateway --tailscale serve).
                    #
                    # This script only installs Tailscale and authenticates.
                    # OpenClaw gateway handles `tailscale serve` itself.
                    #
                    # Usage: sh /opt/openclaw/setup-tailscale.sh
                    # Safe to run multiple times (idempotent).
                    #
                    # Environment variables:
                    #   TS_AUTHKEY   (required)  Tailscale auth key. Script skips if unset.
                    #                            Get one at: https://login.tailscale.com/admin/settings/keys
                    #   TS_VERSION   (optional)  Tailscale version to install. Default: 1.82.5
                    #   TS_HOSTNAME  (optional)  Hostname on tailnet. Default: openclaw

                    echo "=== Tailscale Setup ==="

                    # --- Config variables ---
                    TS_VERSION="${TS_VERSION:-1.82.5}"
                    TS_HOSTNAME="${TS_HOSTNAME:-openclaw}"
                    BIN_DIR="$HOME/bin"
                    STATE_DIR="$HOME/.tailscale/state"
                    SOCK="$HOME/.tailscale/tailscaled.sock"
                    LOG="$HOME/.tailscale/tailscaled.log"

                    # --- 0. Check TS_AUTHKEY ---
                    if [ -z "$TS_AUTHKEY" ]; then
                      echo "TS_AUTHKEY not set — skipping Tailscale setup."
                      exit 0
                    fi

                    # --- 1. Detect architecture ---
                    ARCH="$(uname -m)"
                    case "$ARCH" in
                      x86_64)  TS_ARCH="amd64" ;;
                      aarch64) TS_ARCH="arm64" ;;
                      arm64)   TS_ARCH="arm64" ;;
                      *)
                        echo "Error: Unsupported architecture: $ARCH"
                        exit 1
                        ;;
                    esac
                    echo "Architecture: $ARCH ($TS_ARCH)"

                    # --- 2. Install Tailscale binaries ---
                    INSTALLED_VERSION=""
                    if [ -x "$BIN_DIR/tailscale" ]; then
                      INSTALLED_VERSION="$("$BIN_DIR/tailscale" version 2>/dev/null | head -1 || true)"
                    fi

                    if [ "$INSTALLED_VERSION" = "$TS_VERSION" ]; then
                      echo "Tailscale $TS_VERSION already installed."
                    else
                      echo "Installing Tailscale $TS_VERSION..."
                      TARBALL="tailscale_${TS_VERSION}_${TS_ARCH}.tgz"
                      URL="https://pkgs.tailscale.com/stable/${TARBALL}"
                      TMPDIR="$(mktemp -d)"

                      curl -fsSL "$URL" -o "$TMPDIR/$TARBALL"
                      tar -xzf "$TMPDIR/$TARBALL" -C "$TMPDIR"

                      mkdir -p "$BIN_DIR"
                      cp "$TMPDIR/tailscale_${TS_VERSION}_${TS_ARCH}/tailscale" "$BIN_DIR/tailscale"
                      cp "$TMPDIR/tailscale_${TS_VERSION}_${TS_ARCH}/tailscaled" "$BIN_DIR/tailscaled"
                      chmod +x "$BIN_DIR/tailscale" "$BIN_DIR/tailscaled"

                      rm -rf "$TMPDIR"
                      echo "Tailscale $TS_VERSION installed to $BIN_DIR"
                    fi

                    # --- 3. Start tailscaled ---
                    mkdir -p "$HOME/.tailscale/state"

                    # Check if tailscaled is already running
                    if [ -S "$SOCK" ] && "$BIN_DIR/tailscale" --socket="$SOCK" status >/dev/null 2>&1; then
                      echo "tailscaled already running."
                    else
                      echo "Starting tailscaled..."

                      # Kill any stale tailscaled process
                      if [ -f "$HOME/.tailscale/tailscaled.pid" ]; then
                        OLD_PID="$(cat "$HOME/.tailscale/tailscaled.pid")"
                        kill "$OLD_PID" 2>/dev/null || true
                        sleep 1
                      fi

                      # Remove stale socket
                      rm -f "$SOCK"

                      "$BIN_DIR/tailscaled" \
                        --tun=userspace-networking \
                        --statedir="$STATE_DIR" \
                        --socket="$SOCK" \
                        >"$LOG" 2>&1 &

                      TAILSCALED_PID=$!
                      echo "$TAILSCALED_PID" > "$HOME/.tailscale/tailscaled.pid"
                      echo "tailscaled started (PID $TAILSCALED_PID)"

                      # Wait for socket to be ready
                      echo "Waiting for tailscaled socket..."
                      WAIT=0
                      while [ ! -S "$SOCK" ]; do
                        sleep 1
                        WAIT=$((WAIT + 1))
                        if [ "$WAIT" -ge 30 ]; then
                          echo "Error: tailscaled socket not ready after 30s"
                          echo "Check logs: $LOG"
                          exit 1
                        fi
                      done
                      echo "tailscaled socket ready."
                    fi

                    # --- 4. Authenticate ---
                    BACKEND_STATE="$("$BIN_DIR/tailscale" --socket="$SOCK" status --json 2>/dev/null | node -e "
                      let d = '';
                      process.stdin.on('data', c => d += c);
                      process.stdin.on('end', () => {
                        try { console.log(JSON.parse(d).BackendState); }
                        catch(e) { console.log('Unknown'); }
                      });
                    " 2>/dev/null || echo "Unknown")"

                    if [ "$BACKEND_STATE" = "Running" ]; then
                      echo "Tailscale already authenticated."
                    else
                      echo "Authenticating with Tailscale..."
                      "$BIN_DIR/tailscale" --socket="$SOCK" up \
                        --authkey="$TS_AUTHKEY" \
                        --hostname="$TS_HOSTNAME"
                      echo "Tailscale authenticated."
                    fi

                    # --- 5. Print status ---
                    echo ""
                    echo "=== Tailscale Setup Complete ==="
                    "$BIN_DIR/tailscale" --socket="$SOCK" status || true
                    echo ""
                    echo "Tailscale state: $STATE_DIR"
                    echo "Daemon log:      $LOG"
                    echo "Socket:          $SOCK"
                    echo ""
                    echo "Gateway will start with Tailscale Serve (HTTPS)."
                    echo "Access OpenClaw at: https://${TS_HOSTNAME}.<your-tailnet>.ts.net"
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/start_gateway_tailscale.sh
                  template: |
                    #!/bin/sh
                    set -e

                    # Setup Tailscale (install + authenticate)
                    sh /opt/openclaw/setup-tailscale.sh

                    # Symlink socket to default path so tailscale CLI finds it
                    mkdir -p /var/run/tailscale
                    ln -sf "$HOME/.tailscale/tailscaled.sock" /var/run/tailscale/tailscaled.sock

                    set +e
                    GATEWAY_LOG="/tmp/openclaw-gateway.log"
                    PORT="18789"

                    while true; do
                      echo "=== Starting OpenClaw Gateway (Tailscale) ==="
                      node dist/index.js gateway --tailscale serve --allow-unconfigured 2>&1 | tee "$GATEWAY_LOG"
                      EXIT_CODE=$?
                      echo "=== Gateway exited (code: $EXIT_CODE), restarting in 1h... ==="

                      # Start fallback page on the same port
                      node /opt/openclaw/fallback.js "$PORT" "$EXIT_CODE" "$GATEWAY_LOG" &
                      FALLBACK_PID=$!

                      sleep 3600
                      kill $FALLBACK_PID 2>/dev/null
                      wait $FALLBACK_PID 2>/dev/null
                    done
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/providers/zeabur-ai-hub.json5
                  template: |
                    {
                      "zeabur-ai": {
                        "baseUrl": "https://hnd1.aihub.zeabur.ai/v1",
                        "apiKey": "${ZEABUR_AI_HUB_API_KEY}",
                        "api": "openai-completions",
                        "models": [
                          { "id": "gemini-3-pro-image-preview", "name": "Gemini 3 Pro Image Preview (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 2, "output": 120, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gemini-3-pro-preview", "name": "Gemini 3 Pro Preview (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gpt-5", "name": "GPT-5 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 1.25, "output": 10, "cacheRead": 0.13, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "claude-opus-4-6", "name": "Claude Opus 4.6 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192, "compat": { "supportsStore": false } },
                          { "id": "claude-sonnet-4-5", "name": "Claude Sonnet 4.5 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 3.3, "output": 16.5, "cacheRead": 0.33, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192, "compat": { "supportsStore": false } },
                          { "id": "gemini-3-flash-preview", "name": "Gemini 3 Flash Preview (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.5, "output": 3, "cacheRead": 0.05, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gpt-5-mini", "name": "GPT-5 Mini (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.25, "output": 2, "cacheRead": 0.03, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "claude-haiku-4-5", "name": "Claude Haiku 4.5 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 1.1, "output": 5.5, "cacheRead": 0.11, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192, "compat": { "supportsStore": false } },
                          { "id": "gemini-2.5-pro", "name": "Gemini 2.5 Pro (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gemini-2.5-flash", "name": "Gemini 2.5 Flash (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.3, "output": 2.5, "cacheRead": 0.03, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gemini-2.5-flash-lite", "name": "Gemini 2.5 Flash Lite (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.1, "output": 0.4, "cacheRead": 0.01, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gemini-2.5-flash-image", "name": "Gemini 2.5 Flash Image (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.3, "output": 30, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "deepseek-v3.2", "name": "DeepSeek V3.2 (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.27, "output": 0.4, "cacheRead": 0.216, "cacheWrite": 0 }, "contextWindow": 164000, "maxTokens": 8192 },
                          { "id": "gpt-4.1", "name": "GPT-4.1 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 2, "output": 8, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 1048576, "maxTokens": 8192 },
                          { "id": "gpt-4.1-mini", "name": "GPT-4.1 mini (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.4, "output": 1.6, "cacheRead": 0.1, "cacheWrite": 0 }, "contextWindow": 1048576, "maxTokens": 8192 },
                          { "id": "gpt-4o", "name": "GPT-4o (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }, "contextWindow": 128000, "maxTokens": 8192 },
                          { "id": "gpt-4o-mini", "name": "GPT-4o mini (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }, "contextWindow": 128000, "maxTokens": 8192 },
                          { "id": "gpt-oss-120b", "name": "GPT OSS 120B (Zeabur AI Hub)", "reasoning": true, "input": ["text"], "cost": { "input": 0.35, "output": 0.75, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131072, "maxTokens": 8192, "compat": { "supportsStore": false } },
                          { "id": "grok-4-fast-non-reasoning", "name": "Grok 4 Fast (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.2, "output": 0.5, "cacheRead": 0.05, "cacheWrite": 0 }, "contextWindow": 2000000, "maxTokens": 8192 },
                          { "id": "glm-4.6", "name": "GLM-4.6 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.45, "output": 1.9, "cacheRead": 0.11, "cacheWrite": 0 }, "contextWindow": 204800, "maxTokens": 8192 },
                          { "id": "llama-3.1-8b", "name": "Llama 3.1 8B (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.02, "output": 0.05, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131072, "maxTokens": 8192 },
                          { "id": "qwen-3-235b", "name": "Qwen 3 235B (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.18, "output": 0.54, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 32768, "maxTokens": 8192 },
                          { "id": "qwen3-next", "name": "Qwen 3 Next 80B (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.14, "output": 1.1, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 32768, "maxTokens": 8192 },
                          { "id": "kimi-k2-thinking", "name": "Kimi K2 Thinking (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.55, "output": 2.5, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131072, "maxTokens": 8192 },
                          { "id": "gpt-5.2", "name": "GPT-5.2 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 1.5, "output": 12, "cacheRead": 0.15, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "gpt-5.1", "name": "GPT-5.1 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 1.35, "output": 11, "cacheRead": 0.14, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "gpt-5-nano", "name": "GPT-5 Nano (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.1, "output": 0.8, "cacheRead": 0.01, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "glm-4.7", "name": "GLM-4.7 (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.5, "output": 2, "cacheRead": 0.12, "cacheWrite": 0 }, "contextWindow": 204800, "maxTokens": 8192 },
                          { "id": "glm-4.7-flash", "name": "GLM-4.7 Flash (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.25, "output": 1, "cacheRead": 0.06, "cacheWrite": 0 }, "contextWindow": 204800, "maxTokens": 8192 },
                          { "id": "kimi-k2.5", "name": "Kimi K2.5 (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.45, "output": 2, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 131072, "maxTokens": 8192 },
                          { "id": "minimax-m2.5", "name": "MiniMax M2.5 (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.27, "output": 0.95, "cacheRead": 0.03, "cacheWrite": 0 }, "contextWindow": 196608, "maxTokens": 8192 },
                          { "id": "step-3.5-flash", "name": "Step 3.5 Flash (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.1, "output": 0.3, "cacheRead": 0.02, "cacheWrite": 0 }, "contextWindow": 256000, "maxTokens": 8192 }
                        ]
                      }
                    }
                  permission: null
                  envsubst: null
                - path: /opt/openclaw/skills/zeabur-image-gen/SKILL.md
                  template: "---\nname: zeabur-image-gen\ndescription: Generate images via Zeabur AI Hub using Gemini image models.\nhomepage: https://zeabur.com/ai-hub\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"\U0001F3A8\",\n        \"requires\": { \"env\": [\"ZEABUR_AI_HUB_API_KEY\"] },\n        \"primaryEnv\": \"ZEABUR_AI_HUB_API_KEY\",\n      },\n  }\n---\n\n# Zeabur Image Gen\n\nGenerate images via Zeabur AI Hub using Gemini image models.\n\n## Run\n\n```bash\nnode {baseDir}/scripts/generate_image.mjs --prompt \"your image description\" --filename \"output.png\"\n```\n\nUseful flags:\n\n```bash\n# Use a specific model\nnode {baseDir}/scripts/generate_image.mjs --prompt \"a cat on the moon\" --filename \"cat-moon.png\" --model gemini-3-pro-image-preview\n\n# Use SFO1 endpoint (default is HND1 Tokyo)\nnode {baseDir}/scripts/generate_image.mjs --prompt \"cherry blossoms\" --filename \"sakura.png\" --endpoint sfo1\n```\n\n## Supported Models\n\n- `gemini-2.5-flash-image` (default) - faster\n- `gemini-3-pro-image-preview` - higher quality\n\n## API Key\n\n- `ZEABUR_AI_HUB_API_KEY` env var\n- Or set `skills.\"zeabur-image-gen\".apiKey` / `skills.\"zeabur-image-gen\".env.ZEABUR_AI_HUB_API_KEY` in `~/.openclaw/openclaw.json`\n\n## Notes\n\n- Endpoints: `hnd1` (Tokyo, default), `sfo1` (San Francisco).\n- Use timestamps in filenames: `yyyy-mm-dd-hh-mm-ss-name.png`.\n- The script prints a `MEDIA:` line for OpenClaw to auto-attach on supported chat providers.\n- Do not read the image back; report the saved path only.\n"
                  permission: 420
                  envsubst: false
                - path: /opt/openclaw/skills/zeabur-image-gen/scripts/generate_image.mjs
                  template: |
                    #!/usr/bin/env node
                    /**
                     * Generate images using Zeabur AI Hub via Chat Completions API.
                     *
                     * Usage:
                     *   node generate_image.mjs --prompt "your image description" --filename "output.png"
                     *   node generate_image.mjs --prompt "a cat" --filename "cat.png" --model gemini-2.5-flash-image
                     */

                    import { parseArgs } from "node:util";
                    import { writeFile, mkdir } from "node:fs/promises";
                    import { resolve, dirname } from "node:path";

                    const ENDPOINTS = {
                      hnd1: "https://hnd1.aihub.zeabur.ai",
                      sfo1: "https://sfo1.aihub.zeabur.ai",
                    };

                    const DEFAULT_MODEL = "gemini-2.5-flash-image";

                    const { values } = parseArgs({
                      options: {
                        prompt: { type: "string", short: "p" },
                        filename: { type: "string", short: "f" },
                        model: { type: "string", short: "m", default: DEFAULT_MODEL },
                        endpoint: { type: "string", short: "e", default: "hnd1" },
                        "api-key": { type: "string", short: "k" },
                      },
                      strict: true,
                    });

                    if (!values.prompt || !values.filename) {
                      console.error("Usage: node generate_image.mjs --prompt <text> --filename <path>");
                      process.exit(1);
                    }

                    const apiKey = values["api-key"] || process.env.ZEABUR_AI_HUB_API_KEY;
                    if (!apiKey) {
                      console.error("Error: No API key provided.");
                      console.error("  1. Provide --api-key argument");
                      console.error("  2. Set ZEABUR_AI_HUB_API_KEY environment variable");
                      process.exit(1);
                    }

                    const baseUrl = ENDPOINTS[values.endpoint];
                    if (!baseUrl) {
                      console.error(`Error: Unknown endpoint "${values.endpoint}". Use: ${Object.keys(ENDPOINTS).join(", ")}`);
                      process.exit(1);
                    }

                    const model = values.model;
                    const prompt = values.prompt;
                    const outputPath = resolve(values.filename);

                    await mkdir(dirname(outputPath), { recursive: true });

                    console.log(`Generating image with ${model} via ${values.endpoint}...`);
                    console.log(`Prompt: ${prompt}`);

                    const resp = await fetch(`${baseUrl}/v1/chat/completions`, {
                      method: "POST",
                      headers: {
                        Authorization: `Bearer ${apiKey}`,
                        "Content-Type": "application/json",
                      },
                      body: JSON.stringify({
                        model,
                        messages: [{ role: "user", content: prompt }],
                        stream: false,
                      }),
                      signal: AbortSignal.timeout(300_000),
                    });

                    if (!resp.ok) {
                      const body = await resp.text();
                      console.error(`Zeabur AI Hub API failed (${resp.status}): ${body}`);
                      process.exit(1);
                    }

                    const res = await resp.json();
                    const msg = res.choices?.[0]?.message;

                    // Extract base64 image from response
                    const imgEntry = msg?.images?.[0]?.image_url?.url;
                    if (!imgEntry) {
                      console.error("Error: No image in response.");
                      console.error(`Response: ${JSON.stringify(res).slice(0, 400)}`);
                      process.exit(1);
                    }

                    const b64 = imgEntry.replace(/^data:image\/\w+;base64,/, "");
                    await writeFile(outputPath, Buffer.from(b64, "base64"));

                    console.log(`\nImage saved: ${outputPath}`);
                    console.log(`MEDIA: ${outputPath}`);
                  permission: 420
                  envsubst: false
          domainKey: PUBLIC_DOMAIN
localization:
    es-ES:
        description: "OpenClaw \U0001F99E (anteriormente Clawdbot, Moltbot) es un asistente personal de IA que se ejecuta localmente y se conecta a múltiples plataformas de mensajería (WhatsApp, Telegram, Slack, Discord, etc.) a través de una arquitectura Gateway basada en WebSocket."
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: Dominio
              description: ¿Qué dominio desea vincular a OpenClaw?
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Clave API de Zeabur AI Hub (Recomendado)
              description: Su clave API de Zeabur AI Hub para usar Gemini/GPT/Claude/DeepSeek a través de AI Hub (opcional, puede configurarse después)
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E (anteriormente Clawdbot, Moltbot) es un asistente personal de IA que se ejecuta localmente y se conecta a múltiples plataformas de mensajería a través de una arquitectura Gateway basada en WebSocket.\n\n⚠️ Esta plantilla usa `ghcr.io/openclaw/openclaw:2026.3.2`. OpenClaw \U0001F99E está en desarrollo rápido, por lo que puede haber errores no descubiertos. Cambiar de versión tampoco garantiza estabilidad.\n\n⚠️ Si encuentra algún problema, no dude en consultar los [GitHub issues](https://github.com/openclaw/openclaw/issues) para buscar soluciones o reportar nuevos problemas. Para problemas relacionados con la plataforma Zeabur, contacte al soporte de Zeabur.\n\n⚠️ El software y paquetes específicos de macOS (como Homebrew) no son compatibles en este entorno de contenedor. Por favor busque soluciones alternativas.\n\n⚠️ Esta plantilla requiere un [Servidor Dedicado](https://zeabur.com/docs/dedicated-server) en Zeabur. No se puede ejecutar en clústeres compartidos.\n\n⚠️ Esta plantilla está preconfigurada y lista para usar - no es necesario ejecutar `openclaw onboard`. Si desea reconfigurar, abra **Comando** en el panel de Zeabur y ejecute:\n```bash\nopenclaw onboard --gateway-bind lan\n```\nConsulte [Wizard Reference](https://docs.openclaw.ai/reference/wizard) para todos los flags disponibles.\n\n---\n\n## Recursos Recomendados\n- **Mínimo**: 2 vCPU / 4 GB RAM\n- **Recomendado**: 4 vCPU / 8 GB RAM\n\n## Extensiones de Funciones\n- **Navegador**: Si necesita funciones del navegador (navegación web, capturas de pantalla, etc.), despliegue la [Plantilla Browser](https://zeabur.com/templates/H8L4G1)\n- **Devbox**: Si necesita ejecución de código multilenguaje (Python, Go, Rust, C/C++), despliegue la [Plantilla Devbox](https://zeabur.com/templates/ZBVZNH) en el mismo proyecto\n\n## Uso\n1. Después del despliegue, copie la URL \"Web UI (with token)\" de la pestaña **Instrucciones** y péguela en su navegador\n2. **Configure el modelo de AI** (elija uno):\n   - **Zeabur AI Hub** (modelo predeterminado: `glm-4.7-flash`): Si ingresó la API Key durante el despliegue, vaya directamente al paso 3. También puede agregar `ZEABUR_AI_HUB_API_KEY` después en la pestaña **Variables** del panel de Zeabur (reinicie el servicio después de agregar).\n   - **Otros proveedores** (Anthropic, OpenAI, etc.): Si no ingresó una API Key de Zeabur AI Hub, el modelo predeterminado es `anthropic/claude-opus-4-6`. Vaya a Web UI Settings o agregue la clave API mediante variables de entorno. Más info: https://docs.openclaw.ai/providers/anthropic\n3. Vaya a la página **Chat** para probar si su modelo de AI funciona\n4. (Opcional) Configure plataformas de mensajería como Telegram, WhatsApp, etc.\n\nPara configuración de modelos de AI, consulte la [documentación oficial](https://docs.openclaw.ai/providers).\n\n### Cambio de Modelo y Failover\nEsta plantilla incluye modelos de failover que cambian automáticamente cuando el modelo principal no está disponible. Cadena predeterminada: `glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`.\n\nPuede gestionar modelos desde **Web UI Chat** o **Comando** en el panel de Zeabur.\n\n**Desde Web UI Chat** — escriba slash commands directamente en el chat:\n- `/model zeabur-ai/glm-4.7-flash` — cambiar modelo principal\n- `/model` — ver modelo actual\n- `/models` — listar proveedores de modelos\n- `/models <provider>` — listar modelos de un proveedor (ej. `/models zeabur-ai`)\n\n**Desde Comando** (panel de Zeabur) — mismos comandos en la terminal:\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**O editar el archivo de configuración directamente** (`~/.openclaw/config.json5`):\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\nDespués de editar el archivo, reinicie el servicio.\n\n### Agregar Proveedores de Modelos Externos\nAdemás de Zeabur AI Hub, puede agregar proveedores externos como Anthropic, OpenAI, Google, etc.\n\n**Método 1: Variables de entorno** — agregue API keys en la pestaña **Variables** del panel de Zeabur:\n- `ANTHROPIC_API_KEY` — modelos Claude\n- `OPENAI_API_KEY` — modelos GPT\n- `GOOGLE_API_KEY` — modelos Gemini\n\nDespués de agregar, reinicie el servicio y cambie el modelo:\n- Web UI Chat: `/model anthropic/claude-opus-4-6`\n- Comando: `openclaw models set anthropic/claude-opus-4-6`\n\n**Método 2: Auth token** — abra **Comando** en el panel de Zeabur:\n```bash\n# Pegar una API key de un proveedor\nopenclaw models auth paste-token --provider anthropic\n\n# O usar el asistente de autenticación interactivo\nopenclaw models auth add\n```\n\n**Método 3: Archivo de configuración** — edite `~/.openclaw/config.json5`:\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\nPara todos los proveedores soportados, consulte la [documentación oficial](https://docs.openclaw.ai/providers).\n\n## Configuración de Bot de Telegram\n**Obtener el token de BotFather:**\n1. Abra Telegram y busque [@BotFather](https://t.me/BotFather)\n2. Envíe `/newbot` para crear un nuevo bot\n3. Siga las instrucciones para configurar el nombre y nombre de usuario del bot\n4. BotFather le enviará un token (ej: `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`)\n\n**Agregar el token a Zeabur:**\n1. Vaya a la pestaña **Variable** de su servicio en el panel de Zeabur\n2. Agregue `TELEGRAM_BOT_TOKEN` con su token de bot\n3. Reinicie el servicio\n4. El plugin de Telegram se habilitará automáticamente al reiniciar. Si el bot no se inicia, vaya a **Settings → Config** y verifique que el plugin esté habilitado: `\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`. Para deshabilitar, establezca `enabled` en `false`.\n\n**Vincular su cuenta de Telegram:**\n1. Envíe `/start` a su bot en Telegram\n2. El bot responderá con un código de emparejamiento (ej. `JN4MSY23`)\n3. Apruebe el emparejamiento usando uno de estos métodos:\n   - **Chat Web**: En la interfaz web de OpenClaw, escriba `openclaw pairing approve telegram <código>`\n   - **Terminal**: Abra **Comando** en el panel de Zeabur, ejecute `openclaw pairing approve telegram <código>`\n4. Verá: `Approved telegram sender <user-id>.`\n5. ¡Ahora puede chatear con el bot!\n\n## Configuración de WhatsApp\n**Paso 1: Configurar canal de WhatsApp**\nAgregue la siguiente configuración a través de OpenClaw Web UI (Settings → Config) o péguela en el chat:\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\nReemplace `+15551234567` con su número de teléfono de WhatsApp (con código de país). Reinicie el servicio después de guardar.\n\n**Paso 2: Vincular WhatsApp**\n1. Abra **Comando** en el panel de Zeabur para acceder a la terminal del contenedor\n2. Ejecute: `openclaw channels login`\n3. Aparecerá un código QR - escanéelo con WhatsApp en su teléfono\n4. ¡Conexión completa! Ahora puede enviarse mensajes a sí mismo en WhatsApp para chatear con OpenClaw\n\n## Configuración de Bot de LINE\n**Crear un canal de LINE Messaging API:**\n1. Si aún no tiene una [Cuenta Oficial de LINE](https://entry.line.biz/), créela primero\n2. Vaya a [LINE Developers Console](https://developers.line.biz/console/)\n3. Cree o seleccione un **Provider**\n4. Cree un nuevo canal de **Messaging API** y vincúlelo a su Cuenta Oficial de LINE\n4. En la pestaña **Messaging API**, emita un **Channel access token** (de larga duración)\n5. En la pestaña **Basic settings**, copie el **Channel secret**\n\n**Agregar credenciales a Zeabur:**\n1. Vaya a la pestaña **Variable** de su servicio en el panel de Zeabur\n2. Agregue `LINE_CHANNEL_ACCESS_TOKEN` con su Channel access token\n3. Agregue `LINE_CHANNEL_SECRET` con su Channel secret\n4. Reinicie el servicio\n5. El plugin de LINE se habilitará automáticamente al reiniciar. Si el bot no se inicia, vaya a **Settings → Config** y verifique que el plugin esté habilitado: `\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**Configurar el Webhook:**\n1. Después de reiniciar, su URL de webhook es: `https://<your-domain>/line/webhook`\n2. En [LINE Developers Console](https://developers.line.biz/console/), vaya a la pestaña **Messaging API** de su canal\n3. Establezca **Webhook URL** como `https://<your-domain>/line/webhook`\n4. Habilite **Use webhook**\n5. (Recomendado) Desactive **Mensajes de respuesta automática** y **Mensajes de bienvenida** en el Administrador de cuenta oficial de LINE\n\n**Vincular su cuenta de LINE:**\n1. Agregue el bot como amigo en LINE y envíe cualquier mensaje\n2. El bot responderá con un código de emparejamiento (ej. `JN4MSY23`)\n3. Apruebe el emparejamiento usando uno de estos métodos:\n   - **Chat Web**: En la interfaz web de OpenClaw, escriba `openclaw pairing approve line <código>`\n   - **Terminal**: Abra **Comando** en el panel de Zeabur, ejecute `openclaw pairing approve line <código>`\n4. Verá: `Approved line sender <user-id>.`\n5. ¡Ahora puede chatear con el bot en LINE!\n\nPara otras plataformas de mensajería (Discord, Slack, etc.), consulte la [documentación de Canales](https://docs.openclaw.ai/channels).\n\n## Configuración del Modelo de AI\n\n**Verifique su configuración:**\n1. El modelo predeterminado depende del despliegue:\n   - Con Zeabur AI Hub API Key → modelo predeterminado: `zeabur-ai/glm-4.7-flash`\n   - Sin → modelo predeterminado: `anthropic/claude-opus-4-6` (requiere clave API)\n2. Abra la página **Chat** y envíe un mensaje de prueba\n3. Si recibe una respuesta → el modelo funciona correctamente\n4. Si obtiene un error → verifique que su clave API esté configurada correctamente\n\n**Cambiar modelo para la conversación actual** (mediante comandos de chat):\n- `/models` - Ver modelos disponibles\n- `/model <model-id>` - Cambiar modelo solo para esta conversación (no afecta otras conversaciones)\n\n**Cambiar modelo predeterminado para todas las conversaciones nuevas** (vía Web UI Settings):\n- Ir a Settings → Agents → Default model\n- **Consejo:** Establezca un modelo de bajo costo como predeterminado (ej. `gemini-2.5-flash-lite`, `gpt-5-nano`). Si un modelo deja de estar disponible, use `/new` para iniciar una nueva conversación con el modelo predeterminado.\n\n**Agregar proveedores de AI** (vía Web UI Settings o variables de entorno):\n- Agregar claves API de otros proveedores (ej. Anthropic, OpenAI)\n- Más info: https://docs.openclaw.ai/providers\n\n**Modificar modelos de Zeabur AI Hub** (vía panel de Zeabur):\n- Ir a **Configuración** → **Archivos de configuración** → Editar `/opt/openclaw/providers/zeabur-ai-hub.json5`, luego reiniciar el servicio (los cambios se sincronizan al iniciar)\n- Versiones anteriores (sin comandos): Edite `/home/node/.openclaw/openclaw.json` vía pestaña **Archivos** o Web UI Settings. Agregue lo siguiente al array `models.providers.zeabur-ai.models`:\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Nota de Seguridad\nLa Web UI es una herramienta de gestión para configuración, monitoreo y chat — las plataformas de mensajería (Telegram, WhatsApp, Discord, etc.) funcionan independientemente sin ella. Si solo usa plataformas que no requieren webhooks entrantes (Telegram, WhatsApp, Discord, Signal, iMessage), puede eliminar el enlace de dominio en el panel de Zeabur (pestaña **Networking**) para evitar exponer el gateway a internet público. Todas las tareas de gestión también se pueden realizar mediante CLI en la terminal **Comando** de Zeabur (`openclaw config set`, `openclaw models set`, etc.). Para acceder a la Web UI de forma privada sin un dominio público, consulte [Acceso por Red Privada con Tailscale](#acceso-por-red-privada-con-tailscale-opcional). También puede configurar `OPENCLAW_GATEWAY_BIND` como `loopback` en la pestaña **Variables** (reinicie el servicio después) para restringir el gateway solo a conexiones locales.\n\nPlataformas que **requieren** un dominio público (webhook entrante): LINE, Slack, Google Chat.\n\n## Persistencia de Datos\nTodos los datos se almacenan en `/home/node`:\n- `/home/node/.openclaw` - Configuración, sesiones, dispositivos y credenciales\n- `/home/node/.openclaw/workspace` - Espacio de trabajo y archivos de memoria\n\n## Copia de Seguridad y Restauración\n\U0001F4A1 **Consejo:** Recomendamos crear una copia de seguridad después de completar la configuración inicial o realizar cambios importantes.\n\n**Copia de Seguridad:**\n- **Método 1: Servicio de Zeabur (Recomendado)** - Use la función integrada de Zeabur. Consulte la [Documentación de Zeabur](https://zeabur.com/docs/es-ES/data-management/backup).\n- **Método 2: Manual** - Abra **Comando** → Ejecute `backup` → Descargue desde **Archivos** en `/home/node` (ej. `backup-1430.tar.gz`)\n  - Versiones anteriores (sin comandos): `cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**Restauración:**\n1. Suba el archivo de respaldo a la carpeta `/home/node` en **Archivos**\n2. Abra **Comando** y ejecute:\n   - Archivos del servicio de Zeabur: `restore <nombre-archivo> --strip 2` (ej. `restore data-2026-02-27.zip --strip 2`)\n   - Archivos de respaldo manual: `restore <nombre-archivo>` (ej. `restore backup-1430.tar.gz`)\n   - Versiones anteriores (sin comandos): `cd /home/node && tar -xzvf <nombre-archivo>`\n3. Elimine el archivo de respaldo subido de `/home/node` en **Archivos** para liberar espacio en disco\n4. Reinicie el servicio\n\n⚠️ La restauración sobrescribirá la configuración y los datos existentes en el nuevo servicio. Recuerde también restaurar las variables de entorno relacionadas (ej. `TELEGRAM_BOT_TOKEN`). La copia de seguridad/restauración de canales solo se ha probado con Telegram y WhatsApp.\n\n## Solución de Problemas\n\n> Comando de inicio predeterminado: `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### Despliegues nuevos (con página de ayuda)\nCuando el gateway se detiene, aparece una página de ayuda en la URL del servicio con detalles del error y pasos para solucionarlo:\n1. Revise los **registros de error** — la página de ayuda muestra los registros recientes; para registros completos, abra la pestaña **Logs** en el Dashboard de Zeabur\n2. Corrija la configuración — abra la pestaña **Files** en el Dashboard de Zeabur, busque el archivo de configuración (`/home/node/.openclaw/openclaw.json`) y corrija el problema\n3. Haga clic en **Reiniciar** en el Dashboard de Zeabur para aplicar la corrección\n\n### Despliegues existentes (sin página de ayuda)\nSi su despliegue no tiene la página de ayuda, siga estos pasos:\n1. Revise la pestaña **Logs** en el Dashboard de Zeabur para encontrar el error\n2. Vaya a **Configuración** → **Comando**, cambie el comando de inicio a `sleep 3600`, luego haga clic en **Reiniciar** — esto mantiene el contenedor en ejecución para poder editar archivos\n3. Corrija la configuración — abra la pestaña **Files**, busque el archivo de configuración (`/home/node/.openclaw/openclaw.json`) y corrija el problema\n4. Cambie el comando de inicio de vuelta a `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` y haga clic en **Reiniciar**\n\n> \U0001F4A1 Para activar la página de ayuda, redespliegue desde esta plantilla.\n\n### Actualizar la versión de OpenClaw\n1. Consulte la última versión en [OpenClaw releases](https://github.com/openclaw/openclaw/releases)\n2. En el Dashboard de Zeabur, vaya a **Configuración** → **Fuente de imagen del servicio**\n3. Imagen: `ghcr.io/openclaw/openclaw`, Etiqueta: cambie de la versión actual (ej. `2026.2.26`) a la nueva versión (ej. `2026.3.2`)\n4. Haga clic en **Reiniciar** para aplicar\n\n> ⚠️ Evite usar `latest` como etiqueta — descarga la versión más reciente en cada reinicio, lo que puede introducir cambios incompatibles o errores inesperados. Fije una versión específica para mayor estabilidad.\n5. Revise la pestaña **Logs** para confirmar que el gateway se inició correctamente\n\n> \U0001F4A1 El script de inicio migra automáticamente su configuración en cada arranque — los ajustes faltantes (como `trustedProxies`, `dangerouslyDisableDeviceAuth`) se agregan automáticamente. Sus configuraciones existentes se conservan.\n\n### \"device identity required\"\nEsto significa que la Web UI aún no ha sido emparejada con un Gateway Token. Solución:\n- **Opción 1:** En la pestaña **Instrucciones** del Dashboard de Zeabur, copie la URL **Web UI (with Token)** y ábrala en su navegador\n- **Opción 2:** Abra la página **Overview** de la Web UI e ingrese el Gateway Token\n\nPuede encontrar el Gateway Token en la pestaña **Instrucciones** del Dashboard de Zeabur o en **Variables de entorno** (`OPENCLAW_GATEWAY_TOKEN`).\n\n### \"disconnected (1008): pairing required\"\nEsto significa que su dispositivo (navegador/aplicación) aún no ha sido emparejado con el Gateway. Para emparejar:\n1. Abra la Web UI y complete la autenticación con Gateway Token (ver arriba)\n2. Abra **Comando** en el dashboard de Zeabur para acceder a la terminal, luego ejecute:\n   - `openclaw devices list` — ver solicitudes de emparejamiento pendientes y encontrar el `requestId`\n   - `openclaw devices approve <requestId>` — aprobar el dispositivo\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\nEste error ocurre al actualizar a la imagen `2026.2.23` o posterior sin actualizar la configuración. Solución: edite `/home/node/.openclaw/openclaw.json` y agregue `\"dangerouslyAllowHostHeaderOriginFallback\": true` bajo `gateway.controlUi`:\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\nLuego reinicie el servicio. Los nuevos despliegues desde esta plantilla ya incluyen esta configuración.\n\n## Acceso por Red Privada con Tailscale (Opcional)\n> ⚠️ Esta función solo está disponible para despliegues nuevos. Los despliegues existentes no incluyen los scripts de inicio de Tailscale — por favor redespliegue la plantilla para usar esta función.\n\nEn lugar de un dominio público, puede usar [Tailscale](https://tailscale.com) para que OpenClaw sea accesible solo dentro de su red privada (tailnet), sin exponerlo a internet público.\n\n**Requisitos previos:**\n- Una cuenta de Tailscale (el plan gratuito funciona)\n- Una Auth Key de [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) (recomendado: Reusable + Ephemeral)\n\n**Paso 1: Configurar variables de entorno**\nEn la pestaña **Variables de Entorno** del dashboard de Zeabur, agregue:\n- `TS_AUTHKEY` (requerido): Su Tailscale Auth Key (`tskey-auth-xxx`). Créela en [Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys). Sin esta variable, la configuración de Tailscale se omite por completo.\n- `TS_HOSTNAME` (opcional): El nombre de la máquina en su tailnet, que determina su URL de acceso (`https://<TS_HOSTNAME>.<tailnet>.ts.net`). Por defecto es `openclaw` si no se configura.\n\n**Paso 2: Cambiar comando de inicio**\nVaya a **Configuración** → **Comando**, cambie a:\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\nReinicie el servicio.\n\n**Paso 3: Instalar Tailscale en su dispositivo**\nInstale [Tailscale](https://tailscale.com/download) en el dispositivo desde el que quiere acceder a OpenClaw (macOS, Windows, iOS, Android, Linux), e inicie sesión con la misma cuenta de Tailscale usada para crear la Auth Key.\n\n**Paso 4: Primer inicio de sesión en Web UI**\nUna vez iniciado, abra en su navegador (debe estar en la misma tailnet):\n```\nhttps://<TS_HOSTNAME>.<su-tailnet>.ts.net\n```\nPuede encontrar su nombre DNS de tailnet en [Consola de Administración de Tailscale → DNS](https://login.tailscale.com/admin/dns), o verificar la URL completa en los **Logs** del servicio en el dashboard de Zeabur.\n\nInicie sesión usando cualquiera de estos métodos:\n- Agregue el token a la URL: `https://<TS_HOSTNAME>.<su-tailnet>.ts.net?token=<GATEWAY_TOKEN>`\n- O ingrese el Gateway Token en la página **Overview** de la Web UI\n\nPuede encontrar el Gateway Token en la pestaña **Instrucciones** o **Variables de Entorno** del dashboard de Zeabur (`OPENCLAW_GATEWAY_TOKEN`).\n\n**Paso 5: Conectar OpenClaw app (Opcional, ejemplo macOS)**\n1. Instale [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) y Tailscale en su Mac\n2. Abra OpenClaw app → **Settings → General** → seleccione modo **Remote**\n3. Configure Transport en **Direct (ws/wss)**\n4. Configure Gateway URL en `wss://<TS_HOSTNAME>.<su-tailnet>.ts.net`\n5. La primera conexión requiere aprobación de emparejamiento — vaya a la página **Nodes** de la Web UI y haga clic en approve\n\nPara configuración de iOS y Android, consulte la [documentación oficial](https://docs.openclaw.ai/platforms).\n\n**Volver al modo de dominio público:**\nCambie el comando de inicio a `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` y reinicie.\n\n## Configuración Específica de Zeabur\nEsta plantilla preconfigura los siguientes ajustes para el entorno de nube de Zeabur:\n\n- **`gateway.trustedProxies`**: Configurado como `[\"10.0.0.0/8\", \"172.16.0.0/12\"]` para que el gateway identifique correctamente las IPs de los clientes detrás del proxy inverso de Zeabur. Sin esto, la Web UI puede mostrar errores de \"device identity required\".\n- **`dangerouslyDisableDeviceAuth`**: Deshabilita el emparejamiento de dispositivos de la Web UI (el emparejamiento está diseñado para redes locales; los despliegues en la nube usan autenticación por Gateway Token).\n- **Symlinks en `/usr/local/bin`**: Los comandos `openclaw`, `backup` y `restore` tienen enlaces simbólicos en `/usr/local/bin` para funcionar en la terminal de **Comando** de Zeabur.\n- **`OPENCLAW_DISABLE_BONJOUR=1`**: Deshabilita mDNS/Bonjour porque los nombres de host de los contenedores de Zeabur pueden exceder el límite de 63 bytes de las etiquetas DNS. mDNS solo se usa para descubrimiento de red local y no es necesario en entornos de nube.\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**: Soluciona problemas de conexión con Telegram en entornos de contenedores (necesario para versiones de imagen `2026.2.17` en adelante).\n\n## Documentación\n- Documentación: https://docs.openclaw.ai\n- GitHub: https://github.com/openclaw/openclaw\n\n## Registro de Cambios\n**2026/3/4**\n- Actualizar imagen a `2026.3.2` — herramienta PDF, embeddings Ollama, streaming de Telegram por defecto a `partial`, endpoints de salud del contenedor (`/healthz`), transporte WebSocket de OpenAI, 200+ correcciones y 20+ mejoras de seguridad en 3 versiones (2026.3.1, 2026.3.2)\n- ⚠️ Cambios incompatibles: plugins que usen `api.registerHttpHandler(...)` deben migrar a `api.registerHttpRoute(...)`, canal Zalouser requiere re-login (`openclaw channels login --channel zalouser`)\n\n**2026/3/2**\n- Agregar modelos: `claude-opus-4-6`, `minimax-m2.5`, `step-3.5-flash`\n- Reemplazar modelos: `llama-3.3-70b` → `llama-3.1-8b`, `qwen-3-32` → `qwen-3-235b`\n- Corregir rotación de API key: cambiar `ZEABUR_AI_HUB_API_KEY` y reiniciar ahora surte efecto (eliminado `envsubst`, resolución de `${VAR}` en runtime)\n- Config del proveedor sincronizado desde `/opt` en cada inicio — actualizaciones de modelo y ediciones en Configs se aplican tras reiniciar\n- Agregar nota de seguridad con guía de `OPENCLAW_GATEWAY_BIND=loopback`\n\n**2026/2/27**\n- Agregar `dangerouslyDisableDeviceAuth` — usar autenticación por Gateway Token en lugar de emparejamiento de dispositivo para despliegues en la nube\n- Modelo predeterminado: `zeabur-ai/glm-4.7-flash` con cadena de respaldo (grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini)\n- Agregar documentación de cambio de modelo, respaldo y proveedores externos\n- Limpiar variables de entorno (mover valores predeterminados al script de inicio)\n- Migración automática de configuraciones existentes (trustedProxies, configuración de autenticación)\n- Actualizar imagen a `2026.2.26` — corrección de herencia de allowlist DM de Telegram, corrección de permisos de temp dir en contenedores, corrección de CLI gateway `--force` en Docker no-root, normalización de ID de modelo Gemini, y endurecimiento de seguridad adicional\n\n**2026/2/26**\n- Actualizar imagen a `2026.2.25` — 100+ correcciones de seguridad entre 2026.2.23→2026.2.25, nuevos proveedores (Kilo Gateway, Mistral, Volcano Engine), configuración de heartbeat `directPolicy`, endurecimiento de autenticación WebSocket del gateway, aislamiento de enrutamiento entre canales, fiabilidad de Discord voz DAVE, corrección de cuelgue de webhook de Telegram, y numerosas mejoras de estabilidad\n\n**2026/2/24**\n- Actualizar imagen a `2026.2.23` — incluye 30+ correcciones de seguridad, nuevos proveedores (Kilo Gateway, Mistral, Volcano Engine), configuración unificada de streaming de canales, frases de parada multilingües, filtrado de reasoning/thinking en todos los canales, y numerosas mejoras de estabilidad\n- Agregar `dangerouslyAllowHostHeaderOriginFallback` a la configuración de Control UI — requerido para despliegues no-loopback desde 2026.2.23\n\n**2026/2/22**\n- Reemplazar health check con reinicio automático: el gateway se reinicia automáticamente al fallar, mostrando una página de ayuda con detalles del error y pasos para solucionarlo (detección de recuperación cada 5 segundos)\n- Eliminar modo de rescate (`rescue.sh`) — reemplazado por la página de ayuda\n\n**2026/2/20**\n- Fijar etiqueta de imagen a `2026.2.19` — agregar variable `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` para solucionar problemas de conexión con Telegram (requerido para versiones de imagen `2026.2.17` en adelante)\n\n**2026/2/16**\n- Cambiar etiqueta de imagen a `latest` para seguir las correcciones de seguridad rápidas\n\n**2026/2/15**\n- Agregar acceso por red privada Tailscale: los usuarios pueden cambiar a `start_gateway_tailscale.sh` para acceso HTTPS privado vía tailnet sin exponer a internet público\n- Actualizar imagen a `2026.2.14`\n\n**2026/2/10**\n- Corregir skill de generación de imágenes: cambiar a API `/v1/chat/completions`, modelo predeterminado a `gemini-2.5-flash-image`\n- Corregir HTTP 500 en `gpt-oss-120b`, `llama-3.3-70b`, `qwen-3-32`: agregar configuración de compatibilidad `supportsStore: false`\n- Corregir flag de reasoning de `gpt-oss-120b` (establecido en `true`)\n- Script de restauración ahora soporta formato `.zip` (servicio de backup de Zeabur)\n- Sincronizar variables de entorno de canales (`TELEGRAM_BOT_TOKEN`, `DISCORD_BOT_TOKEN`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `LINE_CHANNEL_ACCESS_TOKEN`, `LINE_CHANNEL_SECRET`) al archivo de configuración al iniciar\n\n**2026/2/7**\n- Corregir notificaciones proactivas de cron: detectar automáticamente el canal configurado como destino de heartbeat al iniciar\n- Inicializar HEARTBEAT.md con contenido ejecutable en nuevos despliegues (evita que heartbeat se omita por archivo vacío)\n\n**2026/2/4**\n- Usar Zeabur configs para scripts de inicio (más fácil de mantener)\n- Añadir comandos globales `backup` y `restore`\n- Añadir reinicio automático con página de respaldo para recuperación de fallos del gateway\n- Añadir 6 nuevos modelos de Zeabur AI Hub: gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Añadir configuración de compatibilidad store para modelos Claude de Zeabur AI Hub\n\n**2026/2/2**\n- Añadir sección de configuración de modelos de AI (global vs conversación)\n- Añadir sección de copia de seguridad y restauración con servicio de Zeabur\n- Añadir consejo de hacer copia de seguridad después de la configuración inicial\n- Eliminar parche de Google Gemini CLI (corregido en upstream)\n- Eliminar variables ANTHROPIC_API_KEY y OPENAI_API_KEY del despliegue para evitar que OpenClaw detecte claves API vacías y falle (configurable después via Web UI o variables de entorno)\n"
    id-ID:
        description: "OpenClaw \U0001F99E (sebelumnya Clawdbot, Moltbot) adalah asisten AI pribadi yang berjalan secara lokal dan terhubung ke berbagai platform perpesanan (WhatsApp, Telegram, Slack, Discord, dll.) melalui arsitektur Gateway berbasis WebSocket."
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: Domain
              description: Domain apa yang ingin Anda ikat ke OpenClaw?
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Kunci API Zeabur AI Hub (Direkomendasikan)
              description: Kunci API Zeabur AI Hub Anda untuk menggunakan Gemini/GPT/Claude/DeepSeek melalui AI Hub (opsional, dapat dikonfigurasi nanti)
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E (sebelumnya Clawdbot, Moltbot) adalah asisten AI pribadi yang berjalan secara lokal dan terhubung ke berbagai platform perpesanan melalui arsitektur Gateway berbasis WebSocket.\n\n⚠️ Template ini menggunakan `ghcr.io/openclaw/openclaw:2026.3.2`. OpenClaw \U0001F99E sedang dalam pengembangan cepat, jadi mungkin ada bug yang belum ditemukan. Mengubah versi juga tidak menjamin stabilitas.\n\n⚠️ Jika Anda mengalami masalah, silakan kunjungi [GitHub issues](https://github.com/openclaw/openclaw/issues) untuk mencari solusi atau melaporkan masalah baru. Untuk masalah terkait platform Zeabur, silakan hubungi dukungan Zeabur.\n\n⚠️ Software dan paket khusus macOS (seperti Homebrew) tidak didukung di lingkungan container ini. Silakan cari solusi alternatif.\n\n⚠️ Template ini memerlukan [Dedicated Server](https://zeabur.com/docs/dedicated-server) di Zeabur. Tidak dapat berjalan di kluster bersama.\n\n⚠️ Template ini sudah dikonfigurasi dan siap digunakan - tidak perlu menjalankan `openclaw onboard`. Jika ingin mengkonfigurasi ulang, buka **Perintah** di dashboard Zeabur dan jalankan:\n```bash\nopenclaw onboard --gateway-bind lan\n```\nLihat [Wizard Reference](https://docs.openclaw.ai/reference/wizard) untuk semua flag yang tersedia.\n\n---\n\n## Sumber Daya yang Direkomendasikan\n- **Minimum**: 2 vCPU / 4 GB RAM\n- **Disarankan**: 4 vCPU / 8 GB RAM\n\n## Ekstensi Fitur\n- **Browser**: Jika Anda memerlukan fitur browser (browsing web, screenshot, dll.), deploy [Template Browser](https://zeabur.com/templates/H8L4G1)\n- **Devbox**: Jika Anda memerlukan eksekusi kode multi-bahasa (Python, Go, Rust, C/C++), deploy [Template Devbox](https://zeabur.com/templates/ZBVZNH) ke proyek yang sama\n\n## Penggunaan\n1. Setelah deploy, salin URL \"Web UI (with token)\" dari tab **Instruksi** dan tempelkan di browser Anda\n2. **Konfigurasi model AI** (pilih salah satu):\n   - **Zeabur AI Hub** (model default: `glm-4.7-flash`): Jika sudah memasukkan API Key saat deploy, langsung ke langkah 3. Bisa juga menambahkan `ZEABUR_AI_HUB_API_KEY` nanti di tab **Variables** dashboard Zeabur (restart layanan setelah menambahkan).\n   - **Penyedia lain** (Anthropic, OpenAI, dll.): Jika tidak memasukkan API Key Zeabur AI Hub, model default adalah `anthropic/claude-opus-4-6`. Buka Web UI Settings atau tambahkan kunci API melalui variabel lingkungan. Info: https://docs.openclaw.ai/providers/anthropic\n3. Buka halaman **Chat** untuk menguji apakah model AI Anda berfungsi\n4. (Opsional) Atur platform pesan seperti Telegram, WhatsApp, dll.\n\nUntuk konfigurasi model AI, lihat [dokumentasi resmi](https://docs.openclaw.ai/providers).\n\n### Pergantian Model dan Failover\nTemplate ini menyertakan model failover yang otomatis beralih saat model utama tidak tersedia. Rantai default: `glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`.\n\nAnda dapat mengelola model dari **Web UI Chat** atau **Perintah** di dashboard Zeabur.\n\n**Dari Web UI Chat** — ketik slash command langsung di kotak chat:\n- `/model zeabur-ai/glm-4.7-flash` — ganti model utama\n- `/model` — lihat model saat ini\n- `/models` — daftar penyedia model\n- `/models <provider>` — daftar model dari penyedia tertentu (mis. `/models zeabur-ai`)\n\n**Dari Perintah** (dashboard Zeabur) — perintah yang sama di terminal:\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**Atau edit file konfigurasi langsung** (`~/.openclaw/config.json5`):\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\nSetelah mengedit file konfigurasi, restart layanan.\n\n### Menambahkan Penyedia Model Eksternal\nSelain Zeabur AI Hub, Anda dapat menambahkan penyedia eksternal seperti Anthropic, OpenAI, Google, dll.\n\n**Metode 1: Variabel lingkungan** — tambahkan API key di tab **Variables** dashboard Zeabur:\n- `ANTHROPIC_API_KEY` — model Claude\n- `OPENAI_API_KEY` — model GPT\n- `GOOGLE_API_KEY` — model Gemini\n\nSetelah menambahkan, restart layanan, lalu ganti model:\n- Web UI Chat: `/model anthropic/claude-opus-4-6`\n- Perintah: `openclaw models set anthropic/claude-opus-4-6`\n\n**Metode 2: Auth token** — buka **Perintah** di dashboard Zeabur:\n```bash\n# Tempel API key dari penyedia\nopenclaw models auth paste-token --provider anthropic\n\n# Atau gunakan pembantu autentikasi interaktif\nopenclaw models auth add\n```\n\n**Metode 3: File konfigurasi** — edit `~/.openclaw/config.json5`:\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\nUntuk semua penyedia yang didukung, lihat [dokumentasi resmi](https://docs.openclaw.ai/providers).\n\n## Pengaturan Bot Telegram\n**Mendapatkan token dari BotFather:**\n1. Buka Telegram dan cari [@BotFather](https://t.me/BotFather)\n2. Kirim `/newbot` untuk membuat bot baru\n3. Ikuti petunjuk untuk mengatur nama dan username bot\n4. BotFather akan mengirimkan token (contoh: `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`)\n\n**Menambahkan token ke Zeabur:**\n1. Buka tab **Variabel** layanan Anda di dashboard Zeabur\n2. Tambahkan `TELEGRAM_BOT_TOKEN` dengan token bot Anda\n3. Restart layanan\n4. Plugin Telegram akan diaktifkan secara otomatis saat restart. Jika bot tidak berjalan, buka **Settings → Config** dan pastikan plugin sudah diaktifkan: `\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`. Untuk menonaktifkan, atur `enabled` ke `false`.\n\n**Menghubungkan akun Telegram Anda:**\n1. Kirim `/start` ke bot Anda di Telegram\n2. Bot akan membalas dengan kode pairing (mis. `JN4MSY23`)\n3. Setujui pairing menggunakan salah satu metode berikut:\n   - **Web Chat**: Di antarmuka web OpenClaw, ketik `openclaw pairing approve telegram <kode>`\n   - **Terminal**: Buka **Perintah** di dashboard Zeabur, jalankan `openclaw pairing approve telegram <kode>`\n4. Anda akan melihat: `Approved telegram sender <user-id>.`\n5. Sekarang Anda dapat mengobrol dengan bot!\n\n## Pengaturan WhatsApp\n**Langkah 1: Konfigurasi kanal WhatsApp**\nTambahkan konfigurasi berikut melalui OpenClaw Web UI (Settings → Config) atau tempelkan ke chat:\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\nGanti `+15551234567` dengan nomor telepon WhatsApp Anda (dengan kode negara). Restart layanan setelah menyimpan.\n\n**Langkah 2: Hubungkan WhatsApp**\n1. Buka **Perintah** di dashboard Zeabur untuk mengakses terminal container\n2. Jalankan: `openclaw channels login`\n3. QR Code akan muncul - pindai dengan WhatsApp di ponsel Anda\n4. Koneksi selesai! Sekarang Anda dapat mengirim pesan ke diri sendiri di WhatsApp untuk mengobrol dengan OpenClaw\n\n## Pengaturan Bot LINE\n**Membuat channel LINE Messaging API:**\n1. Jika belum memiliki [Akun Resmi LINE](https://entry.line.biz/), buat terlebih dahulu\n2. Buka [LINE Developers Console](https://developers.line.biz/console/)\n3. Buat atau pilih **Provider**\n4. Buat channel **Messaging API** baru dan hubungkan ke Akun Resmi LINE Anda\n4. Di tab **Messaging API**, terbitkan **Channel access token** (berlaku lama)\n5. Di tab **Basic settings**, salin **Channel secret**\n\n**Menambahkan kredensial ke Zeabur:**\n1. Buka tab **Variabel** layanan Anda di dashboard Zeabur\n2. Tambahkan `LINE_CHANNEL_ACCESS_TOKEN` dengan Channel access token Anda\n3. Tambahkan `LINE_CHANNEL_SECRET` dengan Channel secret Anda\n4. Restart layanan\n5. Plugin LINE akan diaktifkan secara otomatis saat restart. Jika bot tidak berjalan, buka **Settings → Config** dan pastikan plugin sudah diaktifkan: `\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**Mengatur Webhook:**\n1. Setelah restart, URL webhook Anda adalah: `https://<your-domain>/line/webhook`\n2. Di [LINE Developers Console](https://developers.line.biz/console/), buka tab **Messaging API** channel Anda\n3. Atur **Webhook URL** ke `https://<your-domain>/line/webhook`\n4. Aktifkan **Use webhook**\n5. (Disarankan) Nonaktifkan **Pesan balasan otomatis** dan **Pesan sambutan** di LINE Official Account Manager\n\n**Menghubungkan akun LINE Anda:**\n1. Tambahkan bot sebagai teman di LINE dan kirim pesan apa saja\n2. Bot akan membalas dengan kode pairing (mis. `JN4MSY23`)\n3. Setujui pairing menggunakan salah satu metode berikut:\n   - **Web Chat**: Di antarmuka web OpenClaw, ketik `openclaw pairing approve line <kode>`\n   - **Terminal**: Buka **Perintah** di dashboard Zeabur, jalankan `openclaw pairing approve line <kode>`\n4. Anda akan melihat: `Approved line sender <user-id>.`\n5. Sekarang Anda dapat mengobrol dengan bot di LINE!\n\nUntuk platform perpesanan lainnya (Discord, Slack, dll.), lihat [dokumentasi Channels](https://docs.openclaw.ai/channels).\n\n## Konfigurasi Model AI\n\n**Verifikasi setup Anda:**\n1. Model default tergantung pada cara deploy:\n   - Dengan Zeabur AI Hub API Key → model default: `zeabur-ai/glm-4.7-flash`\n   - Tanpa → model default: `anthropic/claude-opus-4-6` (memerlukan kunci API)\n2. Buka halaman **Chat** dan kirim pesan percobaan\n3. Jika mendapat balasan → model berfungsi dengan baik\n4. Jika ada error → pastikan kunci API sudah dikonfigurasi dengan benar\n\n**Ganti model untuk percakapan saat ini** (melalui perintah chat):\n- `/models` - Lihat model yang tersedia\n- `/model <model-id>` - Ganti model hanya untuk percakapan ini (tidak mempengaruhi percakapan lain)\n\n**Ganti model default untuk semua percakapan baru** (via Web UI Settings):\n- Buka Settings → Agents → Default model\n- **Tips:** Tetapkan model berbiaya rendah sebagai default (misal: `gemini-2.5-flash-lite`, `gpt-5-nano`). Jika model tidak tersedia, gunakan `/new` untuk memulai percakapan baru dengan model default.\n\n**Tambah penyedia AI** (via Web UI Settings atau variabel lingkungan):\n- Tambahkan kunci API penyedia lain (misal: Anthropic, OpenAI)\n- Info: https://docs.openclaw.ai/providers\n\n**Modifikasi model Zeabur AI Hub** (via dashboard Zeabur):\n- Buka **Settings** → **Configs** → Edit `/opt/openclaw/providers/zeabur-ai-hub.json5`, lalu restart layanan (perubahan disinkronkan saat startup)\n- Versi lama (tanpa perintah): Edit `/home/node/.openclaw/openclaw.json` via tab **Files** atau Web UI Settings. Tambahkan berikut ke array `models.providers.zeabur-ai.models`:\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Catatan Keamanan\nWeb UI adalah alat manajemen untuk konfigurasi, pemantauan, dan chat — platform pesan (Telegram, WhatsApp, Discord, dll.) bekerja secara independen tanpa Web UI. Jika Anda hanya menggunakan platform yang tidak memerlukan inbound webhook (Telegram, WhatsApp, Discord, Signal, iMessage), Anda dapat menghapus pengikatan domain di dashboard Zeabur (tab **Networking**) untuk menghindari mengekspos gateway ke internet publik. Semua tugas manajemen juga dapat dilakukan melalui CLI di terminal **Perintah** Zeabur (`openclaw config set`, `openclaw models set`, dll.). Untuk akses Web UI privat tanpa domain publik, lihat [Akses Jaringan Pribadi Tailscale](#akses-jaringan-pribadi-tailscale-opsional). Anda juga dapat mengatur `OPENCLAW_GATEWAY_BIND` ke `loopback` di tab **Variables** (restart layanan setelahnya) untuk membatasi gateway hanya menerima koneksi lokal.\n\nPlatform yang **memerlukan** domain publik (inbound webhook): LINE, Slack, Google Chat.\n\n## Persistensi Data\nSemua data disimpan di `/home/node`:\n- `/home/node/.openclaw` - Konfigurasi, sesi, perangkat, dan kredensial\n- `/home/node/.openclaw/workspace` - Ruang kerja dan file memori\n\n## Cadangan & Pemulihan\n\U0001F4A1 **Tips:** Kami merekomendasikan untuk membuat cadangan setelah menyelesaikan pengaturan awal atau melakukan perubahan konfigurasi penting.\n\n**Cadangan:**\n- **Metode 1: Layanan Zeabur (Direkomendasikan)** - Gunakan fitur cadangan bawaan Zeabur. Lihat [Dokumentasi Zeabur](https://zeabur.com/docs/data-management/backup).\n- **Metode 2: Manual** - Buka **Perintah** → Jalankan `backup` → Unduh dari **Files** di `/home/node` (contoh: `backup-1430.tar.gz`)\n  - Versi lama (tanpa perintah): `cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**Pemulihan:**\n1. Upload file cadangan ke folder `/home/node` di **Files**\n2. Buka **Perintah** dan jalankan:\n   - File dari layanan Zeabur: `restore <nama-file> --strip 2`\n   - File cadangan manual: `restore <nama-file>`\n   - File dari layanan Zeabur: `restore <nama-file> --strip 2` (contoh: `restore data-2026-02-27.zip --strip 2`)\n   - File cadangan manual: `restore <nama-file>` (contoh: `restore backup-1430.tar.gz`)\n   - Versi lama (tanpa perintah): `cd /home/node && tar -xzvf <nama-file>`\n3. Hapus file cadangan yang diupload dari `/home/node` di **Files** untuk mengosongkan ruang disk\n4. Restart layanan\n\n⚠️ Pemulihan akan menimpa konfigurasi dan data yang ada di layanan baru. Jangan lupa untuk juga mengatur kembali variabel lingkungan terkait (contoh: `TELEGRAM_BOT_TOKEN`). Cadangan/pemulihan channel hanya diuji dengan Telegram dan WhatsApp.\n\n## Pemecahan Masalah\n\n> Perintah startup default: `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### Deployment baru (dengan halaman bantuan)\nKetika gateway berhenti, halaman bantuan akan muncul di URL layanan dengan detail error dan langkah perbaikan:\n1. Periksa **log error** — halaman bantuan menampilkan log terbaru; untuk log lengkap, buka tab **Logs** di Dashboard Zeabur\n2. Perbaiki konfigurasi — buka tab **Files** di Dashboard Zeabur, cari file konfigurasi (`/home/node/.openclaw/openclaw.json`) dan perbaiki masalahnya\n3. Klik **Restart** di Dashboard Zeabur untuk menerapkan perbaikan\n\n### Deployment lama (tanpa halaman bantuan)\nJika deployment Anda tidak memiliki halaman bantuan, ikuti langkah berikut:\n1. Periksa tab **Logs** di Dashboard Zeabur untuk menemukan error\n2. Buka **Settings** → **Perintah**, ubah perintah startup menjadi `sleep 3600`, lalu klik **Restart** — ini menjaga container tetap berjalan agar Anda bisa mengedit file\n3. Perbaiki konfigurasi — buka tab **Files**, cari file konfigurasi (`/home/node/.openclaw/openclaw.json`) dan perbaiki masalahnya\n4. Ubah perintah startup kembali ke `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` dan klik **Restart**\n\n> \U0001F4A1 Untuk mengaktifkan halaman bantuan, deploy ulang dari template ini.\n\n### Memperbarui Versi OpenClaw\n1. Periksa versi terbaru di [OpenClaw releases](https://github.com/openclaw/openclaw/releases)\n2. Di Dashboard Zeabur, buka **Settings** → **Service Image Source**\n3. Image: `ghcr.io/openclaw/openclaw`, Tag: ubah dari versi saat ini (contoh: `2026.2.26`) ke versi baru (contoh: `2026.3.2`)\n4. Klik **Restart** untuk menerapkan\n\n> ⚠️ Hindari menggunakan `latest` sebagai tag — ini akan mengunduh versi terbaru setiap kali restart, yang dapat menyebabkan perubahan yang tidak kompatibel atau error tak terduga. Gunakan versi spesifik untuk stabilitas.\n5. Periksa tab **Logs** untuk memastikan gateway berhasil dimulai\n\n> \U0001F4A1 Skrip startup secara otomatis memigrasi konfigurasi Anda setiap kali boot — pengaturan yang hilang (seperti `trustedProxies`, `dangerouslyDisableDeviceAuth`) akan ditambahkan otomatis. Pengaturan yang sudah ada tidak akan ditimpa.\n\n### \"device identity required\"\nIni berarti Web UI belum dipasangkan dengan Gateway Token. Solusi:\n- **Opsi 1:** Di tab **Instructions** Dashboard Zeabur, salin URL **Web UI (with Token)** dan buka di browser\n- **Opsi 2:** Buka halaman **Overview** di Web UI dan masukkan Gateway Token\n\nGateway Token dapat ditemukan di tab **Instructions** Dashboard Zeabur atau di **Environment Variables** (`OPENCLAW_GATEWAY_TOKEN`).\n\n### \"disconnected (1008): pairing required\"\nIni berarti perangkat Anda (browser/aplikasi) belum dipasangkan dengan Gateway. Cara memasangkan:\n1. Buka Web UI dan selesaikan autentikasi Gateway Token (lihat di atas)\n2. Buka **Perintah** di dashboard Zeabur untuk mengakses terminal, lalu jalankan:\n   - `openclaw devices list` — lihat permintaan pairing yang menunggu dan temukan `requestId`\n   - `openclaw devices approve <requestId>` — setujui perangkat\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\nError ini terjadi setelah upgrade ke image `2026.2.23` atau lebih baru tanpa memperbarui konfigurasi. Solusi: edit `/home/node/.openclaw/openclaw.json` dan tambahkan `\"dangerouslyAllowHostHeaderOriginFallback\": true` di bawah `gateway.controlUi`:\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\nLalu restart layanan. Deployment baru dari template ini sudah menyertakan pengaturan ini.\n\n## Akses Jaringan Pribadi Tailscale (Opsional)\n> ⚠️ Fitur ini hanya tersedia untuk deployment baru. Deployment lama tidak menyertakan skrip startup Tailscale — silakan deploy ulang template untuk menggunakan fitur ini.\n\nSelain domain publik, Anda dapat menggunakan [Tailscale](https://tailscale.com) agar OpenClaw hanya dapat diakses dalam jaringan pribadi (tailnet) Anda, tanpa perlu diekspos ke internet publik.\n\n**Prasyarat:**\n- Akun Tailscale (paket gratis cukup)\n- Auth Key dari [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) (disarankan: Reusable + Ephemeral)\n\n**Langkah 1: Atur variabel lingkungan**\nDi tab **Environment Variables** dashboard Zeabur, tambahkan:\n- `TS_AUTHKEY` (wajib): Auth Key Tailscale Anda (`tskey-auth-xxx`). Buat di [Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys). Tanpa variabel ini, pengaturan Tailscale akan dilewati sepenuhnya.\n- `TS_HOSTNAME` (opsional): Nama mesin di tailnet Anda, yang menentukan URL akses (`https://<TS_HOSTNAME>.<tailnet>.ts.net`). Default `openclaw` jika tidak diatur.\n\n**Langkah 2: Ubah perintah startup**\nBuka **Settings** → **Perintah**, ubah ke:\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\nRestart layanan.\n\n**Langkah 3: Instal Tailscale di perangkat Anda**\nInstal [Tailscale](https://tailscale.com/download) di perangkat yang ingin Anda gunakan untuk mengakses OpenClaw (macOS, Windows, iOS, Android, Linux), dan login dengan akun Tailscale yang sama yang digunakan untuk membuat Auth Key.\n\n**Langkah 4: Login pertama ke Web UI**\nSetelah dimulai, buka di browser (harus di perangkat tailnet yang sama):\n```\nhttps://<TS_HOSTNAME>.<tailnet-anda>.ts.net\n```\nNama DNS tailnet Anda dapat ditemukan di [Tailscale Admin Console → DNS](https://login.tailscale.com/admin/dns), atau periksa URL lengkap di **Log** layanan pada dashboard Zeabur.\n\nLogin menggunakan salah satu cara:\n- Tambahkan token ke URL: `https://<TS_HOSTNAME>.<tailnet-anda>.ts.net?token=<GATEWAY_TOKEN>`\n- Atau masukkan Gateway Token di halaman **Overview** Web UI\n\nGateway Token dapat ditemukan di tab **Instructions** atau **Environment Variables** dashboard Zeabur (`OPENCLAW_GATEWAY_TOKEN`).\n\n**Langkah 5: Menghubungkan OpenClaw app (Opsional, contoh macOS)**\n1. Instal [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) dan Tailscale di Mac Anda\n2. Buka OpenClaw app → **Settings → General** → pilih mode **Remote**\n3. Atur Transport ke **Direct (ws/wss)**\n4. Atur Gateway URL ke `wss://<TS_HOSTNAME>.<tailnet-anda>.ts.net`\n5. Koneksi pertama memerlukan persetujuan pairing — buka halaman **Nodes** di Web UI dan klik approve\n\nUntuk pengaturan iOS dan Android, lihat [dokumentasi resmi](https://docs.openclaw.ai/platforms).\n\n**Kembali ke mode domain publik:**\nUbah perintah startup kembali ke `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` dan restart.\n\n## Konfigurasi Khusus Zeabur\nTemplate ini mengonfigurasi pengaturan berikut untuk lingkungan cloud Zeabur:\n\n- **`gateway.trustedProxies`**: Diatur ke `[\"10.0.0.0/8\", \"172.16.0.0/12\"]` agar gateway dapat mengidentifikasi IP klien dengan benar di belakang reverse proxy Zeabur. Tanpa ini, Web UI mungkin menampilkan error \"device identity required\".\n- **`dangerouslyDisableDeviceAuth`**: Menonaktifkan pemasangan perangkat Web UI (pemasangan perangkat dirancang untuk jaringan lokal; deployment cloud menggunakan autentikasi Gateway Token).\n- **Symlink `/usr/local/bin`**: Perintah `openclaw`, `backup`, dan `restore` di-symlink ke `/usr/local/bin` agar berfungsi di terminal **Perintah** Zeabur.\n- **`OPENCLAW_DISABLE_BONJOUR=1`**: Menonaktifkan mDNS/Bonjour karena nama host container Zeabur dapat melebihi batas label DNS 63 byte. mDNS hanya digunakan untuk penemuan jaringan lokal dan tidak diperlukan di lingkungan cloud.\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**: Memperbaiki masalah koneksi Telegram di lingkungan container (diperlukan untuk versi image `2026.2.17` dan setelahnya).\n\n## Dokumentasi\n- Dokumentasi: https://docs.openclaw.ai\n- GitHub: https://github.com/openclaw/openclaw\n\n## Catatan Perubahan\n**2026/3/4**\n- Upgrade image ke `2026.3.2` — tool PDF, embedding Ollama, streaming Telegram default ke `partial`, endpoint kesehatan container (`/healthz`), transport WebSocket OpenAI, 200+ perbaikan dan 20+ penguatan keamanan di 3 rilis (2026.3.1, 2026.3.2)\n- ⚠️ Perubahan tidak kompatibel: plugin yang menggunakan `api.registerHttpHandler(...)` harus migrasi ke `api.registerHttpRoute(...)`, channel Zalouser memerlukan login ulang (`openclaw channels login --channel zalouser`)\n\n**2026/3/2**\n- Tambah model: `claude-opus-4-6`, `minimax-m2.5`, `step-3.5-flash`\n- Ganti model: `llama-3.3-70b` → `llama-3.1-8b`, `qwen-3-32` → `qwen-3-235b`\n- Perbaiki rotasi API key: mengubah `ZEABUR_AI_HUB_API_KEY` dan restart sekarang berlaku (hapus `envsubst`, resolusi `${VAR}` saat runtime)\n- Config provider disinkronkan dari `/opt` setiap startup — pembaruan model template dan edit Configs berlaku setelah restart\n- Tambah catatan keamanan dengan panduan `OPENCLAW_GATEWAY_BIND=loopback`\n\n**2026/2/27**\n- Tambah `dangerouslyDisableDeviceAuth` — gunakan autentikasi Gateway Token menggantikan pemasangan perangkat untuk deployment cloud\n- Model default: `zeabur-ai/glm-4.7-flash` dengan rantai failover (grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini)\n- Tambah dokumentasi pergantian model, failover, dan provider eksternal\n- Bersihkan variabel lingkungan (pindahkan nilai default ke skrip startup)\n- Migrasi otomatis konfigurasi yang ada (trustedProxies, pengaturan autentikasi)\n- Upgrade image ke `2026.2.26` — perbaikan pewarisan allowlist DM Telegram, perbaikan izin temp dir di container, perbaikan CLI gateway `--force` di Docker non-root, normalisasi ID model Gemini, dan penguatan keamanan tambahan\n\n**2026/2/26**\n- Upgrade image ke `2026.2.25` — 100+ perbaikan keamanan dari 2026.2.23→2026.2.25, provider baru (Kilo Gateway, Mistral, Volcano Engine), konfigurasi heartbeat `directPolicy`, penguatan autentikasi WebSocket gateway, isolasi routing lintas channel, keandalan Discord voice DAVE, perbaikan webhook Telegram hang, dan banyak peningkatan stabilitas\n\n**2026/2/24**\n- Upgrade image ke `2026.2.23` — mencakup 30+ perbaikan keamanan, provider baru (Kilo Gateway, Mistral, Volcano Engine), konfigurasi streaming channel terpadu, frasa stop multibahasa, pemfilteran reasoning/thinking di semua channel, dan banyak peningkatan stabilitas\n- Menambahkan `dangerouslyAllowHostHeaderOriginFallback` ke konfigurasi Control UI — diperlukan untuk deployment non-loopback sejak 2026.2.23\n\n**2026/2/22**\n- Mengganti health check dengan wrapper restart otomatis: gateway restart otomatis saat crash, menampilkan halaman bantuan dengan detail error dan langkah perbaikan (deteksi pemulihan layanan setiap 5 detik)\n- Menghapus mode penyelamatan (`rescue.sh`) — digantikan oleh halaman bantuan\n\n**2026/2/20**\n- Menetapkan tag image ke `2026.2.19` — menambahkan variabel `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` untuk memperbaiki masalah koneksi Telegram (diperlukan untuk versi image `2026.2.17` dan setelahnya)\n\n**2026/2/16**\n- Mengubah tag image ke `latest` untuk mengikuti perbaikan keamanan yang cepat\n\n**2026/2/15**\n- Menambahkan akses jaringan pribadi Tailscale: pengguna dapat beralih ke `start_gateway_tailscale.sh` untuk akses HTTPS pribadi via tailnet tanpa diekspos ke internet publik\n- Memperbarui image ke `2026.2.14`\n\n**2026/2/10**\n- Memperbaiki skill pembuatan gambar: beralih ke API `/v1/chat/completions`, model default ke `gemini-2.5-flash-image`\n- Memperbaiki HTTP 500 pada `gpt-oss-120b`, `llama-3.3-70b`, `qwen-3-32`: menambahkan pengaturan kompatibilitas `supportsStore: false`\n- Memperbaiki flag reasoning `gpt-oss-120b` (diatur ke `true`)\n- Script restore mendukung format `.zip` (layanan backup Zeabur)\n- Sinkronisasi variabel lingkungan saluran (`TELEGRAM_BOT_TOKEN`, `DISCORD_BOT_TOKEN`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `LINE_CHANNEL_ACCESS_TOKEN`, `LINE_CHANNEL_SECRET`) ke file konfigurasi saat startup\n\n**2026/2/7**\n- Memperbaiki notifikasi proaktif cron: mendeteksi otomatis saluran yang dikonfigurasi sebagai target pengiriman heartbeat saat startup\n- Menginisialisasi HEARTBEAT.md dengan konten yang dapat dieksekusi untuk deployment baru (mencegah heartbeat dilewati karena file kosong)\n\n**2026/2/4**\n- Menggunakan Zeabur configs untuk skrip startup (lebih mudah dipelihara)\n- Menambah perintah global `backup` dan `restore`\n- Menambah wrapper restart otomatis dengan halaman fallback untuk pemulihan crash gateway\n- Menambah 6 model Zeabur AI Hub baru: gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Menambah pengaturan kompatibilitas store untuk model Claude Zeabur AI Hub\n\n**2026/2/2**\n- Tambah bagian konfigurasi model AI (global vs percakapan)\n- Tambah bagian cadangan & pemulihan dengan layanan Zeabur\n- Tambah tips untuk membuat cadangan setelah pengaturan awal\n- Hapus patch Google Gemini CLI (sudah diperbaiki di upstream)\n- Hapus variabel ANTHROPIC_API_KEY dan OPENAI_API_KEY dari deployment untuk mencegah OpenClaw mendeteksi API Key kosong dan gagal (dapat dikonfigurasi nanti via Web UI atau variabel lingkungan)\n"
    ja-JP:
        description: "OpenClaw \U0001F99E（旧 Clawdbot、Moltbot）は、ローカルで実行され、WebSocket ベースの Gateway アーキテクチャを介して複数のメッセージングプラットフォーム（WhatsApp、Telegram、Slack、Discord など）に接続する個人用 AI アシスタントです。"
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: ドメイン
              description: OpenClaw にバインドするドメインは？
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API キー（推奨）
              description: Zeabur AI Hub API キー、AI Hub 経由で Gemini/GPT/Claude/DeepSeek を使用（任意、後で設定可能）
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（旧 Clawdbot、Moltbot）は、ローカルで実行され、WebSocket ベースの Gateway アーキテクチャを介して複数のメッセージングプラットフォームに接続する個人用 AI アシスタントです。\n\n⚠️ 本テンプレートは `ghcr.io/openclaw/openclaw:2026.3.2` を使用しています。OpenClaw \U0001F99E は急速に開発中のため、未発見のバグがある可能性があります。バージョンを変更した場合も安定性を保証できません。\n\n⚠️ 問題が発生した場合は、[GitHub issues](https://github.com/openclaw/openclaw/issues) で解決策を探したり、新しい問題を報告したりしてください。Zeabur プラットフォーム関連の問題については、Zeabur サポートにお問い合わせください。\n\n⚠️ macOS 固有のソフトウェアやパッケージ（Homebrew など）はこのコンテナ環境ではサポートされていません。代替ソリューションをお探しください。\n\n⚠️ このテンプレートは Zeabur の[専用サーバー](https://zeabur.com/docs/dedicated-server)が必要です。共有クラスターでは実行できません。\n\n⚠️ 本テンプレートは事前設定済みですぐに使用できます。`openclaw onboard` を実行する必要はありません。再設定する場合は、Zeabur ダッシュボードの**コマンド**から実行してください：\n```bash\nopenclaw onboard --gateway-bind lan\n```\n全フラグは [Wizard Reference](https://docs.openclaw.ai/reference/wizard) を参照してください。\n\n---\n\n## 推奨リソース\n- **最小構成**：2 vCPU / 4 GB RAM\n- **推奨構成**：4 vCPU / 8 GB RAM\n\n## 機能拡張\n- **ブラウザ**：ブラウザ機能（Web ブラウジング、スクリーンショットなど）が必要な場合は、[Browser テンプレート](https://zeabur.com/templates/H8L4G1)をデプロイしてください\n- **Devbox**：多言語コード実行（Python、Go、Rust、C/C++）が必要な場合は、[Devbox テンプレート](https://zeabur.com/templates/ZBVZNH)を同じプロジェクトにデプロイしてください\n\n## 使用方法\n1. デプロイ後、**指示**タブの「Web UI (with token)」URL をコピーしてブラウザに貼り付けて開く\n2. **AI モデルを設定**（いずれかを選択）：\n   - **Zeabur AI Hub**（デフォルトモデル：`glm-4.7-flash`）：デプロイ時に API Key を入力済みの場合、ステップ 3 へ進む。後から Zeabur ダッシュボードの**変数**タブで `ZEABUR_AI_HUB_API_KEY` を追加も可能（追加後はサービスを再起動）。\n   - **他のプロバイダー**（Anthropic、OpenAI など）：Zeabur AI Hub API Key を入力しなかった場合、デフォルトモデルは `anthropic/claude-opus-4-6` です。Web UI Settings または環境変数で API キーを追加してください。詳細：https://docs.openclaw.ai/providers/anthropic\n3. **Chat** ページで AI モデルが正常に動作しているかテスト\n4. （オプション）Telegram、WhatsApp などのメッセージングプラットフォームを設定\n\nAI モデル設定については[公式ドキュメント](https://docs.openclaw.ai/providers)をご覧ください。\n\n### モデル切り替えと Failover\nこのテンプレートにはフェイルオーバーモデルが含まれており、プライマリモデルが利用できない場合に自動的に切り替わります。デフォルトチェーン：`glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`。\n\n**Web UI Chat** または Zeabur ダッシュボードの**コマンド**からモデルを管理できます。\n\n**Web UI Chat から** — チャットボックスに slash command を直接入力：\n- `/model zeabur-ai/glm-4.7-flash` — プライマリモデルを変更\n- `/model` — 現在のモデルを確認\n- `/models` — モデルプロバイダー一覧\n- `/models <provider>` — 指定プロバイダーのモデル一覧（例：`/models zeabur-ai`）\n\n**コマンドから**（Zeabur ダッシュボード）— ターミナルで同じコマンドを実行：\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**または設定ファイルを直接編集**（`~/.openclaw/config.json5`）：\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\n設定ファイル編集後はサービスを再起動してください。\n\n### 外部モデルプロバイダーの追加\nZeabur AI Hub 以外に、Anthropic、OpenAI、Google などの外部プロバイダーを追加できます。\n\n**方法 1：環境変数** — Zeabur ダッシュボードの**変数**タブで API キーを追加：\n- `ANTHROPIC_API_KEY` — Claude モデル\n- `OPENAI_API_KEY` — GPT モデル\n- `GOOGLE_API_KEY` — Gemini モデル\n\n追加後サービスを再起動し、モデルを切り替え：\n- Web UI Chat：`/model anthropic/claude-opus-4-6`\n- コマンド：`openclaw models set anthropic/claude-opus-4-6`\n\n**方法 2：Auth token** — Zeabur ダッシュボードの**コマンド**を開く：\n```bash\n# プロバイダーの API キーを貼り付け\nopenclaw models auth paste-token --provider anthropic\n\n# またはインタラクティブ認証ヘルパーを使用\nopenclaw models auth add\n```\n\n**方法 3：設定ファイル** — `~/.openclaw/config.json5` を編集：\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\n対応プロバイダーの一覧は[公式ドキュメント](https://docs.openclaw.ai/providers)をご覧ください。\n\n## Telegram ボット設定\n**BotFather からトークンを取得：**\n1. Telegram を開いて [@BotFather](https://t.me/BotFather) を検索\n2. `/newbot` を送信して新しいボットを作成\n3. プロンプトに従ってボットの名前とユーザー名を設定\n4. BotFather がトークンを送信します（例：`123456789:ABCdefGHIjklMNOpqrsTUVwxyz`）\n\n**Zeabur にトークンを追加：**\n1. Zeabur ダッシュボードのサービス**変数**タブに移動\n2. `TELEGRAM_BOT_TOKEN` を追加してトークンを入力\n3. サービスを再起動\n4. 再起動後、Telegram プラグインが自動的に有効化されます。ボットが起動しない場合は、**Settings → Config** でプラグインが有効になっているか確認してください：`\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`。無効にするには `enabled` を `false` に設定します。\n\n**Telegram アカウントのペアリング：**\n1. Telegram でボットに `/start` を送信\n2. ボットがペアリングコードを返信（例：`JN4MSY23`）\n3. 以下のいずれかの方法でペアリングを承認：\n   - **Web Chat**：OpenClaw のウェブインターフェースのチャットボックスに `openclaw pairing approve telegram <コード>` を入力\n   - **ターミナル**：Zeabur ダッシュボードの**コマンド**を開き、`openclaw pairing approve telegram <コード>` を実行\n4. `Approved telegram sender <user-id>.` と表示されればペアリング完了\n5. ボットとの会話を開始できます！\n\n## WhatsApp セットアップ\n**ステップ 1：WhatsApp チャンネルを設定**\nOpenClaw Web UI（Settings → Config）またはチャットに貼り付けて以下の設定を追加：\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\n`+15551234567` をあなたの WhatsApp 電話番号（国番号付き）に置き換えてください。保存後にサービスを再起動してください。\n\n**ステップ 2：WhatsApp をリンク**\n1. Zeabur ダッシュボードで**コマンド**を開いてコンテナターミナルにアクセス\n2. 実行：`openclaw channels login`\n3. QR コードが表示されます - スマートフォンの WhatsApp でスキャンしてください\n4. 接続完了！WhatsApp で自分自身にメッセージを送ると OpenClaw と会話できます\n\n## LINE ボット設定\n**LINE Messaging API チャンネルの作成：**\n1. [LINE 公式アカウント](https://entry.line.biz/)をまだ作成していない場合は、先に作成してください\n2. [LINE Developers Console](https://developers.line.biz/console/) にアクセス\n3. **Provider** を作成または選択\n4. 新しい **Messaging API** チャンネルを作成し、LINE 公式アカウントにリンク\n4. **Messaging API** タブで **Channel access token**（長期有効）を発行\n5. **Basic settings** タブで **Channel secret** をコピー\n\n**Zeabur に認証情報を追加：**\n1. Zeabur ダッシュボードのサービス**変数**タブに移動\n2. `LINE_CHANNEL_ACCESS_TOKEN` を追加して Channel access token を入力\n3. `LINE_CHANNEL_SECRET` を追加して Channel secret を入力\n4. サービスを再起動\n5. 再起動後、LINE プラグインが自動的に有効化されます。ボットが起動しない場合は、**Settings → Config** でプラグインが有効になっているか確認してください：`\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**Webhook の設定：**\n1. 再起動後、Webhook URL は `https://<your-domain>/line/webhook` です\n2. [LINE Developers Console](https://developers.line.biz/console/) でチャンネルの **Messaging API** タブに移動\n3. **Webhook URL** を `https://<your-domain>/line/webhook` に設定\n4. **Use webhook** を有効化\n5. （推奨）LINE 公式アカウントマネージャーで**自動応答メッセージ**と**あいさつメッセージ**を無効化\n\n**LINE アカウントのペアリング：**\n1. LINE でボットを友だち追加し、任意のメッセージを送信\n2. ボットがペアリングコードを返信（例：`JN4MSY23`）\n3. 以下のいずれかの方法でペアリングを承認：\n   - **Web Chat**：OpenClaw のウェブインターフェースのチャットボックスに `openclaw pairing approve line <コード>` を入力\n   - **ターミナル**：Zeabur ダッシュボードの**コマンド**を開き、`openclaw pairing approve line <コード>` を実行\n4. `Approved line sender <user-id>.` と表示されればペアリング完了\n5. LINE でボットとの会話を開始できます！\n\nその他のメッセージングプラットフォーム（Discord、Slack など）については、[Channels ドキュメント](https://docs.openclaw.ai/channels)をご覧ください。\n\n## AI モデル設定\n\n**セットアップの確認：**\n1. デフォルトモデルはデプロイ方法に依存します：\n   - Zeabur AI Hub API Key を入力した場合 → デフォルトモデル：`zeabur-ai/glm-4.7-flash`\n   - 入力しなかった場合 → デフォルトモデル：`anthropic/claude-opus-4-6`（API キーが必要）\n2. **Chat** ページを開き、テストメッセージを送信\n3. 返答があれば → モデルは正常に動作しています\n4. エラーが出た場合 → API キーが正しく設定されているか確認\n\n**現在の会話のモデルを切り替え**（チャットコマンドで）：\n- `/models` - 利用可能なモデルを表示\n- `/model <model-id>` - この会話のみモデルを切り替え（他の会話には影響しません）\n\n**全ての新しい会話のデフォルトモデルを変更**（Web UI Settings で）：\n- Settings → Agents → Default model\n- **ヒント：** 低コストのモデルをデフォルトに設定しましょう（例：`gemini-2.5-flash-lite`、`gpt-5-nano`）。モデルが使用できなくなった場合、`/new` で新しい会話を開始すればデフォルトモデルに自動的に戻ります。\n\n**AI プロバイダーを追加**（Web UI Settings または環境変数で）：\n- 他の AI プロバイダーの API キーを追加（例：Anthropic、OpenAI）\n- 詳細：https://docs.openclaw.ai/providers\n\n**Zeabur AI Hub モデルを変更**（Zeabur ダッシュボードで）：\n- **設定** → **設定ファイル** → `/opt/openclaw/providers/zeabur-ai-hub.json5` を編集し、サービスを再起動（変更は起動時に同期されます）\n- 旧バージョン（コマンドなし）：**ファイル** タブまたは Web UI Settings で `/home/node/.openclaw/openclaw.json` を編集。以下を `models.providers.zeabur-ai.models` 配列に追加：\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## セキュリティに関する注意\nWeb UI は設定、監視、チャットのための管理ツールです — メッセージングプラットフォーム（Telegram、WhatsApp、Discord など）は Web UI なしで独立して動作します。インバウンド Webhook が不要なプラットフォーム（Telegram、WhatsApp、Discord、Signal、iMessage）のみを使用する場合は、Zeabur ダッシュボードの**ネットワーク**タブでドメインバインディングを削除し、Gateway をパブリックインターネットに公開しないようにできます。すべての管理操作は Zeabur の**コマンド**ターミナルで CLI を使って実行できます（`openclaw config set`、`openclaw models set` など）。パブリックドメインなしで Web UI にアクセスするには、[Tailscale プライベートネットワークアクセス](#tailscale-プライベートネットワークアクセスオプション)を参照してください。さらに、**変数**タブで `OPENCLAW_GATEWAY_BIND` を `loopback` に設定し（設定後サービスを再起動）、Gateway をローカル接続のみに制限することもできます。\n\nパブリックドメインが**必要**なプラットフォーム（インバウンド Webhook）：LINE、Slack、Google Chat。\n\n## データ永続化\nすべてのデータは `/home/node` に保存：\n- `/home/node/.openclaw` - 設定、セッション、デバイス、認証情報\n- `/home/node/.openclaw/workspace` - ワークスペースとメモリファイル\n\n## バックアップと復元\n\U0001F4A1 **ヒント：** 初期設定完了後や重要な設定変更後にバックアップを作成することをお勧めします。\n\n**バックアップ：**\n- **方法1：Zeabur バックアップサービス（推奨）** - Zeabur の組み込みバックアップ機能を使用。[Zeabur バックアップドキュメント](https://zeabur.com/docs/ja-JP/data-management/backup)を参照。\n- **方法2：手動バックアップ** - **コマンド**を開く → `backup` を実行 → **ファイル**タブの `/home/node` からダウンロード（例：`backup-1430.tar.gz`）\n  - 旧バージョン（コマンドなし）：`cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**復元：**\n1. **ファイル**タブでバックアップファイルを `/home/node` フォルダにアップロード\n2. **コマンド**を開いて実行：\n   - Zeabur バックアップサービスのファイル：`restore <バックアップファイル名> --strip 2`（例：`restore data-2026-02-27.zip --strip 2`）\n   - 手動バックアップのファイル：`restore <バックアップファイル名>`（例：`restore backup-1430.tar.gz`）\n   - 旧バージョン（コマンドなし）：`cd /home/node && tar -xzvf <バックアップファイル名>`\n3. **ファイル**タブで `/home/node` にアップロードしたバックアップファイルを削除し、ディスク容量を解放\n4. サービスを再起動\n\n⚠️ 復元すると、新サービス上の既存の設定とデータが上書きされます。関連する環境変数（例：`TELEGRAM_BOT_TOKEN`）も忘れずに設定してください。チャンネルのバックアップ復元は現在 Telegram と WhatsApp でのみテスト済みです。\n\n## トラブルシューティング\n\n> デフォルトの起動コマンド：`/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### 新規デプロイ（ヘルパーページあり）\nGateway が停止すると、サービスURLにエラー情報と修復手順を含むヘルパーページが表示されます：\n1. **エラーログ**を確認 — ヘルパーページに最近のログが表示されます。完全なログは Zeabur Dashboard の**ログ**タブで確認\n2. 設定ファイルを修正 — Zeabur Dashboard の**ファイル**タブで設定ファイル（`/home/node/.openclaw/openclaw.json`）を見つけて問題を修正\n3. Zeabur Dashboard で**再起動**をクリックして修正を適用\n\n### 既存のデプロイ（ヘルパーページなし）\nヘルパーページがないデプロイの場合は、以下の手順に従ってください：\n1. Zeabur Dashboard の**ログ**タブでエラーを確認\n2. **設定** → **コマンド**で起動コマンドを `sleep 3600` に変更し、**再起動**をクリック — コンテナが稼働し続けるため、ファイルを編集できます\n3. 設定ファイルを修正 — **ファイル**タブで設定ファイル（`/home/node/.openclaw/openclaw.json`）を見つけて問題を修正\n4. 起動コマンドを `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` に戻し、**再起動**をクリック\n\n> \U0001F4A1 ヘルパーページを有効にするには、このテンプレートから再デプロイしてください。\n\n### OpenClaw バージョンの更新\n1. [OpenClaw releases](https://github.com/openclaw/openclaw/releases) で最新バージョンを確認\n2. Zeabur Dashboard で**設定** → **サービスイメージソース**へ移動\n3. イメージ：`ghcr.io/openclaw/openclaw`、タグ：現在のバージョン（例：`2026.2.26`）から新バージョン（例：`2026.3.2`）に変更\n4. **再起動**をクリックして適用\n\n> ⚠️ タグに `latest` の使用は避けてください — 再起動のたびに最新バージョンが取得され、破壊的な変更や予期しないエラーが発生する可能性があります。安定性のために特定のバージョンを固定してください。\n5. **ログ**タブで Gateway が正常に起動したか確認\n\n> \U0001F4A1 スタートアップスクリプトは起動時に設定を自動移行します — 不足している設定（`trustedProxies`、`dangerouslyDisableDeviceAuth` など）は自動追加されます。既存の設定は上書きされません。\n\n### \"device identity required\"\nWeb UI がまだ Gateway Token とペアリングされていないことを意味します。修正方法：\n- **方法 1：** Zeabur Dashboard の**手順**タブで **Web UI (with Token)** URL をコピーしてブラウザで開く\n- **方法 2：** Web UI の **Overview** ページを開き、Gateway Token を入力\n\nGateway Token は Zeabur Dashboard の**手順**タブまたは**環境変数**（`OPENCLAW_GATEWAY_TOKEN`）で確認できます。\n\n### \"disconnected (1008): pairing required\"\nお使いのデバイス（ブラウザ/アプリ）がまだ Gateway とペアリングされていないことを意味します。ペアリング方法：\n1. Web UI を開き、Gateway Token 認証を完了します（上記を参照）\n2. Zeabur ダッシュボードの**コマンド**を開いてターミナルにアクセスし、以下を実行：\n   - `openclaw devices list` — ペアリング待ちのリクエストを確認し、`requestId` を取得\n   - `openclaw devices approve <requestId>` — デバイスを承認\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\nイメージを `2026.2.23` 以降にアップグレードした際、設定ファイルを更新しないとこのエラーが発生します。修正方法：`/home/node/.openclaw/openclaw.json` を編集し、`gateway.controlUi` に `\"dangerouslyAllowHostHeaderOriginFallback\": true` を追加：\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\nその後、サービスを再起動してください。このテンプレートからの新規デプロイにはこの設定が含まれています。\n\n## Tailscale プライベートネットワークアクセス（オプション）\n> ⚠️ この機能は新規デプロイのみに対応しています。旧バージョンのデプロイには Tailscale 起動スクリプトが含まれていないため、この機能を使用するにはテンプレートを再デプロイしてください。\n\nパブリックドメインの代わりに、[Tailscale](https://tailscale.com) を使用して OpenClaw をプライベートネットワーク（tailnet）内のみでアクセス可能にできます。パブリックインターネットへの公開は不要です。\n\n**前提条件：**\n- Tailscale アカウント（無料プランで OK）\n- [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) で Auth Key を作成（Reusable + Ephemeral 推奨）\n\n**ステップ 1：環境変数を設定**\nZeabur ダッシュボードの**環境変数**タブで追加：\n- `TS_AUTHKEY`（必須）：Tailscale Auth Key（`tskey-auth-xxx`）。[Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys) で作成してください。未設定の場合、Tailscale セットアップは完全にスキップされます。\n- `TS_HOSTNAME`（任意）：tailnet 上のマシン名で、アクセス URL を決定します（`https://<TS_HOSTNAME>.<tailnet>.ts.net`）。未設定の場合、デフォルトは `openclaw` です。\n\n**ステップ 2：起動コマンドを切替**\n**設定** → **コマンド** で以下に変更：\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\nサービスを再起動します。\n\n**ステップ 3：デバイスに Tailscale をインストール**\nOpenClaw にアクセスするデバイスに [Tailscale](https://tailscale.com/download) をインストールし（macOS、Windows、iOS、Android、Linux）、Auth Key を作成した同じ Tailscale アカウントでログインしてください。\n\n**ステップ 4：Web UI に初回ログイン**\n起動後、ブラウザで開きます（同じ tailnet のデバイスで）：\n```\nhttps://<TS_HOSTNAME>.<your-tailnet>.ts.net\n```\ntailnet DNS 名は [Tailscale 管理コンソール → DNS](https://login.tailscale.com/admin/dns) で確認できます。完全な URL は Zeabur ダッシュボードのサービス**ログ**でも確認できます。\n\n以下のいずれかの方法でログインしてください：\n- URL にトークンを追加：`https://<TS_HOSTNAME>.<your-tailnet>.ts.net?token=<GATEWAY_TOKEN>`\n- Web UI の **Overview** ページで Gateway Token を入力\n\nGateway Token は Zeabur ダッシュボードの**手順**タブまたは**環境変数**（`OPENCLAW_GATEWAY_TOKEN`）で確認できます。\n\n**ステップ 5：OpenClaw アプリの接続（オプション、macOS の例）**\n1. Mac に [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) と Tailscale をインストール\n2. OpenClaw アプリ → **Settings → General** → **Remote** モードを選択\n3. Transport を **Direct (ws/wss)** に設定\n4. Gateway URL に `wss://<TS_HOSTNAME>.<your-tailnet>.ts.net` を入力\n5. 初回接続時はペアリング承認が必要です — Web UI の **Nodes** ページで approve をクリック\n\niOS と Android のセットアップについては、[公式ドキュメント](https://docs.openclaw.ai/platforms)を参照してください。\n\n**パブリックドメインモードに戻す：**\n起動コマンドを `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` に戻して再起動してください。\n\n## Zeabur 固有の設定\nこのテンプレートは Zeabur クラウド環境向けに以下の設定を事前構成しています：\n\n- **`gateway.trustedProxies`**：`[\"10.0.0.0/8\", \"172.16.0.0/12\"]` に設定。Gateway が Zeabur リバースプロキシ背後のクライアント IP を正しく識別できるようにします。未設定の場合、Web UI に「device identity required」エラーが表示される可能性があります。\n- **`dangerouslyDisableDeviceAuth`**：Web UI デバイスペアリングを無効化（デバイスペアリングはローカルネットワーク向けの機能で、クラウドデプロイでは代わりに Gateway Token 認証を使用）。\n- **`/usr/local/bin` シンボリックリンク**：`openclaw`、`backup`、`restore` コマンドが `/usr/local/bin` にシンボリックリンクされ、Zeabur の**コマンド**ターミナルで直接使用できます。\n- **`OPENCLAW_DISABLE_BONJOUR=1`**：mDNS/Bonjour を無効化。Zeabur コンテナのホスト名が 63 バイトの DNS ラベル制限を超える可能性があるため。mDNS はローカルネットワーク検出にのみ使用され、クラウド環境では不要です。\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**：コンテナ環境での Telegram 接続問題を修正（イメージバージョン `2026.2.17` 以降で必要）。\n\n## ドキュメント\n- ドキュメント：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 変更履歴\n**2026/3/4**\n- イメージを `2026.3.2` にアップグレード — PDF ツール、Ollama 埋め込み、Telegram ストリーミングデフォルトを `partial` に変更、コンテナヘルスエンドポイント（`/healthz`）、OpenAI WebSocket 優先トランスポート、3 リリース（2026.3.1、2026.3.2）にわたる 200 以上の修正と 20 以上のセキュリティ強化\n- ⚠️ 破壊的変更：`api.registerHttpHandler(...)` を使用するプラグインは `api.registerHttpRoute(...)` に移行が必要、Zalouser チャネルは再ログインが必要（`openclaw channels login --channel zalouser`）\n\n**2026/3/2**\n- モデル追加：`claude-opus-4-6`、`minimax-m2.5`、`step-3.5-flash`\n- モデル入替：`llama-3.3-70b` → `llama-3.1-8b`、`qwen-3-32` → `qwen-3-235b`\n- API キーローテーション修正：`ZEABUR_AI_HUB_API_KEY` 変更後、再起動で反映（`envsubst` を削除、ランタイムで `${VAR}` を解決）\n- Provider 設定ファイルを起動ごとに `/opt` から同期 — テンプレートのモデル更新や Configs 編集が再起動後に反映\n- セキュリティノートに `OPENCLAW_GATEWAY_BIND=loopback` のガイダンスを追加\n\n**2026/2/27**\n- `dangerouslyDisableDeviceAuth` を追加 — クラウドデプロイでデバイスペアリングの代わりに Gateway Token 認証を使用\n- デフォルトモデル：`zeabur-ai/glm-4.7-flash`、フェイルオーバーチェーン（grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini）\n- モデル切替、フェイルオーバー、外部プロバイダーのドキュメントを追加\n- 環境変数の整理（デフォルト値をスタートアップスクリプトに移動）\n- 既存設定の自動移行（trustedProxies、認証設定）\n- イメージを `2026.2.26` にアップグレード — Telegram DM allowlist 継承修正、コンテナ temp dir パーミッション修正、非 root Docker での CLI gateway `--force` 修正、Gemini model ID 正規化、追加のセキュリティ強化\n\n**2026/2/26**\n- イメージを `2026.2.25` にアップグレード — 2026.2.23→2026.2.25 で 100 以上のセキュリティ修正、新プロバイダー（Kilo Gateway、Mistral、Volcano Engine）、heartbeat `directPolicy` 設定、gateway WebSocket 認証強化、クロスチャネルルーティング分離、Discord 音声 DAVE の信頼性向上、Telegram webhook ハング修正、多数の安定性改善を含む\n\n**2026/2/24**\n- イメージを `2026.2.23` にアップグレード — 30 以上のセキュリティ修正、新プロバイダー（Kilo Gateway、Mistral、Volcano Engine）、統一チャネルストリーミング設定、多言語ストップフレーズ、全チャネルでの reasoning/thinking フィルタリング、多数の安定性改善を含む\n- Control UI 設定に `dangerouslyAllowHostHeaderOriginFallback` を追加 — 2026.2.23 以降、非 loopback デプロイに必須\n\n**2026/2/22**\n- ヘルスチェックを自動再起動ラッパーに置換：Gateway クラッシュ時に自動再起動し、エラー情報と修復手順を含むヘルパーページを表示（5秒ごとにサービス復旧を検出）\n- レスキューモード（`rescue.sh`）を削除 — ヘルパーページに置換\n\n**2026/2/20**\n- イメージタグを `2026.2.19` に固定 — `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` 環境変数を追加し Telegram 接続の問題を修正（イメージバージョン `2026.2.17` 以降で必要）\n\n**2026/2/16**\n- イメージタグを `latest` に切替、迅速なセキュリティ修正に追従するため\n\n**2026/2/15**\n- Tailscale プライベートネットワークアクセスを追加：`start_gateway_tailscale.sh` に切替で tailnet 経由のプライベート HTTPS アクセスが可能（パブリックインターネットへの公開不要）\n- イメージを `2026.2.14` にアップグレード\n\n**2026/2/10**\n- 画像生成 skill を修正：`/v1/chat/completions` API に切替、デフォルトモデルを `gemini-2.5-flash-image` に変更\n- `gpt-oss-120b`、`llama-3.3-70b`、`qwen-3-32` の HTTP 500 を修正：`supportsStore: false` 互換性設定を追加\n- `gpt-oss-120b` の reasoning フラグを修正（`true` に設定）\n- リストアスクリプトが `.zip` 形式に対応（Zeabur バックアップサービス）\n- 起動時にチャンネル環境変数（`TELEGRAM_BOT_TOKEN`、`DISCORD_BOT_TOKEN`、`SLACK_BOT_TOKEN`、`SLACK_APP_TOKEN`、`LINE_CHANNEL_ACCESS_TOKEN`、`LINE_CHANNEL_SECRET`）を設定ファイルに同期\n\n**2026/2/7**\n- cron スケジュールの通知が送信されない問題を修正：起動時に設定済みチャンネルを heartbeat 配信先として自動検出\n- 新規デプロイで HEARTBEAT.md を実行可能な内容で初期化（空ファイルによる heartbeat スキップを防止）\n\n**2026/2/4**\n- Zeabur configs でスタートアップスクリプトを管理（メンテナンスが容易に）\n- `backup` と `restore` グローバルコマンドを追加\n- 自動再起動ラッパーとフォールバックページを追加（Gateway クラッシュ時の自動復旧）\n- Zeabur AI Hub に 6 つのモデルを追加：gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Zeabur AI Hub の Claude モデルに store 互換性設定を追加\n\n**2026/2/2**\n- AI モデル設定セクションを追加（グローバル vs 会話ごとの設定）\n- バックアップと復元セクションを追加、Zeabur バックアップサービス対応\n- 初期設定完了後のバックアップ推奨を追加\n- Google Gemini CLI パッチを削除（上流で修正済み）\n- デプロイ時の ANTHROPIC_API_KEY と OPENAI_API_KEY 変数を削除、OpenClaw が空の API Key を検出して実行に失敗するのを防止（後で Web UI または環境変数から設定可能）\n"
    zh-CN:
        description: "OpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一个个人 AI 助手，可在本地运行并通过 WebSocket Gateway 架构连接多个消息平台（WhatsApp、Telegram、Slack、Discord 等）。"
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: 域名
              description: 您想要绑定 OpenClaw 的域名是？
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API 密钥（推荐）
              description: 您的 Zeabur AI Hub API 密钥，通过 AI Hub 使用 Gemini/GPT/Claude/DeepSeek（选填，可之后再设定）
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一个个人 AI 助手，可在本地运行并通过 WebSocket Gateway 架构连接多个消息平台。\n\n⚠️ 本模板使用 `ghcr.io/openclaw/openclaw:2026.3.2`。OpenClaw \U0001F99E 正在快速开发中，可能存在尚未发现的 bug。更改版本后也无法确保稳定性。\n\n⚠️ 如果遇到任何问题，欢迎到 [GitHub issues](https://github.com/openclaw/openclaw/issues) 寻找解决方案或回报新问题。Zeabur 平台相关问题请联系 Zeabur 支持。\n\n⚠️ macOS 特有的软件与套件（如 Homebrew）无法在此容器环境中使用，请寻找其他替代方案。\n\n⚠️ 此模板需要在 Zeabur 上使用[专用服务器](https://zeabur.com/docs/dedicated-server)，无法在共享集群上运行。\n\n⚠️ 本模板已预先配置好可直接使用，不需要运行 `openclaw onboard`。如果要重新配置，请在 Zeabur 控制台打开**命令**执行：\n```bash\nopenclaw onboard --gateway-bind lan\n```\n完整参数请参考 [Wizard Reference](https://docs.openclaw.ai/reference/wizard)。\n\n---\n\n## 建议资源配置\n- **最低配置**：2 vCPU / 4 GB RAM\n- **建议配置**：4 vCPU / 8 GB RAM\n\n## 功能扩充\n- **浏览器**：如需浏览器功能（网页浏览、截图等），请部署 [Browser 模板](https://zeabur.com/templates/H8L4G1)\n- **Devbox**：如需多语言程序执行（Python、Go、Rust、C/C++），请将 [Devbox 模板](https://zeabur.com/templates/ZBVZNH) 部署到同一个项目\n\n## 使用方式\n1. 部署完成后，在**使用说明**页签复制「Web UI (with token)」网址，贴到浏览器打开\n2. **设置 AI 模型**（二选一）：\n   - **Zeabur AI Hub**（默认模型：`glm-4.7-flash`）：若部署时已输入 API Key，直接前往步骤 3。也可之后在 Zeabur 控制台的**变量**页签添加 `ZEABUR_AI_HUB_API_KEY`（添加后记得重新启动服务）。\n   - **其他供应商**（Anthropic、OpenAI 等）：若未输入 Zeabur AI Hub API Key，默认模型为 `anthropic/claude-opus-4-6`。前往 Web UI Settings 或环境变量添加 API 密钥。详情请见：https://docs.openclaw.ai/providers/anthropic\n3. 前往 **Chat** 页面测试 AI 模型是否正常运作\n4. （可选）设置 Telegram、WhatsApp 等通讯平台\n\nAI 模型设置请参阅[官方文档](https://docs.openclaw.ai/providers)。\n\n### 模型切换与 Failover\n此模板内建 failover 模型，当主模型不可用时会自动切换。默认链：`glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`。\n\n可通过 **Web UI Chat** 或 Zeabur 控制台的**命令**管理模型。\n\n**通过 Web UI Chat** — 在对话框直接输入 slash command：\n- `/model zeabur-ai/glm-4.7-flash` — 切换主模型\n- `/model` — 查看当前模型\n- `/models` — 列出模型供应商\n- `/models <provider>` — 列出指定供应商的模型（例如 `/models zeabur-ai`）\n\n**通过命令**（Zeabur 控制台）— 在终端执行相同命令：\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**或直接编辑配置文件**（`~/.openclaw/config.json5`）：\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\n编辑配置文件后需重新启动服务。\n\n### 添加外部模型供应商\n除了 Zeabur AI Hub，您还可以添加 Anthropic、OpenAI、Google 等外部供应商。\n\n**方法一：环境变量** — 在 Zeabur 控制台的**变量**页签添加 API key：\n- `ANTHROPIC_API_KEY` — Claude 模型\n- `OPENAI_API_KEY` — GPT 模型\n- `GOOGLE_API_KEY` — Gemini 模型\n\n添加后重新启动服务，然后切换模型：\n- Web UI Chat：`/model anthropic/claude-opus-4-6`\n- 命令：`openclaw models set anthropic/claude-opus-4-6`\n\n**方法二：Auth token** — 在 Zeabur 控制台打开**命令**：\n```bash\n# 粘贴供应商的 API key\nopenclaw models auth paste-token --provider anthropic\n\n# 或使用交互式认证助手\nopenclaw models auth add\n```\n\n**方法三：配置文件** — 编辑 `~/.openclaw/config.json5`：\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\n所有支持的供应商请参阅[官方文档](https://docs.openclaw.ai/providers)。\n\n## Telegram 机器人设置\n**从 BotFather 获取 Token：**\n1. 打开 Telegram 并搜索 [@BotFather](https://t.me/BotFather)\n2. 发送 `/newbot` 创建新机器人\n3. 按照提示设置机器人的名称和用户名\n4. BotFather 会发送 Token 给您（例如 `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`）\n\n**将 Token 添加到 Zeabur：**\n1. 前往 Zeabur 控制台的服务**环境变量**页签\n2. 添加 `TELEGRAM_BOT_TOKEN` 并填入您的 Token\n3. 重新启动服务\n4. 重启后 Telegram 插件会自动启用。若机器人未启动，请前往 **Settings → Config** 确认插件已启用：`\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`。如需停用，将 `enabled` 设为 `false`。\n\n**配对您的 Telegram 账号：**\n1. 在 Telegram 向您的机器人发送 `/start`\n2. 机器人会回复配对码（例如 `JN4MSY23`）\n3. 使用以下任一方式核准配对：\n   - **网页 Chat**：在 OpenClaw 网页界面的对话框输入 `openclaw pairing approve telegram <配对码>`\n   - **终端**：在 Zeabur 控制台打开**命令**进入容器终端，执行 `openclaw pairing approve telegram <配对码>`\n4. 看到 `Approved telegram sender <user-id>.` 表示配对成功\n5. 现在可以开始与机器人对话了！\n\n## WhatsApp 设置\n**步骤 1：配置 WhatsApp 频道**\n通过 OpenClaw Web UI（Settings → Config）或贴到对话框添加以下配置：\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\n将 `+15551234567` 替换为您的 WhatsApp 电话号码（含国码）。保存后重新启动服务。\n\n**步骤 2：连接 WhatsApp**\n1. 在 Zeabur 控制台打开**命令**进入容器终端\n2. 执行：`openclaw channels login`\n3. 会出现 QR Code - 使用您手机上的 WhatsApp 扫描\n4. 连接完成！现在您可以在 WhatsApp 中给自己发消息来与 OpenClaw 对话\n\n## LINE 机器人设置\n**创建 LINE Messaging API 频道：**\n1. 若尚未创建 [LINE 官方账号](https://entry.line.biz/)，请先创建一个\n2. 前往 [LINE Developers Console](https://developers.line.biz/console/)\n3. 创建或选择一个 **Provider**\n4. 创建新的 **Messaging API** 频道，并关联您的 LINE 官方账号\n4. 在 **Messaging API** 页签中，签发 **Channel access token**（长期有效）\n5. 在 **Basic settings** 页签中，复制 **Channel secret**\n\n**将凭证添加到 Zeabur：**\n1. 前往 Zeabur 控制台的服务**环境变量**页签\n2. 添加 `LINE_CHANNEL_ACCESS_TOKEN` 并填入您的 Channel access token\n3. 添加 `LINE_CHANNEL_SECRET` 并填入您的 Channel secret\n4. 重新启动服务\n5. 重启后 LINE 插件会自动启用。若机器人未启动，请前往 **Settings → Config** 确认插件已启用：`\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**设置 Webhook：**\n1. 重启后，您的 Webhook URL 为：`https://<your-domain>/line/webhook`\n2. 在 [LINE Developers Console](https://developers.line.biz/console/) 中，前往频道的 **Messaging API** 页签\n3. 将 **Webhook URL** 设为 `https://<your-domain>/line/webhook`\n4. 启用 **Use webhook**\n5. （建议）在 LINE 官方账号管理后台关闭**自动回复消息**和**加入好友的欢迎消息**\n\n**配对您的 LINE 账号：**\n1. 在 LINE 上加机器人为好友并发送任意消息\n2. 机器人会回复配对码（例如 `JN4MSY23`）\n3. 使用以下任一方式核准配对：\n   - **网页 Chat**：在 OpenClaw 网页界面的对话框输入 `openclaw pairing approve line <配对码>`\n   - **终端**：在 Zeabur 控制台打开**命令**进入容器终端，执行 `openclaw pairing approve line <配对码>`\n4. 看到 `Approved line sender <user-id>.` 表示配对成功\n5. 现在可以在 LINE 上与机器人对话了！\n\n如需设置其他通讯平台（Discord、Slack 等），请参阅 [Channels 文档](https://docs.openclaw.ai/channels)。\n\n## AI 模型设置\n\n**确认模型是否正常运作：**\n1. 默认模型取决于部署方式：\n   - 有填 Zeabur AI Hub API Key → 默认模型：`zeabur-ai/glm-4.7-flash`\n   - 没有填 → 默认模型：`anthropic/claude-opus-4-6`（需要 API 密钥）\n2. 打开 **Chat** 页面，发送一条测试消息\n3. 如果收到回复 → 模型正常运作\n4. 如果出现错误 → 确认 API 密钥是否正确设置\n\n**切换本次对话的模型**（通过聊天命令）：\n- `/models` - 查看可用模型\n- `/model <model-id>` - 仅在本次对话中切换模型（不影响其他对话）\n\n**修改所有新对话的默认模型**（通过 Web UI Settings）：\n- 前往 Settings → Agents → Default model\n- **建议：** 将低费用的模型设为默认（如 `gemini-2.5-flash-lite`、`gpt-5-nano`）。当模型无法使用时，可用 `/new` 开启新对话，自动切回默认模型。\n\n**添加 AI 供应商**（通过 Web UI Settings 或环境变量）：\n- 添加其他 AI 供应商的 API 密钥（如 Anthropic、OpenAI 等）\n- 请见：https://docs.openclaw.ai/providers\n\n**修改 Zeabur AI Hub 模型**（通过 Zeabur 控制台）：\n- 前往**设置** → **配置文件** → 编辑 `/opt/openclaw/providers/zeabur-ai-hub.json5`，然后重新启动服务（变更会在启动时同步）\n- 旧版（没有这些命令）：通过**文件**页签或 Web UI Settings 编辑 `/home/node/.openclaw/openclaw.json`，将以下内容加入 `models.providers.zeabur-ai.models` 数组：\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## 安全提示\nWeb UI 是用于配置、监控与聊天的管理工具 — 消息平台（Telegram、WhatsApp、Discord 等）不需要 Web UI 也能独立运作。如果你只使用不需要 inbound webhook 的平台（Telegram、WhatsApp、Discord、Signal、iMessage），可以在 Zeabur 控制台的**网络**页签移除域名绑定，避免将 Gateway 暴露在公网上。所有管理操作也可以在 Zeabur 的**命令**终端通过 CLI 完成（`openclaw config set`、`openclaw models set` 等）。若需在不绑定公网域名的情况下访问 Web UI，请参考 [Tailscale 私有网络访问](#tailscale-私有网络访问可选)。也可以在**变量**页签将 `OPENCLAW_GATEWAY_BIND` 设为 `loopback`（设置后重新启动服务），进一步限制 Gateway 只接受本地连接。\n\n**需要**公网域名（inbound webhook）的平台：LINE、Slack、Google Chat。\n\n## 数据持久化\n所有数据存储在 `/home/node`：\n- `/home/node/.openclaw` - 配置、会话、设备和凭证\n- `/home/node/.openclaw/workspace` - 工作区和记忆文件\n\n## 备份与还原\n\U0001F4A1 **建议：** 在完成初始设置或进行重大配置变更后，建议先创建备份。\n\n**备份：**\n- **方法一：Zeabur 备份服务（推荐）** - 使用 Zeabur 内置的备份功能。请参阅 [Zeabur 备份文档](https://zeabur.com/docs/zh-CN/data-management/backup)。\n- **方法二：手动备份** - 打开**命令** → 执行 `backup` → 从**文件**页签的 `/home/node` 下载（例如 `backup-1430.tar.gz`）\n  - 旧版（没有这些命令）：`cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**还原：**\n1. 在**文件**页签将备份文件上传到 `/home/node` 文件夹\n2. 打开**命令**执行：\n   - Zeabur 备份服务的文件：`restore <备份文件名> --strip 2`（例如 `restore data-2026-02-27.zip --strip 2`）\n   - 手动备份的文件：`restore <备份文件名>`（例如 `restore backup-1430.tar.gz`）\n   - 旧版（没有这些命令）：`cd /home/node && tar -xzvf <备份文件名>`\n3. 在**文件**页签删除 `/home/node` 中已上传的备份文件，释放磁盘空间\n4. 重新启动服务\n\n⚠️ 还原会覆盖新服务上现有的配置和数据。记得也要将相关的环境变量（如 `TELEGRAM_BOT_TOKEN`）设置回去。Channel 的备份还原目前只测试过 Telegram 和 WhatsApp 可以成功还原。\n\n## 疑难排解\n\n> 默认启动命令：`/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### 全新部署（有辅助页面）\n当 Gateway 停止时，服务网址会显示辅助页面，包含错误信息与修复步骤：\n1. 查看**错误日志** — 辅助页面会直接显示最近的日志；完整日志请到 Zeabur Dashboard 的**日志**页签查看\n2. 修复配置文件 — 到 Zeabur Dashboard 的**文件**页签，找到配置文件（`/home/node/.openclaw/openclaw.json`）并修正问题\n3. 在 Zeabur Dashboard 点击**重新启动**应用修复\n\n### 旧版部署（无辅助页面）\n如果您的部署没有辅助页面，请按照以下步骤操作：\n1. 到 Zeabur Dashboard 的**日志**页签查看错误信息\n2. 前往**设置** → **命令**，将启动命令改为 `sleep 3600`，然后点击**重新启动** — 这样容器会持续运行，方便您编辑文件\n3. 修复配置文件 — 到**文件**页签，找到配置文件（`/home/node/.openclaw/openclaw.json`）并修正问题\n4. 将启动命令改回 `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`，然后点击**重新启动**\n\n> \U0001F4A1 如需启用辅助页面，请重新部署此模板。\n\n### 更新 OpenClaw 版本\n1. 到 [OpenClaw releases](https://github.com/openclaw/openclaw/releases) 查看最新版本\n2. 在 Zeabur Dashboard 前往**设置** → **服务镜像来源**\n3. 镜像：`ghcr.io/openclaw/openclaw`，标签：从当前版本（例如 `2026.2.26`）改为新版本（例如 `2026.3.2`）\n4. 点击**重新启动**以应用更新\n\n> ⚠️ 避免使用 `latest` 作为标签 — 它会在每次重启时拉取最新版本，可能引入破坏性变更或无法预期的错误。建议固定使用特定版本号以确保稳定性。\n5. 到**日志**页签确认 Gateway 正常启动\n\n> \U0001F4A1 启动脚本会在每次开机时自动迁移配置 — 若缺少新设置（如 `trustedProxies`、`dangerouslyDisableDeviceAuth`）会自动补上。既有设置不会被覆盖。\n\n### \"device identity required\"\n表示 Web UI 尚未与 Gateway Token 配对。修复方式：\n- **方法 1：** 在 Zeabur Dashboard 的**说明**页签，复制 **Web UI (with Token)** 网址并在浏览器打开\n- **方法 2：** 打开 Web UI 的 **Overview** 页面，输入 Gateway Token\n\nGateway Token 可在 Zeabur Dashboard 的**说明**页签或**环境变量**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\n### \"disconnected (1008): pairing required\"\n表示您的设备（浏览器/应用程序）尚未与 Gateway 完成配对。配对方式：\n1. 打开 Web UI 并完成 Gateway Token 认证（参见上方说明）\n2. 在 Zeabur 控制台打开**命令**进入终端，执行：\n   - `openclaw devices list` — 查看待配对的请求，找到 `requestId`\n   - `openclaw devices approve <requestId>` — 批准该设备\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\n升级镜像至 `2026.2.23` 或更新版本后，若未更新配置文件会出现此错误。修复方式：编辑 `/home/node/.openclaw/openclaw.json`，在 `gateway.controlUi` 下加入 `\"dangerouslyAllowHostHeaderOriginFallback\": true`：\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\n然后重新启动服务。从此模板新部署的服务已自动包含此设置。\n\n## Tailscale 私有网络访问（可选）\n> ⚠️ 此功能仅适用于全新部署。旧版部署不包含 Tailscale 启动脚本，请重新部署模板才能使用此功能。\n\n除了使用公开域名，您也可以通过 [Tailscale](https://tailscale.com) 让 OpenClaw 仅在您的私有网络（tailnet）中访问，无需暴露到公网。\n\n**前置需求：**\n- 一个 Tailscale 账号（免费方案即可）\n- 在 [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) 创建一组 Auth Key（建议勾选 Reusable + Ephemeral）\n\n**步骤 1：设置环境变量**\n在 Zeabur 控制台的**环境变量**标签页添加：\n- `TS_AUTHKEY`（必填）：您的 Tailscale Auth Key（`tskey-auth-xxx`）。前往 [Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys) 创建。未设置此变量时，Tailscale 设置会被完全跳过。\n- `TS_HOSTNAME`（可选）：在 tailnet 上的机器名称，决定您的访问网址（`https://<TS_HOSTNAME>.<tailnet>.ts.net`）。未设置时默认为 `openclaw`。\n\n**步骤 2：切换启动命令**\n前往**设置** → **启动命令**，改为：\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\n重新启动服务。\n\n**步骤 3：在本机安装 Tailscale**\n在您要访问 OpenClaw 的设备上安装 [Tailscale](https://tailscale.com/download)（macOS、Windows、iOS、Android、Linux），并使用创建 Auth Key 时的同一个 Tailscale 账号登录。\n\n**步骤 4：首次登录 Web UI**\n启动完成后，在浏览器打开（需在同一个 tailnet 的设备上）：\n```\nhttps://<TS_HOSTNAME>.<您的tailnet>.ts.net\n```\n您的 tailnet DNS 名称可在 [Tailscale 管理控制台 → DNS](https://login.tailscale.com/admin/dns) 查询，完整网址也可在 Zeabur 控制台的服务**日志**中确认。\n\n使用以下任一方式登录：\n- 在网址后加上 token：`https://<TS_HOSTNAME>.<您的tailnet>.ts.net?token=<GATEWAY_TOKEN>`\n- 或在 Web UI 的 **Overview** 页面输入 Gateway Token\n\nGateway Token 可在 Zeabur 控制台的**使用说明**标签页或**环境变量**中找到（`OPENCLAW_GATEWAY_TOKEN`）。\n\n**步骤 5：连接 OpenClaw app（可选，以 macOS 为例）**\n1. 在 Mac 上安装 [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) 和 Tailscale\n2. 打开 OpenClaw app → **Settings → General** → 选择 **Remote** 模式\n3. Transport 选择 **Direct (ws/wss)**\n4. Gateway URL 填入 `wss://<TS_HOSTNAME>.<您的tailnet>.ts.net`\n5. 设备首次连接时需要配对核准 — 在 Web UI 的 **Nodes** 页面点击 approve\n\niOS 和 Android 的设置请参阅[官方文档](https://docs.openclaw.ai/platforms)。\n\n**切换回公开域名模式：**\n将启动命令改回 `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` 并重新启动即可。\n\n## Zeabur 专属配置\n此模板针对 Zeabur 云端环境预先配置了以下设置：\n\n- **`gateway.trustedProxies`**：设为 `[\"10.0.0.0/8\", \"172.16.0.0/12\"]`，让 Gateway 能正确辨识 Zeabur 反向代理后的用户端 IP。未设置时，Web UI 可能会出现「device identity required」错误。\n- **`dangerouslyDisableDeviceAuth`**：停用 Web UI 设备配对（设备配对是为局域网设计的功能，云端部署改用 Gateway Token 验证）。\n- **`/usr/local/bin` 符号链接**：`openclaw`、`backup`、`restore` 命令已建立符号链接至 `/usr/local/bin`，可直接在 Zeabur 的**命令**终端中使用。\n- **`OPENCLAW_DISABLE_BONJOUR=1`**：停用 mDNS/Bonjour，因为 Zeabur 容器主机名称可能超过 63 bytes 的 DNS 标签限制。mDNS 仅用于局域网发现，云端环境中不需要。\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**：修复容器环境中的 Telegram 连接问题（`2026.2.17` 及之后的镜像版本需要）。\n\n## 文档\n- 文档：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 更新日志\n**2026/3/4**\n- 升级镜像至 `2026.3.2` — PDF 工具、Ollama 嵌入、Telegram 流式预设改为 `partial`、容器健康检查端点（`/healthz`）、OpenAI WebSocket 优先传输，横跨 3 个版本（2026.3.1、2026.3.2）共 200+ 修复及 20+ 安全加固\n- ⚠️ 破坏性变更：使用 `api.registerHttpHandler(...)` 的 plugin 须迁移至 `api.registerHttpRoute(...)`，Zalouser 频道须重新登录（`openclaw channels login --channel zalouser`）\n\n**2026/3/2**\n- 新增模型：`claude-opus-4-6`、`minimax-m2.5`、`step-3.5-flash`\n- 替换模型：`llama-3.3-70b` → `llama-3.1-8b`、`qwen-3-32` → `qwen-3-235b`\n- 修复 API key 更换：变更 `ZEABUR_AI_HUB_API_KEY` 后重启即可生效（移除 `envsubst`，改为 runtime 解析 `${VAR}`）\n- Provider 配置文件每次启动从 `/opt` 同步 — 模板模型更新和 Configs 编辑重启后即生效\n- 安全提示新增 `OPENCLAW_GATEWAY_BIND=loopback` 指引\n\n**2026/2/27**\n- 新增 `dangerouslyDisableDeviceAuth` — 云端部署改用 Gateway Token 验证，取代设备配对\n- 默认模型：`zeabur-ai/glm-4.7-flash`，备援链（grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini）\n- 新增模型切换、备援及外部 provider 说明文档\n- 清理环境变量（默认值移至启动脚本）\n- 自动迁移既有配置（trustedProxies、认证设置）\n- 升级镜像至 `2026.2.26` — Telegram DM allowlist 继承修复、容器 temp dir 权限修复、非 root Docker 中 CLI gateway `--force` 修复、Gemini model ID 规范化，及额外安全加固\n\n**2026/2/26**\n- 升级镜像至 `2026.2.25` — 跨 2026.2.23→2026.2.25 共 100+ 安全修复、新 provider（Kilo Gateway、Mistral、Volcano Engine）、heartbeat `directPolicy` 设置、gateway WebSocket 验证加固、跨频道路由隔离、Discord 语音 DAVE 可靠性、Telegram webhook 卡住修复，及大量稳定性改善\n\n**2026/2/24**\n- 升级镜像至 `2026.2.23` — 包含 30+ 安全修复、新 provider（Kilo Gateway、Mistral、Volcano Engine）、统一频道流式设定、多语言停止词、所有频道的 reasoning/thinking 过滤，及大量稳定性改善\n- Control UI 设定加入 `dangerouslyAllowHostHeaderOriginFallback` — 2026.2.23 起非 loopback 部署必须设定\n\n**2026/2/22**\n- 以自动重启机制取代健康检查：Gateway 崩溃时自动重启，并显示辅助页面提供错误信息与修复步骤，每 5 秒检测服务是否恢复\n- 移除救援模式（`rescue.sh`）— 已由辅助页面取代\n\n**2026/2/20**\n- 镜像标签固定为 `2026.2.19` — 新增 `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` 环境变量以修复 Telegram 连接问题（`2026.2.17` 及之后的版本需要）\n\n**2026/2/16**\n- 镜像标签切换为 `latest`，以跟上快速的安全性修复\n\n**2026/2/15**\n- 新增 Tailscale 私有网络访问：用户可切换至 `start_gateway_tailscale.sh`，通过 tailnet 私有 HTTPS 访问，无需暴露到公网\n- 镜像升级至 `2026.2.14`\n\n**2026/2/10**\n- 修复生图 skill：改用 `/v1/chat/completions` API，默认模型改为 `gemini-2.5-flash-image`\n- 修复 `gpt-oss-120b`、`llama-3.3-70b`、`qwen-3-32` HTTP 500：加入 `supportsStore: false` 兼容性设置\n- 修正 `gpt-oss-120b` reasoning 标记（设为 `true`）\n- 还原脚本支持 `.zip` 格式（Zeabur 备份服务）\n- 启动时将频道环境变量（`TELEGRAM_BOT_TOKEN`、`DISCORD_BOT_TOKEN`、`SLACK_BOT_TOKEN`、`SLACK_APP_TOKEN`、`LINE_CHANNEL_ACCESS_TOKEN`、`LINE_CHANNEL_SECRET`）同步写入配置文件\n\n**2026/2/7**\n- 修复 cron 排程无法主动发送通知：启动时自动检测已配置的频道作为 heartbeat 投递目标\n- 新部署自动初始化 HEARTBEAT.md 含可执行内容（避免空文件导致 heartbeat 被跳过）\n\n**2026/2/4**\n- 使用 Zeabur configs 管理启动脚本（更易维护）\n- 新增 `backup` 和 `restore` 全局命令\n- 新增自动重启机制与 fallback 页面，Gateway 崩溃时自动恢复\n- Zeabur AI Hub 新增 6 个模型：gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Zeabur AI Hub 的 Claude 模型加入 store 兼容性设置\n\n**2026/2/2**\n- 新增 AI 模型设置区块（全局 vs 本次对话设置）\n- 新增备份与还原区块，支持 Zeabur 备份服务\n- 新增初始设置完成后备份提醒\n- 移除 Google Gemini CLI patch（上游已修复）\n- 移除部署时的 ANTHROPIC_API_KEY 和 OPENAI_API_KEY 变量，避免 OpenClaw 检测到空的 API Key 然后执行失败（可之后通过 Web UI 或环境变量设置）\n"
    zh-TW:
        description: "OpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一個個人 AI 助手，可在本地運行並透過 WebSocket Gateway 架構連接多個訊息平台（WhatsApp、Telegram、Slack、Discord 等）。"
        variables:
            - key: PUBLIC_DOMAIN
              type: STRING
              name: 網域
              description: 您想要綁定 OpenClaw 的網域是？
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API 金鑰（推薦）
              description: 您的 Zeabur AI Hub API 金鑰，透過 AI Hub 使用 Gemini/GPT/Claude/DeepSeek（選填，可之後再設定）
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一個個人 AI 助手，可在本地運行並透過 WebSocket Gateway 架構連接多個訊息平台。\n\n⚠️ 本模板使用 `ghcr.io/openclaw/openclaw:2026.3.2`。OpenClaw \U0001F99E 正在快速開發中，可能存在尚未發現的 bug。更改版本後也無法確保穩定性。\n\n⚠️ 如果遇到任何問題，歡迎到 [GitHub issues](https://github.com/openclaw/openclaw/issues) 尋找解決方案或回報新問題。Zeabur 平台相關問題請聯繫 Zeabur 支援。\n\n⚠️ macOS 特有的軟體與套件（如 Homebrew）無法在此容器環境中使用，請尋找其他替代方案。\n\n⚠️ 此模板需要在 Zeabur 上使用[專用伺服器](https://zeabur.com/docs/dedicated-server)，無法在共享叢集上運行。\n\n⚠️ 本模板已預先設定好可直接使用，不需要執行 `openclaw onboard`。如果要重新設定，請在 Zeabur 控制台開啟**指令**執行：\n```bash\nopenclaw onboard --gateway-bind lan\n```\n完整參數請參考 [Wizard Reference](https://docs.openclaw.ai/reference/wizard)。\n\n---\n\n## 建議資源配置\n- **最低配置**：2 vCPU / 4 GB RAM\n- **建議配置**：4 vCPU / 8 GB RAM\n\n## 功能擴充\n- **瀏覽器**：如需瀏覽器功能（網頁瀏覽、截圖等），請部署 [Browser 模板](https://zeabur.com/templates/H8L4G1)\n- **Devbox**：如需多語言程式執行（Python、Go、Rust、C/C++），請將 [Devbox 模板](https://zeabur.com/templates/ZBVZNH) 部署到同一個專案\n\n## 使用方式\n1. 部署完成後，在**使用說明**頁籤複製「Web UI (with token)」網址，貼到瀏覽器開啟\n2. **設定 AI 模型**（二擇一）：\n   - **Zeabur AI Hub**（預設模型：`glm-4.7-flash`）：若部署時已輸入 API Key，直接前往步驟 3。也可之後在 Zeabur 控制台的**變數**頁籤新增 `ZEABUR_AI_HUB_API_KEY`（新增後記得重新啟動服務）。\n   - **其他供應商**（Anthropic、OpenAI 等）：若未輸入 Zeabur AI Hub API Key，預設模型為 `anthropic/claude-opus-4-6`。前往 Web UI Settings 或環境變數新增 API 金鑰。詳情請見：https://docs.openclaw.ai/providers/anthropic\n3. 前往 **Chat** 頁面測試 AI 模型是否正常運作\n4. （選擇性）設定 Telegram、WhatsApp 等通訊平台\n\nAI 模型設定請參閱[官方文件](https://docs.openclaw.ai/providers)。\n\n### 模型切換與 Failover\n此模板內建 failover 模型，當主模型不可用時會自動切換。預設鏈：`glm-4.7-flash` → `grok-4-fast-non-reasoning` → `minimax-m2.5` → `kimi-k2.5` → `qwen-3-235b` → `gpt-5-mini`。\n\n可透過 **Web UI Chat** 或 Zeabur 控制台的**指令**管理模型。\n\n**透過 Web UI Chat** — 在對話框直接輸入 slash command：\n- `/model zeabur-ai/glm-4.7-flash` — 切換主模型\n- `/model` — 查看目前模型\n- `/models` — 列出模型供應商\n- `/models <provider>` — 列出指定供應商的模型（例如 `/models zeabur-ai`）\n\n**透過指令**（Zeabur 控制台）— 在終端機執行相同指令：\n```bash\nopenclaw models set zeabur-ai/glm-4.7-flash\nopenclaw models status\nopenclaw models list --all\nopenclaw models fallbacks list\nopenclaw models fallbacks add zeabur-ai/gpt-5-mini\nopenclaw models fallbacks remove zeabur-ai/gpt-5-mini\nopenclaw models fallbacks clear\n```\n\n**或直接編輯設定檔**（`~/.openclaw/config.json5`）：\n```json\n\"agents\": {\n  \"defaults\": {\n    \"model\": {\n      \"primary\": \"zeabur-ai/glm-4.7-flash\",\n      \"fallbacks\": [\"zeabur-ai/grok-4-fast-non-reasoning\", \"zeabur-ai/minimax-m2.5\"]\n    }\n  }\n}\n```\n編輯設定檔後需重新啟動服務。\n\n### 新增外部模型供應商\n除了 Zeabur AI Hub，您也可以新增 Anthropic、OpenAI、Google 等外部供應商。\n\n**方法一：環境變數** — 在 Zeabur 控制台的**變數**頁籤新增 API key：\n- `ANTHROPIC_API_KEY` — Claude 模型\n- `OPENAI_API_KEY` — GPT 模型\n- `GOOGLE_API_KEY` — Gemini 模型\n\n新增後重新啟動服務，然後切換模型：\n- Web UI Chat：`/model anthropic/claude-opus-4-6`\n- 指令：`openclaw models set anthropic/claude-opus-4-6`\n\n**方法二：Auth token** — 在 Zeabur 控制台開啟**指令**：\n```bash\n# 貼上供應商的 API key\nopenclaw models auth paste-token --provider anthropic\n\n# 或使用互動式認證助手\nopenclaw models auth add\n```\n\n**方法三：設定檔** — 編輯 `~/.openclaw/config.json5`：\n```json\n\"models\": {\n  \"providers\": {\n    \"anthropic\": { \"apiKey\": \"sk-ant-...\" },\n    \"openai\": { \"apiKey\": \"sk-...\" }\n  }\n}\n```\n\n所有支援的供應商請參閱[官方文件](https://docs.openclaw.ai/providers)。\n\n## Telegram 機器人設定\n**從 BotFather 取得 Token：**\n1. 開啟 Telegram 並搜尋 [@BotFather](https://t.me/BotFather)\n2. 發送 `/newbot` 建立新機器人\n3. 依照提示設定機器人的名稱和使用者名稱\n4. BotFather 會傳送 Token 給您（例如 `123456789:ABCdefGHIjklMNOpqrsTUVwxyz`）\n\n**將 Token 加入 Zeabur：**\n1. 前往 Zeabur 控制台的服務**環境變數**頁籤\n2. 新增 `TELEGRAM_BOT_TOKEN` 並填入您的 Token\n3. 重新啟動服務\n4. 重啟後 Telegram 外掛會自動啟用。若機器人未啟動，請前往 **Settings → Config** 確認外掛已啟用：`\"plugins\": { \"entries\": { \"telegram\": { \"enabled\": true } } }`。如需停用，將 `enabled` 設為 `false`。\n\n**配對您的 Telegram 帳號：**\n1. 在 Telegram 向您的機器人發送 `/start`\n2. 機器人會回覆配對碼（例如 `JN4MSY23`）\n3. 使用以下任一方式核准配對：\n   - **網頁 Chat**：在 OpenClaw 網頁介面的對話框輸入 `openclaw pairing approve telegram <配對碼>`\n   - **終端機**：在 Zeabur 控制台開啟 **指令** 進入容器終端，執行 `openclaw pairing approve telegram <配對碼>`\n4. 看到 `Approved telegram sender <user-id>.` 表示配對成功\n5. 現在可以開始與機器人對話了！\n\n## WhatsApp 設定\n**步驟 1：設定 WhatsApp 頻道**\n透過 OpenClaw Web UI（Settings → Config）或貼到對話框新增以下設定：\n```json\n\"channels\": {\n  \"whatsapp\": {\n    \"selfChatMode\": true,\n    \"dmPolicy\": \"allowlist\",\n    \"allowFrom\": [\"+15551234567\"]\n  }\n}\n```\n將 `+15551234567` 替換為您的 WhatsApp 電話號碼（含國碼）。儲存後重新啟動服務。\n\n**步驟 2：連結 WhatsApp**\n1. 在 Zeabur 控制台開啟**指令**進入容器終端\n2. 執行：`openclaw channels login`\n3. 會出現 QR Code - 使用您手機上的 WhatsApp 掃描\n4. 連結完成！現在您可以在 WhatsApp 中傳訊息給自己來與 OpenClaw 對話\n\n## LINE 機器人設定\n**建立 LINE Messaging API 頻道：**\n1. 若尚未建立 [LINE 官方帳號](https://entry.line.biz/)，請先建立一個\n2. 前往 [LINE Developers Console](https://developers.line.biz/console/)\n3. 建立或選擇一個 **Provider**\n4. 建立新的 **Messaging API** 頻道，並連結您的 LINE 官方帳號\n4. 在 **Messaging API** 頁籤中，發行 **Channel access token**（長期有效）\n5. 在 **Basic settings** 頁籤中，複製 **Channel secret**\n\n**將憑證加入 Zeabur：**\n1. 前往 Zeabur 控制台的服務**環境變數**頁籤\n2. 新增 `LINE_CHANNEL_ACCESS_TOKEN` 並填入您的 Channel access token\n3. 新增 `LINE_CHANNEL_SECRET` 並填入您的 Channel secret\n4. 重新啟動服務\n5. 重啟後 LINE 外掛會自動啟用。若機器人未啟動，請前往 **Settings → Config** 確認外掛已啟用：`\"plugins\": { \"entries\": { \"line\": { \"enabled\": true } } }`\n\n**設定 Webhook：**\n1. 重啟後，您的 Webhook URL 為：`https://<your-domain>/line/webhook`\n2. 在 [LINE Developers Console](https://developers.line.biz/console/) 中，前往頻道的 **Messaging API** 頁籤\n3. 將 **Webhook URL** 設為 `https://<your-domain>/line/webhook`\n4. 啟用 **Use webhook**\n5. （建議）在 LINE 官方帳號管理後台關閉**自動回應訊息**和**加入好友的歡迎訊息**\n\n**配對您的 LINE 帳號：**\n1. 在 LINE 上加機器人為好友並傳送任意訊息\n2. 機器人會回覆配對碼（例如 `JN4MSY23`）\n3. 使用以下任一方式核准配對：\n   - **網頁 Chat**：在 OpenClaw 網頁介面的對話框輸入 `openclaw pairing approve line <配對碼>`\n   - **終端機**：在 Zeabur 控制台開啟 **指令** 進入容器終端，執行 `openclaw pairing approve line <配對碼>`\n4. 看到 `Approved line sender <user-id>.` 表示配對成功\n5. 現在可以在 LINE 上與機器人對話了！\n\n如需設定其他通訊平台（Discord、Slack 等），請參閱 [Channels 文件](https://docs.openclaw.ai/channels)。\n\n## AI 模型設定\n\n**確認模型是否正常運作：**\n1. 預設模型取決於部署方式：\n   - 有填 Zeabur AI Hub API Key → 預設模型：`zeabur-ai/glm-4.7-flash`\n   - 沒有填 → 預設模型：`anthropic/claude-opus-4-6`（需要 API 金鑰）\n2. 開啟 **Chat** 頁面，發送一則測試訊息\n3. 如果收到回覆 → 模型正常運作\n4. 如果出現錯誤 → 確認 API 金鑰是否正確設定\n\n**切換本次對話的模型**（透過聊天指令）：\n- `/models` - 查看可用模型\n- `/model <model-id>` - 僅在本次對話中切換模型（不影響其他對話）\n\n**修改所有新對話的預設模型**（透過 Web UI Settings）：\n- 前往 Settings → Agents → Default model\n- **建議：** 將低費用的模型設為預設（如 `gemini-2.5-flash-lite`、`gpt-5-nano`）。當模型無法使用時，可用 `/new` 開啟新對話，自動切回預設模型。\n\n**新增 AI 供應商**（透過 Web UI Settings 或環境變數）：\n- 新增其他 AI 供應商的 API 金鑰（如 Anthropic、OpenAI 等）\n- 請見：https://docs.openclaw.ai/providers\n\n**修改 Zeabur AI Hub 模型**（透過 Zeabur 控制台）：\n- 前往**設定** → **設定檔** → 編輯 `/opt/openclaw/providers/zeabur-ai-hub.json5`，然後重新啟動服務（變更會在啟動時同步）\n- 舊版（沒有這些指令）：透過**檔案**頁籤或 Web UI Settings 編輯 `/home/node/.openclaw/openclaw.json`，將以下內容加入 `models.providers.zeabur-ai.models` 陣列：\n```json\n{ \"id\": \"gpt-5.2\", \"name\": \"GPT-5.2\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.5, \"output\": 12, \"cacheRead\": 0.15, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.35, \"output\": 11, \"cacheRead\": 0.14, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.1, \"output\": 0.8, \"cacheRead\": 0.01, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7\", \"name\": \"GLM-4.7\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.5, \"output\": 2, \"cacheRead\": 0.12, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"glm-4.7-flash\", \"name\": \"GLM-4.7 Flash\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.25, \"output\": 1, \"cacheRead\": 0.06, \"cacheWrite\": 0 }, \"contextWindow\": 204800, \"maxTokens\": 8192 },\n{ \"id\": \"kimi-k2.5\", \"name\": \"Kimi K2.5\", \"reasoning\": false, \"input\": [\"text\"], \"cost\": { \"input\": 0.45, \"output\": 2, \"cacheRead\": 0, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## 安全提示\nWeb UI 是用於設定、監控與聊天的管理工具 — 訊息平台（Telegram、WhatsApp、Discord 等）不需要 Web UI 也能獨立運作。如果你只使用不需要 inbound webhook 的平台（Telegram、WhatsApp、Discord、Signal、iMessage），可以在 Zeabur 控制台的**網路**頁籤移除網域綁定，避免將 Gateway 暴露在公網上。所有管理操作也可以在 Zeabur 的**指令**終端透過 CLI 完成（`openclaw config set`、`openclaw models set` 等）。若需在不綁定公網網域的情況下存取 Web UI，請參考 [Tailscale 私有網路存取](#tailscale-私有網路存取選用)。也可以在**變數**頁籤將 `OPENCLAW_GATEWAY_BIND` 設為 `loopback`（設定後重新啟動服務），進一步限制 Gateway 只接受本地連線。\n\n**需要**公網網域（inbound webhook）的平台：LINE、Slack、Google Chat。\n\n## 資料持久化\n所有資料儲存在 `/home/node`：\n- `/home/node/.openclaw` - 設定、會話、裝置和憑證\n- `/home/node/.openclaw/workspace` - 工作區和記憶檔案\n\n## 備份與還原\n\U0001F4A1 **建議：** 在完成初始設定或進行重大設定變更後，建議先建立備份。\n\n**備份：**\n- **方法一：Zeabur 備份服務（推薦）** - 使用 Zeabur 內建的備份功能。請參閱 [Zeabur 備份文件](https://zeabur.com/docs/zh-TW/data-management/backup)。\n- **方法二：手動備份** - 開啟**指令** → 執行 `backup` → 從**檔案**頁籤的 `/home/node` 下載（例如 `backup-1430.tar.gz`）\n  - 舊版（沒有這些指令）：`cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**還原：**\n1. 在**檔案**頁籤將備份檔上傳到 `/home/node` 資料夾\n2. 開啟**指令**執行：\n   - Zeabur 備份服務的檔案：`restore <備份檔名> --strip 2`（例如 `restore data-2026-02-27.zip --strip 2`）\n   - 手動備份的檔案：`restore <備份檔名>`（例如 `restore backup-1430.tar.gz`）\n   - 舊版（沒有這些指令）：`cd /home/node && tar -xzvf <備份檔名>`\n3. 在**檔案**頁籤刪除 `/home/node` 中已上傳的備份檔，釋放磁碟空間\n4. 重新啟動服務\n\n⚠️ 還原會覆蓋新服務上現有的設定和資料。記得也要將相關的環境變數（如 `TELEGRAM_BOT_TOKEN`）設定回去。Channel 的備份還原目前只測試過 Telegram 和 WhatsApp 可以成功還原。\n\n## 疑難排解\n\n> 預設啟動指令：`/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`\n\n### 全新部署（有輔助頁面）\n當 Gateway 停止時，服務網址會顯示輔助頁面，包含錯誤資訊與修復步驟：\n1. 查看**錯誤紀錄** — 輔助頁面會直接顯示最近的紀錄；完整紀錄請到 Zeabur Dashboard 的**紀錄**頁籤查看\n2. 修復設定檔 — 到 Zeabur Dashboard 的**檔案**頁籤，找到設定檔（`/home/node/.openclaw/openclaw.json`）並修正問題\n3. 在 Zeabur Dashboard 點擊**重新啟動**套用修正\n\n### 舊版部署（無輔助頁面）\n如果您的部署沒有輔助頁面，請依照以下步驟操作：\n1. 到 Zeabur Dashboard 的**紀錄**頁籤查看錯誤訊息\n2. 前往**設定** → **指令**，將啟動指令改為 `sleep 3600`，然後點擊**重新啟動** — 這樣容器會持續運行，方便您編輯檔案\n3. 修復設定檔 — 到**檔案**頁籤，找到設定檔（`/home/node/.openclaw/openclaw.json`）並修正問題\n4. 將啟動指令改回 `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh`，然後點擊**重新啟動**\n\n> \U0001F4A1 如需啟用輔助頁面，請重新部署此模板。\n\n### 更新 OpenClaw 版本\n1. 到 [OpenClaw releases](https://github.com/openclaw/openclaw/releases) 查看最新版本\n2. 在 Zeabur Dashboard 前往**設定** → **服務映像檔來源**\n3. 映像檔：`ghcr.io/openclaw/openclaw`，標籤：從目前版本（例如 `2026.2.26`）改為新版本（例如 `2026.3.2`）\n4. 點擊**重新啟動**以套用更新\n\n> ⚠️ 避免使用 `latest` 作為標籤 — 它會在每次重啟時拉取最新版本，可能引入破壞性變更或無法預期的錯誤。建議固定使用特定版本號以確保穩定性。\n5. 到**紀錄**頁籤確認 Gateway 正常啟動\n\n> \U0001F4A1 啟動腳本會在每次開機時自動遷移設定 — 若缺少新設定（如 `trustedProxies`、`dangerouslyDisableDeviceAuth`）會自動補上。既有設定不會被覆蓋。\n\n### \"device identity required\"\n表示 Web UI 尚未與 Gateway Token 配對。修復方式：\n- **方法 1：** 在 Zeabur Dashboard 的**說明**頁籤，複製 **Web UI (with Token)** 網址並在瀏覽器開啟\n- **方法 2：** 開啟 Web UI 的 **Overview** 頁面，輸入 Gateway Token\n\nGateway Token 可在 Zeabur Dashboard 的**說明**頁籤或**環境變數**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\n### \"disconnected (1008): pairing required\"\n表示您的裝置（瀏覽器/應用程式）尚未與 Gateway 完成配對。配對方式：\n1. 開啟 Web UI 並完成 Gateway Token 認證（參見上方說明）\n2. 在 Zeabur 控制台開啟**指令**進入終端機，執行：\n   - `openclaw devices list` — 查看待配對的請求，找到 `requestId`\n   - `openclaw devices approve <requestId>` — 核准該裝置\n\n### \"non-loopback Control UI requires gateway.controlUi.allowedOrigins\"\n升級映像檔至 `2026.2.23` 或更新版本後，若未更新設定檔會出現此錯誤。修復方式：編輯 `/home/node/.openclaw/openclaw.json`，在 `gateway.controlUi` 下加入 `\"dangerouslyAllowHostHeaderOriginFallback\": true`：\n```json\n{\n  \"gateway\": {\n    \"controlUi\": {\n      \"dangerouslyAllowHostHeaderOriginFallback\": true\n    }\n  }\n}\n```\n然後重新啟動服務。從此模板新部署的服務已自動包含此設定。\n\n## Tailscale 私有網路存取（選用）\n> ⚠️ 此功能僅適用於全新部署。舊版部署不包含 Tailscale 啟動腳本，請重新部署模板才能使用此功能。\n\n除了使用公開網域，您也可以透過 [Tailscale](https://tailscale.com) 讓 OpenClaw 僅在您的私有網路（tailnet）中存取，無需暴露到公網。\n\n**前置需求：**\n- 一個 Tailscale 帳號（免費方案即可）\n- 在 [Tailscale Admin Console](https://login.tailscale.com/admin/settings/keys) 建立一組 Auth Key（建議勾選 Reusable + Ephemeral）\n\n**步驟 1：設定環境變數**\n在 Zeabur 控制台的**環境變數**頁籤新增：\n- `TS_AUTHKEY`（必填）：您的 Tailscale Auth Key（`tskey-auth-xxx`）。前往 [Tailscale Admin Console → Keys](https://login.tailscale.com/admin/settings/keys) 建立。未設定此變數時，Tailscale 設定會被完全跳過。\n- `TS_HOSTNAME`（選填）：在 tailnet 上的機器名稱，決定您的存取網址（`https://<TS_HOSTNAME>.<tailnet>.ts.net`）。未設定時預設為 `openclaw`。\n\n**步驟 2：切換啟動指令**\n前往**設定** → **啟動指令**，改為：\n```\n/opt/openclaw/startup.sh && /opt/openclaw/start_gateway_tailscale.sh\n```\n重新啟動服務。\n\n**步驟 3：在本機安裝 Tailscale**\n在您要存取 OpenClaw 的裝置上安裝 [Tailscale](https://tailscale.com/download)（macOS、Windows、iOS、Android、Linux），並使用建立 Auth Key 時的同一個 Tailscale 帳號登入。\n\n**步驟 4：首次登入 Web UI**\n啟動完成後，在瀏覽器開啟（需在同一個 tailnet 的裝置上）：\n```\nhttps://<TS_HOSTNAME>.<您的tailnet>.ts.net\n```\n您的 tailnet DNS 名稱可在 [Tailscale 管理控制台 → DNS](https://login.tailscale.com/admin/dns) 查詢，完整網址也可在 Zeabur 控制台的服務**紀錄**中確認。\n\n使用以下任一方式登入：\n- 在網址後加上 token：`https://<TS_HOSTNAME>.<您的tailnet>.ts.net?token=<GATEWAY_TOKEN>`\n- 或在 Web UI 的 **Overview** 頁面輸入 Gateway Token\n\nGateway Token 可在 Zeabur 控制台的**使用說明**頁籤或**環境變數**中找到（`OPENCLAW_GATEWAY_TOKEN`）。\n\n**步驟 5：連接 OpenClaw app（選用，以 macOS 為例）**\n1. 在 Mac 上安裝 [OpenClaw for macOS](https://docs.openclaw.ai/platforms/macos) 和 Tailscale\n2. 開啟 OpenClaw app → **Settings → General** → 選擇 **Remote** 模式\n3. Transport 選擇 **Direct (ws/wss)**\n4. Gateway URL 填入 `wss://<TS_HOSTNAME>.<您的tailnet>.ts.net`\n5. 裝置首次連線時需要配對核准 — 在 Web UI 的 **Nodes** 頁面點擊 approve\n\niOS 和 Android 的設定請參閱[官方文件](https://docs.openclaw.ai/platforms)。\n\n**切換回公開網域模式：**\n將啟動指令改回 `/opt/openclaw/startup.sh && /opt/openclaw/start_gateway.sh` 並重新啟動即可。\n\n## Zeabur 專屬設定\n此模板針對 Zeabur 雲端環境預先配置了以下設定：\n\n- **`gateway.trustedProxies`**：設為 `[\"10.0.0.0/8\", \"172.16.0.0/12\"]`，讓 Gateway 能正確辨識 Zeabur 反向代理後的用戶端 IP。未設定時，Web UI 可能會出現「device identity required」錯誤。\n- **`dangerouslyDisableDeviceAuth`**：停用 Web UI 裝置配對（裝置配對是為區域網路設計的功能，雲端部署改用 Gateway Token 驗證）。\n- **`/usr/local/bin` 符號連結**：`openclaw`、`backup`、`restore` 指令已建立符號連結至 `/usr/local/bin`，可直接在 Zeabur 的**命令**終端中使用。\n- **`OPENCLAW_DISABLE_BONJOUR=1`**：停用 mDNS/Bonjour，因為 Zeabur 容器主機名稱可能超過 63 bytes 的 DNS 標籤限制。mDNS 僅用於區域網路發現，雲端環境中不需要。\n- **`OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true`**：修復容器環境中的 Telegram 連線問題（`2026.2.17` 及之後的映像檔版本需要）。\n\n## 文件\n- 文件：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 更新日誌\n**2026/3/4**\n- 升級映像檔至 `2026.3.2` — PDF 工具、Ollama 嵌入、Telegram 串流預設改為 `partial`、容器健康檢查端點（`/healthz`）、OpenAI WebSocket 優先傳輸，橫跨 3 個版本（2026.3.1、2026.3.2）共 200+ 修復及 20+ 安全強化\n- ⚠️ 破壞性變更：使用 `api.registerHttpHandler(...)` 的 plugin 須遷移至 `api.registerHttpRoute(...)`，Zalouser 頻道須重新登入（`openclaw channels login --channel zalouser`）\n\n**2026/3/2**\n- 新增模型：`claude-opus-4-6`、`minimax-m2.5`、`step-3.5-flash`\n- 替換模型：`llama-3.3-70b` → `llama-3.1-8b`、`qwen-3-32` → `qwen-3-235b`\n- 修復 API key 更換：變更 `ZEABUR_AI_HUB_API_KEY` 後重啟即可生效（移除 `envsubst`，改為 runtime 解析 `${VAR}`）\n- Provider 設定檔每次啟動從 `/opt` 同步 — 模板模型更新和 Configs 編輯重啟後即生效\n- 安全提示新增 `OPENCLAW_GATEWAY_BIND=loopback` 指引\n\n**2026/2/27**\n- 新增 `dangerouslyDisableDeviceAuth` — 雲端部署改用 Gateway Token 驗證，取代裝置配對\n- 預設模型：`zeabur-ai/glm-4.7-flash`，備援鏈（grok-4-fast-non-reasoning → minimax-m2.5 → kimi-k2.5 → qwen-3-235b → gpt-5-mini）\n- 新增模型切換、備援及外部 provider 說明文件\n- 清理環境變數（預設值移至啟動腳本）\n- 自動遷移既有設定（trustedProxies、驗證設定）\n- 升級映像檔至 `2026.2.26` — Telegram DM allowlist 繼承修復、容器 temp dir 權限修復、非 root Docker 中 CLI gateway `--force` 修復、Gemini model ID 正規化，及額外安全強化\n\n**2026/2/26**\n- 升級映像檔至 `2026.2.25` — 跨 2026.2.23→2026.2.25 共 100+ 安全修復、新 provider（Kilo Gateway、Mistral、Volcano Engine）、heartbeat `directPolicy` 設定、gateway WebSocket 驗證強化、跨頻道路由隔離、Discord 語音 DAVE 可靠性、Telegram webhook 卡住修復，及大量穩定性改善\n\n**2026/2/24**\n- 升級映像檔至 `2026.2.23` — 包含 30+ 安全修復、新 provider（Kilo Gateway、Mistral、Volcano Engine）、統一頻道串流設定、多語言停止詞、所有頻道的 reasoning/thinking 過濾，及大量穩定性改善\n- Control UI 設定加入 `dangerouslyAllowHostHeaderOriginFallback` — 2026.2.23 起非 loopback 部署必須設定\n\n**2026/2/22**\n- 以自動重啟機制取代健康檢查：Gateway 崩潰時自動重啟，並顯示輔助頁面提供錯誤資訊與修復步驟，每 5 秒偵測服務是否恢復\n- 移除救援模式（`rescue.sh`）— 已由輔助頁面取代\n\n**2026/2/20**\n- 映像檔標籤固定為 `2026.2.19` — 新增 `OPENCLAW_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY=true` 環境變數以修復 Telegram 連線問題（`2026.2.17` 及之後的版本需要）\n\n**2026/2/16**\n- 映像檔標籤切換為 `latest`，以跟上快速的安全性修正\n\n**2026/2/15**\n- 新增 Tailscale 私有網路存取：用戶可切換至 `start_gateway_tailscale.sh`，透過 tailnet 私有 HTTPS 存取，無需暴露到公網\n- 映像檔升級至 `2026.2.14`\n\n**2026/2/10**\n- 修復生圖 skill：改用 `/v1/chat/completions` API，預設模型改為 `gemini-2.5-flash-image`\n- 修復 `gpt-oss-120b`、`llama-3.3-70b`、`qwen-3-32` HTTP 500：加入 `supportsStore: false` 相容性設定\n- 修正 `gpt-oss-120b` reasoning 標記（設為 `true`）\n- 還原腳本支援 `.zip` 格式（Zeabur 備份服務）\n- 啟動時將頻道環境變數（`TELEGRAM_BOT_TOKEN`、`DISCORD_BOT_TOKEN`、`SLACK_BOT_TOKEN`、`SLACK_APP_TOKEN`、`LINE_CHANNEL_ACCESS_TOKEN`、`LINE_CHANNEL_SECRET`）同步寫入設定檔\n\n**2026/2/7**\n- 修復 cron 排程無法主動送出通知：啟動時自動偵測已設定的頻道作為 heartbeat 投遞目標\n- 新部署自動初始化 HEARTBEAT.md 含可執行內容（避免空檔導致 heartbeat 被跳過）\n\n**2026/2/4**\n- 使用 Zeabur configs 管理啟動腳本（更易維護）\n- 新增 `backup` 和 `restore` 全域指令\n- 新增自動重啟機制與 fallback 頁面，Gateway 崩潰時自動恢復\n- Zeabur AI Hub 新增 6 個模型：gpt-5.2, gpt-5.1, gpt-5-nano, glm-4.7, glm-4.7-flash, kimi-k2.5\n- Zeabur AI Hub 的 Claude 模型加入 store 相容性設定\n\n**2026/2/2**\n- 新增 AI 模型設定區塊（全域 vs 本次對話設定）\n- 新增備份與還原區塊，支援 Zeabur 備份服務\n- 新增初始設定完成後備份提醒\n- 移除 Google Gemini CLI patch（上游已修復）\n- 移除部署時的 ANTHROPIC_API_KEY 和 OPENAI_API_KEY 變數，避免 OpenClaw 偵測到空的 API Key 然後執行失敗（可之後透過 Web UI 或環境變數設定）\n"
