# Run the first VM on Google Cloud Free Trial

Use one owner-selected, dedicated project on an **active, unupgraded Google Cloud Free Trial**. This pilot creates one private Linux VM for one hour. A startup script runs a synthetic HTTP request against the guest's own loopback interface. You read the result through the Compute Engine control plane. This establishes one VM in Iowa, not a public Daedro deployment or an external measurement location.

## Confirm the account

The account owner completes **Start free** in the Google Cloud console and personally handles identity, phone and payment verification. New eligible accounts receive $300 in trial credit for 90 days. Google describes a temporary payment verification hold that may be visible to the bank. The standard Free Trial closes when credits or time run out unless the owner upgrades. The button to upgrade or activate a **Paid** account ends this protection. [Free Trial terms and billing behavior](https://docs.cloud.google.com/free/docs/free-cloud-features)

In Cloud Billing, confirm the selected project's linked billing account is explicitly **Free Trial**, with at least two hours and $1 of trial credit remaining. These margins cover startup and verification grace. Record the expiry and check there are no other workloads drawing down the balance. A credit display or `billingEnabled=true` alone cannot establish trial status, because upgraded accounts can retain credits. If you cannot verify the account type, use only **plan** and **check**.

## Review the exact operations

- **Project and zone.** Supply the project ID, with Compute Engine API already enabled. Use a project with an existing default subnet in `us-central1`, an empty instance and disk inventory and no Cloud Router or NAT. The script never creates projects, changes billing, enables APIs or requests quota increases.
- **VM and storage.** One standard `e2-micro` named `daedro-free-pilot` in `us-central1-a`, an official Debian 12 boot image, one auto-delete 10 GB `pd-standard` boot disk and a one-hour absolute UTC provider deletion deadline. Google includes one aggregated month of eligible `e2-micro` use in selected US regions, 30 GB-months of standard persistent disk and a limited egress allowance. Any eligible excess would consume trial credit. [Free Tier limits](https://docs.cloud.google.com/free/docs/free-cloud-features)
- **Access.** The VM gets an internal IPv4 only, with no attached service account or OAuth scopes. The probe needs no SSH key, public address, Cloud NAT, Docker, DNS update, apt install or source-code credential. It listens temporarily on guest loopback. The operator needs the IAM permissions to view the project, billing link and services, inspect regional resources, create this VM and read serial output. No new firewall, IAP or ingress rule is created. This pilot cannot answer a public HTTP request.
- **Deletion.** The same create request sets `--termination-time`, `--instance-termination-action=DELETE` and `--boot-disk-auto-delete`. Scheduling and cleanup are independent of your Cloud Shell session. The provider can take additional time to begin and complete deletion. [Termination scheduling](https://docs.cloud.google.com/compute/docs/instances/limit-vm-runtime) · [Create flags](https://docs.cloud.google.com/sdk/gcloud/reference/compute/instances/create)

At Iowa on-demand list prices checked November 4, 2026, a full hour would be about **$0.00892 before Free Tier or trial credit**: $0.008376428 for compute plus approximately $0.000548 for 10 GiB-hours of standard disk. The pilot requests no external IPv4, NAT gateway, paid image or snapshot. Your confirmed unupgraded trial account is the $0 cash boundary. [Iowa compute pricing](https://cloud.google.com/products/compute/pricing/general-purpose) · [Disk pricing](https://cloud.google.com/compute/disks-image-pricing)

## Start from Cloud Shell

Use the operator's existing authorized checkout of this repository in Cloud Shell, or upload the reviewed script using Cloud Shell's file-upload control. A local Linux or macOS terminal with Python 3 and a signed-in Google Cloud CLI also works. Keep the same user's persistent home for receipt-based recovery. Set `PILOT_PROJECT` to the exact dedicated project ID.

```sh
PILOT_PROJECT='your-dedicated-project-id'
bash deploy/gcp-pilot.sh plan --project "$PILOT_PROJECT"
bash deploy/gcp-pilot.sh check --project "$PILOT_PROJECT"
```

**Plan** works offline without gcloud. **Check** uses read-only provider commands to verify the project, linked billing, enabled Compute API, machine type, subnet, regional CPU and disk quotas. The printed inventory must show zero existing instances and zero disks. The CLI cannot reserve zonal capacity or prove the remaining promotional credit. [Read project billing information](https://docs.cloud.google.com/sdk/gcloud/reference/billing/projects/describe)

After confirming the trial and approving the single VM, use this command exactly once. A retry with the same receipt can adopt an interrupted create. It never starts a second VM or extends the deadline.

```sh
bash deploy/gcp-pilot.sh apply --project "$PILOT_PROJECT" --confirmed-unupgraded-free-trial
bash deploy/gcp-pilot.sh status --project "$PILOT_PROJECT"
```

**Successful boot** prints the specific project, numeric instance ID and verified provider DELETE deadline. **Successful health verification** requires the expected per-run marker in serial output from that exact owned VM. A missing marker means boot or the probe has not been confirmed. Wait a minute and rerun `status`. If IAM prevents serial reads, retain that limitation in the result. [Read-only serial output](https://docs.cloud.google.com/sdk/gcloud/reference/compute/instances/get-serial-port-output)

## Verify cleanup

After the printed deadline, query the same project and zone.

```sh
bash deploy/gcp-pilot.sh cleanup --project "$PILOT_PROJECT"
```

The command succeeds only after the named VM **and** its boot disk are absent. While the VM is present, it validates the original project number, zone, name, instance ID, owner label, network, disk attachment and provider deadline. An ownership mismatch or a lingering disk is reported for operator review. The provider performs deletion. The CLI's manual delete targets a name and offers no instance-ID precondition, so this verifier never deletes a VM that may have reused the name. [Compute Engine deletion semantics](https://docs.cloud.google.com/compute/docs/instances/deleting-instance)

The receipt stays in `$XDG_STATE_HOME/daedro-gcp-pilot/PROJECT_ID/`, defaulting to `~/.local/state/daedro-gcp-pilot/PROJECT_ID/`. Keep it outside Git. If the machine or receipt is lost, the original provider deadline still applies. Inspect the project inventory through the console after expiry. Count the site as confirmed only after the HTTP marker, and as cleaned only after both resources disappear. [Regional network plan](network-topology.md)
