Deploying OpenClaw on Hugging Face Spaces (with Auto Backup & Restore)
Source: tenfy's blog - Deploying OpenClaw on Hugging Face Spaces (adapted for this project)
Original Author: tenfyzhongοΌhttps://tenfy.cnοΌ
Adapted by: ClawCopilot TeamοΌhttps://github.com/ClawCopilot/Openclaw-Hf-DockerοΌ
Original Post Date: 2026-03-25
What This Solution Solves
This project builds on tenfy's openclaw-hf by adding BT Panel (Baota) as PID 1, providing a user-friendly web management interface:
- Build OpenClaw container image on top of
ubuntu:24.04 - BT Panel (Baota) as container PID 1, listening on port
7860(default HF Space port), provides web management interface - OpenClaw Gateway runs on separate port
18789(default) - Support pre-configuring third-party OpenAI-compatible models via environment variables (
base_url + api_key) - OpenClaw config and workspace stored in
/root/.openclaw - Auto-restore latest backup from HF Dataset on startup
- Periodic backup to HF Dataset via
cron - Supervisord manages
cronandopenclaw-gatewayprocesses - Pre-installed tools:
vim,opencode,codex,claude,sshxfor debugging and interaction inside the container - Built-in DDNS-GO for dynamic DNS updates (non-critical, installation failure doesn't break the build)
Container Architecture
PID 1 (bt-panel)
βββ /usr/local/bin/hf-entrypoint.sh
βββ /usr/bin/supervisord
β βββ cron (scheduled backup tasks)
β βββ openclaw-gateway (OpenClaw Gateway, port 18789)
βββ node hf-server.js (container health check)
- BT Panel: port
7860, web management interface - OpenClaw Gateway: port
18789, AI Gateway API - Supervisord: process manager, manages both
cronandopenclaw-gateway - Health check:
curl http://localhost:7860, called by Hugging Face platform
1. Register Hugging Face & Generate HF_TOKEN
If you don't have a Hugging Face account yet, sign up first: https://huggingface.co/join
After preparing your account, create a token following these steps:
- Open Hugging Face Token page: https://huggingface.co/settings/tokens
- Create a new token (recommended name:
deploy-openclaw) - Grant the required permissions (need ability to create Spaces and write to Datasets)
- Copy the token (format:
hf_xxx...)
Login locally and verify:
hf auth login
hf auth whoami
When bootstrap-hf.sh prompts for HF_TOKEN for backup dataset:
- You can paste the newly created token directly
- Or leave it empty to let the script reuse the current
hf auth loginlocal credentials
2. One-Click Deployment (Recommended)
The repository provides an interactive script. It's recommended to use the script instead of manual setup.
1. Clone the Repository
git clone https://github.com/ClawCopilot/Openclaw-Hf-Docker.git
cd Openclaw-Hf-Docker
2. Run the Bootstrap Script
macOS / Linux:
./scripts/bootstrap-hf.sh
Windows PowerShell:
powershell -ExecutionPolicy ByPass -File .\scripts\bootstrap-hf.ps1
3. What the Script Does Automatically
- Check and install
hfCLI if missing - Check Hugging Face login status (trigger
hf auth loginif needed) - Ask for and confirm deployment parameters (including final
Proceed with these settings?confirmation) - Ask for BT Panel port, username, and password
- Create private Space and private backup Dataset, upload current repository to Space
- Auto-write Variables / Secrets (including backup, gateway credentials, BT Panel config, etc.)
- Write security-related variables by default:
OPENCLAW_GATEWAY_CONTROLUI_ALLOW_INSECURE_AUTH=falseOPENCLAW_GATEWAY_CONTROLUI_DANGEROUSLY_DISABLE_DEVICE_AUTH=false
4. BT Panel Username Rules
Must satisfy the following:
- Start with a lowercase letter
- Can only contain lowercase letters and numbers
- Length 3-32 characters
Examples: btadmin, mypanel123, openclawspace
3. Use Agent for Auto Deployment
Suitable for users who don't want to manually configure. You can directly send this to an AI Agent:
Please deploy OpenClaw to Hugging Face by strictly following the deployment skill in https://github.com/tenfyzhong/openclaw-hf/blob/main/SKILL.md
Agent usually does:
- Check dependencies first (
git,hf,python3,huggingface_hub) - Collect deployment parameters from you in fixed order
- Call
bootstrap-hf.sh/bootstrap-hf.ps1to execute deployment - Report Space / Dataset / App / Health URLs and version info
- If gateway credentials are auto-generated, also report them
If you want to provide all parameters at once, send this template to the Agent:
space_name: openclaw-hf
dataset_name: openclaw-hf-backup
openclaw_version: latest
gateway_token: <leave empty to auto-generate, or fill manually>
gateway_password: <leave empty to auto-generate, or fill manually>
hf_token: <your HF_TOKEN, or leave empty to reuse local login>
configure_custom_llm: no
openclaw_sshx_auto_start: true
bt_panel_port: 7860
bt_panel_username: btadmin
bt_panel_password: <leave empty to auto-generate, or fill manually>
proceed_with_settings: yes
4. Pre-Deployment Requirements
The script depends on the following commands:
git --version
hf version
python3 --version
Also requires Python package:
python3 -c "import huggingface_hub" >/dev/null 2>&1 || \
python3 -m pip install --user 'huggingface_hub[cli]'
5. Key Variables & Secrets
In Space's Settings -> Variables and secrets, at minimum you need:
- Variable:
OPENCLAW_BACKUP_DATASET_REPO(format:username/dataset-name) - Secret:
HF_TOKEN(needs write permission to the backup Dataset) - Secret:
OPENCLAW_GATEWAY_TOKEN(recommended) - Secret:
OPENCLAW_GATEWAY_PASSWORD(optional) - Variable:
BT_PANEL_PORT(default7860) - Variable:
BT_PANEL_USERNAME(defaultbtadmin) - Secret:
BT_PANEL_PASSWORD(BT Panel password)
If you use bootstrap-hf.sh / bootstrap-hf.ps1, the above will be configured automatically.
Optional: Pre-configure LLM (all three must be provided together)
OPENCLAW_LLM_BASE_URLOPENCLAW_LLM_MODELOPENCLAW_LLM_API_KEY
If only 1-2 of them are filled, the entrypoint script will skip model pre-configuration.
Common Optional Variables
| Variable | Default | Description |
|---|---|---|
OPENCLAW_VERSION |
latest |
OpenClaw version |
OPENCLAW_BACKUP_CRON |
*/30 * * * * |
Backup interval (every 30 min by default) |
OPENCLAW_BACKUP_KEEP_COUNT |
48 |
Number of latest backups to keep |
OPENCLAW_SSHX_AUTO_START |
false |
Set to true to auto-start sshx |
OPENCLAW_GATEWAY_PORT |
18789 |
Gateway listening port |
BT_PANEL_PORT |
7860 |
BT Panel listening port |
BT_PANEL_USERNAME |
btadmin |
BT Panel username (lowercase letter start) |
BT_PANEL_PASSWORD |
auto-generated | BT Panel password |
6. What the Script Will Ask You
Following the flow, main inputs are:
space_name(defaultopenclaw-hf)dataset_name(default<space_name>-backup)OPENCLAW_VERSION(default auto-detect latest version)OPENCLAW_GATEWAY_TOKEN(can leave empty for auto-generated 32-char random value)OPENCLAW_GATEWAY_PASSWORD(can leave empty for auto-generated 16-char random value)HF_TOKEN(can leave empty, reuse locally logged-in token)- Whether to configure LLM immediately (all three must be filled for it to take effect)
- If not configuring LLM, whether to enable
OPENCLAW_SSHX_AUTO_START - BT Panel port (default
7860) - BT Panel username (must start with lowercase letter, only lowercase letters and numbers, 3-32 chars)
- BT Panel password (can leave empty for auto-generation)
- Final confirmation:
Proceed with these settings?(selectingnowill exit without remote changes)
If token/password is auto-generated by the script, it will be printed at the end. Please save it promptly.
7. How to Verify After Deployment
Assuming Space repo is <owner>/<space_name>, available URLs:
| Service | URL |
|---|---|
| BT Panel Admin | https://<owner>-<space_name>.hf.space:7860 |
| BT Panel Health | https://<owner>-<space_name>.hf.space |
| OpenClaw Gateway | https://<owner>-<space_name>.hf.space:18789 |
| Space Page | https://huggingface.co/spaces/<owner>/<space_name> |
For example:
OPENCLAW_HF_SPACE_ID="yourname/openclaw-hf"
SPACE_HOST="${OPENCLAW_HF_SPACE_ID/\//-}.hf.space"
echo "BT Panel: https://${SPACE_HOST}:7860"
echo "Gateway: https://${SPACE_HOST}:18789"
Note: Some network environments may restrict direct access to port
:18789. The BT Panel admin interface (7860) is the primary access entry point.
8. BT Panel Usage Guide
Login to BT Panel
- After deployment completes, wait for container to start (~2-5 minutes)
- Visit
https://<owner>-<space_name>.hf.space:7860 - Login with the
BT_PANEL_USERNAMEandBT_PANEL_PASSWORDset during deployment
On first login, you may need to wait for BT Panel service to fully start. If the page is inaccessible, please try again later.
BT Panel Security Recommendations
- After deployment, it is recommended to modify
BT_PANEL_PASSWORDinSettings -> Variables and secrets - Avoid exposing BT Panel admin interface to the public internet
BT_PANEL_USERNAMEmust conform to rules: start with lowercase letter, only lowercase letters and numbers
9. How to Do OpenClaw Initial Configuration
- Open Hugging Face Space page, go to container logs, find the temporary access link output by
sshx - Open that link in browser to enter container shell, execute
openclaw onboardand follow the guide - During onboarding, OpenClaw may restart, and the
sshxlink may also change; if current link expires, go back to logs to get the new link and continue - Official wizard reference: https://docs.openclaw.ai/start/wizard
- After configuration is complete, remember to go back to
Settings -> Variables and secrets, changeOPENCLAW_SSHX_AUTO_STARTtofalse(or delete this variable), then restart Space to turn offsshx
If you modified OpenClaw configuration and want it to take effect immediately, you can restart the corresponding process (example):
ps -ef | grep 'openclaw-gateway' | grep -v 'grep' | awk '{print $2}' | xargs -I{} kill {}
10. Backup & Restore Mechanism
The data lifecycle of this project is as follows:
- Startup Restore: On container startup, it fetches
latest-backup.jsonfrom Dataset to locate the latest backup and restore - Scheduled Backup: Upload periodically based on
OPENCLAW_BACKUP_CRON(every 30 minutes by default) - Shutdown Backup: Do a final backup when container receives stop signal before exiting
- Artifacts include:
backups/openclaw-backup-<timestamp>.tar.gzlatest-backup.json
- Retention Policy: Only keep the latest
OPENCLAW_BACKUP_KEEP_COUNTtimestamped archives (default48)
11. Keep-Alive & 24/7 Running Suggestions
- Free
cpu-basicwill sleep (currently after about 48 hours of no access) - Strict 24/7 requires paid hardware, set
Sleep timetoNever - For private Space health checks, must include
Authorization: Bearer <HF_TOKEN>, otherwise you'll see 404 (normal access control behavior)
If you just want to reduce cold start probability, you can periodically request the BT Panel health check address; but on free tier, this is not an officially guaranteed always-on solution.
Using cron-job.org for Keep-Alive
If you don't want to maintain scheduled tasks yourself, you can use https://cron-job.org/.
According to their official FAQ (https://cron-job.org/faq/), they support custom headers, HTTPS, and up to once per minute calls. For OpenClaw Space, pinging once every 10-15 minutes is usually sufficient.
1. Create a Task
- Open https://cron-job.org/ and register/login (console is at
console.cron-job.org) - Create new HTTP cron job
- URL:
https://<owner>-<space_name>.hf.space(BT Panel health check) - Method:
GET - Schedule: recommend once every 10-15 minutes
2. Add Header for Private Space
Authorization: Bearer <HF_TOKEN>
It's recommended to create a separate low-permission token for keep-alive only, don't reuse the high-permission backup token.
3. Do Test Run Before Enabling Alerts
After creating the task, test it manually once first, then enable failure notifications (email, etc.) to be notified promptly when Space is unavailable or token expires.
12. sshx Usage (Optional)
sshx is pre-installed in the image (along with vim, opencode, codex, claude).
1. Auto Start (Environment Variable)
OPENCLAW_SSHX_AUTO_START=true
2. Manual Start Inside Container
sshx
3. Start via OpenClaw Terminal in Background
nohup sshx >/proc/1/fd/1 2>/proc/1/fd/2 &
If you temporarily need sshx later, you can also let OpenClaw start it via IM; after use, remember to let OpenClaw turn off sshx via IM as well.
Cleanup After Use
pgrep -fa sshx
pkill -TERM -f '(^|/)sshx($| )'
13. Process Management
This project uses Supervisord to manage processes (PM2 has been removed):
PID 1 (bt-panel)
βββ supervisord
βββ cron
βββ openclaw-gateway
- Supervisord: as a child process of bt-panel, correctly managed
- cron: scheduled backup tasks (runs every 30 minutes by default)
- openclaw-gateway: OpenClaw Gateway service, listening on port 18789
- PM2: removed from this project, no longer used for managing Gateway
Check Process Status
Inside container:
supervisorctl status
View Logs
# supervisord logs
tail -f /var/log/hf-entrypoint/supervisord-stdout.log
# cron logs
tail -f /var/log/hf-entrypoint/cron-stdout.log
# openclaw-gateway logs
tail -f /var/log/hf-entrypoint/openclaw-gateway-stdout.log
14. Summary
If your goal is "quickly running a restorable OpenClaw instance on Hugging Face", this project has covered the key aspects: deployment, configuration, backup, restore, keep-alive, and remote debugging, with BT Panel providing a more user-friendly web management interface.
It's recommended to first use the repository's bootstrap-hf script to get the default configuration working, then add LLM, keep-alive, and sshx strategies as needed.
Related Links
- Repository: https://github.com/ClawCopilot/Openclaw-Hf-Docker
- Original Article: https://tenfy.cn/posts/openclaw-hf-space-deploy/
- OpenClaw Official Wizard: https://docs.openclaw.ai/start/wizard
- BT Panel Official Site: https://www.bt.cn/