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