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>
This commit is contained in:
parent
72a78b55fb
commit
6b9dbf8254
15 changed files with 3814 additions and 0 deletions
117
netops-todo-node/setup-debian13.sh
Executable file
117
netops-todo-node/setup-debian13.sh
Executable file
|
|
@ -0,0 +1,117 @@
|
|||
#!/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
|
||||
Loading…
Add table
Add a link
Reference in a new issue