proxmox-node-systemd-servicelisted
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