Run
community-scripts/ProxmoxVE
apps on Incus. incus-app-launcher is a thin Incus-native wrapper that fetches
upstream Proxmox community scripts on demand, creates Incus LXC containers, and
runs self-hosted app installers and addon scripts without forking the upstream
catalog.
Common search phrases this project targets:
- Proxmox community scripts on Incus
- Incus app launcher
- Incus LXC app installer
- self-hosted apps on Incus
- run Proxmox VE helper scripts with Incus
The launcher stays thin. It does not fork the upstream app catalog or embed large upstream installers in this repo. Instead, it fetches:
ct/<app>.shinstall/<app>-install.sh- shared helper files
from the upstream repo at a chosen ref, then:
- Reads the upstream container defaults.
- Creates an Incus container with similar limits.
- Bootstraps a small base package set inside the guest.
- Pushes the upstream installer into the guest.
- Applies a small automation profile when the launcher knows how to answer upstream prompts.
incus-app-launcher bridges two ecosystems:
- upstream Proxmox community app installers
- local Incus containers and addon execution
In practice, that means you can use the upstream app definitions from
community-scripts/ProxmoxVE while deploying to Incus instead of Proxmox VE.
The goal is not to replace the upstream project. The goal is to make those app
installers usable from an Incus-first workflow with minimal translation logic.
Common discovery questions this README should answer:
- Can I run Proxmox community scripts on Incus?
- Is there an Incus alternative to Proxmox VE helper scripts?
- How do I deploy self-hosted apps to Incus from the community-scripts catalog?
- Can I run upstream addon scripts like Dockge inside an existing Incus container?
The answer is yes, within the scope of the upstream scripts and the launcher's current Incus compatibility layer.
This project is usable, but still early.
What exists today:
- generic create flow for upstream apps
- generic addon flow for upstream
tools/addon/*.shscripts inside existing containers - optional PocketBase metadata enrichment for discovery and script labeling
- prompt detection for upstream installers
- a small set of automation profiles for interactive apps
- dry-run and smoke-test commands
- real-world validation on an Incus VPS
What does not exist yet:
- broad compatibility guarantees across the full upstream app catalog
- complete translation of Proxmox-specific features
- a mature release process
- Any upstream app can be attempted.
- The local maintained list is only for launcher automation profiles, not for a master allowlist of compatible apps.
- Unprofiled apps use the generic flow and empty stdin unless prompt handling is added.
- If an app fails, the first preference is improving generic Incus behavior. App-specific profiles should stay small and focused.
adguardvaultwardennetbird
Validated on a real Incus 6.21 host:
adguarddockernetbirddockgeviaaddon install dockgeinside a Docker-capable target container
List the apps with launcher automation profiles:
./bin/incus-app list-supportedInspect an upstream app before creating an Incus container:
./bin/incus-app show adguard --ref mainCreate an Incus container from an upstream Proxmox community script:
./bin/incus-app create adguard --name adguard --ref mainRun an upstream addon script inside an existing Incus container:
./bin/incus-app addon install dockge --target docker-host --prompt-mode interactivebashcurlawksedmktempincus
Optional for metadata search/enrichment:
jq
- The launcher uses the existing default Incus profile unless you change the code or environment around it.
- It does not modify host-wide Incus profiles, networks, or storage pools.
- Per-instance root disk sizing is done through instance device override, not by editing shared profiles.
--cleanup-on-failureonly removes a newly created instance when the launcher itself fails after creation. Successful runs leave the instance in place.
list-profiled is an alias:
./bin/incus-app list-profiledShow the upstream defaults and launcher notes for an app:
./bin/incus-app show netbird --ref mainshow also scans the fetched installer for common prompt patterns and reports
whether upstream interactivity appears to be present.
Search script metadata from PocketBase:
./bin/incus-app search dockgeShow an unprofiled app and inspect prompt hints:
./bin/incus-app show pihole --ref mainCreate an app container:
./bin/incus-app create netbird --name netbird --ref mainRun upstream prompts interactively in your terminal:
./bin/incus-app create docker --name docker-test --prompt-mode interactiveRun an upstream addon script inside an existing container:
./bin/incus-app addon install dockge --target docker-host --prompt-mode interactiveRun an addon update flow inside an existing container:
./bin/incus-app addon update dockge --target docker-host --prompt-mode interactiveDelete the instance automatically if creation fails:
./bin/incus-app create netbird --name netbird --cleanup-on-failureRun a basic smoke test after creation:
./bin/incus-app smoke-test adguard --name adguard-smoke --cleanup-on-failurePin to a specific upstream commit:
./bin/incus-app create adguard \
--name adguard \
--ref 4a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8g9Print the Incus commands without executing them:
./bin/incus-app create vaultwarden --name vaultwarden --dry-runOverride the upstream repo source, useful for local development:
UPSTREAM_REPO="file:///home/jon/Dev/github/ProxmoxVE" \
./bin/incus-app show adguard- Upstream has two relevant models:
- app containers driven by
ct/<app>.shplusinstall/<app>-install.sh - addon scripts driven by
tools/addon/<name>.sh
- app containers driven by
- Addons are meant to run inside an existing target container, not through the normal app-creation path.
dockgeis the current example of an upstream addon-oriented workflow.- PocketBase metadata is used only to enrich discovery and classification. Execution still relies on the upstream scripts.
- PocketBase metadata can identify:
- script type (
lxc,vm,addon,pve) - development status (
ProxmoxVEDvsProxmoxVE) - disabled/deleted state
- script type (
- Public repo hardening includes CI for syntax and dry-run smoke coverage.
netbirdis interactive upstream. The launcher answers the prompts with: managed deployment and "skip connection for now".- Prompt modes:
profile: use launcher-provided answers when a profile existsempty: feed empty stdininteractive: attach upstream prompts to the current terminal
- Addon commands support
interactiveandemptyprompt modes. - Some upstream scripts still assume a Proxmox environment. Unprofiled apps are attempted with empty stdin and may still need manual fixes or more launcher automation.
- The launcher defaults to
mainif--refis not set, but using a pinned commit is recommended for repeatable builds. - The MVP uses your existing Incus default profile and network. Custom network selection is not automated yet.
This repository is an Incus launcher for the Proxmox community scripts catalog. It helps users run upstream LXC app installers and addon scripts on Incus, especially for self-hosted services such as AdGuard, Vaultwarden, NetBird, Docker, and Dockge, without maintaining a forked copy of the upstream app catalog.