Optimizacija serverja za OpenClaw: Razlika med redakcijama

Iz KrofekWiki
Brez povzetka urejanja
Brez povzetka urejanja
 
Vrstica 1: Vrstica 1:
cat > /root/openclaw_optimize_hetzner.sh <<'EOF'
*
#!/usr/bin/env bash
= OpenClaw Hetzner VPS Optimizer =
set -euo pipefail
 
== Namen ==
TS="$(date +%F_%H-%M-%S)"
 
BACKUP_DIR="/root/openclaw-backup-$TS"
Ta skripta optimizira OpenClaw za manjši Hetzner VPS:
OC_DIR="/opt/openclaw"
 
OC_HOME="/root/.openclaw"
* ustvari backup konfiguracije,
* doda 4 GB swap,
echo "=== OpenClaw Hetzner optimizer ==="
* optimizira memory handling,
echo "Backup dir: $BACKUP_DIR"
* omogoči Docker log rotation,
mkdir -p "$BACKUP_DIR"
* zapre OpenClaw porte na localhost-only,
* nastavi Node.js memory limit,
echo
* preveri ownership,
echo "### 1) Backup"
* ustvari health/status skripto,
cp -a "$OC_DIR/docker-compose.yml" "$BACKUP_DIR/docker-compose.yml.bak" 2>/dev/null || true
* restarta Docker + OpenClaw.
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
== Zahteve ==
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
* Ubuntu/Debian VPS
cp -a /etc/sysctl.d/99-openclaw-stability.conf "$BACKUP_DIR/99-openclaw-stability.conf.bak" 2>/dev/null || true
* Docker + Docker Compose
* OpenClaw nameščen v:
echo "Backup completed."
<pre>
/opt/openclaw
echo
</pre>
echo "### 2) Ensure 4 GB swap"
 
if ! swapon --show | grep -q "/swapfile"; then
* 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
fi
 
if ! grep -q '^/swapfile ' /etc/fstab; then
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
fi
 
cat > /etc/sysctl.d/99-openclaw-stability.conf <<'SYSCTL'
cat > /etc/sysctl.d/99-openclaw-stability.conf <<'SYSCTL'
vm.swappiness=20
vm.swappiness=20
vm.vfs_cache_pressure=50
vm.vfs_cache_pressure=50
SYSCTL
SYSCTL
 
sysctl --system >/dev/null || true
sysctl --system >/dev/null || true
 
echo
echo
echo "### 3) Docker log rotation"
echo "### 3) Docker log rotation"
mkdir -p /etc/docker
 
cat > /etc/docker/daemon.json <<'DOCKERJSON'
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
DOCKERJSON
 
echo
echo
echo "### 4) Optimize docker-compose.yml"
echo "### 4) Optimize docker-compose.yml"
cd "$OC_DIR"
 
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
# localhost-only ports
sed -i 's#- "${OPENCLAW_BRIDGE_PORT:-18790}:18790"#- "127.0.0.1:${OPENCLAW_BRIDGE_PORT:-18790}:18790"#g' docker-compose.yml
sed -i 's#- "${OPENCLAW_GATEWAY_PORT:-18789}:18789"#- "127.0.0.1:${OPENCLAW_GATEWAY_PORT:-18789}:18789"#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
sed -i 's#- "${OPENCLAW_BRIDGE_PORT:-18790}:18790"#- "127.0.0.1:${OPENCLAW_BRIDGE_PORT:-18790}:18790"#g' docker-compose.yml
 
# Node memory limit
sed -i 's#- "18789:18789"#- "127.0.0.1:18789:18789"#g' docker-compose.yml
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
sed -i 's#- "18790:18790"#- "127.0.0.1:18790:18790"#g' docker-compose.yml
fi
 
# Node memory limit
# Ensure restart policy exists for gateway if missing near service may already exist
if ! grep -q 'NODE_OPTIONS=--max-old-space-size=' docker-compose.yml; then
if ! grep -q 'restart: unless-stopped' 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
fi
 
echo
echo
echo "### 5) Ensure OpenClaw ownership"
echo "### 5) Ensure OpenClaw ownership"
mkdir -p "$OC_HOME/workspace"
 
chown -R 1000:1000 "$OC_HOME"
mkdir -p "$OC_HOME/workspace"
chown -R 1000:1000 "$OC_HOME"
echo
 
echo "### 6) Create quick status script"
echo
cat > /root/oc-status.sh <<'STATUS'
echo "### 6) Create quick status script"
#!/usr/bin/env bash
 
echo "=== Docker containers ==="
cat > /root/oc-status.sh <<'STATUS'
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
#!/usr/bin/env bash
 
echo
echo "=== Docker containers ==="
echo "=== OpenClaw health ==="
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
curl -fsS http://127.0.0.1:18789/healthz || true
 
echo
echo
curl -fsS http://127.0.0.1:18789/readyz || true
echo "=== OpenClaw health ==="
echo
 
curl -fsS http://127.0.0.1:18789/healthz || true
echo
echo
echo "=== RAM / Swap ==="
 
free -h
curl -fsS http://127.0.0.1:18789/readyz || true
swapon --show
echo
 
echo
echo
echo "=== Ports ==="
echo "=== RAM / Swap ==="
ss -ltnp | grep -E '18789|18790' || true
 
free -h
echo
swapon --show
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
echo
STATUS
echo "=== Ports ==="
 
chmod +x /root/oc-status.sh
ss -ltnp | grep -E '18789|18790' || true
 
echo
echo
echo "### 7) Restart Docker + OpenClaw"
echo "=== Recent gateway warnings ==="
systemctl restart docker
 
sleep 15
docker logs openclaw-openclaw-gateway-1 --tail 120 2>&1 | grep -Ei 'warning|error|oom|failed|fatal|event_loop|security' || true
STATUS
cd "$OC_DIR"
 
docker compose up -d
chmod +x /root/oc-status.sh
sleep 45
 
echo
echo
echo "### 7) Restart Docker + OpenClaw"
echo "### 8) Final status"
 
/root/oc-status.sh
systemctl restart docker
sleep 15
echo
 
echo "=== DONE ==="
cd "$OC_DIR"
echo "Backup saved in: $BACKUP_DIR"
 
EOF
docker compose up -d
sleep 45
chmod +x /root/openclaw_optimize_hetzner.sh
 
/root/openclaw_optimize_hetzner.sh
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.