Files
falah-os-ce/install.sh
T
Antigravity AI 21b48d3d53 feat: UmbrelOS-style CE with iStore, Casdoor auth, and App Manager
- iStore service (port 3021): fetches app manifests from git.falahos.my/falahos
  org via Gitea API, 5-min cache, query/search support
- UmmahID login: replaced stub form with Casdoor OAuth2 PKCE flow (RFC 7636),
  no client secret required; /api/auth/config and /api/auth/token endpoints
  added to server.cjs
- App Manager service (port 3022): installs/uninstalls Docker apps via
  /var/run/docker.sock, pulls images, starts containers on falah-net,
  persists state to /data/installed.json
- docker-compose.yml: orchestrates falah-app + istore + app-manager with
  health checks, named volumes, and shared falah-net network
- install.sh: one-line curl installer — checks prereqs, clones repo,
  prompts for credentials, builds and starts all containers
- .env.example: all env vars documented (CASDOOR_CLIENT_ID, GITEA_TOKEN,
  APP_MANAGER_PORT, etc.)
- Frontend: IStore overlay now fetches live apps from Gitea, real
  install/uninstall via App Manager with 2s polling, indeterminate
  progress bar, Uninstall button for installed apps
- app.yml.example: developer manifest spec for publishing to iStore
2026-07-06 10:05:37 +08:00

127 lines
5.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# ──────────────────────────────────────────────────────────────────────────────
# Falah OS CE — One-line installer
# Usage:
# curl -fsSL https://raw.githubusercontent.com/falahos/falah-os-ce/main/install.sh | bash
# ──────────────────────────────────────────────────────────────────────────────
set -euo pipefail
REPO_URL="https://github.com/falahos/falah-os-ce.git"
INSTALL_DIR="${FALAH_DIR:-$HOME/falah-os}"
CE_PORT="${CE_PORT:-3005}"
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
log() { echo -e "${GREEN}[falah]${NC} $*"; }
warn() { echo -e "${YELLOW}[warn]${NC} $*"; }
die() { echo -e "${RED}[error]${NC} $*" >&2; exit 1; }
# ── Prerequisites ─────────────────────────────────────────────────────────────
check_cmd() { command -v "$1" &>/dev/null || die "$1 is required but not installed. Please install it first."; }
log "Checking prerequisites…"
check_cmd docker
check_cmd git
# Docker Compose v2 (plugin) or v1 (standalone)
if docker compose version &>/dev/null 2>&1; then
COMPOSE="docker compose"
elif command -v docker-compose &>/dev/null; then
COMPOSE="docker-compose"
else
die "Docker Compose not found. Install it from https://docs.docker.com/compose/install/"
fi
# Confirm Docker daemon is running
docker info &>/dev/null || die "Docker daemon is not running. Start Docker and retry."
# ── Clone or update ───────────────────────────────────────────────────────────
if [[ -d "$INSTALL_DIR/.git" ]]; then
log "Updating existing installation at $INSTALL_DIR…"
git -C "$INSTALL_DIR" pull --ff-only
else
log "Installing Falah OS CE to $INSTALL_DIR…"
git clone --depth 1 "$REPO_URL" "$INSTALL_DIR"
fi
cd "$INSTALL_DIR"
# ── Environment setup ─────────────────────────────────────────────────────────
if [[ ! -f .env ]]; then
cp .env.example .env
log "Created .env from template"
echo ""
warn "──────────────────────────────────────────────────"
warn " Configure your .env before starting Falah OS"
warn " credentials are in bitwarden.falahos.my"
warn "──────────────────────────────────────────────────"
echo ""
# Interactive prompts — only if running in a terminal
if [[ -t 0 ]]; then
read -rp " CASDOOR_CLIENT_ID (from auth.falahos.my): " casdoor_id
if [[ -n "$casdoor_id" ]]; then
sed -i.bak "s|^CASDOOR_CLIENT_ID=.*|CASDOOR_CLIENT_ID=$casdoor_id|" .env && rm -f .env.bak
fi
read -rp " GITEA_TOKEN (from git.falahos.my, optional — press Enter to skip): " gitea_token
if [[ -n "$gitea_token" ]]; then
sed -i.bak "s|^GITEA_TOKEN=.*|GITEA_TOKEN=$gitea_token|" .env && rm -f .env.bak
fi
else
warn "Non-interactive mode — edit $INSTALL_DIR/.env manually then run:"
warn " cd $INSTALL_DIR && $COMPOSE up -d"
exit 0
fi
fi
# ── Build & start ─────────────────────────────────────────────────────────────
log "Building containers (this takes a minute on first run)…"
$COMPOSE build --parallel
log "Starting Falah OS CE…"
$COMPOSE up -d
# ── Health check ──────────────────────────────────────────────────────────────
log "Waiting for services to be ready…"
for i in $(seq 1 20); do
if curl -sf "http://localhost:${CE_PORT}/health" &>/dev/null; then
break
fi
if [[ $i -eq 20 ]]; then
warn "Falah OS CE did not respond in time. Check logs with:"
warn " cd $INSTALL_DIR && $COMPOSE logs -f"
exit 1
fi
sleep 3
done
# ── Detect server IP for display ──────────────────────────────────────────────
SERVER_IP=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "localhost")
echo ""
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN} ☽ Falah OS CE is running!${NC}"
echo ""
echo -e " Browser → http://${SERVER_IP}:${CE_PORT}"
echo ""
echo -e " Manage → cd ${INSTALL_DIR}"
echo -e " $COMPOSE logs -f (live logs)"
echo -e " $COMPOSE down (stop)"
echo -e " $COMPOSE pull && $COMPOSE up -d (update)"
echo ""
echo -e " Casdoor redirect URI to register:"
echo -e " http://${SERVER_IP}:${CE_PORT}"
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo ""