netops/netops-todo-node/setup-debian13.sh
Jon Vanvik f6268440d9 Innebygd innlogging (AUTH_MODE=app) med neon-login og proxy-bypass
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>
2026-06-15 14:27:13 +02:00

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