# 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: The domain for accessing OpenClaw Control UI (e.g. my-openclaw)
        - key: ENABLE_CONTROL_UI
          type: STRING
          name: Enable Control UI
          description: Set to 'true' to enable the web Control UI via public domain (default). Set to 'false' for loopback only (more secure).
        - key: ZEABUR_AI_HUB_API_KEY
          type: AI_HUB_KEY
          name: Zeabur AI Hub API Key (Optional)
          description: Optional but recommended. The template defaults to zeabur-ai/glm-4.7-flash (cheap, fast) which needs this key. Without it, you'll need to switch to another provider and supply its own API key. Can be added later in the Variables tab.
    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.5.28`. 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\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 do run it, you will need to manually update the corresponding settings afterward. See the [official documentation](https://docs.openclaw.ai) for details.\n\n---\n\n## Deploy Variables\n\nYou will be asked to fill in these variables when deploying:\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| **Domain** | Yes | The subdomain for accessing OpenClaw (e.g. `my-openclaw` → `my-openclaw.zeabur.app`). Can be removed after switching to loopback mode. |\n| **Enable Control UI** | Yes | `true` (default) — enables the web Control UI via your public domain. `false` — binds to loopback only, no public web access (more secure, use with Tailscale or supported channels like Telegram) |\n| **Zeabur AI Hub API Key** | No | Leave blank to skip. The template defaults to `zeabur-ai/glm-4.7-flash` (cheap, fast) which needs this key — without it, you'll need to switch models and supply your own API key for another provider (Anthropic, OpenAI, etc.). Can be added later in the service's **Variables** tab. |\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, open the service URL from the **Networking** tab. On the login page, paste the **Gateway Token** (found in the **Instructions** tab or **Environment Variables** → `OPENCLAW_GATEWAY_TOKEN`) and click **Connect**\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.): The template default remains `zeabur-ai/glm-4.7-flash`. To use another provider, add its API key via environment variables, then switch model with `/model <id>` in chat or via Control UI Settings. 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 **Control UI Chat** or **Command** in the Zeabur dashboard.\n\n**Via Control 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- Control UI Chat: `/model anthropic/claude-opus-4-7`\n- Command: `openclaw models set anthropic/claude-opus-4-7`\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. After restarting, go to **Settings → Config** and enable the Telegram plugin: `\"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 Control 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. After restarting, go to **Settings → Config** and enable the LINE plugin: `\"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. The template seeds `zeabur-ai/glm-4.7-flash` as the default model on first boot:\n   - With Zeabur AI Hub API Key → it just works\n   - Without → the model won't respond; add an AI Hub key (recommended) or switch model + add your own provider 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 Control 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 Control 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 Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Security Note\nThe Control 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 Control 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: CLI Backup (v2026.3.8+)** - Open **Command** → Run `openclaw backup create` → Download from `/home/node` in **Files** tab\n  - Config only: `openclaw backup create --only-config`\n  - Exclude workspace: `openclaw backup create --no-include-workspace`\n  - Verify archive: `openclaw backup verify <backup-file>`\n  - Example:\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\n- **Method 3: 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 CLI Backup (v2026.3.8+): `restore <backup-file>` (auto-detected, e.g. `restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`)\n   - From Zeabur Backup Service: `restore <backup-file>` (auto-detected, e.g. `restore data-2026-02-27.zip`)\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.7`)\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 Control UI has not been authenticated with a Gateway Token yet. Fix:\n- Open the service URL — the login page will appear. Paste the **Gateway Token** and click **Connect**.\n- You 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 Control 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 Control 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 Control 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 Control 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 Control UI may show \"device identity required\" errors.\n- **`dangerouslyDisableDeviceAuth`**: Disables Control 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- **`TZ`** (optional): Set the container timezone using an IANA timezone string (e.g. `Asia/Taipei`, `America/New_York`, `Europe/London`). Add via **Variables** tab in Zeabur dashboard. Defaults to `UTC` if not set.\n\n## Documentation\n- Documentation: https://docs.openclaw.ai\n- GitHub: https://github.com/openclaw/openclaw\n\n## Changelog\n**2026/6/1**\n- Upgrade image to `2026.5.28` — fixes LINE and other on-demand channel plugins failing to load (after a plugin-SDK layout change, the pinned image now matches the auto-installed channel plugin version). Also adds Claude Opus 4.8 support, encrypted PDF extraction, NVIDIA/MiniMax provider updates, and 100+ security/channel/agent fixes\n\n**2026/5/5**\n- Upgrade image to `2026.5.20` — file-transfer plugin, Gateway startup performance optimizations, unified streaming progress drafts, `/steer` command, Discord DM/status improvements, WhatsApp Channel/Newsletter support, MS Teams streaming progress, Google Chat webhook fix, LanceDB memory fix, sandbox sharding, and 100+ fixes across channels/plugins/providers\n\n**2026/4/17**\n- Upgrade image to `2026.4.15` — default Anthropic model moved to Claude Opus 4.7, Gemini text-to-speech support, Model Auth status card in Control UI, LanceDB cloud storage for memory, GitHub Copilot embedding provider, experimental local-model lean defaults, and 50+ security/provider/channel fixes\n- Add Zeabur AI Hub model support: `claude-opus-4-7`, `claude-sonnet-4-6`, `glm-5`, `gpt-5.4-pro`\n- Remove retired Zeabur AI Hub models: `gemini-3-pro-preview`, `kimi-2.5`\n\n**2026/4/6**\n- Upgrade image to `2026.4.5` — video/music generation tools (`video_generate`, `music_generate`) with xAI/Runway/Alibaba Wan/Google Lyria/MiniMax providers, ComfyUI workflow plugin, new Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle providers, Control UI 12-language localization, Memory Dreaming (experimental background recall promotion), prompt cache stability improvements, Claude CLI loopback MCP bridge, ACPX embedded runtime, ClawHub skill install from Control UI, structured plan progress events, legacy config alias removal (run `openclaw doctor --fix`), 100+ security/channel/provider fixes\n- ⚠️ Breaking: legacy config aliases removed (`talk.voiceId`, `hooks.internal.handlers`, channel `allow` toggles, etc.) — run `openclaw doctor --fix` after upgrading\n\n**2026/4/1**\n- Upgrade image to `2026.3.31` — background task flow control plane (SQLite-backed task ledger, `openclaw flows` CLI), QQ Bot bundled channel plugin, Matrix streaming/proxy/history/thread replies, remote MCP HTTP/SSE server support, LINE outbound media, Slack exec approval routing, WhatsApp emoji reactions, Pi/Codex native web search, configurable overload failover, 60+ fixes across Slack, Discord, Telegram, Docker, Control UI, and plugin SDK\n\n**2026/3/27**\n- Upgrade image to `2026.3.24` — Gateway OpenAI-compatible API endpoints (`/v1/models`, `/v1/embeddings`), Microsoft Teams SDK migration with streaming replies, video generation infrastructure, gateway channel startup isolation, Telegram forum topic and photo dimension fixes, Docker fresh-install setup fix, sandbox media dispatch security hardening, and 60+ fixes across WhatsApp, Discord, Slack, Feishu, and plugin SDK\n\n**2026/3/23**\n- Upgrade image to `2026.3.22` — gateway SIGTERM shutdown hardening, Telegram reply context & topic announce delivery fixes, memory tools independent registration, provider runtime lazy boundary fix, security hardening across exec approvals, pairing, and network discovery\n\n**2026/3/15**\n- Upgrade image to `2026.3.13-1` — plugin-sdk memory fix (resolves OOM crashes), browser session hardening, cron session targeting, 50+ fixes across security, Telegram, Discord, Windows, macOS, and config validation\n- Add `ENABLE_CONTROL_UI` deploy variable — controls gateway bind mode (`lan` vs `loopback`) and Control UI access flags; default `true`\n- Add `NODE_OPTIONS=--max-old-space-size=2048` to prevent Node.js OOM on constrained servers\n- Remove startup script bloat: HEARTBEAT.md init, heartbeat target auto-detection, CLI wrapper, redundant exports/permissions, MEMORY.md init (all handled natively by OpenClaw)\n- Switch gateway start command from `node dist/index.js` to built-in `openclaw` binary\n- Improve deploy variable descriptions with default model info and localized instructions (EN, zh-TW, zh-CN, ja, es, id)\n\n**2026/3/13**\n- Upgrade image to `2026.3.12` — Control UI dashboard v2, GPT-5.4/Claude fast mode, Ollama/vLLM/SGLang provider plugins, K8s deployment docs, 20+ security fixes (WebSocket origin validation, exec approval hardening, plugin auto-load lockdown), cron delivery tightening with `openclaw doctor --fix` migration, 60+ new features and 100+ fixes across 4 releases (2026.3.9–2026.3.12)\n- ⚠️ Breaking: cron delivery tightened — run `openclaw doctor --fix` in **Command** after upgrading to migrate legacy cron storage\n- Add `TZ` environment variable documentation for container timezone configuration\n- Rename \"Web UI\" to \"Control UI\" across all documentation\n- Remove channel env var auto-sync startup script (channel plugins now configured manually via Settings)\n- Remove gateway config migration startup script (initial config already includes all required settings)\n- Simplify login flow: remove \"Web UI (with token)\" URL, use Control UI login page with Gateway Token instead\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- Upgrade image to `2026.3.8` — CLI backup (`openclaw backup create` / `openclaw backup verify`), Talk mode silence timeout config, Brave LLM-context web search, ACP provenance metadata, Telegram DM dedup, browser CDP fixes, gateway restart/config guards, 30+ new features and 40+ fixes\n- Add `openclaw backup create` and `openclaw backup verify` to backup documentation (built-in CLI backup with config-only mode and archive validation)\n\n**2026/3/8**\n- Upgrade image to `2026.3.7` — context engine plugin interface, ACP persistent channel bindings, Telegram topic agent routing, Docker multi-stage build, gateway SecretRef support, 30+ new features and 40+ fixes across 5 releases (2026.3.3–2026.3.7)\n- ⚠️ Breaking: `gateway.auth.mode` now required when both `gateway.auth.token` and `gateway.auth.password` are configured — template pre-sets `mode: \"token\"` (existing deployments auto-migrated on startup)\n- Add Zeabur AI Hub model support: `gemini-3.1-pro-preview`, `gemini-3.1-flash-lite-preview`, `gemini-3.1-flash-image-preview`, `kimi-2.5`\n- Set explicit `gateway.auth.mode: \"token\"` in config (defensive for future gateway auth changes)\n- Remove redundant `--port` flag from gateway startup script (port resolved automatically via env/config/default)\n\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 Zeabur AI Hub model support: `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\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 Control 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:
            id: openclaw
            source:
                image: ghcr.io/openclaw/openclaw:2026.5.28
                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: Gateway Token
                  content: ${OPENCLAW_GATEWAY_TOKEN}
            env:
                ENABLE_CONTROL_UI:
                    default: ${ENABLE_CONTROL_UI}
                HOME:
                    default: /home/node
                NODE_OPTIONS:
                    default: --max-old-space-size=2048
                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 Homebrew ==="
                    # Persist Homebrew under /home/node (mounted volume) via symlink
                    mkdir -p /home/node/.linuxbrew
                    mkdir -p /home/linuxbrew
                    ln -sf /home/node/.linuxbrew /home/linuxbrew/.linuxbrew
                    touch /.dockerenv
                    if [ ! -f /home/node/.linuxbrew/bin/brew ]; then
                      NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
                      echo "Homebrew installed."
                    else
                      echo "Homebrew already installed (persisted)."
                    fi
                    eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
                    # Write brew PATH to profile so Zeabur Command terminal can find brew
                    BREW_SHELLENV='eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"'
                    for rc in /home/node/.bashrc /home/node/.profile /root/.bashrc /root/.profile; do
                      if ! grep -qF 'linuxbrew' "$rc" 2>/dev/null; then
                        echo "$BREW_SHELLENV" >> "$rc"
                      fi
                    done

                    echo "=== Setting up Go ==="
                    # Persist Go under /home/node (mounted volume), symlink to /usr/local/go
                    if [ ! -f /home/node/go/bin/go ]; then
                      curl -fsSL https://go.dev/dl/go1.22.3.linux-amd64.tar.gz | tar -C /home/node -xz
                      echo "Go installed."
                    else
                      echo "Go already installed (persisted)."
                    fi
                    ln -sf /home/node/go /usr/local/go
                    export PATH="/home/node/go/bin:$PATH"
                    # Write Go PATH to profile so Zeabur Command terminal can find go
                    for rc in /home/node/.bashrc /home/node/.profile /root/.bashrc /root/.profile; do
                      if ! grep -qF '/home/node/go/bin' "$rc" 2>/dev/null; then
                        echo 'export PATH="/home/node/go/bin:$PATH"' >> "$rc"
                      fi
                    done

                    echo "=== Setting up openclaw command ==="
                    ln -sf /opt/openclaw/backup.sh /usr/local/bin/backup
                    ln -sf /opt/openclaw/restore.sh /usr/local/bin/restore
                    echo "openclaw command ready at $(which openclaw)"

                    # Setup config directories
                    CONFIG_DIR="/home/node/.openclaw"
                    CONFIG_FILE="$CONFIG_DIR/openclaw.json"
                    PROVIDERS_DIR="$CONFIG_DIR/providers"
                    mkdir -p "$PROVIDERS_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..."

                      # Gateway flags based on Control UI mode (default: enabled)
                      if [ "${ENABLE_CONTROL_UI}" = "false" ]; then
                        GATEWAY_JSON='"auth": { "mode": "token" }'
                      else
                        GATEWAY_JSON='"auth": { "mode": "token" }, "trustedProxies": ["10.0.0.0/8", "172.16.0.0/12"], "controlUi": { "allowInsecureAuth": true, "dangerouslyAllowHostHeaderOriginFallback": true, "dangerouslyDisableDeviceAuth": true }'
                      fi

                      if [ "$HAS_AI_HUB_KEY" = true ]; then
                        cat > "$CONFIG_FILE" << EOF
                    {
                      "gateway": { ${GATEWAY_JSON} },
                      "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": {} }
                    }
                    EOF
                      else
                        cat > "$CONFIG_FILE" << EOF
                    {
                      "gateway": { ${GATEWAY_JSON} }
                    }
                    EOF
                      fi
                      chmod 600 "$CONFIG_FILE"
                    else
                      echo "Config exists, checking for updates..."
                    fi

                    # Inline AI Hub provider config from /opt every start, drop any $include reference.
                    # OpenClaw 2026.5.x rejects writes that flatten $include-owned config, which broke
                    # `openclaw models set` / `fallbacks add/remove`. Inlining keeps writes possible
                    # and self-heals existing deployments that already have $include.
                    if [ "$HAS_AI_HUB_KEY" = true ] && [ -f /opt/openclaw/providers/zeabur-ai-hub.json5 ]; then
                      node -e "
                        const fs = require('fs');
                        const JSON5 = require('json5');
                        const configPath = '$CONFIG_FILE';
                        const providersPath = '/opt/openclaw/providers/zeabur-ai-hub.json5';

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

                          if (!config.models) config.models = {};
                          const existing = config.models.providers || {};
                          delete existing['\$include'];
                          config.models.providers = Object.assign({}, existing, providers);

                          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.');
                          }

                          const zeaburAi = config.models.providers['zeabur-ai'];
                          if (zeaburAi && zeaburAi.apiKey && zeaburAi.apiKey.includes('\${')) {
                            zeaburAi.apiKey = process.env.ZEABUR_AI_HUB_API_KEY || '';
                          }

                          fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                          console.log('Zeabur AI Hub provider inlined (' + Object.keys(providers).length + ' provider(s), ' + (providers['zeabur-ai']?.models?.length || 0) + ' models).');
                        } catch (err) {
                          console.error('Warning: Failed to inline Zeabur AI Hub provider:', err.message);
                          console.error('You may need to configure the provider manually via Control UI.');
                        }
                      "
                    fi

                    # Sync Control UI config with ENABLE_CONTROL_UI env var
                    node -e "
                        const fs = require('fs');
                        const JSON5 = require('json5');
                        const configPath = '$CONFIG_FILE';
                        const enableUi = '${ENABLE_CONTROL_UI}' !== 'false';
                        try {
                          const config = JSON5.parse(fs.readFileSync(configPath, 'utf8'));
                          if (!config.gateway) config.gateway = {};
                          let changed = false;

                          if (enableUi) {
                            // Enable: add trustedProxies + controlUi flags
                            if (!config.gateway.trustedProxies) {
                              config.gateway.trustedProxies = ['10.0.0.0/8', '172.16.0.0/12'];
                              changed = true;
                            }
                            const ui = config.gateway.controlUi || {};
                            if (!ui.allowInsecureAuth || !ui.dangerouslyAllowHostHeaderOriginFallback || !ui.dangerouslyDisableDeviceAuth) {
                              config.gateway.controlUi = { ...ui, allowInsecureAuth: true, dangerouslyAllowHostHeaderOriginFallback: true, dangerouslyDisableDeviceAuth: true };
                              changed = true;
                            }
                          } else {
                            // Disable: remove dangerous controlUi flags and trustedProxies
                            if (config.gateway.controlUi?.allowInsecureAuth || config.gateway.controlUi?.dangerouslyAllowHostHeaderOriginFallback || config.gateway.controlUi?.dangerouslyDisableDeviceAuth) {
                              delete config.gateway.controlUi.allowInsecureAuth;
                              delete config.gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback;
                              delete config.gateway.controlUi.dangerouslyDisableDeviceAuth;
                              if (Object.keys(config.gateway.controlUi).length === 0) delete config.gateway.controlUi;
                              changed = true;
                            }
                            if (config.gateway.trustedProxies) {
                              delete config.gateway.trustedProxies;
                              changed = true;
                            }
                          }

                          if (changed) {
                            fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
                            console.log('Control UI config synced (enabled=' + enableUi + ')');
                          } else {
                            console.log('Control UI config already in sync.');
                          }
                        } catch (err) {
                          console.error('Warning: Failed to sync Control UI config:', err.message);
                        }
                      "

                    chmod 600 "$CONFIG_FILE" 2>/dev/null || true

                    # 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
                  permission: 493
                  envsubst: false
                - path: /opt/openclaw/start_gateway.sh
                  template: |
                    #!/bin/sh
                    GATEWAY_LOG="/tmp/openclaw-gateway.log"
                    PORT="${OPENCLAW_GATEWAY_PORT:-18789}"

                    # Derive bind mode from ENABLE_CONTROL_UI (default: lan)
                    if [ "${ENABLE_CONTROL_UI}" = "false" ]; then
                      BIND="${OPENCLAW_GATEWAY_BIND:-loopback}"
                    else
                      BIND="${OPENCLAW_GATEWAY_BIND:-lan}"
                    fi

                    while true; do
                      echo "=== Starting OpenClaw Gateway ==="
                      openclaw gateway --allow-unconfigured --bind "${BIND}" --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  <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:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,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:ui-monospace,SFMono-Regular,'SF Mono',Menlo,Consolas,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:ui-monospace,SFMono-Regular,'SF Mono',Menlo,Consolas,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 "CLI backups (*-openclaw-backup.tar.gz) and Zeabur backups (data-*) are auto-detected."
                      echo ""
                      echo "Examples:"
                      echo "  restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz  # CLI backup (auto-detected)"
                      echo "  restore data-2026-02-27.zip                               # Zeabur backup (auto-detected)"
                      echo "  restore data-2026-02-27.tar.gz                            # Zeabur backup (auto-detected)"
                      echo "  restore backup-1430.tar.gz                                # Manual backup"
                      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
                        elif echo "$BACKUP_FILE" | grep -q 'openclaw-backup\.tar\.gz$'; then
                          echo "Detected CLI backup format, restoring with --strip-components=3..."
                          tar -xzvf "$BACKUP_FILE" --strip-components=3 -C /home/node
                        elif echo "$BACKUP_FILE" | grep -q '^data-'; then
                          echo "Detected Zeabur backup service format, restoring with --strip-components=2..."
                          tar -xzvf "$BACKUP_FILE" --strip-components=2 -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.94.2
                    #   TS_HOSTNAME  (optional)  Hostname on tailnet. Default: openclaw

                    echo "=== Tailscale Setup ==="

                    # --- Config variables ---
                    TS_VERSION="${TS_VERSION:-1.94.2}"
                    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

                    # Symlink to /usr/local/bin so gateway can find tailscale in PATH
                    ln -sf "$BIN_DIR/tailscale" /usr/local/bin/tailscale
                    ln -sf "$BIN_DIR/tailscaled" /usr/local/bin/tailscaled

                    # --- 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) ==="
                      openclaw 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.1-pro-preview", "name": "Gemini 3.1 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": "gemini-3.1-flash-lite-preview", "name": "Gemini 3.1 Flash Lite Preview (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.25, "output": 1.5, "cacheRead": 0.025, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "gemini-3.1-flash-image-preview", "name": "Gemini 3.1 Flash Image Preview (Zeabur AI Hub)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0.5, "output": 60, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "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": "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": "gpt-5.4-pro", "name": "GPT-5.4 Pro (Zeabur AI Hub)", "reasoning": true, "input": ["text", "image"], "cost": { "input": 30, "output": 180, "cacheRead": 3, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 8192 },
                          { "id": "claude-opus-4-7", "name": "Claude Opus 4.7 (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-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-6", "name": "Claude Sonnet 4.6 (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": "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.027, "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.5, "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.75, "output": 14, "cacheRead": 0.18, "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.25, "output": 10, "cacheRead": 0.13, "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.05, "output": 0.4, "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.4, "output": 1.9, "cacheRead": 0.08, "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.06, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 204800, "maxTokens": 8192 },
                          { "id": "glm-5", "name": "GLM-5 (Zeabur AI Hub)", "reasoning": false, "input": ["text"], "cost": { "input": 0.8, "output": 2.56, "cacheRead": 0, "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.25, "cacheRead": 0.07, "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 },
                          { "id": "gpt-5.5", "name": "GPT-5.5 (Zeabur AI Hub)", "reasoning": true, "input": ["text", "image"], "cost": { "input": 5, "output": 30, "cacheRead": 0.5, "cacheWrite": 0 }, "contextWindow": 272000, "maxTokens": 8192 },
                          { "id": "deepseek-v4-flash", "name": "DeepSeek V4 Flash (Zeabur AI Hub)", "reasoning": true, "input": ["text"], "cost": { "input": 0.14, "output": 0.28, "cacheRead": 0.03, "cacheWrite": 0 }, "contextWindow": 1048576, "maxTokens": 8192 },
                          { "id": "deepseek-v4-pro", "name": "DeepSeek V4 Pro (Zeabur AI Hub)", "reasoning": true, "input": ["text"], "cost": { "input": 1.74, "output": 3.48, "cacheRead": 0.15, "cacheWrite": 0 }, "contextWindow": 1000000, "maxTokens": 8192 },
                          { "id": "kimi-k2.6", "name": "Kimi K2.6 (Zeabur AI Hub)", "reasoning": true, "input": ["text"], "cost": { "input": 0.75, "output": 3.5, "cacheRead": 0.15, "cacheWrite": 0 }, "contextWindow": 262144, "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: El dominio para acceder a OpenClaw Control UI (ej. my-openclaw)
            - key: ENABLE_CONTROL_UI
              type: STRING
              name: Habilitar Control UI
              description: '''true'' para habilitar la Control UI vía dominio público (predeterminado). ''false'' para solo conexiones locales (más seguro).'
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Clave API de Zeabur AI Hub (Opcional)
              description: Opcional pero recomendado. La plantilla usa zeabur-ai/glm-4.7-flash (económico, rápido) como modelo predeterminado, que requiere esta clave. Sin ella, deberá cambiar a otro proveedor y usar su propia clave API. Puede añadirlo después en la pestaña Variables.
        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.5.28`. 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\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 lo ejecuta, deberá modificar manualmente la configuración correspondiente. Consulte la [documentación oficial](https://docs.openclaw.ai) para más detalles.\n\n---\n\n## Variables de Despliegue\n\nSe le pedirá que complete estas variables al desplegar:\n\n| Variable | Requerida | Descripción |\n|----------|-----------|-------------|\n| **Dominio** | Sí | El subdominio para acceder a OpenClaw (ej. `my-openclaw` → `my-openclaw.zeabur.app`). Se puede eliminar después de cambiar al modo loopback. |\n| **Habilitar Control UI** | Sí | `true` (predeterminado) — habilita la Control UI web vía dominio público. `false` — solo loopback, sin acceso web público (más seguro, usar con Tailscale o canales compatibles como Telegram) |\n| **Clave API de Zeabur AI Hub** | No | Déjelo en blanco para omitir. La plantilla usa `zeabur-ai/glm-4.7-flash` (económico, rápido) como modelo predeterminado, que requiere esta clave — sin ella, deberá cambiar de modelo y usar su propia clave API de otro proveedor (Anthropic, OpenAI, etc.). Puede añadirlo después en la pestaña **Variables**. |\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, abra la URL del servicio desde la pestaña **Red**. En la página de inicio de sesión, pegue el **Gateway Token** (disponible en la pestaña **Instrucciones** o **Variables de entorno** → `OPENCLAW_GATEWAY_TOKEN`) y haga clic en **Connect**\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.): El predeterminado de la plantilla sigue siendo `zeabur-ai/glm-4.7-flash`. Para usar otro proveedor, agregue su clave API mediante variables de entorno, luego cambie el modelo con `/model <id>` en el chat o desde Control UI Settings. 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 **Control UI Chat** o **Comando** en el panel de Zeabur.\n\n**Desde Control 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- Control UI Chat: `/model anthropic/claude-opus-4-7`\n- Comando: `openclaw models set anthropic/claude-opus-4-7`\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. Después de reiniciar, vaya a **Settings → Config** y habilite el plugin de Telegram: `\"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 Control 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. Después de reiniciar, vaya a **Settings → Config** y habilite el plugin de LINE: `\"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. La plantilla escribe `zeabur-ai/glm-4.7-flash` como modelo predeterminado en el primer arranque:\n   - Con Zeabur AI Hub API Key → funciona directamente\n   - Sin → el modelo no responderá; añada una clave de AI Hub (recomendado) o cambie el modelo + añada la clave API de otro proveedor\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 Control 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 Control 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 Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Nota de Seguridad\nLa Control 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 Control 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: CLI Backup (v2026.3.8+)** - Abra **Comando** → Ejecute `openclaw backup create` → Descargue desde **Archivos** en `/home/node`\n  - Solo configuración: `openclaw backup create --only-config`\n  - Excluir workspace: `openclaw backup create --no-include-workspace`\n  - Verificar archivo: `openclaw backup verify <archivo-backup>`\n  - Ejemplo:\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\n- **Método 3: 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   - CLI Backup (v2026.3.8+): `restore <nombre-archivo>` (auto-detectado, ej. `restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`)\n   - Servicio de Zeabur: `restore <nombre-archivo>` (auto-detectado, ej. `restore data-2026-02-27.zip`)\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.7`)\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 Control UI aún no ha sido autenticada con un Gateway Token. Solución:\n- Abra la URL del servicio — aparecerá la página de inicio de sesión. Pegue el **Gateway Token** y haga clic en **Connect**.\n- Puede encontrar el Gateway Token en la pestaña **Instrucciones** del Dashboard de Zeabur o en **Variables de entorno** (`OPENCLAW_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 Control 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 Control 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 Control 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 Control 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 Control UI puede mostrar errores de \"device identity required\".\n- **`dangerouslyDisableDeviceAuth`**: Deshabilita el emparejamiento de dispositivos de la Control 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- **`TZ`** (opcional): Establece la zona horaria del contenedor usando una cadena IANA (ej. `America/Mexico_City`, `America/New_York`, `Europe/Madrid`). Agregue vía la pestaña **Variables** del panel de Zeabur. Por defecto es `UTC` si no se configura.\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/6/1**\n- Actualizar imagen a `2026.5.28` — corrige el fallo de carga de LINE y otros plugins de canal instalados bajo demanda (tras un cambio en la estructura del SDK de plugins, la versión de la imagen fijada ahora coincide con la versión del plugin de canal instalado automáticamente). También añade soporte para Claude Opus 4.8, extracción de PDF cifrados, actualizaciones de proveedores NVIDIA/MiniMax y más de 100 correcciones de seguridad/canales/agentes\n\n**2026/5/5**\n- Actualizar imagen a `2026.5.20` — plugin de transferencia de archivos, optimización de rendimiento de arranque del Gateway, borradores de progreso de streaming unificados, comando `/steer`, mejoras en DM/estado de Discord, soporte de WhatsApp Channel/Newsletter, progreso de streaming en MS Teams, corrección de webhook de Google Chat, corrección de memoria LanceDB, fragmentación de sandbox, y más de 100 correcciones de canales/plugins/proveedores\n\n**2026/4/17**\n- Actualizar imagen a `2026.4.15` — modelo predeterminado de Anthropic cambiado a Claude Opus 4.7, soporte de texto a voz de Gemini, nueva tarjeta de estado Model Auth en Control UI, soporte de almacenamiento en la nube LanceDB, proveedor de embeddings de GitHub Copilot, valores por defecto experimentales para modelos locales ligeros, y más de 50 correcciones de seguridad/proveedores/canales\n- Agregar soporte de modelos de Zeabur AI Hub: `claude-opus-4-7`, `claude-sonnet-4-6`, `glm-5`, `gpt-5.4-pro`\n- Eliminar modelos retirados: `gemini-3-pro-preview`, `kimi-2.5`\n\n**2026/4/6**\n- Actualizar imagen a `2026.4.5` — herramientas de generación de video/música (`video_generate`, `music_generate`) con proveedores xAI/Runway/Alibaba Wan/Google Lyria/MiniMax, plugin de workflow ComfyUI, nuevos proveedores Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle, localización de Control UI en 12 idiomas, Memory Dreaming (promoción experimental de memoria en segundo plano), mejoras en estabilidad de prompt cache, puente MCP loopback de Claude CLI, runtime embebido ACPX, instalación de skills ClawHub desde Control UI, eventos de progreso de plan estructurado, eliminación de alias de configuración legacy (ejecutar `openclaw doctor --fix`), y 100+ correcciones de seguridad/canales/proveedores\n- ⚠️ Breaking: alias de configuración legacy eliminados (`talk.voiceId`, `hooks.internal.handlers`, toggles `allow` de canales, etc.) — ejecutar `openclaw doctor --fix` después de actualizar\n\n**2026/4/1**\n- Actualizar imagen a `2026.3.31` — plano de control de flujo de tareas en segundo plano (libro de tareas respaldado por SQLite, CLI `openclaw flows`), plugin de canal QQ Bot incluido, streaming/proxy/historial/respuestas en hilo de Matrix, soporte de servidor remoto MCP HTTP/SSE, medios salientes de LINE, enrutamiento de aprobación exec de Slack, reacciones de emoji en WhatsApp, búsqueda web nativa de Pi/Codex, failover de sobrecarga configurable, y 60+ correcciones en Slack, Discord, Telegram, Docker, Control UI y plugin SDK\n\n**2026/3/27**\n- Actualizar imagen a `2026.3.24` — Endpoints API compatibles con OpenAI del Gateway (`/v1/models`, `/v1/embeddings`), migración del SDK de Microsoft Teams con respuestas en streaming, infraestructura de generación de video, aislamiento de inicio de canales del gateway, correcciones de temas de foro y dimensiones de fotos en Telegram, corrección de instalación nueva de Docker, fortalecimiento de seguridad en despacho de medios del sandbox, y 60+ correcciones en WhatsApp, Discord, Slack, Feishu y plugin SDK\n\n**2026/3/23**\n- Actualizar imagen a `2026.3.22` — hardening del shutdown SIGTERM del gateway, correcciones en contexto de respuesta de Telegram y entrega de topic announce, registro independiente de herramientas memory, corrección del lazy boundary del runtime del provider, fortalecimiento de seguridad en exec approvals, pairing y descubrimiento de red\n\n**2026/3/15**\n- Actualizar imagen a `2026.3.13-1` — corrección de memory leak en plugin-sdk (resuelve OOM), hardening de sesiones de navegador, targeting de sesiones cron, 50+ correcciones en seguridad, Telegram, Discord, Windows, macOS y validación de configuración\n- Nueva variable de despliegue `ENABLE_CONTROL_UI` — controla el modo de bind del gateway (`lan` vs `loopback`) y acceso a Control UI; por defecto `true`\n- Añadir `NODE_OPTIONS=--max-old-space-size=2048` para prevenir OOM en servidores con poca memoria\n- Eliminar elementos redundantes del script de inicio: inicialización de HEARTBEAT.md, auto-detección de heartbeat target, CLI wrapper, exports/permisos innecesarios, init de MEMORY.md (todo manejado nativamente por OpenClaw)\n- Cambiar comando de inicio del gateway de `node dist/index.js` al binario `openclaw` integrado\n- Mejorar descripciones de variables de despliegue con info del modelo predeterminado e instrucciones en 6 idiomas\n\n**2026/3/13**\n- Actualizar imagen a `2026.3.12` — Control UI dashboard v2, modo rápido GPT-5.4/Claude, plugins de proveedor Ollama/vLLM/SGLang, documentación de despliegue K8s, 20+ correcciones de seguridad (validación de origen WebSocket, endurecimiento de exec approval, bloqueo de auto-carga de plugins), restricción de cron delivery con migración `openclaw doctor --fix`, 60+ nuevas funciones y 100+ correcciones en 4 versiones (2026.3.9–2026.3.12)\n- ⚠️ Cambio importante: cron delivery restringido — ejecute `openclaw doctor --fix` en **Comando** después de actualizar para migrar el almacenamiento cron heredado\n- Agregar documentación de variable de entorno `TZ` para configuración de zona horaria del contenedor\n- Renombrar \"Web UI\" a \"Control UI\" en toda la documentación\n- Eliminar sincronización automática de variables de entorno de canales del script de inicio (plugins de canales ahora se configuran manualmente vía Settings)\n- Eliminar migración de gateway config del script de inicio (la configuración inicial ya incluye todos los campos necesarios)\n- Simplificar flujo de inicio de sesión: eliminar URL \"Web UI (with token)\", usar página de login de Control UI con Gateway Token\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- Actualizar imagen a `2026.3.8` — CLI backup (`openclaw backup create` / `openclaw backup verify`), timeout de silencio en Talk mode, búsqueda web Brave LLM-context, metadatos de procedencia ACP, dedup DM Telegram, correcciones CDP del navegador, guardias de reinicio/config del gateway, 30+ nuevas funciones y 40+ correcciones\n- Agregar documentación de `openclaw backup create` y `openclaw backup verify` (backup CLI integrado con modo solo-config y validación de archivos)\n\n**2026/3/8**\n- Actualizar imagen a `2026.3.7` — interfaz de plugin context engine, bindings persistentes de canal ACP, enrutamiento de agentes por tema en Telegram, build Docker multi-stage, soporte SecretRef de gateway, 30+ nuevas funciones y 40+ correcciones en 5 versiones (2026.3.3–2026.3.7)\n- ⚠️ Cambio incompatible: `gateway.auth.mode` ahora requerido cuando `gateway.auth.token` y `gateway.auth.password` están configurados — la plantilla predefine `mode: \"token\"` (despliegues existentes migran automáticamente al iniciar)\n- Agregar modelos de Zeabur AI Hub: `gemini-3.1-pro-preview`, `gemini-3.1-flash-lite-preview`, `gemini-3.1-flash-image-preview`, `kimi-2.5`\n- Establecer `gateway.auth.mode: \"token\"` explícito (defensivo para futuros cambios de autenticación de gateway)\n- Eliminar flag `--port` redundante del script de inicio de gateway (puerto resuelto automáticamente vía env/config/default)\n\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 soporte de modelos de Zeabur AI Hub: `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\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 Control 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 untuk mengakses OpenClaw Control UI (contoh my-openclaw)
            - key: ENABLE_CONTROL_UI
              type: STRING
              name: Aktifkan Control UI
              description: '''true'' untuk mengaktifkan Control UI via domain publik (default). ''false'' untuk hanya koneksi lokal (lebih aman).'
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Kunci API Zeabur AI Hub (Opsional)
              description: Opsional tapi disarankan. Template ini menggunakan zeabur-ai/glm-4.7-flash (murah, cepat) sebagai model default, yang memerlukan kunci ini. Tanpa kunci ini, Anda perlu beralih ke penyedia lain dan menyediakan API key sendiri. Dapat ditambahkan nanti di tab Variabel.
        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.5.28`. 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\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 Anda menjalankannya, Anda perlu memperbarui pengaturan terkait secara manual. Lihat [dokumentasi resmi](https://docs.openclaw.ai) untuk detailnya.\n\n---\n\n## Variabel Deploy\n\nAnda akan diminta mengisi variabel berikut saat deploy:\n\n| Variabel | Wajib | Deskripsi |\n|----------|-------|-----------|\n| **Domain** | Ya | Subdomain untuk mengakses OpenClaw (contoh `my-openclaw` → `my-openclaw.zeabur.app`). Dapat dihapus setelah beralih ke mode loopback. |\n| **Aktifkan Control UI** | Ya | `true` (default) — mengaktifkan Control UI web via domain publik. `false` — hanya loopback, tanpa akses web publik (lebih aman, gunakan dengan Tailscale atau channel yang didukung seperti Telegram) |\n| **Kunci API Zeabur AI Hub** | Tidak | Kosongkan untuk melewati. Template ini menggunakan `zeabur-ai/glm-4.7-flash` (murah, cepat) sebagai model default, yang memerlukan kunci ini — tanpa kunci ini, Anda perlu beralih model dan menyediakan API key dari penyedia lain (Anthropic, OpenAI, dll.). Dapat ditambahkan nanti di tab **Variabel**. |\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, buka URL layanan dari tab **Networking**. Di halaman login, tempelkan **Gateway Token** (tersedia di tab **Instruksi** atau **Variables** → `OPENCLAW_GATEWAY_TOKEN`) dan klik **Connect**\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.): Default template tetap `zeabur-ai/glm-4.7-flash`. Untuk menggunakan penyedia lain, tambahkan API key-nya via variabel lingkungan, lalu beralih model dengan `/model <id>` di chat atau dari Control UI Settings. 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 **Control UI Chat** atau **Perintah** di dashboard Zeabur.\n\n**Dari Control 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- Control UI Chat: `/model anthropic/claude-opus-4-7`\n- Perintah: `openclaw models set anthropic/claude-opus-4-7`\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. Setelah restart, buka **Settings → Config** dan aktifkan plugin Telegram: `\"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 Control 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. Setelah restart, buka **Settings → Config** dan aktifkan plugin LINE: `\"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. Template menulis `zeabur-ai/glm-4.7-flash` sebagai model default saat boot pertama:\n   - Dengan Zeabur AI Hub API Key → langsung berfungsi\n   - Tanpa → model tidak akan merespons; tambahkan kunci AI Hub (disarankan) atau beralih model + tambahkan kunci API penyedia lain\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 Control 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 Control 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 Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## Catatan Keamanan\nControl UI adalah alat manajemen untuk konfigurasi, pemantauan, dan chat — platform pesan (Telegram, WhatsApp, Discord, dll.) bekerja secara independen tanpa Control 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 Control 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: CLI Backup (v2026.3.8+)** - Buka **Perintah** → Jalankan `openclaw backup create` → Unduh dari **Files** di `/home/node`\n  - Konfigurasi saja: `openclaw backup create --only-config`\n  - Tanpa workspace: `openclaw backup create --no-include-workspace`\n  - Verifikasi arsip: `openclaw backup verify <file-cadangan>`\n  - Contoh:\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\n- **Metode 3: 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   - CLI Backup (v2026.3.8+): `restore <nama-file>` (auto-deteksi, contoh: `restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`)\n   - Layanan Zeabur: `restore <nama-file>` (auto-deteksi, contoh: `restore data-2026-02-27.zip`)\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.7`)\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 Control UI belum diautentikasi dengan Gateway Token. Solusi:\n- Buka URL layanan — halaman login akan muncul. Tempelkan **Gateway Token** dan klik **Connect**.\n- Gateway Token dapat ditemukan di tab **Instruksi** Dashboard Zeabur atau **Variables** (`OPENCLAW_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 Control 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 Control 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** Control 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 Control 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, Control UI mungkin menampilkan error \"device identity required\".\n- **`dangerouslyDisableDeviceAuth`**: Menonaktifkan pemasangan perangkat Control 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- **`TZ`** (opsional): Atur zona waktu container menggunakan string zona waktu IANA (contoh: `Asia/Jakarta`, `America/New_York`, `Europe/London`). Tambahkan melalui tab **Variables** di dashboard Zeabur. Default `UTC` jika tidak diatur.\n\n## Dokumentasi\n- Dokumentasi: https://docs.openclaw.ai\n- GitHub: https://github.com/openclaw/openclaw\n\n## Catatan Perubahan\n**2026/6/1**\n- Upgrade image ke `2026.5.28` — memperbaiki kegagalan pemuatan plugin LINE dan channel lain yang dipasang sesuai permintaan (setelah perubahan struktur SDK plugin, versi image yang dipatok kini cocok dengan versi plugin channel yang dipasang otomatis). Juga menambahkan dukungan Claude Opus 4.8, ekstraksi PDF terenkripsi, pembaruan provider NVIDIA/MiniMax, dan 100+ perbaikan keamanan/channel/agent\n\n**2026/5/5**\n- Upgrade image ke `2026.5.20` — plugin file-transfer, optimasi performa startup Gateway, draft progres streaming terpadu, perintah `/steer`, peningkatan Discord DM/status, dukungan WhatsApp Channel/Newsletter, progres streaming MS Teams, perbaikan webhook Google Chat, perbaikan memori LanceDB, sharding sandbox, dan 100+ perbaikan channel/plugin/provider\n\n**2026/4/17**\n- Upgrade image ke `2026.4.15` — model default Anthropic diubah ke Claude Opus 4.7, dukungan text-to-speech Gemini, kartu status Model Auth baru di Control UI, dukungan penyimpanan cloud LanceDB, provider embedding GitHub Copilot, default eksperimental untuk model lokal ringan, dan 50+ perbaikan keamanan/provider/channel\n- Tambah dukungan model Zeabur AI Hub: `claude-opus-4-7`, `claude-sonnet-4-6`, `glm-5`, `gpt-5.4-pro`\n- Hapus model yang sudah ditarik: `gemini-3-pro-preview`, `kimi-2.5`\n\n**2026/4/6**\n- Upgrade image ke `2026.4.5` — alat pembuatan video/musik (`video_generate`, `music_generate`) dengan provider xAI/Runway/Alibaba Wan/Google Lyria/MiniMax, plugin workflow ComfyUI, provider baru Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle, lokalisasi Control UI 12 bahasa, Memory Dreaming (promosi memori latar belakang eksperimental), peningkatan stabilitas prompt cache, Claude CLI loopback MCP bridge, ACPX embedded runtime, instalasi skill ClawHub dari Control UI, event progres rencana terstruktur, penghapusan alias konfigurasi legacy (jalankan `openclaw doctor --fix`), dan 100+ perbaikan keamanan/channel/provider\n- ⚠️ Breaking: alias konfigurasi legacy dihapus (`talk.voiceId`, `hooks.internal.handlers`, toggle `allow` channel, dll.) — jalankan `openclaw doctor --fix` setelah upgrade\n\n**2026/4/1**\n- Upgrade image ke `2026.3.31` — control plane alur tugas latar belakang (buku besar tugas berbasis SQLite, CLI `openclaw flows`), plugin channel QQ Bot bawaan, streaming/proxy/riwayat/balasan thread Matrix, dukungan server remote MCP HTTP/SSE, media keluar LINE, routing persetujuan exec Slack, reaksi emoji WhatsApp, pencarian web native Pi/Codex, failover overload yang dapat dikonfigurasi, dan 60+ perbaikan di Slack, Discord, Telegram, Docker, Control UI, dan plugin SDK\n\n**2026/3/27**\n- Upgrade image ke `2026.3.24` — Endpoint API Gateway kompatibel OpenAI (`/v1/models`, `/v1/embeddings`), migrasi SDK Microsoft Teams dengan reply streaming, infrastruktur pembuatan video, isolasi startup channel gateway, perbaikan topik forum Telegram & dimensi foto, perbaikan instalasi baru Docker, penguatan keamanan dispatch media sandbox, dan 60+ perbaikan di WhatsApp, Discord, Slack, Feishu, dan plugin SDK\n\n**2026/3/23**\n- Upgrade image ke `2026.3.22` — penguatan shutdown SIGTERM gateway, perbaikan konteks reply Telegram & pengiriman topic announce, registrasi independen memory tools, perbaikan lazy boundary runtime provider, penguatan keamanan exec approvals, pairing, dan network discovery\n\n**2026/3/15**\n- Upgrade image ke `2026.3.13-1` — perbaikan memory leak plugin-sdk (mengatasi OOM crash), penguatan sesi browser, penargetan sesi cron, 50+ perbaikan keamanan, Telegram, Discord, Windows, macOS, dan validasi konfigurasi\n- Tambah variabel deploy `ENABLE_CONTROL_UI` — mengontrol mode bind gateway (`lan` vs `loopback`) dan akses Control UI; default `true`\n- Tambah `NODE_OPTIONS=--max-old-space-size=2048` untuk mencegah OOM di server dengan memori terbatas\n- Hapus item redundan dari skrip startup: inisialisasi HEARTBEAT.md, auto-deteksi heartbeat target, CLI wrapper, export/permission yang tidak perlu, init MEMORY.md (semua ditangani secara native oleh OpenClaw)\n- Ubah perintah startup gateway dari `node dist/index.js` ke binary `openclaw` bawaan\n- Perbaiki deskripsi variabel deploy dengan info model default dan instruksi lokal dalam 6 bahasa\n\n**2026/3/13**\n- Upgrade image ke `2026.3.12` — Control UI dashboard v2, mode cepat GPT-5.4/Claude, plugin provider Ollama/vLLM/SGLang, dokumentasi deployment K8s, 20+ perbaikan keamanan (validasi origin WebSocket, penguatan exec approval, penguncian auto-load plugin), pengetatan cron delivery dengan migrasi `openclaw doctor --fix`, 60+ fitur baru dan 100+ perbaikan di 4 rilis (2026.3.9–2026.3.12)\n- ⚠️ Perubahan penting: cron delivery diperketat — jalankan `openclaw doctor --fix` di **Perintah** setelah upgrade untuk migrasi penyimpanan cron lama\n- Menambahkan dokumentasi variabel lingkungan `TZ` untuk konfigurasi zona waktu container\n- Mengganti nama \"Web UI\" menjadi \"Control UI\" di seluruh dokumentasi\n- Menghapus sinkronisasi otomatis variabel lingkungan saluran dari skrip startup (plugin saluran sekarang dikonfigurasi secara manual melalui Settings)\n- Menghapus migrasi gateway config dari skrip startup (konfigurasi awal sudah mencakup semua field yang diperlukan)\n- Menyederhanakan alur login: menghapus URL \"Web UI (with token)\", menggunakan halaman login Control UI dengan Gateway Token\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- Upgrade image ke `2026.3.8` — CLI backup (`openclaw backup create` / `openclaw backup verify`), konfigurasi timeout diam Talk mode, pencarian web Brave LLM-context, metadata provenance ACP, dedup DM Telegram, perbaikan CDP browser, guard restart/config gateway, 30+ fitur baru dan 40+ perbaikan\n- Tambah dokumentasi `openclaw backup create` dan `openclaw backup verify` (backup CLI bawaan dengan mode config-only dan validasi arsip)\n\n**2026/3/8**\n- Upgrade image ke `2026.3.7` — antarmuka plugin context engine, binding channel ACP persisten, routing agen topik Telegram, build Docker multi-stage, dukungan SecretRef gateway, 30+ fitur baru dan 40+ perbaikan di 5 rilis (2026.3.3–2026.3.7)\n- ⚠️ Perubahan tidak kompatibel: `gateway.auth.mode` sekarang diperlukan ketika `gateway.auth.token` dan `gateway.auth.password` keduanya dikonfigurasi — template menetapkan `mode: \"token\"` (deployment yang ada migrasi otomatis saat startup)\n- Tambah dukungan model Zeabur AI Hub: `gemini-3.1-pro-preview`, `gemini-3.1-flash-lite-preview`, `gemini-3.1-flash-image-preview`, `kimi-2.5`\n- Tetapkan `gateway.auth.mode: \"token\"` eksplisit (defensif untuk perubahan autentikasi gateway di masa depan)\n- Hapus flag `--port` yang redundan dari skrip startup gateway (port diselesaikan otomatis via env/config/default)\n\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 dukungan model Zeabur AI Hub: `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\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 Control 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 Control UI にアクセスするためのドメイン（例：my-openclaw）
            - key: ENABLE_CONTROL_UI
              type: STRING
              name: Control UI を有効化
              description: '''true'' で公開ドメイン経由の Control UI を有効化（デフォルト）。''false'' でローカル接続のみ（より安全）。'
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API キー（任意）
              description: 任意（推奨）。本テンプレートのデフォルトモデルは zeabur-ai/glm-4.7-flash（安価・高速）で、このキーが必要です。未入力の場合は別プロバイダーに切り替えて独自の API キーを用意する必要があります。後から「変数」タブで追加・変更可能です。
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（旧 Clawdbot、Moltbot）は、ローカルで実行され、WebSocket ベースの Gateway アーキテクチャを介して複数のメッセージングプラットフォームに接続する個人用 AI アシスタントです。\n\n⚠️ 本テンプレートは `ghcr.io/openclaw/openclaw:2026.5.28` を使用しています。OpenClaw \U0001F99E は急速に開発中のため、未発見のバグがある可能性があります。バージョンを変更した場合も安定性を保証できません。\n\n⚠️ 問題が発生した場合は、[GitHub issues](https://github.com/openclaw/openclaw/issues) で解決策を探したり、新しい問題を報告したりしてください。Zeabur プラットフォーム関連の問題については、Zeabur サポートにお問い合わせください。\n\n\n⚠️ このテンプレートは Zeabur の[専用サーバー](https://zeabur.com/docs/dedicated-server)が必要です。共有クラスターでは実行できません。\n\n⚠️ 本テンプレートは事前設定済みですぐに使用できます。`openclaw onboard` を実行する必要はありません。実行した場合は、対応する設定を手動で修正する必要があります。詳細は[公式ドキュメント](https://docs.openclaw.ai)を参照してください。\n\n---\n\n## デプロイ変数\n\nデプロイ時に以下の変数を入力します：\n\n| 変数 | 必須 | 説明 |\n|------|------|------|\n| **ドメイン** | はい | OpenClaw にアクセスするためのサブドメイン（例：`my-openclaw` → `my-openclaw.zeabur.app`）。loopback モードに切り替え後は削除可能。 |\n| **Control UI を有効化** | はい | `true`（デフォルト）— 公開ドメイン経由で Control UI を有効化。`false` — ローカルループバックのみ、公開 Web アクセスなし（より安全、Tailscale や Tailscale や Telegram 等の対応チャンネルと併用） |\n| **Zeabur AI Hub API キー** | いいえ | 空欄でスキップ可能。本テンプレートのデフォルトモデルは `zeabur-ai/glm-4.7-flash`（安価・高速）で、このキーが必要です — 未入力の場合はモデルを切り替え、他プロバイダー（Anthropic、OpenAI など）の API キーを用意する必要があります。後から「変数」タブで追加できます。 |\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. デプロイ後、**ネットワーク**タブからサービス URL を開く。ログインページで **Gateway Token**（**手順**タブまたは**環境変数** → `OPENCLAW_GATEWAY_TOKEN` で確認）を貼り付け、**Connect** をクリック\n2. **AI モデルを設定**（いずれかを選択）：\n   - **Zeabur AI Hub**（デフォルトモデル：`glm-4.7-flash`）：デプロイ時に API Key を入力済みの場合、ステップ 3 へ進む。後から Zeabur ダッシュボードの**変数**タブで `ZEABUR_AI_HUB_API_KEY` を追加も可能（追加後はサービスを再起動）。\n   - **他のプロバイダー**（Anthropic、OpenAI など）：テンプレートのデフォルトは引き続き `zeabur-ai/glm-4.7-flash` です。他のプロバイダーを使うには、環境変数で API キーを追加してから、チャットで `/model <id>` または Control UI Settings からモデルを切り替えてください。詳細：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**Control UI Chat** または Zeabur ダッシュボードの**コマンド**からモデルを管理できます。\n\n**Control 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- Control UI Chat：`/model anthropic/claude-opus-4-7`\n- コマンド：`openclaw models set anthropic/claude-opus-4-7`\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. 再起動後、**Settings → Config** で Telegram プラグインを有効にしてください：`\"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 Control 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. 再起動後、**Settings → Config** で LINE プラグインを有効にしてください：`\"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. 本テンプレートは初回起動時に `zeabur-ai/glm-4.7-flash` をデフォルトモデルとして書き込みます：\n   - Zeabur AI Hub API Key を入力した場合 → そのまま動作\n   - 入力しなかった場合 → モデルは応答しません。AI Hub キーを追加（推奨）するか、モデルを切り替えて他プロバイダーの API キーを用意してください\n2. **Chat** ページを開き、テストメッセージを送信\n3. 返答があれば → モデルは正常に動作しています\n4. エラーが出た場合 → API キーが正しく設定されているか確認\n\n**現在の会話のモデルを切り替え**（チャットコマンドで）：\n- `/models` - 利用可能なモデルを表示\n- `/model <model-id>` - この会話のみモデルを切り替え（他の会話には影響しません）\n\n**全ての新しい会話のデフォルトモデルを変更**（Control UI Settings で）：\n- Settings → Agents → Default model\n- **ヒント：** 低コストのモデルをデフォルトに設定しましょう（例：`gemini-2.5-flash-lite`、`gpt-5-nano`）。モデルが使用できなくなった場合、`/new` で新しい会話を開始すればデフォルトモデルに自動的に戻ります。\n\n**AI プロバイダーを追加**（Control 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- 旧バージョン（コマンドなし）：**ファイル** タブまたは Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## セキュリティに関する注意\nControl UI は設定、監視、チャットのための管理ツールです — メッセージングプラットフォーム（Telegram、WhatsApp、Discord など）は Control UI なしで独立して動作します。インバウンド Webhook が不要なプラットフォーム（Telegram、WhatsApp、Discord、Signal、iMessage）のみを使用する場合は、Zeabur ダッシュボードの**ネットワーク**タブでドメインバインディングを削除し、Gateway をパブリックインターネットに公開しないようにできます。すべての管理操作は Zeabur の**コマンド**ターミナルで CLI を使って実行できます（`openclaw config set`、`openclaw models set` など）。パブリックドメインなしで Control 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：CLI バックアップ（v2026.3.8+）** - **コマンド**を開く → `openclaw backup create` を実行 → **ファイル**タブの `/home/node` からダウンロード\n  - 設定のみ：`openclaw backup create --only-config`\n  - ワークスペース除外：`openclaw backup create --no-include-workspace`\n  - アーカイブ検証：`openclaw backup verify <バックアップファイル名>`\n  - 例：\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\n- **方法3：手動バックアップ** - **コマンド**を開く → `backup` を実行 → **ファイル**タブの `/home/node` からダウンロード（例：`backup-1430.tar.gz`）\n  - 旧バージョン（コマンドなし）：`cd /home/node && tar -czvf backup.tar.gz .openclaw`\n\n**復元：**\n1. **ファイル**タブでバックアップファイルを `/home/node` フォルダにアップロード\n2. **コマンド**を開いて実行：\n   - CLI バックアップ（v2026.3.8+）：`restore <バックアップファイル名>`（自動検出、例：`restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`）\n   - Zeabur バックアップサービス：`restore <バックアップファイル名>`（自動検出、例：`restore data-2026-02-27.zip`）\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.7`）に変更\n4. **再起動**をクリックして適用\n\n> ⚠️ タグに `latest` の使用は避けてください — 再起動のたびに最新バージョンが取得され、破壊的な変更や予期しないエラーが発生する可能性があります。安定性のために特定のバージョンを固定してください。\n5. **ログ**タブで Gateway が正常に起動したか確認\n\n> \U0001F4A1 スタートアップスクリプトは起動時に設定を自動移行します — 不足している設定（`trustedProxies`、`dangerouslyDisableDeviceAuth` など）は自動追加されます。既存の設定は上書きされません。\n\n### \"device identity required\"\nControl UI がまだ Gateway Token で認証されていないことを意味します。修正方法：\n- サービス URL を開く — ログインページが表示されます。**Gateway Token** を貼り付けて **Connect** をクリックしてください。\n- Gateway Token は Zeabur Dashboard の**手順**タブまたは**環境変数**（`OPENCLAW_GATEWAY_TOKEN`）で確認できます。\n\nGateway Token は Zeabur Dashboard の**手順**タブまたは**環境変数**（`OPENCLAW_GATEWAY_TOKEN`）で確認できます。\n\n### \"disconnected (1008): pairing required\"\nお使いのデバイス（ブラウザ/アプリ）がまだ Gateway とペアリングされていないことを意味します。ペアリング方法：\n1. Control 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：Control 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- Control 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. 初回接続時はペアリング承認が必要です — Control 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 を正しく識別できるようにします。未設定の場合、Control UI に「device identity required」エラーが表示される可能性があります。\n- **`dangerouslyDisableDeviceAuth`**：Control 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- **`TZ`**（任意）：IANA タイムゾーン文字列でコンテナのタイムゾーンを設定（例：`Asia/Tokyo`、`America/New_York`、`Europe/London`）。Zeabur ダッシュボードの**環境変数**タブから追加。未設定の場合は `UTC` がデフォルト。\n\n## ドキュメント\n- ドキュメント：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 変更履歴\n**2026/6/1**\n- イメージを `2026.5.28` にアップグレード — LINE などオンデマンドでインストールされるチャンネルプラグインの読み込み失敗を修正（プラグイン SDK の構造変更後、固定イメージのバージョンが自動インストールされるチャンネルプラグインのバージョンと一致するようになりました）。さらに Claude Opus 4.8 サポート、暗号化 PDF 抽出、NVIDIA/MiniMax プロバイダー更新、100 以上のセキュリティ/チャンネル/エージェント修正を追加\n\n**2026/5/5**\n- イメージを `2026.5.20` にアップグレード — file-transfer プラグイン、Gateway 起動パフォーマンス最適化、統一ストリーミング進捗ドラフト、`/steer` コマンド、Discord DM/ステータス改善、WhatsApp Channel/Newsletter サポート、MS Teams ストリーミング進捗、Google Chat webhook 修正、LanceDB メモリ修正、sandbox シャーディング、100 以上のチャンネル/プラグイン/プロバイダー修正\n\n**2026/4/17**\n- イメージを `2026.4.15` にアップグレード — デフォルトの Anthropic モデルが Claude Opus 4.7 に、Gemini テキスト読み上げ対応、Control UI に Model Auth ステータスカード追加、LanceDB クラウドストレージ対応、GitHub Copilot embedding プロバイダー、実験的ローカルモデル軽量デフォルト、50 以上のセキュリティ/プロバイダー/チャンネル修正\n- Zeabur AI Hub モデルサポート追加：`claude-opus-4-7`、`claude-sonnet-4-6`、`glm-5`、`gpt-5.4-pro`\n- 廃止モデルを削除：`gemini-3-pro-preview`、`kimi-2.5`\n\n**2026/4/6**\n- イメージを `2026.4.5` にアップグレード — 動画/音楽生成ツール（`video_generate`、`music_generate`）、xAI/Runway/Alibaba Wan/Google Lyria/MiniMax プロバイダー対応、ComfyUI ワークフロープラグイン、Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle プロバイダー追加、Control UI 12 言語ローカライズ、Memory Dreaming（実験的バックグラウンド記憶昇格）、プロンプトキャッシュ安定性改善、Claude CLI ループバック MCP ブリッジ、ACPX 組み込みランタイム、Control UI からの ClawHub スキルインストール、構造化プラン進捗イベント、レガシー設定エイリアス削除（`openclaw doctor --fix` の実行が必要）、100 以上のセキュリティ/チャンネル/プロバイダー修正\n- ⚠️ Breaking：レガシー設定エイリアスが削除されました（`talk.voiceId`、`hooks.internal.handlers`、チャンネル `allow` トグル等）— アップグレード後に `openclaw doctor --fix` を実行してください\n\n**2026/4/1**\n- イメージを `2026.3.31` にアップグレード — バックグラウンドタスクフロー制御プレーン（SQLite ベースのタスク台帳、`openclaw flows` CLI）、QQ Bot バンドルチャンネルプラグイン、Matrix ストリーミング/プロキシ/履歴/スレッド返信、リモート MCP HTTP/SSE サーバーサポート、LINE アウトバウンドメディア、Slack exec 承認ルーティング、WhatsApp 絵文字リアクション、Pi/Codex ネイティブウェブ検索、設定可能なオーバーロードフェイルオーバー、Slack・Discord・Telegram・Docker・Control UI・plugin SDK にわたる 60 以上の修正\n\n**2026/3/27**\n- イメージを `2026.3.24` にアップグレード — Gateway OpenAI 互換 API エンドポイント（`/v1/models`、`/v1/embeddings`）、Microsoft Teams SDK 移行とストリーミング応答、動画生成インフラ、gateway チャンネル起動分離、Telegram フォーラムトピック・写真サイズ修正、Docker 新規インストール修正、sandbox メディアディスパッチセキュリティ強化、WhatsApp・Discord・Slack・Feishu・plugin SDK にわたる 60 以上の修正\n\n**2026/3/23**\n- イメージを `2026.3.22` にアップグレード — gateway SIGTERM shutdown 強化、Telegram 返信コンテキスト・トピック配信修正、memory ツール独立登録、provider runtime lazy boundary 修正、exec approvals / pairing / ネットワーク探索のセキュリティ強化\n\n**2026/3/15**\n- イメージを `2026.3.13-1` にアップグレード — plugin-sdk メモリ膨張修正（OOM クラッシュ解消）、ブラウザセッション強化、cron セッションターゲット、セキュリティ・Telegram・Discord・Windows・macOS・設定検証に関する 50 以上の修正\n- `ENABLE_CONTROL_UI` デプロイ変数を追加 — gateway バインドモード（`lan` vs `loopback`）と Control UI アクセスを制御。デフォルト `true`\n- `NODE_OPTIONS=--max-old-space-size=2048` を追加し、低メモリサーバーでの OOM を防止\n- 起動スクリプトの冗長項目を削除：HEARTBEAT.md 初期化、heartbeat ターゲット自動検出、CLI ラッパー、不要な export/権限設定、MEMORY.md 初期化（すべて OpenClaw がネイティブに処理）\n- Gateway 起動コマンドを `node dist/index.js` から内蔵 `openclaw` コマンドに変更\n- デプロイ変数の説明を改善、デフォルトモデル情報と 6 言語のローカライズ対応\n\n**2026/3/13**\n- イメージを `2026.3.12` にアップグレード — Control UI ダッシュボード v2、GPT-5.4/Claude 高速モード、Ollama/vLLM/SGLang プロバイダープラグイン、K8s デプロイドキュメント、20 以上のセキュリティ修正（WebSocket origin 検証、exec approval 強化、plugin 自動ロードロックダウン）、cron delivery 引き締めと `openclaw doctor --fix` 移行、60 以上の新機能と 100 以上の修正、4 リリース分（2026.3.9–2026.3.12）\n- ⚠️ 破壊的変更：cron delivery が厳格化 — アップグレード後に**コマンド**で `openclaw doctor --fix` を実行してレガシー cron ストレージを移行してください\n- コンテナタイムゾーン設定用の `TZ` 環境変数ドキュメントを追加\n- 全ドキュメントで「Web UI」を「Control UI」に改名\n- 起動スクリプトからチャンネル環境変数の自動同期を削除（チャンネルプラグインは Settings から手動設定に変更）\n- 起動スクリプトから gateway config マイグレーションを削除（初期設定に必要な項目がすべて含まれているため）\n- ログインフローを簡素化：「Web UI (with token)」URL を削除し、Control UI ログインページで Gateway Token を入力する方式に変更\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- イメージを `2026.3.8` にアップグレード — CLI バックアップ（`openclaw backup create` / `openclaw backup verify`）、Talk モードサイレンスタイムアウト設定、Brave LLM-context ウェブ検索、ACP プロベナンスメタデータ、Telegram DM 重複排除、ブラウザ CDP 修正、gateway 再起動/設定ガード、30 以上の新機能と 40 以上の修正\n- バックアップドキュメントに `openclaw backup create` と `openclaw backup verify` の説明を追加（組み込み CLI バックアップ、設定のみモードとアーカイブ検証対応）\n\n**2026/3/8**\n- イメージを `2026.3.7` にアップグレード — context engine プラグインインターフェース、ACP 永続チャネルバインディング、Telegram トピックエージェントルーティング、Docker マルチステージビルド、gateway SecretRef サポート、5 リリース（2026.3.3–2026.3.7）にわたる 30 以上の新機能と 40 以上の修正\n- ⚠️ 破壊的変更：`gateway.auth.token` と `gateway.auth.password` の両方が設定されている場合、`gateway.auth.mode` の明示的な設定が必要 — テンプレートは `mode: \"token\"` をプリセット（既存デプロイは起動時に自動移行）\n- Zeabur AI Hub モデル追加：`gemini-3.1-pro-preview`、`gemini-3.1-flash-lite-preview`、`gemini-3.1-flash-image-preview`、`kimi-2.5`\n- 明示的な `gateway.auth.mode: \"token\"` を設定（将来の gateway 認証変更への防御）\n- gateway 起動スクリプトから冗長な `--port` フラグを削除（ポートは環境変数/設定/デフォルトから自動解決）\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- Zeabur AI Hub モデルサポート追加：`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\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 を検出して実行に失敗するのを防止（後で Control 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 Control UI 的域名（例如 my-openclaw）
            - key: ENABLE_CONTROL_UI
              type: STRING
              name: 启用 Control UI
              description: 设为 'true' 通过公开域名启用 Control UI（默认）。设为 'false' 仅本地连接（更安全）。
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API 密钥（选填）
              description: 选填但建议填入。本模板默认模型为 zeabur-ai/glm-4.7-flash（便宜、快速），需要此密钥才能运行。若未填入，需自行切换至其他供应商并提供对应的 API Key。之后可在「变量」页签新增或修改。
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一个个人 AI 助手，可在本地运行并通过 WebSocket Gateway 架构连接多个消息平台。\n\n⚠️ 本模板使用 `ghcr.io/openclaw/openclaw:2026.5.28`。OpenClaw \U0001F99E 正在快速开发中，可能存在尚未发现的 bug。更改版本后也无法确保稳定性。\n\n⚠️ 如果遇到任何问题，欢迎到 [GitHub issues](https://github.com/openclaw/openclaw/issues) 寻找解决方案或回报新问题。Zeabur 平台相关问题请联系 Zeabur 支持。\n\n\n⚠️ 此模板需要在 Zeabur 上使用[专用服务器](https://zeabur.com/docs/dedicated-server)，无法在共享集群上运行。\n\n⚠️ 本模板已预先配置好可直接使用，不需要运行 `openclaw onboard`。如果运行了，需要自行修改对应的设置。请参考[官方文档](https://docs.openclaw.ai)。\n\n---\n\n## 部署变量\n\n部署时需填写以下变量：\n\n| 变量 | 必填 | 说明 |\n|------|------|------|\n| **域名** | 是 | 用来访问 OpenClaw 的子域名（例如 `my-openclaw` → `my-openclaw.zeabur.app`）。切换为 loopback 模式后可移除。 |\n| **启用 Control UI** | 是 | `true`（默认）— 通过公开域名启用 Control UI。`false` — 仅绑定本地回环，无公开网页访问（更安全，配合 Tailscale 或 Tailscale 或 Telegram 等支持的通讯频道使用） |\n| **Zeabur AI Hub API 密钥** | 否 | 可留空跳过。本模板默认模型为 `zeabur-ai/glm-4.7-flash`（便宜、快速），需要此密钥才能运行 — 若未填入，需自行切换模型并提供其他供应商（Anthropic、OpenAI 等）的 API Key。之后可在服务的「变量」页签新增。 |\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. 部署完成后，从**网络**页签打开服务网址。在登录页面粘贴 **Gateway Token**（可在**使用说明**页签或**环境变量** → `OPENCLAW_GATEWAY_TOKEN` 中找到），点击 **Connect**\n2. **设置 AI 模型**（二选一）：\n   - **Zeabur AI Hub**（默认模型：`glm-4.7-flash`）：若部署时已输入 API Key，直接前往步骤 3。也可之后在 Zeabur 控制台的**变量**页签添加 `ZEABUR_AI_HUB_API_KEY`（添加后记得重新启动服务）。\n   - **其他供应商**（Anthropic、OpenAI 等）：模板默认仍是 `zeabur-ai/glm-4.7-flash`。要改用其他供应商，请通过环境变量添加该供应商的 API Key，接着在聊天中用 `/model <id>` 或通过 Control UI Settings 切换模型。详情请见：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可通过 **Control UI Chat** 或 Zeabur 控制台的**命令**管理模型。\n\n**通过 Control 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- Control UI Chat：`/model anthropic/claude-opus-4-7`\n- 命令：`openclaw models set anthropic/claude-opus-4-7`\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. 重启后，请前往 **Settings → Config** 启用 Telegram 插件：`\"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 Control 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. 重启后，请前往 **Settings → Config** 启用 LINE 插件：`\"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. 本模板首次启动时会将 `zeabur-ai/glm-4.7-flash` 写入为默认模型：\n   - 有填 Zeabur AI Hub API Key → 开箱即用\n   - 没有填 → 模型将无法回应；请加上 AI Hub 密钥（建议）或切换模型并提供其他供应商的 API Key\n2. 打开 **Chat** 页面，发送一条测试消息\n3. 如果收到回复 → 模型正常运作\n4. 如果出现错误 → 确认 API 密钥是否正确设置\n\n**切换本次对话的模型**（通过聊天命令）：\n- `/models` - 查看可用模型\n- `/model <model-id>` - 仅在本次对话中切换模型（不影响其他对话）\n\n**修改所有新对话的默认模型**（通过 Control UI Settings）：\n- 前往 Settings → Agents → Default model\n- **建议：** 将低费用的模型设为默认（如 `gemini-2.5-flash-lite`、`gpt-5-nano`）。当模型无法使用时，可用 `/new` 开启新对话，自动切回默认模型。\n\n**添加 AI 供应商**（通过 Control 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- 旧版（没有这些命令）：通过**文件**页签或 Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## 安全提示\nControl UI 是用于配置、监控与聊天的管理工具 — 消息平台（Telegram、WhatsApp、Discord 等）不需要 Control UI 也能独立运作。如果你只使用不需要 inbound webhook 的平台（Telegram、WhatsApp、Discord、Signal、iMessage），可以在 Zeabur 控制台的**网络**页签移除域名绑定，避免将 Gateway 暴露在公网上。所有管理操作也可以在 Zeabur 的**命令**终端通过 CLI 完成（`openclaw config set`、`openclaw models set` 等）。若需在不绑定公网域名的情况下访问 Control 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- **方法二：CLI 备份（v2026.3.8+）** - 打开**命令** → 执行 `openclaw backup create` → 从**文件**页签的 `/home/node` 下载\n  - 仅备份配置：`openclaw backup create --only-config`\n  - 排除工作区：`openclaw backup create --no-include-workspace`\n  - 验证备份档：`openclaw backup verify <备份文件名>`\n  - 示例：\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\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   - CLI 备份（v2026.3.8+）：`restore <备份文件名>`（自动检测，例如 `restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`）\n   - Zeabur 备份服务：`restore <备份文件名>`（自动检测，例如 `restore data-2026-02-27.zip`）\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.7`）\n4. 点击**重新启动**以应用更新\n\n> ⚠️ 避免使用 `latest` 作为标签 — 它会在每次重启时拉取最新版本，可能引入破坏性变更或无法预期的错误。建议固定使用特定版本号以确保稳定性。\n5. 到**日志**页签确认 Gateway 正常启动\n\n> \U0001F4A1 启动脚本会在每次开机时自动迁移配置 — 若缺少新设置（如 `trustedProxies`、`dangerouslyDisableDeviceAuth`）会自动补上。既有设置不会被覆盖。\n\n### \"device identity required\"\n表示 Control UI 尚未通过 Gateway Token 验证。修复方式：\n- 打开服务网址 — 登录页面会自动出现。粘贴 **Gateway Token** 并点击 **Connect**。\n- Gateway Token 可在 Zeabur Dashboard 的**使用说明**页签或**环境变量**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\nGateway Token 可在 Zeabur Dashboard 的**说明**页签或**环境变量**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\n### \"disconnected (1008): pairing required\"\n表示您的设备（浏览器/应用程序）尚未与 Gateway 完成配对。配对方式：\n1. 打开 Control 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：首次登录 Control 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- 或在 Control 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. 设备首次连接时需要配对核准 — 在 Control 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。未设置时，Control UI 可能会出现「device identity required」错误。\n- **`dangerouslyDisableDeviceAuth`**：停用 Control 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- **`TZ`**（选填）：使用 IANA 时区字符串设置容器时区（例如 `Asia/Taipei`、`America/New_York`、`Europe/London`）。通过 Zeabur 仪表板的**环境变量**页签添加。未设置时默认为 `UTC`。\n\n## 文档\n- 文档：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 更新日志\n**2026/6/1**\n- 升级镜像至 `2026.5.28` — 修复 LINE 等需即时安装的频道插件加载失败问题（插件 SDK 结构调整后，固定镜像版本现已与自动安装的频道插件版本相符）。同时新增 Claude Opus 4.8 支持、加密 PDF 解析、NVIDIA/MiniMax provider 更新，以及 100+ 安全性/频道/agent 修复\n\n**2026/5/5**\n- 升级镜像至 `2026.5.20` — file-transfer plugin、Gateway 启动性能优化、统一流式进度草稿、`/steer` 命令、Discord DM/状态改善、WhatsApp Channel/Newsletter 支持、MS Teams 流式进度、Google Chat webhook 修复、LanceDB 内存修复、sandbox 分片，以及 100+ 频道/plugin/provider 修复\n\n**2026/4/17**\n- 升级镜像至 `2026.4.15` — 默认 Anthropic 模型改为 Claude Opus 4.7、Gemini 文字转语音支持、Control UI 新增 Model Auth 状态卡片、LanceDB 云端存储支持、GitHub Copilot embedding provider、实验性本地模型精简默认，以及 50+ 安全/provider/频道修复\n- 新增 Zeabur AI Hub 模型支持：`claude-opus-4-7`、`claude-sonnet-4-6`、`glm-5`、`gpt-5.4-pro`\n- 移除已下架模型：`gemini-3-pro-preview`、`kimi-2.5`\n\n**2026/4/6**\n- 升级镜像至 `2026.4.5` — 视频/音乐生成工具（`video_generate`、`music_generate`），支持 xAI/Runway/阿里 Wan/Google Lyria/MiniMax provider、ComfyUI workflow 插件、新增 Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle provider、Control UI 12 语言本地化、Memory Dreaming（实验性后台记忆晋升）、prompt cache 稳定性改善、Claude CLI loopback MCP bridge、ACPX 内嵌 runtime、Control UI 内 ClawHub skill 安装、结构化计划进度事件、移除 legacy config alias（需执行 `openclaw doctor --fix`），以及 100+ 安全/频道/provider 修复\n- ⚠️ Breaking：已移除 legacy config alias（`talk.voiceId`、`hooks.internal.handlers`、channel `allow` 等）— 升级后请执行 `openclaw doctor --fix`\n\n**2026/4/1**\n- 升级镜像至 `2026.3.31` — 后台任务流程控制平面（SQLite 支持的任务账本、`openclaw flows` CLI）、QQ Bot 内置频道插件、Matrix 流式/代理/历史/线程回复、远程 MCP HTTP/SSE 服务器支持、LINE 外发媒体、Slack exec 审核路由、WhatsApp 表情符号回应、Pi/Codex 原生网页搜索、可配置的过载容错切换，以及 60+ 修复涵盖 Slack、Discord、Telegram、Docker、Control UI 及 plugin SDK\n\n**2026/3/27**\n- 升级镜像至 `2026.3.24` — Gateway OpenAI 兼容 API 端点（`/v1/models`、`/v1/embeddings`）、Microsoft Teams SDK 迁移与流式回复、视频生成基础设施、gateway 频道启动隔离、Telegram 论坛主题与照片尺寸修复、Docker 全新安装修复、sandbox 媒体分发安全强化，以及 60+ 修复涵盖 WhatsApp、Discord、Slack、飞书及 plugin SDK\n\n**2026/3/23**\n- 升级镜像至 `2026.3.22` — gateway SIGTERM shutdown 强化、Telegram 回复上下文与 topic 推送修复、memory 工具独立注册、provider runtime lazy boundary 修复、exec approvals / pairing / 网络探索安全强化\n\n**2026/3/15**\n- 升级镜像至 `2026.3.13-1` — 修复 plugin-sdk 内存暴增（解决 OOM 崩溃）、浏览器 session 强化、cron session 目标、50+ 修复涵盖安全性、Telegram、Discord、Windows、macOS 及配置验证\n- 新增 `ENABLE_CONTROL_UI` 部署变量 — 控制 gateway 绑定模式（`lan` vs `loopback`）及 Control UI 访问；默认为 `true`\n- 新增 `NODE_OPTIONS=--max-old-space-size=2048` 防止低内存服务器 OOM\n- 移除启动脚本冗余项：HEARTBEAT.md 初始化、heartbeat 目标自动检测、CLI wrapper、多余的 export/权限设置、MEMORY.md 初始化（均由 OpenClaw 原生处理）\n- Gateway 启动命令从 `node dist/index.js` 改为内置 `openclaw` 命令\n- 改善部署变量说明，包含默认模型信息及 6 种语言的本地化说明\n\n**2026/3/13**\n- 升级镜像至 `2026.3.12` — Control UI 仪表板 v2、GPT-5.4/Claude 快速模式、Ollama/vLLM/SGLang provider 插件、K8s 部署文档、20+ 安全修复（WebSocket origin 验证、exec approval 强化、plugin 自动加载锁定）、cron delivery 收紧并需要 `openclaw doctor --fix` 迁移，共 60+ 新功能及 100+ 修复，涵盖 4 个版本（2026.3.9–2026.3.12）\n- ⚠️ 重大变更：cron delivery 已收紧 — 升级后请在**命令**中执行 `openclaw doctor --fix` 以迁移旧版 cron 存储格式\n- 新增 `TZ` 环境变量文档，用于容器时区设置\n- 全部文档中「Web UI」正名为「Control UI」\n- 移除启动脚本中的频道环境变量自动同步（频道插件改为通过 Settings 手动配置）\n- 移除启动脚本中的 gateway config 迁移（初始配置已包含所有必要字段）\n- 简化登录流程：移除「Web UI (with token)」网址，改用 Control UI 登录页面输入 Gateway Token\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- 升级镜像至 `2026.3.8` — CLI 备份（`openclaw backup create` / `openclaw backup verify`）、Talk 模式静音超时配置、Brave LLM-context 网页搜索、ACP 来源元数据、Telegram DM 去重、浏览器 CDP 修复、gateway 重启/配置保护，共 30+ 新功能及 40+ 修复\n- 备份文档新增 `openclaw backup create` 和 `openclaw backup verify` 说明（内建 CLI 备份，支持仅配置模式和备份档验证）\n\n**2026/3/8**\n- 升级镜像至 `2026.3.7` — context engine plugin 接口、ACP 持久频道绑定、Telegram 主题 agent 路由、Docker 多阶段构建、gateway SecretRef 支持，横跨 5 个版本（2026.3.3–2026.3.7）共 30+ 新功能及 40+ 修复\n- ⚠️ 破坏性变更：同时设定 `gateway.auth.token` 和 `gateway.auth.password` 时，须明确设定 `gateway.auth.mode` — 模板已预设 `mode: \"token\"`（既有部署启动时自动迁移）\n- 新增 Zeabur AI Hub 模型支援：`gemini-3.1-pro-preview`、`gemini-3.1-flash-lite-preview`、`gemini-3.1-flash-image-preview`、`kimi-2.5`\n- 设定明确的 `gateway.auth.mode: \"token\"`（防御未来 gateway 验证变更）\n- 移除 gateway 启动脚本中多余的 `--port` 参数（port 自动通过环境变量/配置文件/默认值解析）\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- 新增 Zeabur AI Hub 模型支援：`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\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 然后执行失败（可之后通过 Control 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 Control UI 的網域（例如 my-openclaw）
            - key: ENABLE_CONTROL_UI
              type: STRING
              name: 啟用 Control UI
              description: 設為 'true' 透過公開網域啟用 Control UI（預設）。設為 'false' 僅本地連線（較安全）。
            - key: ZEABUR_AI_HUB_API_KEY
              type: STRING
              name: Zeabur AI Hub API 金鑰（選填）
              description: 選填但建議填入。本模板預設模型為 zeabur-ai/glm-4.7-flash（便宜、快速），需要此金鑰才能運作。若未填入，需自行切換至其他供應商並提供對應的 API Key。之後可在「環境變數」分頁新增或修改。
        readme: "# OpenClaw \U0001F99E\nOpenClaw \U0001F99E（原 Clawdbot、Moltbot）是一個個人 AI 助手，可在本地運行並透過 WebSocket Gateway 架構連接多個訊息平台。\n\n⚠️ 本模板使用 `ghcr.io/openclaw/openclaw:2026.5.28`。OpenClaw \U0001F99E 正在快速開發中，可能存在尚未發現的 bug。更改版本後也無法確保穩定性。\n\n⚠️ 如果遇到任何問題，歡迎到 [GitHub issues](https://github.com/openclaw/openclaw/issues) 尋找解決方案或回報新問題。Zeabur 平台相關問題請聯繫 Zeabur 支援。\n\n\n⚠️ 此模板需要在 Zeabur 上使用[專用伺服器](https://zeabur.com/docs/dedicated-server)，無法在共享叢集上運行。\n\n⚠️ 本模板已預先設定好可直接使用，不需要執行 `openclaw onboard`。如果執行了，需要自行修改對應的設定。請參考[官方文件](https://docs.openclaw.ai)。\n\n---\n\n## 部署變數\n\n部署時需填寫以下變數：\n\n| 變數 | 必填 | 說明 |\n|------|------|------|\n| **網域** | 是 | 用來存取 OpenClaw 的子網域（例如 `my-openclaw` → `my-openclaw.zeabur.app`）。切換為 loopback 模式後可移除。 |\n| **啟用 Control UI** | 是 | `true`（預設）— 透過公開網域啟用 Control UI。`false` — 僅綁定本地迴路，無公開網頁存取（較安全，搭配 Tailscale 或 Tailscale 或 Telegram 等支援的通訊頻道使用） |\n| **Zeabur AI Hub API 金鑰** | 否 | 可留空跳過。本模板預設模型為 `zeabur-ai/glm-4.7-flash`（便宜、快速），需要此金鑰才能運作 — 若未填入，需自行切換模型並提供其他供應商（Anthropic、OpenAI 等）的 API Key。之後可在服務的「環境變數」分頁新增。 |\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. 部署完成後，從**網路**頁籤開啟服務網址。在登入頁面貼上 **Gateway Token**（可在**使用說明**頁籤或**環境變數** → `OPENCLAW_GATEWAY_TOKEN` 中找到），點擊 **Connect**\n2. **設定 AI 模型**（二擇一）：\n   - **Zeabur AI Hub**（預設模型：`glm-4.7-flash`）：若部署時已輸入 API Key，直接前往步驟 3。也可之後在 Zeabur 控制台的**變數**頁籤新增 `ZEABUR_AI_HUB_API_KEY`（新增後記得重新啟動服務）。\n   - **其他供應商**（Anthropic、OpenAI 等）：模板預設仍是 `zeabur-ai/glm-4.7-flash`。要改用其他供應商，請透過環境變數新增該供應商的 API Key,接著在聊天中用 `/model <id>` 或透過 Control UI Settings 切換模型。詳情請見：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可透過 **Control UI Chat** 或 Zeabur 控制台的**指令**管理模型。\n\n**透過 Control 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- Control UI Chat：`/model anthropic/claude-opus-4-7`\n- 指令：`openclaw models set anthropic/claude-opus-4-7`\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. 重啟後，請前往 **Settings → Config** 啟用 Telegram 外掛：`\"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 Control 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. 重啟後，請前往 **Settings → Config** 啟用 LINE 外掛：`\"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. 本模板首次啟動時會將 `zeabur-ai/glm-4.7-flash` 寫入為預設模型：\n   - 有填 Zeabur AI Hub API Key → 開箱即用\n   - 沒有填 → 模型將無法回應；請加上 AI Hub 金鑰（建議）或切換模型並提供其他供應商的 API Key\n2. 開啟 **Chat** 頁面，發送一則測試訊息\n3. 如果收到回覆 → 模型正常運作\n4. 如果出現錯誤 → 確認 API 金鑰是否正確設定\n\n**切換本次對話的模型**（透過聊天指令）：\n- `/models` - 查看可用模型\n- `/model <model-id>` - 僅在本次對話中切換模型（不影響其他對話）\n\n**修改所有新對話的預設模型**（透過 Control UI Settings）：\n- 前往 Settings → Agents → Default model\n- **建議：** 將低費用的模型設為預設（如 `gemini-2.5-flash-lite`、`gpt-5-nano`）。當模型無法使用時，可用 `/new` 開啟新對話，自動切回預設模型。\n\n**新增 AI 供應商**（透過 Control 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- 舊版（沒有這些指令）：透過**檔案**頁籤或 Control 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.75, \"output\": 14, \"cacheRead\": 0.18, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5.1\", \"name\": \"GPT-5.1\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 1.25, \"output\": 10, \"cacheRead\": 0.13, \"cacheWrite\": 0 }, \"contextWindow\": 400000, \"maxTokens\": 8192 },\n{ \"id\": \"gpt-5-nano\", \"name\": \"GPT-5 Nano\", \"reasoning\": false, \"input\": [\"text\", \"image\"], \"cost\": { \"input\": 0.05, \"output\": 0.4, \"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.4, \"output\": 1.9, \"cacheRead\": 0.08, \"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.06, \"output\": 0.4, \"cacheRead\": 0, \"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.25, \"cacheRead\": 0.07, \"cacheWrite\": 0 }, \"contextWindow\": 131072, \"maxTokens\": 8192 }\n```\n\n## 安全提示\nControl UI 是用於設定、監控與聊天的管理工具 — 訊息平台（Telegram、WhatsApp、Discord 等）不需要 Control UI 也能獨立運作。如果你只使用不需要 inbound webhook 的平台（Telegram、WhatsApp、Discord、Signal、iMessage），可以在 Zeabur 控制台的**網路**頁籤移除網域綁定，避免將 Gateway 暴露在公網上。所有管理操作也可以在 Zeabur 的**指令**終端透過 CLI 完成（`openclaw config set`、`openclaw models set` 等）。若需在不綁定公網網域的情況下存取 Control 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- **方法二：CLI 備份（v2026.3.8+）** - 開啟**指令** → 執行 `openclaw backup create` → 從**檔案**頁籤的 `/home/node` 下載\n  - 僅備份設定：`openclaw backup create --only-config`\n  - 排除工作區：`openclaw backup create --no-include-workspace`\n  - 驗證備份檔：`openclaw backup verify <備份檔名>`\n  - 範例：\n  ```\n  $ openclaw backup create\n  Backup archive: /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  Included 1 path:\n  - state: ~/.openclaw\n  Skipped 1 path:\n  - workspace: ~/.openclaw/workspace (covered by ~/.openclaw)\n  Created /home/node/2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz\n  ```\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   - CLI 備份（v2026.3.8+）：`restore <備份檔名>`（自動偵測，例如 `restore 2026-03-09T15-08-31.114Z-openclaw-backup.tar.gz`）\n   - Zeabur 備份服務：`restore <備份檔名>`（自動偵測，例如 `restore data-2026-02-27.zip`）\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.7`）\n4. 點擊**重新啟動**以套用更新\n\n> ⚠️ 避免使用 `latest` 作為標籤 — 它會在每次重啟時拉取最新版本，可能引入破壞性變更或無法預期的錯誤。建議固定使用特定版本號以確保穩定性。\n5. 到**紀錄**頁籤確認 Gateway 正常啟動\n\n> \U0001F4A1 啟動腳本會在每次開機時自動遷移設定 — 若缺少新設定（如 `trustedProxies`、`dangerouslyDisableDeviceAuth`）會自動補上。既有設定不會被覆蓋。\n\n### \"device identity required\"\n表示 Control UI 尚未通過 Gateway Token 驗證。修復方式：\n- 開啟服務網址 — 登入頁面會自動出現。貼上 **Gateway Token** 並點擊 **Connect**。\n- Gateway Token 可在 Zeabur Dashboard 的**使用說明**頁籤或**環境變數**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\nGateway Token 可在 Zeabur Dashboard 的**說明**頁籤或**環境變數**（`OPENCLAW_GATEWAY_TOKEN`）中找到。\n\n### \"disconnected (1008): pairing required\"\n表示您的裝置（瀏覽器/應用程式）尚未與 Gateway 完成配對。配對方式：\n1. 開啟 Control 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：首次登入 Control 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- 或在 Control 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. 裝置首次連線時需要配對核准 — 在 Control 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。未設定時，Control UI 可能會出現「device identity required」錯誤。\n- **`dangerouslyDisableDeviceAuth`**：停用 Control 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- **`TZ`**（選填）：使用 IANA 時區字串設定容器時區（例如 `Asia/Taipei`、`America/New_York`、`Europe/London`）。透過 Zeabur 儀表板的**環境變數**頁籤新增。未設定時預設為 `UTC`。\n\n## 文件\n- 文件：https://docs.openclaw.ai\n- GitHub：https://github.com/openclaw/openclaw\n\n## 更新日誌\n**2026/6/1**\n- 升級映像檔至 `2026.5.28` — 修復 LINE 等需即時安裝的頻道外掛載入失敗問題（外掛 SDK 結構調整後，固定映像檔版本現已與自動安裝的頻道外掛版本相符）。同時新增 Claude Opus 4.8 支援、加密 PDF 解析、NVIDIA/MiniMax provider 更新，以及 100+ 安全性/頻道/agent 修復\n\n**2026/5/5**\n- 升級映像檔至 `2026.5.20` — file-transfer plugin、Gateway 啟動效能優化、統一串流進度草稿、`/steer` 指令、Discord DM/狀態改善、WhatsApp Channel/Newsletter 支援、MS Teams 串流進度、Google Chat webhook 修復、LanceDB 記憶體修復、sandbox 分片，以及 100+ 頻道/plugin/provider 修復\n\n**2026/4/17**\n- 升級映像檔至 `2026.4.15` — 預設 Anthropic 模型改為 Claude Opus 4.7、Gemini 文字轉語音支援、Control UI 新增 Model Auth 狀態卡片、LanceDB 雲端儲存支援、GitHub Copilot embedding provider、實驗性本地模型精簡預設，以及 50+ 安全/provider/頻道修復\n- 新增 Zeabur AI Hub 模型支援：`claude-opus-4-7`、`claude-sonnet-4-6`、`glm-5`、`gpt-5.4-pro`\n- 移除已下架模型：`gemini-3-pro-preview`、`kimi-2.5`\n\n**2026/4/6**\n- 升級映像檔至 `2026.4.5` — 影片/音樂生成工具（`video_generate`、`music_generate`），支援 xAI/Runway/阿里 Wan/Google Lyria/MiniMax provider、ComfyUI workflow 插件、新增 Qwen/Fireworks AI/StepFun/Amazon Bedrock Mantle provider、Control UI 12 語言在地化、Memory Dreaming（實驗性背景記憶晉升）、prompt cache 穩定性改善、Claude CLI loopback MCP bridge、ACPX 內嵌 runtime、Control UI 內 ClawHub skill 安裝、結構化計畫進度事件、移除 legacy config alias（需執行 `openclaw doctor --fix`），以及 100+ 安全/頻道/provider 修復\n- ⚠️ Breaking：已移除 legacy config alias（`talk.voiceId`、`hooks.internal.handlers`、channel `allow` 等）— 升級後請執行 `openclaw doctor --fix`\n\n**2026/4/1**\n- 升級映像檔至 `2026.3.31` — 背景任務流程控制平面（SQLite 支援的任務帳本、`openclaw flows` CLI）、QQ Bot 內建頻道插件、Matrix 串流/代理/歷史/執行緒回覆、遠端 MCP HTTP/SSE 伺服器支援、LINE 外發媒體、Slack exec 審核路由、WhatsApp 表情符號回應、Pi/Codex 原生網頁搜尋、可設定的過載容錯切換，以及 60+ 修復涵蓋 Slack、Discord、Telegram、Docker、Control UI 及 plugin SDK\n\n**2026/3/27**\n- 升級映像檔至 `2026.3.24` — Gateway OpenAI 相容 API 端點（`/v1/models`、`/v1/embeddings`）、Microsoft Teams SDK 遷移與串流回覆、影片生成基礎設施、gateway 頻道啟動隔離、Telegram 論壇主題與照片尺寸修復、Docker 全新安裝修復、sandbox 媒體分發安全強化，以及 60+ 修復涵蓋 WhatsApp、Discord、Slack、飛書及 plugin SDK\n\n**2026/3/23**\n- 升級映像檔至 `2026.3.22` — gateway SIGTERM shutdown 強化、Telegram 回覆上下文與 topic 推播修復、memory 工具獨立註冊、provider runtime lazy boundary 修復、exec approvals / pairing / 網路探索安全強化\n\n**2026/3/15**\n- 升級映像檔至 `2026.3.13-1` — 修復 plugin-sdk 記憶體暴增（解決 OOM 崩潰）、瀏覽器 session 強化、cron session 目標、50+ 修復涵蓋安全性、Telegram、Discord、Windows、macOS 及設定驗證\n- 新增 `ENABLE_CONTROL_UI` 部署變數 — 控制 gateway 綁定模式（`lan` vs `loopback`）及 Control UI 存取；預設為 `true`\n- 新增 `NODE_OPTIONS=--max-old-space-size=2048` 防止低記憶體伺服器 OOM\n- 移除啟動腳本冗餘項目：HEARTBEAT.md 初始化、heartbeat 目標自動偵測、CLI wrapper、多餘的 export/權限設定、MEMORY.md 初始化（皆由 OpenClaw 原生處理）\n- Gateway 啟動指令從 `node dist/index.js` 改為內建的 `openclaw` 命令\n- 改善部署變數說明，包含預設模型資訊及 6 種語言的本地化說明\n\n**2026/3/13**\n- 升級映像檔至 `2026.3.12` — Control UI 儀表板 v2、GPT-5.4/Claude 快速模式、Ollama/vLLM/SGLang provider 外掛、K8s 部署文件、20+ 安全修復（WebSocket origin 驗證、exec approval 強化、plugin 自動載入鎖定）、cron delivery 收緊並需要 `openclaw doctor --fix` 遷移，共 60+ 新功能及 100+ 修復，涵蓋 4 個版本（2026.3.9–2026.3.12）\n- ⚠️ 重大變更：cron delivery 已收緊 — 升級後請在**指令**中執行 `openclaw doctor --fix` 以遷移舊版 cron 儲存格式\n- 新增 `TZ` 環境變數文件，用於容器時區設定\n- 全部文件中「Web UI」正名為「Control UI」\n- 移除啟動腳本中的頻道環境變數自動同步（頻道外掛改為透過 Settings 手動設定）\n- 移除啟動腳本中的 gateway config 遷移（初始設定已包含所有必要欄位）\n- 簡化登入流程：移除「Web UI (with token)」網址，改用 Control UI 登入頁面輸入 Gateway Token\n\n**2026/3/10**\n- Add Homebrew pre-installation: `touch /.dockerenv` and Homebrew install script now run on every container startup, enabling `brew` package management inside the container\n- Add Go 1.22.3 pre-installation (persisted under `/home/node/go`)\n- Remove macOS software warning (Homebrew is now available)\n- Homebrew and Go are persisted on the mounted volume and skip re-installation on restart\n\n**2026/3/9**\n- 升級映像檔至 `2026.3.8` — CLI 備份（`openclaw backup create` / `openclaw backup verify`）、Talk 模式靜音超時設定、Brave LLM-context 網頁搜尋、ACP 來源中繼資料、Telegram DM 去重、瀏覽器 CDP 修復、gateway 重啟/設定保護，共 30+ 新功能及 40+ 修復\n- 備份文件新增 `openclaw backup create` 和 `openclaw backup verify` 說明（內建 CLI 備份，支援僅設定模式和備份檔驗證）\n\n**2026/3/8**\n- 升級映像檔至 `2026.3.7` — context engine plugin 介面、ACP 持久頻道綁定、Telegram 主題 agent 路由、Docker 多階段建置、gateway SecretRef 支援，橫跨 5 個版本（2026.3.3–2026.3.7）共 30+ 新功能及 40+ 修復\n- ⚠️ 破壞性變更：同時設定 `gateway.auth.token` 和 `gateway.auth.password` 時，須明確設定 `gateway.auth.mode` — 模板已預設 `mode: \"token\"`（既有部署啟動時自動遷移）\n- 新增 Zeabur AI Hub 模型支援：`gemini-3.1-pro-preview`、`gemini-3.1-flash-lite-preview`、`gemini-3.1-flash-image-preview`、`kimi-2.5`\n- 設定明確的 `gateway.auth.mode: \"token\"`（防禦未來 gateway 驗證變更）\n- 移除 gateway 啟動腳本中多餘的 `--port` 參數（port 自動透過環境變數/設定檔/預設值解析）\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- 新增 Zeabur AI Hub 模型支援：`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\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 然後執行失敗（可之後透過 Control UI 或環境變數設定）\n"
