← ClaudeAtlas

proxmox-node-systemd-servicelisted

This skill should be used when deploying a Node.js application (Next.js, n8n, or any pnpm/npm-based app) as a native systemd service inside an unprivileged Proxmox LXC, instead of Docker — installing Node via NodeSource, running a dedicated non-root service user, building with pnpm, and exposing it only over Tailscale Serve. Also covers debugging an Ansible playbook for this pattern that never reports `changed=0` on a repeat run, a "detected dubious ownership in repository" git error, a service that's unexpectedly reachable on the plain LAN IP instead of only over Tailscale, or an app that fails to write scratch/upload files under `/tmp` despite the service showing active. Trigger phrases include "run Node app as systemd service", "NodeSource install Ansible", "pnpm build systemd", "next start binds 0.0.0.0", "HOSTNAME env var not working Next.js", "ansible git dubious ownership", "git module changed every run", "recursive chown always changed ansible", "Docker-in-LXC alternative for Node app", "ProtectSystem
jackson2w/claude-code-skills · ★ 1 · Data & Documents · score 64
Install: claude install-skill jackson2w/claude-code-skills
# Native Node.js app as a systemd service in a Proxmox LXC Use this instead of Docker when deploying a Node.js app (dashboard, bot, small internal tool) in an unprivileged Proxmox LXC. It avoids the Docker-in-unprivileged-LXC cgroup quirks that pushed other services (Immich) to a VM, and matches the "native packages, not Docker" precedent already used for Grafana/Prometheus in this homelab. Built and verified end-to-end deploying the Homepage dashboard (`gethomepage/homepage`, VMID 140) — every gotcha below was hit for real, not theoretical. ## Install sequence 1. **Node.js via NodeSource, not the Debian repo** (Debian's `nodejs` package lags upstream releases). NodeSource's current repo format is `nodistro`-based and does *not* gate on the distro codename, so it works on Debian releases newer than NodeSource's own compatibility table lists (confirmed working on Debian 13/trixie, which isn't in their published table): ```yaml - name: Install curl, git, and gnupg ansible.builtin.apt: name: [curl, git, gnupg] state: present update_cache: true - name: Download NodeSource GPG key ansible.builtin.get_url: url: https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key dest: /tmp/nodesource-repo.gpg.key mode: '0644' - name: Dearmor NodeSource GPG key ansible.builtin.command: gpg --dearmor -o /usr/share/keyrings/nodesource.gpg /tmp/nodesource-repo.gpg.key args: creates: /usr/share/keyrings