Prerequisites
Before starting, ensure you have:- Installed the tensor9 CLI
- Downloaded your Tensor9 API key
- Configured AWS credentials for your Tensor9 BYOC AWS account
Initial setup workflow
Set up Tensor9 BYOC 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 and bind your Terraform stack
my-app-stack. It needs no AWS credentials. To upload to S3 with your own AWS credentials and bind separately instead, see stack publish.For Docker container stacks
Push your container image to ECR
Bind the container to your app
For Docker Compose stacks
Publish and bind your Docker Compose file
my-app-compose.For CloudFormation stacks
Deploy your CloudFormation stack
Get the stack ARN
Bind the CloudFormation stack
Prepare a test appliance
Use an existing, ready test appliance for your app. Test-appliance creation is not available through the public CLI; contact Tensor9 if you need one. To test a release yourself without a test appliance, onboard a second AWS account of your own as a customer withtensor9 app setup and release to it with -customerName, as the Terraform quick start shows.
Use tensor9 report to check its status before creating a release.
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
tofu init and tofu apply:T9_API_KEY environment variable. In the workspace directory, enter the key at a hidden prompt, apply the stack, then unset the variable:- Bash
- Zsh
T9_API_KEY as soon as the apply finishes: while it is set, tensor9 CLI commands use the key instead of your controller profile. Do not put the key in a command, a shell profile or a source file.Your application is now deployed in the test appliance.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
tofu init and tofu apply with your API key in T9_API_KEY for this step only, as in Deploy the release:Release to a customer appliance
Release infrastructure or code changes to your customer appliances.Update your origin stack
Republish the stack
-stackName as the first publish. You don’t need to re-bind the stack. Tensor9 BYOC will use the updated version for new releases.Test in test appliance
Deploy and verify
my-test-appliance and run tofu apply, with your API key in T9_API_KEY for this step only, as in Deploy the release.Verify the changes work as expected.Release to customers
Manage multiple form factors
Deploy your app to different cloud providers or connectivity modes.Create form factors
Test each form factor
my-aws-test and my-gcp-test; replace them with your appliance names.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
Test-appliance retirement is not available through the public CLI. Contact Tensor9 to arrange retirement, including data retention and ongoing infrastructure costs.Manage your vendor team
Tensor9 BYOC 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 BYOC 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