Optimizacija serverja za OpenClaw: Razlika med redakcijama
Iz KrofekWiki
Brez povzetka urejanja |
Brez povzetka urejanja |
||
| Vrstica 1: | Vrstica 1: | ||
* | |||
= OpenClaw Hetzner VPS Optimizer = | |||
== Namen == | |||
Ta skripta optimizira OpenClaw za manjši Hetzner VPS: | |||
* ustvari backup konfiguracije, | |||
* doda 4 GB swap, | |||
* optimizira memory handling, | |||
* omogoči Docker log rotation, | |||
* zapre OpenClaw porte na localhost-only, | |||
* nastavi Node.js memory limit, | |||
* preveri ownership, | |||
* ustvari health/status skripto, | |||
* restarta Docker + OpenClaw. | |||
== Zahteve == | |||
* Ubuntu/Debian VPS | |||
* Docker + Docker Compose | |||
* OpenClaw nameščen v: | |||
<pre> | |||
/opt/openclaw | |||
</pre> | |||
* Skripto zaženi kot: | |||
<pre> | |||
root | |||
</pre> | |||
== Skripta == | |||
<pre> | |||
cat > /root/openclaw_optimize_hetzner.sh <<'EOF' | |||
#!/usr/bin/env bash | |||
set -euo pipefail | |||
if [ "$(id -u)" -ne 0 ]; then | |||
echo "ERROR: Run this script as root." | |||
exit 1 | |||
fi | |||
TS="$(date +%F_%H-%M-%S)" | |||
BACKUP_DIR="/root/openclaw-backup-$TS" | |||
OC_DIR="/opt/openclaw" | |||
OC_HOME="/root/.openclaw" | |||
if [ ! -f "$OC_DIR/docker-compose.yml" ]; then | |||
echo "ERROR: $OC_DIR/docker-compose.yml not found." | |||
exit 1 | |||
fi | |||
echo "=== OpenClaw Hetzner optimizer ===" | |||
echo "Backup dir: $BACKUP_DIR" | |||
mkdir -p "$BACKUP_DIR" | |||
echo | |||
echo "### 1) Backup" | |||
cp -a "$OC_DIR/docker-compose.yml" "$BACKUP_DIR/docker-compose.yml.bak" 2>/dev/null || true | |||
cp -a "$OC_DIR/.env" "$BACKUP_DIR/env.bak" 2>/dev/null || true | |||
cp -a "$OC_HOME/openclaw.json" "$BACKUP_DIR/openclaw.json.bak" 2>/dev/null || true | |||
cp -a /etc/docker/daemon.json "$BACKUP_DIR/daemon.json.bak" 2>/dev/null || true | |||
cp -a /etc/fstab "$BACKUP_DIR/fstab.bak" 2>/dev/null || true | |||
cp -a /etc/sysctl.d/99-openclaw-stability.conf "$BACKUP_DIR/99-openclaw-stability.conf.bak" 2>/dev/null || true | |||
echo "Backup completed." | |||
echo | |||
echo "### 2) Ensure 4 GB swap" | |||
if ! swapon --show | grep -q "/swapfile"; then | |||
if [ ! -f /swapfile ]; then | if [ ! -f /swapfile ]; then | ||
fallocate -l 4G /swapfile | fallocate -l 4G /swapfile | ||
| Vrstica 31: | Vrstica 76: | ||
mkswap /swapfile | mkswap /swapfile | ||
fi | fi | ||
swapon /swapfile || true | swapon /swapfile || true | ||
fi | |||
if ! grep -q '^/swapfile ' /etc/fstab; then | |||
echo '/swapfile none swap sw 0 0' >> /etc/fstab | echo '/swapfile none swap sw 0 0' >> /etc/fstab | ||
fi | |||
cat > /etc/sysctl.d/99-openclaw-stability.conf <<'SYSCTL' | |||
vm.swappiness=20 | |||
vm.vfs_cache_pressure=50 | |||
SYSCTL | |||
sysctl --system >/dev/null || true | |||
echo | |||
echo "### 3) Docker log rotation" | |||
mkdir -p /etc/docker | |||
cat > /etc/docker/daemon.json <<'DOCKERJSON' | |||
{ | |||
"log-driver": "json-file", | "log-driver": "json-file", | ||
"log-opts": { | "log-opts": { | ||
| Vrstica 55: | Vrstica 103: | ||
"max-file": "5" | "max-file": "5" | ||
} | } | ||
} | |||
DOCKERJSON | |||
echo | |||
echo "### 4) Optimize docker-compose.yml" | |||
cd "$OC_DIR" | |||
# localhost-only ports | |||
sed -i 's#- "${OPENCLAW_GATEWAY_PORT:-18789}:18789"#- "127.0.0.1:${OPENCLAW_GATEWAY_PORT:-18789}:18789"#g' docker-compose.yml | |||
sed -i 's#- "${OPENCLAW_BRIDGE_PORT:-18790}:18790"#- "127.0.0.1:${OPENCLAW_BRIDGE_PORT:-18790}:18790"#g' docker-compose.yml | |||
sed -i 's#- "18789:18789"#- "127.0.0.1:18789:18789"#g' docker-compose.yml | |||
sed -i '/NODE_ENV=production/a\ - NODE_OPTIONS=--max-old-space-size=1536' | sed -i 's#- "18790:18790"#- "127.0.0.1:18790:18790"#g' docker-compose.yml | ||
# Node memory limit | |||
if ! grep -q 'NODE_OPTIONS=--max-old-space-size=' docker-compose.yml; then | |||
sed -i '/NODE_ENV=production/a\ - NODE_OPTIONS=--max-old-space-size=1536' docker-compose.yml || true | |||
fi | |||
# Restart policy check | |||
if ! grep -q 'restart: unless-stopped' docker-compose.yml; then | |||
echo "WARNING: restart: unless-stopped not found. Please verify compose manually." | echo "WARNING: restart: unless-stopped not found. Please verify compose manually." | ||
fi | |||
echo | |||
echo "### 5) Ensure OpenClaw ownership" | |||
mkdir -p "$OC_HOME/workspace" | |||
chown -R 1000:1000 "$OC_HOME" | |||
echo | |||
echo "### 6) Create quick status script" | |||
cat > /root/oc-status.sh <<'STATUS' | |||
#!/usr/bin/env bash | |||
echo "=== Docker containers ===" | |||
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | |||
echo | |||
echo "=== OpenClaw health ===" | |||
curl -fsS http://127.0.0.1:18789/healthz || true | |||
echo | |||
curl -fsS http://127.0.0.1:18789/readyz || true | |||
echo | |||
echo | |||
echo "=== RAM / Swap ===" | |||
free -h | |||
swapon --show | |||
echo | |||
echo "=== Ports ===" | |||
ss -ltnp | grep -E '18789|18790' || true | |||
echo | |||
echo "=== Recent gateway warnings ===" | |||
docker logs openclaw-openclaw-gateway-1 --tail 120 2>&1 | grep -Ei 'warning|error|oom|failed|fatal|event_loop|security' || true | |||
STATUS | |||
chmod +x /root/oc-status.sh | |||
echo | |||
echo "### 7) Restart Docker + OpenClaw" | |||
systemctl restart docker | |||
sleep 15 | |||
cd "$OC_DIR" | |||
docker compose up -d | |||
sleep 45 | |||
echo | |||
echo "### 8) Final status" | |||
/root/oc-status.sh | |||
echo | |||
echo "=== DONE ===" | |||
echo "Backup saved in: $BACKUP_DIR" | |||
EOF | |||
chmod +x /root/openclaw_optimize_hetzner.sh | |||
/root/openclaw_optimize_hetzner.sh | |||
</pre> | |||
== Health check == | |||
Za preverjanje statusa: | |||
<pre> | |||
/root/oc-status.sh | |||
</pre> | |||
== Backup == | |||
Backup konfiguracije se shrani v: | |||
<pre> | |||
/root/openclaw-backup-YYYY-MM-DD_HH-MM-SS | |||
</pre> | |||
== Kaj skripta optimizira == | |||
{| class="wikitable" | |||
! Komponenta | |||
! Optimizacija | |||
|- | |||
| Swap | |||
| 4 GB swap + persistence | |||
|- | |||
| Sysctl | |||
| swappiness=20, vfs_cache_pressure=50 | |||
|- | |||
| Docker | |||
| log rotation (20 MB × 5) | |||
|- | |||
| OpenClaw | |||
| localhost-only bind za 18789/18790 | |||
|- | |||
| Node.js | |||
| max-old-space-size=1536 | |||
|- | |||
| Ownership | |||
| UID/GID 1000 za ~/.openclaw | |||
|- | |||
| Monitoring | |||
| oc-status.sh health script | |||
|} | |||
== Opombe == | |||
* Gateway je po optimizaciji dostopen samo prek: | |||
<pre> | |||
127.0.0.1:18789 | |||
</pre> | |||
* Za oddaljen dostop uporabi SSH tunnel: | |||
<pre> | |||
ssh -N -L 18789:127.0.0.1:18789 root@SERVER_IP | |||
</pre> | |||
* Če uporabljaš Hetzner Firewall, naj bo port 18789 še vedno zaprt javno. | |||
== Preverjanje po rebootu == | |||
Po rebootu preveri: | |||
<pre> | |||
docker ps | |||
/root/oc-status.sh | |||
</pre> | |||
Če vidiš: | |||
* healthz OK, | |||
* readyz true, | |||
* container status healthy, | |||
je OpenClaw stabilno nastavljen. | |||
Trenutna redakcija s časom 07:53, 15. maj 2026
OpenClaw Hetzner VPS Optimizer
Namen
Ta skripta optimizira OpenClaw za manjši Hetzner VPS:
- ustvari backup konfiguracije,
- doda 4 GB swap,
- optimizira memory handling,
- omogoči Docker log rotation,
- zapre OpenClaw porte na localhost-only,
- nastavi Node.js memory limit,
- preveri ownership,
- ustvari health/status skripto,
- restarta Docker + OpenClaw.
Zahteve
- Ubuntu/Debian VPS
- Docker + Docker Compose
- OpenClaw nameščen v:
/opt/openclaw
- Skripto zaženi kot:
root
Skripta
cat > /root/openclaw_optimize_hetzner.sh <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
if [ "$(id -u)" -ne 0 ]; then
echo "ERROR: Run this script as root."
exit 1
fi
TS="$(date +%F_%H-%M-%S)"
BACKUP_DIR="/root/openclaw-backup-$TS"
OC_DIR="/opt/openclaw"
OC_HOME="/root/.openclaw"
if [ ! -f "$OC_DIR/docker-compose.yml" ]; then
echo "ERROR: $OC_DIR/docker-compose.yml not found."
exit 1
fi
echo "=== OpenClaw Hetzner optimizer ==="
echo "Backup dir: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"
echo
echo "### 1) Backup"
cp -a "$OC_DIR/docker-compose.yml" "$BACKUP_DIR/docker-compose.yml.bak" 2>/dev/null || true
cp -a "$OC_DIR/.env" "$BACKUP_DIR/env.bak" 2>/dev/null || true
cp -a "$OC_HOME/openclaw.json" "$BACKUP_DIR/openclaw.json.bak" 2>/dev/null || true
cp -a /etc/docker/daemon.json "$BACKUP_DIR/daemon.json.bak" 2>/dev/null || true
cp -a /etc/fstab "$BACKUP_DIR/fstab.bak" 2>/dev/null || true
cp -a /etc/sysctl.d/99-openclaw-stability.conf "$BACKUP_DIR/99-openclaw-stability.conf.bak" 2>/dev/null || true
echo "Backup completed."
echo
echo "### 2) Ensure 4 GB swap"
if ! swapon --show | grep -q "/swapfile"; then
if [ ! -f /swapfile ]; then
fallocate -l 4G /swapfile
chmod 600 /swapfile
mkswap /swapfile
fi
swapon /swapfile || true
fi
if ! grep -q '^/swapfile ' /etc/fstab; then
echo '/swapfile none swap sw 0 0' >> /etc/fstab
fi
cat > /etc/sysctl.d/99-openclaw-stability.conf <<'SYSCTL'
vm.swappiness=20
vm.vfs_cache_pressure=50
SYSCTL
sysctl --system >/dev/null || true
echo
echo "### 3) Docker log rotation"
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'DOCKERJSON'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}
DOCKERJSON
echo
echo "### 4) Optimize docker-compose.yml"
cd "$OC_DIR"
# localhost-only ports
sed -i 's#- "${OPENCLAW_GATEWAY_PORT:-18789}:18789"#- "127.0.0.1:${OPENCLAW_GATEWAY_PORT:-18789}:18789"#g' docker-compose.yml
sed -i 's#- "${OPENCLAW_BRIDGE_PORT:-18790}:18790"#- "127.0.0.1:${OPENCLAW_BRIDGE_PORT:-18790}:18790"#g' docker-compose.yml
sed -i 's#- "18789:18789"#- "127.0.0.1:18789:18789"#g' docker-compose.yml
sed -i 's#- "18790:18790"#- "127.0.0.1:18790:18790"#g' docker-compose.yml
# Node memory limit
if ! grep -q 'NODE_OPTIONS=--max-old-space-size=' docker-compose.yml; then
sed -i '/NODE_ENV=production/a\ - NODE_OPTIONS=--max-old-space-size=1536' docker-compose.yml || true
fi
# Restart policy check
if ! grep -q 'restart: unless-stopped' docker-compose.yml; then
echo "WARNING: restart: unless-stopped not found. Please verify compose manually."
fi
echo
echo "### 5) Ensure OpenClaw ownership"
mkdir -p "$OC_HOME/workspace"
chown -R 1000:1000 "$OC_HOME"
echo
echo "### 6) Create quick status script"
cat > /root/oc-status.sh <<'STATUS'
#!/usr/bin/env bash
echo "=== Docker containers ==="
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo
echo "=== OpenClaw health ==="
curl -fsS http://127.0.0.1:18789/healthz || true
echo
curl -fsS http://127.0.0.1:18789/readyz || true
echo
echo
echo "=== RAM / Swap ==="
free -h
swapon --show
echo
echo "=== Ports ==="
ss -ltnp | grep -E '18789|18790' || true
echo
echo "=== Recent gateway warnings ==="
docker logs openclaw-openclaw-gateway-1 --tail 120 2>&1 | grep -Ei 'warning|error|oom|failed|fatal|event_loop|security' || true
STATUS
chmod +x /root/oc-status.sh
echo
echo "### 7) Restart Docker + OpenClaw"
systemctl restart docker
sleep 15
cd "$OC_DIR"
docker compose up -d
sleep 45
echo
echo "### 8) Final status"
/root/oc-status.sh
echo
echo "=== DONE ==="
echo "Backup saved in: $BACKUP_DIR"
EOF
chmod +x /root/openclaw_optimize_hetzner.sh
/root/openclaw_optimize_hetzner.sh
Health check
Za preverjanje statusa:
/root/oc-status.sh
Backup
Backup konfiguracije se shrani v:
/root/openclaw-backup-YYYY-MM-DD_HH-MM-SS
Kaj skripta optimizira
| Komponenta | Optimizacija |
|---|---|
| Swap | 4 GB swap + persistence |
| Sysctl | swappiness=20, vfs_cache_pressure=50 |
| Docker | log rotation (20 MB × 5) |
| OpenClaw | localhost-only bind za 18789/18790 |
| Node.js | max-old-space-size=1536 |
| Ownership | UID/GID 1000 za ~/.openclaw |
| Monitoring | oc-status.sh health script |
Opombe
- Gateway je po optimizaciji dostopen samo prek:
127.0.0.1:18789
- Za oddaljen dostop uporabi SSH tunnel:
ssh -N -L 18789:127.0.0.1:18789 root@SERVER_IP
- Če uporabljaš Hetzner Firewall, naj bo port 18789 še vedno zaprt javno.
Preverjanje po rebootu
Po rebootu preveri:
docker ps /root/oc-status.sh
Če vidiš:
- healthz OK,
- readyz true,
- container status healthy,
je OpenClaw stabilno nastavljen.