wrolpi/scripts/install_debian_12.sh
Roland 36f84941db
install: always install serve; resolve it via PATH in wrolpi-app
wrolpi-app crash-loops with 203/EXEC when /usr/local/bin/serve is missing.
Two independent causes, both fixed here:

1. The `single-file --version ||` guard in the install scripts only installed
   serve (and readability) when single-file was ABSENT. On a machine that
   already has single-file (a prior install or a baked image), serve was
   skipped, and re-running install.sh could never repair it. Install each npm
   global independently based on its own presence.

2. The service hardcoded /usr/local/bin/serve, which breaks when npm's global
   prefix puts serve in /usr/bin (depends on how node was installed). Resolve
   serve via PATH with `/usr/bin/env serve`.

Verified on a fresh Raspberry Pi OS Trixie install (10.0.0.8): wrolpi-app is
active with 0 restarts and serves 200 with the PATH-resolved ExecStart.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 18:21:58 -06:00

97 lines
3.4 KiB
Bash
Executable file

#!/usr/bin/env bash
echo "Debian 12 install start: $(date '+%Y-%m-%d %H:%M:%S')"
set -x
set -e
# Run the install in a predictable UTF-8 locale. Fresh images (or SSH sessions
# forwarding LC_* variables from the client) may reference an ungenerated
# locale, which makes apt/perl/python emit "Cannot set LC_CTYPE" warnings
# throughout the install. C.UTF-8 is built into glibc, always present, and
# locale-neutral, so this does not change the user's configured locale.
export LC_ALL=C.UTF-8
# Update if we haven't updated in the last day.
[ -z "$(find -H /var/lib/apt/lists -maxdepth 0 -mtime -1)" ] && apt update
# Install dependencies.
apt-get install -y $(cat /opt/wrolpi/debian-live-config/config/package-lists/wrolpi.list.chroot)
# App dependencies were installed.
node -v
npm -v
# Install serve, and archiving tools. Check each independently so a present
# single-file cannot mask a missing serve (which breaks wrolpi-app).
command -v serve >/dev/null || sudo npm i -g serve@12.0.1
single-file --version >/dev/null 2>&1 || sudo npm i -g single-file-cli@2.0.73
command -v readability-extractor >/dev/null || sudo npm i -g readability-extractor@0.0.6
# Install Deno runtime; single-file runs under it.
command -v deno || {
DENO_VERSION="v2.8.3"
ARCH=$(uname -m)
if [ "$ARCH" = "aarch64" ]; then
DENO_ARCH="aarch64-unknown-linux-gnu"
DENO_SHA256="d4589cc1ffcbf1995c92a0127d932aaf832ac70cfdcc6d5b7bf38043cf303575"
else
DENO_ARCH="x86_64-unknown-linux-gnu"
DENO_SHA256="30455b845ffa6082209c3590269c910ad3b7efdf28c9879afd4006c47ae54197"
fi
curl -fsSL "https://github.com/denoland/deno/releases/download/${DENO_VERSION}/deno-${DENO_ARCH}.zip" -o /tmp/deno.zip
# Assert the hash to avoid malicious or invalid files.
echo "${DENO_SHA256} /tmp/deno.zip" | sha256sum -c -
unzip -o /tmp/deno.zip -d /usr/local/bin/
chmod +x /usr/local/bin/deno
rm /tmp/deno.zip
}
deno --version
# Build React app in background job.
cd /opt/wrolpi/app || exit 5
npm install || npm install || npm install || npm install # try install multiple times :(
# Install python requirements in background job.
python3 -m venv /opt/wrolpi/venv
/opt/wrolpi/venv/bin/pip3 install --upgrade -r /opt/wrolpi/requirements.txt
# Create the Controller venv (kept separate from the main API venv).
python3 -m venv /opt/wrolpi/controller/venv
/opt/wrolpi/controller/venv/bin/pip3 install --upgrade -r /opt/wrolpi/controller/requirements.txt
# Create the WROLPi user
grep wrolpi: /etc/passwd || useradd -md /home/wrolpi wrolpi -s "$(command -v bash)"
# Install Caddy from official apt repo if not already installed.
if ! command -v caddy &>/dev/null; then
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --batch --yes --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt-get update
apt-get install -y caddy
fi
# Install WROLPi Help.
/opt/wrolpi/scripts/install_help_service.sh
# Repair will install configs and restart services.
/opt/wrolpi/repair.sh
set +x
echo "
WROLPi has successfully been installed!
Mount your external hard drive to /media/wrolpi if you have one. Change the
file permissions if necessary:
# sudo chown -R wrolpi:wrolpi /media/wrolpi
Start the WROLPi services using:
# sudo systemctl start wrolpi.target
then navigate to: https://$(hostnmae).local
Or, join to the Wifi hotspot:
SSID: WROLPi
Password: wrolpi hotspot
"