File size: 4,808 Bytes
8f16a6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env bash
# AgentBridge one-line installer (Linux / macOS).
#
#   curl -fsSL https://graphene-lab.github.io/AgentBridge/install.sh | bash
#
# Downloads the latest release archive for the detected platform from GitHub,
# extracts it to /opt/agentbridge (override with AGENTBRIDGE_HOME) and installs
# it as a systemd service that auto-starts at boot. The archives are
# self-contained (~460 MB): no .NET runtime needed, Kokoro TTS voices included.
#
# Environment overrides:
#   AGENTBRIDGE_HOME          install directory (default: /opt/agentbridge)
#   AGENTBRIDGE_VERSION       release tag to install, e.g. v1.26.08.28 (default: latest)
#   AGENTBRIDGE_NO_SERVICE=1  extract only, no systemd service
#
# Missing dependencies (curl, tar) are installed automatically with sudo.
# The service runs as root; to run as another user, set User= in the unit.

set -euo pipefail

REPO="Graphene-Lab/AgentBridge"
VERSION="${AGENTBRIDGE_VERSION:-latest}"
DEST="${AGENTBRIDGE_HOME:-/opt/agentbridge}"
NO_SERVICE="${AGENTBRIDGE_NO_SERVICE:-0}"

if [ "$VERSION" = "latest" ]; then
  BASE="https://github.com/$REPO/releases/latest/download"
else
  BASE="https://github.com/$REPO/releases/download/$VERSION"
fi

os="$(uname -s | tr '[:upper:]' '[:lower:]')"
arch="$(uname -m | tr '[:upper:]' '[:lower:]')"
case "$os" in
  linux)  os="linux" ;;
  darwin) os="osx" ;;
  *)
    echo "AgentBridge: unsupported OS '$os'. On Windows, run in PowerShell:" >&2
    echo "  irm https://graphene-lab.github.io/AgentBridge/install.ps1 | iex" >&2
    exit 1
    ;;
esac
case "$arch" in
  x86_64|amd64) arch="x64" ;;
  aarch64|arm64) arch="arm64" ;;
  *)
    echo "AgentBridge: unsupported architecture '$arch' (x64 and arm64 only)." >&2
    exit 1
    ;;
esac

# --- dependencies (curl, tar) ---
missing=""
command -v curl >/dev/null 2>&1 || missing="$missing curl"
command -v tar >/dev/null 2>&1 || missing="$missing tar"
if [ -n "$missing" ]; then
  echo "AgentBridge: installing missing dependencies:$missing"
  if command -v apt-get >/dev/null 2>&1; then
    sudo apt-get update -qq && sudo apt-get install -y -qq curl tar
  elif command -v dnf >/dev/null 2>&1; then
    sudo dnf install -y curl tar
  elif command -v yum >/dev/null 2>&1; then
    sudo yum install -y curl tar
  else
    echo "AgentBridge: please install curl and tar, then re-run." >&2
    exit 1
  fi
fi

# .NET globalization (libicu): the self-contained app falls back to invariant
# globalization on old/missing ICU, but a completely absent ICU breaks startup.
# Best-effort install on Debian/Ubuntu (non-fatal if unavailable).
if command -v dpkg >/dev/null 2>&1; then
  if ! ldconfig -p 2>/dev/null | grep -q 'libicuuc\.so'; then
    echo "AgentBridge: libicu not found - installing (best-effort)..."
    sudo apt-get update -qq && sudo apt-get install -y -qq libicu-dev || \
      echo "AgentBridge: libicu install failed (the app may need it on this distro)." >&2
  fi
fi

asset="agentbridge-$os-$arch.tar.gz"
echo "Installing AgentBridge ($os-$arch, $VERSION) into $DEST ..."
echo "Downloading $BASE/$asset"

sudo mkdir -p "$DEST"
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT

curl -fL --retry 3 -o "$tmp/$asset" "$BASE/$asset"

# Extract DIRECTLY into the destination: unpacking inside the tmp dir first would need
# archive + extracted tree in the same filesystem (tmpfs /tmp on small boards like the
# Orange Pi is too small -> "No space left on device" mid-extraction).
sudo tar -xzf "$tmp/$asset" -C "$DEST"
rm -f "$tmp/$asset"

# The archive files may carry a foreign uid (the CI build user); force a sane owner
# so the app can write its runtime state (logs/) without permission errors.
sudo chown -R root:root "$DEST"
sudo chmod +x "$DEST/agent"

# --- systemd service (Linux only) ---
if [ "$NO_SERVICE" = "0" ] && [ "$os" = "linux" ] && [ -d /run/systemd/system ]; then
  echo "Installing systemd service (auto-start at boot)..."
  sudo tee /etc/systemd/system/agentbridge.service >/dev/null <<EOF
[Unit]
Description=AgentBridge AI Agent Server
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=$DEST
ExecStart=$DEST/agent --headless --environment Production
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF
  sudo systemctl daemon-reload
  sudo systemctl enable agentbridge
  sudo systemctl restart agentbridge
  sleep 3
  if systemctl is-active --quiet agentbridge; then
    echo "AgentBridge service is active."
  else
    echo "WARNING: service did not start - check: systemctl status agentbridge" >&2
    journalctl -u agentbridge -n 10 --no-pager >&2 || true
  fi
fi

echo
echo "AgentBridge installed to $DEST."
echo "HTTP API: http://localhost:5290  (health: /health, models: /v1/models)"
if [ "$NO_SERVICE" = "1" ]; then
  echo "Start manually: $DEST/agent"
fi