install.sh raw

   1  #!/usr/bin/env bash
   2  set -euo pipefail
   3  
   4  echo ""
   5  echo "============================================"
   6  echo "  Zlattea - Install"
   7  echo "============================================"
   8  echo ""
   9  
  10  # --- require non-root for local setup ---
  11  if [ "$(id -u)" = "0" ]; then
  12    echo "This install script is for local/home setup."
  13    echo "Run as a regular user, not root."
  14    echo ""
  15    echo "For production (systemd + reverse proxy), use:"
  16    echo "  sudo ./install.sh"
  17    exit 1
  18  fi
  19  
  20  # --- admin password ---
  21  if [ -z "${ADMIN_PASSWORD:-}" ]; then
  22    echo "Admin password (required for the admin account):"
  23    read -r -s -p "> " ADMIN_PASSWORD
  24    echo ""
  25    if [ -z "$ADMIN_PASSWORD" ]; then
  26      echo "ERROR: admin password is required."
  27      exit 1
  28    fi
  29  fi
  30  
  31  # --- port and bind address ---
  32  if [ -z "${PORT:-}" ]; then
  33    echo ""
  34    echo "Port for the web server? (default: 3000)"
  35    read -r -p "> " PORT
  36    PORT="${PORT:-3000}"
  37  fi
  38  
  39  if [ -z "${BIND:-}" ]; then
  40    echo ""
  41    echo "IP address to bind to? (default: 127.0.0.1)"
  42    read -r -p "> " BIND
  43    BIND="${BIND:-127.0.0.1}"
  44  fi
  45  
  46  API_PORT=$((PORT + 1))
  47  
  48  echo ""
  49  echo "============================================"
  50  echo "  Configuration"
  51  echo "============================================"
  52  echo "  Web server : ${BIND}:${PORT}"
  53  echo "  API server : ${BIND}:${API_PORT}"
  54  echo "============================================"
  55  echo ""
  56  
  57  # --- install prerequisites ---
  58  install_prereqs() {
  59    echo "checking prerequisites..."
  60    local missing=""
  61    for cmd in git curl unzip; do
  62      if ! command -v "$cmd" &>/dev/null; then
  63        missing="$missing $cmd"
  64      fi
  65    done
  66    if [ -n "$missing" ]; then
  67      echo "installing:$missing"
  68      if command -v apt-get &>/dev/null; then
  69        sudo apt-get update -qq && sudo apt-get install -y -qq $missing
  70      elif command -v dnf &>/dev/null; then
  71        sudo dnf install -y $missing
  72      elif command -v yum &>/dev/null; then
  73        sudo yum install -y $missing
  74      elif command -v pacman &>/dev/null; then
  75        sudo pacman -S --noconfirm $missing
  76      elif command -v apk &>/dev/null; then
  77        sudo apk add $missing
  78      else
  79        echo "WARNING: unknown package manager. Install manually: $missing"
  80      fi
  81    fi
  82  }
  83  install_prereqs
  84  
  85  # --- install bun ---
  86  if ! command -v bun &>/dev/null; then
  87    echo "installing bun..."
  88    curl -fsSL https://bun.sh/install | bash
  89    export BUN_INSTALL="$HOME/.bun"
  90    export PATH="$BUN_INSTALL/bin:$PATH"
  91  fi
  92  
  93  if ! command -v bun &>/dev/null; then
  94    echo "ERROR: bun installation failed."
  95    exit 1
  96  fi
  97  
  98  # --- write .env ---
  99  cat > .env <<EOF
 100  PORT=${PORT}
 101  API_PORT=${API_PORT}
 102  SITE_URL=http://${BIND}:${PORT}
 103  DB_PATH=data/shop.db
 104  ADMIN_PASSWORD=${ADMIN_PASSWORD}
 105  ADMIN_EMAIL=admin@zlattea.com
 106  HOST=${BIND}
 107  EOF
 108  echo ".env written"
 109  
 110  # --- install deps ---
 111  echo "installing npm dependencies..."
 112  bun install
 113  
 114  # --- setup database ---
 115  mkdir -p data public/images/products
 116  echo "setting up database..."
 117  bun run src/setup.ts
 118  
 119  # --- build ---
 120  echo "building frontend..."
 121  bunx --bun astro build
 122  
 123  # --- start servers ---
 124  echo ""
 125  echo "============================================"
 126  echo "  Starting servers"
 127  echo "============================================"
 128  echo "  API : http://${BIND}:${API_PORT}"
 129  echo "  Web : http://${BIND}:${PORT}"
 130  echo "============================================"
 131  echo ""
 132  echo "Press Ctrl+C to stop."
 133  
 134  bun run src/server.ts &
 135  PID_API=$!
 136  bun run ./dist/server/entry.mjs &
 137  PID_WEB=$!
 138  
 139  trap "kill $PID_API $PID_WEB 2>/dev/null; exit" INT TERM
 140  wait
 141