> ## Documentation Index
> Fetch the complete documentation index at: https://docs.questarr.app/llms.txt
> Use this file to discover all available pages before exploring further.

# PROXMOX

# Proxmox VE — LXC deployment

Questarr can run directly inside a Proxmox VE LXC container, without Docker. The container runs
Questarr from source as a `systemd` service, which keeps the footprint small (no container runtime,
no image layers) and makes it behave like any other service on your Proxmox node.

## Quick start

Run this **on the Proxmox host** (the node itself, not inside a container or VM), as `root`:

```bash theme={null}
bash -c "$(curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' https://raw.githubusercontent.com/Doezer/Questarr/main/scripts/proxmox/questarr-lxc.sh)"
```

The script will:

1. Verify it is running on a Proxmox VE node.
2. Prompt for the container settings (ID, hostname, cores, RAM, disk, storage, network, port), each
   with a sensible default.
3. Download the newest Debian LXC template if your node does not already have it.
4. Create and start an unprivileged container.
5. Install Node.js, build Questarr from source, and register a `questarr.service` unit.
6. Print the URL to open.

When it finishes, open `http://<container-ip>:5000`.

## Non-interactive install

Every prompt has an environment variable override. Pass `--yes` to accept all of them without
prompting:

```bash theme={null}
CTID=210 CT_HOSTNAME=questarr CORES=2 RAM=2048 DISK=8 \
STORAGE=local-lvm BRIDGE=vmbr0 NET=dhcp \
  bash -c "$(curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' https://raw.githubusercontent.com/Doezer/Questarr/main/scripts/proxmox/questarr-lxc.sh)" -- --yes
```

| Variable | Default | Description |
| - | - | - |
| `CTID` | next free ID | Container ID |
| `CT_HOSTNAME` | `questarr` | Container hostname |
| `CORES` | `2` | CPU cores |
| `RAM` | `2048` | RAM in MiB |
| `SWAP` | `512` | Swap in MiB |
| `DISK` | `8` | Root disk in GiB |
| `STORAGE` | first active | Storage for the root filesystem |
| `TEMPLATE_STORAGE` | first active | Storage holding the LXC template |
| `BRIDGE` | `vmbr0` | Network bridge |
| `NET` | `dhcp` | `dhcp`, or a static CIDR such as `192.168.1.50/24` |
| `GATEWAY` | — | Gateway, required when `NET` is a static address |
| `UNPRIVILEGED` | `1` | Create an unprivileged container |
| `ONBOOT` | `1` | Start the container when the node boots |
| `CT_PASSWORD` | — | Root password inside the container (optional) |
| `QUESTARR_PORT` | `5000` | HTTP port Questarr listens on |
| `QUESTARR_REPO` | `Doezer/Questarr` | Source repository |
| `QUESTARR_REF` | latest release | Tag or branch to install |

### Sizing

2 GiB of RAM is the practical floor: the installer builds the client with Vite and type-checks the
server with `tsc`, and both run during installation. You can lower the container's RAM afterwards if
you want — Questarr itself is comfortable in far less — but leave it at 2 GiB whenever you update,
since an update rebuilds from source.

The default 8 GiB disk covers the OS, Node.js, `node_modules`, and the build output with room to
spare. Questarr's own data (a SQLite database) stays small; it does not store game files.

## Managing the container

```bash theme={null}
pct enter 210                          # shell inside the container
pct exec 210 -- systemctl status questarr
pct exec 210 -- journalctl -u questarr -f
pct exec 210 -- systemctl restart questarr
```

Inside the container:

| Path | Purpose |
| - | - |
| `/opt/questarr` | Application (replaced on every update) |
| `/opt/questarr/data` | SQLite database — **this is what you back up** |
| `/opt/questarr/.env` | Configuration, preserved across updates |
| `/opt/questarr/.questarr_version` | Installed tag or branch |

## Updating

Following the Proxmox helper-script convention, the installer places an `update` command inside the
container:

```bash theme={null}
pct exec 210 -- update
```

This re-runs the installer against the latest release. The new version is downloaded and built in a
staging directory first, and only swapped into place once the build succeeds, so a failed download or
build leaves your running installation untouched. Your `data/` directory and `.env` are preserved.

If no published release can be resolved — either the repository has none, or the unauthenticated
GitHub API rate limit was hit — the installer says so and falls back to the `main` branch, which is
development code. Pin a release with `QUESTARR_REF` if you want to avoid that.

To move to a specific version instead:

```bash theme={null}
pct exec 210 -- env QUESTARR_REF=v1.4.2 bash -c "$(curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' https://raw.githubusercontent.com/Doezer/Questarr/main/scripts/proxmox/questarr-install.sh)"
```

Take a Proxmox snapshot or backup before updating if you want a quick way back:

```bash theme={null}
vzdump 210 --mode snapshot --compress zstd
```

## Configuration

All of the options in [`.env.example`](../.env.example) apply. Edit `/opt/questarr/.env` and restart:

```bash theme={null}
pct exec 210 -- sh -c 'vi /opt/questarr/.env && systemctl restart questarr'
```

(`vi` ships with the base Debian template; install `nano` first with `apt-get install -y nano` if you prefer it.)

IGDB credentials, indexers, and download clients are configured in the web UI under **Settings**, so
you normally do not need to touch `.env` at all.

## Installing into an existing container or VM

`questarr-install.sh` is standalone. If you already have a Debian or Ubuntu LXC (or a plain VM), run
this inside it as `root`:

```bash theme={null}
bash -c "$(curl --fail --silent --show-error --location --proto '=https' --proto-redir '=https' https://raw.githubusercontent.com/Doezer/Questarr/main/scripts/proxmox/questarr-install.sh)"
```

It installs the same `systemd` service and `update` helper. It is safe to re-run: it replaces the
application tree while preserving `data/` and `.env`.

## Notes and troubleshooting

* **The service runs unprivileged.** Questarr runs as the `questarr` system user under a hardened
  unit (`ProtectSystem=strict`, `NoNewPrivileges`, `PrivateTmp`), with `/opt/questarr` as the only
  writable path.
* **The install fails at "Waiting for network".** The container could not resolve DNS. Check that the
  bridge you chose is correct and that your static IP and gateway are valid.
* **The install fails during `npm ci` or the build.** Almost always the container ran out of RAM or
  disk. Raise them (`pct set 210 --memory 2048`, `pct resize 210 rootfs +4G`) and re-run `update`.
* **The service will not start.** `pct exec 210 -- journalctl -u questarr -n 50` shows the reason. A
  port already in use and a non-writable `data/` directory are the usual causes.
* **Backups.** `/opt/questarr/data` holds everything that matters. A Proxmox container backup
  (`vzdump`) covers it, as does copying that directory.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.