Correr ollama y OpenClaw en alpine linux sobre proxmox

Correr ollama y OpenClaw en alpine linux sobre proxmox

Hoy os traigo un laboratorio curioso, ya que nos permitirá correr ollama y openClaw en alpine. Vamos al lío.

Me he montado una máquina alpine con 16 gb de ram y 500 gb de HDD

Lo he instalado y he habilitado el repo community que viene por defecto deshabilitado:

He actualizado los repos y he instalado lo necesario

apk update
apk add nodejs npm git go bash curl python3 build-base pnpm tailscale nano

Instalamos el binario de ollama

apk add ollama

Creamos el fichero para el servicio /etc/init.d/ollama

#!/sbin/openrc-run

name="Ollama Server"
description="Ollama local AI inference server"

# Comando ejecutable y sus argumentos
command="/usr/bin/ollama"
command_args="serve"

# Ejecución en segundo plano y gestión del PID
command_background="true"
pidfile="/run/${RC_SVCNAME}.pid"

# Variables de entorno requeridas
export OLLAMA_HOST="0.0.0.0"
export OLLAMA_MODELS="/usr/share/ollama/.ollama/models"

depend() {
	need net
}

start_pre() {
	# Crea toda la ruta de directorios recursivamente si no existe
	if [ ! -d "/usr/share/ollama/.ollama/models" ]; then
		mkdir -p /usr/share/ollama/.ollama/models
		chmod -R 755 /usr/share/ollama
	fi
}

Ejecutamos los siguientes comandos para poner el servicio en auto start y arrancarlo

chmod 755 /etc/init.d/ollama
rc-update add ollama default
rc-service ollama start

Vamos a verificar que funciona

service ollama status
netstat -tlnp | grep 11434

Descargamos un modelo ligero, en este caso llama 3.2

  ollama run llama3.2

Salimos de la línea de comandos con /bye

Ahora vamos a descargar el repo oficial de Openclaw y entramos a la ruta de la descarga

git clone https://github.com/openclaw/openclaw.git /opt/openclaw
cd /opt/openclaw

Lanzamos la compilación y la instalación

pnpm install && pnpm run build && pnpm ui:build
npm link

Una vez finalizada la compilación y creado el link del ejecutable lanzamos la configuración de openclaw

openclaw configure

Vamos a configurar el gateway para que no escuche sólo en local para ellos vamos a seleccionar las siguientes opciones:

Ahora vamos a configurar el modelo, para ello seleccionamos Model y seleccionamos solo llama3.2:latest

Ahora pulsamos en Done para salir del asistente

Creamos el servicio de openclaw, /etc/init.d/openclaw, con el siguiente contenido (el token lo obtenemos con un cat /root/.openclaw/openclaw.json | grep token)

#!/sbin/openrc-run

name="OpenClaw Gateway"
description="OpenClaw AI Gateway Agent Service"

command="/usr/bin/node"
command_args="/opt/openclaw/dist/index.js gateway --bind loopback --port 18789"

command_background="true"
pidfile="/run/${RC_SVCNAME}.pid"
output_log="/var/log/openclaw.log"
error_log="/var/log/openclaw.err"

directory="/opt/openclaw"

# Inyectamos el mismo token que guardaste en el asistente para sincronizar el canal remoto
export OPENCLAW_GATEWAY_TOKEN="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
export HOME="/root"

depend() {
	need net ollama
}

Arrancamos el servicio

chmod +x /etc/init.d/openclaw
rc-update add openclaw default
rc-service openclaw start

Ahora ejecutamos los siguientes comandos para poder crear un tunel ssh hacia nuestra máquina ya que openclaw sólo responde por la ip local, 127.0.0.1:

sed -i 's/#AllowTcpForwarding yes/AllowTcpForwarding yes/' /etc/ssh/sshd_config
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/' /etc/ssh/sshd_config
echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config
#Reinciamos el servicio ssh para que pille los cambios
rc-service sshd restart

Ahora nos reconectamos creando el túnel

ssh -L 18789:127.0.0.1:18789 root@X.X.X.X

Y ya podemos abrir openclaw sin mensajes de error y totalmente aislado

http://127.0.0.1:18789/#token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX