Valgfri app-auth ved siden av proxy-modus (default uendret). Signert sesjons-cookie (scrypt-passord, HMAC, ingen avhengigheter), gating av API + WebSocket, og en selvstendig neon-login (public/login.html) for uautentiserte. Trusted bypass: en proxy-identitet (X-Remote-User / Basic Auth) regnes som innlogget uten app-passord (TRUST_PROXY_HEADER, default på), så man kan bootstrappe: logg inn via NPM Basic Auth → sett app-passord i konto-modalen → skru av Basic Auth. Konto-UI for sett/endre passord + logg ut. AUTH_MODE leses per createServer-instans (testbart). 34 integrasjonstester (8 nye for app-auth), alle grønne. README/CLAUDE.md/setup-skript oppdatert. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
121 lines
4.1 KiB
Bash
Executable file
121 lines
4.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
#
|
|
# NetOps To-Do — oppsett på Debian 13 (trixie), f.eks. en fersk LXC.
|
|
# Installerer Node fra apt, henter koden, og setter opp systemd-tjeneste.
|
|
#
|
|
# Bruk (som root):
|
|
# ./setup-debian13.sh <git-url> # kloner repoet til /opt/netops og setter opp
|
|
# ./setup-debian13.sh # bruker repoet skriptet allerede ligger i
|
|
#
|
|
# Eksempel:
|
|
# bash setup-debian13.sh ssh://forgejo@int.git.vanvikinternet.no/jvanvik/netops.git
|
|
#
|
|
# Valgfrie miljøvariabler:
|
|
# PORT=3000 lytteport (default 3000)
|
|
# APP_DIR=/opt/netops hvor repoet havner ved kloning
|
|
# AUTH_MODE=app innebygd innlogging (sesjons-cookie + passord)
|
|
# TRUST_PROXY_HEADER=0 slå av proxy-bypass i app-modus
|
|
# DISABLE_COOKIE_AUTH=1 proxy-modus: skru av selvvalgt navn i UI
|
|
#
|
|
# Kjør skriptet på nytt etter en `git pull` for å oppgradere (idempotent).
|
|
|
|
set -euo pipefail
|
|
|
|
PORT="${PORT:-3000}"
|
|
APP_DIR="${APP_DIR:-/opt/netops}"
|
|
SERVICE=netops-todo
|
|
|
|
if [ "$(id -u)" -ne 0 ]; then
|
|
echo "Kjør som root — skriptet installerer pakker og systemd-tjeneste." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "==> Installerer pakker (git, nodejs, npm, curl) …"
|
|
apt-get update -qq
|
|
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq git nodejs npm curl ca-certificates >/dev/null
|
|
|
|
node_major="$(node -e 'console.log(process.versions.node.split(".")[0])')"
|
|
if [ "$node_major" -lt 18 ]; then
|
|
echo "Node $node_major er for gammel (appen krever >=18). Debian 13 skal ha Node 20+." >&2
|
|
exit 1
|
|
fi
|
|
echo " Node $(node --version) OK"
|
|
|
|
# ---------- Hent koden ----------
|
|
if [ $# -ge 1 ]; then
|
|
if [ -d "$APP_DIR/.git" ]; then
|
|
echo "==> $APP_DIR finnes allerede — oppdaterer med git pull …"
|
|
git -C "$APP_DIR" pull --ff-only
|
|
else
|
|
echo "==> Kloner $1 → $APP_DIR …"
|
|
git clone "$1" "$APP_DIR"
|
|
fi
|
|
else
|
|
# Ingen URL oppgitt: anta at skriptet kjøres fra et allerede klonet repo
|
|
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
APP_DIR="$(git -C "$script_dir" rev-parse --show-toplevel 2>/dev/null || true)"
|
|
if [ -z "$APP_DIR" ]; then
|
|
echo "Bruk: $0 <git-url> — eller kjør skriptet fra et klonet repo." >&2
|
|
exit 1
|
|
fi
|
|
echo "==> Bruker eksisterende repo: $APP_DIR"
|
|
fi
|
|
|
|
# Appen kan ligge i repo-rota eller i netops-todo-node/
|
|
if [ -f "$APP_DIR/server.js" ]; then
|
|
NODE_DIR="$APP_DIR"
|
|
elif [ -f "$APP_DIR/netops-todo-node/server.js" ]; then
|
|
NODE_DIR="$APP_DIR/netops-todo-node"
|
|
else
|
|
echo "Fant ikke server.js under $APP_DIR." >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "==> npm ci i $NODE_DIR …"
|
|
(cd "$NODE_DIR" && npm ci --omit=dev --no-audit --no-fund)
|
|
|
|
echo "==> Skriver /etc/systemd/system/$SERVICE.service …"
|
|
# DynamicUser + StateDirectory: systemd oppretter tjenestebruker og
|
|
# /var/lib/netops-todo med riktige rettigheter — ingen useradd/chown nødvendig.
|
|
cat > "/etc/systemd/system/$SERVICE.service" <<EOF
|
|
[Unit]
|
|
Description=NetOps To-Do
|
|
After=network.target
|
|
|
|
[Service]
|
|
DynamicUser=yes
|
|
StateDirectory=$SERVICE
|
|
WorkingDirectory=$NODE_DIR
|
|
ExecStart=$(command -v node) server.js
|
|
Environment=PORT=$PORT
|
|
Environment=HOST=0.0.0.0
|
|
Environment=DATA_DIR=/var/lib/$SERVICE
|
|
${AUTH_MODE:+Environment=AUTH_MODE=$AUTH_MODE}
|
|
${TRUST_PROXY_HEADER:+Environment=TRUST_PROXY_HEADER=$TRUST_PROXY_HEADER}
|
|
${DISABLE_COOKIE_AUTH:+Environment=DISABLE_COOKIE_AUTH=1}
|
|
Restart=on-failure
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable --now "$SERVICE"
|
|
systemctl restart "$SERVICE" # plukk opp ny kode ved re-kjøring/oppgradering
|
|
|
|
sleep 1
|
|
if curl -fsS "http://127.0.0.1:$PORT/healthz" >/dev/null; then
|
|
ip="$(hostname -I | awk '{print $1}')"
|
|
echo
|
|
echo "✔ NetOps To-Do kjører: http://$ip:$PORT"
|
|
echo
|
|
echo "Neste steg — Nginx Proxy Manager (se også README.md):"
|
|
echo " Proxy Host → scheme http, forward $ip:$PORT, eget (sub)domene,"
|
|
echo " og skru PÅ 'Websockets Support'. SSL via Let's Encrypt + Force SSL."
|
|
echo
|
|
echo "NB: Appen stoler på X-Remote-User/Basic Auth-headere fra proxyen."
|
|
echo " Sørg for at port $PORT kun er nåbar fra proxyen (brannmur/ACL)."
|
|
else
|
|
echo "✖ Tjenesten svarte ikke på /healthz — sjekk: journalctl -u $SERVICE -e" >&2
|
|
exit 1
|
|
fi
|