frostmoln_webserver_deployment (Resource)
Deploys static/PHP site content to a managed Apache or Nginx webserver instance. The provider runs the full deploy flow: it requests a presigned upload from the platform, uploads the local archive, starts the deploy with the archive checksum, and waits for the in-guest agent to verify, extract, and publish the release. A changed archive (detected via source_hash) triggers a new deploy. Destroying the resource only drops it from Terraform state — content already published on the instance is left in place (there is no "undeploy" API; destroy the instance to remove it).
Authoritative scope — who owns what on this resource, declared in internal/scopedecl and machine-checked against the schema.
Enacted and reconciled — every configurable attribute not listed below: the platform applies it, and a refresh reads the truth back.
Create-immutable — instance_id: the deployment belongs to its instance.
Observed, not enacted — deploy_id: platform-issued for each deploy the pipeline runs. status: the platform's deploy pipeline moves it. tags_all: keys set outside Terraform — in the portal, by the fm CLI, or stamped by the platform — appear only here and are kept on every apply, never removed.
Example Usage
# Deploy site content to a managed webserver instance.
#
# source_archive is a LOCAL filesystem path, read at plan time by the machine
# running Terraform at plan and apply time — it is not a bucket key or a URL.
# Terraform tracks the
# archive's content hash, so rebuilding site.tar.gz makes the next apply push a
# new deployment automatically.
#
# Destroying this resource only drops it from Terraform state; content already
# published on the instance stays live (there is no "undeploy" API — destroy the
# instance to remove it).
resource "frostmoln_webserver_deployment" "site" {
instance_id = frostmoln_nginx_instance.site.id
source_archive = "${path.module}/site.tar.gz"
# Resource tags: your own metadata for search and filtering. Merged with
# the provider's default_tags; changing them updates in place.
tags = {
env = "prod"
}
}Schema
Required
instance_id(String) The ID of the Apache or Nginx webserver instance to deploy content to.source_archive(String) Local filesystem path to the .tar.gz archive to deploy (the archive's top level becomes the site document root). The provider reads this file at plan and apply time; it is never uploaded to or returned by the API as-is — only its SHA-256 (source_hash) is tracked in state. Changing the file's contents changes source_hash and triggers a new deploy.
Optional
tags(Map of String) Resource tags on the deploy record this resource tracks (deploy_id): your own key/value metadata for search and filtering, stored by the platform only and never applied to the content or the instance. A new deploy (a changed archive) is created with them; changing only the tags updates the tracked deploy in place and deploys nothing. At most 32 keys including the tenant's default tags, which the platform merges in at create; a key is 1-64 bytes matching^[a-zA-Z0-9]([a-zA-Z0-9._:/-]*[a-zA-Z0-9])?$, a value at most 256 bytes; keys beginningfrostmoln_orfrostmoln-(any case) are reserved. Merged with the provider'sdefault_tagson every write (a key set here wins). Holds only the keys this configuration sets; the full set is intags_all.timeouts(Block, Optional) (see below for nested schema)
Read-Only
deploy_id(String) The ID of the most recent content deploy for this instance.id(String) Synthetic resource identifier (equal to instance_id — one deployment per instance).source_hash(String) SHA-256 hex digest of source_archive, computed by the provider at plan time. It is the change driver: when the archive's bytes change, this hash changes and a new deploy runs. It is also sent to the deploy's start call so the in-guest agent can verify the upload.status(String) Terminal status of the most recent deploy (succeeded once applied).tags_all(Map of String) Every tag the platform holds on this resource: the provider'sdefault_tags, this resource's owntags(which win on a shared key), and any key set outside Terraform — in the portal, by the fm CLI, or stamped by the platform. Keys set outside Terraform appear only here and are kept on every apply, never removed.
Nested Schema for timeouts
Optional:
create(String) How long the provider waits for the create operation to converge before giving up (e.g. "45m", "2h").delete(String) How long the provider waits for the delete to complete before giving up (e.g. "30m").update(String) How long the provider waits for an update (resize, in-place change) to converge before giving up (e.g. "30m").