netops/netops-todo-node/setup-debian13.sh
Jon Vanvik 6b9dbf8254 Legg til Node/npm-versjon med sanntidssynk + Debian 13-oppsettsskript
Ny app i netops-todo-node/: Express + ws, WebSocket-push i stedet for
polling, kanban med drag & drop, kommentarer, aktivitetslogg, optimistisk
låsing, quick-add-parsing og presence. 12 integrasjonstester (node:test).
setup-debian13.sh setter opp alt på en fersk LXC; README dekker Nginx
Proxy Manager-oppsett. PHP-versjonen er uendret (kun handoff-peker).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-12 11:54:22 +02:00

117 lines
3.8 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
# DISABLE_COOKIE_AUTH=1 skru av selvvalgt navn i UI (når proxyen gjør auth)
#
# 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
${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