Skip to content

Instantly share code, notes, and snippets.

@johnschult
Last active March 6, 2026 21:10
Show Gist options
  • Select an option

  • Save johnschult/e238ae7125bd6cfaff8e95d5e5415127 to your computer and use it in GitHub Desktop.

Select an option

Save johnschult/e238ae7125bd6cfaff8e95d5e5415127 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Fraction AI Stack - post_start.sh
# Lives in /workspace, copied to /post_start.sh by template start command
set -e
echo "=== Fraction AI Stack Starting ==="
mkdir -p /workspace/bin /workspace/lib/ollama /workspace/ollama /workspace/logs \
/workspace/venv /workspace/openwebui \
/workspace/tailscale-state
# --- System dependencies ---
if [ ! -f /workspace/.deps_installed ]; then
echo "[deps] Installing system dependencies..."
apt-get update -qq
apt-get install -y -qq software-properties-common curl pciutils
add-apt-repository -y ppa:deadsnakes/ppa
apt-get update -qq
apt-get install -y -qq python3.11 python3.11-venv python3.11-distutils
touch /workspace/.deps_installed
else
echo "[deps] Already installed."
fi
# --- Tailscale ---
if [ ! -f /workspace/bin/tailscaled ]; then
echo "[tailscale] Installing..."
curl -fsSL https://tailscale.com/install.sh | sh
cp /usr/sbin/tailscaled /workspace/bin/tailscaled
cp /usr/bin/tailscale /workspace/bin/tailscale
else
echo "[tailscale] Already installed."
fi
echo "[tailscale] Starting tailscaled (userspace networking)..."
pkill -f tailscaled 2>/dev/null || true
sleep 1
/workspace/bin/tailscaled \
--tun=userspace-networking \
--statedir=/workspace/tailscale-state \
--socket=/workspace/tailscale.sock \
> /workspace/logs/tailscaled.log 2>&1 &
sleep 3
if [ -n "$TAILSCALE_AUTH_KEY" ]; then
echo "[tailscale] Bringing up tailnet..."
/workspace/bin/tailscale \
--socket=/workspace/tailscale.sock \
up \
--authkey="$TAILSCALE_AUTH_KEY" \
--hostname=fraction-runpod \
--accept-routes
TAILSCALE_IP=$(/workspace/bin/tailscale --socket=/workspace/tailscale.sock ip -4 2>/dev/null || echo "unknown")
echo "[tailscale] Up. IP: $TAILSCALE_IP"
else
echo "[tailscale] WARNING: TAILSCALE_AUTH_KEY not set — skipping tailnet join."
fi
# --- Ollama ---
if [ ! -f /workspace/bin/ollama ]; then
echo "[ollama] Installing..."
curl -fsSL https://ollama.com/install.sh | sh
cp /usr/local/bin/ollama /workspace/bin/ollama
cp -r /usr/local/lib/ollama/* /workspace/lib/ollama/
else
echo "[ollama] Already installed."
fi
export PATH=/workspace/bin:$PATH
export OLLAMA_MODELS=/workspace/ollama
export OLLAMA_HOST=0.0.0.0
export OLLAMA_KEEP_ALIVE=-1
export OLLAMA_CONTEXT_LENGTH=8192
export LD_LIBRARY_PATH=/workspace/lib/ollama:$LD_LIBRARY_PATH
pkill -f "ollama serve" 2>/dev/null || true
sleep 2
echo "[ollama] Starting..."
/workspace/bin/ollama serve > /workspace/logs/ollama.log 2>&1 &
echo "[ollama] Waiting for API..."
until curl -s http://127.0.0.1:11434/api/tags > /dev/null 2>&1; do
sleep 2
done
echo "[ollama] Ready."
if ! /workspace/bin/ollama list | grep -q "qwen2.5:7b-instruct"; then
echo "[ollama] Pulling qwen2.5:7b-instruct..."
/workspace/bin/ollama pull qwen2.5:7b-instruct
else
echo "[ollama] Model already present."
fi
# --- Open WebUI ---
if [ ! -f /workspace/venv/bin/open-webui ]; then
echo "[owui] Installing Open WebUI (this takes a few minutes)..."
python3.11 -m venv /workspace/venv
/workspace/venv/bin/pip install --upgrade pip
/workspace/venv/bin/pip install open-webui
else
echo "[owui] Already installed."
fi
export OLLAMA_BASE_URL=http://127.0.0.1:11434
export DATA_DIR=/workspace/openwebui
echo "[owui] Starting..."
/workspace/venv/bin/open-webui serve > /workspace/logs/owui.log 2>&1 &
echo "=== Stack started. Logs in /workspace/logs ==="
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment