proxmox-docker-compose-vmlisted
Install: claude install-skill jackson2w/claude-code-skills
# Docker Compose stack in a Proxmox VM (not an LXC)
Use this when an app's *only* supported deployment path is Docker Compose — no native
package, no bare-metal tarball (unlike e.g. Paperless-ngx, which has one). This homelab
otherwise avoids Docker everywhere (Grafana, Homepage, n8n, Jellyfin, Paperless-ngx all run
as native systemd services specifically to dodge Docker-in-unprivileged-LXC cgroup quirks —
see the `proxmox-node-systemd-service` skill). When Docker is genuinely unavoidable, run it
in a **VM**, not an LXC, and contain the exception there rather than fighting cgroups. Built
and verified end-to-end deploying Immich (`immich-app/immich`, VMID 145, v3.0.3) — every
gotcha below was hit for real, not theoretical.
**VM creation itself** (cloud-init staleness, `qemu-guest-agent` needed before
`generate-config-out`, cleaning up the generated Terraform config) is covered by the
`proxmox-terraform-provisioning` skill, not repeated here — this skill picks up once the VM
exists and boots with working networking.
## Install sequence
1. **Docker CE + Compose plugin from Docker's official apt repo**, not the Debian repo
(`docker.io` package) or a distro-bundled `docker-compose` — Compose v2 (the `docker
compose` subcommand, not the legacy hyphenated `docker-compose` binary) is what modern
Compose files assume:
```yaml
- name: Add Docker GPG key
ansible.builtin.get_url:
url: https://download.docker.com/linux/debian/gpg
dest: /etc/apt/keyri