#!/usr/bin/env bash # Runtara Bootstrap Installer # # Hosted at install.runtara.com — downloads the real install.sh from the # matching GitHub release and executes it. # # Usage: # curl -fsSL https://install.runtara.com | sh # curl -fsSL https://install.runtara.com | sh -s -- --version 1.6.10 # curl -fsSL https://install.runtara.com | sh -s -- --user # curl -fsSL https://install.runtara.com | sh -s -- --docker # curl -fsSL https://install.runtara.com | sh -s -- --docker-persist set -eu GITHUB_REPO="runtarahq/runtara" # ─── Colour helpers ───────────────────────────────────────────────────────── if [ -t 1 ]; then GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m' BOLD='\033[1m'; NC='\033[0m' else GREEN='' YELLOW='' RED='' BOLD='' NC='' fi info() { printf "${GREEN}[+]${NC} %s\n" "$*"; } warn() { printf "${YELLOW}[!]${NC} %s\n" "$*"; } err() { printf "${RED}[x]${NC} %s\n" "$*" >&2; } step() { printf "\n${BOLD}%s${NC}\n" "==> $*"; } # ─── Parse args ──────────────────────────────────────────────────────────── VERSION="" DO_DOCKER=0 DOCKER_PERSIST=0 DOCKER_DIR="" PASSTHROUGH_ARGS=() while [ $# -gt 0 ]; do case "$1" in --version) VERSION="$2"; PASSTHROUGH_ARGS+=("$1" "$2"); shift 2 ;; --version=*) VERSION="${1#*=}"; PASSTHROUGH_ARGS+=("$1"); shift ;; --docker) DO_DOCKER=1; shift ;; --docker-persist) DO_DOCKER=1; DOCKER_PERSIST=1; shift ;; --docker-dir) DOCKER_DIR="$2"; shift 2 ;; --docker-dir=*) DOCKER_DIR="${1#*=}"; shift ;; *) PASSTHROUGH_ARGS+=("$1"); shift ;; esac done # ─── Resolve version ─────────────────────────────────────────────────────── # Map version to git tag: "dev" -> "dev", anything else -> "v1.2.3" version_to_tag() { if [ "$1" = "dev" ]; then echo "dev"; else echo "v$1"; fi } if [ -z "$VERSION" ]; then info "Resolving latest Runtara version..." VERSION="$(curl -fsSL "https://api.github.com/repos/${GITHUB_REPO}/releases/latest" \ | sed -n 's/.*"tag_name":[[:space:]]*"v\([^"]*\)".*/\1/p')" if [ -z "$VERSION" ]; then err "Failed to resolve latest version from GitHub." exit 1 fi # Inject resolved version so install.sh doesn't re-resolve PASSTHROUGH_ARGS+=("--version" "$VERSION") fi TAG="$(version_to_tag "$VERSION")" info "Runtara v${VERSION} (tag: ${TAG})" # ─── Docker simple mode ─────────────────────────────────────────────────── if [ "$DO_DOCKER" = "1" ]; then # Check for docker if ! command -v docker > /dev/null 2>&1; then err "docker not found. Install Docker first: https://docs.docker.com/get-docker/" exit 1 fi if ! docker compose version > /dev/null 2>&1; then err "docker compose plugin not found. Install Docker Compose: https://docs.docker.com/compose/install/" exit 1 fi dir="${DOCKER_DIR:-${HOME}/.runtara-docker}" mkdir -p "$dir" info "Docker directory: ${dir}" server_port="${SERVER_PORT:-7001}" tenant_id="${TENANT_ID:-default}" pg_volume="runtara-pgdata:/var/lib/postgresql/data" vk_volume="runtara-valkey:/data" volume_block="" if [ "$DOCKER_PERSIST" = "1" ]; then info "Persistent volumes enabled" volume_block=" volumes: runtara-pgdata: runtara-valkey:" else info "Ephemeral mode (data lost on 'docker compose down')" pg_volume="" vk_volume="" fi # init SQL cat > "${dir}/init-db.sql" <<'SQLEOF' CREATE DATABASE runtara_objects OWNER runtara; SQLEOF # Dockerfile — uses the released install.sh to install the bundle cat > "${dir}/Dockerfile" < "${dir}/docker-compose.yml" <