Cloudreve on GKE Autopilot
Cloudreve is a popular open-source, self-hosted cloud storage and file-sharing platform written in Go. It provides a web UI for uploading, organising, previewing and sharing files, with pluggable storage back-ends. This module deploys Cloudreve on GKE Autopilot on top of the App_GKE foundation, which provisions and manages the shared Google Cloud and Kubernetes infrastructure.
This guide focuses on the cloud services Cloudreve uses and how to explore and operate them from the Google Cloud Console and the command line. For the mechanics that are common to every GKE application — Workload Identity, ingress, autoscaling, CI/CD, Cloud Armor, IAP, Binary Authorization, VPC Service Controls, backups, and the deployment lifecycle — refer to the App_GKE foundation guide rather than repeating them here.
What Cloudreve costs on RAD, and how that compares
Cloudreve on RAD's GKE Autopilot module costs about US$42.08 a month in a Google Cloud project you own, plus a one-time 75-credit module fee (US$7.50). Cloudreve is a self-hosted cloud storage and file-sharing platform. For the lowest cost, the Cloud Run guide runs the same Cloudreve for about US$32.57 a month; pick GKE here only if Cloudreve must stay up continuously, scale across pods, or run beside other Kubernetes workloads.
If Cloudreve is only needed occasionally — a demo, a trial, a seasonal or study workload — a RAD-managed project can be deleted and restored within 30 days for a handful of credits, so that US$42.08 becomes a few dollars a month instead. See Pause it for free, below.
What you pay on RAD
| In a Google Cloud project you own | In a project RAD manages for you | |
|---|---|---|
| Module fee, once per deployment | 75 credits (US$7.50 at the top-up price) | 67.5 credits (10% lower) |
| Build time | A few credits per build (roughly 3–6) | The same |
| Google Cloud running cost | Billed by Google to your own billing account, about US$42.08 a month for the default configuration (table below) | Metered hourly in credits; RAD publishes 67 credits a day, about 2010 a month (about US$201 at the top-up price) |
| Who owns what | You own the project and its billing; RAD deploys and updates it | RAD owns the project, with guardrails, quotas and budget alerts; you get console access, and a minimum purchased balance is held in reserve |
10 credits cost US$1 on a one-off top-up, less on a plan. In a project RAD manages, the database, file server and network are shared by every application in the project, so a second application does not add a second database.
Default running cost in your own project (us-central1, Google list prices):
| Resource (module default) | Per month |
|---|---|
| GKE Autopilot pod, 1x vCPU / 1 GiB | US$36.08 |
| Cloud NAT and networking | US$5 |
| Cloud Storage (add-ons, backups) | US$1 |
| GKE cluster management fee | shared across every GKE app in the project; $0 if this is your only cluster, else ~73 |
| Total | about US$42.08 |
How it compares
- Run it yourself and a VPS running Cloudreve and its own storage back-end costs less in cash: a Hetzner CPX22 or DigitalOcean 2 vCPU/4 GB box is about $24 a month, or a GCP
e2-standard-2about $49 a month — plus your own time for backups, security patches and upgrades, which RAD's managed Cloud SQL, Secret Manager and monitoring cover for you. - RAD never claims to be cheaper than bare infrastructure in cash terms — it usually is not. The difference is what RAD manages for you: patching, backups, secrets and monitoring, plus the ability to pause Cloudreve for free rather than paying for idle capacity (see below).
Pause it for free: delete a RAD-managed project, restore it when you need it
If Cloudreve runs in a project RAD manages for you, you have a second option that goes well beyond scaling to zero: delete the whole project, and restore it within 30 days for close to nothing. This suits Cloudreve that you only need occasionally far better than running it continuously.
- How it works. Deleting a RAD-managed project unlinks its billing first, then asks Google to delete the project. Google does not remove the project immediately: it keeps it, recoverable, for 30 days. Because billing is already unlinked, nothing is charged while it waits. Unlike deleting one module, this does not tear down GKE Autopilot resources one by one — the whole project, and everything in it, simply stops.
- Restoring costs a handful of credits, not a rebuild. Within 30 days, the project's owner can restore it. RAD asks Google to undelete the project and reattaches its billing account, then asks you to run Update on each deployment to confirm everything came back. Because nothing was individually destroyed, that Update finds the same resources already there — it is a check, not a rebuild, and an Update never charges the module fee again. That is a handful of credits (under US$1) in total for a typical Cloudreve chain, against the 80 credits a full redeploy costs.
- So a month of occasional use can cost a few dollars, not US$42.08. Deploy Cloudreve, use it, delete the project. Restore it next time you want it, confirm with Update, and delete it again when you're done. You pay only for the module fee once, the builds, and whatever hours it was actually live.
- What this needs. You must own the project (not a bring-your-own one RAD only manages billing for), and you restore it yourself within the 30 days — after that, Google deletes it for good. Restoring is admitted like creating a new project: your purchased credit balance must still clear the tier's floor (100 credits for the sandbox tier most study and demo use fits). Google says most services are fully working again within 36 hours of a restore.
- One real gap: the backup bucket does not survive. Nightly backups are written to a bucket inside the project, and that bucket is not protected by Cloud Storage's soft-delete, so it is very likely gone as soon as you delete the project — even though the project itself is recoverable for 30 days. If you have customised Cloudreve and want to keep that work, copy a backup out (to Google Drive, or a bucket outside the project) before you delete. For a default installation with nothing irreplaceable in it, this does not matter.
Pay only while you use it, the other way: delete and redeploy
GKE Autopilot keeps at least one pod running, so it never scales to zero on its own. The option above only applies to a RAD-managed project; in your own project, or once the 30-day window has passed, the way to stop paying is to delete the deployment and deploy it again when you need it.
- What a redeploy costs. The module fee again plus the builds: about 80 credits (US$8) in your own project. Deleting saves money only once Cloudreve would otherwise sit unused for about 6 days or more in your own project (US$1.40 a day), or about 2 days or more in a RAD-managed one (67 credits a day).
- Keep your data first. Nightly backups are written to a bucket inside the deployment and are deleted with it, so copy the latest backup out before deleting if you want to keep it.
- Note your settings. RAD does not recreate a deleted deployment for you; you enter the settings again when you deploy.
Lab sessions and Managed Environments
- Lab sessions, for training. A trainer runs a session for a class. Each participant gets the app in their own Google Cloud project for 15 minutes to 24 hours, within an allowance the trainer sets. Either the trainer funds every place, or each participant pays for their own. Everything is deleted when the session ends and unused credits go back to the trainer.
- Managed Environments, for consultancies. A partner runs the app for a client from a ring-fenced wallet it funds, and settles with the client directly. If the wallet runs low, billing pauses and the data is kept, so nobody receives an unexpected charge. At the end the partner hands the project over and the deployments become the client's own.
Credits can be bought in more than 20 currencies, including XAF, XOF, NGN, GHS, KES and ZAR, by card, bank transfer or mobile money.
Sources (8 October 2026): Google Cloud list prices from the Cloud Billing Catalog API; RAD's own fees and daily-credit estimates from radmodules.dev/pricing; Delete and restore projects for the 30-day recovery window and what it says about Cloud Storage objects without soft delete. Prices change; check each source before relying on a figure.
1. Overview
Cloudreve runs as a single Go binary serving both the web UI and file storage API. The deployment wires together a focused set of Google Cloud services:
| Capability | Google Cloud service | Notes |
|---|---|---|
| Compute | GKE Autopilot | Single Go binary on port 5212, StatefulSet by default |
| Persistence | Block Persistent Volume (via stateful_pvc_enabled) | Mounted at /cloudreve; holds the embedded SQLite DB, conf.ini, and uploaded files |
| Object storage | Cloud Storage | A storage bucket provisioned automatically, but only wired in as a GCS FUSE mount when the block PVC is disabled |
| Database | None | Cloudreve uses an embedded SQLite database on the block volume — no Cloud SQL instance is created |
| Secrets | Secret Manager | None created — the first-run admin password is generated by Cloudreve itself and printed to container logs |
| Ingress | Kubernetes Gateway / Cloud Load Balancing | Custom domain enabled by default; static IP reserved by default |
Sensible defaults worth knowing up front:
- No SQL database.
database_typeis fixed toNONEbyCloudreve_Common; every Cloud SQL-related variable is forwarded to the foundation only for interface compatibility and has no effect. stateful_pvc_enabled = trueby default — required, not optional. Cloudreve's embedded SQLite database and local file storage live together in its working directory,/cloudreve. A GCS FUSE mount there would corrupt SQLite's file locking, so the module defaults to a block PVC (StatefulSet) instead;workload_typeneed not be set separately.- Binary/data co-location is handled in the image build. Upstream's
cloudreve/cloudreveimage keeps both thecloudrevebinary and its data in/cloudreve. This module's Dockerfile relocates the binary to/usr/local/bin/cloudrevein a multi-stage build (ENTRYPOINT ["/usr/local/bin/cloudreve"],WORKDIR /cloudreve), so mounting the PVC at/cloudreveonly shadows data files, never the binary. See Section 3. - GCS volume and block PVC are mutually exclusive at the same path. The
variant only mounts the auto-created
storagebucket at/cloudreve(enable_gcs_storage_volume = !stateful_pvc_enabled) when the block PVC is off, avoiding a double-mount conflict — with the default stateful config, that bucket exists but is not mounted into the pod. - No Cloud SQL, no Redis.
enable_cloudsql_volumedefaultsfalseandenable_redisis explicitly overridden tofalseinmain.tf. - No injectable admin secret. Cloudreve generates its own initial admin
password on first boot and prints it to container logs — no Secret
Manager secret is created;
secret_ids/secret_valuesare empty maps. - Single replica by default.
min_instance_count = max_instance_count = 1, matching Cloudreve's lack of distributed/multi-node clustering support. enable_pod_disruption_budgetdefaultstrue(unusual among app modules),pdb_min_available = "1", protecting the single stateful pod.- Custom domain and static IP are on by default
(
enable_custom_domain = true,reserve_static_ip = true), unlike many other application modules where these default off.
2. Google Cloud Services & How to Explore Them
All commands assume you have run
gcloud container clusters get-credentials <cluster> --region $REGION --project $PROJECT
and that PROJECT, REGION, and NAMESPACE are set. The namespace and other
identifiers are reported in the deployment Outputs.
A. GKE Autopilot — the Cloudreve workload
Cloudreve pods are scheduled on Autopilot, which bills for the CPU/memory the
pod actually requests. Because stateful_pvc_enabled = true by default, the
workload is a StatefulSet with a single stable pod identity and a per-pod
block PVC, not a Deployment.
- Console: Kubernetes Engine → Workloads → filter for the Cloudreve workload for pods, revisions, and events. Kubernetes Engine → Services & Ingress shows the external IP / Gateway route.
- CLI:
kubectl get statefulsets,pods,svc -n "$NAMESPACE"
kubectl logs -n "$NAMESPACE" statefulset/<service-name> --tail=100
kubectl describe pod -n "$NAMESPACE" -l app=<service-name>
See App_GKE for how Autopilot, scaling, and the Deployment-vs-StatefulSet workload type decision are managed.
B. Block Persistent Volume (StatefulSet PVC)
Cloudreve's embedded SQLite database (cloudreve.db), generated conf.ini,
and uploaded files all live under /cloudreve, the container's working
directory. stateful_pvc_enabled = true provisions a per-pod block PVC
(stateful_pvc_storage_class = standard-rwo by default, an SSD-backed
Balanced PD) mounted at that path — a GCS FUSE mount here would break
SQLite's file-locking semantics, so the block device is mandatory. Uploads and
avatars are kept in /cloudreve/data/ rather than the image's own
/cloudreve/uploads and /cloudreve/avatar: the image declares those two as
VOLUMEs, which GKE backs with ephemeral node storage on top of the PVC, so files
there would vanish on pod replacement. The entrypoint links them into place and
migrates anything left at the old location.
- Console: Kubernetes Engine → Storage → filter for the Cloudreve PVC; Compute Engine → Disks shows the underlying Persistent Disk.
- CLI:
kubectl get pvc -n "$NAMESPACE"
kubectl describe pvc -n "$NAMESPACE" -l app=<service-name>
gcloud compute disks list --project "$PROJECT" --filter="name~cloudreve"
Remember that scaling to zero (kubectl scale --replicas=0) frees CPU/memory
but keeps the PVC — only deleting the PVC (or the namespace) releases the
SSD quota it draws. See App_GKE for the StatefulSet / PVC group
mechanics and the SSD-vs-HDD storage-class trade-off.
C. Cloud Storage
A storage Cloud Storage bucket is created automatically by
Cloudreve_Common, but it is only mounted into the pod as a GCS FUSE volume
when stateful_pvc_enabled = false (avoiding a double-mount at /cloudreve
with the block PVC). With the default stateful configuration, the bucket
exists but sits unused unless you add it as an explicit gcs_volumes entry
at a different mount path.
- Console: Cloud Storage → Buckets → filter for the deployment's
storagesuffix. - CLI:
gcloud storage buckets list --project "$PROJECT" --filter="name~storage"
kubectl get pvc,pv -n "$NAMESPACE"
See App_GKE for CMEK options and the GCS Fuse CSI driver.
D. Secret Manager
Cloudreve_Common creates no Secret Manager secrets for Cloudreve
itself — the first-run admin password is generated internally by Cloudreve
and printed to container logs on first boot, not stored in Secret Manager.
Any secrets you configure via secret_environment_variables are still
projected through the standard Secret Store CSI mechanism.
- Console: Security → Secret Manager.
- CLI:
gcloud secrets list --project "$PROJECT" --filter="name~cloudreve"
kubectl logs -n "$NAMESPACE" statefulset/<service-name> --tail=200 | grep -i "admin\|password"
See App_GKE for the Secret Store CSI integration and rotation mechanics (rotation has no effect here since no service secret exists).
E. Networking & ingress
By default the workload uses enable_custom_domain = true with
reserve_static_ip = true (Kubernetes Gateway API with a Google-managed
certificate). service_type defaults to ClusterIP — the Gateway, not the
Service, is the external entry point unless you switch to LoadBalancer.
- Console: Network services → Load balancing / Gateways; VPC network → IP addresses.
- CLI:
kubectl get svc,gateway,httproute -n "$NAMESPACE"
gcloud compute addresses list --project "$PROJECT"
See App_GKE for custom domains, Cloud CDN, and static IP details.
F. Cloud Logging & Monitoring
Pod stdout/stderr flow to Cloud Logging; GKE metrics flow to Cloud
Monitoring. Optional uptime checks and alert policies are available
(uptime_check_config.enabled defaults false).
- Console: Logging → Logs Explorer; Monitoring → Dashboards / Alerting.
- CLI:
gcloud logging read 'resource.type="k8s_container" AND resource.labels.namespace_name="'"$NAMESPACE"'"' \
--project "$PROJECT" --limit 50
3. Cloudreve Application Behaviour
- No database initialisation job.
Cloudreve_Commondoes not inject a defaultdb-init/db-createjob — Cloudreve has no SQL database to provision.initialization_jobsonly runs jobs you explicitly supply. - First-boot self-setup, admin password in logs. On first start Cloudreve
creates its SQLite schema on the mounted volume and generates the initial
admin account, printing the generated password to container logs. There is
no separate migration step and no Secret Manager secret to retrieve it
from — capture it with
kubectl logsbefore the log buffer rotates, then change it via the web UI. - Volume-shadowing is pre-fixed in the Dockerfile. Without the relocation
described in Section 1, the block PVC mount at
/cloudrevewould shadow the co-located binary, producingexec ./cloudreve: no such file or directory(CrashLoopBackOff). This is a custom-build module (container_image_source = "custom",image_source = "custom"inCloudreve_Common) precisely so this fix (modules/Cloudreve_Common/scripts/Dockerfile) can be baked in — it is not a bare pass-through of the upstream image. Editing the Dockerfile requires a rebuild (tofu taint 'module.app_gke.module.app_build.null_resource.build_and_push_application_image[0]'if a content-hash trigger misses the change). - Version pinning uses an app-specific build ARG. The Dockerfile reads
CLOUDREVE_VERSION(pinned to3.8.3whenapplication_version = "latest"), not the genericAPP_VERSIONthe Foundation injects and would otherwise force to the unresolvable taglatest. - Health probe paths. Startup probe is HTTP
GET /(initial_delay_seconds = 15,failure_threshold = 10, i.e. up to ~100s to become ready); liveness probe is HTTPGET /as well (initial_delay_seconds = 30,period_seconds = 30). Cloudreve has no dedicated health endpoint distinct from its web UI —/returns 200 once the server is serving. - Single-replica,
OrderedReadysemantics. Withstateful_pod_management_policyleft at itsnull→OrderedReadydefault andmax_instance_count = 1, only one pod exists at a time; do not raisemax_instance_countwithout verifying Cloudreve's own multi-node/clustering support (not managed by this module). - Inspect the running config and StatefulSet rollout:
kubectl get statefulsets -n "$NAMESPACE"
kubectl rollout status statefulset/<service-name> -n "$NAMESPACE"
kubectl exec -n "$NAMESPACE" statefulset/<service-name> -- ls -la /cloudreve
4. Configuration Variables
Variables are grouped exactly as they appear on the deployment platform. Only settings specific to or notable for Cloudreve are listed; every other input is inherited from App_GKE with its standard behaviour and defaults.
Group 3 — Application Identity
| Variable | Default | Description |
|---|---|---|
application_name | cloudreve | Base name for resources. Do not change after first deploy. |
application_version | latest | cloudreve/cloudreve image tag; latest is pinned to 3.8.3 at build time via the CLOUDREVE_VERSION build ARG. |
description | Cloudreve — self-hosted cloud storage / file-sharing system | Populates the GKE workload description. |
Group 4 — Runtime & Scaling
| Variable | Default | Description |
|---|---|---|
cpu_limit | 1000m | CPU allocated to the Cloudreve container. |
memory_limit | 1Gi | Memory allocated; size for file-serving and concurrent transfers. |
min_instance_count / max_instance_count | 1 / 1 | Cloudreve has no distributed/clustering mode — keep both at 1. |
container_port | 5212 | Fixed by Cloudreve_Common; the variable is not forwarded to App_GKE and has no effect. |
enable_cloudsql_volume | false | Cloudreve has no Cloud SQL database. |
enable_image_mirroring | true | Mirrors the built image into Artifact Registry. |
Group 6 — GKE Backend & Cluster
| Variable | Default | Description |
|---|---|---|
service_type | LoadBalancer | External access goes through the Gateway (enable_custom_domain), not the Service, by default. |
workload_type | null → StatefulSet | Resolves automatically because stateful_pvc_enabled = true. |
session_affinity | None | No sticky routing configured by default. |
Group 7 — StatefulSet Configuration
| Variable | Default | Description |
|---|---|---|
stateful_pvc_enabled | true | Required for Cloudreve — its SQLite DB and uploads must live on a block volume, not gcsfuse. |
stateful_pvc_size | 20Gi | Size for the SQLite DB plus uploaded files; raise for larger libraries. |
stateful_pvc_mount_path | /cloudreve | Cloudreve's working directory — do not change without also updating the app's data-path expectations. |
stateful_pvc_storage_class | standard-rwo | SSD-backed Balanced PD; switch to standard (HDD) if the tight SSD_TOTAL_GB quota is a constraint (see App_GKE). |
stateful_fs_group | 3000 | Matches the Cloudreve Helm chart's fsGroup convention (container runs as UID 1000/GID 2000) so the PVC is group-writable. |
Group 9 — Reliability
| Variable | Default | Description |
|---|---|---|
enable_pod_disruption_budget | true | On by default (unusual among app modules) to protect the single stateful pod. |
pdb_min_available | "1" | Requires the one pod to stay available during voluntary disruptions. |
Group 10 — Observability & Health
| Variable | Default | Description |
|---|---|---|
startup_probe | HTTP GET /, initial_delay=15s, failure_threshold=10 | No dedicated health endpoint — Cloudreve serves / once ready. |
liveness_probe | HTTP GET /, initial_delay=30s, period=30s | Same endpoint as the startup probe. |
Group 14 — Cloud Storage
| Variable | Default | Description |
|---|---|---|
gcs_volumes | [] | The auto-created storage bucket is only mounted at /cloudreve when stateful_pvc_enabled = false; otherwise it exists unused unless mounted at a different path here. |
Group 15 — Redis
| Variable | Default | Description |
|---|---|---|
enable_redis | true (App_GKE default) but overridden to false in main.tf | Cloudreve does not use Redis; the variable has no effect regardless of its setting. |
Group 16 — Database Configuration
| Variable | Default | Description |
|---|---|---|
database_type | NONE | Fixed by Cloudreve_Common — Cloudreve has no SQL database; all other database_*/db_*/sql_* variables are forwarded for foundation interface compatibility only and have no effect. |
Group 19 — Custom Domain, Static IP & Networking
| Variable | Default | Description |
|---|---|---|
enable_custom_domain | true | On by default, unlike many other application modules. |
reserve_static_ip | true | Stable external address across redeploys. |
network_tags | ["nfsserver"] | Default carries the nfsserver tag even though enable_nfs defaults false for Cloudreve — harmless unless NFS is separately enabled. |
All other inputs follow standard App_GKE behaviour.
5. Outputs
These values are returned on a successful deployment and are the quickest way to locate and explore the running resources.
| Output | Description |
|---|---|
service_name | Kubernetes Service name. |
namespace | Namespace the workload runs in. |
service_cluster_ip | In-cluster ClusterIP. |
stage_service_cluster_ips | Map of ClusterIPs for stage-specific services. |
service_external_ip | External LoadBalancer IP (when a static IP is reserved). |
service_url | URL to reach Cloudreve. |
storage_buckets | Created Cloud Storage buckets (the storage bucket, mounted only if stateful_pvc_enabled = false). |
network_name / network_exists / regions | VPC network, presence, available regions. |
container_image / container_registry | Deployed image and Artifact Registry repo. |
monitoring_enabled / monitoring_notification_channels | Monitoring status and channels. |
deployment_id / tenant_id / resource_prefix | Naming identifiers. |
project_id / project_number | Project identifiers. |
initialization_jobs | Names of any user-supplied initialization jobs (Cloudreve injects none by default). |
statefulset_name | Name of the StatefulSet. |
cicd_enabled / cicd_configuration | CI/CD status and details (repo, trigger, registry). |
github_repository_url / github_repository_owner / github_repository_name | CI/CD GitHub details. |
artifact_registry_repository / cloudbuild_trigger_name / cloudbuild_trigger_id | Registry and build trigger. |
kubernetes_ready | Whether the cluster/workload is ready. |
vpc_sc_enabled / vpc_sc_perimeter_name / vpc_sc_dry_run_mode | VPC-SC status. |
audit_logging_enabled / artifact_registry_cmek_enabled | Audit logging and CMEK status. |
6. Configuration Pitfalls & Sensible Defaults
Risk: Critical (data loss / outage / security) — High (service degraded) — Medium (cost or partial degradation) — Low (minor).
Inherited plan-time validation. This module passes its configuration through the App_GKE foundation engine, which validates values and combinations at plan time — a
StatefulSetforced alongside a stateless setting, IAP with no authorized identities,quota_memory_*given as bare integers, an out-of-rangecontainer_port/backup_retention_days. Invalid configuration fails the plan with a clear, named error before any resource is created, so most mistakes below are caught up front rather than at apply or runtime.
| Setting | Sensible value | Risk | Consequence if wrong |
|---|---|---|---|
stateful_pvc_enabled | true | Critical | Disabling it without providing an equivalent block-storage mount lets SQLite live on gcsfuse (or ephemeral disk), risking database corruption or total data loss on pod recreation. |
stateful_pvc_mount_path | /cloudreve | Critical | Changing this away from Cloudreve's working directory disconnects the persistent volume from where the app actually reads/writes its DB and uploads. |
Dockerfile binary relocation (/usr/local/bin/cloudreve) | Keep as shipped | Critical | Reverting to ENTRYPOINT ["./cloudreve"] inside /cloudreve re-introduces volume-shadowing: the block PVC mount hides the binary and the pod CrashLoopBackOffs with exec ./cloudreve: no such file or directory. |
max_instance_count | 1 | High | Cloudreve has no verified multi-node/clustering mode in this module; scaling beyond 1 risks concurrent writers against the same SQLite file (only one pod actually owns the PVC in OrderedReady StatefulSet mode, but do not assume higher counts are safe). |
stateful_pvc_storage_class | standard-rwo (SSD); standard (HDD) under quota pressure | Medium | SSD draws the tight SSD_TOTAL_GB quota. Scaling to zero does not release the PVC — only deletion does. |
| Admin password retrieval | Capture from kubectl logs immediately after first boot | Medium | The generated admin password is only printed to container logs once; missing it locks you out of the first-run super-admin account until reset via the container. |
quota_memory_requests / _limits | binary units (4Gi, 8192Mi) | Critical | Bare integers are treated as bytes and block all pod scheduling in the namespace. |
reserve_static_ip | true | Medium | Without it, the external IP/Gateway address can change across redeploys, breaking DNS and bookmarked links. |
gcs_volumes at /cloudreve while stateful_pvc_enabled = true | Avoid | High | A GCS FUSE mount and the block PVC both targeting /cloudreve conflict; the Common module only enables the GCS mount when the block PVC is off. |
backup_retention_days | 7 (raise for prod) | Medium | Too short for compliance retention. |
For the foundation behaviour referenced throughout — IAM and Workload
Identity, autoscaling, ingress and certificates, CI/CD, Cloud Armor, IAP,
Binary Authorization, VPC-SC, backups, and image mirroring — see
App_GKE. Cloudreve-specific application configuration
shared with the Cloud Run variant is described in the Cloudreve_Common
module (modules/Cloudreve_Common); a dedicated Cloudreve_Common.md guide
does not yet exist in this documentation set.
Related guides
- Hands-on lab: Cloudreve on GKE Autopilot — deploy it step by step, with the console screens and commands at each stage.
- Cloudreve on Google Cloud Run — the same application on Cloud Run, for when you need the other deployment target.
- Cloudreve Common — Shared Application Configuration — the configuration shared by both deployment targets.
Need RAD to do something it does not do yet? Request it on the roadmap, or vote on what is already there.