SnipeIT on Cloud Run — Lab Guide
Overview
Estimated time: 45–90 minutes
Snipe-IT is a free, open-source IT asset and inventory management system for tracking hardware, software licences, accessories, and consumables, with asset check-in/out, audit logging, depreciation, and a full REST API. This lab takes you through the full operational lifecycle of the Snipe-IT on Cloud Run module on Google Cloud: deploy it, access and verify it, run it day-to-day, observe it, diagnose common problems, and tear it down.
The lab focuses on operating the Cloud Run module and the Google Cloud platform, not on Snipe-IT product features. For the complete list of provisioned services and every configuration input (organised by group), see the Configuration Guide — this lab deliberately does not duplicate that detail so it stays accurate over time.
Objectives
By the end of this lab you will be able to:
- Deploy the module from the RAD platform and locate the resources it provisions.
- Access and verify the running service, including its first-run
/setupwizard. - Perform day-2 operations — inspect, scale, update, and manage secrets and backups.
- Observe the service with Cloud Logging and Cloud Monitoring.
- Diagnose and resolve the most common deployment and runtime issues.
- Tear the deployment down cleanly.
Prerequisites
- Services_GCP deployed in the target project (provides the VPC, Cloud SQL, Artifact Registry, and shared service accounts this module depends on).
- A Google Cloud project with billing enabled.
- gcloud CLI authenticated:
gcloud auth loginandgcloud auth application-default login. - Project Owner (or equivalent) IAM on the project.
- RAD platform access with permission to deploy modules into the project.
Set these shell variables once; every task below reuses them:
export PROJECT="<your-gcp-project-id>"
export REGION="us-central1" # the region you deploy into
Task 1 — Deploy the module [Automated]
-
In the RAD platform, open Snipe-IT (Cloud Run), set
project_id, and review the inputs. Configure only what you need — the Configuration Guide documents every input by group, with defaults. Review the estimated cost (if credits are enabled) and click Deploy, which opens the deployment status page with real-time logs. -
The platform provisions the Cloud Run service running the official
snipe/snipe-itPHP/Apache image (no custom build), a Cloud SQL for MySQL 8.0 database with its Secret Manager secrets (the LaravelAPP_KEYand the database password), a Cloud Filestore (NFS) instance mounted at/var/lib/snipeitfor uploaded asset images/signatures/barcodes, a Cloud Storagesnipeit-uploadsbucket, and runs two ordered initialisation jobs (db-initthenmigrate). First deploys take roughly 20–35 minutes (Cloud SQL and Filestore creation dominate). -
When it completes, discover the resources with name-agnostic filters (so the commands keep working regardless of the deployment suffix):
SERVICE=$(gcloud run services list --project="$PROJECT" --region="$REGION" \
--filter="metadata.name~snipeit" --format="value(metadata.name)" --limit=1)
SERVICE_URL=$(gcloud run services describe "$SERVICE" \
--project="$PROJECT" --region="$REGION" --format="value(status.url)")
echo "Service: $SERVICE"
echo "URL: $SERVICE_URL"
Task 2 — Access & verify [Manual]
-
Confirm the service is healthy and connected to its database. Snipe-IT serves its login/setup page at
/unauthenticated, so a200there confirms the PHP application and the MySQL connection are both healthy:curl -s -o /dev/null -w "%{http_code}\n" "$SERVICE_URL/" # expect 200 -
Open
$SERVICE_URLin a browser. On a fresh install, Snipe-IT redirects/to the/setupinstallation wizard rather than offering a self-serve sign-up form. Walk through the wizard to create the first administrator account. If the redirect loops or lands on the wrong host, confirmAPP_URLmatches the deployed service URL (Snipe-IT derives it automatically from the predicted Cloud Run URL, but a custom domain or load balancer added after deploy needsAPP_URLupdated to match viaenvironment_variables).
Task 3 — Operate & keep it running (Day-2) [Manual]
-
Inspect the service and its revisions (each deploy creates an immutable revision; traffic shifts to the newest healthy one):
gcloud run services describe "$SERVICE" --project="$PROJECT" --region="$REGION"
gcloud run revisions list --service="$SERVICE" --project="$PROJECT" --region="$REGION" -
Scale by changing the min/max instance inputs and clicking Update on the deployment details page — the module owns the service spec, so scaling is a configuration change, not a manual
gcloudedit (a manual edit would be reverted on the next apply).max_instance_countdefaults to1and should be left there unless multi-instance behaviour with shared NFS storage and Laravel's database-backed session driver has been verified for your deployment. -
Update the application version by changing the version input in the RAD platform and applying it via Update; a new image is pulled and a new revision rolls out. Pin
application_versionto a specificsnipe/snipe-itrelease tag in production rather than trackingv8-latest. -
Manage secrets and backups:
gcloud secrets list --project="$PROJECT" --filter="name~snipeit"
gcloud run jobs list --project="$PROJECT" --region="$REGION" # db-init + migrate + any scheduled backup jobsNever rotate the
APP_KEYsecret after first boot — it invalidates every active session and any application data Snipe-IT encrypted with the old key. -
Open a database session for inspection or maintenance:
INSTANCE=$(gcloud sql instances list --project="$PROJECT" --format="value(name)" --limit=1)
gcloud sql connect "$INSTANCE" --user=snipeit --database=snipeit --project="$PROJECT"
Task 4 — Observe: Logging & Monitoring [Manual]
-
Logs — from the CLI or the Logs Explorer:
gcloud run services logs read "$SERVICE" --project="$PROJECT" --region="$REGION" --limit=50Logs Explorer filter:
resource.type="cloud_run_revision" AND resource.labels.service_name="<service>". -
Monitoring — open the Cloud Run dashboard for the service and review request count, request latency (P50/P95/P99), instance count (scaling behaviour), and CPU / memory utilisation.
uptime_check_configis disabled by default for this module — enable it in the deployment inputs if you want a provisioned uptime check and check-failure alert under Monitoring → Uptime checks / Alerting → Policies.
Task 5 — Troubleshoot & debug [Manual]
Durable techniques for the failure modes you are most likely to hit. These are platform-level diagnostics and do not change with Snipe-IT releases.
- Revision unhealthy / service won't serve: inspect the latest revision and its
logs for startup errors, and confirm env vars and secrets resolved. The
startup probe is TCP on the container port (30 s initial delay, ~5-minute
failure window) to allow first-boot DB setup; the liveness probe is HTTP
GET /(300 s initial delay).gcloud run revisions list --service="$SERVICE" --project="$PROJECT" --region="$REGION"
gcloud run services logs read "$SERVICE" --project="$PROJECT" --region="$REGION" --limit=100 - Database connection errors: confirm the Cloud SQL instance is
RUNNABLE. This module reaches Cloud SQL over TCP against the private IP by default (enable_cloudsql_volume = false), not the Auth Proxy Unix socket used by most other Cloud Run modules — confirm the runtime service account has VPC egress and the instance's private IP is reachable. - Initialisation job failed: list executions and read the failed one's logs
for either job in the chain (
db-initruns first, thenmigrate):gcloud run jobs executions list --job="${SERVICE}-db-init" \
--project="$PROJECT" --region="$REGION"
gcloud run jobs executions list --job="${SERVICE}-migrate" \
--project="$PROJECT" --region="$REGION" /setupwizard loops or 404s: almost always anAPP_URLmismatch — confirm the injectedAPP_URLmatches the host you're browsing to.- Uploads/asset images disappear after a cold start: confirm
enable_nfs = trueand the Filestore instance is reachable; disabling NFS makes the/var/lib/snipeitupload tree ephemeral per instance. - 403 / permission errors: verify the runtime service account's IAM roles.
See the Configuration Guide's Configuration Pitfalls section for
setting-specific gotchas (including the critical rule never to rotate
APP_KEY after first boot, and why db_user_env_var_name /
db_name_env_var_name / db_password_env_var_name are inert for this
module).
Task 6 — Tear down [Automated]
On the Deployments page, open the deployment and click the Trash icon (Delete). Delete runs terraform destroy and is irreversible (the deployment record is retained for history). If a deployment is stuck and the RAD platform can no longer manage it (for example after manual changes that conflict with the Terraform state), use Purge instead — it removes the deployment from RAD's records without destroying the cloud resources (it makes RAD forget the project). This removes everything the module created — the Cloud Run service,
Cloud SQL database, Filestore (NFS) instance, Secret Manager secrets, GCS
buckets, and Artifact Registry images. Resources owned by Services_GCP
(the VPC, shared Cloud SQL, registry) are managed separately and are not
removed here.
Summary
| Task | Type | Outcome |
|---|---|---|
| 1 — Deploy | Automated | Module provisions Cloud Run, Cloud SQL (MySQL 8.0), NFS, secrets, storage bucket, and runs db-init → migrate |
| 2 — Access & verify | Manual | Health check passes; complete the /setup wizard to create the first administrator account |
| 3 — Operate | Manual | Inspect revisions, scale, update version, manage secrets/backups, DB access |
| 4 — Observe | Manual | Query Cloud Logging; review Cloud Monitoring metrics and (optional) uptime check |
| 5 — Troubleshoot | Manual | Diagnose revision, database, init-job, /setup, and NFS issues |
| 6 — Tear down | Automated | Delete (Trash) removes all module resources |