Prerequisites
Before starting, ensure you have:- Installed the tensor9 CLI
- Set your API key:
export T9_API_KEY=<your-key> - Configured AWS credentials for your Tensor9 AWS account
Initial setup workflow
Set up Tensor9 in your AWS account for the first time.Set up your control plane
Verify setup
Create your first app
Publish and bind your origin stack
Publish an origin stack and bind it to your app.For Terraform stacks
Publish your Terraform stack
Bind the stack to your app
For Docker container stacks
Push your container image to ECR
Bind the container to your app
For Docker Compose stacks
Publish your Docker Compose file
Bind the stack to your app
For CloudFormation stacks
Deploy your CloudFormation stack
Get the stack ARN
Bind the CloudFormation stack
Create a test appliance
Create a test appliance for testing your releases before deploying to customers.Create a test appliance
Monitor appliance creation
Deploy to a test appliance
Deploy your stack to a test appliance to verify it works before releasing to customers.Create a release
my-test-appliance, alongside a companion my-test-appliance.audit directory containing the audit stack for pre-deployment review.Review the audit stack (optional)
apply it. Only the deployment stack (in my-test-appliance) provisions a working install.Deploy the release
Verify the deployment
Create a customer appliance
Enable your customer to create an appliance for your app in their environment.Generate signup link
Customer creates appliance
- Sign up and create their organization (if they haven’t already)
- Select their cloud provider and region
- Complete the setup to create their appliance
Monitor appliance creation
Create a release for the customer
Deploy to the customer's appliance
Release to a customer appliance
Release infrastructure or code changes to your customer appliances.Update your origin stack
Republish the stack
Test in test appliance
Deploy and verify
Release to customers
Manage multiple form factors
Deploy your app to different cloud providers or connectivity modes.Create form factors
Test each form factor
Release to each test appliance
Onboard your vendor controller to Tailscale
By default, the listeners your CLI and Terraform use to reach the vendor controller are exposed on a public network load balancer with mTLS protection. If you operate a Tailscale tailnet for your engineering team, you can have the vendor controller join that tailnet and (optionally) remove the public path entirely. See Connectivity for the broader picture. This workflow rolls out in two phases: first attach the controller to your tailnet and verify operator access, then optionally enforce tunnel-only by removing the public listeners.Phase 1: attach the vendor controller to your tailnet
Ensure your tailnet ACL has the required tags and rules
tag:tensor9-vctrl (vendor controller) and tag:tensor9-customer-ctrl (appliance controller) tags, the group:tensor9-operators group, and the rules that allow operators and customer appliances to reach the vendor controller. Existing ACL entries are preserved.y at the confirmation prompt to have the CLI POST the change for you (a local backup is written under ~/.tensor9/tailscale-acl-backups/).See tensor9 tailscale acl setup for full options.Generate a pre-auth key for the vendor controller
tskey-auth-... value; you will pass it to the next command. See tensor9 tailscale key generate for full options.Add operators to the group:operators group in the Tailscale dashboard so they can reach the controller’s listeners over the tailnet.Attach the vendor controller to the tailnet
tensor9 vendor tailscale onboard for full options.Verify operator access over the tailnet
group:operators and connected to the tailnet, run a read-only command:plan and apply operations is defined in the tensor9 provider block of the compiled deployment stack. Compilation emits the publicly available listener to this block when it is available, even if you have a tunnel configured, to be compatible with CI deployments. For testing, you can manually modify the compiled stack to change the endpoint address to be the vendor controller’s address on the tailnet and try a plan. Follow phase 2, below, to remove the TF endpoint from the public load balancer and re-compile your deployment stacks to enforce using the Tailscale for communication between your local Terraform/OpenTofu CLI and the vendor controller.Phase 2: remove the public listeners
Once you are satisfied that operators and Terraform-driven deploys work over the tailnet, you can enforce tunnel-only and tear the public listeners down. Roll this out per listener group rather than all at once so you can pause if something is missed.Mark the operator listeners as tunnel-only
tunnel enforce command mutates the controller’s configuration; the listener teardown happens on the next infrastructure upgrade.tensor9 vendor tunnel enforce for full options. If you also want to remove the appliance-facing public listener, the command checks first that no customer appliance still depends on it; see the pre-flight notes in the reference.Apply the change
tensor9 vendor tunnel enforce -remove CLI,Terraform followed by tensor9 vendor upgrade -kind Infrastructure. The public listeners are recreated.
Use stack tuning documents
Customize resource allocations per customer or environment.Create a tuning document
enterprise-tuning.json.Release with tuning document
Monitor appliances
Check the status of your apps, appliances, and releases.View comprehensive report
- All your apps and their stacks
- All test appliances and their status
- All customer appliances and their status
- Active releases
View detailed report
List all appliances
Use the web portal
Start a local web interface:Retire a test appliance
Remove a test appliance when no longer needed.Manage your vendor team
Tensor9 distinguishes two kinds of vendor accounts:- The root account is created automatically when you run
vendor setup. It is the singleton account for your vendor and the only one that can invite, list, or revoke other accounts. If you lose your root cert, you can re-issue it from your control plane’s seed bundle in your AWS account (iam account recover). - Operator accounts are everyone else: teammates the root account invites by email. They get a long-lived mTLS cert pinned by your control plane after redeeming a one-time enrollment bundle. They can run ordinary vendor commands but cannot manage other accounts. If an operator loses their cert, the root account re-invites them.
Invite a teammate
Mint an enrollment bundle
./[email protected]. The bundle is valid for 48 hours by default. Use -ttl PT24H (or any ISO-8601 duration) to set a different window.Send the bundle out-of-band
Have your teammate redeem it
tensor9 commands authenticate automatically.List your team
Enrolled, Invited, or Revoked).
Revoke access
To remove an operator’s access, find their account ID and revoke:tensor9 iam account recover to rotate the root cert.Recover the root account
If you lose your laptop or wipe~/.tensor9/, recover by re-issuing the root cert from your control plane’s seed bundle:
iam user invite. Operator tokens are single-use, so there’s no equivalent self-service recovery path on the operator side.
Troubleshoot common issues
Release deployment fails
Release deployment fails
tofu apply fails when deploying a release.Solution:- Check the Terraform error messages
- Verify your origin stack is valid:
tofu validatein your workspace - Check appliance status:
tensor9 report - Review deployment stack variables and configuration
- Check AWS credentials and permissions
Test appliance stuck in Creating status
Test appliance stuck in Creating status
- Wait 15-20 minutes (appliance creation can take time)
- Check
tensor9 report -detailedfor error messages - Verify AWS quotas are sufficient for EKS, VPCs, etc.
- Check CloudFormation console in AWS for stack creation issues
- Contact support if stuck for more than 30 minutes
Stack publish fails
Stack publish fails
tensor9 stack publish fails with upload errors.Solution:- Verify AWS credentials:
aws sts get-caller-identity --profile <profile> - Check that no .terraform directories are in your workspace
- Ensure you have write permissions to the control plane S3 bucket
- For large stacks, check your network connection
Customer can't access their appliance
Customer can't access their appliance
- Verify deployment completed: Check with customer that
tofu applysucceeded - Check load balancer:
kubectl get serviceshows external IP/hostname - Verify DNS configuration if using custom domains
- Check security groups/firewall rules in customer’s cloud
- Review application logs:
kubectl logs <pod-name>
Release not downloading
Release not downloading
- Wait a few minutes (compilation takes time)
- Check release status:
tensor9 report - Verify appliance is in “Live” status
- Check for stack validation errors in the report
- Review control plane CloudWatch logs for compilation errors
Best practices
Version your releases semantically
Version your releases semantically
1.0.0- Initial release1.0.1- Patch (bug fixes)1.1.0- Minor (new features, backward compatible)2.0.0- Major (breaking changes)
Test every release
Test every release
- Create release to test appliance
- Deploy and verify functionality
- Test upgrade path from previous version
- Only then release to customers
Use descriptive release notes
Use descriptive release notes
Organize your origin stacks
Organize your origin stacks
- Use Git to track changes to origin stacks
- Tag releases in Git:
git tag v1.0.0 - Use the same version in Git and Tensor9 releases
- Document infrastructure changes in commit messages
Monitor appliance health
Monitor appliance health
Next steps
- CLI Reference: Complete command reference
- Quick Start Guides: Step-by-step tutorials
- Deployments: Learn more about the deployment process
- Testing: Best practices for testing releases