Nectere suiteTerraform deployment managerv20261021-085048

Nectere Anvil

Runs Terraform from the browser. Packages of .tf files, variable values and cloud credentials are stored once and combined into deployments, which are planned, reviewed, applied, drift-checked and destroyed from the same UI. Every run is logged. For anything the UI doesn't cover there's a shell in the deployment's working directory.

Plan before you apply Drift checks on a schedule Azure · AWS · Google Cloud · Kubernetes Full log of every run
Get itNectere Array › Menu › Deploy › Nectere Anvil

01The app

Every panel hangs off the left sidebar. The mock is clickable and each panel has its own section below.

Signed in as
Not securehttps://array.corp.lab/i/3f9a1c07/Dashboard

Sidebar items follow permissions. Command Station needs apply and destroy; Users and Backup need manage_users. Array sign-on also hides Users and Sign Out.

02Concepts

Each part is set up once and reused across deployments.

PackageTerraform code for one kind of thing, such as an AKS cluster or a storage account. Uploaded as a zip, written in the browser or built in the Builder.
Tfvar tableValues for one package's variables. A package can have any number of them: prod-eastus, lab, test.
CredentialLogin for Azure, AWS, Google Cloud or Kubernetes. Secrets are encrypted on save and never shown again.
Env tableExtra environment variables for the run, like a proxy or log level.
DeploymentA package, tfvar table and credential applied together. Has its own status, outputs, history and drift checks.
RunOne plan, apply, destroy, drift check or console session. The full log is kept.

The usual order

  1. Packages: upload or build the Terraform code.
  2. Credentials: add a cloud login and press Test.
  3. Tfvar Tables: pick the package, fill in values.
  4. Deploy: choose all three, name the deployment, press Run Plan. If the plan looks right, Approve & Apply.
  5. Deployments: drift checks, re-applies, outputs and destroy.

03Getting Anvil

Deployed from Nectere Array with Menu › Deploy › Nectere Anvil. Name the tile (say Anvil Prod), pick a sign-in mode and press Deploy. When it shows Running, press Open. Updates, restarts and logs are on the back of the tile.

Array sign-on (recommended)No separate login. Array admins get every permission; other Array users on the tile get view only.
Application sign-inAnvil keeps its own users. Whoever opens the tile first creates the admin account, and everyone else is managed from the Users panel.

Settings

Edited with the tile's .env button in Array. Saving restarts Anvil for a few seconds without losing anything.

SettingDefaultWhat it does
ANVIL_MAX_CONCURRENT_RUNS6Runs allowed at once, open consoles included. Not in the file by default; add the line to change it.
ANVIL_CREDENTIAL_KEYset by ArrayDon't touch it. A new key makes every saved credential unreadable.

04Sign-in and setup

Array sign-on needs no setup. With Application sign-in, the first visit to a new tile opens the setup screen, which creates the first account with all eight permissions. After that everyone uses Sign In.

Screen
Not securehttps://array.corp.lab/i/3f9a1c07/setupSign-in
RuleValue
Sign-in lasts8 hours
Lockout5 wrong passwords for one username within 15 minutes locks it for 5 minutes
Minimum password8 characters

Array sign-on

Opening the tile from Array signs you in. An expired Array session lands on "Sign in through Nectere Array" (the Array mode screen above), and reopening the tile from Array fixes it.

Sidebar
ItemNeeds
Dashboard, Packages, Builder, Tfvar Tables, Env Tables, Credentials, Providers, Deploy, DeploymentsAlways shown. Buttons inside still check permissions.
Command Stationapply + destroy
Usersmanage_users, hidden with Array sign-on
Backupmanage_users

Footer

Notifications stack above Sign Out (green success, rose error, blue info) and fade after a few seconds. Under them are the server clock, which drift schedules use, and the Anvil version.

06Dashboard

https://array.corp.lab/i/3f9a1c07/Dashboard
  1. 1Active Runs. The orange count pulses while anything runs. Click a line for its log. Empty: No runs in progress.
  2. 2Deployments. Totals by status. Unapplied plans don't count.
  3. 3Count tiles. Click one to open that panel.
  4. 4Recent Runs. The 8 newest runs across all deployments. VIEW ALL → opens Deployments.
Run statusBadge
runningrunning
succeededsucceeded
failedfailed
cancelled, timed-outcancelled timed-out

Refreshes every 20 seconds while open.

07Packages

Terraform code for one kind of thing. Leave *.tfvars files out: values come from tfvar tables at run time, which is how one package serves many environments.

https://array.corp.lab/i/3f9a1c07/Packages
ButtonNeedsDoes
+ New Packageupload_packageEmpty package, filled in from the browser
+ Upload Packageupload_packagePackage from a zip of .tf files
InspectviewProviders, variables, outputs and files, with an editor per file
DownloadviewZip of the package
Open in Builderupload_packageLoads it into the Builder (see the Builder guide)
Deleteupload_packageBlocked while a deployment uses the package. Otherwise also removes its tfvar tables and abandoned plan records.
BuilderBuilds a package through forms. Work in progress, with its own guide.

Upload and New

Upload Package
New Package
Add .tf File

Inspect

Lists what Terraform will need. Provider sources link to registry docs. Variables show type, default and a sensitive badge where it applies. Each file has Edit, which opens a full-width Ace editor, and × to delete it.

Package detail

Editing a file

Edit File

Build Outputs

Writes outputs.tf from resource attributes you pick, replacing any existing one on save. For resources using count or for_each, tick [*] to output every instance.

Build Outputs
MessageWhen
Cannot delete - 2 deployment(s) still use this package: aks-csi-test (applied), aks-dev (skewed). Remove them from the Deployments panel first.Deleting a package still in use
Package deleted - 2 tfvar table(s) removed: AKS Cluster - CSI, AKS Cluster dev; 1 abandoned plan record(s) clearedDelete succeeded
No .tf files yet. Add one to get started.Inspecting an empty package
Add at least one output.Saving Build Outputs with no rows

08Tfvar Tables

One set of values for one package. Pick the package first; the list filters to its tables. Runs get the table as terraform.tfvars.json.

https://array.corp.lab/i/3f9a1c07/Tfvar Tables

Deploy opens the Deploy panel with package and table preselected. Download saves <name>.tfvars.json. Copy asks for a name and suggests <name>-copy. Edit, Copy and Delete need manage_varsets; Deploy needs plan.

The form

One row per variable block. An orange ⚠ marks variables with no default. A validation { contains(…) } rule becomes a dropdown, bools are checkboxes, and lists and objects get nested editors. Dropping in an existing .tfvars file fills the form; the file isn't kept. Blank rows are left out on save so Terraform uses the default.

View
Edit Tfvar Table

09Env Tables

Environment variables set before Terraform runs: proxy settings, tokens for providers that read the environment, TF_LOG. A deployment can attach any number. Credential variables go on last and win a name clash.

Env Tables
Edit Env Table
-var tablesOne env table per deployment can be its Terraform -var table. Its entries are then passed as -var="key=value" on plan, apply and destroy instead of exported. Env tables are stored in plain text, so real secrets belong in credentials.

10Credentials

Terraform logs in with the credential picked at deploy time, so packages carry no secrets. Fields named secret, password, key or token are encrypted on save and never shown again. Leave one blank when editing to keep its value.

https://array.corp.lab/i/3f9a1c07/Credentials

Per-provider fields

Provider
Edit Credential
ProviderFields
Azure (azurerm)Subscription ID, Tenant ID, Client ID, Client Secret
AWS (aws)Access Key ID, Secret Access Key, Region, Session Token (only for temporary keys)
Google Cloud (google)Project ID, Region, service account JSON key
Kubernetes (kubernetes)Host URL, Bearer Token, CA Cert
CustomAny JSON object. Each key becomes a Terraform variable of the same name.

Help next to Provider opens a short guide to creating that type of credential. Custom has none.

Help

Test

Test makes a real login call and reports in a sidebar notification. A pass means the secret works and the cloud is reachable.

Access report

Access (Azure, AWS, Google) reports what the identity can actually do. It runs read checks from the tenant or organization down to the subscription, account or project, then billing. Denied or partial results with a known fix get an i button that shows the granting command. A check takes 10 to 40 seconds. The last result stays, marked cached, until Refresh.

Access Report
CloudLevelsChecks
AzureTenant, Subscription, BillingSubscription and management group visibility, Graph directory read, role assignments and effective permissions, deploy and Owner-level grant, resource groups, billing, Cost Management, usage
AWSOrganization, Account, BillingAssume role, organization and member accounts, IAM policies and simulated permissions, S3 and EC2 reads, Cost Explorer, Budgets, CUR, contact info
GoogleOrganization, Project, BillingOrganization and project visibility, role bindings, permission check, Compute and Storage list, billing

11Private providers

For providers not on the public registry. Upload the binary and terraform init will find it. Only linux_amd64 builds work.

Private Providers

Private Providers

Upload provider binaries for non-public providers. Stored in Terraform local-mirror layout for use during plan/apply.

acme/objstore 1.4.2 linux_amd64
terraform-provider-objstore_v1.4.2 · uploaded 2d ago
acme/blockstore 0.9.0 linux_amd64
terraform-provider-blockstore_v0.9.0 · uploaded 3w ago
Upload Provider

Packages reference it like any other provider: source = "acme/objstore", version = "1.4.2".

12Deploy

New deployments start here. Nothing changes in the cloud until Approve & Apply.

https://array.corp.lab/i/3f9a1c07/Deploy
FieldNotes
PackageRequired. Enables Run Plan.
Tfvar TableFiltered to the chosen package
Credential (optional)-- None (set in provider block) -- when the provider block authenticates itself
Env Tables (optional)Pick one, press +. × on a chip removes it.
Deployment NameRequired
Advanced › Parallelism1 to 30; blank means Terraform's default of 10. Lower it if a provider rate-limits you. Saved with the deployment for every later run.
Advanced › Terraform -var tableAn env table passed as -var flags instead of exported
  1. Run Plan. The Output badge goes running and the log streams in.
  2. When it finishes the console switches to Tree, the deployment is planned, and Approve & Apply and Topology are enabled.
  3. Approve & Apply applies the saved tfplan. On success the deployment is applied, its outputs and a state snapshot are captured, and it moves to Deployments.

Unapplied plans don't appear in Deployments or on the dashboard. Ones older than 24 hours are deleted the next time a deployment is created or Anvil restarts.

13Reading a plan

View raw is the full log, Anvil's own lines included. Tree shows one collapsible node per resource with an action pill, errors and warnings first, summary pinned on top.

Run
Run console
PillMeaning
+ createNew resource
~ updateChanged in place
-/+ replaceDestroyed and recreated because a field forces replacement
- destroyRemoved
<= readData source read during apply
~ changeChanged outside Terraform, found as drift on refresh

When a run errors, the summary turns grey and gets (not applied - see errors above). Its counts only show how far Terraform got before stopping. A log with no plan in it shows No structured plan detected — use View raw.

14Deployments

Every deployment applied at least once. Rows show status, parallelism if set, package id and last run. The remaining actions are under More ▾.

https://array.corp.lab/i/3f9a1c07/Deployments
StatusBadgeMeans
appliedappliedLast apply or drift check matched the configuration
skewedskewedA drift check found live infrastructure differs from the configuration
failedfailedLast apply or destroy failed
destroyeddestroyedResources torn down. Record and history stay until Remove.
new, plannedplannedNot applied, so not listed
ActionNeedsDoes
More › LogviewRun modal on the latest run, with past runs in a dropdown
More › OutputsviewValues captured after the last apply
More › TopologyviewDependency graph from the last plan
More › Edit Planupload_packageEdit this deployment's copy of the .tf files
More › Edit Tfvarsmanage_varsetsEdit the linked tfvar table
More › Env / VarsplanChoose which env tables and -var table load
More › DownloadviewDeployment folder as a zip
DriftplanSchedule drift checks
StatusviewDrift check, refresh-only, state list, what drifted, accept drift, and Destroy
Re-applyapply + planPlans, then applies on Confirm & Apply
RemovedestroyDeletes the record, state and history. Cloud resources keep running.
Clear Running JobsplanCancels every run stuck in running

The run modal

Log, Re-apply, Status and Destroy share one modal: run history dropdown on top, console in the middle, hint line and confirm button at the bottom. A run in progress also gets Cancel run.

Re-apply
Hint lineWhen
Planning… review the changes before applying.Re-apply plan still running
Review the plan above, then confirm to apply these changes.Plan done, Confirm & Apply enabled
Plan failed — nothing was changed.Plan errored
Applying… / Apply complete. / Apply failed.After Confirm & Apply
Running status check… / Status check complete. / Status check failed.Any Status action
Destroying… / Destroy complete. / Destroy failed.After Destroy

Status, drift and destroy

Status opens with read-only checks. Destroy is enabled only after one of them finishes.

Status picker
Drift Check schedule
Status actionRunsEnds at
Drift checkterraform plan -detailed-exitcodeExit 0 → applied, exit 2 → skewed
Refresh-onlyterraform plan -refresh-onlyStatus unchanged
List resourcesterraform state listStatus unchanged
What drifted?Reads the last captured plan JSONOpens the drift detail
Accept drift into stateterraform apply -refresh-only, then a drift checkapplied or skewed
Destroyterraform destroy -auto-approvedestroyed; outputs and state snapshot cleared

Schedules are checked every minute. Hourly fires 60 minutes after the last check; daily fires in the chosen hour if 2 hours have passed. Destroyed deployments are skipped. Drift and status runs time out at 5 minutes, plan, apply and destroy never do. Each deployment keeps its 10 newest drift-check runs.

What drifted?

Before and live values for each drifted resource, plus the live value as HCL. Accepting drift only updates state. Paste the HCL into the package too or the next plan reverts it.

Drift detail

Outputs, env tables and remove

Outputs
Env Tables for a deployment
Remove

15Topology

Left-to-right dependency graph from the last captured plan. Outline colour is the planned action; dashed boxes are data sources. Clicking a node traces it: what it needs turns purple, what depends on it teal, and the rest fades.

Topology
plan run 20261026094112c41e · terraform 1.9.8 · 8 resources · 5 changing · 1 drifted · 1 untouched hidden · planned values · names from state
find text…
location = "eastus"
values: planned
Click a node to trace what it needs and what depends on it.
createupdatereplacedestroydata / existingno change data lookupvia module output needsdepends on itdrifted
  • Search glows orange on nodes whose name, type or values match.
  • Variable highlights resources using the chosen tfvar value.
  • Values switches between config, planned and applied (state) values. State is disabled until there is some.
  • Only changes + neighbours hides untouched resources unless they border a changing one. On by default when only part of the deployment changes.
  • Hovering a node shows its reconstructed resource "type" "name" { … } block; 📌 keeps it open for copying. References are tinted, drifted values get # live · state was …, unknowns read (known after apply).
  • The side panel lists live names, instance values and both directions of dependency. Drag its left edge to resize, double-click to reset.

16Command Station

A bash shell in the deployment's working directory with its credential and env tables loaded, for jobs like terraform import, state mv or a targeted apply. The session is recorded in run history as a console run.

https://array.corp.lab/i/3f9a1c07/Command Station
  • An open console blocks plan and apply on that deployment and counts toward the run limit.
  • Only users with access to the tile can reach the terminal, shared link or not.
  • A -var table applies to plan, destroy, import and refresh in the console, but not apply.
  • Closing the tab ends the session, as does Close Session after a confirm. The transcript is saved either way.
After a console applyConsole applies and destroys don't update the deployment's outputs, state snapshot or status. Run Status › Drift check afterwards.

17Users and permissions

No roles, just eight permissions ticked per user. The first account has all of them; new users start with view.

Users

Users

Manage user accounts and the permissions each one has.

admin
view, upload_package, manage_varsets, manage_credentials, plan, apply, destroy, manage_users · created 5mo ago
mreyes
view, manage_varsets, plan, apply · created 3w ago
auditor
view · created 2d ago
Edit User
PermissionLets you
viewLists, Inspect, logs, outputs, topology, downloads
upload_packagePackages, Builder, Edit Plan, private providers
manage_varsetsTfvar tables, env tables, Edit Tfvars
manage_credentialsCredentials, including Test and Access
planRun Plan, Deploy from a tfvar table, drift schedules, Env / Vars, Clear Running Jobs
applyApprove & Apply, accept drift. Re-apply with plan.
destroyDestroy and Remove. Command Station with apply.
manage_usersUsers and Backup panels

Under Array sign-on the panel shows User accounts are managed in Nectere Array.

18Backup and restore

Backup & Restore

Backup & Restore

Export or import all configuration and state.

Export downloads everything under /conf and /meta (settings plus deployments/state) as one .zip. Import overwrites all current configuration with an uploaded backup (no merge). Secrets stay encrypted with this deployment's ANVIL_CREDENTIAL_KEY. To restore on a different deployment, set that same key there first or the credentials won't decrypt. After importing, restart the app container to apply.

  • Exports are named nectereanvil-meta-YYYYMMDD-HHmmss.zip and hold everything Anvil knows about what it built. Store them carefully.
  • Import asks This OVERWRITES all current configuration with the uploaded backup. Continue?, then needs a restart: State › Restart on the tile in Array.

19Deployment lifecycle

new planned applied skewed failed destroyed planapply drift (exit 2)accept / drift (0) apply failsdestroydestroy re-apply ok
Run statusMeans
runningIn progress. One per deployment at a time.
succeeded / failedFinished
cancelledStopped by Cancel run or Clear Running Jobs
timed-outDrift or status run passed 5 minutes

Run dropdown labels: plan, apply, destroy, drift-check, accept-drift, console, or one of the three status checks.

Limits

LimitMessage
One run per deploymentA run is already in progress for this deployment (run 20261026094112c41e, plan, started 09:41:12). Cancel it or restart the container to clear an orphan.
Run limitRun limit reached: 6 of 6 runs in progress. Wait for one to finish, or raise ANVIL_MAX_CONCURRENT_RUNS in .env.
Apply without a saved planNo saved plan for this deployment. Run Plan and review it before applying.

20Activity log

Sign-ins, plans, applies, drift checks and console sessions are logged. Read it from the tile's Logs button in Array.

[2026-05-24T22:13:30.1773433+00:00] [INFO] [AUTH] Admin user 'admin' created via setup with full permissions
[2026-05-28T17:19:13.3113728+00:00] [INFO] [AUTH] Login: admin
[2026-05-28T17:20:02.4410215+00:00] [WARN] [AUTH] Failed login for 'mreyes'
[2026-07-27T14:55:44.5596122+00:00] [INFO] [BUILDER] Provider load requested: hashicorp/azurerm 4.81.0 (docs)
[2026-07-27T14:57:53.0138285+00:00] [INFO] [BUILDER] Package 'builder-smoke-test' saved from the builder (61add7492904)
[2026-07-27T17:02:44.8181906+00:00] [INFO] [BUILDER] Package 94e69f3a1fe1 copied into builder workspace 946cd9d7d6fb
[2026-10-26T03:00:04.1027731+00:00] [INFO] [DRIFT] Scheduled drift check started for 'aks-csi-test' (94c0e1b27d3a)
[2026-10-26T09:41:12.9041127+00:00] [INFO] [DEPLOY] Plan started for deployment 5d21c8e0a4f7
[2026-10-26T09:47:55.0019843+00:00] [WARN] [RUN] Run 20261026094250e1d7 (drift-check) on deployment 7a1f03c9b2e4 exceeded 5 minutes - timed out
[2026-10-26T10:05:31.7752040+00:00] [INFO] [CONSOLE] Console 20261026100531f00a opened on 94c0e1b27d3a by admin

Categories: AUTH, PACKAGE, BUILDER, DEPLOY, RUN, DRIFT, CONSOLE, Access, Backup.

21Things to know

  • Apply uses the reviewed plan. If anything changed since, it fails and asks for a new plan.
  • Deployments keep their own copy of the code. Package edits reach them only on re-apply. Edit Plan changes one deployment.
  • Deployments lists package ids. The Packages panel maps them to names.
  • Remove is not destroy. Anvil forgets the deployment and its resources keep running. Destroy first.
  • Schedules use server time. That's the sidebar clock, usually UTC.
  • Credentials in a backup are encrypted with the tile's ANVIL_CREDENTIAL_KEY. The zip holds no readable secrets. Restore onto a tile with the same key value in its .env, or the credentials won't open.
  • Saving a tfvar table says "Varset". Old name, same thing.

22Troubleshooting

You seeDo this
Run Plan stays greyed outPick a package. A credential isn't required.
Approve & Apply stays greyed outThe plan failed or is still running. Fix the errors at the top of Tree and plan again.
A run is already in progress…Wait, cancel it from the Run dropdown, or press Clear Running Jobs on Deployments.
Run limit reachedClose idle consoles or wait. To raise the cap, set ANVIL_MAX_CONCURRENT_RUNS in the tile's .env in Array.
Credential Test failsExpired secret or wrong tenant. Fix it, then run Access to see what it can do.
Plan can't find a private providerRe-upload with the exact name and version the package asks for. Linux build only.
Destroy fails on something already deletedStatus › Accept drift into state, then Destroy again.
Topology says No plan data captured yetRun a Drift check to give it a plan.
Credentials won't open after restoring a backupThe tile's ANVIL_CREDENTIAL_KEY differs from the one that made the backup. Copy the original value into this tile's .env and restart it.
Signed out of Anvil when opening another Anvil tileSwitch both tiles to Array sign-on.