# wutzcalc — build and deploy # # Fresh Fedora box, as root: # # make install # system deps + build + systemd service # # Then set the admin password in /etc/wutzcalc/wutzcalc.env and: # # systemctl enable --now wutzcalc # # Without root you can still `make build` to compile the client + server. PREFIX ?= /opt/wutzcalc CONFDIR ?= /etc/wutzcalc SERVICE_USER ?= wutzcalc UNIT := /etc/systemd/system/wutzcalc.service .PHONY: all build deps install service uninstall clean require-root all: build ## build: install dependencies and build client + server build: pnpm install --frozen-lockfile pnpm build ## deps: install Node.js, pnpm and native-module build tools (Fedora) deps: require-root dnf install -y nodejs gcc-c++ make python3 rsync corepack enable ## install: full production install on a fresh checkout (Fedora) install: require-root deps build service @echo @echo "Installed to $(PREFIX)." @echo "1. Set ADMIN_PASSWORD in $(CONFDIR)/wutzcalc.env" @echo "2. systemctl enable --now wutzcalc" ## service: create the user, copy files, and install the systemd unit service: require-root # Dedicated system user (no login, no home). id -u $(SERVICE_USER) >/dev/null 2>&1 || \ useradd --system --no-create-home --shell /usr/sbin/nologin $(SERVICE_USER) # Copy the tree (preserving pnpm's symlinked node_modules) but leave behind # the repo metadata, local dev database, and editor/nix cruft. mkdir -p $(PREFIX) rsync -a --delete \ --exclude='.git' --exclude='.direnv' --exclude='.env' \ --exclude='*.db' --exclude='*.db-wal' --exclude='*.db-shm' \ --exclude='$(PREFIX)' \ ./ $(PREFIX)/ # Config + secrets — never clobber an existing env file. mkdir -p $(CONFDIR) test -f $(CONFDIR)/wutzcalc.env || \ install -m 600 deploy/wutzcalc.env.example $(CONFDIR)/wutzcalc.env # Install the unit with the real node path and install prefix substituted in. NODE=$$(command -v node); \ sed -e "s|/opt/wutzcalc|$(PREFIX)|g" \ -e "s|/usr/bin/node|$$NODE|g" \ -e "s|^User=wutzcalc|User=$(SERVICE_USER)|" \ -e "s|^Group=wutzcalc|Group=$(SERVICE_USER)|" \ deploy/wutzcalc.service > $(UNIT) systemctl daemon-reload ## uninstall: stop and remove the service (keeps DB and config) uninstall: require-root -systemctl disable --now wutzcalc rm -f $(UNIT) systemctl daemon-reload rm -rf $(PREFIX) @echo "Removed $(PREFIX). Left $(CONFDIR) and /var/lib/wutzcalc in place." ## clean: remove build output and installed dependencies clean: rm -rf node_modules dist \ client/dist client/node_modules \ server/dist server/node_modules \ shared/dist shared/node_modules require-root: @if [ "$$(id -u)" -ne 0 ]; then \ echo "This target needs root — run: sudo make $(MAKECMDGOALS)"; \ exit 1; \ fi