Skip to main content

Prowlarr Common — Shared Application Configuration

Prowlarr_Common is the shared application layer for Prowlarr. It is not deployed on its own; instead it supplies the Prowlarr-specific configuration that Prowlarr_GKE builds on. End users never configure this layer directly — it has no deployment UI inputs of its own — but understanding what it provides explains the defaults you see in the platform guide.

There is no Cloud Run sibling to keep in sync with. Most *_Common modules in this catalogue exist to keep a CloudRun and a GKE variant behaving identically. Prowlarr is different: it is GKE-only. The official lscr.io/linuxserver/prowlarr image uses s6-overlay as its init process, which cannot exec inside Cloud Run's gVisor sandbox — confirmed via three separate live diagnostic deploys (default configuration, with an added GCS volume, and with increased CPU/memory), all failing identically with zero container output and "Application exec likely failed." A Prowlarr_CloudRun module was built, deployed, diagnosed, and then removed from the catalogue — see Prowlarr_GKE §3 for the full writeup. Prowlarr_Common follows the same shape every Common module in this catalogue uses purely for consistency, not because a second platform variant exists or is planned.

For the infrastructure that actually provisions and runs Prowlarr, see the platform guide (Prowlarr_GKE) and the foundation guides (App_GKE, App_Common).


1. What this layer provides

AreaProvided by Prowlarr_CommonWhere it surfaces
AuthenticationNo generated secrets at all — Prowlarr ships with no default admin account; operators enable auth via the web UI's Settings → General → Security if desiredsecret_ids / secret_values outputs (both empty maps)
Container imageThe official lscr.io/linuxserver/prowlarr image, deployed unmodified — no Dockerfile, no build, no custom entrypointcontainer_image output of the platform deployment
Database engineNone — Prowlarr uses an internal, embedded SQLite database (WAL mode) at /config/prowlarr.db (database_type = "NONE")§3 below and the platform guide
Database bootstrapNone — there is no db-init job; Prowlarr manages its own scheman/a
Object storageDeclares the Cloud Storage storage bucket, mounted at /config only when no block PVC is usedstorage_buckets output
Core settingsContainer port 9696; no extra environment required for first bootApplication behaviour in the platform guide
Health checksSupplies the default startup/liveness probes targeting /ping§6 below

2. Secrets in Secret Manager

Prowlarr has no generated secrets at all. Unlike database-backed applications in this catalogue, there is no encryption key or JWT signing secret to create — and unlike zero-secret apps that still need a bootstrapped admin credential, Prowlarr has no first-run admin account this layer needs to seed either. It simply starts with authentication disabled until an operator explicitly enables it in the web UI.

Prowlarr_Common still exposes the standard secret_ids and secret_values outputs so it composes with App_GKE the same way every other application module in this catalogue does, but both resolve to empty maps — there is no secret-creation logic anywhere in this module.

gcloud secrets list --project "$PROJECT" --filter="name~prowlarr"

See App_Common for the shared secret and Workload Identity model that every application module, including this one, builds on.


3. Database engine and bootstrap

Prowlarr does not use an external database. All of its state — configured indexers, connected *arr applications (Sonarr, Radarr, Lidarr, Readarr), and sync/history logs — lives in an internal, embedded SQLite database in WAL mode at /config/prowlarr.db. Consequently:

  • database_type = "NONE" — no Cloud SQL instance, database, or user is created.
  • There is no db-init job — Prowlarr creates and migrates its own SQLite schema on first boot; nothing needs to be bootstrapped ahead of time.
  • No PostgreSQL extensions, no MySQL plugins, and no Redis are involved (enable_redis is hardcoded false by Prowlarr_GKE's main.tf).

Because the database is a file on the persistent /config volume, durability depends entirely on the storage backend, not a managed database service — see §7. Supply your own initialization_jobs if you need custom data-loading or migration tasks; none is provided by default.


4. Container image

Unlike several Common modules in this catalogue that layer a custom entrypoint onto an upstream base image, Prowlarr_Common deploys the official image unmodified:

lscr.io/linuxserver/prowlarr:<application_version>
  • image_source = "prebuilt", container_build_config.enabled = false — there is no Dockerfile and no build step. Prowlarr_Common's scripts/ directory contains nothing but a placeholder (.gitkeep) — this is the simplest Common module in the catalogue in that specific respect.
  • enable_image_mirroring = true by default still applies — the official image is mirrored into the project's own Artifact Registry to avoid Docker Hub rate limits, even though nothing about the image is modified.
  • No app-specific version-pin build ARG. Several custom-build Common modules in this catalogue read an app-specific *_VERSION build ARG instead of the generic APP_VERSION (which the Foundation would force to latest) — that entire class of problem doesn't apply here, because there is no build. application_version = "latest" is passed straight through as the deployed image tag.

5. Core application settings

Prowlarr_Common establishes the minimal configuration Prowlarr needs to come up and serve its UI/API:

  • Container port 9696 — Prowlarr's default HTTP port, matching the module's container_port.
  • /config — Prowlarr persists its embedded SQLite database and all other application state under /config by default (the LinuxServer.io image's standard persistent-data path). No dedicated environment variable is required — it is the image's own default.
  • No telemetry, queue, or execution-mode settings — there is nothing further to configure at boot; authentication, if wanted, is enabled entirely from within the web UI.

Mounting of /config:

  • GKE with the (default) stateful_pvc_enabled = true mounts a real block PVC at /config and sets enable_gcs_storage_volume = false to avoid a double-mount at the same path — this is the recommended layout, since WAL-mode SQLite needs real POSIX file locking that a block device provides and GCS FUSE does not reliably.
  • Without the PVC, the storage GCS bucket is mounted at /config via GCS FUSE instead.

6. Health probe behaviour

Both the startup and liveness probes issue an HTTP GET /ping, Prowlarr's public, unauthenticated status endpoint — confirmed via local container testing and a live GKE deployment to return 200 {"status":"OK"}.

This is a real fix over this module's original clone source, which pointed both probes at /api/health (a path that does not exist on Prowlarr and would have failed every probe). That stale /api/health value still lingers in the separate, module-level startup_probe_config / health_check_config / uptime_check_config variables surfaced by Prowlarr_GKE — but for the actual Pod's startup and liveness probes, it is harmless: App_GKE always prefers the per-app startup_probe/ liveness_probe supplied here (via Prowlarr_Common's config output) over the top-level startup_probe_config/health_check_config variables, so the stale default in those two never reaches the running Pod. The one exception is uptime_check_config, which is applied as-is if an operator enables the optional Cloud Monitoring uptime check — see Prowlarr_GKE §6.

  • Startup probeinitial_delay = 15s, timeout = 5s, period = 10s, failure_threshold = 10.
  • Liveness probeinitial_delay = 30s, timeout = 5s, period = 30s, failure_threshold = 3.

7. Object storage

A single Cloud Storage bucket is declared here and provisioned by the foundation, which also grants the workload service account access:

  • name_suffix = "storage", storage class STANDARD, with public_access_prevention = "enforced".
  • Only actually mounted at /config when stateful_pvc_enabled = false — not the recommended configuration for Prowlarr. With the default block PVC in place, this bucket is provisioned but unused as a mount.
gcloud storage buckets list --project "$PROJECT" --filter="name~prowlarr"

Why storage type matters here. Prowlarr's embedded, WAL-mode SQLite database needs a filesystem with real POSIX file locking. The GKE block PVC (stateful_pvc_enabled = true, the default) is the correct fit — low-latency random I/O with real file locking against the SQLite file. GCS FUSE does not reliably support that locking model, and this catalogue has a documented history of GCS FUSE corrupting other WAL-mode SQLite apps (see UptimeKuma) — which is exactly why Prowlarr defaults to the PVC rather than the bucket mount that most Common modules in this catalogue default to.


For the Prowlarr-specific, user-facing configuration (variables by group, outputs, and how to explore each service from the Console and CLI), see the platform guide: Prowlarr_GKE.