# Update regarding CVE-2026-65400 Source: https://docs.macstadium.com/CVE-2026-65400 ## What you need to know On August 6, Apple released emergency security updates for a critical vulnerability in macOS Screen Sharing, tracked as CVE-2026-65400. The flaw allows an attacker with network access to a Mac with Screen Sharing enabled to gain access without valid credentials. Apple’s advisory is available here: **[https://support.apple.com/en-us/148170](https://support.apple.com/en-us/148170).** Because Screen Sharing is a standard access method for MacStadium-hosted Macs, we have taken a protective step on behalf of all customers: **inbound traffic to TCP port 5900 (the default Screen Sharing port) is now blocked at the MacStadium network edge.** This immediately removes the attack surface for every hosted Mac, patched or not. **If your Mac was running an affected version and Screen Sharing was reachable from an untrusted network before the port was blocked, we recommend rebuilding the Mac from a known-good state rather than assuming it was not compromised.** If Screen Sharing was never enabled, was only accessible through a private network or VPN, or your Mac was already patched, your exposure is substantially different. In those cases, patching macOS is the primary remediation. > **Do not expose Screen Sharing directly to the Internet on an alternate port as a workaround.** If you need Screen Sharing access from an untrusted network, use an SSH tunnel or VPN/private network instead. ## What MacStadium has done MacStadium has blocked inbound **TCP port 5900** at the network edge for hosted Macs. This provides an additional layer of protection while customers patch or rebuild their systems. SSH remains available and is unaffected by this vulnerability and the port block. ## Do I need to rebuild my Mac? Use the following guidance: | Scenario | Recommended action | | :-------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------ | | Screen Sharing was never enabled | Patch macOS | | Screen Sharing was only accessible through a private network or VPN | Patch macOS; rebuilding is generally unnecessary | | Screen Sharing was reachable from the public Internet while the Mac was running an affected version | **Contact support and rebuild** | | You are unsure whether Screen Sharing was publicly reachable | **Treat the Mac as potentially exposed and contact MacStadium Support for a rebuild** | | You have evidence of unauthorized access | **Rotate credentials/secrets, contact support, and rebuild.** | The network block prevents further access through TCP 5900, but **it does not establish whether a Mac was accessed before the block was implemented.** ## Recommended remediation: Wipe and rebuild the Mac If your Mac was potentially exposed while running an affected version, the safest approach is to rebuild it from a known-good state. #### Step 1. Back up required data: Back up the files you need to retain before requesting the rebuild. For example: ```text theme={null} scp username@remote_host:/path/to/remote/file.txt /path/to/local/destination/ ``` *Do not restore the entire system from a potentially compromised Mac.* Avoid restoring system files, applications, launch agents, scripts, or other executable/configuration content unless you have verified it is trusted. #### Step 2. Open a MacStadium Support ticket Ask MacStadium Support to wipe and reinstall the machine. Support can help with the rebuild and getting the Mac back into service. ## Alternative: Self-service patching If you have high confidence that your Mac was **not exposed or accessed before the network block**, you can patch the Mac yourself. This option is appropriate, for example, if: * Screen Sharing was never publicly reachable; * the Mac was protected by a firewall or VPN; * the Mac was already patched; or * you have another reliable reason to establish that the vulnerable service was not exposed. If you are uncertain, we recommend rebuilding instead. #### Before you start You will need: * Your Mac's IP address or hostname * Your administrator username and password * An SSH client #### Step 1: Connect over SSH From a terminal on your local machine: ```text theme={null} ssh youradminuser@your.server.ip.address ``` #### Step 2: Update macOS First, check your current version: ```text theme={null} sw_vers ``` Apple has released fixes for the following versions: * **macOS Tahoe 26.6.1** * **macOS Sequoia 15.7.9** * **macOS Sonoma 14.8.9** If you are already running one of these versions, no OS update is required. List available updates: ```text theme={null} softwareupdate --list ``` Find the appropriate update in the output and install it. For example: ```text theme={null} sudo softwareupdate --install "macOS Tahoe 26.6.1-25G76" --restart --agree-to-license --user youradminuser --stdinpass ``` Enter your password when prompted. The Mac will download and install the update and then reboot. Your SSH session will disconnect when the reboot begins. Once the machine is back up, reconnect over SSH and confirm the version: ```text theme={null} sw_vers ``` You should see a patched version such as 26.6.1, 15.7.9, or 14.8.9. ### Running macOS Ventura or older? Apple has not released a patch for those versions. Open a MacStadium Support ticket for assistance upgrading to a supported macOS version. ## Restoring Screen Sharing access After patching, **we recommend keeping Screen Sharing inaccessible from the public Internet.** There are two preferred approaches. #### Option 1: Use an SSH tunnel SSH tunneling allows you to use Screen Sharing without exposing the Screen Sharing service to the Internet. First, make sure Screen Sharing is enabled on the Mac. Then, from your local computer, create an SSH tunnel: ```text theme={null} ssh -L 45900:127.0.0.1:5900 youradminuser@your.server.ip.address ``` Leave this SSH session open. Then connect your VNC client to: ```text theme={null} vnc://localhost:45900 ``` The Screen Sharing traffic is carried through the encrypted SSH connection, while port 5900 remains inaccessible from the Internet. #### Option 2: Use a private network or VPN Customers using a MacStadium firewall, VPN, or other private connectivity can continue to use Screen Sharing over that private connection. This is the preferred approach for customers who need persistent remote Screen Sharing access. Restrict Screen Sharing so that it is accessible only from trusted networks whenever possible. ## What we do not recommend **Do not expose Screen Sharing directly to the Internet simply by moving it to another port.** Changing TCP 5900 to another port can reduce exposure to unsophisticated scanners, but it is not a meaningful security control. An attacker can discover services running on non-standard ports. For this reason, MacStadium does **not** recommend configuring Screen Sharing to listen on an alternate publicly accessible port as a remediation for CVE-2026-65400. Use an SSH tunnel, VPN, firewall, or other private-network control instead. ## Frequently asked questions #### Does blocking port 5900 fix the vulnerability? Blocking TCP 5900 prevents the known network attack path through the default Screen Sharing port. However, it does not patch macOS and does not determine whether a Mac was accessed before the block. You should still install Apple's security update. #### Do I need to rebuild every Mac? No. Rebuilding is primarily recommended for Macs that may have been exposed to an untrusted network while running an affected version. If Screen Sharing was never enabled, was protected by a private network or VPN, or the Mac was already patched, patching macOS is generally the appropriate remediation. #### Can I continue using SSH? Yes. SSH is unaffected by CVE-2026-65400 and remains available. #### Can I use Screen Sharing after patching? Yes. We recommend accessing it through a private network, VPN, or SSH tunnel rather than exposing Screen Sharing directly to the Internet. #### What if I am running macOS Ventura or older? Apple has not released a fix for those versions. Contact MacStadium Support for assistance upgrading to a supported macOS version. # AWS-to-MacStadium VPN networking setup Source: https://docs.macstadium.com/iaas/aws/aws-networking-setup Configure an IPsec site-to-site VPN between Amazon VPC and MacStadium. Covers customer gateway, virtual private gateway, VPN connection, and traffic rules. To establish a stable, persistent connection between Amazon Virtual Private Cloud (Amazon VPC) and your MacStadium private cloud, you need to configure an IPsec site-to-site VPN between the two clouds. Currently, Amazon lets you create a site-to-site VPN where at all times one tunnel is active (up) and one is passive (down). A monitoring service checks frequently if the active tunnel is up and, if not, brings the passive tunnel up instead. This ensures minimal downtime. Routing from Amazon to MacStadium is static. To create a site-to-site VPN from your Amazon VPC to your MacStadium private cloud, you need to go through the following high-level steps: 1. Log in to your VPC service 2. Create a customer gateway 3. Set up a virtual private gateway 4. Create the site-to-site VPN connection 5. Ensure that AWS allows inbound traffic ## Log in to your VPC service 1. Log in to your AWS Management Console and access your VPC service. 2. In the top right corner of the screen, make sure that you're working in the correct region. ## Create a customer gateway In Amazon, the customer gateway represents the MacStadium endpoint of the site-to-site VPN connection. When you configure the customer gateway, you need to use the networking information for your public network. By default, this is the FW1-Outside network. You can find the networking information for this network in Appendix B of your [IP Plan](/macstadium/macstadium-overview/ip-plan). For more information about the customer gateway, see [Amazon VPC Documentation: Components of Your Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html#VPN). 1. In the VPC service sidebar, locate the Virtual Private Network menu and select Customer Gateways.\\ AWS VPC sidebar with Customer Gateways option highlighted 2. Click Create Customer Gateway.\\ AWS Create Customer Gateway form with routing and IP address fields 3. Provide a Name. * Set a name that helps you identify the gateway easily. 4. Select Static routing. 5. In the IP Address text box, provide the IP address of the public network listed in Appendix B of the IP Plan. * By default, this is the FW1-Outside network. 6. Click Create Customer Gateway. ## Set up a virtual private gateway In Amazon, the virtual private gateway represents the Amazon endpoint of the site-to-site VPN connection. AWS Virtual Private Gateways dashboard with gateway listed For more information about the virtual private gateway, see [Amazon VPC Documentation: Components of Your Site-to-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html#VPN). 1. In the VPC service sidebar, locate the Virtual Private Network menu and select Virtual Private Gateways. 2. Click Create Virtual Private Gateway.\\ AWS Create Virtual Private Gateway form with name and ASN fields 3. Provide a Name tag. * Set a name that helps you identify the gateway easily. 4. Select Amazon default ASN and click Create Virtual Private Gateway. 5. On the Virtual Private Gateways dashboard, right-click the newly created virtual private gateway and select Attach to VPC.\\ AWS Virtual Private Gateways dashboard with Attach to VPC right-click option Next, you need to manually enable route propagation for the virtual private gateway. For more information about VPN routing, see [Amazon VPC Documentation: Site-to-Site VPN Routing Options](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPNRoutingTypes.html). 1. In the VPC service sidebar, locate the Virtual Private Cloud menu and select Route Tables.\\ AWS VPC sidebar with Route Tables option highlighted 2. In the list of routing tables, select the main route table for your VPC. 3. At the bottom of the screen, select Route Propagation. * If your virtual private gateway is not listed, make sure that it's attached to the VPC. 4. Click Edit route propagation.\\ AWS Route Table Route Propagation tab with Propagate checkbox and Edit button 5. Select the Propagate checkbox and click Save. ## Create the site-to-site VPN connection After you have a customer gateway and a virtual private gateway in place, you can configure the site-to-site VPN connection. During setup, you need to select the customer gateway and the virtual private gateway that you want to use and configure routing. You need to route traffic to your internal, private network. By default, this is the Private-1 network. You can find the networking information for this network in **Appendix B** of your IP Plan. 1. In the VPC service sidebar, locate the Virtual Private Network menu and select Site-to-Site VPN Connections.\\ AWS VPC sidebar with Site-to-Site VPN Connections option highlighted 2. Click Create VPN Connection.\\ AWS Create VPN Connection form with gateway type, routing, and static IP fields 3. Provide Name tag. 4. For Target Gateway Type, select Virtual Private Gateway, and from the Virtual Private Gateway drop-down menu, select the virtual private gateway you created earlier. 5. Select that you want to use an Existing customer gateway, and from the Customer Gateway ID drop-down menu, select the customer gateway that you created earlier. 6. For Routing Options, select Static. 7. In Static IP Prefixes, provide the CIDR notation for the private network listed in Appendix A of the IP Plan (by default, the Private-1 network). * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 8. Do not edit the Tunnel Options section. 9. Click Create VPN Connection. ## Ensure that AWS allows inbound traffic Based on your requirements and current setup, you might need to enable inbound traffic from MacStadium to AWS. For more information, see [Amazon VPC Documentation: Security Groups for Your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) and [Amazon VPC Documentation: Network ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html). ## Next steps If you are ready to proceed, see [AWS VPN Config for Cisco ASA/ASAv](/iaas/aws/aws-vpn-config-for-cisco-asaasav). # AWS-to-MacStadium VPN troubleshooting Source: https://docs.macstadium.com/iaas/aws/aws-troubleshooting If you encounter any issues during or after the configuration of your site-to-site VPN connection between AWS and MacStadium, check this list of common. If you encounter any issues during or after the configuration of your site-to-site VPN connection between AWS and MacStadium, check this list of common issues and troubleshooting instructions. ## Errors During the Cisco ASA/ASAv Configuration Sometimes, the command line interface might return errors about the crypto isakmp policy block of commands. * **Workaround**: Ignore the errors. They do not affect the configuration. The command-line interface returns `ERROR: unable to find interface "outside"`. * **Workaround**: Sometimes, the command line interface is case-sensitive and you need to preserve the capitalization of the MacStadium network configuration as provided in the [IP Plan](/macstadium/macstadium-overview/ip-plan). 1. Clean up the ASA configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Rename outside in your configuration file to the precise name of the outside interface of your Cisco ASA/ASAv device. By default, this is the Outside network. * For more information, see [AWS VPN Config for Cisco ASA/ASAv](/iaas/aws/aws-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## The Tunnel is UP but There's No Traffic Between AWS and MacStadium If Amazon shows that one tunnel is UP but there's no traffic between AWS and your MacStadium private cloud, it might be because of some common mistakes when preparing the configuration file. Check for the following: ### AWS Checks All checks in this section are performed in the AWS Management Console. ### Verify that your virtual private gateway is attached to the VPC. 1. Log in to your AWS Management Console and access your VPC service. 2. In the top right corner of the screen, make sure that you're working in the correct region. 3. In the VPC service sidebar, locate the Virtual Private Network menu and select Virtual Private Gateways.\\ AWS VPC sidebar with Virtual Private Gateways option highlighted 4. On the Virtual Private Gateways dashboard, check the status of the virtual private gateway used in your site-to-site VPN. 5. If the virtual private gateway is detached, right-click it and select Attach to VPC.\\ AWS Virtual Private Gateways dashboard with Attach to VPC right-click option **Verify that the route tables for the Amazon Virtual Private Cloud (Amazon VPC) propagate traffic for the virtual private gateway you're using.** For more information about route tables in Amazon, see [Amazon VPC Documentation: Route Tables](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html). 1. Log in to your AWS Management Console and access your VPC service. 2. In the top right corner of the screen, make sure that you're working in the correct region. 3. In the VPC service sidebar, locate the Virtual Private Cloud menu and select Route Tables.\\ AWS VPC sidebar with Route Tables option highlighted 4. In the list of routing tables, select the main table. * At the bottom of the screen, select **Route Propagation** and make sure that the propagation is enabled. If your virtual private gateway is not listed, make sure that it's attached to the VPC. * If propagation is disabled, click **Edit route propagation**. * Select the **Propagate** checkbox and click **Save**. AWS Route Table Route Propagation tab with Propagate checkbox enabled ### Cisco ASA/ASAv Checks All checks in this section are performed against the site-to-site VPN configuration file downloaded from Amazon. For more information, see [AWS VPN Config for Cisco ASA/ASAv.](/iaas/aws/aws-vpn-config-for-cisco-asaasav) **Verify that you've replaced `` and `` with the correct values for the internal, private network of your MacStadium private cloud.** By default, this is the Private-1 network. You can find the networking information for this network in Appendix A of your [IP Plan](/macstadium/macstadium-overview/ip-plan). **Verify that you've configured the NAT exemption rule properly.** * The host and subnet mask required for obj-SrcNet are the host and mask for the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. You can find the networking information for this network in Appendix A of your IP Plan. * The host and subnet mask required for obj-amzn are the host and mask for your Amazon VPC. You can find this information by logging into your AWS Management Console, navigating to your VPC dashboard, selecting your VPC, and checking the Description at the bottom of the screen. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the /16 notation converts to a 255.255.0.0 subnet mask). * The values in the brackets after nat must be the name of the internal, private network of your MacStadium private cloud, followed by the name of the outside interface of your Cisco ASA/ASAv device. By default, these are Private-1 and Outside, respectively. You can find the names of these networks in Appendix A of your IP Plan. **To resolve any of the listed common problems with the Cisco ASA/ASAv configuration, complete the following steps:** 1. Clean up the firewall configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Make the necessary changes to the configuration file. * For more information, see [AWS VPN Config for Cisco ASA/ASAv](/iaas/aws/aws-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## There's Traffic from AWS to MacStadium but You Cannot Access AWS from MacStadium Sometimes, you might be able to establish an SSH connection from AWS to MacStadium but you might not be able to see or access AWS from MacStadium. This might be due to AWS being configured to stop inbound traffic. For information about how to enable inbound traffic, see [Amazon VPC Documentation: Security Groups for Your VPC ](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)and [Amazon VPC Documentation: Network ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html). ## Troubleshooting ### Cleaning Up the ASA/ASAv Configuration Sometimes, you might need to clean up the Cisco ASA/ASAv configuration and start over. 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud (via VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging in to Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**.\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line. 5. Run the following commands one by one, clicking Send in between. Replace the placeholders with their respective values. Use **Table 1: Placeholders** for reference. ``` clear configure tunnel-group clear configure tunnel-group clear configure group-policy clear configure crypto map clear configure access-list clear configure access-list amzn-filter clear configure access-list acl-amzn (likely: acl-amzn) clear configure crypto ipsec transform-set transform-amzn clear configure sla monitor 1 no nat (,) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn no object network obj-SrcNet no object network obj-amzn ``` ### Table 1: Placeholders | Placeholder | Description | Example | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | `` | The IP of the tunnel, configured with the first set of tunnel-group commands in the Amazon configuration file. | `192.168.0.0` | | `` | The IP of the tunnel, configured with the second set of tunnel-group commands in the Amazon configuration file. | `192.168.0.0` | | `` | The name of the policy configured with the group-policy commands in the Amazon configuration file. By default: filter. | `filter` | | `` | The name of the crypto map configured with the crypto map commands in the Amazon configuration file. | `amzn_vpn_map` | | `` | The unique name of the access control list created with the configuration file in the Amazon configuration file. | `outside_access_in` | | `` | The name of the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. You can find the networking information for this network in Appendix A of your IP Plan. | `Private-1` | | `` | The name of the outside interface of your Cisco ASA/ASAv device. By default, this is the Outside network. You can find the networking information for this network in Appendix A of your IP Plan. | `Outside` | ## More Troubleshooting by Amazon For more detailed troubleshooting instructions, [see Amazon VPC Documentation: Troubleshooting Cisco ASA Customer Gateway Connectivity](https://docs.aws.amazon.com/vpc/latest/adminguide/Cisco_ASA_Troubleshooting.html). ## More Troubleshooting by Cisco For more detailed troubleshooting instructions, see [Cisco Documentation: IPsec Troubleshooting](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html). # AWS VPN Config for Cisco ASA/ASAv Source: https://docs.macstadium.com/iaas/aws/aws-vpn-config-for-cisco-asaasav Complete an AWS-MacStadium site-to-site VPN by configuring your Cisco ASA/ASAv. Download and fill in the Amazon-generated config file, then apply it. ## About After creating a [site-to-site VPN connection in Amazon](/iaas/aws/site-to-site-vpn-configuration-with-aws), customers must configure the Cisco firewall to recognize the connection and let traffic into MacStadium Private Cloud. ## Overview Amazon provides a semi-prefilled configuration file with very detailed instructions. The configuration file must be downloaded and provide any missing information (indicated by placeholders). Afterwards, the configuration can be applied to the Cisco ASA/ASAv to complete the Site-to-Site VPN setup. ## Getting Started **Amazon Configuration Download** Amazon lets you download pre-filled configurations for a variety of vendors. The default firewall vendor for MacStadium private clouds is Cisco Systems, Inc. 1. Verify that you have created a site-to-site VPN connection in Amazon. * For more information about how to set up your VPN, see [Setting Up the AWS Side of the Site-to-Site VPN](/iaas/aws/site-to-site-vpn-configuration-with-aws). 2. Log in to your AWS Management Console and access your VPC service. 3. In the top right corner of the screen, make sure that you're working in the correct region. 4. In the VPC service sidebar, locate the Virtual Private Network menu and select Site-to-Site VPN Connections.\\ AWS VPC sidebar with Site-to-Site VPN Connections option highlighted 5. In the list, select your newly created VPN connection and click Download Configuration.\\ AWS Site-to-Site VPN Connections list with Download Configuration button highlighted 6. For Vendor, select Cisco Systems, Inc. 7. For Platform, select ASA 5500 Series. 8. For Software, select ASA 9.x for a policy-based VPN OR ASA 9.7 + VTI for a route-based VPN.\\ AWS Download Configuration dialog with Cisco Systems vendor and ASA platform selected ## Fill in the configuration blanks Unless you have extensive experience with AWS and ASA/ASAv configurations, follow the instructions in the configuration file to the letter. Otherwise, your site-to-site VPN might not work as expected. You need to manually replace the placeholders in the configuration file you downloaded from Amazon with the values for your MacStadium configuration. **Table 1: Configuration parameters** | Placeholder | Description | More information | Example | | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | `` | The name of the outside interface of your Cisco ASA/ASAv device as provided in **Appendix A** of your IP Plan. By default, the value is `Outside`. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | `Outside` | | `` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | [Cisco Documentation: Cisco Access Control Lists](https://www.cisco.com/c/en/us/support/docs/security/ios-firewall/23602-confaccesslists.html) | `outside_access_in` | | `` | The IPv4 address of your Amazon VPC (without the subnet mask bit notation). | You can get this value by logging in to your AWS Management Console, navigating to your VPC dashboard, selecting your VPC, and checking the **Description** at the bottom of the screen. | `192.168.0.0` | | `` | The subnet mask for your Amazon VPC. | You can get this value by logging in to your AWS Management Console, navigating to your VPC dashboard, selecting your VPC, and checking the **Details** at the bottom of the screen. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the `/16` notation converts to a `255.255.0.0` subnet mask). | `255.255.0.0` | | `` | A unique name for the crypto map. If you already have other crypto maps configured, you need to change the mapping number. | [Cisco Documentation: Configuring Crypto Maps](https://www.cisco.com/c/en/us/td/docs/security/vpn_modules/6342/vpn_cg/6342site3.html#wp1036915) | `amzn_vpn_map`. | | `` | An IP address in your Amazon VPC that can serve as an SLA monitor keeping the site-to-site tunnel alive. | You can set this to the `` address plus one. For example: if your `` is `192.168.0.0`, use `192.168.0.1` for your ``. | `192.168.0.1` | | `` | The IP address for the internal private network of your MacStadium cloud as provided in **Appendix A** of your IP Plan. By default, this is the `Private-1` network. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | `192.168.0.0` | | `` | The subnet mask for the internal private LAN of your MacStadium cloud as provided in **Appendix A** of the IP Plan. By default, this is the `Private-1` network. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | `255.255.0.0` | 1. Verify that you have downloaded the configuration file from your AWS Management Console. 2. Open the configuration file. 3. Replace all placeholders with their respective values. Use Table 1: Configuration parameters for reference. 4. Uncomment the line: access-list amzn-filter extended permit ip .... To uncomment, remove ! at the start of the line. 5. Uncomment the lines for object and nat configuration at the end of the config file. To uncomment, remove ! at the start of the line. 6. Keep the following line. This ensures the SLA monitor works as expected. ``` object network obj-SrcNet subnet 0.0.0.0 0.0.0.0 ``` * Note that based on your network configuration and requirements, you can modify this line to map to the subnet and the subnet mask for the Private-1 network from your IP Plan. If you choose to modify this line, do not configure the `` value. 7. On the following line, change 0.0.0.0 0.0.0.0 to a combination of the IP address and the subnet mask for your Amazon VPC. * You can get these values by logging in to your AWS Management Console, navigating to your VPC dashboard, selecting your VPC, and checking the Description at the bottom of the screen. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the /16 notation converts to a 255.255.0.0 subnet mask). * For example ``` object network obj-amzn subnet 0.0.0.0 0.0.0.0 TO object network obj-amzn subnet 192.168.0.0 255.255.0.0 ``` 8. On the following line, change inside and outside to the names of the internal private network and the outside interface of your MacStadium private cloud, respectively, as provided in Appendix A of your IP Plan. By default, these are Private-1 and Outside, respectively. ``` nat (inside,outside) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn TO nat (Private-1,Outside) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn ``` 9. (Optional) Delete the remaining commented lines to clean up the file. Commented lines are indicated by ! at the beginning of the line. 10. Save your changes. ### Configure TCP State Bypass (Route-based VPN only) If you selected **ASA 9.7 + VTI** (route-based VPN), you need to enable the TCP State Bypass feature. This allows outbound and inbound traffic to flow through separate VPN tunnels, which is required for HA VPN scenarios where both tunnels are active simultaneously. **Table 2: TCP State Bypass parameters** | Placeholder | Description | More information | Example | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ | | `` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | [Cisco Documentation: Access Control Lists](https://www.cisco.com/c/en/us/support/docs/security/ios-firewall/23602-confaccesslists.html) | `acl-state-bypass` | | `` | A unique name for the class map that identifies the traffic for which to disable stateful firewall inspection. | [Cisco Documentation: TCP State Bypass](https://www.cisco.com/c/en/us/td/docs/security/asa/asa-cli-reference/A-H/asa-command-ref-A-H.html) | `cm-state-bypass` | | `` | A unique name for the policy map that assigns actions to the specified class map traffic. | [Cisco Documentation: TCP State Bypass](https://www.cisco.com/c/en/us/td/docs/security/asa/asa-cli-reference/A-H/asa-command-ref-A-H.html) | `pm-state-bypass` | | `` | The name of the internal private interface of your Cisco ASA/ASAv device as provided in Appendix A of your IP Plan. By default, this is `Private-1`. | The IP Plan | `Private-1` | 1. Define an access list with the source and destination networks: ``` access-list extended permit ip ``` 2. Create a class map to identify the traffic for which you want to disable stateful firewall inspection: ``` class-map match access-list ``` 3. Create a policy map to assign the TCP State Bypass action to the class map: ``` policy-map class set connection advanced-options tcp-state-bypass ``` 4. Apply the policy map to your private interface: ``` service-policy interface ``` 5. Save your changes. ## Next steps If you are ready to feed the complete configuration into your Cisco ASA/ASAv, see [Setting Up the MacStadium Side of the Site-to-Site VPN](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). # Site-To-Site VPN Configuration with AWS Source: https://docs.macstadium.com/iaas/aws/site-to-site-vpn-configuration-with-aws Configure a site-to-site IPsec VPN between AWS and MacStadium with Cisco ASA TCP State Bypass for HA VPN and BGP routing scenarios. ## Overview The goal of this documentation is to update the Site-To-Site VPN configuration with AWS and add specific configuration details for the Cisco Adaptive Security Appliance (ASA) feature TCP State-bypass, which is required in HA VPN scenarios (HA-VPN is a regional per VPC VPN solution. HA-VPN gateways have two interfaces, each with their own public IP address). * A one-time or temporary access to the MacStadium cloud from a single virtual or physical machine is required. * Cisco AnyConnect VPN is recommended. * For more information, see [Connecting to Your Cloud (via VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn) ## Creating Stable IPSec Site-to-Site VPN 1. Check the software version and model of the Cisco ASA/ASAv device of the MacStadium cloud. 2. Configure the private cloud to connect to your MacStadium cloud. One or more of the following must be configured: * Provide the public endpoint of the MacStadium cloud. * This is the public network IP listed for the FW1-Outside network in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * Enable policy-based routing between the private cloud and the internal private network the MacStadium cloud (default the Private-1 network). * This is the private network host and range listed in Appendix A of the IP Plan. * Enable inbound traffic to the private cloud. 3. Set up the Cisco ASA/ASAv device of the MacStadium cloud. One or more of the following must be configured: * A nat exemption rule for traffic between the two clouds. * This allows traffic from the private cloud to the private network and the outside interface of the MacStadium cloud. By default, these are respectively the Private-1 and Outside networks listed in Appendix A of the IP Plan. * `access-list` rules permitting traffic from the private cloud to the public endpoint of the MacStadium cloud. * By default, this is the FW1-Outside network listed in Appendix B of the IP Plan. * A crypto map rule that maps traffic between the two clouds. * By default, this is the Outside network listed in Appendix A of the IP Plan. * IPSec and IKE policies. * `tunnel-group` rules that point to the private cloud that connect to the MacStadium cloud. 4. Prepare these settings based on the Cisco ASA/ASAv software and model For more information about how to configure each aspect of your Cisco firewall, see Cisco Documentation: [Configuration Guides](https://www.cisco.com/c/en/us/support/security/asa-5500-series-next-generation-firewalls/products-installation-and-configuration-guides-list.html). ### Helpful Links Cisco Documentation: [Navigating the Cisco ASA Series Documentation](https://www.cisco.com/c/en/us/td/docs/security/asa/roadmap/asaroadmap.html) Cisco Documentation: [Managing Site-to-Site VPNs: The Basics](https://www.cisco.com/c/en/us/obsolete/security/cisco-security-manager-4-1.html) Cisco Documentation: [Cisco ASA Series Syslog Messages](https://www.cisco.com/c/en/us/td/docs/security/asa/syslog/b_syslog.html) [Logging into Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall) ## Networking Setup for Private Cloud Because of the highly customizable nature of on-premises private clouds, this guide is not exact steps but rather general guidelines. A one-time or temporary access must be established from a single virtual or physical machine to the MacStadium cloud. It is recommended to use Cisco AnyConnect VPN. For more information, see [Connect to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). To establish a stable and persistent connection, between the entire private cloud to the MacStadium cloud, then establish an **IPsec Site-To-Site VPN** between the two clouds. ## Creating IPSec Site-To-Site VPN between Two Clouds 1. Check and document the software version and model of the Cisco ASA/ASAv device for the MacStadium cloud. 2. Configure the private cloud to connect to the MacStadium cloud. * One or more of the following might need to be configured. * Provide the public endpoint of the MacStadium cloud. * Usually, this is the public network IP listed for the FW1-Outside network in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * Enable routing between the private cloud and the internal private network of the MacStadium cloud (by default, the Private-1 network). * Usually, this is the private network host and range listed in Appendix A of the IP Plan. * Enable inbound traffic to the private cloud. 3. Set up the Cisco ASA/ASAv device of the MacStadium cloud. * You might need to configure one or more of the following rules: * A NAT exemption rule for traffic between the two clouds. It might need to allow traffic from the private cloud to the private network and the outside interface of the MacStadium cloud. By default, these are respectively the Private-1 and Outside networks listed in Appendix A of the IP Plan. * NAT exemption allows the ability to exclude traffic from being translated with NAT. One scenario where this is typically done is for a site-to-site VPN tunnel. * Access-list rules permitting traffic from the private cloud to the public endpoint of your MacStadium cloud. By default, this is the FW1-Outside network listed in Appendix B of the IP Plan. * A crypto map rule that maps traffic between the two clouds. Usually, this is mapped to the outside interface of the MacStadium cloud. By default, this is the Outside network listed in Appendix A of the IP Plan. * IPSec and IKE policies. * Tunnel-group rules that point to the private cloud to connect to the MacStadium cloud. * The TCP State Bypass feature, which requires an access-list, class-map, policy-map, and a service-policy. This is a requirement for Site-To-Site VPN with Virtual Tunnel Interfaces only and is configured to allow asynchronous routing between separate VPN tunnels. These settings must be based on the Cisco ASA/ASAv software and model. For more information about how to configure each aspect of your Cisco firewall, see [Cisco Documentation: Configuration Guides](https://www.cisco.com/c/en/us/support/security/asa-5500-series-next-generation-firewalls/products-installation-and-configuration-guides-list.html). ## Networking Setup AWS To establish a stable, persistent connection between Amazon Virtual Private Cloud (Amazon VPC) and the MacStadium private cloud, configure an IPsec Site-To-Site VPN between the two clouds. There are two VPN configuration options available, Policy-based and Route-based (VTI) VPN; * Policy-based VPN, there are two VPN tunnels where in AWS one tunnel is active (up), and one is passive (down). A monitoring service checks frequently if the active tunnel is up and, if not, brings the passive tunnel up, what ensures minimal downtime. * Route-based (VTI) VPN, both tunnels are active at the same time and can route traffic in and out simultaneously. Also, this allows routing between MacStadium and AWS to be configured statically or dynamically with BGP. Route-based VPN is the preferred option as it offers enhanced routing and monitoring control. ## Creating Site-To-Site VPN This is done from an Amazon VPC to the MacStadium private cloud. 1. Log into the VPC service. 2. Create a customer gateway. 3. Set up a virtual private gateway. 4. Create the Site-To-Site VPN connection. 5. Ensure that AWS allows inbound traffic. ## Creating Customer Gateway In AWS, the customer gateway represents the MacStadium endpoint of the Site-To-Site VPN connection. When you configure the customer gateway, use the networking information of the public network. By default, this is the FW1-Outside network. The networking information for this network in your [IP plan](/macstadium/macstadium-overview/ip-plan). For more information about the customer gateway, see Amazon VPC Documentation: Components of Your Site-To-Site VPN. 1. In the VPC service sidebar, locate the Virtual Private Network (VPN) menu and select Customer gateways.\\ AWS VPC sidebar with Customer gateways option highlighted 2. Click Create Customer Gateway. 3. Provide a Name. Set a name that is easy to remember. 4. In BGP ASN, use a private ASN in the range of 64,512–65,534. This is used later as the BGP process number in the MacStadium firewall. 5. In the IP Address text box, provide the IP address of the public network listed in Appendix B of the IP Plan. By default, this is the FW1-Outside network. 6. Keep the other options with the default values and click Create Customer Gateway. AWS Create Customer Gateway form with BGP ASN and IP address fields ## Setting Up Virtual Private Gateway In AWS, the virtual private gateway represents the Amazon endpoint of the Site-To-Site VPN connection. For more information about the virtual private gateway, see [Amazon VPC Documentation: Components of Your Site-To-Site VPN](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html#VPN). 1. In the VPC service sidebar, locate the Virtual Private Network (VPN) menu and select Virtual Private Gateways. 2. Click Create Virtual Private Gateway. 3. Provide a Name tag. Set a name that is easy to remember. 4. Select Amazon default ASN and click Create Virtual Private Gateway. 5. Connect to the VPN. * After signing up, the [IP Plan](/macstadium/macstadium-overview/ip-plan) is sent. Review that information to configure access to the cloud environment. The recommended method of gaining access is via a Virtual Private Network (VPN), which is both easy to implement and secure.\\ AWS VPC sidebar with Virtual Private Gateways option highlighted 6. On the Virtual Private Gateways dashboard, right-click the newly created virtual private gateway and select Attach to VPC.\\ AWS Virtual Private Gateways dashboard with Attach to VPC right-click option 7. Select the VPC to attach the Virtual Private Gateway to and click Attach to VPC.\\ AWS Attach to VPC dialog with VPC dropdown and Attach button 8. Select the Propagation Enable checkbox. 9. Click Save.\\ AWS Route Table Route Propagation tab with Propagate checkbox ## Creating Site-To-Site VPN Connection If the customer gateway and a virtual private gateway are in place, then configure the Site-To-Site VPN connection. During setup, select the customer gateway and the virtual private gateway to use, and configure that routing. Route traffic to the internal, private network. By default, this is the Private-1 network. The networking information for this network is in Appendix A of the IP Plan. 1. In the VPC service sidebar, locate the Virtual Private Network menu and select Site-To-Site VPN Connections. 2. Click Create VPN Connection. 3. Provide Name tag. 4. For Target Gateway Type, select Virtual Private Gateway. 5. For Virtual Private Gateway, select the virtual private gateway that was created earlier. 6. Select Existing customer gateway, and from the Customer Gateway ID dropdown menu, select the customer gateway that was created earlier. 7. Select the Routing Options: * Static manually specifies the destination subnets of the VPN. * Select static routing and provide in Static IP Prefixes the CIDR notation for the private network listed in Appendix A of the IP Plan (by default, the Private-1 network). To convert the subnet mask to a CIDR notation, use a CIDR calculator. Example: 10.221.254.0/24 * Dynamic (requires BGP) and dynamically exchanges routes between AWS and MacStadium environments. * Select dynamic routing to keep the default values and proceed to the next step. * For more information about AWS VPN tunnel options, see: [Amazon VPC Documentation](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPNTunnels.html). 8. Do not edit the Tunnel Options section. 9. Click Create VPN Connection.\\ AWS Create VPN Connection form with gateway type and routing settings ## Allowing AWS Inbound Traffic Based on the requirements and current setup, it might be necessary to enable inbound traffic from MacStadium to AWS. For more information, see Amazon VPC Documentation: Security Groups for Your VPC and [Amazon VPC Documentation: Network ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html). ## AWS VPN Configuration for Cisco ASA/ASAv Proceed with the [AWS VPN configuration for Cisco.](/iaas/aws/aws-vpn-config-for-cisco-asaasav) After creating the Site-To-Site VPN connection in Amazon, configure the Cisco firewall to recognize the connection and let traffic into the MacStadium private cloud. Amazon provides a prefilled configuration file with very detailed instructions. Download the configuration file and provide any missing information (indicated by placeholders). Then feed the configuration into the Cisco ASA/ASAv to complete the Site-To-Site VPN setup. 1. Download the configuration from Amazon 2. Fill in the configuration blank ## Downloading Amazon Configuration Amazon has prefilled configurations ready for download, from a variety of vendors. The default firewall vendor for MacStadium private clouds is Cisco Systems, Inc. 1. Verify there is a Site-To-Site VPN connection in Amazon. * For more information about how to set up your VPN, see [Setting Up the AWS Side of the Site-To-Site VPN](/iaas/aws/aws-networking-setup). 2. Log in to the AWS Management Console and access your VPC service, which is located in the top right corner of the screen. 3. In the VPC service sidebar, locate the Virtual Private Network menu and select Site-To-Site VPN Connections. 4. In the list, select the newly created VPN connection and click Download Configuration. 5. Vendor, select Cisco Systems, Inc. 6. Platform, select ASA 5500 Series. 7. Software: * For a policy-based VPN, select ASA 9.x * For a route-based VPN, select ASA 9.7 + VTI If ASA 9.7 + VTI was selected, choose ikev2 as the IKE version and click Download. AWS Download Configuration dialog with Cisco Systems vendor and ASA platform selected ## Configuration Blanks Do not attempt AWS and ASA/ASAv configuration without proper experience, or unexpected consequences may happen. Manually replace the placeholders in the configuration file that were downloaded from Amazon (with the values for the MacStadium configuration). Policy-based VPN - ASA 9.x Make sure that the name of all configuration elements in this script are unique, not currently in use in your environment. ## Configuration Parameters | Placeholder Example | Description | More Information | Example | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- | | `` | The IPv4 address of the Amazon VPC (without the subnet mask bit notation). | This value can be found by logging in to the AWS Management Console and navigating to the VPC dashboard. Select the VPC and checking the Description at the bottom of the screen. | 172.31.0.0 | | `` | The subnet mask for the Amazon VPC. | This value can be found by logging in to the AWS Management Console, and navigating to the VPC dashboard. Select the VPC, and check the Details at the bottom of the screen. Then convert the subnet mask bit notation to the correct subnet mask (for example, the /16 notation converts to a 255.255.0.0 subnet mask). | 255.255.0.0 | | `` | A unique name for the crypto map. If there is already a crypto maps configured, then change the mapping number. | [Cisco Documentation: Configuring Crypto Maps](https://www.cisco.com/c/en/us/td/docs/security/vpn_modules/6342/vpn_cg/6342site3.html#wp1036915) | amzn\_vpn\_map | | `` | An IP address in the Amazon VPC that can serve as an SLA monitor keeping the Site-To-Site tunnel alive. | Set this to an available host in the AWS VPC. The host must reply to ICMP echo requests. | 172.31.0.5 | | `` | The IP address for the internal private network of the MacStadium cloud as provided in Appendix A of your IP Plan. By default, this is the Private-1 network. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | 10.221.254.0 | 1. Verify the configuration file from the AWS Management Console. 2. Open the configuration file. 3. Replace all placeholders with their respective values. Use Configuration parameters for reference. 4. Uncomment the line: `access-list amzn-filter extended permit ip`. To uncomment, remove `!` at the start of the line. 5. Uncomment the lines for object and nat configuration at the end of the config file. * To uncomment, remove ! at the start of the line. * Keep the following line to ensure the SLA monitor works as expected. * `object network obj-SrcNet subnet 0.0.0.0 0.0.0.0` Based on the network configuration and requirements, the line can be modified to map to the subnet and the subnet mask for the Private-1 network from your IP Plan. If this line is modified, then do not configure the `` value. 6. On the following line, change 0.0.0.0 0.0.0.0 to a combination of the IP address and the subnet mask for your Amazon VPC. * These values are in the AWS Management Console. Navigate to the VPC dashboard and select the VPC, and check the Description at the bottom of the screen. * Convert the subnet mask bit notation to the correct subnet mask (for example, the /16 notation converts to a 255.255.0.0 subnet mask). * For example: * object network obj-amzn subnet 0.0.0.0 0.0.0.0 ``` * change to: * object network obj-amzn subnet 192.168.0.0 255.255.0.0 ``` 7. On the following line, change inside and outside to the names of the internal private network and the outside interface of the MacStadium private cloud, respectively, as provided in Appendix A of the IP Plan. By default, these are Private-1 and Outside, respectively. * nat (inside,outside) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn to * nat (Private-1,Outside) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn 8. (**Optional**) Delete the remaining commented lines to clean up the file. Commented lines are indicated by ! at the beginning of the line. 9. Save the changes. ## Configuration Parameters for Route-based VPN - ASA 9.7 + VTI | Placeholder Examples | Description | More Information | Example | | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | | `` | The name of the outside interface of the Cisco ASA/ASAv device as provided in Appendix A of your IP Plan. By default, the value is Outside. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | Outside | | `` | The IP address for the internal private network of your MacStadium cloud as provided in Appendix A of your IP Plan. By default, this is the Private-1 network. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | 10.221.254.0 | | `` | The subnet mask for the internal private LAN of the MacStadium cloud as provided in Appendix A of the IP Plan. By default, this is the Private-1 network. | [The IP Plan](/macstadium/macstadium-overview/ip-plan) | 255.255.255.0 | | `` | The IPv4 address of the Amazon VPC (without the subnet mask bit notation). | This value can be found by logging in to the AWS Management Console, and navigate to your VPC dashboard. Select the VPC and check the Description at the bottom of the screen. | 172.31.0.0 | 1. Verify the configuration file from the AWS Management Console. 2. Open the configuration file. 3. Replace the placeholders with their respective values. Currently, only the placeholder `` is available in the AWS script. Use Table 1: Configuration parameters for reference. 4. Change the name of the tunnel interfaces. Example: ``` * interface tunnel 100 nameif aws-vpn-1 interface tunnel 200 nameif aws-vpn-2 ``` 5. Replace the network address and mask on the BGP configuration. Example: router bgp 65513 address-family ipv4 unicast network `` mask `` 6. Replace the placeholders with their respective values. 7. For a route-based VPN, enable the TCP State Bypass feature to allow the outbound and inbound traffic to flow through separate VPN tunnels as follows: | Placeholder Example | Description | More Information | Example | | -------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------- | | `` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | Cisco Documentation: Access Control Lists | acl-state-bypass | | `` | A unique name for the Class-map. | Cisco Documentation: TCP State Bypass | cm-state-bypass | | `` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | Cisco Documentation: TCP State Bypass | pm-state-bypass | * Define the Access list with the source and destination networks: access-list `` extended permit ip * `` `` `` `` * Create the Class Map to identify the traffic for which you want to disable stateful Firewall inspection: * `class-map ` * Enter the match parameter command to specify the traffic of interest within the class map: * `match access-list ` * Enter the policy-map name command to assign the actions to be taken in regards to the specified class map traffic: * `policy-map class set connection advanced-options tcp-state-bypass` * Enter the service-policy command in global configuration mode to activate the policy map on the targeted interface: * `service-policy interface ` 8. Save changes ## Completing Cisco ASA/ASAv Configuration To complete configuration into the Cisco ASA/ASAv, see Setting Up the [MacStadium Side of the Site-To-Site VPN](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## Manually Enabling Route Propagation Manually enable route propagation for the virtual private gateway. For more information about VPN routing, see [Amazon VPC Documentation: Site-To-Site VPN Routing Options](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPNRoutingTypes.html). 1. In the VPC service sidebar, locate the Virtual Private Cloud menu and select Route Tables.\\ AWS VPC sidebar with Route Tables option highlighted 2. In the list of routing tables, select the main route table for your VPC. 3. Select Route Propagation. If the virtual private gateway is not listed, then make sure that it is attached to the VPC. 4. Click Edit route propagation.\\ AWS Route Table Route Propagation tab with Edit route propagation button ## (Open-Source Option) OpenConnect ### Why OpenConnect? For mostly CLI users, use [OpenConnect](https://www.infradead.org/openconnect/index.html) - an open-source VPN client available from the command line. ## Download and Install OpenConnect If Homebrew is enabled, then run `brew install openconnect` from the command line. For Windows users, download ([build](https://www.infradead.org/openconnect/download.html)) the [OpenConnect package or use Cisco AnyConnect](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). ### Cisco AnyConnect alternative Cisco firewalls are designed to work with the [Cisco AnyConnect Secure Mobility Client ](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/series.html)as a VPN client. Users who prefer a GUI VPN client or prefer running on Windows, use Cisco AnyConnect. * [Download and use Cisco AnyConnect](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn) ## Download AnyConnect 1. Download a VPN client. The recommend VPN client for MacStadium Private Clouds is Cisco AnyConnect. 2. Open MacStadium Portal > Account Menu > Files. 3. Open the file and locate the VPN Server section. 4. From the browser, visit `https://`. Firefox is required to get past the self-signed certificate blocker. 5. When prompted, provide the VPN credentials from the IP Plan. 6. After log in, download a licensed version of AnyConnect directly from the firewall. ## Setup Process 1. Log in using the username and password from the IP Plan. 2. Cisco AnyConnect SecureMobility checks to see if Java is installed. * If Java is installed, then Java is used. * If Java is not installed, then a link for download is provided. 3. Follow the installation prompts to complete the install. 4. Once installation has completed: * Select Settings * Uncheck “Block connections to untrusted servers,” as the Cisco ASA appliance by default will be using a self signed certificate. 5. From the main screen, enter the IP Address provided in the IP Plan. 6. Click connect. 7. Enter your username and password to confirm the connection. # Verify your AWS-to-MacStadium VPN connection Source: https://docs.macstadium.com/iaas/aws/verify-aws Verify your AWS-to-MacStadium site-to-site VPN is working by checking ISAKMP and IPsec security associations in Cisco ASDM-IDM using show crypto commands. Verify that there is an ISAKMP security association between the peers. 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**. Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click **Send**. ``` show crypto isakmp sa ``` If the site-to-site VPN connection is configured properly, you should see information about an active IKEv1. For more information about this verification command, see [Cisco Documentation: show crypto isakmp sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#isakmp_sa). ## Verify that there is an IPsec security association between peers 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select Tools > Command Line Interface\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click Send. ``` show crypto ipsec sa ``` If the site-to-site VPN connection is configured properly, you should see a detailed log. For more information about this verification command, see [Cisco Documentation: show crypto ipsec sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#ipsec_sa). ## Verify that one tunnel is up 1. Log in to your AWS Management Console and access your VPC service. 2. In the top right corner of the screen, make sure that you're working in the correct region. 3. In the sidebar, locate the Virtual Private Network menu and select Site-to-Site VPN Connections.\\ AWS VPC sidebar with Site-to-Site VPN Connections option highlighted 4. Select your VPN from the list and inspect the details at the bottom of the screen. 5. Click Tunnel Details and verify that one of the tunnels is up.\\ AWS VPN Tunnel Details tab showing one tunnel with status Up ## Test traffic and visibility through the tunnel Follow the instructions provided in [Amazon VPC Documentation: How to Test the Customer Gateway Configuration](https://docs.aws.amazon.com/vpc/latest/adminguide/Cisco_ASA.html#TestCustomerGateway_ASA). ## Troubleshooting See our [AWS Troubleshooting](/iaas/aws/aws-troubleshooting) doc for some common issues with AWS-MacStadium Site-to-Site VPN Connections. # Azure Networking Setup Source: https://docs.macstadium.com/iaas/azure/azure-networking-setup Set up a policy-based IPsec VPN between Azure and MacStadium. Covers virtual network gateway, local network gateway, and connection configuration. To establish a stable, persistent connection between a Microsoft Azure private cloud and your MacStadium private cloud, you need to configure a policy-based IPsec site-to-site VPN between the two clouds. Currently, Azure lets you create a site-to-site VPN with one tunnel. To ensure minimal downtime (up to a minute or minute and a half), the Azure VPN gateway consists of two instances in an active-standby configuration. The standby instance automatically takes over when an issue with the active instance occurs. For information about how to enable higher availability, see Azure Documentation: Highly Available Cross-Premises Connectivity. To create a site-to-site VPN from your Azure private cloud to your MacStadium private cloud, you need to go through the following high-level steps: ## Log into Azure 1. Log in to the Azure portal with your credentials. 2. In the top right corner of the screen, make sure that you're working in the correct account and organization. ## Create an Azure virtual network If you already have an Azure virtual network configured, you can skip this step. Azure virtual networks let you manage connectivity for your Azure cloud resources. Any Azure virtual machines that you want to connect to from MacStadium must be on the Azure virtual network that sits at the Azure end of your VPN connection. For more information about virtual networks, see [Azure Documentation: What is Azure Virtual Network?](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-networks-overview) 1. Verify that you have a resource group in Azure. 2. In the search box at the top of the screen, type Virtual networks and select the respective entry in the filtered search results. Azure filters results as you type.\\ Azure search results with Virtual networks entry highlighted 3. On the Virtual networks screen, click + Add. 4. Provide a Name. 5. For Address space, provide a range of IP addresses in the CIDR notation that can be used within the network. You must provide an IP range reserved for private use. For more information about the private IP range requirement, see [Azure Documentation: Designing networking for Microsoft Azure IaaS](https://docs.microsoft.com/en-us/office365/enterprise/designing-networking-for-microsoft-azure-iaas#step-4-determine-the-address-space-of-the-vnet). * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 6. Select Subscription, Resource group, and Location. 7. Provide a Subnet > Name or use the pre-filled default value. 8. For Subnet > Name, provide a subset of the Address space in CIDR notation. 9. (Optional) Modify the remaining pre-filled settings to match your requirements. 10. Click Create and wait for the deployment to complete. * This might take a while. When the deployment is complete, the virtual network becomes listed under All resources. ## Example: Create an Azure virtual network This image shows a sample Azure virtual network configuration. Sample Azure virtual network configuration form ## Create a gateway subnet If you already have a gateway subnet configured for your Azure virtual network, you can skip this step. After the deployment of your virtual network is complete, you need to create a gateway subnet. The gateway subnet consists of IPs that will be used by the gateway service. 1. On the Virtual Networks screen, select your virtual network, and click Subnets. 2. Click + Gateway subnet.\\ Azure Virtual Networks Subnets tab with Gateway subnet button 3. In the Address range text box, provide an IP range for the subnet in the CIDR notation. This IP range must be a subset of the IP range for the virtual network subnet you created earlier. * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a [CIDR calculator such as this CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 4. (Optional) Modify the remaining pre-filled settings to match your requirements. 5. Click OK and wait for the deployment to complete. * This might take a while. ### **Example: Create a gateway subnet** This image shows a sample configuration for the gateway subnet of an Azure virtual network. Sample gateway subnet configuration for an Azure virtual network ## Create a virtual network gateway In Azure, the virtual network gateway represents the Azure side of your site-to-site VPN tunnel. 1. In the search box at the top of the screen, type Virtual network gateways and select the respective entry in the filtered search results. * Azure filters results as you type.\\ Azure search results with Virtual network gateways entry highlighted 2. On the Virtual network gateways screen, click + Add. 3. Select Subscription. 4. Select Virtual network. * This action lets Azure pre-fill some of the remaining configuration. 5. Provide Name and select Region. 6. For Gateway type, select VPN. 7. For VPN type, select Policy-based. 8. Select your SKU. * For more information about the available SKUs, see [Azure Documentation: Gateway SKUs](https://docs.microsoft.com/en-gb/azure/vpn-gateway/vpn-gateway-about-vpngateways#gwsku). 9. For Public IP address, select an existing unused IP address or create a new one. 10. Click Review + create, review the configuration, and click Create. 11. Wait for the deployment to complete. * This might take a while. 12. Check if the virtual network gateway is deployed successfully. * On the Virtual network gateways screen, select the virtual network gateway and click Properties. * Verify that the Provisioning state is `Succeeded`.\\ Azure virtual network gateway Properties showing Provisioning state Succeeded ### Example: Create a virtual network gateway This image shows a sample configuration for a virtual network gateway. Sample Azure virtual network gateway configuration form ## Create a local network gateway In Azure, the local network gateway represents the MacStadium side of your site-to-site VPN tunnel. 1. In the search box at the top of the screen, type Local network gateways and select the respective entry in the filtered search results. * Azure filters results as you type.\\ Azure search results with Local network gateways entry highlighted 2. On the Local network gateways screen, click + Add. 3. Provide a Name. 4. For IP Address, provide the IP address of the public network listed in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * By default, this is the `FW1-Outside` network. 5. For Address space, provide the IP range in CIDR notation of the private network listed in Appendix A of the IP Plan. * By default, this is the `Private-1` network. * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 6. Leave Configure BGP settings deselected. 7. Select Subscription, Resource group, and Location. 8. Click Create. 9. Wait for the deployment to complete. * This might take a while. * When the deployment is complete, the local network gateway becomes listed under All resources. ## Create the VPN connection With a virtual network gateway and a local network gateway in place, you can create and configure the VPN connection between Azure and your MacStadium private cloud. 1. In the search box at the top of the screen, type Local network gateways and select the respective entry in the filtered search results. * Azure filters results as you type. Azure search results with Local network gateways entry highlighted 2\. On the Local network gateways screen, select the local network gateway you created earlier. 3\. From the sidebar menu, select Connections and click + Add.\\ Azure local network gateway Connections sidebar with Add button 4\. Provide Name. 5\. Select Virtual network gateway. 6\. For Shared key (PSK), provide an IPSec pre-shared key that will be used to encrypt your data over the site-to-site VPN. * You can use a generator tool such as the [IFM - IPSec Pre-shared Key (PSK) Generator](http://www.ifm.net.nz/cookbooks/IPSec-Pre-shared-Key-PSK-Generator.html). Keep a record of the pre-shared key. You will need it later. 7. Review the remaining pre-filled settings and click OK. 8. Wait for the operation to complete. * This might take a while. * When the deployment is complete, the connection becomes listed under All resources. At this point, the status of your newly created connection is Unknown. ### Example: Create the VPN connection This image shows a sample configuration for the VPN connection. Sample Azure VPN connection configuration form ## Ensure that Azure allows inbound traffic Based on your requirements and current setup, you might need to enable inbound traffic from MacStadium to Azure. For more information, see [Azure Documentation: Filter inbound traffic with Azure Firewall DNAT using the Azure portal](https://docs.microsoft.com/en-us/azure/firewall/tutorial-firewall-dnat) and [Azure Documentation: Security groups](https://docs.microsoft.com/en-us/azure/virtual-network/security-overview). ## Next steps If you are ready to proceed with the MacStadium side of the configuration, see [Preparing the VPN Configuration for Input into Cisco ASA/ASAv](/iaas/azure/azure-vpn-config-for-cisco-asaasav). # Azure Troubleshooting Source: https://docs.macstadium.com/iaas/azure/azure-troubleshooting If you encounter any issues during or after the configuration of your site-to-site VPN connection between Microsoft Azure and MacStadium, check this list. If you encounter any issues during or after the configuration of your site-to-site VPN connection between Microsoft Azure and MacStadium, check this list of common issues and troubleshooting instructions. * Unrecognized interface during the Cisco ASA/ASAv configuration * The tunnel is connected but there's no traffic between Azure and MacStadium * There's traffic from Azure to MacStadium but you cannot access Azure from MacStadium ## Unrecognized interface during the Cisco ASA/ASAv configuration Sometimes, the command line interface might return ERROR: unable to find interface "outside". The command-line interface might be case-sensitive and you might need to preserve the capitalization of the MacStadium network configuration as provided in the [IP Plan](/macstadium/macstadium-overview/ip-plan). 1. Clean up the ASA configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Rename outside in your configuration to the precise name of the outside interface of your Cisco ASA/ASAv device. By default, this is the Outside network. * For more information, see [Azure VPN Config for Cisco ASA/ASAv](/iaas/azure/azure-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## The tunnel is connected but there's no traffic between Azure and MacStadium If Azure shows that the tunnel is Connected but there is no visibility and connectivity between the two clouds, it might be because of some common mistakes when preparing the configuration. Check for the following in the site-to-site VPN configuration. For more information, see [Azure VPN Config for Cisco ASA/ASAv](/iaas/azure/azure-vpn-config-for-cisco-asaasav). * Verify that your \{ shared\_key } is correct. The \{ shared\_key } in the configuration must match the key set for the VPN connection. * Verify that you've replaced \{ macstadium\_network\_address } and \{ macstadium\_network\_mask } with the correct values for the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. * You can find the networking information for this network in Appendix A of your IP Plan. * Verify that you've configured the NAT exemption rule properly. * The host and subnet mask required for ONPREM-NET are the host and mask for the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. You can find the networking information for this network in Appendix A of your IP Plan. * The host and subnet mask required for AZURE-NET are the host and mask for your Azure virtual network. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the /16 notation converts to a 255.255.0.0 subnet mask). * The values in the brackets after nat must be the name of the internal, private network of your MacStadium private cloud, followed by the name of the outside interface of your Cisco ASA/ASAv device. By default, these are Private-1 and Outside, respectively. * You can find the names of these networks in Appendix A of your IP Plan. To resolve any of the listed common problems with the Cisco ASA/ASAv configuration, complete the following steps: 1. Clean up the firewall configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Make the necessary changes to the configuration. * For more information, see [Azure VPN Config for Cisco ASA/ASAv](/iaas/azure/azure-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## There's traffic from Azure to MacStadium but you cannot access Azure from MacStadium Sometimes, you might be able to establish an SSH connection from Azure to MacStadium but you might not be able to see or access Azure from MacStadium. This might be due to Azure being configured to stop inbound traffic. For information about how to enable inbound traffic, see [Azure Documentation: Filter inbound traffic with Azure Firewall DNAT using the Azure portal](https://docs.microsoft.com/en-us/azure/firewall/tutorial-firewall-dnat) and [Azure Documentation: Security groups](https://docs.microsoft.com/en-us/azure/virtual-network/security-overview). ## Troubleshooting ### Cleaning up the ASA/ASAv configuration Sometimes, you might need to clean up the Cisco ASA/ASAv configuration and start over. 1. Verify that you are connected via VPN to your MacStadium private cloud. For more information about how to connect to the VPN, see [Connecting to Your Cloud (via VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. 3. For more information about how to log in to your firewall, see [Logging into Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**. Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line. 5. Run the following commands one by one, clicking Send in between. Replace the placeholders with their respective values. Use Table 1: Placeholders for reference. ``` clear configure tunnel-group { azure_virtual_network_gateway_ip } clear configure crypto map azure-crypto-map clear configure crypto ipsec ikev1 transform-set azure-ipsec-proposal-set no nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static AZURE-NET AZURE-NET clear configure access-list AZURE-VPN-ACL no object-group network AZURE-NET no object-group network ONPREM-NET ``` ### Table 1: Placeholders | Placeholder | Description | Example | | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | | `{ azure_virtual_network_gateway_ip }` | The public IP assigned to the virtual network gateway in Azure. | `192.168.0.0` | | `{ macstadium_network_name }` | The name of the private network in MacStadium that needs to be accessed by Azure. You can find the information about your private network in Appendix A of the IP Plan. | `Private-1` | | `{ macstadium_outside_interface }` | The name of the outside interface of your Cisco ASA/ASAv device. You can find the information about your outside interface in Appendix A of the IP Plan. | `Outside` | ## Additional Troubleshooting Resources by Microsoft For more detailed troubleshooting instructions, see [Azure Documentation: Troubleshoot VPN Gateway](https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-troubleshoot). ## Additional Troubleshooting Resources by Cisco For more detailed troubleshooting instructions, see [Cisco Documentation: IPsec Troubleshooting](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html). # Azure VPN Config for Cisco ASA/ASAv Source: https://docs.macstadium.com/iaas/azure/azure-vpn-config-for-cisco-asaasav Configure your Cisco ASA/ASAv to complete an Azure-MacStadium VPN. A config template with placeholders for Azure and MacStadium network values is provided. After you have created your site-to-site VPN connection in Microsoft Azure, you need to configure your Cisco firewall to recognize the connection and let traffic into your MacStadium private cloud. You can use the configuration template provided below and fill in the missing information. You need to provide data from both Azure and MacStadium. ## Configuration template Unless you have extensive experience with Azure and ASA/ASAv configurations, use the configuration from the template. Otherwise, your site-to-site VPN might not work as expected. This is a template configuration that you can use to complete the configuration of your Azure-MacStadium site-to-site VPN connection. ``` ! #1: Placeholders ! ! { azure_network_address } - The IP address of the virtual network in Azure that needs to have access to MacStadium. ! { azure_network_mask } - The subnet mask of the virtual network in Azure that needs to have access to MacStadium. ! { macstadium_network_address } - The IP address of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. ! { macstadium_network_mask } - The subnet mask of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. ! { macstadium_network_name } - The name of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. ! { macstadium_outside_interface } - The name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. ! { azure_virtual_network_gateway_ip } - The public IP assigned to the virtual network gateway in Azure. ! { shared_key } - The IPSec pre-shared key used when creating the VPN connection in Azure. ! ! #2: NAT exemption ! ! The name "AZURE-NET" must be unique for the Cisco ASA/ASAv device. object-group network AZURE-NET description Azure Virtual Network network-object { azure_network_address } { azure_network_mask } ! The name "ONPREM-NET" must be unique for the Cisco ASA/ASAv device. object-group network ONPREM-NET description OnPrem Network network-object { macstadium_network_address } { macstadium_network_mask } ! The name "AZURE-VPN-ACL" must be unique for the Cisco ASA/ASAv device. access-list AZURE-VPN-ACL extended permit ip object-group ONPREM-NET object-group AZURE-NET nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static AZURE-NET AZURE-NET ! #3: IKE configuration crypto ikev1 enable { macstadium_outside_interface } crypto ikev1 policy 5 authentication pre-share encryption aes-256 hash sha group 2 lifetime 28800 exit crypto ipsec ikev1 transform-set azure-ipsec-proposal-set esp-aes-256 esp-sha-hmac crypto ipsec security-association lifetime seconds 3600 crypto ipsec security-association lifetime kilobytes 102400000 tunnel-group { azure_virtual_network_gateway_ip } type ipsec-l2l tunnel-group { azure_virtual_network_gateway_ip } ipsec-attribute ikev1 pre-shared-key { shared_key } ! #4: IPSec configuration ! The name "azure-crypto-map" must be unique for the Cisco ASA/ASAv device. crypto map azure-crypto-map 1 match address AZURE-VPN-ACL crypto map azure-crypto-map 1 set peer { azure_virtual_network_gateway_ip } crypto map azure-crypto-map 1 set ikev1 transform-set azure-ipsec-proposal-set crypto map azure-crypto-map interface { macstadium_outside_interface } sysopt connection tcpmss 1350 sysopt connection preserve-vpn-flows ``` ## Fill in the configuration blanks You need to manually replace the placeholders in the configuration template with the values for your Azure and MacStadium configurations. ### Get the configuration values **\{ azure\_network\_address }** This is the IP address of the virtual network in Azure that needs to have access to MacStadium. 1. Verify that you're logged into the Azure portal for your subscription. 2. In the search box at the top of the screen, type Virtual networks and select the respective entry in the filtered search results.\\ Azure search results with Virtual networks entry highlighted 3. On the Virtual networks screen, select the virtual network used in your VPN. 4. In the network overview, look for the Address space. Use the IP address without the bit notation at the end (e.g. /16).\\ Azure virtual network overview showing Address space field **\{ azure\_network\_mask }** This is the subnet mask of the virtual network in Azure that needs to have access to MacStadium. 1. Verify that you're logged into the Azure portal for your subscription. 2. In the search box at the top of the screen, type Virtual networks and select the respective entry in the filtered search results.\\ Azure search results with Virtual networks entry highlighted 3. On the Virtual networks screen, select the virtual network used in your VPN. 4. In the network overview, look for the Address space. Use the bit notation at the end (e.g. /16) and convert it to a subnet mask. You can use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask).\\ Azure virtual network overview showing Address space in CIDR notation **\{ macstadium\_network\_address }** This is the IP address of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. * You can find the information about your private network in Appendix A of the [IP Plan](/macstadium/macstadium-overview/ip-plan). **\{ macstadium\_network\_mask }** This is the subnet mask of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. **\{ macstadium\_network\_name }**\ This is the name of the private network in MacStadium that needs to be accessed by Azure. By default, this is Private-1. **\{ macstadium\_outside\_interface }** This is the name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. **\{ azure\_virtual\_network\_gateway\_ip }** This is the public IP assigned to the virtual network gateway in Azure. 1. Verify that you're logged into the Azure portal for your subscription. 2. In the search box at the top of the screen, type Virtual network gateways and select the respective entry in the filtered search results.\\ Azure search results with Virtual network gateways entry highlighted 3. On the Virtual network gateways screen, select the gateway for your VPN connection. 4. In the network overview, look for the Public IP address.\\ Azure virtual network gateway overview showing Public IP address field **\{ shared\_key }** This is the IPSec pre-shared key used when creating the VPN connection in Azure. * You must have this key saved separately. ## Complete the template 1. Copy the template into a text editing tool. 2. Replace all placeholders with their respective values. 3. Delete the remaining commented lines to clean up the template. Commented lines are indicated by ! at the beginning of the line. 4. Save your changes. ## Next steps If you are ready to feed the complete configuration into your Cisco ASA/ASAv, see [Setting Up the MacStadium Side of the Site-to-Site VPN](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). # Site-to-Site VPN Configuration with Azure Source: https://docs.macstadium.com/iaas/azure/site-to-site-vpn-configuration-with-azure Configure an IPsec site-to-site VPN between Azure and the MacStadium Cisco ASA firewall. Covers Active/Standby and Active/Active modes with BGP routing. ## Overview The goal of this documentation is to update the Site-to-Site VPN configuration between Azure and MacStadium ASA firewalls. ## Azure Networking Setup To establish a stable and persistent connection between an Azure and the MacStadium private cloud, configure an IPsec Site-To-Site VPN between the two clouds. Currently, for VPN connectivity between MacStadium and Azure there are two options: * Active/Active Disabled. Every Azure VPN gateway consists of two instances in an Active/Standby configuration. According to Azure, for any planned maintenance or unplanned disruption that may happen to the Active instance, the Standby instance would take over (failover) automatically and resume the Site-To-Site VPN connections. * Active/Active Enabled. In this mode, each Azure gateway instance has a unique public IP address and both instances establish an IPsec Site-To-Site VPN to your MacStadium firewall. For this VPN mode, you should also enable the TCP State Bypass feature in your ASA firewall which requires an access-list, class-map, policy-map, and a service-policy. This is a requirement for Site-To-Site VPNs with Virtual Tunnel Interfaces only and is configured to allow asynchronous routing between separate VPN tunnels. In both VPN modes, static or dynamic routing with BGP is supported between MacStadium and Azure. In this document, BGP routing is used. For more information about general Azure VPN design, see [Azure Documentation](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-highlyavailable). ## Creating a Site-to-Site VPN This is the general process for creating a Site-to-Site, from the Azure private cloud to the MacStadium private cloud. 1. Login to Azure. 2. Create a Virtual Network Gateway. 3. Create a Local Network Gateway. 4. Create a Site-to-Site VPN Connection. ## Log into Azure 1. Log into the Azure portal with the credentials. 2. Confirm the correct account and organization. ## Create a Virtual Network Gateway The instructions below assume that there is a configured Azure Virtual Network. In Azure, the virtual network gateway represents the Azure side of the Site-to-Site VPN tunnel. 1. In the search box at the top of the screen, type Virtual network gateways then select the respective entry in the filtered search results.\\ Azure search results with Virtual network gateways entry highlighted 2. On the Virtual network gateways screen, click Create. (Or Create virtual network gateway, if this is the first gateway) 3. Select Subscription 4. Select Resource group 5. Provide a Name and select a Region 6. For Gateway type, confirm VPN is selected 7. For VPN type, confirm Route-based is selected 8. Select your SKU * For more information about the available SKUs, see Azure Documentation: [Gateway SKUs](https://learn.microsoft.com/en-gb/azure/vpn-gateway/vpn-gateway-about-vpngateways). 9. Select the Virtual network to be used to send and receive traffic through the VPN. 10. For Public IP address, select an existing unused IP address or create a new one and provide a name for it. 11. In Availability zone, select Zone-redundant. 12. In the option Enable active-active mode, leave it as Disable for an Active/Standby VPN, or select Enabled for an Active/Active VPN mode. * If Active/Active is enabled, then in the section SECOND PUBLIC IP ADDRESS select an existing unused public IP address or create a new one and provide a name for it. * In Availability zone, select Zone-redundant 13. For the option Configure BGP, select Enabled. 14. In Autonomous system number (ASN) use the default value 65515 or, if required, use a different ASN in the private range of 64,512–65,534. This is used as the BGP process number in the MacStadium firewall. 15. In Custom Azure APIPA BGP IP address add an APIPA address from the range 169.254.21.X. Example 169.254.21.1. This IP will be used in the BGP configuration in your firewall. 16. Click Review + create, review the configuration. 17. Click Create, and wait for the deployment to complete. * This might take several minutes. 18. Check if the virtual network gateway is deployed successfully. * On the Virtual network gateways screen, select the virtual network gateway and click Properties. * Verify that the Provisioning state is Succeeded.\\ Azure virtual network gateway Properties showing Provisioning state Succeeded * Example: Create a virtual network gateway\\ Sample Azure virtual network gateway configuration form * This image shows a sample configuration for a virtual network gateway. ## Create a Local Network Gateway In Azure, the local network gateway represents the MacStadium side of the Site-to-Site VPN tunnel. 1. In the search box at the top of the screen, type Local network gateways and select the respective entry in the filtered search results. Azure filters results.\\ Azure search results with Local network gateways entry highlighted 2. On the Local network gateways screen, click + Create. 3. Provide a Name. 4. For IP Address, provide the IP address of the public network listed in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * By default, this is the FW1-Outside network. 5. Leave Address space empty and click Next : Advanced. 6. Set the option Configure BGP settings to Yes. 7. Enter the private ASN number to use, for instance 65516. * Notice that ASNs 8075, 8076, 12076 (public), 65515, 65517, 65518, 65519, 65520 (private) are reserved by Azure and cannot be used. 8. In BGP peer IP address enter the APIPA IP address used in the Azure side, for example 169.254.21.2. 9. Click Review + create and then Create. 10. Wait for the deployment to complete. * This might take several minutes. When the deployment is complete, the local network gateway becomes listed under All resources. ## Create the VPN Connection After the virtual network gateway and a local network gateway are in place, create and configure the VPN connection between Azure and the MacStadium private cloud. 1. In the search box at the top of the screen, type Virtual network gateways and select the respective entry in the filtered search results. Azure filters results. 2. On the Local network gateways screen, select the local network gateway created earlier. 3. From the sidebar menu, select Connections and click + Add.\\ Azure local network gateway Connections panel with Add button 4. Provide a Name. 5. Set the Connection type to Site-to-Site (IPsec).\\ Azure Create Connection form with Site-to-Site IPsec connection type selected 6. Select the correct Region and click Next : Settings. 7. Select the Virtual network gateway and Local network gateway that were previously created. 8. For Shared key (PSK), provide an IPSec pre-shared key. * Keep a record of the pre-shared key. It will be used later. 9. For IKE Protocol, confirm IKEv2 is selected. 10. Select Enable BGP. 11. Select Enable Custom BGP Addresses. 12. In the Primary Custom BGP Address field, select the APIPA address that were created before. 13. In IPsec / IKE policy, select Custom 14. Set IKE Phase 1 and IKE Phase 2 as follows:\\ Azure IPsec IKE policy settings for IKE Phase 1 and Phase 2 15. Review the remaining pre-filled setting and click Review + Create.\ Azure Create Connection review page before final creation\\ Azure VPN connection settings summary before creation 16. Click Create at the next step. 17. Wait for the operation to be completed. * This might take a while. When the deployment is complete, click Go to resource\\ Azure deployment complete screen with Go to resource button 18. In the Overview page, select Download configuration:\\ Azure VPN connection Overview page with Download configuration option 19. In the pop-up window, set Device vendor to Cisco, Device family to ASA (Adaptive Security Appliance) and Firmware version to CiscoASA\[9.8+\_ONLY]\_RouteBased(IKEv2>VTI+BGP) and click Download configuration.\\ Download configuration dialog with Cisco ASA and firmware version selected * The status of the newly created connection is Unknown. ### Ensure that Azure Allows Inbound Traffic Based on the requirements and current setup, it might be necessary to enable inbound traffic from MacStadium to Azure. For more information, see Azure Documentation: [Filter inbound Internet traffic with Azure Firewall DNAT using the Azure portal](https://learn.microsoft.com/en-us/azure/firewall/tutorial-firewall-dnat) and [Network security groups](https://learn.microsoft.com/en-us/azure/virtual-network/network-security-groups-overview). To proceed with the MacStadium side of the configuration, see Azure [VPN Config for Cisco ASA/ASAv](/iaas/azure/azure-vpn-config-for-cisco-asaasav). After creating the Site-to-Site VPN connection, configure the Cisco firewall to recognize the connection and let traffic into the MacStadium private cloud. Make sure to download the VPN configuration template from Azure. ## Configuration Template Without extensive experience with Azure and ASA/ASAv configurations, it is recommended to use a configuration template. Otherwise, the Site-to-Site VPN might not perform as expected. 1. In the VPN configuration script downloaded from Azure, the configuration starts after the section below:\\ Azure VPN configuration script header section showing where configuration begins 2. Find the section where the BGP configuration starts. 3. Add the MacStadium private network and mask. ``` router bgp 65516 bgp log-neighbor-changes bgp graceful-restart bgp router-id 169.254.21.1 address-family ipv4 unicast neighbor 10.0.1.254 remote-as 65515 neighbor 10.0.1.254 ebgp-multihop 255 neighbor 10.0.1.254 activate ! NOTE: THE LOCAL NETWORKS TO BE ADDED STATICALLY TO THIS BGP ROUTER NEED TO GO HERE BELOW: ! NOTE: You can add more local on-premises network ranges statically here as well, using the "network" command just like above. !etc... ! network 10.221.188.0 mask 255.255.254.0 no auto-summary no synchronization exit-address-family ``` * Find the MacStadium Private Network by checking that section in Appendix A of the IP Plan. * Make sure the name of the interface being used for the VPN connection is Outside as this is the name of the interface in the script downloaded from Azure. If there is a different interface name for the VPN, then make sure to replace all sections where the Outside interface is referenced in the script by the actual interface name being used. * **Warning:** Ignore the section, STATIC ROUTING SETUP FOR AZURE, and do not configure any static routes, as BGP will be used instead. 4. Access the firewall through SSH using the credentials available in the IP Plan. 5. Paste the ASA configuration script and confirm all commands were accepted. 6. Use the following commands to confirm if the VPN has been successfully established: ``` show vpn-sessiondb l2l show crypto ipsec sa ``` * For more information, see: [Cisco Secure Firewall ASA Series Command Reference, S Commands](https://www.cisco.com/c/en/us/td/docs/security/asa/asa-cli-reference/S/asa-command-ref-S/show-cr-to-show-cz-commands.html). 7. Save the configuration with the ASA CLI command: write memory. * Access to the Azure environment from the MacStadium host is now possible (and vice-versa). * To feed the complete configuration into your Cisco ASA/ASAv, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). # Verify your Azure-to-MacStadium VPN connection Source: https://docs.macstadium.com/iaas/azure/verify-azure Verify your Azure-MacStadium site-to-site VPN tunnel using the Cisco ASDM-IDM CLI. Checks ISAKMP security associations to confirm the tunnel is active. After you have completed both the Microsoft Azure and the MacStadium sides of the configuration, you might want to verify that the tunnel is working as expected. 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**.\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click **Send**. ``` show crypto isakmp sa ``` If the site-to-site VPN connection is configured properly, you should see information about an active IKEv1. For more information about this verification command, see [Cisco Documentation: show crypto isakmp sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#isakmp_sa). ## Verify that there is an IPsec security association between peers 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select Tools > Command Line Interface\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click Send. ``` show crypto ipsec sa ``` If the site-to-site VPN connection is configured properly, you should see a detailed log. For more information about this verification command, see [Cisco Documentation: show crypto ipsec sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#ipsec_sa). ## Verify that the tunnel is connected 1. Log in to your Azure portal. 2. On the All resources page, find the connection that represents your VPN connection (for example: macstadium-vpn) and click it. 3. Select Overview and check the Status of the connection. When your tunnel is properly connected, the status is: Connected.\\ Azure VPN connection overview showing Connected status ## Test traffic and visibility through the tunnel 1. Verify that you have created a virtual machine in MacStadium. 2. Verify that you have created a virtual machine in Azure. 3. In the terminal on your MacStadium VM, run the following command. * Replace `` with the username for your Azure VM. * Replace `` with the private IP of the Azure VM. ``` ssh @ ``` 4. When prompted, provide your password or key for the specified username on the specified Azure VM. * If the connection is successful, the prefix of the terminal becomes ``@``. This indicates that you have connected from MacStadium to Azure over the tunnel. 5. Run the following command. * Replace `` with the username for your MacStadium VM. * Replace `` with the private IP of the MacStadium VM. ``` ssh @ ``` 6. When prompted, provide your password or key for the specified username on the specified MacStadium VM. If the connection is successful, the prefix of the terminal becomes ``@``. This indicates that you have connected from Azure to MacStadium over the tunnel. ## Troubleshooting See our [Azure Troubleshooting](/iaas/azure/azure-troubleshooting) doc for some common issues with Azure-MacStadium Site-to-Site VPN Connections. # Disabling Activation Lock and Find My on Mac Source: https://docs.macstadium.com/iaas/bare-metal-macs/2018-mac-mini-deactivation-process Turn off Find My, remove Activation Lock, and sign out of your Apple Account before returning a rented Mac to MacStadium. Required to avoid extra charges. Before MacStadium can reclaim your rented Mac, you must disable Activation Lock by turning off Find My and signing out of your Apple Account. If this is not done, MacStadium engineers cannot reclaim the machine, and charges may apply. ## Turn Off Find My 1. Open **Apple menu** > **System Settings**. 2. Click your name at the top of the sidebar, then click **iCloud**. 3. Click **See All**, then click **Find My Mac**. 4. Click the toggle to turn it off. 5. Enter your Apple Account password when prompted. ## Sign Out of Your Apple Account 1. Open **Apple menu** > **System Settings**. 2. Click your name at the top of the sidebar. 3. Scroll down and click **Sign Out**. ## If You No Longer Have Access to the Mac You can remove Activation Lock remotely: 1. Sign in to [iCloud.com](https://www.icloud.com) and open **Find My**. 2. Select **All Devices**, then select your Mac. 3. Click **Remove from Account**. You can also do this from the **Find My** app on another Apple device signed in with the same Apple Account. For more details, see Apple's official documentation on [Activation Lock for Mac](https://support.apple.com/en-us/102541). # Common macOS CI/CD tools for MacStadium Source: https://docs.macstadium.com/iaas/bare-metal-macs/common-tools Essential tools for macOS CI/CD on MacStadium: Xcode via Xcodes.app or direct download, Homebrew, fastlane, CocoaPods, and Apple ID setup best practices. These tools enable the provisioning and use of hosted Mac resources for Apple platform development. # Xcode Xcode is the Apple IDE, enabling the development of applications for Apple platforms, including iOS and macOS. In order to download Xcode, a valid Apple ID is required, regardless of the method used. There are several ways to install it: ## Xcodes.app (Recommended) The Xcodes app is the fastest and easiest way to install Xcode. By leveraging multithreaded downloads, as well as accelerated decompression of Xcode packages, Xcodes is much faster than directly downloading from the Apple Developer Portal or using the App Store, while still using signed official packages from Apple. Additionally, while it does require an Apple ID, it does not sign the Mac into iCloud, which prevents issues with Find My Mac. ## Installation Download the latest version of Xcodes from the following link: [https://github.com/XcodesOrg/XcodesApp/releases/latest](https://github.com/XcodesOrg/XcodesApp/releases/latest) Once downloaded, drag Xcodes.app to the Applications folder to install the app. Alternatively, if Homebrew is installed, then run the following command in Terminal: ```text theme={null} brew install --cask xcodes ``` ## Usage Once Xcodes is installed, launch the app from the Applications folder. Xcodes displays all of the available releases of Xcode. In order to download and install a release, authentication with an Apple ID is required. To do this, click the Account icon in the upper right corner of the app: Xcodes app main window showing Account icon in the upper right corner ### Recommended: Enable experimental unxip The decompression (unxip) process for Xcode is typically quite lengthy. To help accommodate this, Xcodes has an experimental decompression method that speeds things up. In our testing, this has been shown to be both stable and effective. To enable this, navigate to Xcodes>Settings>Experiments in the menu bar, and then check "When unxipping, use experiment": Xcodes Settings Experiments panel with experimental unxip option checked Once authenticated, Xcode and individual platform SDKs may be downloaded and installed by clicking the Install button next to the desired release. During installation, Xcodes may prompt for elevated access; if so, then enter a username/password to allow this. ## Download from Apple's Developer Portal (Recommended) Xcode may also be downloaded directly from Apple using a web browser. While slower than Xcodes, this method may be preferred if there are concerns around third-party software: [https://developer.apple.com/download/all/?q=Xcode](https://developer.apple.com/download/all/?q=Xcode) As with other methods, it is necessary to sign in with an Apple ID to download and install the software. Once downloaded, double-click the xip file to extract Xcode, then copy to the Applications folder to install. ## Download from the App Store (Not Recommended) Xcode is officially distributed by Apple via the App Store. To install Xcode this way, visit the following link: [https://apps.apple.com/us/app/xcode/id497799835?mt=12](https://apps.apple.com/us/app/xcode/id497799835?mt=12/) This method is not recommended, as it requires binding the Mac to an Apple ID, which may inadvertently enable iCloud/Find My Mac. Machines with Find My Mac enabled are Activation Locked, and cannot be used by other users until the machine is unlocked by the original account. As a result, machines returned with Find My Mac enabled are subject to recovery fees. # Homebrew Homebrew is a package manager that makes installing packages from the Mac terminal quick and easy. It is generally the preferred method used to install system utilities and libraries. ### Prerequisites Homebrew relies upon Xcode Command Line Tools, so Xcode must be installed. To install it via the Command Line Tools by entering the following command into Terminal: ```text theme={null} xcode-select --install ``` Once this command is run, a system prompt appears offering to install the Xcode Command Line Tools. Click Install and wait for the installation to finish before proceeding. The Mac Terminal App is located in the Utilities Folder under the Applications Folder, and allows for access to the system shell, which is zsh by default. ### Process Once prerequisites are installed, installing Homebrew can be done with a single line of code in the Terminal. 1. Open your Terminal App. 2. Copy and paste the following command, and then press ENTER. ```text theme={null} /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 3. Hit the RETURN key when prompted. 4. Follow the installation process on screen. Update Homebrew when necessary, by using the following command in the Terminal App: ```text theme={null} brew update ``` Enable auto completion by entering the command: ```text theme={null} brew install bash-completion ``` ### Uninstalling Homebrew 1. Open the Terminal App. 2. Copy and paste the following command and then press ENTER: ```text theme={null} /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)" ``` # Ansible [Installation Guide](https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html) [Ansible Docs](https://docs.ansible.com/ansible/latest/index.html) Ansible is a largely free and open source server configuration tool. It must be installed, along with Python, on the control machine, which might be the local desktop. From there, Ansible requires SSH access to the target server -- in this case the Mac Cloud. Once Ansible has gained access to the target environment via SSH, it can run provisioning scripts and the like to prepare the environment for whatever work needs to be done -- be it CI or anything else. ## Starter Scripts MacStadium maintains a handful of example scripts to get started. ## Ansible Roles Roles are sets of tasks and files used to configure a host machine to perform a specific role (thus, the name). [Ansible Role: macOS CI](https://github.com/macstadium/ansible-role-osx-ci) [Ansible Role: Xcode](https://github.com/macstadium/ansible-role-xcode) ## Ansible Playbooks Playbooks are mappings of Ansible Roles and the various host machines they are meant to configure for a given process. [Ansible Playbook: macOS CI Setup](https://github.com/macstadium/ansible-playbook-osx-ci-setup) # Packer [Installation Guide](https://www.packer.io/intro/getting-started/install.html) [Packer Docs](https://www.packer.io/docs/index.html)\ Packer is an open-source tool that stores a live image of a virtual machine, which can be cloned in seconds, rather than minutes or hours. It uses JSON to define the VM template, and because it is command-line-driven, it can easily be integrated into the build pipeline. Packer is not a direct substitute for provisioning solutions. In fact, it is built to interface easily with Chef, Puppet, and Ansible for the provisioning of the base VM image. # Connecting to your Mac for the first time Source: https://docs.macstadium.com/iaas/bare-metal-macs/connecting-to-your-mac-for-the-first-time Just got your MacStadium installation ticket? Connect via macOS Screen Sharing, a VNC client, or SSH using the credentials from your ticket. All Mac mini subscriptions are pre-configured to connect using the following methods: **macOS Screen Sharing**: Open Safari and type `vnc://` (replacing the IP address with one provided in your install ticket) OR enter the IP address into the Screen Sharing app for remote access. **VNC**: The Apple Screen Sharing server also supports VNC connections using your client of choice, such as TigerVNC. This allows for remote desktop access from other OSes, albeit with reduced performance. **SSH Terminal**: Use your OS’s built in terminal to gain console access to the server. # Bare metal Mac configurations Source: https://docs.macstadium.com/iaas/bare-metal-macs/mac-mini-comparison-chart Side-by-side specs for all MacStadium bare metal Mac configurations: Mac mini and Mac Studio, with chip, RAM, storage, and recommended use case. MacStadium offers bare metal Mac hardware in two product lines. Use the tables below to compare configurations and find the right fit for your workload. For benchmark scores, see the [benchmarks page](/iaas/bare-metal-macs/macstadium-bare-metal-mac-benchmarks). ## Mac mini Mac mini is recommended for most CI/CD and Orka workloads. Standard configurations are available for immediate purchase on the [MacStadium customer portal](https://portal.macstadium.com/register). | Plan | Chip | CPU cores | RAM | SSD | Best for | | ----- | ------ | --------- | ----- | ------ | ------------------------------------------- | | M2.S | M2 | 8 | 8 GB | 256 GB | VDI, light CI/CD, basic automation | | M4.S | M4 | 10 | 16 GB | 256 GB | VDI, light CI/CD, basic automation | | M1.M | M1 | 8 | 16 GB | 1 TB | VDI, CI/CD, remote development | | M2.M | M2 | 8 | 16 GB | 1 TB | VDI, CI/CD, Orka nodes | | M4.M | M4 | 10 | 24 GB | 512 GB | VDI, CI/CD, Orka clusters | | M2.L | M2 Pro | 10 | 16 GB | 1 TB | CI/CD, Orka nodes | | M4.L | M4 Pro | 12 | 48 GB | 1 TB | Multi-VM CI/CD, Orka clusters | | M2.XL | M2 Pro | 12 | 32 GB | 2 TB | CI/CD pipelines, Orka clusters | | M4.XL | M4 Pro | 14 | 64 GB | 2 TB | High-concurrency CI/CD, large Orka clusters | All Mac mini configurations are Apple silicon (ARM). Intel Mac mini hardware is available for custom orders. [Contact MacStadium sales](https://www.macstadium.com/contact/sales) for more. **For Orka clusters:** Medium and larger configurations (M2.M and above) are recommended. More RAM means more concurrent VMs per node. M2.XL and above are the best fit for teams running multiple VMs simultaneously. ## Mac Studio Mac Studio is recommended for GPU-intensive workloads: video rendering, AI/ML inference, and running local language models. If your use case requires serving a model on-device rather than calling an external API, Mac Studio is the right tier. Standard configurations are available for immediate purchase on the [MacStadium customer portal](https://portal.macstadium.com/register). | Plan | Chip | CPU cores | RAM | SSD | Best for | | ---- | -------- | --------- | ------ | ---- | ----------------------------------------------------------------- | | S1.M | M1 Max | 10 | 64 GB | 2 TB | GPU workloads, AI/ML inference, video rendering | | S2.M | M2 Ultra | 24 | 64 GB | 2 TB | High-throughput GPU, local LLM serving, on-device model inference | | S2.L | M2 Ultra | 24 | 128 GB | 2 TB | Very large local models, maximum memory GPU workloads | ## Related * [MacStadium Bare Metal Mac Benchmarks](/iaas/bare-metal-macs/macstadium-bare-metal-mac-benchmarks) * [Data center locations](/iaas/iaas-overview/data-center-locations) * [Common tools](/iaas/bare-metal-macs/common-tools) # MacStadium Bare Metal Mac Benchmarks Source: https://docs.macstadium.com/iaas/bare-metal-macs/macstadium-bare-metal-mac-benchmarks Benchmark results for MacStadium bare metal Mac hosts: Xcode, Geekbench 6, and Cinebench R24 scores with multipliers to help choose the right Mac for CI/CD. ## About MacStadium offers a wide selection of Bare Metal Mac hosts for a variety of applications.\ When selecting host machine varieties, most MacStadium customers seek to strike a balance between the volume of computation that they need to do, the speed at which a given job (like a CI build) should be completed, and the cost involved. ## Overview **Benchmarking** When evaluating Macs, the goal is to determine the optimal performance of a given piece of Mac hardware, including CPU performance, GPU performance, and real-world performance for CI/CD applications. To achieve this, refer to these synthetic benchmarks: * XcodeBenchmark * Geekbench 6 Multi-core * Geekbench 6 Compute * Cinebench R24 [Read the blog post for a complete description of the benchmarking process](https://www.macstadium.com/blog/choosing-your-mac-with-macstadiums-benchmarks) **Benchmark Results** The standard models table reflects tests performed on macOS 15.1 with Xcode 16.1 and Cinebench R24. The full results table reflects the original benchmark run on macOS 13.4.1 with Cinebench R23 and is included for reference. ## Benchmarking Baseline This machine is used as the baseline when referencing multipliers. In other words, a machine with a multiplier of 1.4x is 40% more performant than the baseline machine for the specified test. Multipliers are shown below the raw score in each cell. | Name | CPU | Xcode | GB6 CPU | GB6 GPU | CB R24 | RAM | SSD | Mac Model | | ---- | ---------- | -------------------- | ------------------ | ------------------ | ------------------- | ---- | --- | --------- | | M2.M | M2
8C | 190.33s
(1.00x) | 10244
(1.00x) | 48348
(1.00x) | 600.07
(1.00x) | 16GB | 1TB | Mac mini | ## Current standard models This table includes Standard models currently available as Bare Metal from MacStadium. | Name | CPU | Xcode | GB6 CPU | GB6 GPU | CB R24 | RAM | SSD | Mac Model | | ----- | ----------------- | -------------------- | ------------------ | ------------------- | -------------------- | ----- | ----- | ---------- | | S2.L | M2 Ultra
24C | 98.043s
(1.94x) | 21734
(2.12x) | 215160
(4.45x) | 1975.14
(3.29x) | 128GB | 2TB | Mac Studio | | S2.M | M2 Ultra
24C | 96.82s
(1.97x) | 21777
(2.13x) | 218001
(4.51x) | 1981.3
(3.30x) | 64GB | 2TB | Mac Studio | | M4.XL | M4 Pro
14C | 97.05s
(1.96x) | 22582
(2.20x) | 113953
(2.36x) | 1639.38
(2.73x) | 64GB | 2TB | Mac mini | | M4.L | M4 Pro
12C | 107.28s
(1.77x) | 20769
(2.03x) | 100559
(2.08x) | 1478.15
(2.46x) | 48GB | 1TB | Mac mini | | M4.M | M4
10C | 139.14s
(1.37x) | 15123
(1.48x) | 58437
(1.21x) | 982.56
(1.64x) | 24GB | 512GB | Mac mini | | M4.S | M4
10C | 138.95s
(1.37x) | 15153
(1.48x) | 58309
(1.21x) | 983.99
(1.64x) | 16GB | 256GB | Mac mini | | S1.M | M1 Max
10C | 146.91s
(1.30x) | 13049
(1.27x) | 123103
(2.55x) | 858.57
(1.43x) | 64GB | 2TB | Mac Studio | | M2.XL | M2 Pro
12C | 128.11s
(1.49x) | 14951
(1.46x) | 86500
(1.79x) | 1047.68
(1.75x) | 32GB | 2TB | Mac mini | | M2.L | M2 Pro
10C | 147.16s
(1.29x) | 13076
(1.28x) | 78215
(1.62x) | 817.66
(1.36x) | 16GB | 1TB | Mac mini | | M2.M | M2
8C | 190.33s
(1.00x) | 10244
(1.00x) | 48348
(1.00x) | 600.07
(1.00x) | 16GB | 1TB | Mac mini | | M2.S | M2
8C | 190.33s
(1.00x) | 10205
(1.00x) | 48229
(1.00x) | 605.38
(1.01x) | 8GB | 256GB | Mac mini | ## Full Results This table includes the full range of benchmarked hardware, including several machines not currently available for reference. Current and former MacStadium standard bare metal machines will have their name listed. | Name | CPU | Xcode | GB6 CPU | GB6 GPU | CB R23 | RAM | SSD | Mac Model | | ----- | ----------------- | --------------------- | ------------------ | ------------------- | ------------------ | ----- | ----- | ---------- | | S2.M | M2 Ultra
24C | 53.599s
(2.31x) | 20963
(2.38x) | 206071
(6.09x) | 28945
(3.68x) | 64GB | 2TB | Mac Studio | | S1.L | M1 Ultra
20C | 65.558s
(1.89x) | 18060
(2.05x) | 174505
(5.16x) | 24214
(3.08x) | 128GB | 4TB | Mac Studio | | N/A | M2 Max
12C | 74.003s
(1.67x) | 14872
(1.69x) | 127390
(3.76x) | 14885
(1.89x) | 32GB | 512GB | Mac Studio | | M2.XL | M2 Pro
12C | 74.659s
(1.64x) | 14686
(1.67x) | 81837
(2.42x) | 14812
(1.88x) | 32GB | 2TB | Mac mini | | S1.M | M1 Max
10C | 89.340
(1.39x) | 12947
(1.47x) | 119490
(3.53x) | 12457
(1.58x) | 64GB | 2TB | Mac Studio | | M2.L | M2 Pro
10C | 84.904s
(1.46x) | 12405
(1.41x) | 73622
(2.18x) | 11858
(1.51x) | 16GB | 1TB | Mac mini | | M2.M | M2
8C | 106.259s
(1.17x) | 10130
(1.15x) | 45902
(1.36x) | 8776
(1.12x) | 16GB | 1TB | Mac mini | | M2.S | M2
8C | 108.477s
(1.14x) | 10192
(1.16x) | 45891
(1.36x) | 8780
(1.12x) | 8GB | 256GB | Mac mini | | M1.M | M1
8C | 123.885s
(1.00x) | 8818
(1.00x) | 33843
(1.00x) | 7869
(1.00x) | 16GB | 1TB | Mac mini | # Allowing Specific IPs to Access MacStadium via Internet Source: https://docs.macstadium.com/iaas/cisco-firewalls/allowing-specific-ips-to-access-macstadium-via-internet Configure Static NAT and ACL rules on a Cisco ASA firewall to allow specific external IP addresses to access MacStadium hosts on the private network. ## Overview Static Network Address Translation (NAT) is used to conserve IP addresses. It allows private IP networks with unregistered IP addresses to connect to the Internet. NAT translates the private (not globally unique) addresses in the internal network into legal addresses before they are forwarded to another network. Think of NAT as a one-to-one mapping of private IP addresses to public IP addresses. It allows mapping of an IP address on the internal network to an IP address that you want to make public. Once that mapping is set, then there are a list of rules that are needed to grant or deny access, which is called an Access Control List (ACL). The ACL is a list of rules that specifies which users or systems are granted or denied access to a particular object. ACLs are also installed in routers or switches, where they act as filters, managing which traffic can access the network. This document describes how to configure a Static Network Address Translation (NAT) and Access Control List (ACL) on a Cisco ASA Firewall to allow external IP addresses to access the MacStadium hosts. ## Prerequisites Cisco AnyConnect Client: Connect to the VPN using Cisco AnyConnect Client, then access the firewall via SSH or Cisco ASDM. ## Considerations In this document, the source IP address is the public IP that needs to be whitelisted in the firewall. The destination hosts are the MacStadium servers behind the firewall Private interface. This document demonstrates how to allow TCP port 443 (HTTPS) in the Cisco Adaptive Security Appliance (ASA) firewall from an external IP address to the subnet 10.221.188.0/23 configured in the Private-1 interface as an example. The example source IP address **76.76.21.241** is used in this document. ## Install Options Updating the Cisco Adaptive Security Appliance (ASA) can be done two different ways: **Via Command Line Interface (CLI)** Using a CLI allows you to write script changes in a notepad and have those changes reviewed by someone before running them. This method is good for writing scripts. **Via Cisco Adaptive Security Device Manager (ASDM)** Using an ASDM allows you to make line-by-line changes, while using a graphical user interface (GUI). ## Configuring Static Network Address Translation (NAT) **NAT via Command Line Interface (CLI)** 1. Connect to the firewall via SSH using MacStadium credentials that are available in the IP Plan. 2. When the > prompt appears, type enable 3. Enter the password again. * It should look like this: ``` ciscoasa> ciscoasa>enable ciscoasa>**** ciscoasa# ``` * The privileged mode appears, as indicated by the # prompt. 4. Enter the configuration mode and create an object and static NAT rule for that host: ``` ciscoasa#configure terminal ciscoasa(config)#object network Example-Host-31 ciscoasa(config-network-object)#host 10.221.188.31 ciscoasa(config-network-object)#nat (Private-1,Outside) static 207.254.16.239 ciscoasa(config-network-object)#end ciscoasa#write memory ``` Replace the example MacStadium NAT IP address (207.254.16.239) with an available Public IP listed in the MacStadium IP Plan. ## NAT via Cisco Adaptive Security Device Manager (ASDM) 1. Connect to the ASDM using the MacStadium credentials from your IP Plan. 2. Navigate to Configuration > Firewall > NAT Rules > +Add > Add NAT Rule.\\ ASDM NAT Rules with Add NAT Rule option selected 3. Give the Object representing the internal MacStadium host a name (Example-Host-31). 4. Confirm the Type is set as Host. 5. In IP address enter the private IP address of the host (consult your IP Plan). 6. In the NAT section, confirm Static is selected and enter the MacStadium Public IP address to assign the host. 7. Click Advanced and set the Source Interface to Private-1 and Destination Interface to Outside. 8. Confirm the Protocol is set to tcp. 9. Click OK > OK > Apply.\\ ASDM Add NAT Rule dialog with static NAT and interface settings completed 10. Click Save 11. Click Apply Changes\\ ASDM Apply Changes confirmation dialog ## Configuring Access Control Lists (ACLs) ### ACL via Command Line Interface (CLI) For external access to MacStadium hosts, a static NAT must be previously configured. This guide assumes that the `Private-1-IPs` object has been configured in the firewall. 1. Confirm that `Private-1-IPs` was configured by running the following CLI command:\ `ciscoasa#show running-config object id Private-1-IPs` 2. If `Private-1-IPs` has not been configured, then use the following commands to create it: ``` ciscoasa#configure terminal ciscoasa(config)#object network Private-1-IPs ciscoasa(config-network-object)#subnet 10.221.188.0 255.255.254.0 ``` 3. Connect to the firewall via SSH and from the command line enter the MacStadium credentials that are available in your [IP Plan](/macstadium/macstadium-overview/ip-plan) 4. Confirm the privileged mode is enabled (indicated by the # prompt). 5. Enter the configuration mode and create an Object representing the source IP address. 6. Replace EXAMPLE with a name to use to identify the object and the source Public IP address (**76.76.21.241**) with the source IP address to whitelist on the firewall. ``` ciscoasa#configure terminal ciscoasa(config)#object network EXAMPLE ciscoasa(config-network-object)#host 76.76.21.241 ``` 7. Create an Access Control List to allow traffic through the Cisco ASA firewall. From the configuration mode enter the following access-list command: ``` ciscoasa(config)#access-list Outside_access_in line 1 extended permit tcp object EXAMPLE object Private-1-IPs eq https ``` To allow access to a single internal host instead of the entire Private-1 network, reference the object you created for that specific host. Example: `ciscoasa(config)#access-list Outside_access_in line 1 extended permit tcp object EXAMPLE object Example-Host-31 eq https` 8. Apply the new access-list to the Outside interface: ``` ciscoasa(config)#access-group Outside_access_in in interface Outside ``` The command above only needs to be entered the first time the ACL is configured. 9. Exit and save the configuration: ``` ciscoasa(config)#end ciscoasa(config)#write memory ``` Instead of creating an object representing a single source IP address, you can create a Network Object Group and add Network Objects to it. This is useful if you expect to allow more IP addresses in the future. For more information, see: [Cisco ASA 9.6 Access Objects Guide](https://www.cisco.com/c/en/us/td/docs/security/asa/asa96/configuration/firewall/asa-96-firewall-config/access-objects.html) ## ACL via Cisco Adaptive Security Device Manager (ASDM) For external access to your MacStadium hosts, a static NAT must be previously configured. 1. Connect to the firewall through ASDM using the MacStadium credentials that are available in your IP Plan. 2. Navigate to: Configuration > Firewall. 3. Click +Add and select Network Object on the right menu. 4. Give the object a name. 5. Confirm its type is set to Host. 6. Enter the source IP address and optionally a description.\\ ASDM Add Network Object dialog with source IP address and host type fields 7. Click OK. 8. In the Access Rules section, confirm the Outside interface is selected. If rules are applied to the Outside interface, select the first rule from the top.\\ ASDM Access Rules with Outside interface selected 9. Click +Add and select Add Access Rule. 10. Confirm the Outside interface is selected, and the Action is set to Permit. 11. Select the object host (or group) that was just created as the Source. 12. Select the Private-1-IPs object as the Destination. 13. In Service type the protocol/ports to be allowed (in this example tcp/https). 14. Click OK.\\ ASDM Add Access Rule dialog with Outside interface, source object, and service fields To allow access to a single internal host instead of the entire Private-1 network, reference the object created for that specific host in the Destination field. 15. Make sure the new rule is at the TOP. To move the new rule to the top, select the new rule and click the upper arrow highlighted. ASDM Access Rules list with new rule selected and move-to-top arrow highlighted 16. Click Apply 17. Click Save 18. Click Apply Changes # Backup and Restore Firewall Config using ASDM Source: https://docs.macstadium.com/iaas/cisco-firewalls/backup-and-restore-firewall-config-using-asdm This process outlines how to backup and restore a configuration by executing line by line changes, while using a graphical user interface. ## Overview This process outlines how to backup and restore a configuration by executing line by line changes, while using a graphical user interface. The backup files are stored on a local system as a ZIP file. It is important to store this ZIP file in an easily accessible place in case of an emergency. Plan a backup to be taken anytime changes are made to the firewall configuration. If the firewall configuration is in a high-availability (HA) Pair, then ensure that the backup and restore to the Active firewall is enabled. This can be verified on the Cisco Adaptive Security Device Manager (ASDM) Dashboard, under the **Failover Status** field. Look for **Primary (Active)**. If this is not enabled, then login to the other firewall to perform these steps. ## Prerequisites * Access to MacStadium firewall * MacStadium login information * The ability to login to the firewall using the Cisco Adaptive Security Device Manager (ASDM) firewall software If a passphrase was set on the backup, then it needs to be available during the restore process. ## Backup Process 1. Establish a VPN connection to the MacStadium environment. 2. Connect to the firewall using the Cisco Adaptive Security Device Manager (ASDM). 3. Click the Tools menu, located at the top of the ASDM application and then select Backup Configuration.\\ ASDM Tools menu with Backup Configuration option highlighted 4. Select a location to place the backup files. 5. Enter a name for the backup file.\\ ASDM Backup Configuration dialog with file name and location fields 6. The system shows the local file structure. Select an appropriate place and name for your backup.\\ Local file browser for selecting backup file save location 7. Click Select File. 8. Accept the defaults of Backup All. 9. Click Backup.\\ ASDM Backup Configuration dialog with Backup All option and Backup button **Optional:** If the firewall is configured with identity certificates, then select a passphrase to encrypt identity certificates. Document the passphrase that is used as it is needed for future restores. ASDM passphrase field for encrypting identity certificates in backup 10. Click OK The Progress Message can be copied to a text editor for review and validation. 11. Click Close after backup is completed. A Backup Statistics window opens and displays additional information about the Backup process.\\ ASDM Backup Statistics window showing backup progress and details 12. Click OK\\ ASDM backup completion confirmation dialog ## Restore Process 1. Establish a VPN connection to the MacStadium environment. 2. Connect to the firewall using the Cisco Adaptive Security Device Manager (ASDM). 3. Click Tools and select Restore Configuration from the dropdown menu.\\ ASDM Tools menu with Restore Configuration option highlighted 4. Navigate to the location where the backup file was stored.\\ Local file browser for selecting the backup ZIP file to restore 5. Click Select file. 6. Click Next to proceed.\\ ASDM Restore Configuration Next button to proceed after file selection 7. From the Restore Configurations pop-up page, select the options to restore. **Recommended settings:** * Running configuration * Start-up configuration * All Security Images * Identity Certificates * Leave the remaining default options untouched ASDM Restore Configurations dialog with recommended restore options selected 8. Click Restore. 9. You should now see the below message. Click Yes.\\ ASDM restore confirmation prompt asking to proceed with the restore If applicable, enter the Certificate Passphrase used to backup the identity Certificate, then click OK. ASDM Certificate Passphrase prompt during restore process The following message may appear during the Restore Progress. Select Refresh Now or Cancel button. Choosing Cancel will not halt the Restore process. ASDM restore progress message with Refresh Now option 10\. Once the Restore process is complete, click Close. The Progress Message can be copied to a text editor for review and validation. ASDM restore progress log showing completion 11\. To verify the restore process, close the ASDM application and then relaunch it. 12\. Review the configuration that is loaded with the device manager. 13\. Close the application. The following Unapplied Changes message box may appear: ASDM Unapplied Changes message box after restore * If the Unapplied Changes message box appears, then click Apply Changes. * If the Unapplied Changes message box does not appear, then click Save in the ASDM application. ## Additional Notes: * If firewall access enables the backup process but does not enable the restore process, then open a MacStadium Support ticket. * In the ticket, request that a restore take place for the firewall device. * Provide the Firewall IP, the backup file, and permissions to perform the restore in the ticket. * Request a specific time for the restore, or it will be performed as soon as possible. # Changing the VPN & Firewall Password Source: https://docs.macstadium.com/iaas/cisco-firewalls/changing-the-vpn-firewall-password Change your initial Cisco ASA/ASAv firewall and VPN password using the Cisco ASDM-IDM interface. Credentials for the change are in your MacStadium IP Plan. MacStadium provides the initial configuration of the firewall device, including a username and an initial password listed in the [IP Plan](/macstadium/macstadium-overview/ip-plan). Use these credentials to connect to the MacStadium cloud via VPN and to log in to the Cisco ASDM-IDM management interface of the firewall device. For security reasons, change this password. ## Change the password 1. Verify login [logged in to your firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 2. Click Configuration. ASDM Configuration button in the main toolbar 3. Select Device Management. 4. Select Users/AAA > User Accounts. 5. Select the username to log in to Cisco ASDM-IDM and click Edit. Do not edit the passwords for the enable and admin users. They are reserved for maintenance and support by the MacStadium team. 6. On the Identity screen, select the Change user password checkbox, set the new password, confirm it, and click OK. 7. At the bottom of the screen, click Apply. ## Next steps * Update any scripts, documents or connection settings with the latest password. * From the **Device Management > Users/AAA > User Accounts** interface, manage access to your cloud and the firewall by adding more users with specific [privilege levels](https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst3850/software/release/3se/security/configuration_guide/b_sec_3se_3850_cg/b_sec_3se_3850_cg_chapter_011.html#concept_F64909EAE01841CF83BDF991F2876CAE). # Checking the Firewall Version Source: https://docs.macstadium.com/iaas/cisco-firewalls/checking-the-firewall-version Find your Cisco ASA/ASAv software version and device model in ASDM-IDM or the CLI. Needed before downloading VPN configs or filing a support ticket. Sometimes, it is necessary to know the exact model of the Cisco ASA/ASAv device and its software version. For example, when downloading the VPN configuration file from Amazon, the following information is required: vendor, platform, and software version of the firewall device. ## Check model and version in Cisco ASDM-IDM 1. Verify login [logged in to your firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 2. In the menu bar of the running Cisco ASDM-IDM, select Help > About Cisco Adaptive Security Appliance (ASA).\\ ASDM Help menu with About Cisco Adaptive Security Appliance option selected 3. In the pop-up window, look for the following information: * Cisco Adaptive Security Appliance Software Version: Lists the software version of the firewall. For example: 9.8(2)24. * Device Manager Version: Lists the software version of the Cisco ASDM-IDM interface. For example: 7.8(2). * Model Id: Lists the device model. For example: ASAv5. ASDM About dialog showing software version, device manager version, and model ID ## Check model and version in the CLI 1. Verify login logged in to your firewall. 2. In the Cisco CLI, run the following command:\ `show version` 3. In the command response, look for the following information: * Cisco Adaptive Security Appliance Software Version: Lists the software version of the firewall. For example: 9.8(2)24. * Device Manager Version: Lists the software version of the Cisco ASDM-IDM interface. For example: 7.8(2). * Model Id: Lists the device model. For example: ASAv5. # Creating Local User Accounts on a Cisco ASA Source: https://docs.macstadium.com/iaas/cisco-firewalls/creating-local-user-accounts-on-a-cisco-asa Create local user accounts on a MacStadium Cisco ASA firewall using the CLI or ASDM. Used to manage VPN access via Cisco AnyConnect for specific users. ## Overview Creating local user accounts on a Cisco Adaptive Security Appliance (ASA) is an essential task for Network Administrators, and is done to secure their network resources. Local user accounts are useful for managing user access to the ASA and to the resources behind the ASA, through the use of a VPN client, such as Cisco AnyConnect. This document describes how to create local user accounts on the Cisco ASA, using both the command-line interface (CLI) and the Adaptive Security Device Manager (ASDM). This document is intended for those who are managing the subscribed Cisco ASA appliance and want to learn how to create local user accounts. The details in this document are based on a Cisco ASA virtual firewall that runs ASA code version 9.14(3)18 and ASDM version 7.18.(1)152, and was created from these devices in a specific lab environment. The device used in this document started with a cleared (default) configuration. For a live network, consider the potential impact before executing any commands. MacStadium configured a shared user account for customers to use for accessing the firewall. It was also used for authentication for the environment behind the firewall, and used a Remote Access VPN (RAVPN) client. This user account was configured with the highest access level. ## Getting Started To begin the steps on how to create additional local user accounts, obtain the existing account information from the [IP Plan](/macstadium/macstadium-overview/ip-plan). ## Install Options Updating the Cisco Adaptive Security Appliance (ASA) can be done two different ways: **Via Command Line Interface (CLI)** Using a CLI allows you to write script changes in a notepad and have those changes reviewed by someone before running them. This method is good for writing scripts. **Via Cisco Adaptive Security Device Manager (ASDM)** Using an ASDM allows you to make line-by-line changes, while using a graphical user interface (GUI). ## Via Command Line Interface (CLI) 1. Establish a VPN connection to the MacStadium environment. 2. Connect to the Cisco ASA using SSH. * *For more information, see the section Connect to the Cisco ASA using SSH.* 3. Use the credential documented in the IP Plan to authenticate; when prompted, enter a username and password. 4. Enter global configuration mode by typing the command `configure terminal` 5. Create the new user account by typing the command in the following format: `username username password password privilege priv_level` * The `username` keyword is a string from 3 to 64 characters long. The space and question mark characters cannot be used for usernames. * The `password` keyword is a string from 3 to 127 characters long. The space and question mark characters cannot be used within the passwords. * The `privilege priv_level` keyword sets the privilege level for the created user account. The `priv_level` is a numeric value ranging from 0 to 15. * By default, a user account has a privilege level of 2. * A level of 15 grants the user account the highest level of access. * Example: `ciscoasa(config)# username exampleuser1 password examplepassword privilege 1` 6. Save the configuration with the command `write memory` 7. Type the exit or end command to return to privileged mode of the ASA. To confirm the creation of the user account, enter the command show `running-config username` This command displays all the user accounts configured on the ASA. ``` ciscoasa# show running-config username username exampleuser1 password ***** pbkdf2 privilege 1 username clientuser1 password ***** pbkdf2 privilege 15 username admin password ***** pbkdf2 privilege 15 ciscoasa# ``` When a password is defined in the username command, the ASA creates an MD5 hash of it when it is saved for security purposes. When verifying configuration with the show running-config command, the username command does not show the actual password; it shows the encrypted password followed by the encrypted keyword. ### Testing a Newly Created Account 1. In privilege mode, enter the command `disable` 2. Enter the command `login` 3. At the Username prompt, enter the created username. 4. At the Password prompt, enter the created password. If the authentication is successful, then proceed to test the level of access for the user account either at the ASA or at the RAVPN client. ``` ciscoasa # disable ciscoasa > login Username: exampleuser1 Password: *************** ciscoasa > enable Password: ********* Password: *************** ``` **Unsuccessful Authentication** ``` [ exampleuser1 ] You do NOT have Admin Rights to the console ! ``` **Password** To remove a user account, use `no version` with the username that is being removed. **Removing a User Account** 1. Log into the firewall with an account different from the account being removed. 2. Enter global configuration mode by typing the command `configure terminal` 3. Enter the `no version` of the username command. 4. Enter the `exit` or `end command` to return to privilege mode. 5. Save the configuration with the command `write memory` 6. Verify the changes made with the command `show running-config username`. ``` ciscoasa# configure terminal ciscoasa(config)# no username exampleuser1 ciscoasa(config)# end ciscoasa# write memory Building configuration... Cryptochecksum: b327981a 7a0e4ca2 ba149024 d05c9ab5 24790 bytes copied in 0.60 secs [OK] ciscoasa# show running-config username username admin password ***** pbkdf2 privilege 15 username clientuser1 password ***** pbkdf2 privilege 15 ``` ## Via Cisco Adaptive Security Device Manager (ASDM) **Creating a Local User Account with ASDM** 1. Open the ASDM and connect to the Cisco Adaptive Security Appliance (ASA). 2. Click Configuration.\\ ASDM Configuration button in the main toolbar 3. Click Device Management.\\ ASDM Device Management section in the configuration panel 4. Click Users/AAA.\\ ASDM Users/AAA menu under Device Management 5. Click Add to create a new user account. 6. In the Add User Account window, confirm that Identity is selected at the left of the window and then enter the username and password for the new user account. * Specify a Access Restriction by selecting an option in the section below.\\ Add User Account dialog with username, password, and access restriction fields 7. Click OK to save the new user account 8. Click Apply located at the bottom of the ASDM 9. Click Save Test the new account by logging out of the ASDM and then logging back in with the new credentials. #### **Removing an Account from the Local Database** 1. Under the User Accounts of the ASDM, select the user account to be removed. 2. Click Delete 3. Click Apply 4. Click Save For information on Advanced Options for user account creations and management, see the following guides: [Cisco ASDM 7.18 AAA Local User Guide](https://www.cisco.com/c/en/us/td/docs/security/asa/asa918/asdm718/general/asdm-718-general-config/aaa-local.html) [Cisco ASA 9.14 AAA Local User Guide](https://www.cisco.com/c/en/us/td/docs/security/asa/asa914/configuration/general/asa-914-general-config/aaa-local.html) ## Connect to the Cisco ASA using SSH 1. Configure aaa to use local database for ssh and console: ``` ciscoasa# aaa authentication ssh console LOCAL ``` `aaa` = authentication (permitting access), authorization (specify commands when granted access), accounting (keeps track of utilization reports of users after logged in and generates accounting reports for billing). `LOCAL` = local database. 2. Create admin username with privilege 15: ``` ciscoasa# username username password P@ssw0rd priv 15 ``` `priv 15` = top privilege level (full superuser, can give different command access to different privilege levels). 3. Turn on password for enable: ``` ciscoasa# aaa authentication enable console LOCAL ``` This forces a password for the enable prompt. 4. Turn on serial console authentication: ``` ciscoasa# aaa authentication serial console LOCAL ``` This turns on user/pass for serial access. 5. Save changes: ``` ciscoasa# write mem ``` 6. Log out console and verify access. `ciscoasa(config)# end` `ciscoasa# exit` `Username: username` `Logoff` `Password: ********` 7. Generate ssh key pair: ``` ciscoasa# crypto key generate rsa modulus 4096 ``` SSH is an encrypted protocol that uses RSA to generate public and private keys. `4096` = block size, `rsa` = encryption algorithm. The prompt will show `Keypair generation process begin. Please wait…` followed by `ciscoasa(config)#`. 8. Allow access to the inside interface: ``` ciscoasa# ssh 0.0.0.0 0.0.0.0 inside ``` This enables SSH access to the inside interface from any IPv4 address. 9. Force ssh version 2: ``` ciscoasa# ssh version 2 ``` 10. Add a 15-minute timeout to ssh: ``` ciscoasa# ssh timeout 15 ``` 11. Verify login with ssh through 192.168.1.1 in putty. # Firewall Change Request Form Source: https://docs.macstadium.com/iaas/cisco-firewalls/firewall-change-request-form Download the MacStadium Firewall Change Request Form (Word doc) and submit to the support team to request Cisco ASA/ASAv firewall configuration changes. ## About [Download the Firewall Change Request Form here](https://prismic-io.s3.amazonaws.com/macstadium/80237b25-a824-478a-9ef0-fd2211aa79bf_MacStadium+Firewall+Change+Request+Form.docx) (Microsoft Word document) and share it with the MacStadium Support team by opening a ticket or emailing [support@macstadium.com](mailto:support@macstadium.com). # Logging into Cisco Firewall Source: https://docs.macstadium.com/iaas/cisco-firewalls/logging-into-cisco-firewall Log into your MacStadium Cisco ASAv via ASDM-IDM. Prerequisites: Java installed, active VPN, and credentials from the MISC sheet in your IP Plan. ## Download and install Cisco ASDM-IDM The dedicated Cisco firewall comes with a management interface: **Cisco ASDM-IDM**. 1. Make sure the VPN is connected. For more information about how to connect to the VPN, see [Connecting to Your Cloud (via VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Confirm that Java is installed on the system. Download and install an official Java distribution from [Oracle](https://www.oracle.com/technetwork/java/javase/downloads/index.html). Java installations from package managers or OpenJDK installations might not work. 3. In the browser, navigate to the Cisco ASDM-IDM download location provided in the MISC sheet of the [IP Plan](/macstadium/macstadium-overview/ip-plan). 4. Ignore the certificate warning and proceed to the address. 5. Click Install ASDM Launcher. 6. When prompted for credentials, provide the VPN credentials with Cisco AnyConnect. They are in the Step 1: VPN section of the One Page sheet of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * For more information about how to change the VPN & firewall password, see [Changing the VPN & Firewall Password](/iaas/cisco-firewalls/changing-the-vpn-firewall-password). 7. Launch the downloaded installer. 8. (macOS-only) If prompted that the installer cannot be opened because it is from an unidentified developer, then complete the following steps. * Navigate to **System Settings > Privacy & Security > General**. * Locate the `"Cisco ASDM-IDM" was blocked from opening because it is not from an identified developer.` note and click Open Anyway. * In the pop-up window, click Open and confirm the required permissions. After the installation completes, the Cisco ASDM-IDM Launcher loads. ## Log into the firewall Use the Cisco ASDM-IDM Launcher to reach and configure the firewall. 1. Run the Cisco ASDM-IDM Launcher, if not already running. 2. Enter the following data and click OK: * For Device IP Address / Name, provide the IP address from the MISC sheet of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * For Username and Password, provide the VPN credentials used with Cisco AnyConnect. They are in the Step 1: VPN section on the One Page sheet of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * **TIP**: If nothing happens or a connection error occurs, then confirm the VPN connection and try again. 3. If prompted that the connection is untrusted, click Continue. The first time connecting to it might take longer, due to software updates. * **TIP**: Keep the VPN password handy. Cisco ASDM-IDM might prompt for it at different times. # Managing Cisco ASA firewall interfaces via ASDM Source: https://docs.macstadium.com/iaas/cisco-firewalls/managing-interfaces View and configure Cisco ASA firewall interfaces using the ASDM graphical management tool. Access settings via Configuration, Device Setup, and Interfaces. Manage interfaces via the Cisco Adaptive Security Device Manager (ASDM), which is done via **Configuration > Device Setup > Interfaces**. The Cisco ASDM delivers world-class security management and monitoring through an intuitive, easy to use management interface. As ASDM is a client, it can run on workstations, desktops, and laptops. The Misc tab on the IP Plan contains specific instructions and links for downloading the Cisco ASDM client. ## Plan Misc Tab Once behind the firewall via VPN, access the environment either via ASDM or by Secure Shell (SSH). ## ASDM Data Sheet The ASDM data sheet can be [found here](https://www.cisco.com/c/en/us/products/security/asa-5500-series-next-generation-firewalls/data_sheet_c78-345385.html). ## DMZs A DMZ is a server reachable by outside IP addresses, but which can also communicate with inside IP addresses, too. It provides a method of communication between inside and outside IP addresses. Customers ultimately define their own DMZs. This can also be configured via ASDM. * [Cisco ASA DMZ Configuration Example](https://www.speaknetworks.com/cisco-asa-dmz-configuration-example/) * [Configure a Public Server with Cisco ASDM](https://www.cisco.com/c/en/us/support/docs/security/asa-5500-x-series-next-generation-firewalls/113425-asdm-pub-server-00.html) * [How to Set up a Cisco ASA DMZ](https://www.youtube.com/watch?v=eeTZZN5U858) (video) ## Logging Firewalls can log how they handle various types of traffic. For forensic purposes, information like source and destination IP addresses, port numbers, and protocols can be invaluable. However, the downside of logging is that the size of log files can quickly become unwieldy. Because of this, MacStadium has logging turned off by default. However, it is easy to change and configure this setting to capture traffic details. To turn *logging* on, you first need to identify a repository for the log information. MacStadium recommends designating a separate repository for those log files, because it can grow quickly. You can set this in ASDM via **Monitoring > Logging**. You can also submit a firewall change request via the MacStadium Portal to select a new repository. If you run CI as a service, port those logs to a separate server. Otherwise, speed, storage, and performance may be impacted. MacStadium also recommends leaving logging disabled, especially for internal-only configurations. For more information, see [Cisco Logging Best Practices](https://tools.cisco.com/security/center/resources/firewall_best_practices#43). ### Command Line Interface For expert users, the Command Line Interface (CLI) can provide an elegant and convenient option for configuring your firewall. To access the CLI, first connect via your VPN. Then SSH to the IP address of the inside interface found in your connection information available via the MacStadium portal. ## Command Line Interface (CLI) [Cisco ASA 5500 Series Command Reference, 8.2](https://www.cisco.com/c/en/us/td/docs/security/asa/asa84/configuration/guide/asa_84_cli_config.html) ## Connecting to Another Public Cloud ### Site to Site VPN Site to Site VPNs are designed to connect a firewall to a firewall, a router to a router, or a router to a firewall. With a Site to Site VPN properly configured, MacStadium customers can connect their environments to an AWS implementation or another public cloud. MacStadium supported Site to Site VPN is a standard IPsec site-to-site implementation. Most customers can set that up in ASDM very similarly to how they create other VPN connections, via the VPN Wizard. Wizards > Site-to-Site VPN Connection Setup Wizard The VPN Wizard by default creates the most generic and compatible tunnel you can make. MacStadium supports two versions, traditional Internet Key Exchange (IKE) methods IKEv1 vs IKEv2. More information on configuring each can be found below: * [Configuring Internet Key Exchange Version 2 (IKEv2)](https://www.cisco.com/en/US/docs/ios-xml/ios/sec_conn_ike2vpn/configuration/15-2mt/sec-cfg-ikev2-flex.html) * [Configure IKEv1 IPsec Site-to-Site Tunnels with the ASDM or CLI on the ASA](https://www.cisco.com/c/en/us/support/docs/security/asa-5500-x-series-next-generation-firewalls/119141-configure-asa-00.html) * [Configure a Site-to-Site IPSec IKEv1 Tunnel Between an ASA and a Cisco IOS Router](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/119425-configure-ipsec-00.html) * [Cisco ASA Site-to-Site IKEv1 IPSec VPN](https://networklessons.com/cisco/asa-firewall/cisco-asa-site-site-ikev1-ipsec-vpn) ## IPSec VPN If your optimum environment requires an IPSec VPN connection, MacStadium supports this method of connection. Be aware that IPSec VPN is no longer supported by Windows post Windows 8. However, Macs still support this method of connection out of the box. For specific instructions on configuring an IPSec VPN from macOS, see [How to Setup an IPSec VPN Connection from macOS](https://support.apple.com/en-gb/guide/mac-help/mchlp2963/mac). ## Virtual Tunneling Interface (VTI) MacStadium also supports IPSec VTI. Tunnel interfaces have many uses, including participating in a larger VPN configuration. MacStadium supports a Border Gateway Protocol (BGP) based tunnel. This is the best method for connecting to an AWS implementation. Be advised VTI is not supported on older model ASA appliances (5585, 5540, etc). ## IPSec Virtual Tunnel Interface If you want to have lots of VMS that live on a few IP addresses, you may want to utilize port forwarding instead of the internal public addresses. Port forwarding is a method of making your MacStadium private cloud accessible to specific IP addresses on the internet, even though you are behind a firewall. Port forwarding to VMs must be statically defined on the firewall. [Configure ASA Version 9.x Port Forwarding with NAT](https://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/118996-config-asa-00.html) ## Rules You can create custom rules for your firewall as if it was in your own environment. Rules can be configured in ASDM via **Configuration > Firewall > Access Rules**. ## Best Practices * Keep in mind that rules are processed in order. * Only create rules on the outside interface, and leave others saying “any.” * Unless you are an expert, we recommend that you don’t filter any outbound traffic. If you do choose to filter outbound traffic, be very specific with ALL traffic heading outbound so you don’t inadvertently block legitimate traffic. Start by using a rule that permits everything and then narrow down. * You will need both a Network Address Translation (NAT) rule and an access rule working in conjunction, as either alone won’t work. A typical use case would be creating an SSH rule tied to a Jenkins master (if you don’t use a VPN). * If you don’t have experience with ASAs, just do a 1:1, where one internal IP address behind the interface is mapped to one external IP address. ## Dynamic Host Configuration Protocol (DHCP) If DHCP is integral to your solution, you can use a VM on your network to control it. Keeping DHCP on a separate VM keeps your environment safe in case you need to restart your DHCP server. ## Configuring the Cisco IOS DHCP Server ### DHCP Relay DHCP Relay permits DHCP clients and servers to be placed on numerous networks. The DHCP relay agent will respond to a broadcasted “discover” request and reply to the relay server. It sends the offer back to the DHCP device and sends it back to the original requester. ### Configuring the Cisco IOS DHCP Relay Agent Documentation can be found [here](https://www.cisco.com/en/US/docs/ios/12_4t/ip_addr/configuration/guide/htdhcpre.html). ## Best Practices for Continuous Integration CI/CD projects are by their nature unique, and hence will also benefit from a custom firewall configuration that corresponds to your individual needs. MacStadium recommends putting your build farm elements in private space. This allows environments to grow and shrink on demand. Another reason to place these elements in private space is that a lot of CI/CD traffic is necessarily east/west. If they all live in the same VLAN, then communications between VMs can be direct and not have to go through the firewall. ## Support If you require additional help with your firewall, please contact MacStadium support. # Network Firewalls Cloud Connect VPN Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-cloud-connect-vpn Connect to your MacStadium Orka cluster via Cisco ASAv VPN with OpenConnect or Cisco AnyConnect. Requires server address and credentials from your IP Plan. **Requirements:** * The server address from **Step 1: VPN** in the [IP Plan](/macstadium/macstadium-overview/ip-plan). * The username and password from **Step 1: VPN** in the [IP Plan](/macstadium/macstadium-overview/ip-plan). ## About To protect the environment, MacStadium deploys the Orka cluster with a dedicated [Cisco Adaptive Security Virtual Appliance](https://www.cisco.com/c/en/us/products/collateral/security/adaptive-security-virtual-appliance-asav/datasheet-c78-733399.html) (ASAv) firewall. Cisco ASAv runs the same software as physical Cisco ASAs and delivers full ASA firewall and VPN capabilities to the cloud. The Orka cluster sits behind its dedicated Cisco ASAv firewall, which must be connected to the cluster via VPN to do any of the following tasks: * Manage the Orka VMs and K8s pods. * Log in to the firewall and manage connectivity between the cluster and the outside world (for example, enterprise networks, other private and public clouds). MacStadium has pre-configured the firewall and has enabled VPN access. Simply run a VPN client and provide the server address and credentials for the connection. ## Overview **(Open-source option) OpenConnect** For users who are comfortable working with a Command Line Interface (CLI) or in a Terminal, consider using OpenConnect - an open-source VPN client available from the command line. **Download and Install OpenConnect** * If [Homebrew](https://brew.sh/) is enabled on the system, then run `brew install openconnect` from the command line. * Windows users, can [download](https://www.infradead.org/openconnect/download.html) and [build](https://www.infradead.org/openconnect/building.html) the OpenConnect package or use [Cisco AnyConnect](/iaas/cisco-firewalls/network-firewalls-cloud-connect-vpn) instead. **Configure OpenConnect to Access Orka via Custom Domain** To be able to reach the custom Orka domain API endpoint, add a DNS server to the network configuration. The DNS server address is the `.251` address for the `Private-1` network from the [IP Plan](/macstadium/macstadium-overview/ip-plan). For example: `10.10.10.251` or `10.221.188.251`. **macOS** 1. Go to **System Settings > Network**. 2. From the list of network connections, select the current Internet connection, locate and click the Advanced... button at the right bottom corner of the dialog. 3. Go to the DNS tab. 4. At the bottom of the DNS Servers list, click **+**. 5. Type the Orka DNS address and press Enter. 6. If not already at the top, drag and drop the Orka DNS server to the top. It must be the first item in the list. 7. Click **OK.** 8. Click **Apply.** 9. Exit **System Settings**. **Linux** 1. Use a text editor to open `/etc/resolv.conf`. 2. Locate the nameserver section and add the Orka DNS address: ``` nameserver ``` 3. Make sure that this is the first nameserver entry in the list. **Windows** 1. Go to **Control Panel > Network and Internet**. 2. Under Network and Sharing Center, select View network and status. 3. In the Network and Sharing Center, in the sidebar, select Change adapter settings. 4. In the Network Connections window, right-click the current Internet connection and select Properties. 5. Go to the Networking tab, scroll down and click Internet Protocol Version 4 (TCP/IPv4). 6. With Internet Protocol Version 4 (TCP/IPv4) highlighted, click Properties. 7. Go to the General tab and select Use the following DNS server addresses. 8. Add the Orka DNS server as the Preferred DNS server. Add any other name server as the Alternate DNS server (for example, 8.8.8.8). 9. Click **OK**. 10. Click **Close**. ### Use OpenConnect 1. From the command line, run the following command. Replace `` with the server address from Step 1: VPN in the IP Plan. ``` sudo openconnect --protocol=anyconnect // OR if running on Windows openconnect --protocol=anyconnect ``` 2. Follow the prompts. * On the immediate Password prompt, provide the sudo password (the password for the current computer user) and press Enter. * On the Enter 'yes' to accept, 'no' to abort; anything else to view: prompt, type yes and press Enter. * On the Username prompt, provide the username from Step 1: VPN in the IP Plan and press Enter. * On the Password prompt, provide the password from Step 1: VPN in the IP Plan and press Enter. When the connection is established, a similar output (show below) appears: openconnect-1.png **Want to terminate the VPN connection?** At any time press `Ctrl+C` on the command line. ## Cisco AnyConnect Secure Mobility Client Cisco firewalls are designed to work with the [Cisco AnyConnect Secure Mobility Client](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/tsd-products-support-series-home.html) as a VPN client. For a GUI VPN client or that is running on Windows, use Cisco AnyConnect. ### Download and install Cisco AnyConnect 1. In the browser, navigate to the server address from Step 1: VPN of the [IP Plan](/macstadium/macstadium-overview/ip-plan). Use https\://. 2. Ignore the certificate warning and proceed to the address. 3. When prompted, enter the credentials from Step 1: VPN in the IP Plan.\\ openconnect-2.png 4. When prompted, download, install, and run the Cisco AnyConnect desktop client.\\ openconnect-3.png ### Configure AnyConnect to access Orka via custom domain On Windows, to be able to reach the custom Orka domain with AnyConnect, add a DNS server to the network configuration. On macOS and Linux, no changes are required. The DNS server address is the `.251` address for the `Private-1` network from the [IP Plan](/macstadium/macstadium-overview/ip-plan). For example: `10.10.10.251` or `10.221.188.251`. **Windows** With Cisco AnyConnect already connected to your cluster: 1. Go to **Control Panel > Network and Internet**. 2. Under Network and Sharing Center, select View network and status. 3. In the Network and Sharing Center, in the sidebar, select Change adapter settings. 4. In the Network Connections window, right-click Cisco AnyConnect Secure Mobility Client Connection and select Properties. 5. Go to the Networking tab, scroll down and click Internet Protocol Version 4 (TCP/IPv4). 6. With Internet Protocol Version 4 (TCP/IPv4) highlighted, click Properties. 7. Go to the General tab and select Use the following DNS server addresses. 8. Add the Orka DNS server as the Preferred DNS server. You can add any other name server as the Alternate DNS server (for example, 8.8.8.8). 9. Click **OK**. 10. Click **Close**. ### Use Cisco AnyConnect 1. Run Cisco AnyConnect Secure Mobility Client. 2. When prompted, enter the server address from Step 1: VPN of your IP Plan and click Connect. ciscologin.png 3. If prompted that an untrusted server was blocked, perform the following steps: * Click Change Setting... and deselect Block connections to untrusted servers. * Close the Preferences - VPN window. * Click Connect again. blockconnections.png 4. If prompted that the server certificate is untrusted, click Connect Anyway. 5. When prompted, provide login credentials and click **OK**. # Network Firewalls Configuration Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-configuration Overview of the MacStadium Cisco ASAv firewall: admin root access, available configuration options, and how to request changes via the Customer Portal. Every MacStadium private cloud deploys with a dedicated Cisco firewall to protect and secure the entire infrastructure. MacStadium dedicated firewalls provide admins with root access to the firewall and the ability to configure settings to their specifications. This guide describes some of the most popular configuration and customization options available to MacStadium customers. ## Getting Started Many customers simply submit a ticket via the [MacStadium portal](https://portal.macstadium.com/) with their firewall configuration requests. ### Cisco Adaptive Security Virtual Appliance (ASAv) MacStadium offers Cisco Adaptive Security Virtual Appliance (ASAv), which runs the same software as physical Cisco ASAs. This means that we are able to deliver full ASA firewall and VPN capabilities to cloud environments that help safeguard traffic and multitenant architectures. Optimized for data center deployments, the ASAv is designed to work as a virtual machine. The advantage for MacStadium customers of using a virtual firewall comes from faster deployments and easier upgrades. We recommend ASAv firewalls for all use cases that have sustained throughput demands of less than 500 Mbps (125 Mbps Encrypted) as it delivers exceptional security and performance at a great price. With a Cisco ASAv protecting their MacStadium private cloud, customers can: * Implement uniform security across multiple physical and virtual domains * Accelerate provisioning with predetermined configurations * Simplify management by using representational state transfer (REST) APIs to manage the device, easily introduce Cisco ASAv into software-defined networking (SDN) environments, and incorporate ASAv into custom policy-orchestration systems. The virtual appliance supports the same site-to-site VPN, remote-access VPN, and client-less VPN functionalities that physical ASA devices do. Most of the features that are supported on a physical ASA by Cisco software are also supported on the virtual appliance, with the notable exceptions of Cisco not supporting clustering and multiple contexts support (that is to say, having multiple separate *virtual* firewalls on the same hardware) on ASAv implementations. ### Cisco Adaptive Security Appliance (ASA) MacStadium also offers physical ASA hardware devices for customers who require those capabilities or need more throughput than a virtual firewall can handle. The standard appliance MacStadium offers is a Cisco ASA 5500 series firewall, and is for any customer who needs a dedicated, physical security appliance to protect their host environment. When customers need even more power for inspection and protection, MacStadium also offers Cisco Firepower 2100 NGFW series appliances. The main difference between the two appliances is in an increase of 10 gigs per second in speed, connections and packets per second for the 2100 series. Both the Cisco 5500 and 2100 series deliver: Market-proven security capabilities that integrate multiple full-featured, high-performance security services, including application-aware firewall, SSL and IPsec VPN, IPS, antivirus, anti-spam, anti-phishing, and web filtering services. Comprehensive management interfaces including the graphical Cisco Adaptive Security Device Manager (ASDM), a comprehensive command line interface (CLI), verbose syslog, and Simple Network Management Protocol (SNMP) support that round out a rich complement of management options. For more information, please contact MacStadium Support or Sales. Hardware firewalls are not typically available during free trials or POC periods. ## Other Options There are several firewall options for users who do not want to use Cisco ASA technology. ### Software Firewalls By default, MacStadium gives the maximum flexibility by leaving all ports open to the internet. Because of this, it is highly recommended to implement another form of defense when not using the MacStadium dedicated Cisco firewall. There is a comprehensive list of third party software firewalls, including feature and price comparisons, at Mac Security: Firewalls. Please be advised that MacStadium does not offer support for third party software firewall solutions. Also, please take the time to understand the potential impacts of enabling a third-party firewall. If errors exist in the configuration, then there is an increased risk of a data breach. As always, keep the credentials in a safe place. ### macOS X Firewall Apple also includes a serviceable firewall with OSX. Information on its capabilities and how to enable it can be found at OS X: About the application firewall. #### Customized and Hybrid Deployments We understand that many customers have unique security requirements and may wish to host their own firewalls in our data centers. Our engineering team has detailed experience with many other security appliances and can assist your team in implementing your best possible network security configuration. You can access firewall add-ons from the MacStadium Portal under the **Add-Ons** tab in your subscription details. Please contact Sales for more information. ### Configuring Access After submitting a private cloud request, the MacStadium provisioning team creates a ticket accessible via the MacStadium portal that contains the connection information. The IP plan contains necessary information including how to gain access to the private cloud, instructions for accessing vCenter client (unless it is a bare metal implementation), IP allocation, and host assignments. Setting up Access with a Remote Access Virtual Private Network (VPN) For security reasons, outside access to the firewall is blocked by default. The recommended method, and the one most MacStadium customers follow, is to access private cloud via a Remote Access Virtual Private Network (VPN). MacStadium IP Plan showing VPN connection information and credentials VPN is the easiest way to securely connect to MacStadium private cloud. The recommended method of doing this is via the AnyConnect client. Instructions for configuring and connecting are here: Configure Cisco AnyConnect Secure Mobility Client If the connection information mentions Group Authentication, then configure an IPSec VPN connection. Instructions for doing so on macOS and Windows installations follow: MacStadium IP Plan showing IPSec VPN group authentication configuration This tutorial (images only) displays how to deploy a virtual machine using the VMware web client. For more information concerning VMware and the VMware vCenter Server Virtual Appliance (vCSA), see the VMware Quick Start Guide. ### IP Allocation and Host Assignments a4721e1-5be45d861ec311056ee262a5_ipallocation.png MacStadium defines four basic interface types for customer use: 1. Outside: External firewall management addresses 2. Inside: /28 range 3. ESXi-MGMT: Reserved for vCenter & ESXi hosts (should not have public IP addresses) 4. Private: Random private range assigned for your use – by default no outside access allowed What interfaces appear in the initial connection information on the MacStadium portal depends on your private cloud configuration request. For instance, for a bare metal implementation, there is no information concerning ESXi management and vCenter. # Network Firewalls for CI Build Node: Ansible Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-for-ci-build-node-ansible Set up a macOS CI build node with the MacStadium Ansible playbook. Installs Homebrew, Xcode, fastlane, CocoaPods, and optionally Java for Jenkins. This guide details how to install the build tools needed to set up a CI Build Node using Ansible. Minimum requirements: * [Homebrew](https://brew.sh/) * [fastlane](https://fastlane.tools/) * [CocoaPods](https://cocoapods.org/) * [Xcode](https://developer.apple.com/xcode/) * [Java 8](https://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html) is also a requirement to set up a Jenkins agent Finally, it is a good practice to have a bot user whose only responsibility is to build your OSX/iOS projects. This means such a user with the correct permissions should be created, so the user can build OSX/iOS projects. The recommended way to set up a CI Build Node is to use [Ansible](https://www.ansible.com/). Ansible is a configuration management tool that is used to automate the setup of a specific system. It can define the system as code. This makes changes to a specific system easier and most importantly, track who changed what and how. Users unfamiliar with Ansible, should read [quickstart video](https://www.ansible.com/resources/videos/quick-start-video). It gives a good idea of what Ansible is and how it can be used. MacStadium provides an [Ansible playbook](https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html) that takes care of the installation and setup of the tools need for a CI Build Node. The playbook is open-source and can be found [here](https://github.com/macstadium/ansible-playbook-osx-ci-setup). The playbook works for OSX High Sierra and Mojave. It is capable of installing Xcode 8 and above. If you are using an older OSX version or require an older Xcode version, refer to our manual installation guide. The playbook is intended to be executed on the machine to set up as a CI Build Node. To execute the playbook remotely, to configure another [Ansible inventory](https://docs.ansible.com/ansible/2.4/intro_inventory.html). The Xcode installation requires a UI session. This means the user that executes Ansible must be logged in. For example, if Ansible with admin is executed, then the user must make sure that this user is logged in. This is achieved via VNC or via the Web Console. ## Ansible Playbook ### Initial setup The first step is to connect to the target machine. Do this via VNC or via the Web Console, or enable Remote Login in the macOS settings, then SSH in. To download and run the setup script contained in the [repository](https://github.com/macstadium/ansible-playbook-osx-ci-setup). To do that run the following commands: ``` curl https://raw.githubusercontent.com/macstadium/ansible-playbook-osx-ci-setup/master/scripts/ansible_setup.sh -o ~/ansible_setup.sh chmod +x ~/ansible_setup.sh sudo ~/ansible_setup.sh ``` This installs: * Xcode Command Line Tools * [pip](https://pip.pypa.io/en/stable/) * [Ansible](https://www.ansible.com/) Now clone the [repository](https://github.com/macstadium/ansible-playbook-osx-ci-setup) containing the Ansible playbook. This is done by running: ``` git clone https://github.com/macstadium/ansible-playbook-osx-ci-setup.git ``` This playbook consists of two roles: * [OSX-CI](https://github.com/macstadium/ansible-role-osx-ci) - Installs all common tooling and creates a user capable of running build jobs * [Xcode](https://github.com/macstadium/ansible-role-xcode) - Installs and configures Xcode To install these two roles execute: ``` cd ansible-playbook-osx-ci-setup ansible-galaxy install -r requirements.yml ``` ## OSX-CI Role Requirements The [OSX-CI](https://github.com/macstadium/ansible-role-osx-ci) requires a path to a public ssh key on the target machine. The role adds the key to the `authorized_keys` file of the created user to enable remote login via ssh with a private key. To use the target machine as a Jenkins agent you will need a key pair generated using the `RSA` algorithm. If you do not have a ssh key pair you can create one by executing on the target machine: ``` ssh-keygen -m PEM -t rsa -C "build machine key" -f "buildMachine_rsa" ``` For increased security, it is recommended to associate a passphrase to the private key. The command creates two files: * buildMachine\_rsa - This is the private key. Keep it safe and **do not** share it with anyone. * buildMachine\_rsa.pub - This is the public key. To copy the private key to a secure machine, use `scp`. This command executes copy over SSH; run: ``` scp /path-to-buildMachine_rsa/ username@host:/path-to-location-on-secure-machine ``` ## Xcode Role Requirements The [Xcode](https://github.com/macstadium/ansible-role-xcode) needs a Xcode xip file to be present on the target machine. Get the version needed from the [Apple Downloads Page](https://developer.apple.com/download/more/). ## Password Encryption The playbook requires a privilege escalation password: ``` ansible_become_pass ``` To specify a password which will be used to create a default keychain for the build user: ``` ci_user_default_keychain_password: ``` It is highly recommended not to pass the passwords in plain text. To encrypt use [Ansible Vault](https://docs.ansible.com/ansible/latest/user_guide/playbooks_vault.html). Add the variable to `group_vars/all.yml` and execute the following command: ``` ansible-vault encrypt group_vars/all.yml ``` A vault password is required and is later used to decrypt the file. Once the operation is executed the file is encrypted. ## Running the Ansible Playbook To execute the Ansible playbook you can use the following command by replacing the `{placeholders}` with the correct values: ``` ansible-playbook site.yml -i inventory -e ansible_user={AdminUser} -e xcode_xip_location={XcodeLocation} -e xcode_major_version={XcodeMajorVersion} -e ci_user_public_key_location={PublicSshKeyLocation} --ask-vault-pass ``` You will be prompted for the vault password that you used to encrypt the `group_vars/all.yml` file in the previous step. Once the execution is completed, you will have a fully-setup machine that you can use for OSX/iOS builds and for a Jenkins agent. # Network Firewalls for CI Build Node: Homebrew Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-for-ci-build-node-homebrew Set up a macOS CI build node on MacStadium with Homebrew: install Ruby, fastlane, CocoaPods, and Xcode, with bot user best practices for iOS builds. This guide details how to install the build tools needed to set up a CI Build Node using Homebrew. Minimum requirements: * [Homebrew](https://brew.sh/) * [fastlane](https://fastlane.tools/) * [CocoaPods](https://cocoapods.org/) * [Xcode](https://developer.apple.com/xcode/) * [Java 8](https://www.oracle.com/technetwork/java/javase/overview/java8-2100321.html) is also a requirement to set up a Jenkins agent It is a good practice to have a bot user whose only responsibility is to build your OSX/iOS projects. This means such a user with the correct permissions should be created, so the user can build OSX/iOS projects. Do this via VNC or via the Web Console, or to enable Remote Login in the macOS settings, set SSH in. ## Install Homebrew [Homebrew](https://brew.sh/) is a package manager for macOS and used for managing installation of the various tools needed for iOS and macOS CI efforts. This step takes about 15 minutes, and requires the password at least once. ## Install Ruby Lots of tooling requires a modern Ruby installed (fastlane for instance), so we also update our system Ruby: ``` /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" brew install rbenv ruby-build # Add rbenv to bash so that it loads every time you open a terminal echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile source ~/.bash_profile # Install Ruby rbenv install 2.4.2 rbenv global 2.4.2 ruby -v ``` ## Install fastlane [fastlane](https://fastlane.tools/) provides an easy way to automate beta deployments and releases for iOS and Android apps. To install it, run: ``` sudo gem install fastlane -NV ``` ## Install CocoaPods [CocoaPods](https://cocoapods.org/) is a dependency manager for Swift and Objective-C Cocoa projects. It is installed via ruby gem: ``` sudo gem install cocoapods ``` ## Install Node.js To install the latest version of Node.js run: ``` brew install node ``` To install the latest LTS run: ``` brew install node@10 brew link node@10 --force ``` This installs Node.js 10 LTS and links it to `/usr/local/bin` so it is available in `PATH`. Consider using [nvm](https://github.com/creationix/nvm) to manage different Node.js versions. To install nvm run: ``` curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash ``` ## Install Java 8 To setup a Jenkins agent, Java 8 must be installed on the machine. To do that, run: ``` brew tap homebrew/cask-versions brew cask install java8 ``` ## Install Xcode Do this is via a VNC/screen-sharing session. If working from a Mac, open the Finder and press "cntrl k". This opens the machine's built-in VNC GUI. Collect your public IP and screen-sharing port, and pass them in the GUI. 1. Enter the user credentials. 2. Open a web browser via the screen-sharing connection. 3. Navigate to [developer.apple.com](https://developer.apple.com) 4. Log in 5. Navigate to [developer.apple.com/downloads/more](https://developer.apple.com/downloads/more) 6. Download and install the preferred version of Xcode by clicking the download link and double-clicking on the resulting download. ## Creating Dedicated Build User MacStadium recommends having a dedicated user that is responsible for building OSX/iOS applications. First, create a group for this user. The group needs to have a unique ID. List the current group IDs in a numerical order by running: ``` dscl . -list /Groups PrimaryGroupID | awk '{print $2}' | sort -n ``` Choose a number that is not in the list. Then run by replacing \{GroupName} and \{GroupID} with the desired values: ``` sudo dscl . -create /Groups/{GroupName} sudo dscl . -create /Groups/{GroupName} PrimaryGroupID {GroupID} ``` Pick a unique ID for the user. It is done in a similar fashion to the way we chose the group ID: ``` dscl . -list /Users UniqueID | awk '{print $2}' | sort -n ``` Finally, run by replacing the placeholders: ``` sudo dscl . -create /Users/{UserName} sudo dscl . -create /Users/{UserName} UserShell /bin/bash sudo dscl . -create /Users/{UserName} UniqueID {UserID} sudo dscl . -create /Users/{UserName} PrimaryGroupID {GroupID} sudo dscl . -create /Users/{UserName} NFSHomeDirectory /Users/{UserName} ``` Ensure a home folder is created for the user: ``` sudo mkdir /Users/{UserName} sudo chown {User}:{GroupName} /Users/{UserName} ``` ## Creating Default Keychain for the Build User Since the build user will not log into the OSX machine, a default keychain will never be created.\ This could cause build and/or code sign issues (especially when using fastlane). To create a default keychain for the build user, switch to the build user in the terminal: ``` sudo su {Username} ``` Execute commands as the build user: ``` security create-keychain -p {KeychainPassword} login.keychain security default-keychain -s login.keychain ``` This creates new keychain called `login.keychain`and makes it default for the build user.\ The security command line tool has a bug and does not add the new keychain to the list of available keychains. To fix this, call: ``` security list-keychains -d user -s {Keychain} ``` Proceed with the rest of the setup. To switch back to the previous user type: ``` exit ``` ## Logging Remotely with the Build User Remote logging is required. To log remotely with the newly created build user and ensure the user can log remotely: ``` sudo systemsetup -setremotelogin on sudo dseditgroup -o edit -a {UserName} -t user com.apple.access_ssh ``` Create an SSH key pair to use for remote logging. If an SSH key pair does not exist, then create one by executing: ``` ssh-keygen -m PEM -t rsa -C "build machine key" -f "buildMachine_rsa" ``` For increased security, it is recommended to associate a passphrase to the private key. The command creates two files: * buildMachine\_rsa - This is the private key. Keep it safe and do not share it with anyone. * buildMachine\_rsa.pub - This is the public key. To copy the private key to a secure machine, use `scp`. This command executes copy over SSH; run: ``` scp /path-to-buildMachine_rsa/ username@host:/path-to-location-on-secure-machine ``` To create a `authorized_keys` file. It lists all keys that can be used to log remotely with a given user: ``` sudo su {UserName} mkdir ~/.ssh cat buildMachine_rsa.pub >> ~/.ssh/authorized_keys chmod 644 ~/.ssh/authorized_keys exit ``` Use the private key to log to the machine remotely using the newly created user: ``` ssh {UserName}@{host} -i {path-to-private-key} ``` # Network Firewalls Mac Mini Connect Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-mac-mini-connect Connect to a firewall-protected Mac mini via Screen Sharing, VNC, or SSH. Find MacStadium Portal credentials and connect from macOS or Windows. **For customers with a firewall** If you have an account that includes a firewall, visit the "[Connect to your Cloud (VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn)" page. Getting connected to a dedicated Mac mini at MacStadium is simple, because the server is pre-configured to be controlled with VNC or SSH. ## Finding Your Login Credentials After Signup Use initial login credentials after checkout. Follow these steps to access them: 1. Log into the [Portal account](https://portal.macstadium.com/login). These are the same credentials which were created or used during the checkout process. 2. Locate a ticket titled "Installation" 3. The ticket contains the following information: IP address, username, and password (needed to access the machine) ## Connecting from macOS with Screen Sharing Connecting to the MacStadium Mac's desktop from a Mac is very simple because a VNC client is included with macOS. 1. Input your machine's IP address into Safari replacing HTTP with VNC (e.g. vnc://xxx.xxx.xxx.xxx) 2. Apple Screen Sharing app will launch and request the machine's username and password 3. The login screen appears - enter your password one more time ## Connecting via VNC from Windows Connecting to the MacStadium Mac's desktop is simple from Windows but requires a VNC client. MacStadium recommends Real VNC Viewer, which is free to use. 1. Download [Real VNC viewer](https://www.realvnc.com/en/connect/download/viewer/windows/) 2. Install and run 3. Use the IP address from the installation ticket 4. Use the username and password from the installation ticket 5. At the macOS login screen, enter the password one more time ## Connecting from Windows 10 via SSH Connecting to your MacStadium Mac terminal via SSH is simple with Windows 10's native SSH command. 1. Go to the search bar and type "CMD" and open Command Prompt 2. Into the prompt, enter: ssh username\@your-ip-address - where the username and IP address are the first login credentials you received after sign up 3. Enter the password for your machine # Network Firewalls: Overview Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-firewalls-overview MacStadium offers a variety of Cisco(R) firewalls to protect the cloud environment. The portfolio includes several physical and virtual appliance choices. ## About MacStadium offers a variety of Cisco® firewalls to protect the cloud environment. The portfolio includes several physical and virtual appliance choices, which exceed all security and performance requirements. ## Overview Cisco Firepower and Cisco Secure Firewall ASA Virtual offerings deliver scalable VPN capability to access MacStadium resources, as well as, protect workloads against increasingly complex threats with world-class security controls. To provision Firewalls in the MacStadium account, please [contact sales](https://www.macstadium.com/contact/sales). The following capabilities are available with Cisco firewalls: * Access and manage the firewall as the root user (root access). * Use [Cisco AnyConnect](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/tsd-products-support-series-home.html) for secure remote user access. * Filter any Internet and internal traffic real-time. For example, pass traffic from selected IPs or IP ranges (like a Jenkins master) and block all other traffic. * Connect local infrastructure to the MacStadium private cloud through secure remote network or site-to-site encrypted Virtual Private Network (VPN) tunnels. * Connect a public cloud, such as AWS, Azure, or Google Cloud, to the MacStadium private cloud through secure remote network or site-to-site encrypted Virtual Private Network (VPN) tunnels. * Perform packet inspection, port blocking, and breach protection. * Configure high availability and failover. * Limit access to approved users to ensure complete access control. ## Getting Started Contact [MacStadium Sales](https://www.macstadium.com/contact/sales) for more information. ## Standard Configurations | Feature | ASAv 10 | ASAv 30 | Firepower 2130 | | --------------------------------------------------- | -------- | ------- | -------------- | | Appliance Form Factor | Virtual | Virtual | Physical | | Stateful inspection throughput max | 1 Gbps | 2 Gbps | 5.4 Gbps | | Stateful inspection throughput max (multi-protocol) | 1 Gbps | 2 Gbps | 5.4 Gbps | | IPsec VPN throughput | 750 Mbps | 2 Gbps | 1.9 Gbps | | Connections per second | 60,000 | 200,000 | 30,000 | | Concurrent sessions | 100,000 | 500,000 | 2,000,000 | | IPsec VPN peers | 250 | 750 | 7,500 | ## Custom Hardware or Hybrid Solutions To host a firewall in a MacStadium data center, contact MacStadium Sales to discuss requirements, available options, and involvement from the MacStadium engineering team. You can access any enabled firewall add-ons from the MacStadium Portal under the **Add-Ons** tab in the details. ## Other options Based on your specific requirements, you may choose to forgo the available Cisco ASAv and ASA options and implement another solution, such as the built-in OS X firewall or a third-party software firewall. MacStadium does not provide assistance with the setup, management, and troubleshooting of these solutions. MacStadium is not responsible for any security risks incurred by such implementations. ## Available Locations Available in: Atlanta, Dublin, Las Vegas # MacStadium network onboarding form for new customers Source: https://docs.macstadium.com/iaas/cisco-firewalls/network-onboarding-form The Network Onboarding Form collects the network provisioning details our platform team needs to configure access to your MacStadium cloud environment. ## Overview The Network Onboarding Form collects the network provisioning details our platform team needs to configure access to your MacStadium cloud environment. All new customers must complete and submit this form before network setup can begin. Network Onboarding Form The [form](https://github.com/macstadium/macstadium-docs/blob/a7b0d9ec76e7b2d7c0eafb67d33f5cbc26ed33e3/iaas/cisco-firewalls/MacStadium%20Network%20Services%20Onboarding%20Form%20\(2026-03-06\).pdf) covers your cloud service selection (Bare Metal, Orka, or Private Cloud), preferred connection method, and any VPN or firewall parameters specific to your environment. Submit the completed form to your account team or via a support ticket in the customer portal. # Prepare the VPN Configuration for Input into Cisco ASA/ASAv Source: https://docs.macstadium.com/iaas/cisco-firewalls/prepare-the-vpn-configuration-for-input-into-cisco-asaasav Hub for MacStadium Cisco ASA/ASAv VPN setup: links to the IP Plan, VPN connection guide, SSH access, firewall login, and site-to-site VPN config articles. ## General Resources ### [IP Plan](/macstadium/macstadium-overview/ip-plan) This is an overview of the IP Plan, which outlines networking details. ### [Connect via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn) This is the first connection needed. It is a prerequisite for most operations. ### [Connect via SSH](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-ssh) This is a way to gain access for scripted processes, such as provisioning VMs and\ automating operations with tools such as Ansible and Packer. ## Accessing the Firewall Directly ### [Cisco Firewall Overview](/iaas/cisco-firewalls/network-firewalls-overview) This is used to protect the environment; MacStadium deploys the private cloud with a dedicated\ Cisco firewall, which offers the highest quality security for the entire environment. ### [Logging into Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall) This is a guide to access and configure firewalls. # Connect third-party clouds to MacStadium Source: https://docs.macstadium.com/iaas/connecting-to-other-clouds/other-clouds Connect AWS, Azure, GCP, or a private cloud to MacStadium via IPsec site-to-site VPN. Covers shared files, cloud infrastructure, and hybrid CI/CD setups. ## Connect a Third-Party Cloud to Your MacStadium Environment If You need to share files between the two clouds. You need to share the cloud infrastructure. You need to access the virtual machines from one cloud on the other. You need to run a more complex CI/CD setup where the macOS part of the pipeline is hosted in\ MacStadium and the remaining pipeline is hosted in another cloud. ## Step 1 Setup Third-Party Site-to-Site Config Select the third-party provider you would like to connect your Mac Cloud to, and\ follow the setup instructions provided. * [AWS Networking Setup](/iaas/aws/aws-networking-setup) * [Azure Networking Setup](/iaas/azure/azure-networking-setup) * [Google Cloud Platform Networking Setup](/iaas/google-cloud-platform/google-cloud-networking-setup) * [Private Cloud Networking Setup](/iaas/connecting-to-other-clouds/private-cloud-networking-setup) ## Step 2 Prepare for MacStadium (Cisco ASA/ASAv) Config Follow the associated guide provided below as you prepare the VPN configuration for input\ into the Cisco ASA/ASAv. * [AWS Cisco Config Guide](/iaas/aws/aws-vpn-config-for-cisco-asaasav) * [Azure Cisco Config Guide](/iaas/azure/azure-vpn-config-for-cisco-asaasav) * [GCP Cisco Config Guide](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav) ## Step 3 Setup MacStadium Site-to-Site Config Now you will need to configure the MacStadium end of things. Configure MacStadium's End of the Site-to-Site VPN ## Step 4 (Optional) Verify Connection * [Verify AWS Connection](/iaas/aws/verify-aws) * [Verify Azure Connection](/iaas/azure/verify-azure) * [Verify GCP Connection](/iaas/google-cloud-platform/verify-gcp) # Private Cloud Networking Setup Source: https://docs.macstadium.com/iaas/connecting-to-other-clouds/private-cloud-networking-setup Connect your private cloud to MacStadium via IPsec site-to-site VPN: Cisco ASA/ASAv NAT exemption, access-list rules, and crypto map configuration. Because of the highly customizable nature of on-premises private clouds, this guide is not precise but aims to provide general guidelines instead. If you need to establish one-time or temporary access to your MacStadium cloud from a single virtual or physical machine, you can connect via VPN using Cisco AnyConnect. For more information, see [Connect to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). If you need to connect an entire private cloud to your MacStadium cloud through a stable, persistent connection, you need to establish an IPsec site-to-site VPN between the two clouds. To create a stable IPSec site-to-site VPN between your two clouds, you need to: 1. Check the [software version and model](/iaas/cisco-firewalls/checking-the-firewall-version) of the Cisco ASA/ASAv device of your MacStadium cloud. 2. Configure your private cloud to connect to your MacStadium cloud. You might need to configure one or more of the following: * Provide the public endpoint of your MacStadium cloud. Usually, this is the public network IP listed for the FW1-Outside network in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * Enable policy-based routing between your private cloud and the internal private network of your MacStadium cloud (by default, the Private-1 network). Usually, this is the private network host and range listed in Appendix A of the IP Plan. * Enable inbound traffic to your private cloud. 3. Set up the Cisco ASA/ASAv device of your MacStadium cloud. You might need to configure one or more of the following rules: * A nat exemption rule for traffic between the two clouds. It might need to allow traffic from the private cloud to the private network and the outside interface of your MacStadium cloud. By default, these are respectively the Private-1 and Outside networks listed in Appendix A of the IP Plan. * access-list rules permitting traffic from the private cloud to the public endpoint of your MacStadium cloud. By default, this is the FW1-Outside network listed in Appendix B of the IP Plan. * A crypto map rule that maps traffic between the two clouds. Usually, you would need to map to the outside interface of your MacStadium cloud. By default, this is the Outside network listed in Appendix A of the IP Plan. * IPSec and IKE policies. * tunnel-group rules that point to the private cloud you want to connect to your MacStadium cloud. You need to prepare these settings based on your Cisco ASA/ASAv software and model. For more information about how to configure each aspect of your Cisco firewall, see [Cisco Documentation: Configuration Guides](https://www.cisco.com/c/en/us/support/security/asa-5500-series-next-generation-firewalls/products-installation-and-configuration-guides-list.html). ## See also * [Cisco Documentation: Navigating the Cisco ASA Series Documentation](https://www.cisco.com/c/en/us/td/docs/security/asa/roadmap/asaroadmap.html) * [Cisco Documentation: Managing Site-to-Site VPNs: The Basics](https://www.cisco.com/c/en/us/td/docs/security/security_management/cisco_security_manager/security_manager/4-1/user/guide/CSMUserGuide_wrapper/vpchap.pdf) * [Cisco Documentation: Cisco ASA Series Syslog Messages](https://www.cisco.com/c/en/us/td/docs/security/asa/syslog/b_syslog.html) * [Logging into Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall) * [AWS Networking Setup](/iaas/aws/aws-networking-setup) * [Azure Networking Setup](/iaas/azure/azure-networking-setup) * [Google Cloud Networking Setup](/iaas/google-cloud-platform/google-cloud-networking-setup) # Site-to-Site VPN Config Source: https://docs.macstadium.com/iaas/connecting-to-other-clouds/site-to-site-vpn-config Apply a prepared VPN config to the MacStadium Cisco ASA/ASAv via ASDM-IDM. Final step after configuring the cloud side and preparing the ASA config. ## Prerequisites ***Verify that you have configured the non-MacStadium side of the VPN connection.*** For more information, see: * [Setting Up the AWS Side of the Site-to-Site VPN](/iaas/aws/site-to-site-vpn-configuration-with-aws) * [Setting Up the Azure Side of the Site-to-Site VPN](/iaas/azure/site-to-site-vpn-configuration-with-azure) * [Setting Up the GCP Side of the Site-to-Site VPN](/iaas/google-cloud-platform/site-to-site-vpn-configuration-with-gcp) ***Verify that you have prepared the configuration.*** For more information, see [Prepare the VPN Configuration for Input into Cisco ASA/ASAv](/iaas/cisco-firewalls/prepare-the-vpn-configuration-for-input-into-cisco-asaasav). ***Verify that you are connected via VPN to your MacStadium private cloud.*** For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). ## Process 1. Run Cisco ASDM-IDM and log in 2. For more information about how to log in to your firewall, see [Logging in to Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall) 3. In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface** 4. Select Multiple Line 5. Type configure terminal, press Enter and paste the contents of the prepared VPN configuration 6. For more information about this command, see [Cisco Documentation: configure terminal](https://www.cisco.com/c/m/en_us/techdoc/dc/reference/cli/n5k/commands/configure-terminal.html) 7. Click Send 8. Verify connection (*optional*) # GCP-to-MacStadium VPN troubleshooting Source: https://docs.macstadium.com/iaas/google-cloud-platform/gcp-troubleshooting If you encounter any issues during or after the configuration of your site-to-site VPN connection between Google Cloud Platform (GCP) and MacStadium. If you encounter any issues during or after the configuration of your site-to-site VPN connection between Google Cloud Platform (GCP) and MacStadium, check this list of common issues and troubleshooting instructions. * Unrecognized interface during the Cisco ASA/ASAv configuration * The tunnel is connected but there's no traffic between GCP and MacStadium * There's traffic from GCP to MacStadium but you cannot access GCP from MacStadium ## Unrecognized interface during the Cisco ASA/ASAv configuration Sometimes, the command line interface might return `ERROR: unable to find interface "outside"`. The command-line interface might be case-sensitive and you might need to preserve the capitalization of the MacStadium network configuration as provided in the [IP Plan](/macstadium/macstadium-overview/ip-plan). 1. Clean up the ASA configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Rename outside in your configuration to the precise name of the outside interface of your Cisco ASA/ASAv device. By default, this is the Outside network. * For more information, see [GCP VPN Config for Cisco ASA/ASAv](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## The tunnel is connected but there's no traffic between GCP and MacStadium If GCP shows that the tunnel is Established but there is no visibility and connectivity between the two clouds, it might be because of some common mistakes when preparing the configuration. Check for the following in the site-to-site VPN configuration. For more information, see [GCP VPN Config for Cisco ASA/ASAv](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav). * Verify that your \{ shared\_key } is correct. The \{ shared\_key } in the configuration must match the key set for the VPN connection. * Verify that you've replaced \{ macstadium\_network\_address } and \{ macstadium\_network\_mask } with the correct values for the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. * You can find the networking information for this network in Appendix A of your [IP Plan](/macstadium/macstadium-overview/ip-plan). * Verify that you've configured the NAT exemption rule properly. * The host and subnet mask required for ONPREM-NET are the host and mask for the internal, private network of your MacStadium private cloud. By default, this is the Private-1 network. You can find the networking information for this network in Appendix A of your IP Plan. * The host and subnet mask required for GCP-NET are the host and mask for your GCP virtual network. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the /16 notation converts to a 255.255.0.0 subnet mask). * The values in the brackets after nat must be the name of the internal, private network of your MacStadium private cloud, followed by the name of the outside interface of your Cisco ASA/ASAv device. By default, these are Private-1 and Outside, respectively. * You can find the names of these networks in Appendix A of your IP Plan. To resolve any of the listed common problems with the Cisco ASA/ASAv configuration, complete the following steps: 1. Clean up the firewall configuration. * For more information, see Cleaning up the ASA/ASAv configuration. 2. Make the necessary changes to the configuration. * For more information, see [GCP VPN Config for Cisco ASA/ASAv](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav). 3. Re-run the complete configuration in Cisco ASDM-IDM. * For more information, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). ## There's traffic from GCP to MacStadium but you cannot access GCP from MacStadium Sometimes, you might be able to establish an SSH connection from GCP to MacStadium but you might not be able to see or access GCP from MacStadium. This might be due to any of the following issues: * The GCP firewall is not configured to allow ingress traffic. For information about how to enable ingress traffic, see [Google Cloud Documentation: Configuring firewall rules > Example configurations](https://cloud.google.com/vpn/docs/how-to/configuring-firewall-rules#example_configurations). * Your GCP instances don't allow OS login. For more information about user login on GCP instances, see [Google Cloud Documentation: Setting up and configuring OS Login](https://cloud.google.com/compute/docs/instances/managing-instance-access). ## Troubleshooting ### Cleaning up the ASA/ASAv configuration Sometimes, you might need to clean up the Cisco ASA/ASAv configuration and start over. 1. Verify that you are connected via VPN to your MacStadium private cloud. For more information about how to connect to the VPN, see [Connecting to Your Cloud (via VPN)](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. 3. For more information about how to log in to your firewall, see [Logging into Your Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**. Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line. 5. Run the following commands one by one, clicking Send in between. Replace the placeholders with their respective values. Use Table 1: Placeholders for reference. ``` clear configure tunnel-group { gcp_vpn_ip } clear configure group-policy gcp clear configure access-list gcp-in clear configure access-list gcp-acl clear configure access-list gcp-filter clear configure crypto map gcp-vpn-map clear configure crypto ipsec ikev2 ipsec-proposal gcp no nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static GCP-NET GCP-NET no object-group network GCP-NET no object-group network ONPREM-NET ``` ### Table 1: Placeholders | Placeholder | Description | Example | | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | | `{ gcp_vpn_ip }` | The public IP address of the cloud VPN gateway in GCP. | `192.168.0.0` | | `{ macstadium_network_name }` | The name of the private network in MacStadium that needs to be accessed by GCP. You can find the information about your private network in Appendix A of the IP Plan. | `Private-1` | | `{ macstadium_outside_interface }` | The name of the outside interface of your Cisco ASA/ASAv device. You can find the information about your outside interface in Appendix A of the IP Plan. | `Outside` | ## More troubleshooting by Google For more detailed troubleshooting instructions, see [Google Cloud Documentation: Cloud VPN Troubleshooting](https://cloud.google.com/vpn/docs/support/troubleshooting). ## More troubleshooting by Cisco For more detailed troubleshooting instructions, see [Cisco Documentation: IPsec Troubleshooting](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html). # GCP VPN Config for Cisco ASA/ASAv Source: https://docs.macstadium.com/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav Configure your Cisco ASA/ASAv for a GCP-MacStadium VPN using the provided template. Fill in GCP and MacStadium network values, then apply the config. After you have created your site-to-site VPN connection in Google Cloud Platform (GCP), you need to configure your Cisco firewall to recognize the connection and let traffic into your MacStadium private cloud. You can use the configuration template provided below and fill in the missing information. You need to provide data from both GCP and MacStadium. 1. Configuration template 2. Fill in the configuration blanks * Get the configuration values * Complete the template ## Configuration template Unless you have extensive experience with GCP and ASA/ASAv configurations, use the configuration from the template. Otherwise, your site-to-site VPN might not work as expected. This is a template configuration that you can use to complete the setup of your GCP-MacStadium site-to-site VPN connection. ``` ! #1: Placeholders ! ! { gcp_network_address } - The address of the GCP local network that needs to have access to MacStadium. ! { gcp_network_mask } - The subnet mask of the GCP local network that needs to have access to MacStadium. ! { gcp_vpn_ip } - The public IP address of the cloud VPN gateway in GCP. ! { macstadium_network_name } - The name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_network_address } - The IP address of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_network_mask } - The subnet mask of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_public_ip } - The IP address of the public network of your MacStadium private cloud. By default, this is FW1-Outside. ! { macstadium_outside_interface } - The name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. ! { shared_key } - The IPSec pre-shared key used when creating the VPN connection in GCP. ! ! #2: NAT exemption ! ! The name "GCP-NET" must be unique for the Cisco ASA/ASAv device. ! object-group network GCP-NET description GCP Virtual Network network-object { gcp_network_address } { gcp_network_mask } ! The name "ONPREM-NET" must be unique for the Cisco ASA/ASAv device. object-group network ONPREM-NET description OnPrem Network network-object { macstadium_network_address } { macstadium_network_mask } ! The names "gcp-in", "gcp-acl", and "gcp-filter" must be unique for the Cisco ASA/ASAv device. access-list gcp-in extended permit ip host { gcp_vpn_ip } host { macstadium_public_ip } access-list gcp-acl extended permit ip any4 object-group GCP-NET access-list gcp-filter extended permit ip object-group GCP-NET object-group ONPREM-NET nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static GCP-NET GCP-NET ! #3: IKE & IPSec configuration ! ! The name "gcp" must be unique for the Cisco ASA/ASAv device. crypto ipsec ikev2 ipsec-proposal gcp protocol esp encryption aes-256 protocol esp integrity sha-1 ! The name "gcp-vpn-map" must be unique for the Cisco ASA/ASAv device. crypto map gcp-vpn-map 1 match address gcp-acl crypto map gcp-vpn-map 1 set pfs group14 crypto map gcp-vpn-map 1 set peer { gcp_vpn_ip } crypto map gcp-vpn-map 1 set ikev2 ipsec-proposal gcp crypto map gcp-vpn-map interface { macstadium_outside_interface } crypto ikev2 policy 100 encryption aes-256 integrity sha512 group 14 prf sha lifetime seconds 36000 exit crypto ikev2 enable { macstadium_outside_interface } crypto ipsec security-association lifetime seconds 10800 crypto ipsec security-association replay window-size 128 crypto ipsec security-association pmtu-aging infinite crypto isakmp identity address crypto isakmp disconnect-notify no crypto isakmp nat-traversal crypto ipsec df-bit clear-df Outside group-policy gcp internal group-policy gcp attributes vpn-filter value gcp-filter vpn-tunnel-protocol ikev2 tunnel-group { gcp_vpn_ip } type ipsec-l2l tunnel-group { gcp_vpn_ip } general-attributes default-group-policy gcp tunnel-group { gcp_vpn_ip } ipsec-attributes isakmp keepalive threshold 10 retry 3 ikev2 remote-authentication pre-shared-key { shared_key } ikev2 local-authentication pre-shared-key { shared_key } ``` ## Fill in the configuration blanks You need to manually replace the placeholders in the configuration template with the values for your GCP and MacStadium configurations. ### Get the configuration values **\{ gcp\_network\_address }** This is the IP address of the GCP local network that needs to have access to MacStadium. 1. Verify that you're logged into the GCP console and you are working in the correct project.\\ GCP console project selector in the toolbar 2. From the GCP console sidebar, scroll to the Networking section and select Hybrid Connectivity > VPN.\\ GCP sidebar with Hybrid Connectivity VPN option highlighted 3. Select Cloud VPN Gateways. 4. Locate the gateway used by your GCP-MacStadium tunnel and note the value for Region.\\ GCP Cloud VPN Gateways list showing gateway region and VPC network 5. Click the value listed under VPC network. * The GCP console redirects you to the list of subnets for the selected network. 6. In the list of subnets, locate the one matching the region you noted in Step 4. 7. From the respective IP address ranges field, use the IP address without the bit notation at the end (e.g. /16). **\{ gcp\_network\_mask }** This is the subnet mask the GCP local network that needs to have access to MacStadium. 1. Verify that you're logged into the GCP console and you are working in the correct project.\\ GCP console project selector in the toolbar 2. From the GCP console sidebar, scroll to the Networking section and select Hybrid Connectivity > VPN.\\ GCP sidebar with Hybrid Connectivity VPN option highlighted 3. Select Cloud VPN Gateways. 4. Locate the gateway used by your GCP-MacStadium tunnel and note the value for Region.\\ GCP Cloud VPN Gateways list showing gateway region and VPC network 5. Click the value listed under VPC network. * The GCP console redirects you to the list of subnets for the selected network. 6. In the list of subnets, locate the one matching the region you noted in Step 4. 7. From the respective IP address ranges field, use the bit notation at the end (e.g. /16) and convert it to a subnet mask. You can use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). **\{ gcp\_vpn\_ip }** This is the public IP address of the cloud VPN gateway in GCP. 1. Verify that you're logged into the GCP console and you are working in the correct project.\\ GCP console project selector in the toolbar 2. From the GCP console sidebar, scroll to the Networking section and select Hybrid Connectivity > VPN.\\ GCP sidebar with Hybrid Connectivity VPN option highlighted 3. Select Cloud VPN Gateways. 4. Locate the gateway used by your GCP-MacStadium tunnel and use the value listed under IP address.\\ GCP Cloud VPN Gateways list showing gateway IP address field **\{ macstadium\_network\_name }** This is the name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. * You can find the information about your private network in Appendix A of the [IP Plan](/macstadium/macstadium-overview/ip-plan). **\{ macstadium\_network\_address }** This is the IP address of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. **\{ macstadium\_network\_mask }** This is the subnet mask of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. **\{ macstadium\_public\_ip }** This is the IP address of the public network of your MacStadium private cloud. By default, this is FW1-Outside. **\{ macstadium\_outside\_interface }** This is the name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Outside. **\{ shared\_key }** This is the IPSec pre-shared key used when creating the VPN connection in GCP. You must have this key saved separately. ## Complete the template 1. Copy the template into a text editing tool. 2. Replace all placeholders with their respective values. 3. Delete the remaining commented lines to clean up the template. Commented lines are indicated by ! at the beginning of the line. 4. Save your changes. ## Next steps If you are ready to feed the complete configuration into your Cisco ASA/ASAv, see [Setting Up the MacStadium Side of the Site-to-Site VPN](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). # Google Cloud Networking Setup Source: https://docs.macstadium.com/iaas/google-cloud-platform/google-cloud-networking-setup To establish a stable, persistent connection between a Google Cloud Platform (GCP) private cloud and your MacStadium private cloud, you need to configure. To establish a stable, persistent connection between a Google Cloud Platform (GCP) private cloud and your MacStadium private cloud, you need to configure a policy-based IPsec site-to-site VPN between the two clouds. Currently, you can create only a classic VPN connection with policy-based routing from GCP to MacStadium. It consists of one tunnel and one interface and does not provide high availability. For more information about this option, see [Google Cloud Documentation: Classic VPN](https://cloud.google.com/vpn/docs/how-to/choosing-a-vpn#classic-vpn). To create a site-to-site VPN from your GCP private cloud to your MacStadium private cloud, you need to go through the following high-level steps: 1. Log into GCP 2. Create the VPN connection ## Log into GCP 1. Log in to the GCP console with your credentials. 2. In the toolbar at the top, make sure that you're working with the correct project.\\ GCP console toolbar with project selector ## Create the VPN connection From the GCP console sidebar, scroll to the Networking section and select **Hybrid Connectivity > VPN**. GCP sidebar with Hybrid Connectivity VPN option highlighted Classic VPN connections in GCP consist of a gateway and tunnel. You can create a gateway and a tunnel at once or you can add a new tunnel to an existing gateway. ## Create gateway and tunnel If you don't have a classic VPN gateway that you want to use, complete the following steps. 1. If you don't have any VPNs created yet, click Create VPN connection. 2. If you have one or more VPNs created, click + VPN SETUP WIZARD. 3. Select Classic VPN and click Continue. * The High-availability (HA) VPN is currently not supported as an option. For more information about the available options, see [Google Cloud Documentation: Choosing a VPN option](https://cloud.google.com/vpn/docs/how-to/choosing-a-vpn). 4. In the Google Compute Engine VPN gateway section, provide Name and Description. 5. For Network, select the GCP network that needs to be able to access MacStadium. 6. Select Region. * For more information about this setting, see [Google Cloud Documentation: Regions and Zones](https://cloud.google.com/compute/docs/regions-zones). 7. Select or create a reserved IP address for the connection. * You will need this IP address when you configure the MacStadium side of the tunnel. 8. In the Tunnels section, provide Name and Description. 9. For Remote peer IP address, provide the IP address of the public network listed in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * By default, this is the FW1-Outside network. 10. For IKE version, verify that IKEv2 is selected. 11. Provide or generate an IKE pre-shared key. Keep a record of the pre-shared key. You will need it later. 12. For Routing options, select Policy-based. 13. For Remote network IP ranges, provide the IP range in CIDR notation of the private network listed in Appendix A of the IP Plan. * By default, this is the Private-1 network. * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 14. (Optional) Select one or more GCP subnetworks to reduce latency between your GCP private cloud and your MacStadium private cloud. * For more information, see [Google Cloud Documentation: Networks and subnets](https://cloud.google.com/vpc/docs/vpc#vpc_networks_and_subnets). 15. (Optional) Provide one or more IP ranges within your GCP local network that needs to access MacStadium. 16. Click Done. 17. Click Create. After the creation is complete, the VPN tunnel status is: First handshake. ### Example: Create gateway and tunnel This image shows a sample configuration for the VPN gateway and tunnel. GCP VPN gateway and tunnel configuration form with sample settings ## Add a new tunnel to an existing gateway If you have an existing classic VPN gateway that you want to use for the connection, complete the following steps. 1. Select Cloud VPN Tunnels and click Create VPN tunnel.\\ GCP Cloud VPN Tunnels tab with Create VPN tunnel button 2. Select the VPN gateway that you want to use and click Continue. Make sure that you have selected a classic VPN gateway. High-availability gateways are not supported. 3. Provide Name. 4. (Optional) Provide Description. 5. For Remote peer IP address, provide the IP address of the public network listed in Appendix B of the IP Plan. * By default, this is the FW1-Outside network. 6. For IKE version, verify that IKEv2 is selected. 7. Provide or generate an IKE pre-shared key. Keep a record of the pre-shared key. You will need it later. 8. For Routing options, select Policy-based. 9. For Remote network IP ranges, provide the IP range in CIDR notation of the private network listed in Appendix A of the IP Plan. * By default, this is the Private-1 network. * For more information about CIDR notations, see [Understanding IP Addresses, Subnets, and CIDR Notation for Networking](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation). You can also use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). 10. (Optional) Select one or more GCP subnetworks to reduce latency between your GCP private cloud and your MacStadium private cloud. * For more information, see [Google Cloud Documentation: Networks and subnets](https://cloud.google.com/vpc/docs/vpc#vpc_networks_and_subnets). 11. (Optional) Provide one or more IP ranges within your GCP local network that needs to access MacStadium. 12. Click Create. After the creation is complete, the VPN tunnel status is: First handshake. ### Example: Create the VPN gateway and tunnel This image shows a sample configuration for the VPN connection. GCP VPN tunnel configuration form showing sample settings for an existing gateway ## Ensure that the GCP firewall allows ingress traffic Based on your requirements, you might need to enable ingress traffic from MacStadium to GCP in the GCP firewall. For more information, see [Google Cloud Documentation: Configuring firewall rules > Example configurations](https://cloud.google.com/vpn/docs/how-to/configuring-firewall-rules#example_configurations). ## Next steps If you are ready to proceed with the MacStadium side of the configuration, see [Preparing the VPN Configuration for Input into Cisco ASA/ASAv](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav). # Site-to-Site VPN Configuration with GCP Source: https://docs.macstadium.com/iaas/google-cloud-platform/site-to-site-vpn-configuration-with-gcp The goal of this documentation is to update the Site-to-Site VPN configuration with GCP and add specific configuration details for the ASA feature TCP. ## Overview The goal of this documentation is to update the Site-to-Site VPN configuration with GCP and add specific configuration details for the ASA feature TCP State-bypass, which is required in HA VPN scenarios. ## Google Cloud Networking Setup To establish a stable, persistent connection between a Google Cloud Platform (GCP) private cloud and the MacStadium private cloud, configuration must be set between an IPsec Site-To-Site VPN, between the two clouds. Currently, for connectivity between MacStadium and GCP, there are two options: * **Classic VPN** with policy-based which consists of a single VPN tunnel, with a single external IP address and a single interface. This option does not provide high availability. * **HA VPN** with dynamic routing (BGP) which provides high availability with multiple VPN tunnels, interfaces, and external IP addresses. This guide is based on the GCP One peer VPN device with one IP address topology available at: Google Cloud Documentation: 1 Peer - 1 Address. HA VPN must use dynamic routing with BGP. Classic VPN remains an option for connecting to MacStadium firewalls that do not run BGP. For more information about general Google Cloud VPN, see Google Cloud Documentation: [Cloud VPN Overview](https://cloud.google.com/network-connectivity/docs/vpn/concepts/overview). The feature TCP State Bypass in the ASA / ASAv firewall is required for HA VPN only, and is configured to allow asynchronous routing between the separate VPN tunnels. To create a site-to-site VPN from your GCP private cloud to your MacStadium private cloud, you need to go through the following high-level steps: 1. Log into GCP\\ GCP console project selector in the toolbar 2. Create the VPN connection\\ GCP sidebar with Hybrid Connectivity VPN option highlighted Classic and HA VPN connections in GCP require a Cloud VPN Tunnel and a Cloud VPN Gateway. Both elements can be at once or you can add a new Cloud VPN Tunnel to an existing Cloud VPN Gateway. ## Create VPN Gateway and Tunnel To create a new VPN Gateway, complete the following steps: 1. If the VPNs are not created yet, then click CREATE VPN CONNECTION. 2. If one or more of the VPNs are created, then click +VPN SETUP WIZARD. 3. Select Classic VPN or High-availability (HA) VPN. 4. Click Continue. ## Classic VPN Configuration 1. In the GCP VPN gateway section, provide Name and Description. 2. For Network, select the GCP network that needs to be able to access MacStadium. 3. Select Region. 4. Select or create a reserved IP address for the connection. This IP address is needed when you configure the MacStadium side of the tunnel. 5. In the Tunnels section, provide Name, and Description. 6. For Remote peer IP address, provide the IP address of the public network listed in Appendix B of the IP Plan. By default, this is the FW1-Outside network. 7. For IKE version, verify that IKEv2 is selected. 8. Provide or generate an IKE pre-shared key. * Keep a record of the pre-shared key. It is needed later. 9. For Routing options, select Policy-based. 10. For Remote network IP ranges, provide the IP range in CIDR notation of the private network listed in Appendix A of the [IP Plan](/macstadium/macstadium-overview/ip-plan). By default, this is the Private-1 network. For more information about CIDR notations, see Understanding IP Addresses, Subnets, and CIDR Notation for Networking. You can also use a CIDR calculator such as this CIDR/Netmask Lookup Tool. 11. (Optional) Select one or more GCP subnetworks to reduce latency between your GCP private cloud and your MacStadium private cloud. * For more information, see Google Cloud Documentation: Networks and subnets. 12. (Optional) Provide one or more IP ranges within your GCP local network that needs to access MacStadium. 13. Click Done. 14. Click Create.\ GCP Classic VPN gateway and tunnel configuration form completed\\ GCP Classic VPN tunnel creation confirmation screen ## HA VPN Configuration Creating an HA VPN on GCP is a three-step process as follows: **Create Cloud HA VPN Gateway** 1. In the Cloud HA VPN gateway section, provide a Name. 2. For Network, select the GCP network that needs to be able to access MacStadium. 3. Select Region. 4. Click CREATE & CONTINUE Add VPN tunnels. 5. In the VPN Tunnels section, make sure On-prem or Non Google Cloud is selected and click Peer VPN gateway name > CREATE NEW PEER VPN GATEWAY. 6. Provide a Name for the VPN Gateway and confirm that two interfaces is selected at the next section. 7. For both Interface 0 IP address and Interface 1 IP address fields, provide the IP address of the public network listed in Appendix B of the IP Plan. By default, this is the FW1-Outside network. Click CREATE. 8. In the Routing options section, click Cloud Router > Create new router. 9. Provide a Name and Description. 10. In Google ASN, provide any private ASN number (64512 - 65534, 4200000000 - 4294967294). 11. Keep the other options with the default values and click CREATE. 12. In the VPN tunnels section you need to configure both VPN tunnels. 13. Select the first VPN tunnel. 14. Provide a Name, Description and confirm IKEv2 is selected. 15. Provide or generate an IKE pre-shared key and click DONE. Keep a record of the pre-shared key. It is needed later. 16. Select the second VPN tunnel and repeat the steps 10 and 11. 17. Click CREATE & CONTINUE. Wait a few seconds while the VPN tunnels are created. ## Configure BGP Sessions Scroll right and click CONFIGURE BGP SESSION at the first VPN tunnel. 1. Provide a Name and the Peer ASN. This is also the ASN you will use to configure BGP on your MacStadium Firewall. You can choose any private ASN (64512 - 65534, 4200000000 - 4294967294) but it must be different from the ASN assigned to the Cloud Router configured on the previous step. 2. Keep the default values for all other options and click SAVE AND CONTINUE. 3. Scroll right and click CONFIGURE BGP SESSION at the second VPN tunnel. 4. Repeat steps 2 and 3 to configure the BGP settings of the second VPN tunnel. Notice that the same Peer ASN should be used. 5. Click SAVE BGP CONFIGURATION. 6. In the Summary and reminder page, click DOWNLOAD CONFIGURATION. 7. For Vendor select Cisco. For Platform, at the time of writing, Firepower is the only option available. On Software, confirm that >= ASA 9.13(1)2 is selected and click DOWNLOAD. 8. Next click OK. After the creation is complete, the VPN tunnel status is: No incoming packets. The following image shows a sample configuration for the HA VPN gateway and tunnel. GCP HA VPN gateway configuration form with name and network fields GCP peer VPN gateway configuration with two interface IP fields GCP Cloud Router configuration form with name and ASN fields GCP HA VPN tunnel configuration form with name and IKE pre-shared key fields GCP VPN tunnel summary page before creation GCP BGP session configuration form with peer ASN field GCP Download Configuration dialog with Cisco vendor options GCP HA VPN gateway created with two tunnel interfaces showing status GCP HA VPN tunnel detail showing overall status ## Ensure that GCP Firewall Allows Ingress Traffic Based on the requirements, it might be necessary to enable ingress traffic from MacStadium to GCP in the GCP firewall. For more information, see Google Cloud Documentation: [Configure Firewall Rules](https://cloud.google.com/network-connectivity/docs/vpn/how-to/configuring-firewall-rules#example_configurations). ## Preparing the VPN Configuration To prepare the VPN configuration, see [GCP VPN Config for Cisco ASA/ASAv](/iaas/google-cloud-platform/gcp-vpn-config-for-cisco-asaasav). ## GCP VPN Config for Cisco ASA/ASAv After the Site-to-Site VPN connection is created in Google Cloud Platform (GCP), configure the Cisco firewall to recognize the connection and let traffic into the MacStadium private cloud. Use the configuration template provided below and fill in the missing information. Data from both GCP and MacStadium is required. 1. Configuration template. 2. Fill in the configuration blanks. 3. Get the configuration values. 4. Complete the template. ## Configuration Template Classic VPN Do not attempt GCP and ASA/ASAv configuration without proper experience, or unexpected consequences may happen to the VPN. This is a template configuration that can be used to complete the setup of the GCP-MacStadium Site-To-Site Classic VPN connection. `! #1: Placeholders ! ! \{ gcp_network_address } - The address of the GCP local network that needs to have access to MacStadium. ! \{ gcp_network_mask } - The subnet mask of the GCP local network that needs to have access to MacStadium. ! \{ gcp_vpn_ip } - The public IP address of the cloud VPN gateway in GCP. ! \{ macstadium_public_ip } - The IP address of the public network of your MacStadium private cloud. By default, this is FW1-Outside. ] ! \{ macstadium_network_name } - The name of the private network in MacStadium that needs ]to be accessed by GCP. By default, this is Private-1. ! \{ macstadium_network_address } - The IP address of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! \{ macstadium_network_mask } - The subnet mask of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! \{ macstadium_outside_interface } - The name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. ! \{ shared_key } - The IPSec pre-shared key used when creating the VPN connection in GCP. ! ! #2: NAT exemption ! ! The name "GCP-NET" must be unique for the Cisco ASA/ASAv device. ! object-group network GCP-NET description GCP Virtual Network network-object \{ gcp_network_address } \{ gcp_network_mask } ! The name "ONPREM-NET" must be unique for the Cisco ASA/ASAv device. object-group network ONPREM-NET description OnPrem Network network-object \{ macstadium_network_address } \{ macstadium_network_mask } ! The names "gcp-in", "gcp-acl", and "gcp-filter" must be unique for the Cisco ASA/ASAv device. access-list gcp-in extended permit ip host \{ gcp_vpn_ip } host \{ macstadium_public_ip } access-list gcp-acl extended permit ip any4 object-group GCP-NET access-list gcp-filter extended permit ip object-group GCP-NET object-group ONPREM-NET nat (\{ macstadium_network_name },\{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static GCP-NET GCP-NET ! #3: IKE & IPSec configuration ! ! The name "gcp" must be unique for the Cisco ASA/ASAv device. crypto ipsec ikev2 ipsec-proposal gcp protocol esp encryption aes-256 protocol esp integrity sha-1 ! The name "gcp-vpn-map" must be unique for the Cisco ASA/ASAv device. crypto map gcp-vpn-map 1 match address gcp-acl crypto map gcp-vpn-map 1 set pfs group14 crypto map gcp-vpn-map 1 set peer \{ gcp_vpn_ip } crypto map gcp-vpn-map 1 set ikev2 ipsec-proposal gcp crypto map gcp-vpn-map interface \{ macstadium_outside_interface } crypto ikev2 policy 100 encryption aes-256 integrity sha512 group 14 prf sha lifetime seconds 36000 exit crypto ikev2 enable \{ macstadium_outside_interface } crypto ipsec security-association lifetime seconds 10800 crypto ipsec security-association replay window-size 128 crypto ipsec security-association pmtu-aging infinite crypto isakmp identity address crypto isakmp disconnect-notify no crypto isakmp nat-traversal crypto ipsec df-bit clear-df Outside group-policy gcp internal group-policy gcp attributes vpn-filter value gcp-filter vpn-tunnel-protocol ikev2 tunnel-group \{ gcp_vpn_ip } type ipsec-l2l tunnel-group \{ gcp_vpn_ip } general-attributes default-group-policy gcp tunnel-group \{ gcp_vpn_ip } ipsec-attributes isakmp keepalive threshold 10 retry 3 ikev2 remote-authentication pre-shared-key \{ shared_key } ikev2 local-authentication pre-shared-key \{ shared_key }` ## Configuration Template HA VPN Do not attempt GCP and ASA/ASAv configuration without proper experience, or unexpected consequences may happen to the VPN. This is a template configuration that you can use to complete the setup of your GCP-MacStadium Site-To-Site HA VPN connection. `! #1: Placeholders ! ! \{ gcp_network_address } - The address of the GCP local network that needs to have access to MacStadium. ! \{ gcp_network_mask } - The subnet mask of the GCP local network that needs to have access to MacStadium. ! \{ gcp_network_mask_cidr } - The subnet mask of the GCP local network that needs to have access to MacStadium in CIDR notation. Ex: 255.255.255.0 in CIDR notation is /24. ! \{ gcp_vpn_ip0 } - The public IP address of the first VPN Gateway interface in GCP. ! \{ gcp_vpn_ip1 } - The public IP address of the second VPN Gateway interface in GCP. ! \{ macstadium_public_ip } - The IP address of the public network of your MacStadium private cloud. By default, this is FW1-Outside. ! \{ macstadium_network_name } - The name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! \{ macstadium_network_address } - The IP address of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! \{ macstadium_network_mask } - The subnet mask of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. ! \{ macstadium _network_mask_cidr } - The subnet mask in CIDR notation of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. Ex: 255.255.254.0 in CIDR notation is /23 ! \{ macstadium_outside_interface } - The name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. ! \{ shared_key0 } - The IPSec pre-shared key used when creating the first VPN connection in GCP. ! \{ shared_key1 } - The IPSec pre-shared key used when creating the second VPN connection in GCP. ! \{ gcp_bgp_ip_address0 } - The Cloud router BGP IP address of the first BGP session in GCP. ! \{ gcp_bgp_ip_address1 } - The Cloud router BGP IP address of the second BGP session in GCP. ! \{ macstadium_bgp_ip_address0 } - The BGP peer IP address of the first BGP session in GCP. ! \{ macstadium_bgp_ip_address1 } – The BGP peer IP address of the second BGP session in GCP. ! \{ macstadium_bgp_asn } – The BGP peer router ASN of the BGP sessions configuration in GCP. ! \{ gcp_bgp_asn } – The BGP router ASN on the Cloud Router configuration in GCP. ! ! #1: IKE & IPSec configuration ! ! The name "gcp" must be unique for the Cisco ASA/ASAv device. ! configure terminal crypto ipsec ikev2 ipsec-proposal gcp protocol esp encryption aes-gcm-256 protocol esp integrity sha-512 ! crypto ipsec profile gcp set ikev2 ipsec-proposal gcp set pfs group14 set security-association lifetime kilobytes unlimited set security-association lifetime seconds 10800 ! crypto ipsec security-association pmtu-aging infinite ! crypto ikev2 policy 10 encryption aes-gcm-256 integrity null group 14 prf sha512 sha384 sha256 sha lifetime seconds 36000 crypto ikev2 policy 100 encryption aes-256 integrity sha512 group 14 prf sha lifetime seconds 36000 ! crypto ikev2 enable \{ macstadium_outside_interface } ! group-policy gcp internal group-policy gcp attributes vpn-tunnel-protocol ikev2 ! tunnel-group \{ gcp_vpn_ip0 } type ipsec-l2l tunnel-group \{ gcp_vpn_ip0 } general-attributes default-group-policy gcp tunnel-group \{ gcp_vpn_ip0 } ipsec-attributes isakmp keepalive threshold 10 retry 3 ikev2 remote-authentication pre-shared-key \{ shared_key0 } ikev2 local-authentication pre-shared-key \{ shared_key0 } ! tunnel-group \{ gcp_vpn_ip1 } type ipsec-l2l tunnel-group \{ gcp_vpn_ip1 } general-attributes default-group-policy gcp tunnel-group \{ gcp_vpn_ip1 } ipsec-attributes isakmp keepalive threshold 10 retry 3 ikev2 remote-authentication pre-shared-key \{ shared_key1 } ikev2 local-authentication pre-shared-key \{ shared_key1 } ! ! #2: Tunnel interfaces configuration ! ! The name Tunnel interface number, "gcp-if-0" and "gcp-if-1" must be unique for the Cisco ASA/ASAv device. interface Tunnel0 nameif gcp-if-0 ip address \{ macstadium_bgp_ip_address0 } 255.255.255.252 tunnel source interface \{ macstadium_outside_interface } tunnel destination \{ gcp_vpn_ip0 } tunnel mode ipsec ipv4 tunnel protection ipsec profile gcp ! interface Tunnel1 nameif gcp-if-1 ip address \{ macstadium_bgp_ip_address1 } 255.255.255.252 tunnel source interface \{ macstadium_outside_interface } tunnel destination \{ gcp_vpn_ip1 } tunnel mode ipsec ipv4 tunnel protection ipsec profile gcp ! ! #3: Access control configuration ! ! The name “gcp-vpc-lan”, “gcp-in” and “gcp-out” must be unique for the Cisco ASA/ASAv device. object network gcp-vpc-lan subnet \{ gcp_network_address } \{ gcp_network_mask } ! access-list gcp-in extended permit ip any any ! access-group gcp-in in interface gcp-if-0 control-plane access-group gcp-in in interface gcp-if-0 access-group gcp-in in interface gcp-if-1 control-plane access-group gcp-in in interface gcp-if-1 ! prefix-list gcp-in seq 5 permit \{ gcp_network_address }/\{ gcp _network_mask_cidr } le 32 ! prefix-list gcp-out seq 5 permit \{ macstadium_network_address }/\{ macstadium _network_mask_cidr } le 32 ! router bgp \{ macstadium_bgp_asn } bgp log-neighbor-changes bgp graceful-restart address-family ipv4 unicast neighbor \{ gcp_bgp_ip_address0 } remote-as \{ gcp_bgp_asn } neighbor \{ gcp_bgp_ip_address0 } ebgp-multihop 2 neighbor \{ gcp_bgp_ip_address0 } activate neighbor \{ gcp_bgp_ip_address0 } prefix-list gcp-in in neighbor \{ gcp_bgp_ip_address0 } prefix-list gcp-out out neighbor \{ gcp_bgp_ip_address0 } maximum-prefix 100 70 neighbor \{ gcp_bgp_ip_address1 } remote-as \{ gcp_bgp_asn } neighbor \{ gcp_bgp_ip_address1 } ebgp-multihop 2 neighbor \{ gcp_bgp_ip_address1 } activate neighbor \{ gcp_bgp_ip_address1 } prefix-list gcp-in in neighbor \{ gcp_bgp_ip_address1 } prefix-list gcp-out out neighbor \{ gcp_bgp_ip_address1 } maximum-prefix 100 70 network \{ macstadium_network_address } mask \{ macstadium_network_mask } maximum-paths 2 no auto-summary no synchronization exit-address-family end write memory` ## Fill in the Configuration Blanks Manually replace the placeholders in the configuration template with the values for your GCP and MacStadium configurations. ### Get the Configuration Values 1. Confirm login to the GCP console.\\ GCP console project selector in the toolbar 2. In the GCP search bar, type VPN and select VPN Hybrid Connectivity.\\ GCP search bar with VPN typed and VPN Hybrid Connectivity result * `{ gcp_network_address }`, `{ gcp_network_mask_cidr }` and `{ gcp_network_mask_cidr }` * This is the IP address of the GCP local network that needs to have access to MacStadium. 3. Select Cloud VPN Gateways. 4. Locate the gateway used by the GCP-MacStadium tunnel and note the value for Region.\\ GCP Cloud VPN Gateways list showing gateway region and VPC network link 5. Click the value listed under VPC network. * The GCP console redirects you to the list of subnets for the selected network. 6. In the list of subnets, locate the one matching the region selected earlier. 7. Obtain the values from the Internal IP ranges field. Example: * `Region: us-east1 Internal IP range: 10.142.0.0/20 { gcp_network_address }: 10.142.0.0 { gcp_network_mask }: 255.255.240.0 { gcp_network_mask_cidr }: /20` * This is the public IP addresses of the Cloud VPN gateway interfaces in GCP. 8. In the VPN Hybrid Connectivity service page, select Cloud VPN Gateways. 9. Locate the gateway used by the GCP-MacStadium tunnel and use the values listed under IP address.\\ GCP Cloud VPN Gateways list showing gateway IP address fields * `{ macstadium_public_ip }` * This is the IP address of the public network of the MacStadium private cloud. By default, this is FW1-Outside. Information about the public network is located in Appendix B of the IP Plan.\ `{ macstadium_network_name }` * This is the name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1. Information about the public network is located in Appendix B of the [IP Plan](/macstadium/macstadium-overview/ip-plan). * `{ macstadium_network_address }` * This is the Subnet ID of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1 Subnet ID. Information about the public network is located in Appendix B of the IP Plan * `{ macstadium_network_mask }` * This is the subnet mask of the private network in MacStadium that needs to be accessed by GCP. By default, this is Private-1 Subnet. Information about the public network is located in Appendix B of the IP Plan. * `{ macstadium _network_mask_cidr }` * To convert the subnet mask to a CIDR notation, use a CIDR calculator such as this CIDR/Netmask Lookup Tool. * `{ macstadium_outside_interface }` * This is the name of the private network in MacStadium that needs to be accessed by GCP. By default, this is Outside. Information about the public network is located in Appendix B of the IP Plan. * `{ shared_key0 }` and `{ shared_key1 }` * This is the IPSec pre-shared key used when creating the VPN connection in GCP. * This key must be saved separately. Obtain it from the VPN configuration downloaded from GCP. * `{ gcp_bgp_ip_address0 }` and `{ gcp_bgp_ip_address1 }` * The Cloud router BGP IP address of the BGP sessions in GCP. * In the VPN Hybrid Connectivity service page, select Cloud VPN Tunnels. 10. In the VPN Hybrid Connectivity service page, select Cloud VPN Tunnels. 11. Locate the VPN tunnels used by your GCP-MacStadium VPN and use the values listed under Cloud Router BGP IP address.\\ GCP Cloud VPN Tunnels list showing Cloud Router BGP IP address column ``` * ` { macstadium_bgp_ip_address0 } and { macstadium_bgp_ip_address1 }` ``` 12. In the VPN Hybrid Connectivity service page, select Cloud VPN Tunnels. 13. Locate the VPN tunnels used by your GCP-MacStadium VPN and use the values listed under Peer BGP IP address.\\ GCP Cloud VPN Tunnels list showing Peer BGP IP address column ``` * `{ gcp_bgp_asn }` ``` 14. In the VPN Hybrid Connectivity service page, select Cloud VPN Tunnels. 15. Locate the VPN tunnels used by your GCP-MacStadium VPN, click the Actions button and select View.\\ GCP Cloud VPN Tunnels list with Actions button and View option 16. Use the value of the Cloud Router ASN field. Both tunnels should have the same value for this parameter.\\ GCP VPN tunnel detail showing Cloud Router ASN field ``` * `{ macstadium_bgp_asn }` ``` 17. In the VPN Hybrid Connectivity service page, select Cloud VPN Tunnels. 18. Locate the VPN tunnels used by the GCP-MacStadium VPN, and click Actions. 19. Select View.\\ GCP Cloud VPN Tunnels list with Actions button and View option 20. Use the value of the Cloud Router ASN field. Both tunnels should have the same value for this parameter.\\ GCP VPN tunnel detail showing Cloud Router ASN field ## Complete the Template 1. Copy the template into a text editing tool. 2. Replace all placeholders with their respective values. 3. Delete the remaining commented lines to clean up the template. Commented lines are indicated by ! at the beginning of the line. 4. Apply the config to your firewall and save your changes. ## TCP State Bypass After the VPN is configured, configure TCP State Bypass on the ASA / ASAv firewall in order to allow the outbound and inbound traffic to flow through separate VPN tunnels. | Placeholder | Description | More Information | Example | | -------------------- | ---------------------------------------------------------------------------------------------------------- | ----------------------------------------- | ---------------- | | `{acl-state-bypass}` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | Cisco Documentation: Access Control Lists | acl-state-bypass | | `{cm_state-bypass}` | A unique name for the Class-map. | Cisco Documentation: TCP State Bypass | cm-state-bypass | | `{pm-state-bypass}` | A unique name for the access control list that permits the creation of the tunnel and the traffic over it. | Cisco Documentation: TCP State Bypass | pm-state-bypass | 1. Define the Access list with the source and destination networks: * `access-list { acl-state-bypass } extended permit ip { macstadium_network_address } { macstadium_network_mask } { gcp_network_address } { gcp_network_mask }` 2. Create the Class Map to identify the traffic to disable stateful Firewall inspection: * `class-map { cm-state-bypass }` 3. Enter the match parameter command to specify the traffic of interest within the class map. * `match access-list { acl-state-bypass }` 4. Enter the policy-map name command to assign the actions to be taken in regards to the specified class map traffic: * `policy-map { pm-state-bypass } class { cm-state-bypass } set connection advanced-options tcp-state-bypass` 5. Enter the service-policy command in global configuration mode in order to activate the policy map on the targeted interface: * `service-policy { pm-state-bypass } interface { macstadium_network_name }` 6. Save changes: * `write memory` * To feed the complete configuration into your Cisco ASA/ASAv, see [Site-to-Site VPN Config](/iaas/connecting-to-other-clouds/site-to-site-vpn-config). # Verify your GCP-to-MacStadium VPN connection Source: https://docs.macstadium.com/iaas/google-cloud-platform/verify-gcp Verify a GCP-MacStadium VPN using the Cisco ASDM-IDM CLI. Checks ISAKMP security associations to confirm the tunnel is active after configuration. After you have completed both the Google Cloud Platform (GCP) and the MacStadium sides of the configuration, you might want to verify that the tunnel is working as expected. 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select **Tools > Command Line Interface**.\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click **Send**. ``` show crypto isakmp sa ``` If the site-to-site VPN connection is configured properly, you should see information about an active IKEv1. For more information about this verification command, see [Cisco Documentation: show crypto isakmp sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#isakmp_sa). ## Verify that there is an IPsec security association between peers 1. Verify that you are connected via VPN to your MacStadium private cloud. * For more information about how to connect to the VPN, see [Connecting to Your Cloud via VPN](/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn). 2. Run Cisco ASDM-IDM and log in. * For more information about how to log in to your firewall, see [Logging into Cisco Firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall). 3. In the Cisco ASDM-IDM application toolbar, select Tools > Command Line Interface\\ Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select Single Line, enter the following command, and click Send. ``` show crypto ipsec sa ``` If the site-to-site VPN connection is configured properly, you should see a detailed log. For more information about this verification command, see [Cisco Documentation: show crypto ipsec sa](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#ipsec_sa). ## Verify that the tunnel is connected 1. Log in to your GCP console. 2. From the GCP console sidebar, scroll to the Networking section and select **Hybrid Connectivity > VPN**.\\ GCP Hybrid Connectivity VPN navigation in sidebar 3. On the Cloud VPN Tunnels tab, locate the tunnel to MacStadium and check the value for VPN tunnel status. When your tunnel is properly connected, the status is: Established.\\ GCP Cloud VPN Tunnels tab showing tunnel status as Established ## Test traffic and visibility through the tunnel 1. Verify that you have created a virtual machine in MacStadium. 2. Verify that you have created a virtual machine instance in GCP and that you have enabled user login on it. * For more information about user login on GCP instances, see [Google Cloud Documentation: Setting up and configuring OS Login](https://cloud.google.com/compute/docs/instances/managing-instance-access). 3. In the terminal on your MacStadium VM, run the following command. * Replace `` with the username for your GCP instance. * Replace `` with the private IP of the GCP instance. ``` ssh @ ``` 4. When prompted, provide your password or key for the specified username on the specified GCP instance. * If the connection is successful, the prefix of the terminal becomes ``@``. This indicates that you have connected from MacStadium to GCP over the tunnel. 5. Run the following command. * Replace `` with the username for your MacStadium VM. * Replace `` with the private IP of the MacStadium VM. ``` ssh @ ``` 6. When prompted, provide your password or key for the specified username on the specified MacStadium VM. * If the connection is successful, the prefix of the terminal becomes ``@``. This indicates that you have connected from GCP to MacStadium over the tunnel. ## Troubleshooting See our [GCP Troubleshooting](/iaas/google-cloud-platform/gcp-troubleshooting) doc for some common issues with GCP-MacStadium Site-to-Site VPN Connections. # Can I change the OS on my server from macOS to Linux? Source: https://docs.macstadium.com/iaas/iaas-faqs/can-i-change-the-os-on-my-server-from-macos-to-linux Mac servers at MacStadium run macOS and cannot be converted to Linux. For Linux or Windows workloads, MacStadium recommends Private Cloud x86 VMs instead. MacStadium recommends our Private Cloud x86 VMs for Linux or Windows OS. # Root and admin access on MacStadium Mac servers Source: https://docs.macstadium.com/iaas/iaas-faqs/do-i-have-root-and-admin-access-to-subscription-based-mac-servers MacStadium provides admin access on every macOS subscription with SSH and VNC enabled by default. Full system control, subject to the Terms of Service. For every subscription to a hosted Mac running macOS, we provide an administrator account and the ability to modify system-level files. Login as administrator to a Mac running macOS and you have complete control over the system. SSH and VNC access are enabled by default on dedicated servers so you can access them from any device. It's no different than if the server were on your local network. We do require that you follow the guidelines set in our [Terms of Service and Acceptable Use Policy](https://www.macstadium.com/legal) which you must agree to during checkout. # MacStadium REST API for server management Source: https://docs.macstadium.com/iaas/iaas-faqs/macstadium-api Automate MacStadium server management via REST API at api.macstadium.com. Use HTTP Basic or Bearer token auth to list servers, reboot, and query status. Interact with our system programmatically from your own applications ## How It Works The API is similar to the [RESTful](https://en.wikipedia.org/wiki/Representational_State_Transfer) architecture, accepting and returning JSON data. Authentication is implemented as HTTP Basic Authentication over SSL (`https`) and Bearer token (generated from Users page, Tokens tab). Failed authentication attempts return a `401 Unauthorized`. 20 failed authentication attempts lock out the requesting IP for 5 minutes (no response). The examples below include the [HTML contenteditable attribute](https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Editable_content) to allow adjustment of credentials and/or IP address prior to copying and pasting elsewhere, e.g., your terminal. ### List All Servers URI: `https://api.macstadium.com/core/api/servers`\ Request: `GET`\ Return: JSON array of `{id, name, ip, type, location, status, creation_date, cancel_date}` or error string. Servers with multiple IPs will have multiple listings. **Example 1:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET -u user:pass https://api.macstadium.com/core/api/servers ``` **Example 2:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -H 'Authorization: Bearer {token}' -X GET https://api.macstadium.com/core/api/servers ``` ### Server Status by ID/IP URI: `https://api.macstadium.com/core/api/servers/{id or ip_address}`\ Request: `GET`\ Return: JSON array of `{id, name, power, type, location, status, creation_date, cancel_date}` or error string. `power` can be `On`, `Off`, `Rebooting`, or `Error`. **Example 1:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET -u user:pass https://api.macstadium.com/core/api/servers/192.168.1.101 ``` **Example 2:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET -H 'Authorization: Bearer {token}' https://api.macstadium.com/core/api/servers/192.168.1.101 ``` ### Server Action (Power) by ID/IP URI: `https://api.macstadium.com/core/api/servers/{id or ip_address}/{action}`\ Request: `GET`\ Params: `action` can be `On`, `Off`, or `Reboot` (case insensitive).\ Return: String. `True` on success or an error message. **Example 1:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET -u user:pass https://api.macstadium.com/core/api/servers/192.168.1.101/reboot ``` **Example 2:** ```bash theme={null} curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET -H 'Authorization: Bearer {token}' https://api.macstadium.com/core/api/servers/192.168.1.101/reboot ``` # Hard reboot a MacStadium Mac from the portal Source: https://docs.macstadium.com/iaas/iaas-faqs/reboot-your-mac Mac not responding and SSH is down? Use Hard Reboot in the MacStadium portal. Includes Energy Saver settings so the Mac comes back online automatically. If your Mac locks up or connecting via SSH becomes unavailable, you should first use the Power Management ‘Hard Reboot’ feature included with every dedicated MacStadium server subscription via your control panel on the MacStadium website. Click a subscription, then select 'Hard Reboot' on the right hand side of the page. PortalReboot.png By clicking this button, you are sending a signal to a power-supply dedicated to your Mac in the data center. The power-supply will drop power for a few seconds and then restore power. In order for this feature to work as desired, it is important that your Mac's Energy Saver/Battery settings are configured as shown below. All of our macs are configured with these settings by default, so no adjustment is needed. In macOS Ventura (13.x), Sonoma (14.x), Sequoia (15.x) and later, select **System Settings** from the **Apple Menu** and configure as follows: * Under the **Energy Saver** section: * Enable Prevent automatic sleeping when the display is off * Enable Start up automatically after a power failure * Enable Wake for network access * Under the **Lock Screen** section: * Set Turn display off when inactive to Never * Under the **Displays** section: * Set **Advanced** > **Prevent automatic sleeping on power adapter when the display is off** (if available) In earlier versions of macOS (Monterey (12.x) and older), select System Preferences from the Apple Menu and configure as follows: * Click **Energy Saver** * Set **Display Sleep** to **Never** * Computer Sleep: Set to Never * Uncheck ‘Put the hard disks to sleep when possible’ * Check ‘Wake for Ethernet network administrator access’ * Uncheck ‘Allow power button to sleep the computer’ * Check ‘Restart automatically after a power failure’ * Click Schedule * Set Start up or wake Every day at 4AM (in case you ever accidentally shut your mac down permanently) # Troubleshooting Connectivity Issues Source: https://docs.macstadium.com/iaas/iaas-faqs/troubleshooting-connectivity-issues Can't connect to your MacStadium device? Self-service guide: run a traceroute to find where the connection breaks, then check VPN and firewall settings. If you're unable to connect to your device, follow these self-remediation steps in order to diagnose and resolve the issue. ## Step 1: Verify Network Path with Traceroute Run a traceroute to your device to check accessibility and identify where the connection path breaks: **For macOS and Linux users:** ``` traceroute ``` **For Windows users:** ``` tracert ``` Analyze the traceroute results to determine the issue: ### Issue: Route fails to reach MacStadium data center **Likely cause:** Local network, firewall, or VPN configuration blocking access. **Resolution:** 1. Verify your local internet connection is working properly 2. Check your firewall settings to ensure traffic to MacStadium data centers is allowed 3. If you're using a VPN: * Confirm the VPN connection is active * Verify your VPN configuration permits access to MacStadium IP ranges 4. Try connecting from a different network to rule out local network restrictions ### Issue: Route reaches MacStadium data center but stops before the device **Likely cause:** Your device may be powered off. **Resolution:** 1. Power on the device through the portal 2. Wait 2-3 minutes for the machine to fully boot 3. Test connectivity with another traceroute /tracert or ping: ``` ping ``` 4. Once the device responds to ping, attempt your VNC connection again ### Issue: Route reaches your device, but VNC connection fails **Likely cause:** VNC service issue or incorrect port configuration. **Resolution:** 1. Verify you're using the correct VNC port for your device 2. Restart the device through the portal 3. Wait 2-3 minutes for the machine to fully boot 4. Test connectivity with another traceroute /tracert or ping: ## Step 2: Still having issues? If you've completed all the steps above and still cannot connect to your device, please open a support ticket with the following information: * The issue you're experiencing * Results from your traceroute * Steps you've already attempted * Any error messages you're receiving Our support team will investigate further and help resolve your connectivity issue. # Data Center Locations Source: https://docs.macstadium.com/iaas/iaas-overview/data-center-locations MacStadium data centers in Atlanta, Las Vegas, and Dublin. Test IP addresses are provided to measure latency from your location before choosing a region. When choosing a data center to start a subscription, keep in mind the geographic locations of all those attempting to access the server. If low latency is important, then the closer the servers are physically, the better the connection quality is. Here is a set of IP addresses, one for each data center, to test latency or perform a trace route: ### Atlanta 208.52.190.1 ### Dublin 208.83.1.1 ### Las Vegas 207.254.73.1 # Infrastructure as a Service (IaaS) Source: https://docs.macstadium.com/iaas/iaas-overview/infrastructure-as-a-service-iaas MacStadium IaaS: bare metal Mac access across data centers in Las Vegas, Atlanta, and Dublin. SOC 1/2/3 and ISO 27001/27017/27018 certified infrastructure. ## About Infrastructure as a Service (IaaS) at MacStadium provides secure, high-performance access to bare metal Mac infrastructure, optimized for a variety of development, testing, and general compute workflows. ## Overview MacStadium has three secure global data centers across the globe: * **Las Vegas, USA** * **Atlanta, USA** * **Dublin, Ireland** The data centers adhere to industry-leading security and compliance certifications, including SOC 1, SOC 2, SOC 3, ISO 27001, 27017, and 27018. For more details, visit the [Trust page](https://trust.macstadium.com/). ## Getting Started ### Bare metal Mac models MacStadium offers a variety of standard models of the latest Mac Mini and Mac Studio configurations, optimized for various tasks. These models provide flexibility for users requiring different levels of performance, from lightweight testing to resource-heavy production environments. ### Networking and Storage MacStadium infrastructure provides networking and storage solutions that address secure access and throughput controls. * **Cisco ASAv Firewalls**: High-end and high-performance firewall systems that ensure secure network segmentation and traffic management. * **Pure Storage**: Reliable, high-speed storage for optimal data performance and redundancy. * **MacStadium Private Cloud Networking**: Networking solution to provide for secure access and up to 1 Gbps throughput. ### Key differentiators * **Optimized Mac Models**: Mac Mini and Mac Studio offerings are designed to handle a wide range of tasks, from development and testing to high-performance media production environments. * **Consistent Pricing**: Enjoy predictable fixed pricing, ensuring cost efficiency to scale. * **Integrated Virtualization with Orka**: MacStadium provides the best experience in managed Orka deployments for virtualized Mac compute at scale. * **Apple Expertise**: With years of specialized experience in Mac infrastructure, MacStadium delivers a high-level of service and support. * **High Security Standards**: MacStadium complies with enterprise security standards, ensuring customer data and operations remain safe and compliant. ## Data center certifications All of our data centers are audited and/or certified by various internationally-recognized attestation and certification compliance standards. For a full list of certifications, please visit the [Trust Center](https://trust.macstadium.com/). # MacStadium IaaS networking overview Source: https://docs.macstadium.com/iaas/networking/networking-overview Overview of MacStadium IaaS networking: VPN access, site-to-site tunnels to AWS, Azure, and GCP, custom domains, firewall config, and IP Plan resources. MacStadium IaaS environments run on a private network. All access, whether you're connecting from your local machine, a cloud provider, or a CI/CD system, goes through one of the networking options below. ## VPN access The most common way to connect to your MacStadium environment. MacStadium provisions a Cisco ASA or ASAv firewall with VPN access included. You connect using a VPN client (Cisco AnyConnect or compatible) with credentials provided at onboarding. * [Firewall overview and hardware options](/iaas/cisco-firewalls/network-firewalls-overview) * [Network onboarding form](/iaas/cisco-firewalls/network-onboarding-form) * [Prepare VPN config for Cisco ASA/ASAv](/iaas/cisco-firewalls/prepare-the-vpn-configuration-for-input-into-cisco-asaasav) ## Site-to-site VPN tunnels For persistent, automated connectivity between your MacStadium environment and a public cloud, use a site-to-site IPsec VPN tunnel. MacStadium supports tunnels to AWS, Azure, and Google Cloud Platform. * [Connect to AWS](/iaas/aws/site-to-site-vpn-configuration-with-aws) * [Connect to Azure](/iaas/azure/site-to-site-vpn-configuration-with-azure) * [Connect to GCP](/iaas/google-cloud-platform/site-to-site-vpn-configuration-with-gcp) * [Connect to other clouds](/iaas/connecting-to-other-clouds/other-clouds) ## IP plan Every MacStadium environment is assigned a private IP range. Your IP plan document (provided at onboarding) maps out your assigned addresses, gateway IPs, and subnet structure. Keep this on hand; you'll reference it when configuring VPN tunnels and firewall rules. * [Understanding your IP plan](/macstadium/macstadium-overview/ip-plan) ## Firewall configuration MacStadium-provisioned Cisco firewalls are fully customer-configurable. You have root access to manage rules, users, and VPN settings directly. * [Log in to your firewall](/iaas/cisco-firewalls/logging-into-cisco-firewall) * [Configure the firewall](/iaas/cisco-firewalls/network-firewalls-configuration) * [Allow specific IPs from the internet](/iaas/cisco-firewalls/allowing-specific-ips-to-access-macstadium-via-internet) * [Submit a firewall change request](/iaas/cisco-firewalls/firewall-change-request-form) # Private Cloud Network Attached Storage Source: https://docs.macstadium.com/iaas/storage/private-cloud-network-attached-storage Create and manage a NAS virtual machine in MacStadium Private Cloud to share storage across VMs and machines on your private network. Network Attached Storage (NAS) devices are specialized servers that handle only data storage and file-sharing requests. They provide fast, secure, and reliable storage services to private networks. NAS is managed through the same interface as other virtual servers in the network, so it can move from one physical host to another. NAS functionality can be added by downloading and implementing an instance of the standard NAS VM Recipe. The NAS service is a dedicated virtual machine that presents itself as a service providing users the ability to create and manage file based storage without the need for using physical or virtual appliances. Each NAS service is complete with its own dashboard and is completely managed from the user interface. ## About NAS NAS lets you take storage in Private Cloud and expose it to other machines, then share that storage between machines. It is a virtual NAS with redundancy. NAS storage can be exposed to other machines over the network. NAS allows for virtual machines to share storage with assets inside or outside of the Private Cloud, then use a file share to move files back and forth between machines. NAS is used to expand storage and to share files between Macs, and you can configure this yourself. ## Create the NAS Service The NAS service is a dedicated virtual machine that presents itself as a service providing users the ability to create and manage file based storage without the need for using physical or virtual appliances. Each NAS service includes its own dashboard and is fully managed from the user interface. Using the integrated NAS service takes advantage of the VergeIO snapshot engine and deduplication algorithm to get the most of usable storage space. 1. From the Cloud Dashboard, select **NAS** from the left menu. Private Cloud left sidebar with NAS option highlighted NAS 2. The **NAS Dashboard** opens. For a new user, when this dashboard is opened for the first time, there are no NAS services or volumes. A NAS Service is the virtual machine in Private Cloud that runs the virtual NAS. Private Cloud NAS Dashboard with no services and New NAS Service button NEW NAS Services 3. Click **New NAS Service** to open a recipe that is used to create the new NAS service. Private Cloud New NAS Service recipe form with VM Recipe Instance fields VM Recipe Instance This recipe only deploys NAS appliances for Private Cloud. 4. Complete the following information: * Enter a ****Name**** for the new NAS Service. * The default setting for ****Cores**** is 4. * The default setting for ****RAM**** is 4 GB 8 GB of RAM is required for antivirus to be enabled. If fewer than 8 GB of RAM are used, then a warning message appears. The message can be disabled, or the RAM can be set to 8 GB. The antivirus only protects the computers connected to the NAS, which is done by scanning the files on the volume. Some users may decide to keep the Antivirus and some users may decide to use less RAM. The system-defined-default ****Cluster**** is automatically selected. * Select the ****Network**** on which the NAS should run. Options include Internal and External networks. * Select ****IP Address Type**** for the NAS Service. * Select **Static** Consult the IP Plan in your MacStadium Portal account to determine an IP Address that does not conflict with existing machines. * Define a ****Hostname**** for the NAS Service VM. * **OPTIONAL**: Enter a ****domain.**** (If the Domain field is left blank, the system defaults the domain to **workgroup**.) * ****Timezone**** defaults to the default time zone. * The **default** ****NTP Servers**** setting is recommended. This defines the Network Time Protocol (NTP) servers list, which is used for keeping the NAS service time synchronized. * **OPTIONAL**: Enter the address of a ****Remote Syslog server.**** * **OPTIONAL**: Enter a ****Remote Syslog Template.**** 4. Click **Submit**, and the NAS appears in the **NAS Service list**. Private Cloud NAS Service list showing the newly created NAS serviceNewly Created NAS Service 5. To disable the **Antivirus** checkbox, deselect the checkmark and the **Antivirus Settings** box opens. Private Cloud NAS Service settings with Antivirus checkbox Antivirus Checkbox 6. Uncheck the box and click **Submit**. Private Cloud Antivirus Settings dialog with Submit button Antivirus Setting 7. Double-click the **Service** to bring up the Dashboard for the Service. 8. Select **Power On** to start the NAS. Private Cloud NAS Service dashboard with Power On button Power On 9. Click the **Yes** to confirm power on. To utilize the NAS service, at least one **Volume** needs to be implemented. A NAS service consists of one or more Volumes. Each Volume is a separate directory structure with its own settings for security, snapshots, storage tier, max size, antivirus, and sharing. 10. The next step is to create a NAS User. ### Create a NAS User 1. From the Main Dashboard, select **NAS**. 2. Select **NAS Services** → **Select a Service**. Private Cloud NAS Services list with a service to select Select a Service 3. Double-click a Service. Private Cloud NAS Service detail showing NAS User option NAS User 4. Select **NAS User**. Private Cloud NAS Service Users tab NAS User 5. Select **New** to add a new NAS User. (This page is also used to edit or delete a user.) Private Cloud New NAS User form with username and password fields NAS User This is per service. For every virtual NAS appliance, there must be a set of users assigned to it. * Required: **Username** * Required: **Password** * Optional: **Display Name** * Optional: **Description** * Optional: **Home Share** * Optional: **Home Drive Letter** 6. Click **Submit**. Private Cloud NAS Users list showing the newly created user New User 7. The next step is to create a Volume. ## Volumes A NAS service consists of one or more Volumes. Each Volume is a separate directory structure with its own settings for security, snapshots, storage tier, max size, antivirus, and sharing. Multiple volumes can be set up on the NAS, and the size of the volume determines the space available to deploy files on the NAS. Volume-level snapshots allow for customizing snapshot schedule and retention rules per individual NAS volume and provide the option for a quiesced snapshot. (Non-quiesced NAS volumes can be imported from Cloud snapshots to be used for restore.) Quiesced volume snapshots freeze file system during the snapshot process. The Quiesce option can be selected when taking a manual volume snapshot and can be enabled within the snapshot profile for automated snapshots. ### About Volumes There are two types of Volumes: * **Local Volumes** are file systems stored within Private Cloud and consume storage in the vSAN. Each local volume can have different sharing, syncing, tiering, and permission settings. * **Remote Volumes** are external file systems that are mounted to the VergeIO system and presented as if local. ### Creating Local Volumes 1. From the Main Dashboard, select **NAS**. 2. Select **Volumes** from the left menu. Private Cloud left menu with Volumes option highlighted Volumes When the NAS is first created, one volume (for log files) is automatically created. 2. Select **New** from the left menu. Private Cloud Volumes page with New button in left menu New 3. Select the appropriate ****NAS Service**** from the dropdown list. Private Cloud New Volume form with NAS Service dropdown NAS Service * Enter a ****Name**** for the volume (required). Spaces are not permitted. * Enter a ****Description**** for the volume (optional). * In the ****Filesystem Type**** dropdown list, select **Local Volume (EXT4)**. * The ****Encrypt Volume**** option can be selected to encrypt the entire volume (AES-XTS). **Encryption Considerations** * **Encryption selection is only available during creation**; a volume cannot be changed from encrypted to unencrypted or vice-versa after creation. * **Minor to moderate performance implications** are involved with enabling volume encryption. * The **original encryption key** (defined when creating the volume) is needed for the lifetime of the volume; this encryption key must be **entered each time the volume is brought online** (for example, after disabling/enabling a volume or after its NAS service is rebooted). * **Without the encryption key, it is not possible to bring the volume back online.** 4. Click **Submit.** 5. The next step is to create a Share (NFS or CIFS). ## Shares: NFS and CIFS Network File System (NFS) and Common Internet File System (CIFS) are both file access protocols that allow client systems to access files on remote devices. ### About NFS and CIFS * NFS uses a lightweight protocol with less overhead, which results in faster file access and transfer speeds. * CIFS has more protocol overhead due to its support for various Windows-specific features. This can impact performance, especially in high-latency networks. MacStadium recommends using CIFS. ### Creating a CIFS Share on an Existing Volume CIFS (Common Internet File System) is a network protocol that allows clients to communicate with servers and access file sharing and print services as if they were stored locally. CIFS offers strong security features, which make it suitable for secure environments. It is important in Private Cloud because it allows access to a NAS volume over CIFS/SMB. 1. Navigate to the **NAS Dashboard**. 2. Click **New CIFS Shares**. Private Cloud NAS Dashboard with New CIFS Shares button New CIFS Shares 3. In the **CIFS Shares** screen enter the necessary information. Private Cloud CIFS Shares form with Name, Share Path, and permissions fields CIFS Shares * Required: Enter a **Name** for the CIFS share. * Optional: **Share Path** can be entered to define a specific path within the Volume; **otherwise**, this field **can be left blank** to share the entire Volume. * Optional: A **Description** can be entered for the Share to record additional information about the Share. * Optional: A **Comment** can be entered for the Share. * Optional: A **Valid Users** list can be specified. This defines the users that are allowed to connect to the Share. * Optional: A **Valid Groups** list can be specified. Users of the specified groups are allowed connection to the Share. * Optional: **Allowed Hosts** field is to define one or more hosts that are permitted to access the Share. Hostname, IP address, domain name, netgroup, and subnet are all valid entries. * Optional: **Denied Hosts** field is to define one or more hosts that are NOT permitted access to the Share. **Hostname, IP address, domain name, netgroup, and subnet are all valid entries.** * Optional: **Read-Only** option can be selected to deny any write operations via this Share. * **Browseable** option can be selected to make the Share visible in lists of available shares. **This option is disabled by default**. Optional: **Users / Admin Groups** allow is to grant administrative privileges to the Share. This means that all file operations will be done as the super-user (root). Use this option carefully, as those in the list can do anything on the Share, regardless of individual file permissions. * Optional: **User / Force Group** options can be specified to define a user or group used for all file operations performed via this Share. * Optional: **Configuration Options** (advanced samba share options) can be specified to handle special-case scenarios. 3. Click **Submit**. Private Cloud NAS CIFS Shares list showing the newly created share Newly Created CIFS Share ### Creating a NFS File Share on an Existing Volume 1. From the Main Dashboard, select **NAS**. Private Cloud left sidebar with NAS option highlighted NAS 2. Select **Volumes**. Private Cloud NAS left menu with Volumes option highlighted Volumes 3. Select the **Volume**. Private Cloud Volumes list with a volume row highlighted View 4. Select **View**. Private Cloud Volume detail page showing NFS Shares and other options Volumes 5. Select **NFS Shares**. Private Cloud Volume NFS Shares tab NFS Shares 6. Select **New** to create a new share. Private Cloud NFS Shares page with New button New * Enter a Name for the share * Enter a Share Path to define a specific path within the volume * Enter a Description for the share * Select Allow Everyone to allow all hosts, or specify one or more allowed hosts * Select a Data Access option * Select a User/Group Squashing option 7. Click **Submit**. ## Connecting to the Share Now that the NAS Service, Volume, Users, and Share are created, end users can map to the shared drive from their Mac mini or other devices on the network. # Private Cloud VM restorable snapshots Source: https://docs.macstadium.com/iaas/storage/restorable-snapshots Create and restore point-in-time snapshots of MacStadium Private Cloud VMs or entire instances. Supports both scheduled and on-demand snapshot management. ## Snapshots A snapshot is a restorable point-in-time copy of a VM or Private Cloud storage. Snapshots can be used to revert either individual virtual machines, or an entire Private Cloud instance back to the snapshotted state. Snapshots can be run either as part of a schedule or on-demand. Snapshots are particularly useful in the event of a misconfigured environment, as restoring from a cloud snapshot can revert the entire environment to its previous state. There are two types of snapshots: * **Cloud Snapshot**: a snapshot of an entire Private Cloud instance. * **VM Snapshot**: a snapshot of an individual Virtual Machine. ### Snapshot Profiles Snapshots are created by using snapshot profiles. Once a snapshot profile is set up, it can be set to automatically snapshot machines on a regular basis according to stored schedules. The retention period, frequency, and machines snapshotted are all configurable. A snapshot profile can be assigned to an entire Private Cloud, an individual VM, or a NAS volume. Private Cloud includes multiple default snapshot profiles that can be used out of the box or modified as needed. You can also create new snapshot profiles from scratch. **Default Snapshot Profiles** Default profiles are readily available and can be modified if needed. The following are default snapshot profiles: * **SOX (Sarbanes-Oxley)** * Yearly snapshots retained for 7 years * Monthly snapshots retained for 1 year * Weekly snapshots retained for 31 days * Daily snapshots retained for 7 days * **HIPAA (Health Insurance Portability & Accountability Act)** * Yearly snapshots retained indefinitely (no expiration) * Monthly snapshots retained for 1 year * Weekly snapshots retained for 31 days * Daily snapshots retained for 7 days * **NAS Volume Syncs** * Daily (at 6pm) snapshots retained for 3 days * **Cloud Snapshots** (suggested default profile for entire-system snapshots) * Hourly for 3 hours * Daily (at midnight) snapshots retained for 3 days * Daily (at noon) snapshots retained for 1 day Any of the default profiles can be modified to meet individual needs or requirements. ### Using a Default Snapshot Profile 1. Click **System**. Private Cloud main dashboard with System option in left menu 2. Click **Snapshot Profiles** and a list of default snapshot profiles appears. Private Cloud System menu with Snapshot Profiles option 3. In this example, we'll show the SOX profile, which was created for compliance focused orgs, but MacStadium recommends Cloud Snapshots for normal use cases. Private Cloud Snapshot Profiles list showing SOX and other default profiles 4. Double-click SOX row, and the **SOX Snapshot Profile** opens. Private Cloud SOX Snapshot Profile detail showing four snapshot periods The default SOX snapshot profile has 4 periods: * A snapshot is taken Daily. It is retained for 7 Days. * A snapshot is taken Weekly. It is retained for 4 Weeks. * A snapshot is taken Monthly. It is retained for 1 year. * A snapshot is taken Yearly. It is retained for 7 years. There is a **+ Add Period** button, which can be used to add more snapshots. For example, a user might want an hourly snapshot or a 6-hour snapshot. The retention time can also be set. 5. In this example, click **+ Add Period** to modify the existing default snapshot profile. The **Snapshot Profile Period** screen opens. Private Cloud Snapshot Profile Period form with frequency and retention fields In this example, an hourly snapshot profile is created and the retention period is 3 days. This means every hour a snapshot is taken, and then it is kept for 3 days, causing 72 snapshots to be stored. 6. Click **Submit** to create the new snapshot profile. Private Cloud SOX Snapshot Profile updated with Hourly, Daily, Weekly, Monthly, and Yearly periods This snapshot profile now has the following snapshots: * Hourly * Daily * Weekly * Monthly * Yearly Depending on individual needs and circumstances, this snapshot might be capturing too much or too little data. But it is important to remember that snapshots can be modified as needed, and starting with a default snapshot profile might be helpful. For new users who do not have any snapshot profiles assigned, MacStadium recommends enabling the default Cloud Snapshots profile for Cloud snapshots. This profile stores 3 days of snapshots at varying frequencies, enabling recovery to a recent state in the event of a misconfiguration. ### Cloud Snapshots The Cloud Snapshot profile determines the schedule used for creating snapshots of the entire system. MacStadium recommends setting a Cloud Snapshot profile for most Private Cloud instances. Scheduled Cloud Snapshots are disabled by default. To enable cloud snapshots, navigate to **System → Cloud Snapshots** and select the snapshot profile to use. If a Cloud Level Snapshot is configured, individual VM snapshots may not be needed. Cloud Snapshots include every VM and volume in a Private Cloud instance, and are taken in addition to VM snapshots. #### Enabling Cloud Snapshots 1. From the main dashboard, click **System** on the left menu. Private Cloud main dashboard with System option in left menu 2. Click **Cloud Snapshots** from the left menu and you'll see the list of Snapshots. Private Cloud Cloud Snapshots list page Private Cloud Cloud Snapshots page showing no profile selected 3. Click **Select Snapshot Profile** from the left menu. Private Cloud Cloud Snapshots left menu with Select Snapshot Profile option 4. Select desired **snapshot profile** from the dropdown list. * The default Cloud Snapshots profile is recommended as a starting point for Cloud Snapshots. 5. Click **Submit** at the bottom of the page. Private Cloud Select Snapshot Profile form with dropdown and Submit button Once a Cloud Snapshot has been created, it can be viewed by clicking **Snapshot → Cloud Snapshots.** Private Cloud Cloud Snapshots list showing a newly created snapshot entry ### Manually Creating a Cloud Snapshot 1. From the main dashboard, click **System** from the left menu. 2. Select **Cloud Snapshots**. 3. Select **New** from the left menu. Private Cloud Cloud Snapshots left menu with New option 4. Fill in the form: * **Name** (required): enter a name for the snapshot. * **Description** (optional): enter a description. * **Expires**: select a date and time for expiration. * **Expiration Type**: you can select **Never Expire**, but this is not recommended. Snapshots without an expiration can consume substantial amounts of storage. Private Cloud New Cloud Snapshot form with Name, Description, and Expires fields 5. The **Private** checkbox is selected by default. This option pertains to multitenancy and can be ignored in most cases. 6. Click **Submit**. ### Managing Profiles for Scheduled Snapshots These profiles pertain to any snapshot that uses them. 1. From the main dashboard, click **System** from the left menu. Private Cloud main dashboard with System option in left menu 2. Click **Snapshot Profiles** from the left menu. Private Cloud System menu with Snapshot Profiles option highlighted 3. Click the desired snapshot profile. Private Cloud Snapshot Profiles list with a profile row highlighted 4. Click **View**. Private Cloud Snapshot Profile dashboard showing periods and edit options The dashboard for the selected profile opens. * To add periods to the profile click the **+Add Period** link. (A snapshot profile can contain multiple periods.) * To modify an existing period: click the (pencil icon) to the far right. * To remove existing periods: click the (trash can icon) to the far right. # Creating a New VM Manually Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/creating-a-new-vm-manually Create a Private Cloud VM manually using an uploaded ISO. Used for OS versions not available as recipes. More effort than recipe-based deployment. In addition to deploying VMs using recipes, virtual machines may also be created manually. This is primarily done when specific versions of OSes are required (for instance, desktop versions of Windows). Manually deployed VMs take additional effort to configure when compared to deployments from recipe. MacStadium recommends the use of recipes for VM deployment whenever possible. ## Uploading Images For manually created VMs, guest operating systems are installed by adding a CD-ROM device with media file set to a bootable install ISO. Install ISOs are stored in the Media Images repository. To upload an ISO for installation: 1. Select **Machines → Media Images**. Private Cloud sidebar with Media Images option selected *Media Images* 2. The **Media Images** page shows stored install disk and uploaded VM images. There are two ways to upload images for install: * Upload from URL - Private Cloud downloads the image from a remote URL * Upload - The image is uploaded from the connected desktop In this example, we will use Ubuntu Server as the install image. ## Upload from URL Upload from URL is the recommended approach, as Private Cloud can often download images faster directly from the repository. 3. Find a direct link for the install media for the desired OS. In this case, Ubuntu only offers direct links through their mirror, so we'll select Alternative downloads, and get the URL from a mirror. Ubuntu Server download page showing Alternative downloads option*Example: Ubuntu Server Download* Ubuntu mirror download page with direct ISO links*Direct Download links from Mirror* 4. Upload the image to Private Cloud from the mirror. Return to the **Media Images** pages. 5. Select **Upload from URL**. Private Cloud Media Images page with Upload from URL button *Upload from URL* 6. The **Upload from URL** dialog box opens. Private Cloud Upload from URL dialog box *Upload from URL* 7. Paste the download link into the **Upload from URL** page. Private Cloud Upload from URL field with download link pasted Copy Link 8. Click **Submit**, and the **Upload Process** begins. Private Cloud Media Images page showing upload progress*Upload Process* ## Upload Directly 1. To upload an ISO from the connected computer, choose Upload on the Media Images screen. The **Upload Files** screen appears. Private Cloud Upload Files screen for local ISO upload Upload Files Screen 2. Click **Upload**, and the **Upload Process** begins. Private Cloud Media Images page showing direct upload progress Upload Process # Creating a New VM with a Recipe Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/creating-a-new-vm-with-a-recipe Create a Private Cloud VM from a MacStadium recipe: a template that pre-configures OS, apps, network, and storage. Recommended over manual VM creation. You can create a new VM using a predefined recipe. Recipes are VM image templates that allow the automated creation of a new preconfigured VM with the selected operating system, applications, and configuration information. Recipes are quick and convenient, and may be preloaded with various software configurations. To enable configuration, recipes include questions about each instance, such as the desired network configuration, username and password, in addition to standard VM parameters such as drive size or amount of RAM. MacStadium recommends using a recipe when deploying a new VM, especially for users new to this process. Recipes ensure that VMs are configured optimally for operation within Private Cloud, and are much faster to install and deploy when compared to manual VM creation. 1. Select **Machines Dashboard → Virtual Machines.** 2. Click **New VM**. Private Cloud Machines Dashboard with New VM button *New VM* 3. The *Select Type* tab opens. The left-hand side of the screen contains a list of options (Operating Systems, Services, and so on.) The right-hand side of the screen contains a list of recipes. Private Cloud Select Type tab showing OS recipes list with Ubuntu Server highlighted *EXAMPLE - > Existing Recipe, for Ubuntu Server (recommended)* MacStadium recommends using a preexisting recipe if one exists for the OS you need. Recipes always install the latest version of the selected OS in an optimal configuration with minimal post-installation configuration required. If a recipe does not exist for your OS, select **New VM** and use the template to create a new recipe. 4. In this example, select the recipe for **Ubuntu Server 24.04** and click **Next.** 5. The *Virtual Machine Setting* tab opens. Private Cloud Virtual Machine Settings tab with recipe fields*Virtual Machine Settings Tab* 6. In the *VM Recipe Instance* box, complete the following fields: * **Name** - the machine name used for management inside Private Cloud * **Cores** - specifies the number of vCPUs allocated to this machine * **RAM** - specifies the amount of RAM allocated to this machine * **Cluster** - specifies the compute cluster to deploy the machine to. This should be left as *Default*. * **Hostname** - the network hostname for the machine Private Cloud VM Recipe Instance fields showing Name, Cores, RAM, Cluster, and Hostname *VM Recipe Instance* 7. In the Network box, you must select **Static** from the dropdown box. You must also select the correct **Network** from the dropdown list in order to ensure connectivity to existing MacStadium infrastructure. Otherwise, Private Cloud will provision a new isolated network for the VM. Private Cloud Network section with Static IP type and network dropdown *Network* Do not use DHCP as the IP Address Type when connecting VMs to existing networks. While DHCP is the default setting for IP Address Type, MacStadium Mac infrastructure is deployed with static IPs, and no DHCP server is present. **In order for network connectivity to work for deployed VMs on MacStadium networks, an IP must be set manually using the Static IP Address Type.** 8. In the *Static IP Configuration* box, all fields must be completed. However, the **auto** option in the IP Address field does not work. Complete the following fields: * **IP Address** – Specifies the IP address of the server. The default is **auto, this is an invalid option for the static IP**. Consult the IP Plan in your MacStadium Portal account to determine an IP Address that doesn't conflict with existing machines. * **Subnet Mask** – Specifies the range used for the subnet. This is in CIDR notation. The most common selection is '/24' * **Default Gateway** – Specifies the IP to use for routed external traffic. This should be listed in the IP Plan * **Nameservers** – Specifies the DNS servers to use for name resolution. This is not optional, and must be completed in order to resolve hostnames. The default IP Address is Auto, however, this option does not work. **You must select an IP Address that is not currently being used by your machine, in the subnet of the network you are connected to.** Please consult the MacStadium *IP Plan*. the private subnet, the client can have on reserve, addresses near the end of the subnet. A subnet of 10.254.232.0/24, for example, can reserve address range, 10.254.232.200 through 10.254.232.250 for VMs. This only works for customers who will not use the entire subnet for bare metal hosts. In the Drives box, select the *OS Drive Size* and *OS Drive Tier*. The *OS Drive Tier* specifies the tier of storage to deploy to, currently, only Tier 2 is available. Private Cloud Drives section showing OS Drive Size and OS Drive Tier fields *Drives* 9. In the User Configuration box, complete the following fields: * **User Name** – the desired username for the default user on the server * **Password** – the desired password for the default user on the server * **Confirm Password** Or * **Provide an SSH Key** – optional, enables SSH key authentication for the default user Private Cloud User Configuration section with username, password, and SSH key fields *User Configuration* 10. Click **Submit**. 11. The new VM screen (*Ubuntu Server* , in this case) opens and the drives will begin to initialize. This may take a few minutes to complete, as Private Cloud will fetch the latest disk image for the selected operating system if an update is available. During this time, the Drive status will be listed as *Importing*. Private Cloud new VM screen with drive status showing Importing*New VM Screen* 12. Once the drive has finished importing, the status will change to *Offline.* At this point, the machine is initialized and ready to be powered on. Private Cloud VM screen with drive status showing Offline and ready to launch*Offline = Ready to Launch* 13. Click the **Power** button and the *Confirmation box* opens. Click **Power On**. Private Cloud Power On confirmation dialog *Power On* 14. Open the Console by clicking the **Console** button. Private Cloud VM page with Console button highlighted Console Button 15. When the Console opens, the disk boots and stops at a login prompt. Shortly after, the machine will start to download the latest available software updates. Private Cloud console showing Ubuntu Server login prompt Console For the majority of Linux virtual machine recipes, the Console is configured to appear as a text terminal. This makes copy/pasting text much easier, and enables easy access to terminal history. # Manual Windows Installation Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/manual-windows-installation Windows does not include Virtio drivers by default. These drivers need to be installed from a mounted disk during Windows installation. Windows does not include Virtio drivers by default. These drivers need to be installed from a mounted disk during Windows installation. For Windows Server installation, MacStadium highly recommends the use of the Windows Server recipe. 1. Windows requires additional drivers in order to access Private Cloud's virtualized storage and network hardware. To install a Windows VM manually, select **Machines Dashboard → Virtual Machines.** 2. Click **New VM**. Private Cloud Machines Dashboard with New VM button New VM 3. The *Select Type* tab opens. The left-hand side of the screen contains a list of options (Operating Systems, Services, and so on.) The right-hand side of the screen contains a list of recipes. Select **New VM** and click **Next**. Private Cloud Select Type tab with New VM option selected Next 4. The *Virtual Machine Setting* tab opens. Private Cloud Virtual Machine Settings tabVirtual Settings Tab 5. In the *VM Recipe Instance* box, complete the following fields: * **Name** * **Cores** * **RAM** * **Cluster** (can be left as *Default*) * **OS Family** = Windows * **Attach Virtio Drives** = checked Private Cloud VM Recipe Instance fields with Attach Virtio Drives checkbox checked VM Recipe Instance Make sure the **Attach Virtio Drivers** checkbox is selected. This is required to install the Windows operating system. A Windows Install ISO must be uploaded to Media Images before installation. 6. In the Drives box, make sure the **Create CD-ROM Drive** is set to **Use Local Media Image**. Select an uploaded Windows install ISO. Private Cloud Drives section with CD-ROM Drive set to Use Local Media Image *Drives* 7. In the Network box, set the **NIC Interface** to **Virtio**, and the **Attach Network Interface** to **Internal**. Private Cloud Network section with NIC Interface set to Virtio and Internal network selected Network 8. Click **Submit**. Private Cloud Virtual Machine Settings completed and ready to submitVirtual Machine Settings 9. In the **New VM (Windows)** page, click **Power**. Private Cloud New VM page with Power button highlighted 10. In the **Confirmation** box, click Power On. Private Cloud Power On confirmation dialog *Power On* 11. Open the **Console** by clicking the **Console** button. Private Cloud VM page with Console button highlighted *Console Button* 12. When prompted, press any key to begin installation. 13. The **Windows** screen opens, click **Next**. Windows setup language and region screen *Windows* 14. Click **Install Now**. Windows setup screen with Install Now button *Install Now* 15. Accept the license terms and click **Next.** Windows setup license terms screen *Advanced* 16. Select **Custom: Install Windows Only (advanced)**.Windows setup installation type selection with Custom option *Custom* 17. The installation will fail to find any drives. At this point, the virtio storage drivers need to be loaded to continue the install. Click **Load Driver**. Windows setup Where to install screen with no drives found and Load Driver button *Load Driver* 18. Click **OK**. Windows Load Driver browse dialog OK 19. Select the driver for the corresponding Windows version, according to the folder name. For example, the Windows 10 driver is located in E:\amd64\w10\\. Windows driver selection list showing Virtio SCSI drivers by OS version Windows 10 Driver 20. Windows begins to install. Allow the installation to finish. Network connectivity does not work during the install, this is expected, as Windows does not come with Virtio network drivers. Windows setup installation progress bar Installing Windows 21. Once installed, additional drivers need to be installed to allow network connectivity. To do this, open Explorer, and navigate to This PC. A CD drive with Virtio drivers should be accessible. Windows Explorer showing This PC with Virtio drivers CD drive *CD* 22. **Double click** on **virtio-win-gt-x64**. Windows Explorer with virtio-win-gt-x64 installer file highlighted *File Name* 23. When the **Setup Wizard** opens, click **Next**. Virtio Windows Guest Tools Setup Wizard welcome screen *Wizard* 24. Accept the **terms** and click **Next**. Virtio Windows Guest Tools license terms screen *Terms* 25\. Choose all and click **Next**. *Virtio Windows Guest Tools component selection screen with all options selected* *Select All* 26. Click **Install** to begin the installation. Virtio Windows Guest Tools ready to install screen with Install button *Install* 27. The progress bar appears. Virtio Windows Guest Tools installation progress bar *Progress Bar* 28. Click **Finish** to complete the Setup Wizard. Virtio Windows Guest Tools Setup Wizard completion screen with Finish button Finish 29. Install **Guest tools** by clicking on the file **virtio-win-guest-tools**. Then accept the **license terms** and click **Install**. Virtio guest tools installer with Install button *Install* 30. The progress bar appears. Virtio guest tools installation progress bar Progress Bar 31. Click **Close** to complete the installation. Windows is now ready for use. Virtio guest tools installation complete screen with Close button *Close* # Private Cloud x86 VMs Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/private-cloud-x86-vms Provision Windows and Linux x86 VMs on MacStadium Private Cloud with reserved vCPU, RAM, and storage. Managed via the Machines Dashboard. ## About private cloud Private Cloud enables you to provision non-Mac VMs using reserved compute and storage resources. Non-Mac VMs are essential in enabling certain parts of scalable build systems on Mac, such as caching servers. MacStadium Private Cloud is built on multi-tenant shared cloud infrastructure. You can pay for fixed amounts of isolated compute/storage/networking resources and deploy any combination of virtual machines with their desired configuration. Private Cloud also has network access to Mac infrastructure, allowing the use of non-Mac virtual machines in tandem with Mac compute resources. ## Overview With Private Cloud, you can purchase an allocation of Virtual CPU, Virtual RAM, and Storage and manage the deployment of those resources using Private Cloud's dashboard. Private Cloud Machines Dashboard showing VM cluster statistics and storage usage The Machines Dashboard displays the statistics for the VMs in a cluster. It also displays storage usage as well as machines that are not in use. # VM Creation and OS Installation Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/vm-creation-and-os-installation How to create a new VM manually in MacStadium Private Cloud: configure VM settings, attach an ISO, set a static IP, and install the OS via console. Before following these steps, you need a bootable ISO uploaded to your cluster's Media Images repository. If you haven't done that yet, follow the steps in [Creating a New VM Manually](/iaas/x86-vms-private-cloud-vms/creating-a-new-vm-manually) under the **Uploading Images** section, then return here. 1. Once the file completes the download process and the files appear in the **Media Images** page, Navigate to the **Machines Dashboard**. 2. Click **New VM**. Private Cloud Machines Dashboard with New VM button *New VM* 3. On the *Select Type* tab, select **New VM** and click **Next.** New VM is a blank recipe that allows for manual OS installation. Private Cloud Select Type tab with New VM option selected Select Type Tab 4. The *Virtual Machine Settings* tab opens. Private Cloud Virtual Machine Settings tab *Virtual Machine Settings Tab* 5. In the *VM Recipe Instance* box, complete the following fields: * **Name** * **Cores** * **RAM** * **Cluster** (can be left as *Default*) * **OS Family** Private Cloud VM Recipe Instance fields showing Name, Cores, RAM, Cluster, and OS Family *VM Recipe Instance* It is important that the OS Family matches the OS type installed. 6. In the Drives box: * **Create a CD-Rom Drive**, select *Use Local Media Image* * **Attach Selected iso to CD-ROM**, select the file that was previously uploaded into Media Images * **OS Drive Interface**, select *Virtio-SCSI* *Private Cloud Drives section with CD-ROM Drive and OS Drive Interface settings* *Drives* 7. In the Network box, make sure the Create Network Interface is checked and select the interface from the dropdown. Private Cloud Network section with Create Network Interface checked *Network* Unlike OS Recipe templates, manually created VMs require that IP configuration be done at the OS level, and cannot be configured when deploying the VM. 8. Click **Submit**. Private Cloud Virtual Machine Settings with Submit button *Submit* 9. The new VM screen opens. Click the **Power** button and the *Confirmation box* opens. 10. Click **Power On**. Private Cloud Power On confirmation dialog *Power On* 11. Next, the OS must be installed and configured. To access the machine, click **Console**. Private Cloud VM page with Console button highlighted *Console Button* 12. The **Console** opens. Private Cloud console showing VM display output *Console* Manually deployed VMs use a virtual screen, rather than a virtual terminal, meaning that text cannot be copied from the terminal. 13. Use the console to install the OS as usual. 14. The IP address configuration must be set manually as a part of installation. The process for this can differ, depending on the OS installed. In this example, we are setting a manual IP address for Ubuntu Server 24.04: Ubuntu Server network configuration screen with manual IP address fields*Manual IP Address Assignment* DHCP is not supported. An IP address must be manually assigned, using a free IP address on the IP plan. All fields must be completed to ensure network connectivity. 15. Complete the installation as usual. Most Linux distributions include drivers for Virtio, which is required for optimal performance when virtualizing hardware. # Windows 2022 Installation Source: https://docs.macstadium.com/iaas/x86-vms-private-cloud-vms/windows-2022-installation Install Windows 2022 on MacStadium Private Cloud. Recipes handle ISO download and driver setup automatically; manual installation is also documented. * Installing Windows 2022 from a recipe is easy and downloads the correct ISO, which starts with the right drivers. MacStadium recommends using a recipe to install Windows 2022. Private Cloud New VM dialog with Windows 2022 recipe selected *Windows 2022* # Add a new user to your MacStadium account Source: https://docs.macstadium.com/macstadium/account-management-and-saml/add-a-new-user Invite team members to your MacStadium account, assign roles, and manage user-specific permissions from the MacStadium Portal's account management settings. From the MacStadium Portal, you can add multiple team members to your account and apply user-specific permissions. You can grant access to only certain parts of the portal. For example, you can [add someone in the accounting department to the account](https://portal.macstadium.com/team-members) and allow them to see only accounting-related sections. **Accounts with SSO enabled:** If your organization uses [SAML single sign-on](/macstadium/account-management-and-saml/saml-sso), access to your MacStadium account is controlled by your identity provider, and team members can't be added from the portal. To add a new user, ask your IT team to grant them access to the MacStadium application in your identity provider (for example, by adding them to the appropriate group). Their portal account is set up automatically the first time they [log in with SSO](/macstadium/account-management-and-saml/first-time-sso-login-to-macstadium-portal). To add another team member to the MacStadium account: 1. Log in to the MacStadium Portal. 2. Click the person icon in the top right corner and select **Team Member**. 3. Click **New Team Member** to add a user. ## Required Items for Adding a Team Member * Name * Email address * Role * Phone Number (optional) ## Password Generation Once you add a new team member, MacStadium sends an activation link to the specified email address. The new team member can use this link to set their password. ## Permissions From the Team Member page, click **Edit** to update information and permissions. You can archive a team member or view all archived people from this page. To view all archived team members click the Show Archived checkbox. ### IMPORTANT: Avoid Duplicate Accounts Check with an admin before creating a new user account. Creating a new user account locks the email to that new account and requires a support ticket to fix. If an account is accidentally created, then ask the Admin to file a support ticket under the correct account. # Enable SAML SSO with Microsoft Entra ID Source: https://docs.macstadium.com/macstadium/account-management-and-saml/enable-saml-sso-with-azure-active-directory Set up SAML SSO for the MacStadium Portal with Microsoft Entra ID (Azure AD): create the enterprise app, configure SAML, and share metadata. ## About SAML SSO is a paid offering. Contact your account team through the [Customer Portal](https://portal.macstadium.com) for more information. MacStadium does not support IdP-initiated logins. After SSO is configured, all users must log in at [portal.macstadium.com/sso](https://portal.macstadium.com/sso) using the ID provided by the MacStadium team. You can also log in directly at [portal.macstadium.com](https://portal.macstadium.com/login). ## Overview SAML SSO with Microsoft Entra ID allows customers to: * Enable users to be automatically signed in to MacStadium using their Entra ID accounts. * Manage accounts in one central location: Microsoft Entra ID. ## Getting Started 1. Open **Entra ID admin**. 2. Navigate to **Enterprise applications**.\\ Azure Entra ID admin left sidebar with Enterprise applications option 3. Create a new application by clicking **New Application**.\\ Azure Enterprise applications list with New Application button 4. Create an application by clicking **Create your own application**.\\ Azure Browse gallery page with Create your own application button * Enter a name (for example **MacStadium-Portal**). * Select **Integrate any other application you don’t find in the gallery (Non-gallery).**\\ Azure Create your own application form with name field and non-gallery option selected 5. Click **Single sign-on**.\\ Azure enterprise app overview with Single sign-on option in sidebar 6. Select **SAML**.\\ Azure Single sign-on method selection with SAML option highlighted 7. Click **Edit** on the *Basic SAML settings.*\\ Azure SAML-based Sign-on page showing Basic SAML Configuration section with Edit button 8. Configure the SAML settings: * **Identifier (Entity ID):** `urn:amazon:cognito:sp:us-east-1_pusi8jHs1` * **Reply URL (Assertion Consumer Service URL):** `https://idp.macstadium.com/saml2/idpresponse` * **Logout URL (Optional):** `https://idp.macstadium.com/saml2/logout` * Click **Save** Azure Basic SAML Configuration with Entity ID, Reply URL, and Logout URL fields completed 9. Edit **Attributes & Claims** for your SAML app. The email field must be mapped to `user.mail` or login will fail.\\ Azure Attributes and Claims configuration with email mapped to user.mail Once configured properly, section 2 of your SAML app should look like the below screenshot.\\ Azure SAML app section 2 showing correctly configured Attributes and Claims 10. Once the attributes & claims are updated, please provide our support team with the app federation metadata URL. You can copy the federation metadata URL in section 3 of your SAML app, as shown in the below screenshot.\\ Azure SAML app section 3 showing App Federation Metadata URL to copy # Enable SAML SSO with Google Workspace Federation Source: https://docs.macstadium.com/macstadium/account-management-and-saml/enable-saml-sso-with-google-workspace-federation Configure SAML SSO for MacStadium Portal via Google Workspace. Create a custom SAML app in Google Admin, download metadata, and send it to MacStadium. SAML SSO is a paid offering. Contact your account team through the [Customer Portal](https://portal.macstadium.com) for more information. MacStadium does not support IdP-initiated logins. After SSO is configured, all users must log in at [portal.macstadium.com/sso](https://portal.macstadium.com/sso) using the ID provided by the MacStadium team. 1. Go to [Google Admin Console](https://admin.google.com/) 2. Navigate to “Web and mobile apps” (Apps → Web and mobile apps in the left menu or use [this link](https://admin.google.com/ac/apps/unified))\\ Google Admin Console left menu with Web and mobile apps option highlighted 3. Create a new “Custom SAML App” (click Add app)\\ Google Admin Web and mobile apps page with Add app dropdown showing Custom SAML app 4. Enter “App name” (e.g. MacStadium Portal) 5. Download the metadata by clicking Download Metadata - Keep this file for sharing with our support team later.\\ Google SAML app setup with Download Metadata button 6. Configure * **ACS URL:** `https://idp.macstadium.com/saml2/idpresponse` * **Entity ID:** `urn:amazon:cognito:sp:us-east-1_pusi8jHs1` * Configure email mapping with the "Show Advanced Settings" menu * Select EMAIL for the Name ID Format field * Select Primary Email for the Name ID field\\ Google SAML app Service Provider Details with ACS URL, Entity ID, and Name ID fields 7. Map Primary email to email\\ Google SAML app Attribute mapping with Primary Email mapped to email 8. Click Finish to complete the setup 9. Provide our support team with the metadata file from step 5 # Enable SAML SSO with Okta Source: https://docs.macstadium.com/macstadium/account-management-and-saml/enable-saml-sso-with-okta Admin: configure SAML SSO for MacStadium Portal via Okta. Save the MacStadium certificate, configure the Okta app, and log in at portal.macstadium.com/sso. ## About SAML SSO is a paid offering. Contact your account team through the [Customer Portal](https://portal.macstadium.com) for more information. MacStadium does not support IdP-initiated logins. After SSO is configured, all users must log in at [portal.macstadium.com/sso](https://portal.macstadium.com/sso) using the ID provided by the MacStadium team. You can also log in directly at [portal.macstadium.com](https://portal.macstadium.com/login). ## Overview SAML SSO with Okta, allows customers to: * Enable users to be automatically signed in to MacStadium using their Okta accounts. * Manage users in one central location – Okta. ## Getting Started 1. Save the public signature key below (for example, save to `macstadium-us-east-1_pusi8jHs1.pem`) `-----BEGIN CERTIFICATE----- MIICvDCCAaSgAwIBAgIIdQAHcexaNC4wDQYJKoZIhvcNAQELBQAwHjEcMBoGA1UE AwwTdXMtZWFzdC0xX3B1c2k4akhzMTAeFw0yNDAxMTAxNDEzMThaFw0zNDAxMTAw MDI1MThaMB4xHDAaBgNVBAMME3VzLWVhc3QtMV9wdXNpOGpIczEwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiLAh9YbRaJFwq6wODIsJixW9sCPVbO6MR wtSXEqDp1oRuJ//c7DVsytJd3koj1WRtF9+Hg1lvhx9Of+D0l5hjltB4mbeaQpOx cwgdxCepba2OuzxpU4APOCyU++NBfqe3Be+GIkWnbygsYFo5Dq26dFTSzYq/UNam YBTRgPh28k3yv82A2cH96wqwWGuLg52TUc56AGSCAwTCqN5VlwNaMzAuYqxHW2zo tmeLtC9T8q0vS+/UWq/EckR7jV/R4ziyEYB/PWgkZNUnOp0TCYtiuoYdHuqzoazW jhQjil9W0TsUq6k6Vo2ISz+r3XxlXXQMk6blmfJDU7JcMEkPZybhAgMBAAEwDQYJ KoZIhvcNAQELBQADggEBAJ8QzPsFgF/prkw2/qsgfAs0nKJY+zAaIqYSGZlYY4pq pObs0q2O8R3ecsS8e1cpahn4GdstPad69CqgyqPVf7EZm5ZMfUY9s5P7ufDJ3neh /YTp6KX1yHG8PJwJuCPSbB6OxcQirrxOKwsT2tPUMOziYHPQuickpJ7WlxEso3Xj QlcU+F4L8tjhxxF3/T7+fOlzZmivLcBPVx7z+21VoARhJvetoqCqzRccrOitHWye Bma/C6JOtvFq3JPWH0rgmAV6IGhvCSro4ANaToEmK7JYXiOD13DlA44P0l6gV7L8 p5EbQgF1F9eBQpfvL2E3Ml/+ZrXf5zBr5EjSLKvj/NE= -----END CERTIFICATE-----` 2. Open Okta admin. 3. Navigate to **Applications → Applications**. 4. Create a new **App integration** by clicking **Create App Integration**. 5. Select **SAML 2.0**. Okta Create a new app integration dialog with SAML 2.0 option selected 6. Click **Next**. 7. Enter app name (for example, **MacStadium-SAML**). Okta General Settings tab with app name field 8. Configure the SAML application. 9. Sign-on URL: `https://idp.macstadium.com/saml2/idpresponse` 10. Use this for Recipient URL and Destination URL: ✔︎ (make sure it’s checked) 11. Audience URI (SP Identity ID): `urn:amazon:cognito:sp:us-east-1_pusi8jHs1` 12. Click **Show Advanced Settings**. 13. Upload the public certificate `(macstadium-us-east-1_pusi8jHs1.pem)` from Step 1. 14. Single Logout. 15. Allow application to initiate Single Logout - ✔︎ (make sure it is checked) 16. Single Logout URL: `https://idp.macstadium.com/saml2/logout` 17. SP Issuer: `urn:amazon:cognito:sp:us-east-1_pusi8jHs1` 18. Attribute statements Okta SAML Settings with Attribute Statements section showing email mapping 19. Click **Finish** to complete the setup. 20. Provide the MacStadium support team the Metadata URL Okta app Sign On tab showing Metadata URL field to copy # First-Time SSO Login to MacStadium Portal Source: https://docs.macstadium.com/macstadium/account-management-and-saml/first-time-sso-login-to-macstadium-portal SSO login to the MacStadium portal with Okta, Azure AD, or Google Workspace. Your account admin must enable SSO before you can follow these steps. This guide walks you through your first Single Sign-On (SSO) login to the MacStadium portal. If your organization has configured SSO authentication, you'll use your corporate identity provider credentials instead of a MacStadium-specific password. ## Prerequisites Before beginning, ensure you have: * An active MacStadium account with SSO enabled for your organization * Access to your corporate email address (the one registered with MacStadium) * Access to your organization's identity provider (e.g., Okta, Azure AD, Google Workspace) * Credentials for your corporate identity provider * A multi-factor authentication (MFA) device if one is required by your organization * Confirmation email from MacStadium Support indicating SSO has been enabled for your account **Important:** SSO must be configured by your MacStadium account administrator before you can use it. Contact your IT team or MacStadium Support if you're unsure whether SSO is enabled. ### Step-by-Step Login Process #### 1: Navigate to the MacStadium Portal * Open your web browser and go to: [**https://portal.macstadium.com**](https://portal.macstadium.com) * You'll see the MacStadium login page portallogin.png #### 2. Initiate SSO Login * Enter your corporate email address in the email field * Click the "Continue with SSO" button (or "Sign in with SSO" depending on your portal version) * Do not enter a password; SSO authentication will redirect you to your identity provider #### 3. Identity Provider Redirect You'll be automatically redirected to your organization's identity provider login page. This may be: * Okta * Azure Active Directory / Microsoft Entra ID * Google Workspace * OneLogin * Other enterprise identity providers Note: The appearance of this page is controlled by your organization's IT team, not MacStadium. #### 4. Authenticate with Your Identity Provider * Enter your corporate credentials (username/email and password) * Complete any multi-factor authentication (MFA) required by your organization * This might include: authenticator app codes, SMS codes, biometric verification, or hardware tokens * Click "Sign In" or the equivalent button on your identity provider's login page ### Understanding the "Abort or Proceed" Screen After successfully authenticating with your identity provider, you may encounter an authorization consent screen that asks you to "Abort or Proceed". This screen appears because: * First-time setup: Your identity provider is asking for permission to share your profile information with MacStadium * Security verification: Your organization wants to confirm you intend to access an external service * Attribute mapping: The identity provider needs consent to share specific user attributes (name, email, group memberships) with MacStadium The authorization screen typically displays: * The application requesting access: "MacStadium Portal" or your organization's custom app name * Identity provider name: Your corporate identity system (e.g., "Contoso Azure AD") * Permissions being requested: * Read your basic profile information * Access your email address * View your group memberships (for role assignment) You will then be provided with two options: * Proceed / Allow / Continue - Authorizes access * Abort / Cancel / Deny - Cancels the login attempt ### Which Option Should I Select? #### Select "Proceed" if: * You initiated this login attempt to access MacStadium services * The application name shown is "MacStadium Portal" or your organization's custom SSO app * You trust that your IT department has configured this integration * You need to access your MacStadium infrastructure #### Select "Abort" if: * You did not initiate this login attempt (possible security issue) * The application name looks suspicious or incorrect * You're unsure whether your organization uses MacStadium * You want to verify with your IT team before proceeding #### When you click "Proceed": * Authorization is granted, and your identity provider shares the necessary profile information with MacStadium. * You will be automatically redirected, and returned to the MacStadium portal within 2-5 seconds. * Upon successful login, you'll land on your MacStadium Portal dashboard. * Additionally, your browser session will now be active and authenticated with SSO. * For future logins, this consent is typically remembered, so you won't see the 'Abort/Proceed' screen again unless your organization's security policies require re-consenting to SSO login. # SAML single sign-on for MacStadium accounts Source: https://docs.macstadium.com/macstadium/account-management-and-saml/saml-sso Set up SAML SSO for your MacStadium organization to manage user authentication and access through your identity provider. Supports Okta, Azure AD, and Google. ## Introduction The MacStadium SAML Single Sign-On (SSO) integration provides a secure and seamless way for your organization to manage user authentication and access within your MacStadium account. By integrating your MacStadium account with your existing Identity Provider (IdP), such as Okta or Azure AD, you achieve the following benefits: * Centralized User Management: Use your existing IdP to manage user accounts across your organization, including access to MacStadium services. * Streamlined Login Experience: Users authenticate once with your IdP and gain access to MacStadium resources without needing separate credentials. * Enhanced Security: SAML-based authentication adds strong security. Enforce security policies like MFA (Multi-Factor Authentication) from your IdP. SAML SSO is a paid offering. Contact your account team through the [portal](https://portal.macstadium.com) for more information. ## Key Components The MacStadium SAML SSO integration involves these key components: * MacStadium SSO Service: Our dedicated SSO service handles user management functions (login, password reset, etc.) and facilitates communication between your MacStadium account and your IdP. * MacStadium Portal: Remains the front-end interface for users, interacting with the SSO service. * MacStadium Portal is used for managing user roles. Orka 3.0 login actions also rely on the MacStadium Portal. * External Identity Provider (IdP): Your chosen IdP (for example, Okta, Azure AD) handles user authentication. ## How It Works 1. **Configuration**: Your IdP Admin will configure your IdP to integrate with MacStadium and provide some metadata to our support staff to complete the integration. See the setup guides under Next Steps below. 2. **User Login**: A user attempts to access MacStadium resources. 3. **Redirection**: The MacStadium Portal redirects users to your IdP's login page. 4. **Authentication**: The user provides their credentials to your IdP. 5. **SAML Assertion**: Your IdP successfully authenticates the user and generates a SAML assertion containing user information. This is sent to the MacStadium SSO service. 6. **Verification and Authorization**: The MacStadium SSO service validates the SAML assertion and grants user access based on configured permissions. ## Supported Providers The MacStadium SAML SSO integration works with major identity providers including: * Okta * Azure AD * Google Workspace Federation ## Next Steps Select your identity provider for step-by-step setup instructions: * [Enable SAML SSO with Okta](/macstadium/account-management-and-saml/enable-saml-sso-with-okta) * [Enable SAML SSO with Azure Active Directory](/macstadium/account-management-and-saml/enable-saml-sso-with-azure-active-directory) * [Enable SAML SSO with Google Workspace](/macstadium/account-management-and-saml/enable-saml-sso-with-google-workspace-federation) # Troubleshooting Credential Issues Source: https://docs.macstadium.com/macstadium/account-management-and-saml/troubleshooting-credential-issues Fix MacStadium Portal and service credential issues: verify your email, reset your password, or find server credentials in the Portal under Services. ## Portal Login Issues If you cannot log into the MacStadium portal: * Verify you're using the correct email address * Try resetting your password via the [MacStadium portal](https://portal.macstadium.com/), using the **Forgot Password** link on the login screen * Contact your account administrator if you don't have access ## Service/Server Credential Issues If your server or service credentials aren't working: * Verify you're copying the password without extra spaces * Check that the service is online and accessible * Credentials can be viewed in Portal > Services > \[service] > Credentials ## Still Having Issues? If you've tried the above and still can't connect, contact support with: * Which service you're trying to access * The error message you're receiving * Whether this is a new setup or previously working # Two-Factor Authentication (2FA) Source: https://docs.macstadium.com/macstadium/account-management-and-saml/two-factor-authentication-2fa MacStadium offers the ability for customers to enable two-factor authentication (2FA) when logging into portal.macstadium.com. Two-factor authentication. ## About MacStadium offers the ability for customers to enable two-factor authentication (2FA) when logging into [portal.macstadium.com](https://portal.macstadium.com). Two-factor authentication provides customers with an additional layer of security when accessing environments. ## Overview Two-factor authentication is available for anyone with Portal access. 2FA is NOT turned on by default. It is not required to log in to [portal.macstadium.com](https://portal.macstadium.com). It can easily be turned on/off from inside the Customer Portal. ## Getting Started You must have an account in [portal.macstadium.com](https://portal.macstadium.com) to use two-factor authentication. If there is no account in the Customer Portal, request one from an existing account administrator within your organization. For questions, email [support@macstadium.com](mailto:support@macstadium.com). **Enabling Two-Factor Authentication:** 1. Log into [portal.macstadium.com](https://portal.macstadium.com). 2. Click your avatar in the top right corner. 3. Click **Users** from the dropdown. 4. Click **Security**. 5. Click **Enable Two-Factor Authentication**. 6. Click **Next**. 7. Open an authenticator app on a mobile device and scan the barcode. An authenticator app can be downloaded from the Apple App Store or Google Play. 8. Enter the corresponding code provided by your authenticator app. 9. Two-factor authentication now changes to **Active** in the *Security* tab of the Portal. ## First Login After Enabling 2FA On the next login, the sign-in screen looks different after entering your username and password: 1. Once authenticated, you are prompted to open your authenticator app. 2. The authenticator app provides a 6-digit code. 3. Enter the 6-digit code to gain access. ## Mandatory 2FA Enforcement The Mandatory Two-Factor Authentication (2FA) Enforcement feature empowers administrators to enhance the security of user accounts by enforcing compulsory 2FA for all associated users. By enabling this functionality, administrators ensure an additional layer of protection for sensitive information and transactions within the Customer Portal. This feature is accessible only to team members with Administrator roles. Mandatory 2FA is disabled by clicking the **Disable Mandatory 2FA** button. 2FA can be disabled by clicking the **Disable** button in the *Security* tab. If there is a need to disable two-factor authentication, but access to the phone that was used to authenticate is missing, then: 1. Send a request to [support@macstadium.com](mailto:support@macstadium.com). 2. Give the Support Team the code used to enable 2FA. 3. The Support Team can remotely disable it. 4. Once it is turned off, login with the administrator *username* and *password*. # Access and download MacStadium invoices Source: https://docs.macstadium.com/macstadium/billing/accessing-invoices Access PDF invoices for each MacStadium subscription in the MacStadium Portal under the Billing tab. Contact billing to consolidate multiple statements. Invoices for your MacStadium subscriptions are available as PDFs in the [MacStadium portal](https://portal.macstadium.com/). ## How to Access Your Invoices 1. Log in to the [MacStadium portal](https://portal.macstadium.com/). 2. Click into the subscription you want to view. 3. Select the **Billing** tab in the subscription details. 4. Download your invoice as a PDF. Each subscription generates its own invoice. If you have multiple subscriptions, you'll need to access each one individually. ## Consolidating Multiple Invoices If you manage a large number of subscriptions and need consolidated billing, email [support@macstadium.com](mailto:support@macstadium.com) to request consolidation. ## Questions About a Charge Email [support@macstadium.com](mailto:support@macstadium.com) and include your subscription ID and the invoice date. # Canceling a MacStadium Subscription Source: https://docs.macstadium.com/macstadium/billing/canceling-a-macstadium-subscription How to cancel your MacStadium subscription: click Cancel Service in the portal. Servers go offline within 24 hours, no refund for the current period. You don't need a lengthy contract to take advantage of Mac hosting at MacStadium. We bill on the first day of the month for the next 30 days of service. Your service will continue on a month-to-month basis until you cancel your subscription. If you ever decide to leave MacStadium, you can do so through the [MacStadium Portal](https://portal.macstadium.com/). You can cancel a subscription at any time and for any reason. When cancelling a subscription, the server is taken offline and all data is destroyed within 24 hours. To cancel a single subscription, click into your machine's Details tab and then click the red Cancel Service button. MacStadium Portal subscription Details tab with Cancel Service button highlighted If you have multiple subscriptions and want to cancel your account, please submit a [support](mailto:support@macstadium.com) ticket. ## Billing If you cancel a subscription before the end of the current service period, you do NOT receive a refund for any amounts already paid for service in the future. In accounting terms, MacStadium does not prorate services due to the man-hours required to return used hardware to inventory for re-use. Servers become inactive when a subscription is cancelled and do not remain available through the end of the service period (subscription month). If you want to access your Macs until the end of the service period, cancel the service toward the end of the month, but before the next first-of-the-month billing occurs. If you own the Mac on the canceled subscription (because you shipped it to us as part of our colocation service), then MacStadium will return your server to you after verifying the shipping address and speed of shipment requested. Our billing department will charge your payment method on file the actual shipping amount to close out your billing. You're always welcome to return to MacStadium at any time with the same account. # Fix a declined credit card on MacStadium Source: https://docs.macstadium.com/macstadium/billing/credit-card-declined MacStadium uses fraud protection that may flag legitimate transactions. If your card is blocked at signup, contact support to process your order manually. MacStadium uses fraud protection services to identify and stop fraudulent transactions before they happen. These measures protect the security of our network and our customers. In some cases, this protection may flag a legitimate transaction during signup. If that happens, you'll see: **Unable to authorize your Credit Card. Please contact support via phone, chat, or open a ticket in the Customer Portal.** You may see the same message if you try a second card. This does not mean the card itself is being declined by your bank. ## What to do Contact [support@macstadium.com](mailto:support@macstadium.com) or open a ticket in the [MacStadium Portal](https://portal.macstadium.com/). Our team will process your order manually. To speed things up, include the following details about the subscription you were trying to order: * The data center location you selected * The Mac hardware you want to subscribe to * The operating system, if applicable Once our team processes the order, you'll receive an activation email with access details when your server is online. # MacStadium vendor onboarding and management Source: https://docs.macstadium.com/macstadium/billing/vendor-management Complete vendor onboarding for MacStadium by filling out the Zip vendor profile form and submitting it to the billing and legal teams for approval processing. If you are onboarding to MacStadium as a vendor, please use the below link. Once you are finished, please send the file to [billing@macstadium.com](mailto:billing@macstadium.com), and [legal@macstadium.com](mailto:legal@macstadium.com). [MacStadium Vendor Onboarding](https://app.ziphq.com/vendor-profile/verified/e964d1ce-99bc-4f93-aa08-e56cdc77b681) # Acceptable Use Policy Source: https://docs.macstadium.com/macstadium/legal-and-compliance/acceptable-use-policy MacStadium Acceptable Use Policy (Exhibit B of the MSSA): prohibited actions and restrictions governing customer use of all MacStadium services. ## EXHIBIT B: Acceptable Use Policy To protect the interests of MacStadium’s customers and ensure optimal Service Levels, MacStadium has developed this AUP, which applies to you and your Users of MacStadium’s Services. Use of any Services offered by MacStadium will constitute acknowledgment of and agreement to the terms outlined in this AUP. This AUP may be revised at any time at MacStadium’s discretion. Your continued use of MacStadium’s Services after such revisions will constitute your acceptance. **1. PROHIBITED ACTIONS.** Customers may only use our servers and the Services for lawful purposes, in compliance with all applicable laws or regulations and in compliance with this AUP. In addition to the restrictions described in section 2.4 of the Agreement, activities that are specifically prohibited include, but are not limited to: * Removing or modifying any program markings or any notice of MacStadium or its licensors’ proprietary rights (except when providing a SaaS offering to your Users). * Making the Services, or any materials relating thereto, available in any manner to any third party for use in the third party’s business operations other than as otherwise expressly agreed upon between the Parties. * Modify, make derivative works of, disassemble, reverse compile, or reverse engineer any part of the Services. * Access or use the Services in order to build or support, or assist a third party in building or supporting, products, or services competitive to the Services in this Agreement. * License, sell, rent, lease, transfer, assign, distribute, display, host, disclose, permit timesharing, or otherwise commercially exploit or make the Services, or related materials, available to any third party other than as part of a SaaS offering to your Users or as expressly permitted under the terms of this Agreement. * Except as expressly provided herein, copy, reproduce, distribute, download, display, post or transmit any portion of the Services, in any form or by any means. * Any attempt to gain unauthorized access to the Services or related systems or networks. * Intentionally providing untruthful information regarding Customer’s identity as requested on any documentation required by MacStadium. * Misrepresenting or fraudulently representing any products or services. * Threatening harm to persons or property or otherwise harassing behavior. * Abusing or harassing MacStadium employees, staff or agents, including without limitation, verbal harassment, yelling, swearing, rudeness, threats or any intentionally disruptive behavior. * Managing a proxy server on MacStadium’s network * Being subject to economic sanctions, prohibitions or restrictions on trade or export imposed by any governmental authority having jurisdiction over Customer or MacStadium, or in any jurisdiction where MacStadium or any of its affiliates are located, and regardless of whether the Services provided to Customer would violate such economic sanctions, prohibitions or restrictions. * Interfering with the legitimate use by other customers or other third parties of resources on the MacStadium network or any of MacStadium’s Services. * Storage, transmittal or use of any malicious code, such as viruses, worms, time bombs, Trojan horses and other harmful or malicious files, scripts, agents or programs. * Mine bitcoins and other cryptocurrencies. * Use the Services in any manner that would disparage MacStadium in any way. **2. SPAM AND UNSOLICITED COMMERCIAL E-MAIL.** The Customer must comply with the CAN-SPAM Act of 2003 and all relevant regulations and legislation on bulk and commercial e-mail. MacStadium takes a zero-tolerance approach to the sending of mass Unsolicited Commercial E-mail (“UCE”) or spam over our network. UCE is any message where the primary purpose is commercial advertisement or promotion of a commercial product or service, which is sent to a recipient who has not requested it or opted out of such communication. In order to prevent unnecessary blacklisting due to spam, we reserve the right to occasionally sample bulk e-mail being sent from servers. The following activities are strictly prohibited: * General Prohibitions. a) Using the MacStadium network to send or receive replies from UCE, hosting sites or information that is advertised by UCE from other networks, b) transmitting bulk e-mail through remote SOCKS, HTTP or other similar proxies who in turn make a SMTP connection to the destination mail servers, c) forging e-mail headers (i.e., ‘spoofing’), d) spamming using third-party proxy, aggregation of proxy lists, or proxy mailing software installation, and e) or hosting any web pages or providing any services that support spam. * Landing Sites. The hosting of any web site or other content in any form intended to be intentionally or unintentionally retrieved or viewed by any recipient of any unsolicited email sent in violation of the terms defined in this AUP, whether sent from our network or any other network. * Newsgroup Spamming. The posting of commercial messages to any newsgroup or discussion forum not chartered or organized for that specific purpose. **3. U.S. DIGITAL MILLENNIUM COPYRIGHT ACT OR SIMILAR STATUTORY OBLIGATIONS.** To the extent a Customer uses the Services for hosting, advertising, sending electronic messages or for the creation and hosting of, or for posting material on, websites. Each Customer must a) comply with any notices received under Title II of the Digital Millennium Copyright Act of 1998 (Section 512 of the U.S. Copyright Act) or similar statute in other countries (the “DMCA”), b) set up a process to expeditiously respond to notices of alleged infringement that comply with the DMCA and to implement a DMCA-compliant repeat infringers policy, and c) comply with such processes and policy(ies). In appropriate circumstances, MacStadium will terminate the accounts of Customers who MacStadium suspects to be repeatedly or blatantly infringing copyrights. If MacStadium receives a notice alleging that Users are infringing another Party’s intellectual property, MacStadium may disable that Customer’s access to the Service or remove the alleged infringing material. If MacStadium receives more than one such notice for the same customer, MacStadium reserves the right to immediately terminate such Customer’s Subscriptions to the Services as deemed necessary by MacStadium to ensure continued protection under the safe harbor provisions under the DMCA or to prevent violations of other applicable laws or third parties’ rights. **4. SYSTEM AND NETWORK SECURITY.** The Customer is required to protect the security of its internet accounts (e.g. ftp, e-mail, etc.) and usage to ensure the security of the MacStadium network and every MacStadium network object, including without limitation, routers, switches and workstations. Further, the Customer is responsible for validating the integrity of the information and data it receives or transmits over the internet and reporting any weaknesses in the MacStadium network and any incidents of possible misuse or violation of this AUP. To ensure the integrity of our network, the following activities are strictly prohibited: * General Prohibitions. a) Using or distributing tools designed to compromise security, b) unauthorized monitoring of data or traffic on the MacStadium network or any other network without express authorization, deliberate attempts to overload the MacStadium network and broadcast attacks, and c) forging of any TCP-IP packet header or any part of the header information in an e-mail or intentionally or negligently transmitting files containing a computer virus or corrupted data. * Denial of Service Attacks. The launching or facilitating the launch of a denial of service (“DoS”) attack on any host or computer on the MacStadium network for any reason whatsoever, or the use of any MacStadium network resource to interfere with the legitimate use by Customers or other authorized Users of resources of the MacStadium network or any other network. This includes the hosting of a Camfrog server or other server application that is a frequent target of DoS attacks or other types of attacks. * Port Scanning. The scanning of the service ports of any host or computer on the MacStadium network or any other network, or the sniffing of packet traffic on the MacStadium network. The placing of any network interface into promiscuous mode is similarly prohibited. * Unauthorized Access. Any unauthorized access to or unauthorized alteration of the files or operating system or other content of any host or network, any unauthorized attempt to obtain login credentials, such as username and/or password, of any host on the MacStadium network or any other network or any attempt to probe, scan or test the vulnerability of a system or network or to breach security or authentication measures. * IRC Networks. The hosting of an IRC server that is part of or connected to another IRC network or server. Servers found to be connecting to or part of these networks will be immediately removed from our network without notice. The server will not be reconnected to the network until such time that Customer agrees to completely remove any and all traces of the IRC server and agree to let us have access to Customer’s server to confirm that the content has been completely removed. **5. IP ALLOCATIONS.** All IP addresses which are assigned to Customer must be justified per ARIN Guidelines at [arin.net/policy/nrpm.html](https://www.arin.net/policy/nrpm.html). If it is determined that IP addresses which have been assigned to Customer are not being used in accordance with these guidelines, they may be revoked. **6. IMMEDIATE THREATS.** If, in the reasonable determination of MacStadium, the equipment, software or hosted applications used by the Customer or the activities of the Customer poses an immediate threat to the physical integrity of MacStadium premises or the physical integrity or performance of the equipment or network of MacStadium or any other user of the premises, or poses an immediate threat to the safety of any person, then MacStadium may perform such work and take such other actions deemed necessary without prior notice to the Customer and without liability for damage to the equipment or data for any interruption of the Customer's (or its Customers') businesses. As soon as practical after performing such work, MacStadium will advise, by email, the Customer of the work performed or the action taken. **7. MONITORING.** To determine compliance with this Agreement, MacStadium reserves the right to monitor Customer usage of the MacStadium network. Customer hereby consents to such monitoring and agrees that MacStadium is under no duty to monitor Customer use of MacStadium Services. For clarity, MacStadium will not have access to view any customer data as a part of any monitoring under this section. **8. CUSTOMER’S RESPONSIBILITY FOR ITS USERS.** Any act or omission by a User will be a breach of this AUP if the act or omission committed by the User would be a breach of this AUP if committed by Customer. **9. VIOLATION.** MacStadium may initiate an immediate investigation to substantiate the alleged violation. During the investigation, MacStadium may restrict Customer access to the network to prevent further violations. Any Customer violation of this AUP is left entirely to the reasonable discretion of MacStadium management. If a Customer is found to be in violation of this AUP, MacStadium may, at its sole and reasonable discretion, restrict, suspend or terminate such Customer's account. MacStadium has no obligation to provide warnings under any circumstances and can terminate the Customer’s account without prior notification upon a finding that the Customer has violated this AUP. Further, MacStadium may pursue civil remedies for any costs associated with the investigation of a substantiated AUP violation. MacStadium will notify law enforcement officials if\ the violation is believed to be a criminal offense and will cooperate fully with law enforcement authorities in investigating the alleged criminal offense. # Copyright and Trademark Policy Source: https://docs.macstadium.com/macstadium/legal-and-compliance/copyright-and-trademark-policy MacStadium copyright and trademark policy: how to submit DMCA notices, report trademark infringement, and what happens after a report is filed. ## Reporting Claims of Copyright Infringement At MacStadium, we respect the intellectual property rights of others and expect our users to do the same. Our Terms prohibit users from violating someone else’s intellectual property rights, including copyright and trademark.\ If you believe content that belongs to you is being used through our Service or MacStadium Site without your permission or users of our Service or MacStadium Site are selling counterfeit or infringing products, we want to know about it. If you do submit a notice to us, please note that we may forward your notice, including your contact information, to the user who posted or used the content that you are complaining about. If you’re not sure whether content on one of our MacStadium Sites or sent through our Service infringes your intellectual property rights, then you may want to speak with legal counsel in your area before notifying us. Finally, before submitting a notice you may want to reach out to the person or organization who posted or used the content you believe infringes your rights. You may be able to resolve the issue directly with that person or organization without contacting MacStadium. ## Copyright Copyright law protects creative works like writings, music, pictures and photographs. Notices related to alleged copyright infringement may be submitted to us via email at the following email address: [legal@MacStadium.com](mailto:legal@MacStadium.com) When our Copyright Agent receives proper written notice (“DMCA Notice”) as described below, we will expeditiously remove or disable access to the allegedly infringing material and terminate the accounts of repeat infringers in accordance with the Online Copyright Infringement Limitation Act of the Digital Millennium Copyright Act (17 U.S.C. § 512) (“DMCA”). Pursuant to the DMCA, your DMCA Notice must include substantially the following: * The name, address, telephone number, and email address of the copyright owner; * An identification or description of the copyrighted work that you claim is being infringed; * A description of the content on our MacStadium Site or sent through our Service that you claim infringes your copyright; * An identification of where the allegedly infringing content is located on our MacStadium Site or was sent through our Service (a URL works best); * A statement that: (a) you have a good faith belief that the use isn’t authorized by the copyright owner, its agent or the law; (b) the information in your notice is accurate; and (c) under penalty of perjury, you are the owner or you are authorized to act on behalf of the copyright owner; and * An electronic or physical signature from the copyright owner or someone authorized to act on their behalf. The contact information for MacStadium’s designated agent for DMCA Notices of claimed copyright infringement is: [legal@MacStadium.com](mailto:legal@MacStadium.com) ## Trademark Trademark law protects words, designs, symbols, or phrases that an individual or company may use to identify and distinguish their goods or services from those offered by others. Examples of trademarks include word marks (“MacStadium”), logos, brand names, and slogans. A trademark owner may be able to prevent others from using their trademark without their permission if the particular use is likely to cause confusion among consumers about who provides, endorses, or is affiliated with a product or service. Such a use may amount to trademark infringement. If the particular use of a trademark is an unauthorized use of a registered mark to reproduce fake, imitation, or “knock-off” goods, the use may also constitute trademark counterfeiting. Knowingly trading in counterfeit goods is illegal. Notices related to alleged trademark infringement may be submitted to us via this form. When reporting a claim of trademark infringement, please ensure your notice includes the following: * The name, address, telephone number, and email address of the trademark owner; * Whether or not your claim involves the sale of counterfeit goods; * An identification of the trademark that you claim is being counterfeited or infringed, including the trademark registration number, the country/jurisdiction where the trademark is registered, an identification of the category of goods and/or services covered by your registration, and a link to the registration or copies of your certificate of registration; * A description of the content on our MacStadium Site or sent through our Service that you claim infringes your trademark or constitutes counterfeiting, including an explanation of how you believe the content is infringing or counterfeit; * An identification of where the allegedly infringing or counterfeit content is located on our MacStadium Site or was sent through our Service (a URL works best); * A statement that: (a) you have a good faith belief that the use isn’t authorized by the trademark owner, its agent or the law; (b) the information in your notice is accurate; and (c) under penalty of perjury, you are the owner or you are authorized to act on behalf of the trademark owner; and * An electronic or physical signature from the trademark owner or someone authorized to act on their behalf. This Copyright and Trademark Policy applies to the websites where MacStadium offers the Service, including the websites [macstadium.com](http://www.MacStadium.com), [orka.com](http://www.orka.com/), and [virtualcommand.com](http://www.virtualcommand.com/), as well as any other sites owned or operated by us (each a “MacStadium Site” and together the “MacStadium Sites”). This Policy also applies to all uses of our Service. Updated September 24, 2021 # Master Services Agreement Source: https://docs.macstadium.com/macstadium/legal-and-compliance/master-services-agreement MacStadium Master Subscription Services Agreement v2.0: governing legal terms for all MacStadium services, referencing the SLA and Acceptable Use Policy. # MacStadium Master Subscription Services Agreement (v.2.0 – Sept 26, 2025) This Master Subscription Services Agreement (“**MSSA** ”) and any ordering document between Customer and MacStadium, Inc., (each, a “**Service Order** ”) and any other exhibit or addendum, constitute the “**Agreement** ” made and entered into by and between MacStadium, Inc., a Georgia corporation (“**Provider** ” or “**MacStadium** ”) and the Customer and/or its affiliates named below, (“**Customer** ”), as of the date fully executed herein (“**Effective Date** ”). ## 1. Agreement for Services 1. This MSSA, together with all applicable addendums and Schedules (each as defined hereafter), all of which are incorporated by this reference herein, states the terms and conditions by which Provider delivers and Customer accepts any or all of the services or licenses provided by Provider to Customer (each specific service or license, a “Service”). The definition of Service excludes “Non-MacStadium Services”). Specific terms and conditions applicable to each Service ordered by Customer are set out in separate one or more ordering document(s) referencing this MSSA (all such additional documents relating to a particular Service, including, without limitation, those identified as “service schedules” or “Service Orders,” collectively, a “Schedule”). The Schedules for the Services initially ordered by Customer may be set out in the appendices to this MSSA. The Schedules for any new Service ordered by Customer subsequent to the execution of this MSSA will be binding (i) when ordered electronically through the Provider’s web portal including a click-through acceptance of terms or (ii) contained in a Service Order signed by both parties and acknowledged and accepted in writing (including electronically) by Provider. The parties may enter into additional Schedules for additional Services from time to time. The parties may agree to modify any Services set out in any Schedule by executing a Service Order signed by both parties. 2. The Services may be provided as a service via the internet (“as a service”) or Software, as defined herein, in object code form, for installation and use on servers owned or controlled by the Customer (“on-premise”) for the term set forth in the Schedule. If the Services are provided as a service, then Customer is granted a non-exclusive and non-transferable right to access and use the Services for Customer’s internal business purposes as further described or limited in a Schedule. Use of the Services provided as a service via the internet is subject to Exhibit A – the Service Level Agreement (“SLA”) and Exhibit B – the Acceptable Use Policy (“AUP”). If the Services are provided for on-premise installation on servers owned or controlled by the Customer, then Customer is granted a non-exclusive and non-transferable license to use the Services for Customer’s internal business purposes as further described or limited in a Schedule. For all Services, Customer shall be entitled to receive support and maintenance as further described in the applicable Schedule. 3. Use of the Services is limited as provided in the Schedule. Customer shall reproduce all copyright, trademark or other proprietary rights notices on any copies of the Software and all documentation describing the operation of the Services (“Documentation”) and all such copies shall be subject to the terms, conditions and obligations under this Agreement. Customer shall not reverse engineer, reverse assemble, decompile, or disassemble the Services or otherwise attempt to derive, reconstruct, identify or discover any source code, underlying ideas, or algorithms of the Services by any means. Customer shall not modify, distribute, translate, or create derivative works based on the Services. The Services may not be sublicensed, distributed, leased, rented, offered as a service bureau or otherwise transferred to other third parties by the Customer. Customer may not use the third party software provided with the Services independent from its use of the Services. Customer may not the release to any third party the results of any benchmark testing of the Services. Customer may not authorize or permit any person or entity to do any of the foregoing. 4. Certain third-party applications, products or services that are provided by third-parties or Customer, including any third-party software licenses resold by MacStadium to Customer under a Service Order, that are integrated with, bundled with, and/or work in conjunction with the Service, such as by exchanging data with the Service or offering additional functionality within the Service (“Non-MacStadium Services”) may be available for Customer’s use with the Services. Non-MacStadium Services are not licensed by MacStadium as part of the Services, and MacStadium does not warrant or support Non-MacStadium Services, whether or not such products or services are designated by MacStadium as “certified”, “validated” or the like. Any exchange of data or other interaction between Customer and a provider of Non-MacStadium Services, is solely between Customer and such third-party provider. Customer’s use of Non-MacStadium Services and is subject to the terms and conditions provided by such third party, including without limitation, applicable end user license agreements and privacy policies, governing such use (“Third-Party Terms”). Customer agrees that it is solely responsible for complying with the Third-Party Terms, and that MacStadium is not responsible or liable for any Non-MacStadium Services or for any information or data that Customer may transmit, process or transfer to or from the Non-MacStadium Services, or for any claims caused by Non-MacStadium Services. 5. MacStadium shall have the right, upon reasonable prior written notice to Customer, to audit Customer's usage of the Software provided under this Agreement. Such audits shall be conducted during normal business hours and shall not unreasonably interfere with Customer’s business operations. If any audit reveals that Customer’s use of the Software exceeds the usage levels specified in the applicable Schedule, MacStadium shall have the right to invoice Customer for any overages at the rates specified in the Schedule or, if not specified, at MacStadium’s then-current standard rates for such overages. Customer agrees to pay all such invoiced amounts within thirty (30) days of receipt of the invoice. Additionally, if the audit reveals any underpayment of fees, Customer shall promptly remit payment to MacStadium for such underpaid amounts. The costs of the audit shall be borne by MacStadium unless the audit reveals an overage of more than five percent (5%) of the permitted usage levels, in which case Customer shall reimburse MacStadium for the reasonable costs of the audit. ## 2. Fees and Payment Terms 1. Customer shall pay to Provider all fees due for the Services according to the prices and terms listed in the Schedules. Except as otherwise set forth in a Schedule with respect to a particular Service, the prices listed in a Schedule will remain in effect during the Initial Term indicated in such Schedule. Provider reserves the right to change, upon thirty (30) days’ prior written notice to Customer, any fees it charges Customer for any Service provided during any subsequent Renewal Term. Customer may elect to not enter into a Renewal Term by providing written notice to Provider within thirty (30) days of the effective date of any Renewal Term. If no notice is received by the Provider, the Renewal Term shall become effective. 2. All fees and charges are due within thirty (30) days after Customer’s receipt of invoice therefor. All invoices from Provider are delivered via e-mail to an address specified and provided by Customer. Any invoiced charges not received when due will accrue interest at a rate of one and one-half percent (1.5%) per month, or the highest rate allowed by applicable law, whichever is lower. In addition to the foregoing and without prejudice to Provider’s other rights and remedies under this Agreement, at law or equity, if Customer is delinquent in its payments, Provider may, at Provider’s sole discretion do any one or more of the following: (i) terminate this Agreement pursuant to its terms; (ii) in whole or in part suspend providing Services (or any of them) to Customer until payment in full has been made to Provider or (iii) require other assurances to secure Customer's payment obligations hereunder. 3. All fees charged by Provider with respect to the Services are exclusive of taxes, VAT, and similar fees now in force or enacted in the future imposed on the transaction, all of which the Customer will be responsible for, except for taxes based on Provider’s net income. ## 3. Term; Termination 1. The term of this MSSA shall begin upon execution by both Customer and Provider and shall remain in effect until every Schedule hereunder has been terminated. 2. Each Schedule entered into by the parties pursuant to this Agreement shall be effective upon execution by both Customer and Provider and shall continue in full force and effect for the duration of the contract term specified in the Schedule (the “Initial Order Term”) and will thereafter renew in accordance with the terms of the applicable Service Order, unless terminated earlier in accordance with this Section 3 (subject to survival of the terms thereof as described in Section 3(e), below). Any renewal terms of a Schedule shall each be referred to as a “Renewal Term”. 3. Either party may terminate this Agreement or any subsequent Schedule if (i) the other party commits a material breach of this Agreement and fails to cure such breach within fifteen (15) days after written notice of the same, including Customer’s failure to pay any amounts when due. 4. Upon the effective date of termination of any Schedule: (i) Provider will immediately cease providing the Services set forth in such Schedule, and Customer shall immediately cease using such Services; (ii) all licenses granted hereunder with respect to the terminated Services will immediately terminate; and (iii) any and all payment obligations of Customer under such Schedule for Services provided through the date of termination will be due within thirty (30) days of the effective date of termination of such Schedule. Within thirty (30) days of termination of this Agreement as a whole, each party will return or certify the destruction of all Confidential Information (defined hereafter) of the other party in its possession and will not make or retain any copies of such Confidential Information, except as required (an only to the extent necessary) to comply with any applicable legal, archival or accounting recordkeeping requirement; provided, however, that all such retained data shall remain subject to the confidentiality provisions of Section 7 of this MSSA. 5. (i) Termination of the MSSA shall not serve to terminate any then-effective Schedule, and the terms of this MSSA and those of any Addendum or Schedule applicable to the Service(s) shall survive any termination of this MSSA or until termination of such Schedule(s); and (ii) termination of any Schedule shall not serve to terminate any other Schedule or the parties’ respective obligations thereunder. The definitions herein and the respective rights and obligations of the parties under Sections 3(c)-(d), 5(b), 6-8, 9, 11 and 12 shall survive any termination or expiration of this Agreement. ## 4. Customer Responsibilities 1. Customer shall designate a representative (the “Customer Manager”) who shall have overall responsibility for managing and coordinating Customer’s obligations hereunder and who has the authority to act for and bind Customer in connection with the Services. The Customer Manager shall serve as Provider’s initial point of contact for the resolution of issues in connection herewith, must be available to Provider during the Term and have authority to schedule performance of the Services and address any issues that may arise. 2. Customer will maintain the designation and authorization to access the Provider’s management portal (“Portal”), with all data and information reasonably necessary for Provider to perform the Services. 3. Customer shall provide and coordinate, in a timely manner, Provider’s authenticated access to any Customer network or system, such as custom firewall configurations (the “Customer System”), as necessary. Customer shall inform Provider in writing and in advance of the performance of any Services, of any security and access standards or requirements with respect thereto. ## 5. Warranties 1. Each party warrants and represents that: (i) it has the legal right to enter into this Agreement and perform its obligations hereunder; and (ii) the performance of its obligations hereunder will not violate any applicable U.S. laws or regulations or cause a breach of any agreements with any third parties. In addition, Customer represents and warrants that the performance of its obligations and use of the Services by Customer or its clients will not violate any applicable laws. 2. Provider further represents and warrants that (i) to the best of its knowledge and belief, it owns or otherwise has all necessary rights to provide the Services and the Software\[1] to Customer; (ii) the Services and Software perform in all material respects in accordance with the Documentation; and (iii) subject to Customer’s satisfaction of its obligations hereunder, it will perform the Services in a professional and workmanlike manner consistent with standard industry practices, and will use commercially reasonable efforts to prevent the transmission of any Trojan horse, malicious code, or other computer software code, routines or device designed to disable, damage, impair, erase or deactivate any data via the Provider’s networks or systems to the Customer System. 3. Customer represents and warrants to Provider that (i) Customer has the full right, power and authority to grant the rights granted herein and to provide Provider the Customer Data, access to the Customer configuration and network, and any other Customer-provided materials for Provider’s use; (ii) neither Provider’s access to or use of the Customer Data or the Customer System will: (A) give rise to any action or claim by a third party; or (B) cause Customer to breach any of its agreements or understandings in relation to the Customer Data or the Customer System, including without limitation any terms of use to which Customer is bound; (iii) the Customer Data will not contain any confidential or proprietary information of a third party that Customer does not have the right to provide; and (iv) Customer will use commercially reasonable efforts to prevent the transmission of any Trojan horse, malicious code, or other computer software code, routines or device designed to disable, damage, impair, erase or deactivate any data via the Customer System to Provider’s networks or systems. 4. EXCEPT FOR THE EXPRESS WARRANTIES SET FORTH HEREIN, THE SERVICES ARE PROVIDED EXCLUSIVELY ON AN “AS IS” BASIS, AND PROVIDER AND ITS SUPPLIERS DISCLAIM ANY AND ALL OTHER EXPRESS, IMPLIED AND STATUTORY WARRANTIES WITH RESPECT TO THE SERVICES, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY, QUALITY, PERFORMANCE, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT AND TITLE. PROVIDER DOES NOT WARRANT THAT THE SERVICES WILL BE UNINTERRUPTED OR ERROR-FREE. PROVIDER DOES NOT WARRANT OR GUARANTEE ANY SPECIFIC RESULTS FROM CUSTOMER’S USE OF THE SERVICES. AS BETWEEN THE PARTIES, CUSTOMER SHALL BE SOLELY RESPONSIBLE FOR ENSURING THE ACCURACY OF ALL CUSTOMER DATA PROVIDED BY CUSTOMER IN CONNECTION WITH THE SERVICES. \[1] “**Software** ” means the software (in source and object forms) and related documentation owned or licensed by Provider and furnished to or used by Customer under this Agreement in connection with the Service(s). ## 6. Limitation of Liability; Force Majeure 1. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, EXCEPT WITH RESPECT TO LIABILITY FOR CUSTOMER’S BREACH OF THE RESTRICTIONS SET FORTH IN SECTION 1(C) HEREOF, IN NO EVENT WILL EITHER PARTY BE LIABLE TO THE OTHER FOR CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, OR INDIRECT DAMAGES OR COSTS, INCLUDING, WITHOUT LIMITATION, LOST PROFITS OR REVENUES, LOSS OF DATA OR PROPERTY ARISING FROM ANY CLAIMS WHETHER BASED IN CONTRACT OR TORT (INCLUDING NEGLIGENCE AND STRICT TORT), OR OTHERWISE IN CONNECTION WITH THE SERVICES OR THIS AGREEMENT, EVEN IF THE OTHER PARTY, ITS AFFILIATES OR SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES OR COSTS. 2. Except WITH RESPECT TO LIABILITY FOR A PARTY’S GROSS NEGLIGENCE OR WILLFUL MISCONDUCT, CUSTOMER’S BREACH OF THE RESTRICTIONS SET FORTH IN SECTION 1(C) HEREOF, CUSTOMER’S FAILURE TO PAY THE FEES DUE HEREUNDER OR A PARTY’S BREACH OF SECTION 7 HEREOF, OR as may be otherwise set forth in a schedule with respect to a specific service, In no event will EITHER PARTY, its AFFILIATES or suppliers be liable to THE OTHER PARTY or any Users under this Agreement or otherwise, regardless of the form of claim or action, in an amount that is greater than the total fees received by Provider under this Agreement during the twelve (12) months immediately preceding the event GIVING rise to such claim or \$50,000 USD. 3. THE PARTIES ACKNOWLEDGE THAT PROVIDER HAS SET ITS PRICES AND ENTERED INTO THIS AGREEMENT IN RELIANCE UPON THE LIMITATIONS OF LIABILITY AND THE DISCLAIMERS OF WARRANTIES AND DAMAGES SET FORTH HEREIN, AND THAT THE SAME FORM AN ESSENTIAL BASIS OF THE BARGAIN BETWEEN THE PARTIES. THE PARTIES AGREE THAT THE LIMITATION AND EXCLUSIONS OF LIABILITY AND DISCLAIMERS SPECIFIED IN THIS AGREEMENT WILL SURVIVE AND APPLY EVEN IF FOUND TO HAVE FAILED OF THEIR ESSENTIAL PURPOSE. 4. Neither party shall be liable for and will not be responsible to the other for any delay or failure to perform under this Agreement if such delay or failure results from any act or cause beyond the reasonable control of the affected party. If either party is unable to perform under the Agreement because of the occurrence of an event of force majeure lasting more than thirty (30) days, then the other party may terminate the affected Service(s) and applicable Schedule(s) upon written notice to the other party. ## 7. Confidential Information; IP Rights 1. Each party acknowledges that it may have access to certain information deemed confidential by the other party, (collectively, “Confidential Information”), which shall expressly include, but not be limited to, Provider Technology\[1] (with respect to Provider) and certain Customer Data\[2] (with respect to Customer). Each party agrees that it will not use in any way, for its own account or the account of any third party, except as expressly permitted by, or to the limited extent required to achieve the purposes of, this Agreement, nor disclose to any third party (except as required by law or to such party’s employees, attorneys, accountants and other advisors as reasonably necessary), any Confidential Information of the other party. Each party will protect the confidentiality of the Confidential Information of the other party by employing the same measures (but in no event less than reasonable measures) as it takes to protect its own Confidential Information. The obligations of this Section 7 shall last during the term of the Agreement and for two (2) years after the term of the Agreement. 2. The receiving party may disclose Confidential Information pursuant to the requirements of a validly issued subpoena, governmental agency or by operation of law, provided that it gives the disclosing party, when practical and permitted, reasonable prior written notice sufficient to permit the disclosing party to contest such disclosure. 3. In the event of a violation or threat of violation by a party, directly or indirectly, of the terms of Section 7(a), the party who would be harmed by such violation, will have the right, and in addition to all other remedies available to it at law, in equity or under this Agreement, to affirmative or negative injunctive relief from a court of competent jurisdiction. Each party acknowledges that a violation of this section would cause irreparable harm and that all other remedies are inadequate. 4. In the event that Customer discloses personal data to Provider (“Personal Data”), Customer agrees (i) that Provider or its affiliate(s) may process such Personal Data consistent with applicable law and regulation, only for the purpose of the provision of Services by Provider to Customer or for purposes connected with the subject matter of the disclosure or business relationship between the parties; (ii) that such processing may include the transfer of such Personal Data to Provider’s affiliates or its storage in a local database; and (iii) that Customer will, to the extent required by applicable law, obtain all necessary consents to such processing from the data subjects concerned. 5. Neither party will publish or use any advertising, sales promotions, press releases or other publicity that uses the name, logo, trademarks, or service marks of the other without the prior written approval of the other, provided that Provider may list Customer as a customer. 6. Provider and its licensors shall retain all right, title, and interest (including copyright and other intellectual property rights or informational rights) in and to the Services and all legally protectable elements or derivative works thereof, including, without limitation, the Provider Technology. \[1] “**Provider Technology** ” means Provider’s proprietary technology, including the Services, the Software, software tools, hardware designs, algorithms, user interface designs, architecture, class libraries, objects and documentation (both printed and electronic), network designs, trade secrets and any related intellectual property rights throughout the world (whether owned by Provider or licensed to Provider from a third party) and also including any derivatives, improvements, enhancements or extensions of Provider Technology conceived, reduced to practice, or developed during the term of this Agreement by either party. \[2] “**Customer Data** ” means (i) information or data created or otherwise owned by Customer or any client of Customer or licensed by Customer from third parties used in conjunction with the Services; or (ii) information or data output generated by the Services that is based on information or data supplied by the Customer and is specific to the Customer. ## 8. Indemnification 1. Customer will indemnify, defend and hold Provider, its affiliates and their respective directors, officers, employees, agents, successors and assigns (each a “Provider Indemnitee”) harmless from and against any and all costs, liabilities, losses, and expenses (including, but not limited to, reasonable attorneys' fees and costs) payable to a third party (collectively, “Losses”) and resulting from any claim, suit, action, or proceeding (each, an “Action”) brought by any third party against a Provider Indemnitee arising out of Customer’s (i) breach of Section 5 of this MSSA; or (ii) negligence or willful misconduct. 2. Provider will indemnify, defend and hold harmless Customer, its affiliates and their respective directors, officers, employees, agents, successors and assigns (each a “Customer Indemnitee”) from and against any and all Losses resulting from any Action brought by any third party against a Customer Indemnitee arising out of (i) a breach of the warranty set forth in Section 5; or (ii) the gross negligence or willful misconduct of Provider. Notwithstanding the foregoing, Provider shall have no obligation under this Section 8 to the extent such Action is caused by (i) any use of the Services, Software or Data not in accordance with this Agreement; (ii) Customer’s failure to comply with Documentation (including, without limitation, any minimum requirements for use of the Services); (iii) any breach by Customer of its obligations under this Agreement; (iv) the operation, combination or use of Services, Software or Data, without Provider’s prior written consent, with products or services provided by Customer or third parties; (v) the modification of the Services, Software or Data by Customer, or (vi) Customer’s negligence, or willful misconduct. 3. Each party’s indemnification obligations under this Agreement (including, without limitation, any such obligations set forth in an applicable Schedule) shall be subject to: (i) receiving prompt written notice of the existence of any Action (provided, however, that failure to satisfy this condition shall relieve a party of its indemnification obligations only to the extent the indemnifying party is actually prejudiced thereby); (ii) being able to, at its option and expense, control the defense of such Action (provided, however, that the indemnifying party shall not, without the prior written consent of the indemnified party, settle any Action or otherwise consent to the entry of any order or judgment in any Action if such settlement, order or judgment admits any liability of the indemnified party or requires the indemnified party to take or to refrain from taking any action, other than the payment of damages); (iii) permitting the indemnified party to participate in the defense of any Action, at the indemnified party’s option and expense; and (iv) receiving full cooperation of the indemnified party in the defense thereof. In the event Customer notifies Provider of any Action against Customer or in the event Provider reasonably believe such an Action is likely, Provider may do one or more of the following: (x) to modify the Services in order to avoid an infringement; (y) if applicable or appropriate, to procure a license sufficient to continue offering the Services (including, without limitation, Customer’s use thereof); or (z) to terminate the applicable Service and refund to Customer the pre-paid Fees for the remaining portion of the term (provided that in the event of terminating the applicable Service, Provider shall continue to remain liable for its indemnification obligations). ## 9. Assignments Neither this Agreement, nor a party’s obligations or rights hereunder, may be transferred or assigned by either party without the other party’s prior written consent; provided, however, that either party may assign this Agreement in whole, but not in part, without the other party’s consent to (a) any entity controlled by, under common control with, or controlling such party; (b) the successor-in-interest in any merger, share exchange or other reorganization; or (c) the purchaser of all or substantially all of such party’s assets. Any attempted assignment, transfer, or other disposition by a party in violation of this provision will be null, void and of no force and effect. This Agreement shall inure to the benefit of and be binding upon the permitted successors, legal representatives and assigns of the parties hereto. ## 10. Insurance MacStadium will maintain sufficient insurance coverage for its assets and operating infrastructure that meets MacStadium’s obligations pursuant to this Agreement’s insurance types and limits and by law, with insurance carriers rated A- or better by A.M. Best Company. At all times during this Agreement, MacStadium will maintain the following coverage and limits: 1. Commercial general liability and contractual liability coverage insuring the activities of MacStadium for liabilities written on an occurrence basis, with limits of \$1,000,000. 2. Workers’ Compensation with limits no less than the minimum required by applicable law; 3. Employers’ Liability with limits of \$1,000,000.00 per occurrence. 4. Cyber liability insurance with limits of \$5,000,000 in the aggregate. MacStadium may make reasonable changes to its insurance coverages from time to time and shall notify the Customer, at any time during this Agreement or any renewal, if the above-referenced limits are reduced. ## 11. General This Agreement constitutes the exclusive statement of all mutual understandings between the parties with respect to the subject matter hereof, superseding all prior or contemporaneous proposals, communications, and understandings, oral or written. Each Schedule includes terms that are in addition to, and not in lieu of, this MSSA. The headings in this Agreement are provided for convenience only and will not affect its construction or interpretation. The parties and their respective personnel are and shall be independent contractors, and neither party by virtue of this Agreement shall have any right, power, or authority to act or create any obligation, express or implied, on behalf of the other party. This Agreement may only be amended in writing by the mutual consent of the parties. No waiver of any provision hereof or of any right or remedy hereunder shall be effective unless in writing and signed by the party against whom such waiver is sought to be enforced. No delay in exercising, no course of dealing with respect to, or no partial exercise of any right or remedy hereunder shall constitute a waiver of any other right or remedy, or future exercise thereof. If any provision of this Agreement is determined to be invalid under any applicable law, it is to that extent to be deemed omitted, and the balance of the Agreement shall remain enforceable. There shall be no third-party beneficiaries to this Agreement. All notices shall be in writing and shall be deemed to be delivered when received by certified mail, postage prepaid, return receipt requested, or when sent by e-mail. All notices shall be directed to the parties at the respective addresses given above or to such other address as either party may, from time to time, designate by notice to the other party. ## 12. Governing Law This Agreement and all obligations of the parties hereunder shall be interpreted, construed, and enforced in accordance with the laws of the State of Delaware, without regard to any conflict of laws rules or analyses. Any action or proceeding arising from or relating to this Agreement must be brought in a state or federal court having jurisdiction in Wilmington County, Delaware, and each party irrevocably submits to the jurisdiction and venue of any such court in any such action or proceeding and agrees to waive any defenses to venue and jurisdiction including forum non conveniens. The parties agree that the United Nations Convention on Contracts for the International Sale of Goods is specifically excluded from application to this Agreement. ## 13. Counterparts This MSSA, any addendum, and any Schedule entered into hereunder may be executed in two or more counterparts, each of which shall be deemed an original and all of which together shall constitute one instrument. The parties may sign this MSSA, any Addendum, and any Schedule and deliver the signature pages via facsimile or electronic transmission (with the originals to follow) or otherwise in accordance with this Section 11 of this MSSA. *Last Updated: Sept 26, 2025* # MacStadium security and compliance overview Source: https://docs.macstadium.com/macstadium/legal-and-compliance/security Review MacStadium security policies, compliance certifications, and trust documentation. Visit trust.macstadium.com for current audit and compliance records. **MacStadium adheres to the strictest standards when our customers' respective data is involved.** Please visit [trust.macstadium.com](http://trust.macstadium.com/) for the most up-to-date records and explanations of the security and data compliance policies that MacStadium maintains. # Service Level Agreement Source: https://docs.macstadium.com/macstadium/legal-and-compliance/service-level-agreement MacStadium guarantees 99.9% monthly uptime. This SLA defines what counts as an outage, how service credits are calculated, and how to file a claim. **EXHIBIT A: Service Level Agreement** This SLA constitutes MacStadium’s commitments regarding availability of the Services. This SLA is subject to change at MacStadium’s reasonable discretion. We will not apply the terms of a modified SLA during your Initial Service Term; however, upon renewal, the version of MacStadium’s SLA that is current at the time of renewal will apply throughout your Renewal Service Term(s). ## **SLA General Terms:** ### 1. DEFINITIONS 1.1 “Non-Compliance” shall mean any act or inaction by the Customer that is not in compliance with the material terms of this SLA. 1.2 “Outage” shall mean you are reasonably unable to conduct activities while using the Services. Outage does not mean Scheduled Maintenance or emergency maintenance. 1.3 “Service Credit” shall mean the monetary amount credited to you on the following months’ invoice for the affected Services following claim approval by MacStadium. 1.4 “Service Level” shall mean the monthly uptime percentage as described herein for the Services outside of emergency maintenance and Scheduled Maintenance. 1.5 “Severity” shall mean an assessment of the degree of impact to the Customer. 1.6 “Unavailable” or “Unavailability” shall mean whenever the availability of the Services does not meet the Service Level of at least 99.9% uptime in a calendar month as set forth in section 8.1 due to a failure of MacStadium’s infrastructure or systems that is wholly within MacStadium’s control. ### 2. MAINTENANCE Scheduled Maintenance and emergency maintenance will not cause a loss of availability of the Services unless it is beyond the reasonable control of MacStadium. In any event, MacStadium shall use reasonable efforts to ensure any loss of availability arising from Scheduled Maintenance is limited to the shortest period of time practical and will not occur during the business hours where your data center is located. MacStadium may also perform emergency maintenance, including the installation of critical patches, as needed, but shall use reasonable efforts to notify you within four (4) hours of initiating such emergency maintenance. You can review all maintenance updates by visiting [status.macstadium.com](https://status.macstadium.com/). As a part of maintenance, MacStadium may install patches that address security vulnerabilities, but MacStadium will not be liable for any inability, delay, failure or omission in identifying the need for a security upgrade or patch, or for the implementation of any security upgrade or patch. MacStadium will coordinate with you for the application of any noncritical patches as they are released. ### 3. NOTIFICATION AND RESPONSE TIME In the event of an incident that leads to the Unavailability or Non-Compliance, Customer shall notify MacStadium within seven (7) days of the date that the Unavailability or Non-Compliance occurred via submitting a ticket in the MacStadium management portal. MacStadium will respond to all Unavailability and Non-Compliance incidents in the shortest time feasible. MacStadium cannot provide any specified resolution time(s) for any incident(s) before the incident occurs because we cannot accurately state the exact time frame each varying issue may require. ### 4. REQUEST FOR SERVICE CREDIT After the incident has been remedied you MUST request a Service Credit from MacStadium in writing by submitting a ticket in the MacStadium management portal within seven (7) days. If you do not request a Service Credit in this manner, you WILL NOT be entitled to a Service Credit. MacStadium will evaluate all information reasonably available to us and use commercially reasonable efforts to process your claim to make a good faith determination of whether a Service Credit is owed. ### 5. EXCLUSIONS Causes for Unavailability and Non-Compliance do not include: a) Scheduled or emergency Maintenance or a suspension of Services, b) a User’s data or content related other than to scalability or volume, c) the incompatibility of any operating system, application or vendor supplied security patches with a User’s data or content, d) your or your agents or representatives acts or omissions, including all of your or a third party’s testing of the servers, e) the failure of servers or services outside of a data center on which the Services are dependent, including, but not limited to, inaccessibility on the internet that is not caused by MacStadium’s network or network providers, f) MacStadium’s blocking of content that MacStadium deems in its sole discretion to be in violation of the AUP, g) any equipment or hardware downtime not hosted in MacStadium data centers, h) any force majeure event, as detailed in section 14.6 of the Agreement and any other circumstances, events, actions, or inactions not within MacStadium’s reasonable control, i) a denial of service attack or unauthorized access (i.e., hacking), k) your failure to meet the terms and conditions of this SLA, j) co-located devices, k) downtime not reported by you within seven (7) days of the day the downtime first began, l) time required to format or reformat disks or a RAID array, m) time required to load, reload, configure or reconfigure an operating system or applications, n) time required for Customer to restore from backup, and o) any customer initiated changes to their firewall. ### 6. LIMITATIONS You shall not receive a Service Credit under the terms of this SLA if: a) you disable or block (either intentionally or unintentionally) MacStadium’s administrative access in any way that prevents MacStadium from performing its obligations, b) you make any modifications that prohibit a device from rebooting properly, c) you modify or delete the contents of MacStadium’s administrative directories, d) you disable or modify any software installed by MacStadium for the purposes of monitoring or server maintenance, e) you violate any material terms of this Agreement, f) you fail to request a Service Credit in the manner provided in this Agreement, and g) you have an undisputed balance in accounts receivable over sixty (60) days past due. ### 7. GENERAL Notwithstanding anything to the contrary in this Agreement or any Service Order, the following provisions apply to all Services: 7.1 SOLE REMEDY. APPROVED SERVICE CREDITS ARE YOUR SOLE AND EXCLUSIVE REMEDY FOR ANY PERFORMANCE OR UNAVAILABILITY ISSUES FOR ANY SERVICES UNDER THIS AGREEMENT. YOU MAY NOT UNILATERALLY OFFSET ANY FEES FOR APPLICABLE SERVICES FOR ANY PERFORMANCE OR AVAILABILITY ISSUES. 7.2 Maximum Credit. In any calendar month the maximum Service Credit to which you shall be entitled\ shall NOT, under any circumstance, exceed the total amount of one (1) month’s fees for the applicable Services. For the avoidance of doubt, any approved Service Credit shall solely apply to the affected, specific of piece of infrastructure Services stated in the applicable Service Order. In no event, shall a Service Credit be awarded (i) for any unaffected infrastructure Services or (ii) that aggregates monthly fees from more than one (1) Service Order. 7.3 Verification. All periods of Unavailability and Non-Compliance must be verified by MacStadium, and approved Service Credits will be applied by MacStadium as a credit to be used towards a portion of your monthly fees on the following months’ invoice. The period of Unavailability or Non-Compliance is measured from your notification to MacStadium of the incident to the time the Unavailability or Non-Compliance has been remedied as confirmed by MacStadium. 7.4 Monitoring. MacStadium reserves the right to monitor certain protocols and configurations necessary to maintain the availability of the Services. The protocols required may include, but are not limited to, SNMP, API, and SSH. Monitoring may also require, but is not limited to, configuration changes to the Services, configuration, User accounts, service start sequence, and firewall. MacStadium may also passively access the infrastructure providing the Services via port scans and ICMP. End-users may opt-out or change these passive settings at any time. If Customer orders Orka® Services, Customer grants consent to MacStadium to troubleshoot any technical issues that may arise as a part of your Orka® Services. MacStadium shall promptly notify you if and when there is a need to troubleshoot. You have the right to withdraw consent upon ten (10) days prior written notice sent to MacStadium at [legal@macstadium.com](mailto:legal@macstadium.com); however, if you experience technical issues with Orka® that require troubleshooting, MacStadium will not be able to fix such issue until we receive your consent. Performance of any troubleshooting shall not degrade or materially change Orka® Services in any way. ## Service Specific Terms: ### 8. DESCRIPTION OF SERVICES & AVAILABILITY MacStadium shall use commercially reasonable efforts to ensure meeting the Service Levels described herein. If you experience Unavailability, you may be entitled to a Service Credit upon MacStadium claim review. As a note, MacStadium is not a public cloud provider, nor do we offer public clouds for purchase. The Services provide a means for you to run your own cloud software environment. MacStadium recommends the placement of servers in two or more data centers as a preventative measure against the failure of a single data center. 8.1 Service Level. The Services shall have a Service Level of at least 99.9% uptime in a calendar month, which is calculated using the following formula: Total Available Minutes in One Month – Outage time / Total Available Minutes in One Month x 100 8.2 Service Credits. The following Service Levels and Service Credits are applicable to Customer’s use of MacStadium Services including single bare metal Mac mini or Mac Pro, Mac private cloud services, and Orka® virtualization software: | Availability | Service Credit | | ------------ | -------------- | | \<99.9% | 10% of the MRC | | \<99.0% | 25% of the MRC | | \<98.0% | 50% of the MRC | # Viewing your environment in My Cloud Source: https://docs.macstadium.com/macstadium/macstadium-overview/ip-plan My Cloud in the MacStadium Portal shows your environment by data center: public servers, firewalls, VPN credentials, network allocations, and host assignments. The **My Cloud** page in the MacStadium Portal is where you see the networking and access details for your environment, including VPN credentials, network ranges, firewall public IPs, and the IP assignments for your servers. My Cloud replaces the IP Plan spreadsheet that was previously distributed. Other MacStadium docs may still refer to this information as "your IP Plan"; this is now under My Cloud. ## Open My Cloud 1. Sign in to the [MacStadium Portal](/macstadium/macstadium-overview/macstadium-portal) at [portal.macstadium.com](https://portal.macstadium.com/login). 2. Open **My Cloud**. 3. Select the data center tab for the environment you want to view (Atlanta, Las Vegas, or Dublin). ## What's on the page My Cloud groups your environment by data center. For each data center you'll see: * **Public Servers**: servers reachable on the public internet, with their public IPs and hostnames. * **Firewalls**: each dedicated firewall has its own section, containing: * **IP Allocation**: the networks behind the firewall, with subnet (CIDR), range, mask, and gateway. * **Credentials**: username and password for [connecting to the environment via VPN](/orka/networking-with-orka-at-macstadium/vpn-connection), and (where provisioned) for **Harbor OCI Storage** and **Private Cloud**. Select **Show** to reveal, then copy. * **Host Assignments**: servers assigned to each network, with their private IPs and (where applicable) public NAT IPs. The firewall's public IP is the address you use as the VPN server address and as the on-prem peer when configuring a site-to-site VPN tunnel. See the setup guides for [AWS](/orka/networking-with-orka-at-macstadium/aws-orka-connections), [GCP](/orka/networking-with-orka-at-macstadium/gcp-orka-connections), or [Azure](/iaas/azure/site-to-site-vpn-configuration-with-azure). ## Working with servers Whether you're looking under **Public Servers** or under a network's **Host Assignments**, each server shows the same information and shortcuts. For every server you'll see its name, hardware type (for example, M2.M or M2.L), service ID, current status (such as **Active** or **Pending**), and IP address. If the server has more than one IP, you can expand the entry to see the rest. You can also: * **Launch VNC** to open a remote screen-sharing session to the server. * **Copy SSH Address** to grab a ready-to-paste `ssh` command for the server. * **Copy** the server's name, service ID, or IP with a single select. * **Select the server's name** to open its full details, including any credentials for that server. ## Field reference Other MacStadium docs refer to legacy field names from the old IP Plan spreadsheet. Use this mapping when you're looking them up in My Cloud: | Looking for... | Find it in My Cloud | | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | VPN server address, `FW1-Outside`, or the `Outside` network | The firewall's public IP, shown at the top of the firewall's section | | VPN username and password | **Credentials** for that firewall | | The `Private-1` network (or any internal network) | A row in the firewall's **IP Allocation** table. The **Subnet ID** column is the CIDR you'll need for VPN tunnels. | Network names vary by environment. If your environment was provisioned with custom network names, use the **IP Allocation** table to identify the equivalent networks. # MacStadium cloud hosting for Apple hardware Source: https://docs.macstadium.com/macstadium/macstadium-overview/macstadium-overview MacStadium hosts Apple hardware for enterprise: bare metal Macs, Orka macOS virtualization, and cloud access, in MacStadium data centers, AWS, or on-prem. MacStadium enables organizations to achieve seamless macOS workload orchestration and virtualization at scale, whether for CI/CD build-and-test pipelines or full-fidelity virtual desktop environments. We deliver purpose-built software that integrates control-plane orchestration and hypervisor-level virtualization on Apple hardware, with deployment options available in our data centers, public cloud, or on-premises. ## Software Solutions ### Orka: macOS VM Orchestration & Virtualization * **Control Plane** * Centralized orchestration of macOS VMs * k8s native to integrate with popular tooling * Native CI plugins to support common tools like Jenkins, GitHub Actions, Bitrise, and more * **Virtualization Engine** * Lightweight hypervisor running on Mac nodes * Rapid VM spin-up/down with dynamic resource allocation * Built-in support for networking, storage attach, and hardware passthrough ### Citrix with MacStadium * **VDI User Experience**\ Use Citrix DaaS to provide the desktop management and Orka to enable portable macOS VMs ## Deployment Flexibility 1. **Public Cloud** 1. Run our software on AWS with bare-metal Mac EC2 instances 2. Use managed Kubernetes services like Amazon EKS, Azure AKS, and Google GKE to orchestrate macOS workloads 2. **On-Premises** 1. Integrate with your existing data center Mac infrastructure 2. Use self-hosted or managed k8s systems to orchestrate macOS workloads 3. **Hosted by MacStadium** 1. Choose from one of our global data centers for turnkey management ## Bare Metal & IaaS While our software is the focus, we continue to offer: * **Mac Bare-Metal & IaaS** * Dedicated Mac hardware on demand * Private networks, firewalls, and storage expansion * Non-mac compute for general-purpose use cases (Private Cloud Compute) ## Why MacStadium? * **Apple-Native Expertise**\ Deep specialization in macOS virtualization and lifecycle operations * **End-to-End Control**\ Full stack designed for macOS workloads, from Application-level APIs to hypervisor to hardware. * **Scalable & Secure**\ Tenant isolation, private networking, and enterprise-grade SLAs * **Choice & Portability**\ Consistent software across clouds, on-prem, or hosted environments # MacStadium Portal for subscriptions and support Source: https://docs.macstadium.com/macstadium/macstadium-overview/macstadium-portal Manage MacStadium subscriptions and support at portal.macstadium.com. A business email is required to register; personal email domains are not accepted. ## Overview The MacStadium Portal allows organizations to manage their MacStadium solutions and support tickets. ## Getting Started Create your account and log into the Portal by going to [portal.macstadium.com](https://portal.macstadium.com/login) ## Business Email Requirement MacStadium services are intended for business use, and as part of our onboarding process, we require a valid business email address to create an account. If you attempt to sign up using a personal or non-business email, your registration will fail with the following error: PreSignUp failed with error: Business email required. To proceed, please use a company domain email address (e.g., `you@yourcompany.com`). # Mac Configuration Assistance Source: https://docs.macstadium.com/macstadium/support/mac-configuration-assistance MacStadium Remote Hands Service covers basic hardware and OS setup to ensure access to the Mac via remote SSH, VNC, or screen sharing. ## About MacStadium [Remote Hands Service](/macstadium/support/remote-hands-service) covers basic hardware and OS setup to ensure access to the Mac via remote SSH, VNC, or screen sharing. ## Overview MacStadium is a fully-staffed service organization with technicians and engineers available around the clock - many of whom are highly trained on Apple hardware solutions. ## Getting Started We will provide as much guidance as possible for customers in need of more specific help setting up the more detailed aspects of the OS or included software. MacStadium is an infrastructure services provider, not an IT support organization. For this reason, we often refer more advanced support issues dealing with custom configuration of your OS or software to one of our partners who specialize in IT configuration and management. # MacStadium Support Tiers Source: https://docs.macstadium.com/macstadium/support/macstadium-support-tiers MacStadium offers Basic, Pro, and Premium support. See response time SLAs, support hours, and what's included in professional services before you decide. ### Pricing and Support Comparison | | **Basic** | **Pro** | **Premium** | | ----------------------------------------- | ------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Price** | Included (free) | 10% of Annual Spend | 20% of Annual Spend | | **Recommended if** | You are developing or testing MacStadium out. | Extra support for growing businesses with mission-critical workflows. | MacStadium is essential to your business. Partner with us. | | **Support hours** | 9am–5pm in the Data Center TZ | 24 x 7 | 24 x 7 | | **Support channel** | Email, Portal | Email, Portal, Scheduled Phone Support (weekdays, 9–5pm) | Email, Portal, Scheduled Phone Support (weekdays, 9–5pm), and Dedicated Slack Channel | | **Professional services\*** | | 5 hours/year to support onboarding or other updates. Additional service packages available for purchase. | 15 hours/year to support onboarding or other updates. Additional service packages available for purchase. | | **Business Impact / First Response Time** | General usage question: \<2 business days
Environment Impacted: \<1 business day | General usage question: \<48 hours
Marginal impact: \<24 hours
Major impact: \<4 hours
Environment down/inaccessible: \<1 hour | General usage question: \<48 hours
Marginal impact: \<24 hours
Major impact: \<2 hours
Environment down/inaccessible: \<30 minutes | | **Security and Service Agreements** | Access to Online Trust Center | Access to Online Trust Center
Customized MSA/DPA
Annual vendor security questionnaire | Access to Online Trust Center
Customized MSA/DPA
Annual vendor security questionnaire
Participation in customer's audit or tabletop exercises (up to 4 hours annually) | | **Knowledge Base Access** | ✓ | ✓ | ✓ | | **Online Trust Center Access** | ✓ | ✓ | ✓ | | **Scheduled Phone Support\*\*** | ✗ | ✓ | ✓ | | **Maintenance on Nights/Weekends\*\*\*** | ✗ | ✗ | ✓ | | **Dedicated Slack Channel for Support** | ✗ | ✗ | ✓ | **Notes** * **\*Scheduled phone support:** MacStadium's support team is available for a phone call scheduled during EU and US working hours on weekdays from 9am-5pm. Applies to non-emergency calls scheduled via Calendly booking link in an open support ticket. * **\*\*Maintenance on nights/weekends:** Customers on a Premium plan may request an alternative maintenance window to occur on nights and/or weekends instead of during US or EU working hours. # MacStadium Remote Hands hardware support Source: https://docs.macstadium.com/macstadium/support/remote-hands-service MacStadium Remote Hands covers hardware diagnosis, network issues, OS password recovery, factory restore, and OS service changes on customer request. The MacStadium *Remote Hands* Service covers the following issues: * Mac hardware diagnosis and repair * Network infrastructure or IP issues * OS password recovery to default * OS restore to factory default * OS restore from backup (i.e. Time Machine) * OS services enable/disable (turn off firewall, SIP, etc.) MacStadium will always assist customers with a service request. In some cases, a request may go beyond our *Remote Hands* service scope (i.e. items not listed above). For those instances, MacStadium will quote customers an hourly rate to address that specific issue. In other cases, MacStadium may refer a customer to one of our IT partners who might be better suited to address that specific IT concern. MacStadium is not responsible for the backup of customer software. # MacStadium support plans and services Source: https://docs.macstadium.com/macstadium/support/support Compare MacStadium support tiers: Business, Pro, and Premium, with 24/7 monitoring, Remote Hands, and engineering support for networking and virtualization. ## About Support MacStadium offers various First-Line Support Services 24/7 for customers on the Business, Pro and Premium support plans including: * Monitoring, that automatically opens support tickets * Remote Hands and Basic Support (primarily for Host-Level issues) * Shift manager to triage, evaluate severity, and escalate issues ## Overview Severity definitions for cloud environments: * **Severity 1** - Outage incident affecting multiple customers * **Severity 2** - Outage incident affecting a single customer * **Severity 3** - Non-outage incident that adversely affects one or more customers. For example, network latency. * **Severity 4** - Non-outage incident related to a redundant component failure * **Severity 5** - False alarm ### Advanced Engineering Support Customers on the Business, Pro and Premium support plans can get 24/7 Engineering Team Support * Networking, storage, and virtualization expertise * Break/fix, upgrades, advice, troubleshooting * Non-urgent tickets are worked in the order they are received ### 24/7 Off-Hours and On-Call Engineering Support * 4-hour maximum response time for system unavailability (Severity 1 and Severity 2) * Non-urgent issues handled 8 AM the next working day (Severity 3 to Severity 5) ## Getting Started **MacStadium Ticketing System** 1. Start by logging in to [portal.macstadium.com](https://portal.macstadium.com) 2. Click **Support Center** in the bottom-left corner. 3. Click **Create Ticket** in the upper-right corner. If the request is related to a specific subscription, then select it from the dropdown: 1. Select the appropriate ticket type. 2. Type a message in the text box. 3. (Optional) Attach files by clicking the paperclip icon in the bottom-left. * If the ticket or attachment contains sensitive information such as login credentials, and so on, then click the checkbox marked, **sensitive information** to ensure the message is never stored or transmitted in plain-text (meaning, *via email*). 4. Click **Create Ticket** and the ticket is created, assigned a number, and added to the new ticket queue. * You can review all tickets (open and closed), responses, and attachments via the same portal. * You can close tickets by selecting **Closed** from the dropdown (beside the ticket number). ## Possible Reasons for Creating a Ticket Creating a ticket through MacStadium's [customer portal](https://portal.macstadium.com/support-center/tickets) is the fastest and most secure way of reaching MacStadium engineering staff. Each ticket is immediately reviewed 24/7 by one of our customer support technicians. When necessary, tickets are escalated to more specialized engineering staff. Tickets are the best way to kick off most requests. ### Environment Setup * Questions about the IP plan document. * Questions about firewall set up. ### Remote Hands Request * Troubleshooting a non-responsive host. * Re-imaging a host whose OS has become corrupted. ### Configuration Change Request * Requesting version update for a host OS or virtualization control layer. * Requests for infrastructure additions. * If you work with an Account Manager, reach out directly and have them quote prices, kick off the request, and so on. * If you do not have an Account Manager or have a simple request, you can open a ticket for: * Firewall upgrades * Host additions * Storage LUN expansions * Additional IP addresses * Notification on performance issues Contact MacStadium if any unexplained performance degradation occurs. MacStadium engineers can troubleshoot and return your infrastructure to optimal performance. ### Monitoring Alerts * Network Management System (NMS) alerts generated by our operational monitoring system. * Email alerts generated by internal monitoring sent to [support@macstadium.com](mailto:support@macstadium.com) via an email address associated with the account. ## Subscribe [status.macstadium.com](http://status.macstadium.com/) Shows current status of each data center and is the ideal place to stay up-to-date on scheduled maintenance or unplanned outages. # Compatibility: Performance Improving Features Source: https://docs.macstadium.com/orka/compatibility/compatibility-performance-improving-features Orka performance features: saved state, GPU passthrough, I/O boost, and network boost. Intel vs. Apple silicon with macOS version requirements. ## Compatibility based on Apple hardware | Feature | Intel | Apple silicon | | ----------------------------------- | ----- | ------------- | | Use saved state (optimizes startup) | ✅ | ❌ | | GPU passthrough | ✅ | ✅\* | | I/O boost\* | ✅ | ✅\* | | Network boost\* | ✅ | ✅\* | * GPU passthrough, I/O boost, and Network boost are always enabled for Apple silicon-based nodes and VMs. You cannot manually disable or override these settings on the VM config or VM level. ## (Apple silicon-only) Compatibility based on macOS version | macOS version | Notes | | ------------------ | ------------------------------------------------------------------ | | macOS 13 (Ventura) | Supported | | macOS 14 (Sonoma) | Supported | | macOS 15 (Sequoia) | Supported (since Orka 3.2) | | macOS 26 (Tahoe) | Supported as guest OS (since Orka 3.5; requires Sequoia 15.5 host) | GPU passthrough, I/O boost, and Network boost are always enabled for Apple silicon VMs. These settings cannot be disabled or overridden at the VM config or VM level. ## (Intel-only) Compatibility based on macOS version | macOS version | I/O boost | Network boost | GPU passthrough | | ------------------ | --------- | ------------- | --------------- | | macOS 13 (Ventura) | ✅ | ✅ | ✅\* | | macOS 14 (Sonoma) | ✅ | ✅ | ✅\* | * By default, GPU passthrough is disabled for VM configurations and VMs. When you enable GPU passthrough for an Intel VM, this automatically disables VNC for the VM. Make sure that you will be able to access the VM by SSH or Apple Screen Sharing before enabling GPU passthrough. # Feature Parity: Apple Hardware Source: https://docs.macstadium.com/orka/compatibility/feature-parity-apple-hardware Compatibility across Intel and Apple silicon Orka nodes: supported macOS versions, VM operations, image types, networking, and CI/CD integration support. Compatibility between Orka features and Intel- and Apple silicon-based nodes, VMs, and images. ## macOS versions | macOS version | Intel | Apple silicon | | ------------------ | ----- | ---------------------------------------------------------- | | macOS 13 (Ventura) | ✅ | ✅ | | macOS 14 (Sonoma) | ✅ | ✅ | | macOS 15 (Sequoia) | ❌ | ✅ (since Orka 3.2) | | macOS 26 (Tahoe) | ❌ | ✅ (since Orka 3.5, guest only; requires Sequoia 15.5 host) | ## General features | Feature | Intel | Apple silicon | | ----------------------------------------- | ----- | ------------- | | Use API IP to access Orka | ✅ | ✅ | | Use built-in Orka domain to access Orka | ✅ | ✅ | | Use external custom domain to access Orka | ✅ | ✅ | | View output in TABLE format | ✅ | ✅ | | View output in WIDE format | ✅ | ✅ | | View output in JSON format | ✅ | ✅ | ## Tool configuration | Feature | Intel | Apple silicon | | ------------------------------------------------------------ | ----- | ------------- | | Configure API IP | ✅ | ✅ | | Configure built-in Orka domain | ✅ | ✅ | | Configure external custom domain | ✅ | ✅ | | Upload TLS certificate to use with an external custom domain | ✅ | ✅ | ## Cluster configuration and features | Feature | Intel | Apple silicon | | -------------------------------------------------------------- | ----- | ------------- | | VM scheduling | ✅ | ✅ | | GPU passthrough | ✅\* | ✅\*\* | | VM Internet isolation | ✅ | ✅ | | VM network isolation | ✅ | ✅ | | Namespaces | ✅ | ✅ | | Namespaces with custom pods allowed (formerly, sandboxed mode) | ✅ | ✅ | | Nested virtualization (Beta) | ✅ | ❌ | The listed configurations are disabled by default and are available upon request. \*\* GPU passthrough is always enabled by default on Apple silicon-based nodes. ## Checks | Feature | Intel | Apple silicon | | ------------------------------ | ----- | ------------- | | Check the current tool version | ✅ | ✅ | ## Users | Feature | Intel | Apple silicon | | --------------------------------- | ----- | ------------- | | Log in | ✅ | ✅ | | Log out | ✅ | ✅ | | Get token | ✅ | ✅ | | Set token | ✅ | ✅ | | Manage role bindings for the user | ✅ | ✅ | ## Service accounts | Feature | Intel | Apple silicon | | -------------------------------------------- | ----- | ------------- | | Create service account | ✅ | ✅ | | Get service account token | ✅ | ✅ | | List service accounts | ✅ | ✅ | | Delete service account | ✅ | ✅ | | Manage role bindings for the service account | ✅ | ✅ | ## Namespaces | Feature | Intel | Apple silicon | | -------------------------------------- | ----- | ------------- | | List namespaces | ✅ | ✅ | | Create namespace | ✅ | ✅ | | Delete namespace | ✅ | ✅ | | Manage role bindings for the namespace | ✅ | ✅ | ## Nodes | Feature | Intel | Apple silicon | | -------------------------------------------------------------------------- | ----- | ------------- | | List nodes | ✅ | ✅ | | Assign node to a namespace (formerly, grouping) | ✅ | ✅ | | Assign node to a namespace with enabled custom pods (formerly, sandboxing) | ✅ | ✅ | | Apply tag (node affinity) | ✅ | ✅ | | Remove tag (node affinity) | ✅ | ✅ | ## VMs: Listing and info | Feature | Intel | Apple silicon | | ------------------------------------------------------------------- | ----- | ------------- | | List all users' VMs | ✅ | ✅ | | List specific VMs | ✅ | ✅ | | List all users' VM configurations | ✅ | ✅ | | List specific VM configurations | ✅ | ✅ | | List the VM's ports reserved for VNC, SSH, and Apple Screen Sharing | ✅ | ✅ | | List the VM's ports reserved for port forwarding | ✅ | ✅ | ## VMs: Create VM configurations | Feature | Intel | Apple silicon | | --------------------------------------------------------------------- | ----- | ------------- | | Create basic VM configuration (name,image) | ✅ | ✅ | | Create VM configuration with custom memory | ✅ | ✅ | | Create VM configuration with attached ISO | ✅ | ❌ | | Create VM configuration with enabled/disabled VNC | ✅ | ✅ | | Create VM configuration with enabled/disabled I/O boost\* | ✅ | ❌\* | | Create VM configuration with enabled/disabled Network boost setting\* | ✅ | ❌\* | | Create VM configuration with enabled/disabled GPU passthrough\* | ✅ | ❌\* | | Create VM configuration with custom serial number | ✅ | ❌ | | Create VM configuration with preferred tag (node affinity) | ✅ | ✅ | | Create VM configuration with required tag (node affinity) | ✅ | ✅ | | Create VM configuration with custom scheduler | ✅ | ✅ | * GPU passthrough, I/O boost, and Network boost are always enabled for Apple silicon-based nodes and VMs. You cannot manually disable or override these settings on the VM config or VM level. ## VMs: Deploy VMs | Feature | Intel | Apple silicon | | ----------------------------------------------------------------- | ----- | ------------- | | Deploy basic VM (image) | ✅ | ✅ | | Deploy VM with custom memory | ✅ | ✅ | | Deploy VM with attached ISO | ✅ | ❌ | | Deploy VM with enabled/disabled VNC | ✅ | ✅ | | Deploy VM with enabled/disabled I/O boost\* | ✅ | ❌\* | | Deploy VM with enabled/disabled Network boost\* | ✅ | ❌\* | | Deploy VM with enabled/disabled GPU passthrough\* | ✅ | ❌\* | | Deploy VM with custom serial number | ✅ | ❌ | | Deploy VM with preferred tag (node affinity) | ✅ | ✅ | | Deploy VM with required tag (node affinity) | ✅ | ✅ | | Deploy VM with custom scheduler | ✅ | ✅ | | Deploy without VM configuration | ✅ | ✅ | | Deploy VM from VM configuration | ✅ | ✅ | | Deploy VM from VM configuration and override the VM configuration | ✅ | ✅ | * GPU passthrough, I/O boost, and Network boost are always enabled for Apple silicon-based nodes and VMs. You cannot manually disable or override these settings on the VM config or VM level. ## VMs: Start/stop/suspend/resume | Feature | Intel | Apple silicon | | --------------------------- | ----- | ------------- | | Stop VM by name (power off) | ✅ | ❌ | | Start VM by name (power on) | ✅ | ❌ | | Suspend VM by name (sleep) | ✅ | ❌ | | Resume VM by name (wake) | ✅ | ❌ | ## VMs: Delete | Feature | Intel | Apple silicon | | ----------------- | ----- | ------------- | | Delete VM by name | ✅ | ✅ | ## VMs: Storage | Feature | Intel | Apple silicon | | ----------------- | ----- | ------------- | | Shared VM storage | ✅ | ✅ | | I/O boost\* | ✅ | ✅ \* | * I/O boost is always enabled on Apple silicon-based nodes and VMs. You cannot manually disable or override it on the VM config or VM level. ### macOS and shared VM storage | macOS version | Intel | Apple silicon | | ------------------ | ----- | ------------------ | | macOS 13 (Ventura) | ✅ | ✅ | | macOS 14 (Sonoma) | ✅ | ✅ | | macOS 15 (Sequoia) | ❌ | ✅ (since Orka 3.2) | | macOS 26 (Tahoe) | ❌ | ✅ (since Orka 3.5) | ## VMs: Networking | Feature | Intel | Apple silicon | | -------------------- | ----- | ------------- | | VNC | ✅ | ✅ | | SSH | ✅ | ✅ | | Apple Screen Sharing | ✅ | ✅ | | Port forwarding | ✅ | ✅ | | Network boost\* | ✅ | ✅\* | * Network boost is always enabled on Apple silicon-based nodes and VMs. You cannot manually disable or override it on the VM config or VM level. ## VMs: Performance | Feature | Intel | Apple silicon | | --------------- | ----- | ------------- | | GPU passthrough | ✅ | ❌ | | I/O boost\* | ✅ | ✅\* | | Network boost\* | ✅ | ✅\* | * I/O boost and Network boost are always enabled for Apple silicon-based nodes and VMs. You cannot manually disable or override these settings on the VM config or VM level. ## Images | Feature | Intel | Apple silicon | | ------------------------------------------------------------------------------------------------------------------- | ----- | ------------- | | Deploy from public OCI-compatible images | ✅ | ✅ | | Deploy from private OCI-compatible images (with registry credentials configured locally) | ✅ | ✅ | | Push an image from a running VM to an OCI-compatible registry (with registry credentials configured locally) | ✅ | ✅ | | List images locally stored in the cluster | ✅ | ✅ | | List remote images | ✅ | ✅ | | Pull a remote image | ✅ | ✅ | | Pull a remote image and rename it | ✅ | ✅ | | Download an image on your local machine | ✅ | ❌ | | Upload an image from your local machine | ✅ | ❌ | | Generate a new empty image | ✅ | ❌ | | Set an image description | ✅ | ✅ | | Copy and rename an image | ✅ | ✅ | | Save a new image from the specified VM (Save as) | ✅ | ✅ | | Overwrite the existing image with its current state from the specified VM (Save) | ✅ | ✅ | | Resize the disk and automatically resize the partition of the specified VM | ✅ | ✅ | | Resize the disk and automatically resize the partition of a specified VM and automatically save a new image from it | ✅ | ✅ | | Only resize the disk of the specified VM | ✅ | ✅ | | Delete an image | ✅ | ✅ | ## ISOs | Feature | Intel | Apple silicon | | ------------------------------- | ----- | ------------- | | List ISOs | ✅ | ❌ | | List remote ISOs | ✅ | ❌ | | Pull a remote ISO | ✅ | ❌ | | Pull a remote ISO and rename it | ✅ | ❌ | | Rename an ISO | ✅ | ❌ | | Copy and rename an ISO | ✅ | ❌ | | Delete an ISO | ✅ | ❌ | | Download an ISO | ✅ | ❌ | | Upload an ISO | ✅ | ❌ | # Feature Parity: Orka Tools Source: https://docs.macstadium.com/orka/compatibility/feature-parity-orka-tools Feature parity matrix: which operations Orka3 CLI, Orka3 API, and Web UI support for VMs, images, nodes, namespaces, and authentication. ## General features | Feature | Orka3 CLI | Orka3 API | Web UI | | ----------------------------------------- | --------- | --------- | ------ | | Use API IP to access Orka | ✅ | ✅ | ✅ | | Use built-in Orka domain to access Orka | ✅ | ✅ | ✅ | | Use external custom domain to access Orka | ✅ | ✅ | ✅ | | View output in TABLE format | ✅ | ❌ | ❌ | | View output in WIDE format | ✅ | ❌ | ❌ | | View output in JSON format | ✅ | ✅ | ❌ | ## Tool configuration | Feature | Orka3 CLI | Orka 3 API | Web UI | | ------------------------------------------------------------ | --------- | ---------- | ------ | | Configure API IP | ✅ | ✅ | ✅ | | Configure built-in Orka domain | ✅ | ✅\* | ✅\* | | Configure external custom domain | ✅ | ✅\* | ✅\* | | Upload TLS certificate to use with an external custom domain | ❌ | ✅ | ❌ | * Requires additional configuration. See [Built-In Orka Domains](/orka/networking-with-orka-at-macstadium/built-in-orka-domains) and [External Custom Domains](/orka/networking-with-orka-at-macstadium/external-custom-domains). ## Checks | Feature | Orka3 CLI | Orka3 API | Web UI | | ------------------------------ | --------- | --------- | ------ | | Check the current tool version | ✅ | ❌ | ✅ | ## Users | Feature | Orka 3 CLI | Orka3 API | Web UI | | -------------------------------------------------- | ---------- | --------- | ------ | | Log in | ✅ | ❌ | ✅\* | | Log out | ✅ | ❌ | ✅ | | Get token | ✅ | ❌ | ❌ | | Set token (authenticate with a pre-existing token) | ✅ | ✅ | ✅ | | Manage role bindings for the user | ✅ | ✅ | ❌ | * You need an authentication token obtained with the Orka3 CLI. ## Service accounts | Feature | Orka3 CLI | Orka3 API | Web UI | | -------------------------------------------- | --------- | --------- | ------ | | Create service account | ✅ | ✅ | ❌ | | Get service account token | ✅ | ✅ | ❌ | | List service accounts | ✅ | ✅ | ❌ | | Delete service account | ✅ | ✅ | ❌ | | Manage role bindings for the service account | ✅ | ✅ | ❌ | ## Namespaces | Feature | Orka3 CLI | Orka3 API | Web UI | | -------------------------------------- | --------- | --------- | ------ | | List namespaces | ✅ | ✅ | ❌ | | Create namespace | ✅ | ✅ | ❌ | | Delete namespace | ✅ | ✅ | ❌ | | Manage role bindings for the namespace | ✅ | ✅ | ❌ | ## Nodes | Feature | CLI: direct | API | Web UI | | -------------------------------------------------------------------------- | ----------- | --- | ------ | | List nodes | ✅ | ✅ | ✅ | | Assign node to a namespace (formerly, grouping) | ✅ | ✅ | ❌ | | Assign node to a namespace with enabled custom pods (formerly, sandboxing) | ✅ | ✅ | ❌ | | Apply tag (node affinity) | ✅ | ✅ | ❌ | | Remove tag (node affinity) | ✅ | ✅ | ❌ | ## VMs: Listing and info | Feature | Orka3 CLI | Orka3 API | Web UI | | ------------------------------------------------------------------- | --------- | --------- | ------ | | List all users' VMs | ✅ | ✅ | ✅ | | List specific VMs | ✅ | ✅ | ❌ | | List all users' VM configurations | ✅ | ✅ | ✅ | | List specific VM configurations | ✅ | ✅ | ❌ | | List the VM's ports reserved for VNC, SSH, and Apple Screen Sharing | ✅ | ✅ | ✅ | | List the VM's ports reserved for port forwarding | ✅ | ✅ | ✅ | ## VMs: Create VM configurations | Feature | Orka3 CLI | Orka3 API | Web UI | | ------------------------------------------------------------------- | --------- | --------- | ------ | | Create basic VM configuration (name, image) | ✅ | ✅ | ✅ | | Create VM configuration with custom memory | ✅ | ✅ | ✅ | | Create VM configuration with attached ISO | ✅ | ✅ | ❌ | | Create VM configuration with enabled/disabled VNC | ✅ | ✅ | ✅ | | Create VM configuration with enabled/disabled I/O boost | ✅ | ✅ | ✅ | | Create VM configuration with enabled/disabled Network boost setting | ✅ | ✅ | ✅ | | Create VM configuration with enabled/disabled GPU passthrough | ✅ | ✅ | ❌ | | Create VM configuration with custom serial number | ✅ | ✅ | ❌ | | Create VM configuration with preferred tag (node affinity) | ✅ | ✅ | ❌ | | Create VM configuration with required tag (node affinity) | ✅ | ✅ | ❌ | | Create VM configuration with custom scheduler | ✅ | ✅ | ❌ | ## VMs: Deploy VMs | Feature | Orka3 CLI | Orka3 API | Web UI | | ----------------------------------------------------------------- | --------- | --------- | ------ | | Deploy basic VM (name, image) | ✅ | ✅ | ✅ | | Deploy VM with custom memory | ✅ | ✅ | ✅ | | Deploy VM with attached ISO | ✅ | ✅ | ❌ | | Deploy VM with enabled/disabled VNC | ✅ | ✅ | ✅ | | Deploy VM with enabled/disabled I/O boost | ✅ | ✅ | ✅ | | Deploy VM with enabled/disabled Network boost | ✅ | ✅ | ✅ | | Deploy VM with enabled/disabled GPU passthrough | ✅ | ✅ | ❌ | | Deploy VM with custom serial number | ✅ | ✅ | ❌ | | Deploy VM with preferred tag (node affinity) | ✅ | ✅ | ❌ | | Deploy VM with required tag (node affinity) | ✅ | ✅ | ❌ | | Deploy VM with custom scheduler | ✅ | ✅ | ❌ | | Deploy without VM configuration | ✅ | ✅ | ❌ | | Deploy from VM configuration | ✅ | ✅ | ✅ | | Deploy VM from VM configuration and override the VM configuration | ✅ | ✅ | ❌ | ## VMs: Start/stop/suspend/resume | Feature | Orka3 CLI | Orka3 API | Web UI | | --------------------------- | --------- | --------- | ------ | | Stop VM by name (power off) | ✅ | ✅ | ❌ | | Start VM by name (power on) | ✅ | ✅ | ❌ | | Suspend VM by name (sleep) | ✅ | ✅ | ❌ | | Resume VM by name (wake) | ✅ | ✅ | ❌ | ## VMs: Delete and purge | Feature | Orka3 CLI | Orka3 API | Web UI | | -------------------------------------------------------- | --------- | --------- | ------ | | Delete VM by name | ✅ | ✅ | ✅ | | Purge VM config (delete the VM config and any instances) | ❌ | ❌ | ✅ | ## VMs: Storage | Feature | Orka3 CLI | API | Web UI | | --------------------- | --------- | --- | ------ | | Shared VM storage\*\* | ❌ | ❌ | ❌ | | I/O boost | ✅ | ✅ | ✅ | \*\* You can access and manage the shared storage from within the VM. ## VMs: Networking | Feature | Orka3 CLI | Orka3 API | Web UI | | ---------------------- | --------- | --------- | ------ | | VNC | ✅ | ✅ | ✅ | | SSH\* | ❌ | ❌ | ❌ | | Apple Screen Sharing\* | ❌ | ❌ | ❌ | | Port forwarding | ✅ | ✅ | ❌\*\* | | Network boost | ✅ | ✅ | ✅ | * Orka assigns an SSH and an Apple Screen Sharing port to all VMs during deployment. You can view the port information in the Orka CLI, Orka API, and the Orka Web UI. However, you need to manage SSH and Apple Screen Sharing from within the VM.\ \*\* You can see which ports are reserved for port forwarding. ## VMs: Performance | Feature | Orka3 CLI | Orka3 API | Web UI | | --------------- | --------- | --------- | ------ | | GPU passthrough | ✅ | ✅ | ✅ | | I/O boost\* | ✅ | ✅ | ✅ | | Network boost\* | ✅ | ✅ | ✅ | * You cannot save or delete a saved state, or check if a VM configuration is using a saved state. However, if a VM configuration uses a saved state, any VMs deployed with the Orka Web UI (after applying the state to the configuration) will use the saved state. ## Images | Feature | Orka3 CLI | Orka3 API | Web UI | | ------------------------------------------------------------------------------------------------------------------- | --------- | --------- | ------ | | Deploy from public OCI-compatible images | ✅ | ✅ | ✅\* | | Deploy from private OCI-compatible images (with registry credentials configured locally) | ✅ | ✅ | ✅\* | | Push an image from a running VM to an OCI-compatible registry (with registry credentials configured locally) | ✅ | ✅ | ❌ | | List images | ✅ | ✅ | ✅ | | List remote images | ✅ | ✅ | ✅ | | Pull a remote image | ✅ | ✅ | ✅ | | Pull a remote image and rename it | ✅ | ✅ | ✅ | | Download an image on your local machine | ❌ | ✅ | ❌ | | Upload an image from your local machine | ❌ | ✅ | ❌ | | Generate a new empty image | ✅ | ✅ | ✅ | | Set an image description | ✅ | ✅ | ❌ | | Copy and rename an image | ✅ | ✅ | ✅ | | Save a new image from the specified VM (Save as) | ✅ | ✅ | ✅ | | Overwrite the existing image with its current state from the specified VM (Save) | ✅ | ✅ | ✅ | | Resize the disk and automatically resize the partition of the specified VM | ✅ | ✅ | ❌ | | Resize the disk and automatically resize the partition of a specified VM and automatically save a new image from it | ✅ | ✅ | ❌ | | Only resize the disk of the specified VM | ✅ | ✅ | ❌ | | Delete an image | ✅ | ✅ | ✅ | * If the respective VM configuration was created with the Orka3 CLI or the Orka3 API, and if the respective registry credentials are configured for the `orka-default` namespace. ## ISOs | Feature | Orka3 CLI | Orka3 API | Web UI | | ------------------------------- | --------- | --------- | ------ | | List ISOs | ✅ | ✅ | ✅ | | List remote ISOs | ✅ | ✅ | ✅ | | Pull a remote ISO | ✅ | ✅ | ✅ | | Pull a remote ISO and rename it | ✅ | ✅ | ✅ | | Rename an ISO | ✅ | ✅ | ✅ | | Copy and rename an ISO | ✅ | ✅ | ✅ | | Delete an ISO | ✅ | ✅ | ✅ | | Download an ISO | ❌ | ✅ | ❌ | | Upload an ISO | ❌ | ✅ | ❌ | # K8s Native: Orka3 CRD Reference Source: https://docs.macstadium.com/orka/kubernetes-native/k8s-native-orka3-crd-reference Field reference for Orka3 Kubernetes custom resource definitions: VirtualMachineConfig and VirtualMachineInstance spec fields, types, and YAML examples. The recommended way to work with Orka resources is via the Orka3 CLI, Orka3 API, or the Orka Web UI. You can still use `kubectl` instead, but exercise caution and consider managing only VMs and VM configs via YAML. Working with images, ISOs, or nodes directly via YAML requires both advanced Orka3 CRD and Kubernetes knowledge, and might result in unexpected issues. ## virtualmachineconfigs.orka.macstadium.com ### Definitions | Field | Type | Description | | ------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `spec` > `cpu` | `integer` | The number of CPU cores to allocate to `VirtualMachineInstances` created from the `VirtualMachineConfig`. | | `spec` > `gpuPassthrough` | `boolean` | Boolean setting if GPU passthrough is enabled. When enabled, `VncConsole` must be disabled. | | `spec` > `image` | `string` | The name of the Image to use for the `VirtualMachineInstances` created from the `VirtualMachineConfig`. | | `spec` > `iso` | `string` | (Intel-only) Attaches the specified ISO (by name) to let you install macOS from scratch on a `VirtualMachineInstance` created from the `VirtualMachineConfig`. When specified, make sure that the `Image` field uses an empty disk generated with the respective operation. | | `spec` > `memory` | `number` | Memory in GiB. Rounded to the nearest 0.1 GiB. If not specified, will be automatically calculated based on the number of CPU cores. | | `spec` > `netBoost` | `boolean` | Boolean setting if Network boost is enabled for `VirtualMachineInstances` created from the `VirtualMachineConfig`. | | `spec` > `nodeName` | `string` | The name of the node where you want the `VirtualMachineInstance` to run. If not specified, the `VirtualMachineInstance` will run on the first available node that matches the criteria (e.g., available CPU and memory, tags, groups, etc.) | | `spec` > `scheduler` | `string` | The scheduler to use for the deployment of `VirtualMachineInstances` created from the `VirtualMachineConfig`. One of `default`, `most-allocated`. When set to `most-allocated`, `VirtualMachineInstances` are scheduled to `OrkaNodes` having most of their resources allocated. The default setting keeps used vs free resources balanced between `OrkaNodes`. | | `spec` > `systemSerial` | `string` | A custom serial number for the `VirtualMachineInstances` created from the `VirtualMachineConfig`. The provided serial number must be a valid Mac serial number. | | `spec` > `tag` | `string` | When specified, `VirtualMachineInstances` created from the `VirtualMachineConfig` will be scheduled for deployment on `OrkaNodes` labeled with the same `Tag`. | | `spec` > `tagRequired` | `boolean` | Boolean setting if the `Tag` is required. When `true`, `VirtualMachineInstances` will be deployed only on nodes matching the specified `Tag`. | | `spec` > `vncConsole` | `boolean` | Boolean setting if the VNC console is enabled for `VirtualMachineInstances` created from the `VirtualMachineConfig`. When enabled, `GPUPassthrough` must be disabled. | ### Examples Create simple VM config ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: VirtualMachineConfig metadata: name: my-orka-vm namespace: orka-default spec: cpu: 3 image: sonoma-90gb-orka3-arm ``` Create VM config with attached ISO ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: VirtualMachineConfig metadata: name: my-orka-vm namespace: orka-default spec: cpu: 4 image: empty-90gb-orka3-amd iso: sonoma.iso ``` ## virtualmachineinstances.orka.macstadium.com ### Definitions | Field | Type | Description | | --------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `spec` > `cpu` | `integer` | The number of CPU cores to allocate to `VirtualMachineInstance`. | | `spec` > `customVMMetadata` | `object` | Custom metadata to be passed to the `VirtualMachineInstance`. | | `spec` > `gpuPassthrough` | `boolean` | Boolean setting if GPU passthrough is enabled. When enabled, `VncConsole` must be disabled. | | `spec` > `image` | `string` | The name of the Image to use for the `VirtualMachineInstance`. | | `spec` > `iso` | `string` | (Intel-only) Attaches the specified ISO (by name) to let you install macOS from scratch. When specified, make sure that the `Image` field uses an empty disk generated with the respective operation. | | `spec` > `memory` | `number` | Memory in GiB. Rounded to the nearest 0.1 GiB. If not specified, the `VirtualMachineInstance` will use the default memory value set in the Orka configuration or will be automatically calculated based on the number of CPU cores. | | `spec` > `netBoost` | `boolean` | Boolean setting if Network boost is enabled. | | `spec` > `nodeName` | `string` | The name of the node where you want the `VirtualMachineInstance` to run. If not specified, the `VirtualMachineInstance` will run on the first available node that matches the criteria (e.g., available CPU and memory, tags, etc.) | | `spec` > `reservedPorts` | `string` | A custom port pairing to enable traffic forwarding. Must be provided in the `:` format (e.g., `1337:3000`). | | `spec` > `scheduler` | `string` | The scheduler to use for the deployment. One of `default`, `most-allocated`. | When set to `most-allocated`, `VirtualMachineInstances` are scheduled to `OrkaNodes` having most of their resources allocated. The default setting keeps used vs free resources balanced between `OrkaNodes`.\ `spec` > `systemSerial` | `string` | A custom serial number for the `VirtualMachineInstance`. The provided serial number must be a valid Mac serial number.\ `spec` > `tag` | `string` | When specified, the `VirtualMachineInstance` will be scheduled for deployment on `OrkaNodes` labeled with the same `Tag`.\ `spec` > `tagRequired` | `boolean` | Boolean setting if the `Tag` is required. When `true`, `VirtualMachineInstances` will be deployed only on nodes matching the specified `Tag`.\ `spec` > `vncConsole` | `boolean` | Boolean setting if the VNC console is enabled for `VirtualMachineInstances` created from the `VirtualMachineConfig`. When enabled, `GPUPassthrough` must be disabled.\ `status`>`errorMessage` | `string` | The error message if the deployment failed.\ `status` > `hostIP` | `string` | The IP of the `OrkaNode` on which the `VirtualMachineInstance` is running.\ `status` > `memory` | `string` | The amount of memory allocated to the `VirtualMachineInstance`.\ `status` > `nodeName` | `string` | The name of the `OrkaNode` on which the `VirtualMachineInstance` is running.\ `status` > `phase` | `string` | The state of the `VirtualMachineInstance` deployment.\ `status` > `portWarnings` | `string` | Any port warnings that have occurred during the deployment.\ `status` > `screenSharePort` | `integer` | The Screen Sharing port assigned to the `VirtualMachineInstance`.\ `status` > `sshPort` | `integer` | The SSH port assigned to the `VirtualMachineInstance`.\ `status` > `vncPort` | `integer` | The VNC port assigned to the `VirtualMachineInstance`. ### Examples **Deploy basic VM** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: VirtualMachineInstance metadata: name: my-orka-vm spec: image: ghcr.io/macstadium/orka-images/sonoma:latest ``` **Deploy complex VM** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: VirtualMachineInstance metadata: name: my-advanced-orka-vm spec: cpu: 4 gpuPassthrough: false image: sonoma-90gb-orka3-arm netBoost: true scheduler: default-scheduler vncConsole: true tag: my-tag tagRequired: false ``` ## images.orka.macstadium.com ### Definitions | Field | Type | Description | | --------------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `spec` > `checksum` | `string` | (amd64-only) The automatically calculated MD5 checksum of the image file represented by the Image. Orka populates Checksum only after you explicitly request the checksum. | | `spec` > `destination` | `string` | A new name for the Image resulting from the Image save operation. Leave empty for commit operations. | | `spec` > `owner` | `string` | The user who initially created the image file represented y the Image. | | `spec` > `size` | `string` or `integer` | The size of the image file in formatted bytes. | | `spec` > `source` | `string` | The name of an `Image`, `RemoteImage` or `VirtualMachineInstance` to use as a source for a specific Image operation. Must match the `SourceType`. | | `spec` > `sourceNamespace` | `string` | The namespace of the source VM (for commit and save). Uses `orka-default` if not specified. | | `spec` > `sourceType` | `string` | Modifier used for Image operations. One of `generated` (for generate), `local` (for copy), `remote` (for pull), `vm` (for commit and save). | | `status` > `errorMessage` | `string` | The error message from the last failed operation with this `Image`. | | `status` > `lastUpdatedTimestamp` | `string` | The timestamp for the last `Image` update (in the ISO 8601 format). | | `status` > `state` | `string` | The current state of the image. One of `Ready`, `Updating`, `Failed`. | ### Examples **Existing Apple silicon-based image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Image metadata: annotations: orka.macstadium.com/description: sonoma-90gb-orka3-arm creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 labels: kubernetes.io/arch: arm64 name: sonoma-90gb-orka3-arm namespace: orka-default resourceVersion: "3064" uid: f42805a1-7c71-4eaa-b61a-6206b59c0e97 spec: size: 90G status: lastUpdatedTimestamp: "2023-10-16T09:55:25Z" state: Ready ``` **Existing Intel-based image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Image metadata: annotations: orka.macstadium.com/description: 90GBVenturaSSH.img creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 labels: kubernetes.io/arch: amd64 name: 90gbventurassh.img namespace: orka-default resourceVersion: "3032" uid: e329b4e4-90e5-4b3c-9c2c-8651923d87ed spec: size: 90G status: lastUpdatedTimestamp: "2023-10-16T09:55:25Z" state: Ready ``` **Generate empty image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Image metadata: name: empty-90gb-orka3-amd namespace: orka-default spec: size: 90G sourceType: generated ``` **Copy local image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Image metadata: name: copy-sonoma-90gb-orka3-arm namespace: orka-default spec: sourceType: local source: sonoma-90gb-orka3-arm ``` **Pull remote image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Image metadata: name: pulled-ventura-orka3-arm namespace: orka-default spec: sourceType: remote source: 90gbventurassh.orkasi ``` ## isos.orka.macstadium.com ### Definitions | Field | Type | Description | | --------------------------------- | --------------------- | ------------------------------------------------------------------------------------ | | `spec` > `size` | `string` or `integer` | The size of the ISO file in formatted bytes. | | `spec` > `source` | `string` | The name of an `Iso` or `RemoteIso` to use as a source for a specific Iso operation. | | `spec` > `sourceType` | `string` | Modifier used for Iso operations. One of `local` (for copy) or `remote` (for pull). | | `status` > `errorMessage` | `string` | The error message from the last failed operation with this `Iso`. | | `status` > `lastUpdatedTimestamp` | `string` | The timestamp for the last `Iso` update (in the ISO 8601 format). | | `status` > `state` | `string` | The current state of the Iso. One of `Ready`, `Updating`, `Failed`. | ### Examples **Existing ISO** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Iso metadata: annotations: orka.macstadium.com/description: Ventura.iso creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 name: ventura.iso namespace: orka-default resourceVersion: "3079" uid: 1c6f8e5c-fc0b-449b-ba03-2351d41d8d34 spec: size: 2G status: lastUpdatedTimestamp: "2023-10-16T09:55:25Z" state: Ready ``` **Copy local ISO** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Iso metadata: name: copy-big-sur.iso namespace: orka-default spec: sourceType: local source: big-sur.iso ``` **Pull remote ISO** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: Iso metadata: name: pulled-ventura.iso namespace: orka-default spec: sourceType: remote source: ventura.iso ``` ## remoteimages.orka.macstadium.com ### Definitions | Field | Type | Description | | -------------------- | --------------------- | ------------------------------------------------------ | | `spec` > `imageName` | `string` | The name of the image file represented by the `Image`. | | `spec` > `size` | `string` or `integer` | The size of the image file in formatted bytes. | ### Examples **Existing remote image** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: RemoteImage metadata: creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 labels: kubernetes.io/arch: amd64 name: 90gbventurassh.img namespace: orka-default resourceVersion: "3095" uid: 29d907bc-e284-487b-8352-8466f89c8568 spec: imageName: 90GBVenturaSSH.img size: 90G ``` ## remoteisos.orka.macstadium.com ### Definitions | Field | Type | Description | | ------------------ | --------------------- | -------------------------------------------------- | | `spec` > `isoName` | `string` | The name of the ISO file represented by the `Iso`. | | `spec` > `size` | `string` or `integer` | The size of the ISO file in formatted bytes. | ### Examples **Existing remote iso** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: RemoteIso metadata: creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 name: ventura.iso namespace: orka-default resourceVersion: "3092" uid: 25de0e37-e99d-4dde-9931-c5d6a872166e spec: isoName: Ventura.iso size: 16G ``` ## orkanodes.orka.macstadium.com ### Definitions | Field | Type | Description | | ------------------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `spec` > `namespace` | `string` | The name of a specific namespace to which a node is assigned. Only users with appropriate access to that namespace will have the ability to deploy `VirtualMachineInstances` on that `OrkaNode`. | | `spec` > `tags` | `array` of `string` items | One or more tags setting node affinity. Node affinity indicates that the tagged `OrkaNode` is preferred for the deployment of `VirtualMachineInstances` with the same tag. | | `status` > `allocatableCpu` | `integer` | The complete amount of CPU cores on the node when no `VirtualMachineInstances` are deployed. | | `status` > `allocatableGpu` | `integer` | The complete amount of GPU cores on the node when no `VirtualMachineInstances` are deployed. | | `status` > `allocatableMemory` | `string` | The complete amount of memory (in GiB) on the node when no `VirtualMachineInstances` are deployed. | | `status` > `availableCpu` | `integer` | The amount of available CPU on the node. | | `status` > `availableGpu` | `integer` | The amount of available GPU on the node. | | `status` > `availableMemory` | `string` | The amount of available Memory on the node. | | `status` > `nodeIP` | `string` | The IP of the `OrkaNode`. | | `status` > `nodeType` | `string` | The type of the `OrkaNode`. Usually, `WORKER`. | | `status` > `phase` | `string` | The status of the OrkaNode. One of `READY`, `NOT READY`. | ### Examples **Existing node** ```yaml theme={null} apiVersion: orka.macstadium.com/v1 kind: OrkaNode metadata: creationTimestamp: "2023-10-16T09:55:25Z" generation: 1 labels: kubernetes.io/arch: amd64 name: mini-25 namespace: orka-default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true controller: true kind: Node name: mini-25 uid: 5bde48ba-a951-46c6-814e-6147cca52dca resourceVersion: "3052" uid: dade0833-c06e-45ac-86ec-67abba759d96 spec: namespace: orka-default tags: [] status: allocatableCpu: 12 allocatableGpu: 0 allocatableMemory: 62.56G availableCpu: 12 availableGpu: 0 availableMemory: 62.56G nodeIP: 10.221.188.35 nodeType: WORKER phase: READY ``` # Kubernetes-native Orka resource management Source: https://docs.macstadium.com/orka/kubernetes-native/k8s-native-overview Manage Orka resources with kubectl. Covers authenticating via orka3 CLI, applying VM configs as YAML, and creating namespaces for custom pod workloads. Everything you need to tap into the underlying Kubernetes layer of Orka. Starting with Orka 3.0, all Orka resources are Kubernetes-native. They are [custom resources](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) with detailed custom resource definitions. This lets you work with Orka resources straight from `kubectl`, if that's your preferred tool. You can also run custom pods in namespaces, created with the enable custom pods setting. The recommended way to work with Orka resources is via the Orka3 CLI, Orka3 API, or the Orka Web UI. You can still use `kubectl` instead, but exercise caution and consider managing only VMs and VM configs via YAML. Working with images, ISOs, or nodes directly requires both advanced Orka3 CRD and Kubernetes knowledge, and might result in unexpected issues. ## Workflow 1. Install `kubectl` locally or upgrade your existing installation. For example: ```bash theme={null} brew install kubectl # OR brew upgrade kubectl ``` 2. Authenticate with your Orka cluster: **Orka3 CLI** ```bash theme={null} orka3 login # OR orka3 user set-token ``` 3. Manage Orka resources with `kubectl`: ```bash theme={null} kubectl apply -f --namespace= # OR kubectl get --namespace= # OR kubectl edit --namespace= # OR kubectl delete --namespace= ``` 4. Create and configure a namespace for running custom pods. First, you need to create a namespace with enabled custom pods. Next, you must grant access to the namespace to the users who need to deploy to it. And finally, you need to assign computational resources to the namespace. Note that you will not be able to deploy Orka resources to this namespace. **Orka3 CLI** ```bash theme={null} orka3 namespace create --enable-custom-pods orka3 rb add-subject --user --namespace orka3 node namespace ``` 5. Manage your custom pods with `kubectl`. ```bash theme={null} kubectl apply -f --namespace= # OR kubectl get --namespace= # OR kubectl edit --namespace= # OR kubectl delete --namespace= ``` For any custom pods you need to run, add the following toleration to the pod: **YAML** ```json theme={null} {"key": "orka.macstadium.com/namespace-reserved", "value": ""} ``` ## Limitations * Your access to Orka resources depends on the role of the user you authenticated with. For more information, see [here](/orka/orka-cluster-access/cluster-access-management-overview). * You can run custom pods only in a namespace created with the enable custom pods setting. * You cannot run custom pods in the `orka-default` namespace. * For any custom pods you want to run, you must add the following toleration: **YAML** ```json theme={null} {"key": "orka.macstadium.com/namespace-reserved", "value": ""} ``` # Kubernetes persistent volumes in Orka namespaces Source: https://docs.macstadium.com/orka/kubernetes-native/k8s-native-persistent-volumes Use Kubernetes persistent volumes in Orka custom pod namespaces. Request a PV from MacStadium, set up kubectl access, create PVCs, and deploy pods. How to tap into Kubernetes persistent volumes for your Orka environment. For security reasons, Orka does not let you configure [persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/) yourself. The MacStadium team needs to do that for you. However, when a persistent volume is configured for your environment, you can create persistent volume claims and deploy pods that consume the respective persistent volume. **Quick command summary** ```bash theme={null} brew install kubectl orka3 login OR orka3 user set-token orka3 ns create --enable-custom-pods orka3 node namespace orka3 rb add-subject --namespace --user kubectl apply -f *.yaml --namespace= kubectl get [pods / pvc] kubectl describe kubectl delete ``` ## Limitations Persistent volumes are not applicable to standard Orka VMs. They can be consumed only by pods deployed with `kubectl`, and are called by functions such as `attach-disk`. If you want to persist the storage of a standard Orka VM, use the VM commit, save, or push operations. ## Step 1: Request a Persistent Volume Contact the MacStadium team and request a persistent volume (PV) for your Orka environment. Work closely with the team to help them create a PV that matches your requirements. Note that at this step, you need to decide on the name of the namespace where the PV will be created. ## Step 2: Get Kubernetes-Ready You need to install `kubectl` and configure a namespace with permissions to run custom pods. 1. If not already installed, install `kubectl` locally. For example: ```bash theme={null} brew install kubectl ``` 2. Authenticate with the Orka cluster. ```bash theme={null} orka3 login OR orka user set-token ``` 3. Set up the namespace for the PV. The name must match the name confirmed with the MacStadium team when requesting the PV. The namespace must have custom pods enabled. Next, you need to move computational resources to the namespace and you need to grant namespace access to the users or service accounts which will be working with the namespace. ```bash theme={null} orka3 namespace create --enable-custom-pods orka3 node namespace orka3 rb add-subject --namespace --user ``` ## Step 3: Create the Persistent Volume Claim A persistent volume claim (PVC) lets you tap into your persistent volume and consume it. You need to create a basic yaml manifest for the PVC and apply it to the environment. 1. Create the PVC manifest. For more information, see [Kubernetes Documentation: PersistentVolumeClaims](https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims). For example: **pvc.yaml** ```yaml theme={null} # pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: mypvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi ``` The values for `metadata.name` and `metadata.namespace` must match the values for `claimRef.name` and `claimRef.namespace` declared in the manifest of the persistent volume. Double-check with the MacStadium team for these values. 2. Apply the PVC. Replace `pvc.yaml` with the complete file path to your own PVC manifest. Replace `` with the namespace you created earlier. ```bash theme={null} kubectl apply -f pvc.yaml --namespace= ``` 3. Verify that the persistent volume claim is bound to the persistent volume. ```bash theme={null} kubectl get pvc ``` If the persistent volume claim works as expected, you will see a similar output: kubectl get pvc output showing PVC bound to persistent volume **Status Pending?** If the status is `Pending` instead of `Bound`, double-check your PVC manifest, fix any naming issues, remove the old PVC with `kubectl delete pvc `, and re-apply the fixed manifest. If the problem persists, contact the MacStadium team. ## Step 4: Deploy a Pod That Uses the Persistent Volume Now that you have created a PVC and bound it to the PV, you can deploy a pod that uses the PV. Create a pod manifest and apply it. 1. Create the pod manifest. The pod needs to reference both the PV and the PVC. For example: **mypod.yaml** ```yaml theme={null} apiVersion: v1 kind: Pod metadata: name: mypod spec: volumes: - name: my-pv persistentVolumeClaim: claimName: mypvc containers: - name: mypod image: ubuntu command: ["/bin/bash", "-ec", "while :; do echo '.'; sleep 5 ; done"] volumeMounts: - mountPath: "/usr/share/mypod" name: my-pv restartPolicy: Never tolerations: - key: orka.macstadium.com/namespace-reserved value: ``` This example deploys a Linux VM. Pay attention to the command line and the tolerations section. Without the command line, the state of your Linux VM will become Stopped. Without the tolerations section, you won't be able to create the pod. 2. Apply the pod. Replace `mypod.yaml` with the complete file path to your pod manifest. ```bash theme={null} kubectl apply -f mypod.yaml --namespace= ``` 3. Verify that the pod is deployed and running. ```bash theme={null} kubectl get pods ``` If the pod works as expected, you will see a similar output: kubectl get pods output showing pod running 4. Verify that the pod uses the claim and the persistent volume. Look for the data listed for Volumes. ```bash theme={null} kubectl describe pod ``` ## (Optional) Step 5: Deploy a Service to Handle the Networking Between Your Pods and Your Orka VMs If you want to have connectivity between your Orka VMs and any pods deployed with `kubectl`, you need to deploy a networking service. For more information, see [Kubernetes Documentation: Service](https://kubernetes.io/docs/concepts/services-networking/service/). Make sure to use the networking information provided in [My Cloud](/macstadium/macstadium-overview/ip-plan) when assigning IPs. ## What's Next: Delete the PVC and Release the PV When you no longer need to use a PVC and the respective PV, you can delete the PVC to release the PV. 1. Delete the PVC. ```bash theme={null} kubectl delete pvc ``` 2. Contact the MacStadium team. * If you want to reclaim the storage, an administrator might need to clean it up and verify that it's available for use again. This would depend on the provisioning type and the reclaim policy for the PV. * If you no longer need the storage, an administrator can remove the PV. # 1. AWS Side of the VPN Tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel Configure the AWS side of an IPsec site-to-site VPN: create a customer gateway, virtual private gateway, and VPN connection in Amazon VPC. How to configure the AWS side of your VPN tunnel between AWS and Orka. **Before you begin:** You need your firewall's public IP (the `FW1-Outside` address), shown at the top of the firewall's section in [My Cloud](/macstadium/macstadium-overview/ip-plan), and the CIDR range for the `Private-1` network (most likely `10.221.188.0/24`), shown in the **Subnet ID** column of the firewall's **IP Allocation** table. To establish a stable, persistent connection between an Amazon Virtual Private Cloud (Amazon VPC) and your Orka cluster, you need to configure an IPsec site-to-site VPN (VPN tunnel) between the two. Routing from Amazon to Orka is static. ## Step 1: Log in to your VPC service 1. Log in to your AWS Management Console and access your VPC service. In the top right corner of the screen, make sure that you're working in the correct region. 2. In the **Find Services** bar, type `VPC` and navigate to the service. AWS Management Console Find Services bar with VPC typed ## Step 2: Create a customer gateway In Amazon, the [customer gateway](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html#VPN) represents the Orka end of the tunnel. 1. In the VPC service sidebar, locate the **Virtual Private Network** menu and select **Customer Gateways**. AWS VPC sidebar with Customer Gateways selected 2. Click **Create Customer Gateway**. Create Customer Gateway button in AWS VPC console 3. Fill in the form. 1. Provide a **Name**. Set a name that helps you identify the gateway easily. 2. Select **Static** routing. 3. In the **IP Address** text box, provide your firewall's public IP (the `FW1-Outside` address) from My Cloud. 4. Ignore the remaining settings. Create Customer Gateway form with name, routing, and IP address fields 4. Click **Create Customer Gateway**. AWS console confirmation of customer gateway created successfully ## Step 3: Set up a virtual private gateway In Amazon, the [virtual private gateway](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html#VPN) represents the Amazon end of the tunnel. 1. In the VPC service sidebar, locate the **Virtual Private Network** menu and select **Virtual Private Gateways**. AWS VPC sidebar with Virtual Private Gateways selected 2. Click **Create Virtual Private Gateway**. Create Virtual Private Gateway button in AWS VPC console 3. Fill in the form. 1. Provide a **Name tag**. Set a name that helps you identify the gateway easily. 2. Select **Amazon default ASN** 3. Click **Create Virtual Private Gateway**. Create Virtual Private Gateway form with name tag and ASN fields 4. On the **Virtual Private Gateways** dashboard, right-click the newly created virtual private gateway and select **Attach to VPC**. Virtual Private Gateways dashboard with Attach to VPC option in context menu 5. Select your VPC from the drop-down menu and click **Yes, Attach**. Attach to VPC dialog with VPC dropdown and Yes Attach button Next, you need to manually enable [route propagation](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPNRoutingTypes.html) for the virtual private gateway. 1. In the VPC service sidebar, locate the **Virtual Private Cloud** menu and select **Route Tables**. AWS VPC sidebar with Route Tables selected 2. In the list of routing tables, select the main route table for your VPC. 3. At the bottom of the screen, select **Route Propagation**. If your virtual private gateway is not listed, make sure that it's attached to the VPC. 4. Click **Edit route propagation**. Route Propagation tab showing Edit route propagation button 5. Select the **Propagate** checkbox and click **Save**. ## Step 4: Create the tunnel After you have a customer gateway and a virtual private gateway in place, you can configure the tunnel. 1. In the VPC service sidebar, locate the **Virtual Private Network** menu and select **Site-to-Site VPN Connections**. AWS VPC sidebar with Site-to-Site VPN Connections selected 2. Click **Create VPN Connection**. Create VPN Connection button in AWS VPC console 3. Fill in the form. 1. Provide **Name tag**. 2. For **Target Gateway Type**, select **Virtual Private Gateway**, and from the **Virtual Private Gateway** drop-down menu, select the virtual private gateway you created earlier. 3. Select that you want to use an **Existing** customer gateway, and from the **Customer Gateway ID** drop-down menu, select the customer gateway that you created earlier. 4. For **Routing Options**, select **Static**. 5. In **Static IP Prefixes**, provide the [CIDR notation](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation) for your `Private-1` network. Most likely: `10.221.188.0/24`. 6. Ignore the remaining options (not shown on the screenshot). Create VPN Connection form with gateway, routing, and CIDR prefix fields 4. Click **Create VPN Connection**. 283f047-create-vpn-success.png ## Step 5: Ensure that AWS allows inbound traffic Based on your requirements and current setup, you might need to enable inbound traffic from Orka to AWS. See [Amazon VPC Documentation: Security Groups for Your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) and [Amazon VPC Documentation: Network ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html). # 1. GCP Side of the VPN Tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/1-gcp-side-of-the-vpn-tunnel Configure the GCP side of an IPsec site-to-site VPN to your Orka cluster: create a Classic VPN gateway and tunnel using policy-based routing with IKEv2. How to configure the GCP side of your VPN tunnel between GCP and Orka. **Before you begin:** You need your firewall's public IP (the `FW1-Outside` address), shown at the top of the firewall's section in [My Cloud](/macstadium/macstadium-overview/ip-plan), and the CIDR range for the `Private-1` network (most likely `10.221.188.0/24` or `10.10.10.0/24`), shown in the **Subnet ID** column of the firewall's **IP Allocation** table. To establish a stable, persistent connection between a Google Cloud Platform (GCP) private cloud and your Orka environment, you need to configure a policy-based IPsec site-to-site VPN between the two clouds. Currently, you can create only a classic VPN connection with policy-based routing from GCP to Orka. It consists of one tunnel and one interface and does not provide high availability. For more information about this option, see [Google Cloud Documentation: Classic VPN](https://cloud.google.com/vpn/docs/how-to/choosing-a-vpn#classic-vpn). ## Step 1: Log in to GCP 1. Log in to the GCP console with your credentials. 2. In the toolbar at the top, make sure that you're working with the correct project. GCP project selector in the toolbar ## Step 2: Create the VPN connection * From the GCP console sidebar, scroll to the *Networking* section and select **Hybrid Connectivity** > **VPN**. GCP console Hybrid Connectivity VPN navigation Classic VPN connections in GCP consist of a gateway and tunnel. You can create a gateway and a tunnel at once or you can add a new tunnel to an existing gateway. ## Step 3a: Create gateway and tunnel If you don't have a classic VPN gateway that you want to use, complete the following steps. 1. If you don't have any VPNs created yet, click **Create VPN connection**. 2. If you have one or more VPNs created, click **+ VPN SETUP WIZARD**. 3. Select **Classic VPN** and click **Continue**.\ The **High-availability (HA) VPN** is currently not supported as an option. For more information about the available options, see [Google Cloud Documentation: Choosing a VPN option](https://cloud.google.com/vpn/docs/how-to/choosing-a-vpn). 4. In the *Google Compute Engine VPN gateway* section, provide **Name** and **Description**. 5. For **Network**, select the GCP network that needs to be able to access Orka. 6. Select **Region**.\ For more information about this setting, see [Google Cloud Documentation: Regions and Zones](https://cloud.google.com/compute/docs/regions-zones). 7. Select or create a reserved IP address for the connection.\ You will need this IP address when you configure the Orka side of the tunnel. 8. In the **Tunnels** section, provide **Name** and **Description**. 9. For **Remote peer IP address**, provide your firewall's public IP (the `FW1-Outside` address) from My Cloud. 10. For **IKE version**, verify that **IKEv2** is selected. 11. Provide or generate an **IKE pre-shared key**. Keep a record of the pre-shared key. You will need it later. 12. For **Routing options**, select **Policy-based**. 13. For **Remote network IP ranges**, provide the IP range in [CIDR notation](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation) for the `Private-1` network. This is the **Subnet ID** value for `Private-1` in the **IP Allocation** table in My Cloud. 14. (Optional) Select one or more GCP subnetworks to reduce latency between your GCP private cloud and your Orka private cloud.\ For more information, see [Google Cloud Documentation: Networks and subnets](https://cloud.google.com/vpc/docs/vpc#vpc_networks_and_subnets). 15. (Optional) Provide one or more IP ranges within your GCP local network that needs to access Orka. 16. Click **Done**. 17. Click **Create**. After the creation is complete, the VPN tunnel status is: `First handshake`. #### **Example: Create gateway and tunnel** This image shows a sample configuration for the VPN gateway and tunnel. Sample GCP VPN gateway and tunnel configuration ## Step 3b: Add a new tunnel to an existing gateway If you have an existing classic VPN gateway that you want to use for the connection, complete the following steps. 1. Select **Cloud VPN Tunnels** and click **Create VPN tunnel**. Cloud VPN Tunnels tab with Create VPN tunnel button 2. Select the VPN gateway that you want to use and click **Continue**. Make sure that you have selected a classic VPN gateway. High-availability gateways are not supported. 3. Provide **Name**. 4. (Optional) Provide **Description**. 5. For **Remote peer IP address**, provide your firewall's public IP (the `FW1-Outside` address) from My Cloud. 6. For **IKE version**, verify that **IKEv2** is selected. 7. Provide or generate an **IKE pre-shared key**. Keep a record of the pre-shared key. You will need it later. 8. For **Routing options**, select **Policy-based**. 9. For **Remote network IP ranges**, provide the IP range in [CIDR notation](https://www.digitalocean.com/community/tutorials/understanding-ip-addresses-subnets-and-cidr-notation-for-networking#cidr-notation) for the `Private-1` network. This is the **Subnet ID** value for `Private-1` in the **IP Allocation** table in My Cloud. 10. (Optional) Select one or more GCP subnetworks to reduce latency between your GCP private cloud and your Orka environment.\ For more information, see [Google Cloud Documentation: Networks and subnets](https://cloud.google.com/vpc/docs/vpc#vpc_networks_and_subnets). 11. (Optional) Provide one or more IP ranges within your GCP local network that needs to access Orka. 12. Click **Create**. After the creation is complete, the VPN tunnel status is: `First handshake`. #### **Example: Create the VPN gateway and tunnel** This image shows a sample configuration for the VPN connection. Sample GCP VPN tunnel configuration for adding to an existing gateway ## Step 4: Ensure that the GCP firewall allows ingress traffic Based on your requirements, you might need to enable ingress traffic from Orka to GCP in the GCP firewall. For more information, see [Google Cloud Documentation: Configuring firewall rules > Example configurations](https://cloud.google.com/vpn/docs/how-to/configuring-firewall-rules#example_configurations). # 2. AWS VPN Tunnel Configuration File Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file Download the AWS VPN config file and fill in Orka network values for your Cisco ASAv: outside interface, Private-1 subnet, NAT rules, and VPC details. Download the VPN configuration file from Amazon and fill it in with your Orka network configuration. **You need:** * The name of your firewall's outside interface. By default, this is `Outside`. * The IP address for the `Private-1` network, from the `Private-1` row of the **IP Allocation** table in [My Cloud](/macstadium/macstadium-overview/ip-plan). * The subnet mask for the `Private-1` network, from the same **IP Allocation** row. * The IPv4 address of your Amazon VPC. * The subnet mask for your Amazon VPC converted from its CIDR notation (i.e. `255.255.0.0` instead of `/16`). After you [have created your VPN tunnel in Amazon](/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel), you need to configure your Cisco firewall to recognize the connection and let traffic into your Orka cluster. Amazon provides a semi-prefilled configuration file with very detailed instructions. First, you need to download the configuration file and provide the missing information indicated by placeholders. Next, you'll need to [feed the configuration](/orka/networking-with-orka-at-macstadium/3-aws-orka-side-of-the-vpn-tunnel) into your Cisco ASAv to complete the setup. ## Step 1: Download the file from Amazon 1. Verify that you are logged in to your AWS Management Console and you're working in the correct region. 2. [Verify that you have created a tunnel in Amazon.](/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel) 3. Navigate to your VPC service. In the VPC service sidebar, locate the **Virtual Private Network** menu and select **Site-to-Site VPN Connections**. AWS VPC sidebar with Site-to-Site VPN Connections selected 4. In the list, select your newly created VPN connection and click **Download Configuration**. AWS VPN connection selected with Download Configuration button visible 5. Fill in the form and click **Download**. 1. For **Vendor**, select **Cisco Systems, Inc.**. 2. For **Platform**, select **ASA 5500 Series**. 3. For **Software**, select **ASA 9.x** for a policy-based VPN OR **ASA 9.7 + VTI** for a route-based VPN. Download Configuration dialog with Cisco ASA 5500 vendor and platform selected ## Step 2: Fill in the configuration file Unless you have extensive experience with AWS and ASAv configurations, follow the instructions in the configuration file to the letter. Otherwise, your site-to-site VPN might not work as expected. 1. Open the configuration file in a text editor. 2. Replace all placeholders with their respective values. | Placeholder | Value | Description | More information | | ----------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `` | `Outside` | The **name** of the outside interface of your Cisco ASAv device (the `Outside` network). | My Cloud | | `` | (Sample) `outside_access_in` | Any unique name. This will be the name for the access control list that permits the creation of the tunnel and the traffic over it. | [Cisco Documentation: Cisco Access Control Lists](https://www.cisco.com/c/en/us/support/docs/security/ios-firewall/23602-confaccesslists.html) | | `` | (Sample) `192.168.0.0` | The IPv4 address of your Amazon VPC (without the subnet mask bit notation). | You can get this value by selecting your VPC in AWS > VPC dashboard and checking the **Details** at the bottom of the screen. | | `` | (Sample) `255.255.0.0` | The subnet mask for your Amazon VPC, converted from its CIDR notation. | You can get this value by selecting your VPC in AWS > VPC dashboard and checking the **Description** at the bottom of the screen. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the `/16` notation converts to a `255.255.0.0` subnet mask). | | `` | (Sample) `amzn_vpn_map` | Any unique name for the crypto map. It must not be already in use by any other crypto maps you might have configured. | [Cisco Documentation: Configuring Crypto Maps](https://www.cisco.com/c/en/us/td/docs/security/vpn_modules/6342/vpn_cg/6342site3.html#wp1036915) | | `` | (Sample) `192.168.0.1` | An IP address in your Amazon VPC that can serve as an SLA monitor keeping the site-to-site tunnel alive. | You can set this to the `` address plus one. | | `` | `10.221.188.0` | The IP address for the `Private-1` network. | The `Private-1` row of the **IP Allocation** table in My Cloud | | `` | `255.255.255.0` | The subnet mask for the `Private-1` network. | The `Private-1` row of the **IP Allocation** table in My Cloud | 3. Uncomment the following lines. To uncomment, remove `! `at the start of the line. * `access-list amzn-filter extended permit ip ...` * `object`- and `nat`-related configuration at the end of the config file. 4. Keep the following line. This ensures the SLA monitor works as expected. ``` object network obj-SrcNet subnet 0.0.0.0 0.0.0.0 ``` Note that based on your network configuration and requirements, you can modify this line to map to the subnet and the subnet mask for the `Private-1` network from the **IP Allocation** table in My Cloud. If you choose to modify this line, **do not** configure the `` value. 5. Change `nat (inside,outside)` to `nat (Private-1,Outside)`. 6. (Optional) Delete the remaining commented lines to clean up the file. Commented lines are indicated by `! `at the beginning of the line. 7. Save your changes. # 2. GCP VPN Tunnel Configuration File Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file Complete the Cisco ASA/ASAv config template for your GCP-to-Orka VPN tunnel. Fill in GCP network, VPN IP, Orka Private-1 network, and IKEv2 pre-shared key. **Before you begin:** From [My Cloud](/macstadium/macstadium-overview/ip-plan), you need the `Private-1` IP address and subnet mask, shown in the `Private-1` row of the firewall's **IP Allocation** table. You also need the `Outside` interface name (by default, `Outside`). From GCP, you need your local network's IPv4 address and subnet mask (converted from CIDR notation, e.g. `255.255.0.0` instead of `/16`). After you [have created your site-to-site VPN connection in Google Cloud Platform (GCP)](/orka/networking-with-orka-at-macstadium/1-gcp-side-of-the-vpn-tunnel), you need to configure your Cisco firewall to recognize the connection and let traffic into your Orka environment. You can use the configuration template provided below and fill in the missing information. You need to provide data from both GCP and Orka. ## Configuration template Unless you have extensive experience with GCP and ASA/ASAv configurations, use the configuration from the template. Otherwise, your site-to-site VPN might not work as expected. ``` ! #1: Placeholders ! ! { gcp_network_address } - The address of the GCP local network that needs to have access to Orka. ! { gcp_network_mask } - The subnet mask of the GCP local network that needs to have access to Orka. ! { gcp_vpn_ip } - The public IP address of the cloud VPN gateway in GCP. ! { macstadium_network_name } - The name of the private network in Orka that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_network_address } - The IP address of the private network in Orka that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_network_mask } - The subnet mask of the private network in Orka that needs to be accessed by GCP. By default, this is Private-1. ! { macstadium_public_ip } - The IP address of the public network of your Orka private cloud. By default, this is FW1-Outside. ! { macstadium_outside_interface } - The name of the outside interface of your Cisco ASA/ASAv device. By default, this is Outside. ! { shared_key } - The IPSec pre-shared key used when creating the VPN connection in GCP. ! ! #2: NAT exemption ! ! The name "GCP-NET" must be unique for the Cisco ASA/ASAv device. ! object-group network GCP-NET description GCP Virtual Network network-object { gcp_network_address } { gcp_network_mask } ! The name "ONPREM-NET" must be unique for the Cisco ASA/ASAv device. object-group network ONPREM-NET description OnPrem Network network-object { macstadium_network_address } { macstadium_network_mask } ! The names "gcp-in", "gcp-acl", and "gcp-filter" must be unique for the Cisco ASA/ASAv device. access-list gcp-in extended permit ip host { gcp_vpn_ip } host { macstadium_public_ip } access-list gcp-acl extended permit ip any4 object-group GCP-NET access-list gcp-filter extended permit ip object-group GCP-NET object-group ONPREM-NET nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static GCP-NET GCP-NET ! #3: IKE & IPSec configuration ! ! The name "gcp" must be unique for the Cisco ASA/ASAv device. crypto ipsec ikev2 ipsec-proposal gcp protocol esp encryption aes-256 protocol esp integrity sha-1 ! The name "gcp-vpn-map" must be unique for the Cisco ASA/ASAv device. crypto map gcp-vpn-map 1 match address gcp-acl crypto map gcp-vpn-map 1 set pfs group14 crypto map gcp-vpn-map 1 set peer { gcp_vpn_ip } crypto map gcp-vpn-map 1 set ikev2 ipsec-proposal gcp crypto map gcp-vpn-map interface { macstadium_outside_interface } crypto ikev2 policy 100 encryption aes-256 integrity sha512 group 14 prf sha lifetime seconds 36000 exit crypto ikev2 enable { macstadium_outside_interface } crypto ipsec security-association lifetime seconds 10800 crypto ipsec security-association replay window-size 128 crypto ipsec security-association pmtu-aging infinite crypto isakmp identity address crypto isakmp disconnect-notify no crypto isakmp nat-traversal crypto ipsec df-bit clear-df Outside group-policy gcp internal group-policy gcp attributes vpn-filter value gcp-filter vpn-tunnel-protocol ikev2 tunnel-group { gcp_vpn_ip } type ipsec-l2l tunnel-group { gcp_vpn_ip } general-attributes default-group-policy gcp tunnel-group { gcp_vpn_ip } ipsec-attributes isakmp keepalive threshold 10 retry 3 ikev2 remote-authentication pre-shared-key { shared_key } ikev2 local-authentication pre-shared-key { shared_key } ``` ## Step 1: Get the configuration values `{ gcp_network_address }` This is the IP address of the GCP local network that needs to have access to Orka. 1. Verify that you're logged into the GCP console and you are working in the correct project. GCP console project selector in toolbar 2. From the GCP console sidebar, scroll to the *Networking* section and select **Hybrid Connectivity** > **VPN**. GCP Hybrid Connectivity VPN menu in sidebar 3. Select **Cloud VPN Gateways**. 4. Locate the gateway used by your GCP-Orka tunnel and note the value for **Region**. GCP Cloud VPN Gateways list showing gateway region and VPC network 5. Click the value listed under **VPC network**.\ The GCP console redirects you to the list of subnets for the selected network. 6. In the list of subnets, locate the one matching the region you noted in **Step 4**. 7. From the respective **IP address ranges** field, use the IP address without the bit notation at the end (e.g. `/16`). `{ gcp_network_mask }` This is the subnet mask of the GCP local network that needs to have access to Orka. 1. Verify that you're logged into the GCP console and you are working in the correct project. GCP console project selector in toolbar 2. From the GCP console sidebar, scroll to the *Networking* section and select **Hybrid Connectivity** > **VPN**. GCP Hybrid Connectivity VPN menu in sidebar 3. Select **Cloud VPN Gateways**. 4. Locate the gateway used by your GCP-Orka tunnel and note the value for **Region**. GCP Cloud VPN Gateways list showing gateway region and VPC network 5. Click the value listed under **VPC network**.\ The GCP console redirects you to the list of subnets for the selected network. 6. In the list of subnets, locate the one matching the region you noted in **Step 4**. 7. From the respective **IP address ranges** field, use the bit notation at the end (e.g. `/16`) and convert it to a subnet mask. You can use a CIDR calculator such as this [CIDR/Netmask Lookup Tool](https://www.ultratools.com/tools/netMask). `{ gcp_vpn_ip }` This is the public IP address of the cloud VPN gateway in GCP. 1. Verify that you're logged into the GCP console and you are working in the correct project. GCP console project selector in toolbar 2. From the GCP console sidebar, scroll to the *Networking* section and select **Hybrid Connectivity** > **VPN**. GCP Hybrid Connectivity VPN menu in sidebar 3. Select **Cloud VPN Gateways**. 4. Locate the gateway used by your GCP-Orka tunnel and use the value listed under **IP address**. GCP Cloud VPN Gateways list showing public IP address `{ macstadium_network_name }` This is `Private-1`. `{ macstadium_network_address }` This is the IP address of the `Private-1` network, from the `Private-1` row of the **IP Allocation** table in My Cloud. `{ macstadium_network_mask }` This is the subnet mask of the `Private-1` network, from the `Private-1` row of the **IP Allocation** table in My Cloud. `{ macstadium_public_ip }` This is your firewall's public IP (the `FW1-Outside` address), shown at the top of the firewall's section in My Cloud. `{ macstadium_outside_interface }` This is `Outside`. `{ shared_key }` This is the IPSec pre-shared key used when creating the VPN connection in GCP. * You must have this key saved separately. ## Step 2: Complete the template 1. Copy the template into a text editing tool. 2. Replace all placeholders with their respective values. 3. Delete the remaining commented lines to clean up the template. Commented lines are indicated by `! `at the beginning of the line. 4. Save your changes. # 3. Orka side of the AWS VPN tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/3-aws-orka-side-of-the-vpn-tunnel Apply the prepared AWS VPN config to your Orka Cisco ASAv via ASDM-IDM. Completes the Orka side of the AWS site-to-site IPsec tunnel. How to set up the Orka side of your AWS-Orka tunnel to enable two-way access between your AWS and Orka VMs. **Before you begin:** You need an active VPN connection to your Orka cluster, your Cisco ASAv connection information (the firewall's public IP and **Credentials**) from [My Cloud](/macstadium/macstadium-overview/ip-plan), and the downloaded and prepared [VPN configuration file](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file). After you [have created your VPN tunnel in Amazon](/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel) and you [have prepared the configuration file](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file), you need to apply the configuration to the Cisco ASAv in your Orka cluster. 1. [Run Cisco ASDM-IDM and log in.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Multiple Line**. 4. Type [configure terminal](https://www.cisco.com/c/m/en_us/techdoc/dc/reference/cli/n5k/commands/configure-terminal.html), press `Enter`, and paste the contents of the [prepared VPN configuration file](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file). 5. Click **Send**. # 3. Orka Side of the GCP VPN Tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/3-orka-side-of-the-gcp-vpn-tunnel Apply the GCP VPN config to your Orka cluster's Cisco ASA/ASAv via Cisco ASDM-IDM. Completes the Orka side of the GCP site-to-site IPsec tunnel. How to set up the Orka side of your GCP-Orka tunnel to enable two-way access between your GCP and Orka VMs. **Before you begin:** You need an active VPN connection to your Orka cluster, your Cisco ASAv connection information (the firewall's public IP and **Credentials**) from [My Cloud](/macstadium/macstadium-overview/ip-plan), and the downloaded and prepared [VPN configuration file](/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file). After you [have created your site-to-site VPN connection in Google Cloud Platform (GCP)](/orka/networking-with-orka-at-macstadium/1-gcp-side-of-the-vpn-tunnel) and you [have prepared the configuration](/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file) for use, you need to apply the required changes to the Cisco ASA/ASAv device in your Orka environment. 1. [Run Cisco ASDM-IDM and log in.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Multiple Line**. 4. Type [`configure terminal`](https://www.cisco.com/c/m/en_us/techdoc/dc/reference/cli/n5k/commands/configure-terminal.html), press `Enter`, and paste the contents of the [prepared VPN configuration file](/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file). 5. Click **Send**. # 4. Verifying the AWS VPN tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/4-aws-verifying-the-vpn-tunnel (Optional) How to verify that your AWS-Orka VPN tunnel works as expected: check security associations, tunnel status and traffic between Orka and AWS. (Optional) How to verify that your AWS-Orka VPN tunnel works as expected: check security associations, tunnel status and traffic between Orka and AWS. **You need:** * Active VPN connection to your Orka cluster. * Your Cisco ASAv connection information (the firewall's public IP and **Credentials**) from [My Cloud](/macstadium/macstadium-overview/ip-plan). This part of the workflow is optional. ## Verify that there is an ISAKMP security association between the peers 1. [Run Cisco ASDM-IDM and log in to your firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Single Line**, enter the [following command](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#isakmp_sa), and click **Send**. ``` show crypto isakmp sa ``` If the site-to-site VPN connection is configured properly, you should see information about an active IKEv1. For example: ``` Result of the command: "show crypto isakmp sa" IKEv1 SAs: Active SA: 1 Rekey SA: 0 (A tunnel will report 1 Active and 1 Rekey SA during rekey) Total IKE SA: 1 1 IKE Peer: ... Type : L2L Role : initiator Rekey : no State : MM_ACTIVE There are no IKEv2 SAs ``` ## Verify that there is an IPsec security association between peers 1. [Run Cisco ASDM-IDM and log in to your firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Single Line**, enter the [following command](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#ipsec_sa), and click **Send**. ``` show crypto ipsec sa ``` If the site-to-site VPN connection is configured properly, you should see a detailed log. For example: ``` Result of the command: "show crypto ipsec sa" interface: Outside Crypto map tag: amzn_vpn_map_1, seq num: 1, local addr: ... access-list acl-amzn extended permit ip any ... local ident (addr/mask/prot/port): ... remote ident (addr/mask/prot/port): ... current_peer: ... .... inbound esp sas: ... outbound esp sas: ... ``` ## Verify that the tunnel is up Currently, Amazon lets you create a site-to-site VPN where at all times one tunnel is active (up) and one is passive (down). A monitoring service checks frequently if the active tunnel is up and, if not, brings the passive tunnel up instead. This ensures minimal downtime. 1. Log in to your AWS Management Console and access your VPC service. In the top right corner of the screen, make sure that you're working in the correct region. 2. In the sidebar, locate the **Virtual Private Network** menu and select **Site-to-Site VPN Connections**. AWS VPC sidebar with Site-to-Site VPN Connections selected 4. Select your VPN from the list and inspect the details at the bottom of the screen. 5. Click **Tunnel Details** and verify that one of the tunnels is up. AWS VPN Tunnel Details showing one tunnel status as Up ## Test traffic and visibility through the tunnel [Amazon VPC Documentation: How to Test the Customer Gateway Configuration](https://docs.aws.amazon.com/vpc/latest/adminguide/Cisco_ASA.html#TestCustomerGateway_ASA) # 4. Verifying the GCP VPN Tunnel Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/4-verifying-the-gcp-vpn-tunnel (Optional) How to verify that your GCP-Orka VPN tunnel works as expected: check security associations, tunnel status and traffic between Orka and GCP. (Optional) How to verify that your GCP-Orka VPN tunnel works as expected: check security associations, tunnel status and traffic between Orka and GCP. **Before you begin:** You need an active VPN connection to your Orka cluster and your Cisco ASAv connection information (the firewall's public IP and **Credentials**) from [My Cloud](/macstadium/macstadium-overview/ip-plan). This part of the workflow is optional. ## Verify that there is an ISAKMP security association between the peers 1. [Run Cisco ASDM-IDM and log in to your firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Single Line**, enter the [following command](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#isakmp_sa), and click **Send**. ``` show crypto isakmp sa ``` If the site-to-site VPN connection is configured properly, you should see information about an active IKEv1. For example: ``` Result of the command: "show crypto isakmp sa" IKEv1 SAs: Active SA: 1 Rekey SA: 0 (A tunnel will report 1 Active and 1 Rekey SA during rekey) Total IKE SA: 1 1 IKE Peer: ... Type : L2L Role : initiator Rekey : no State : MM_ACTIVE There are no IKEv2 SAs ``` ## Verify that there is an IPsec security association between peers 1. [Run Cisco ASDM-IDM and log in to your firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 2. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 3. Select **Single Line**, enter the [following command](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html#ipsec_sa), and click **Send**. ``` show crypto ipsec sa ``` If the site-to-site VPN connection is configured properly, you should see a detailed log. For example: ``` Result of the command: "show crypto ipsec sa" interface: Outside Crypto map tag: amzn_vpn_map_1, seq num: 1, local addr: ... access-list acl-amzn extended permit ip any ... local ident (addr/mask/prot/port): ... remote ident (addr/mask/prot/port): ... current_peer: ... .... inbound esp sas: ... outbound esp sas: ... ``` ## Verify that the tunnel is connected 1. Log in to your GCP console. 2. From the GCP console sidebar, scroll to the *Networking* section and select **Hybrid Connectivity** > **VPN**. GCP console Hybrid Connectivity VPN navigation 3. On the **Cloud VPN Tunnels** tab, locate the tunnel to MacStadium and check the value for **VPN tunnel status**. When your tunnel is properly connected, the status is: `Established`. GCP Cloud VPN Tunnels tab showing tunnel status as Established ## Test traffic and visibility through the tunnel 1. Verify that you have created a virtual machine in MacStadium. 2. Verify that you have created a virtual machine instance in GCP and that you have enabled user login on it.\ For more information about user login on GCP instances, see [Google Cloud Documentation: Setting up and configuring OS Login](https://cloud.google.com/compute/docs/instances/managing-instance-access). 3. In the terminal on your MacStadium VM, run the following command: ``` ssh @ ``` Replace `` with the username for your GCP instance.\ Replace `` with the private IP of the GCP instance. 4. When prompted, provide your password or key for the specified username on the specified GCP instance.\ If the connection is successful, the prefix of the terminal becomes `@`. This indicates that you have connected from Orka to GCP over the tunnel. 5. Run the following command: ``` ssh @ ``` Replace `` with the username for your Orka VM.\ Replace `` with the private IP of the Orka VM. 6. When prompted, provide your password or key for the specified username on the specified MacStadium VM.\ If the connection is successful, the prefix of the terminal becomes `@`. This indicates that you have connected from GCP to MacStadium over the tunnel. # Connect AWS to your Orka cluster Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/aws-orka-connections Connect AWS to your Orka cluster: one-time access from EC2 via VPN client, or a persistent IPsec site-to-site tunnel between your Amazon VPC and Orka. Overview of how to connect AWS to your Orka cluster. Deep dive for detailed instructions on bringing up a tunnel between the two. ## One-Time Access If you need to establish one-time or temporary access to your Orka cluster from a single virtual machine hosted in Amazon Web Services (AWS), you can [connect via VPN](/orka/networking-with-orka-at-macstadium/vpn-connection) from the AWS machine to your Orka cluster. ## VPN Tunnel If you need to connect an entire Amazon Virtual Private Cloud (Amazon VPC) to your Orka cluster through a stable, persistent connection, you need to establish an IPsec site-to-site VPN between the two clouds (VPN tunnel): 1. [Create a Site-to-Site VPN for your Amazon VPC.](/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel) 2. [Download and adjust the AWS-specific configuration file for the VPN.](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file) 3. [Apply the configuration to your Cisco ASAv device using the Cisco ASDM-IDM.](/orka/networking-with-orka-at-macstadium/3-aws-orka-side-of-the-vpn-tunnel) ### You Can Also * [Verify the VPN tunnel.](/orka/networking-with-orka-at-macstadium/4-aws-verifying-the-vpn-tunnel) * [Perform VPN tunnel troubleshooting.](/orka/networking-with-orka-at-macstadium/aws-vpn-tunnel-troubleshooting) # AWS VPN Tunnel Troubleshooting Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/aws-vpn-tunnel-troubleshooting Fix AWS-to-Orka VPN tunnel issues: Cisco ASAv config errors, tunnel UP but no traffic, VPC route propagation problems, and NAT exemption mismatches. What to look for when you're experiencing issues with your AWS-Orka VPN tunnel and how to perform basic troubleshooting. ## Errors during the Cisco ASAv configuration * Sometimes, the command line interface might return errors about the `crypto isakmp policy` block of commands.\ **Workaround:** Ignore the errors. They do not affect the configuration. * The command line interface returns `ERROR: unable to find interface “outside”`.\ **Workaround:** Sometimes, the command line interface is case-sensitive and you need to preserve the capitalization of the network configuration as provided in [My Cloud](/macstadium/macstadium-overview/ip-plan). 1. Clean up the firewall configuration. 2. [Rename outside in your configuration file to Outside.](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file) 3. [Re-run the complete configuration in Cisco ASDM-IDM.](/orka/networking-with-orka-at-macstadium/3-aws-orka-side-of-the-vpn-tunnel) ## The tunnel is UP but there's no traffic between AWS and Orka If Amazon shows that one tunnel is UP but there's no traffic between AWS and your Orka cluster, it might be because of some common mistakes when preparing the configuration file. Check for the following: ### AWS checks All checks in this section are performed in the AWS Management Console. ### Verify that your virtual private gateway is attached to the VPC 1. Log in to your AWS Management Console and access your VPC service. In the top right corner of the screen, make sure that you're working in the correct region. 2. In the VPC service sidebar, locate the **Virtual Private Network** menu and select **Virtual Private Gateways**. AWS VPC sidebar with Virtual Private Gateways selected 3. On the **Virtual Private Gateways** dashboard, check the status of the virtual private gateway used in your tunnel. 4. If the virtual private gateway is detached, right-click it and select **Attach to VPC**. Right-click menu on virtual private gateway showing Attach to VPC option Verify that the [route tables](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) for the Amazon Virtual Private Cloud (Amazon VPC) propagate traffic for the virtual private gateway you're using. 1. Log in to your AWS Management Console and access your VPC service. In the top right corner of the screen, make sure that you're working in the correct region. 2. In the VPC service sidebar, locate the **Virtual Private Cloud** menu and select **Route Tables**. AWS VPC sidebar with Route Tables selected 3. In the list of routing tables, select the main table. 1. At the bottom of the screen, select **Route Propagation** and make sure that the propagation is enabled. If your virtual private gateway is not listed, make sure that it's attached to the VPC. 2. If propagation is disabled, click **Edit route propagation**. 3. Select the **Propagate** checkbox and click **Save**. AWS Route Propagation tab showing propagation enabled for virtual private gateway ### Cisco ASAv checks All checks in this section are performed against the [VPN configuration file](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file). Verify that you've replaced `` and `` with the correct values for the `Private-1` network, from the `Private-1` row of the **IP Allocation** table in My Cloud. Verify that you've configured the NAT exemption rule properly. * The host and subnet mask required for `obj-SrcNet` are the host and mask for the `Private-1` network, from the **IP Allocation** table in My Cloud. * The host and subnet mask required for `obj-amzn` are the host and mask for your Amazon VPC. You can find this information by logging into your AWS Management Console, navigating to your VPC dashboard, selecting your VPC, and checking the **Description** at the bottom of the screen. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the `/16` notation converts to a `255.255.0.0` subnet mask). * The values in the brackets after `nat` must be (`Private-1`,`Outside`). To resolve any of the listed common problems with the Cisco ASAv configuration, complete the following steps: 1. Clean up the firewall configuration. 2. Make the necessary changes to the [configuration file](/orka/networking-with-orka-at-macstadium/2-aws-vpn-tunnel-configuration-file). 3. [Re-run the complete configuration in Cisco ASDM-IDM.](/orka/networking-with-orka-at-macstadium/3-aws-orka-side-of-the-vpn-tunnel) ## There's traffic between AWS and Orka but you cannot access the Orka VM from AWS Sometimes, you might be able to establish an SSH connection from an Orka VM to a VM in AWS but you might not be able to see or access the Orka VM from AWS. This might be because SSH (Remote Login) is not enabled within the Orka VM.\ Verify that SSH is enabled for the Orka VM. ## There's traffic from AWS to Orka but you cannot access AWS from Orka Sometimes, you might be able to establish an SSH connection from AWS to an Orka VM but you might not be able to see or access AWS from an Orka VM. This might be due to AWS being configured to stop inbound traffic.\ For information about how to enable inbound traffic, see [Amazon VPC Documentation: Security Groups for Your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) and [Amazon VPC Documentation: Network ACLs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html). ## Troubleshooting ### Cleaning up the ASAv configuration Sometimes, you might need to clean up the Cisco ASAv configuration and start over. 1. [Verify that you are connected via VPN to your Orka cluster.](/orka/networking-with-orka-at-macstadium/vpn-connection) 2. [Run Cisco ASDM-IDM and log in to the firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 3. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select **Single Line**. 5. Run the following commands one by one, clicking **Send** in between. Replace the placeholders with their respective values. Use **Table 1: Placeholders** for reference. ``` clear configure tunnel-group clear configure tunnel-group clear configure group-policy clear configure crypto map clear configure access-list clear configure access-list amzn-filter clear configure access-list acl-amzn clear configure crypto ipsec transform-set transform-amzn clear configure sla monitor 1 no nat (Private-1,Outside) 1 source static obj-SrcNet obj-SrcNet destination static obj-amzn obj-amzn no object network obj-SrcNet no object network obj-amzn ``` **Table 1: Placeholders** | Placeholder | Value | Description | | --------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------- | | `` | (Sample) `192.168.0.0` | The IP of the tunnel, configured with the first set of `tunnel-group` commands in the Amazon configuration file. | | `` | (Sample) `192.168.0.2` | The IP of the tunnel, configured with the second set of `tunnel-group` commands in the Amazon configuration file. | | `` | By default: `filter` | The name of the policy configured with the `group-policy` commands in the Amazon configuration file. | | `` | By default: `amzn_vpn_map` | The name of the crypto map configured with the `crypto map` commands in the Amazon configuration file. | | `` | By default: `outside_access_in` | The unique name of the access control list created with the configuration file in the Amazon configuration file. | ## More troubleshooting by Amazon [Amazon VPC Documentation: Troubleshooting Cisco ASA Customer Gateway Connectivity](https://docs.aws.amazon.com/vpc/latest/adminguide/Cisco_ASA_Troubleshooting.html). ## More troubleshooting by Cisco [Cisco Documentation: IPsec Troubleshooting](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html). # Built-In Orka Domains Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/built-in-orka-domains Use your company.orka.app domain instead of raw Orka API IPs. Covers hosts file setup, HTTPS access, and certificate trust for the Orka API. MacStadium provides built-in TLS-enabled domains (Orka domains). Learn how to work with your own built-in Orka domain. You can use an Orka domain (such as company.orka.app) to access your Orka environment instead of the default Orka endpoints (10.221.188.100 or 10.221.188.20). Starting with Orka 1.5.4, Orka domains are available to all users by default. Built-in Orka domains provide improved security. They are TLS-enabled and require access via HTTPS. ## 1. Configure your connection To be able to reach your Orka domain, you need to add the cluster [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) IP and the Orka domain name to your hosts file. #### **What's your Ingress IP?** If you reach your Orka endpoint at *.*.*.20, the Ingress IP is *.*.*.22. For example: 10.221.188.22. If you reach your Orka endpoint at *.*.*.100, the Ingress IP is *.*.*.241. For example: 10.221.188.241. ### macOS and Linux 1. In the Terminal, run the following command: ``` sudo nano /etc/hosts ``` 2. When prompted, provide your password. 3. At the bottom of the file, on a new line, add the Ingress IP and the Orka domain, separated by a space. ``` For example: 10.221.188.22 company.orka.app ``` 4. Press Ctrl+0 and then press Enter to save your changes. 5. Press Ctrl+X to exit nano. 6. (Optional, macOS) If you cannot reach your Orka domain, try flushing the DNS cache. ``` dscacheutil -flushcache ``` ### Windows 1. Press the Windows key and type Notepad in the search text box. 2. Right-click the Notepad icon and select Run as administrator. 3. In Notepad, select File > Open. 4. In the File name text box, type C:\Windows\System32\drivers\etc\hosts. 5. At the bottom of the file, on a new line, add the Ingress IP and the Orka domain, separated by a space. ``` For example: 10.221.188.22 company.orka.app ``` 6. Save your changes and close the file. ## 2. Use the Orka domain in your day-to-day work You can use your Orka API endpoint ([http://10.221.188.20](http://10.221.188.20) or [http://10.221.188.100](http://10.221.188.100)) and your Orka domain ([https://company.orka.app](https://company.orka.app)) interchangeably in your workflows. 1. If you don't know what your Orka domain is, contact the MacStadium team. 2. Configure your Orka tools to target the Orka domain. Note that you need to use https with your Orka domain. * For the Orka API, change your API requests to target `https://`. * For the Orka3 CLI, run `orka3 config set --api-url https://`. * For the Orka Web UI, open `https://` in your browser. * For CI/CD integrations, switch to `https://` in the respective plugin configuration. ## 3. (Orka API-only) Download and trust the Orka domain certificate To be able to run API calls against your Orka domain, you need to download the certificate for the Orka domain locally and add it to your trusted certificates. To download the certificate, complete the following steps: 1. Open Firefox and navigate to `https://`. 2. Click the padlock icon in the address bar. In the pop-up, click Connection secure and then More information. 3. In the Page Info dialog, click View Certificate. 4. Scroll down and locate the PEM download section. Download the PEM (cert) file. ### macOS 1. Open Keychain Access. 2. Drag and drop the downloaded certificate to the login keychain. 3. Double-click the newly added certificate. 4. Expand the Trust section and for the When using this certificate setting, select Always Trust. 5. Close the certificate info window and when prompted, provide your password. ## Linux Run the following commands: ``` sudo mkdir /usr/local/share/ca-certificates/extra sudo cp mycertificate.pem /usr/local/share/ca-certificates/extra/mycertificate.crt sudo update-ca-certificates ``` ### Windows 1. Rename the downloaded certificate and change its extension to .crt. 2. Double-click the file and confirm that you want to open it. 3. On the General tab, click Install Certificate. 4. For Store Location, select Local Machine and click Next. 5. When prompted, confirm that you want Windows host process to make changes to your device. 6. Select Place all certificates in the following store, click Browse and from the list, select Trusted Root Certification Authorities and click OK. 7. Click Next, review the settings, and click Finish. # External Custom Domains Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/external-custom-domains Configure a custom domain for your Orka cluster using a TLS certificate. Covers certificate upload, domain mapping, Ingress configuration, and tool setup. Instead of working with the default Orka endpoints (10.221.188.20 or 10.221.188.100) or your built-in Orka domain (company.orka.app), you can access your cluster from an external custom domain (for example: company.com). Custom domains provide an additional level of security and compliance. To configure an external custom domain for your cluster, you need a TLS certificate. With a valid TLS certificate in place, you need to access your cluster via HTTPS. ## Overview To configure an external custom domain for your Orka cluster, you need to complete the following tasks. 1. Obtain a TLS certificate and a private key for the domain. 2. Upload the certificate to the cluster. 3. Map the custom domain and the Ingress of your cluster. 4. Trust the certificate on your local machine. 5. Configure your tools. ## Limitations * You can have only one custom TLS certificate uploaded to your cluster at a time. Subsequent uploads replace the current custom TLS certificate. ## 1. Obtain a certificate Before you begin, you must have your own certificate and private key file that meet the following requirements: * Both files are in PEM format. * The private key is not passphrase protected. * The certificate might be any of the following: * A single domain certificate (e.g. company.com). * Multi-domain certificate (e.g. app1.company.com, app2.company.com, and so on). * Wildcard TLS certificate (e.g. \*.company.com) * If containing an asterisk, it must be a single asterisk and must be in the leftmost position of the domain name. For example: You cannot use a *.*.company.com certificate to work with Orka. * A certificate chain (bundle) that contains your server, intermediates, and root certificates concatenated (in the proper order) into one file. * The certificate must be a registered domain certificate issued by a certificate authority OR a self-signed certificate for any domain (for local use only). ## 2. Upload the certificate Next, you need to upload the custom TLS certificate and private key to your cluster. 1. Connect to your cluster via [VPN](/orka/networking-with-orka-at-macstadium/vpn-connection). 2. Make sure you are authenticated with your cluster as an administrator. Run `orka3 login` if you haven't already. 3. Send the following POST request to /api/v1/upload/cert. ``` curl -X POST '/api/v1/upload/cert' \ --header 'Content-Type: multipart/form-data' \ --header 'Authorization: Bearer ' \ --form 'certPath=@' \ --form 'keyPath=@' ``` Replace `` with your Orka API URL (for example, `http://10.221.188.20`). Replace `` with your Orka API token. Replace `` and `` with the full paths to the certificate and the private key on your local machine. ## 3. Map the domain to your cluster Ingress Next, map your external custom domain and your cluster. You need to map the domain and the IP of the cluster [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/). #### **What's your Ingress IP?** If you reach your Orka endpoint at *.*.*.20, the Ingress IP is *.*.*.22. For example: 10.221.188.22. If you reach your Orka endpoint at *.*.*.100, the Ingress IP is *.*.*.241. For example: 10.221.188.241. ### 3.1 Create a global mapping If you are working with a registered domain and a TLS certificate obtained from a certificate authority, you can configure a global mapping. You need to add A/AAAA record in the DNS settings of the domain. This A/AAAA record must map the external custom domain name to the Orka Ingress IP. ### 3.2 Create a local mapping If you want to work with an external custom domain locally and you are using a self-signed TLS certificate, you can map the domain to the Ingress IP in your hosts file. **macOS and Linux** 1. In the Terminal, run the following command: ``` sudo nano /etc/hosts ``` 2. When prompted, provide your password. 3. At the bottom of the file, on a new line, add the Ingress IP and the custom Orka domain, separated by a space. ``` For example: 10.221.188.22 company.com ``` 4. Press Ctrl+0 and then press Enter to save your changes. 5. Press Ctrl+X to exit nano. 6. (Optional, macOS) If you cannot reach your custom Orka domain, try flushing the DNS cache. ``` dscacheutil -flushcache ``` **Windows** 1. Press the Windows key and type Notepad in the search text box. 2. Right-click the Notepad icon and select Run as administrator. 3. In Notepad, select File > Open. 4. In the File name text box, type C:\Windows\System32\drivers\etc\hosts. 5. At the bottom of the file, on a new line, add the Ingress IP and the custom Orka domain, separated by a space. ``` For example: 10.221.188.22 company.com ``` 6. Save your changes and close the file. ## 4. Trust the certificate locally This step is required for self-signed certificates. If you are using a TLS certificate for a registered domain, issued by a recognized certificate authority, you can skip this step. If you are using a self-signed certificate, you need to add your custom TLS certificate and trust it on all systems that will be accessing your Orka cluster. For some browsers, you might need to add the certificate (if self-signed) to the trusted store of the browser as well. ### macOS 1. Open Keychain Access. 2. Drag and drop the certificate to the login keychain. 3. Double-click the newly added certificate. 4. Expand the Trust section and for the When using this certificate setting, select Always Trust. 5. Close the certificate info window and when prompted, provide your password. ## Linux Run the following commands: ``` sudo mkdir /usr/local/share/ca-certificates/extra sudo cp mycertificate.pem /usr/local/share/ca-certificates/extra/mycertificate.crt sudo update-ca-certificates ``` ### Windows 1. Rename the certificate and change its extension to .crt. 2. Double-click the file and confirm that you want to open it. 3. On the General tab, click Install Certificate. 4. For Store Location, select Local Machine and click Next. 5. When prompted, confirm that you want Windows host process to make changes to your device. 6. Select Place all certificates in the following store, click Browse and from the list, select Trusted Root Certification Authorities and click OK. 7. Click Next, review the settings, and click Finish. ## 5. Configure your tools ### Known limitation Due to Node.js limitations, the Orka CLI can work only with valid TLS certificates issued by [the certificate authorities recognized by Node.js](https://github.com/nodejs/node/blob/main/src/node_root_certs.h). If you are using a self-signed certificate or your certificate was issued by a certificate authority unrecognized by Node.js, you need to use your Orka API endpoint ([http://10.221.188.20](http://10.221.188.20) or [http://10.221.188.100](http://10.221.188.100)) with the Orka CLI, or switch to another Orka tool. Finally, you need to target your external custom domain with your Orka tools. Note that you need to use https with your custom TLS domain. * For the Orka API, change your API requests to target `https://`. * For the Orka3 CLI, run `orka3 config set --api-url https://`. Note that you can use only valid TLS certificates issued by a limited number of certificate authorities. * For the Orka Web UI, open `https://` in your browser. * For CI/CD integrations, switch to `https://` in the respective plugin configuration. You can use your Orka API endpoint ([http://10.221.188.20](http://10.221.188.20) or [http://10.221.188.100](http://10.221.188.100)) and your custom domain ([https://company.com](https://company.com)) interchangeably in your workflows. # Connect GCP to your Orka cluster Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/gcp-orka-connections Connect GCP to your Orka cluster: one-time access from a GCP VM via VPN client, or a persistent IPsec site-to-site tunnel between your GCP cloud and Orka. Overview of how to connect GCP to your Orka cluster. Deep dive for detailed instructions on bringing up a tunnel between the two. ## One-Time Access If you need to establish one-time or temporary access to your Orka cluster from a single virtual machine hosted in Google Cloud Platform (GCP), you can [connect via VPN](/orka/networking-with-orka-at-macstadium/vpn-connection) from the GCP machine to your Orka cluster. ## VPN Tunnel If you need to connect an entire GCP private cloud to your Orka cluster through a stable, persistent connection, you need to establish an IPsec site-to-site VPN between the two clouds (VPN tunnel): 1. [Create a Site-to-Site VPN for your GCP private cloud.](/orka/networking-with-orka-at-macstadium/1-gcp-side-of-the-vpn-tunnel) 2. [Download and adjust the GCP-specific configuration file for the VPN.](/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file) 3. [Apply the configuration to your Cisco ASAv device using the Cisco ASDM-IDM.](/orka/networking-with-orka-at-macstadium/3-orka-side-of-the-gcp-vpn-tunnel) ### You Can Also * [Verify the GCP VPN tunnel.](/orka/networking-with-orka-at-macstadium/4-verifying-the-gcp-vpn-tunnel) * [Perform GCP VPN tunnel troubleshooting.](/orka/networking-with-orka-at-macstadium/gcp-vpn-tunnel-troubleshooting) # GCP VPN Tunnel Troubleshooting Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/gcp-vpn-tunnel-troubleshooting Fix GCP-to-Orka VPN tunnel issues: Cisco ASA interface name errors, no-traffic tunnels, NAT exemption mismatches, and GCP firewall ingress rules. What to look for when you're experiencing issues with your GCP-Orka VPN tunnel and how to perform basic troubleshooting. ## Unrecognized interface during the Cisco ASA/ASAv configuration Sometimes, the command line interface might return `ERROR: unable to find interface “outside”`. The command-line interface might be case-sensitive and you might need to preserve the capitalization of the Orka network configuration as provided in [My Cloud](/macstadium/macstadium-overview/ip-plan). 1. Clean up the ASA configuration.\ For more information, see Cleaning up the ASA/ASAv configuration. 2. Rename `outside` in your configuration to `Outside`. 3. Re-run the complete configuration in Cisco ASDM-IDM.\ For more information, see [Setting Up the Orka Side of the Site-to-Site VPN](/orka/networking-with-orka-at-macstadium/3-orka-side-of-the-gcp-vpn-tunnel). ## The tunnel is connected but there's no traffic between GCP and Orka If GCP shows that the tunnel is `Established` but there is no visibility and connectivity between the two clouds, it might be because of some common mistakes when preparing the configuration. Check for the following in the site-to-site VPN configuration. For more information, see [Preparing the VPN Configuration for Input into Cisco ASA/ASAv](/orka/networking-with-orka-at-macstadium/3-orka-side-of-the-gcp-vpn-tunnel). * Verify that your `{ shared_key }` is correct. The `{ shared_key }` in the configuration must match the key set for the VPN connection. * Verify that you've replaced `{ macstadium_network_address }` and `{ macstadium_network_mask }` with the correct values for the `Private-1` network, from the `Private-1` row of the **IP Allocation** table in My Cloud. * Verify that you've configured the NAT exemption rule properly. * The host and subnet mask required for `ONPREM-NET` are the host and mask for the `Private-1` network, from the **IP Allocation** table in My Cloud. * The host and subnet mask required for `GCP-NET` are the host and mask for your GCP virtual network. You need to convert the [subnet mask bit notation](http://www.steves-internet-guide.com/subnetting-subnet-masks-explained/) to the correct subnet mask (e.g., the `/16` notation converts to a `255.255.0.0` subnet mask). * The values in the brackets after `nat` must be the `Private-1`, followed by `Outside`. To resolve any of the listed common problems with the Cisco ASA/ASAv configuration, complete the following steps: 1. Clean up the firewall configuration. 2. Make the necessary changes to the [configuration](/orka/networking-with-orka-at-macstadium/2-gcp-vpn-tunnel-configuration-file). 3. [Re-run](/orka/networking-with-orka-at-macstadium/3-orka-side-of-the-gcp-vpn-tunnel) the complete configuration in Cisco ASDM-IDM. ## There's traffic from GCP to Orka but you cannot access GCP from Orka Sometimes, you might be able to establish an SSH connection from GCP to Orka but you might not be able to see or access GCP from Orka. This might be due to any of the following issues: * The GCP firewall is not configured to allow ingress traffic.\ For information about how to enable ingress traffic, see [Google Cloud Documentation: Configuring firewall rules > Example configurations](https://cloud.google.com/vpn/docs/how-to/configuring-firewall-rules#example_configurations). * Your GCP instances don't allow OS login.\ For more information about user login on GCP instances, see [Google Cloud Documentation: Setting up and configuring OS Login](https://cloud.google.com/compute/docs/instances/managing-instance-access). ## Troubleshooting ### Cleaning up the ASAv configuration Sometimes, you might need to clean up the Cisco ASAv configuration and start over. 1. [Verify that you are connected via VPN to your Orka cluster.](/orka/networking-with-orka-at-macstadium/vpn-connection) 2. [Run Cisco ASDM-IDM and log in to the firewall.](/iaas/cisco-firewalls/logging-into-cisco-firewall) 3. In the Cisco ASDM-IDM application toolbar, select **Tools** > **Command Line Interface...**. Cisco ASDM-IDM Tools menu with Command Line Interface option 4. Select **Single Line**. 5. Run the following commands one by one, clicking **Send** in between. Replace the placeholders with their respective values. Use **Table 1: Placeholders** for reference. ``` clear configure tunnel-group { gcp_vpn_ip } clear configure group-policy gcp clear configure access-list gcp-in clear configure access-list gcp-acl clear configure access-list gcp-filter clear configure crypto map gcp-vpn-map clear configure crypto ipsec ikev2 ipsec-proposal gcp no nat ({ macstadium_network_name },{ macstadium_outside_interface }) 1 source static ONPREM-NET ONPREM-NET destination static GCP-NET GCP-NET no object-group network GCP-NET no object-group network ONPREM-NET ``` **Table 1: Placeholders** | Placeholder | Value | Description | | ---------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------------- | | `{ gcp_vpn_ip }` | (Sample) `192.168.0.0` | The public IP address of the cloud VPN gateway in GCP. | | `{ macstadium_network_name }` | `Private-1` | The name of the `Private-1` network, as listed in the **IP Allocation** table in My Cloud. | | `{ macstadium_outside_interface }` | `Outside` | The name of the outside interface of your Cisco ASA/ASAv device. By default, this is `Outside`. | ## More troubleshooting by Google [Google Cloud Documentation: Cloud VPN Troubleshooting](https://cloud.google.com/vpn/docs/support/troubleshooting) ## More troubleshooting by Cisco [Cisco Documentation: IPsec Troubleshooting](https://www.cisco.com/c/en/us/support/docs/security-vpn/ipsec-negotiation-ike-protocols/5409-ipsec-debug-00.html). # MSDC Network Requirements Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/msdc-network-requirements Network requirements for Orka clusters at MacStadium data centers in Atlanta, Dublin, and Las Vegas, including reserved address ranges and custom subnets. This page applies to Orka clusters hosted at MacStadium data centers (Atlanta, Dublin, and Las Vegas). It does not apply to Orka on AWS or customer on-premises deployments. MacStadium creates and manages the physical host network for MSDC-hosted Orka clusters. The default subnet is `10.221.188.0/23`. If your organization needs a different subnet to avoid conflicts with your own network topology, you can request one, but the choice is constrained by three reserved address ranges described below. ## Reserved address ranges All three [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private blocks are in use at MSDC in some capacity. When requesting a custom subnet, it must fall within `10.0.0.0/8`. | Block | Reserved for | Can be used for host network? | | ---------------- | --------------------------------------------------- | ----------------------------- | | `10.0.0.0/8` | Physical host networks (default: `10.221.188.0/23`) | Yes | | `172.16.0.0/12` | MSDC storage network (SAN) | No | | `192.168.0.0/16` | Calico pod network (Kubernetes internal) | No | ### Why `192.168.0.0/16` is off-limits Orka uses [Calico](https://docs.tigera.io/calico/latest/about/) for pod networking. During cluster bootstrap, `kubeadm` assigns Calico the `192.168.0.0/16` block as its pod network CIDR. If physical Mac hosts are on any subnet within this block, Calico will route pod traffic to physical addresses and vice versa, causing intermittent or complete networking failures for VMs and Orka services. ### Why `172.16.0.0/12` is off-limits MacStadium uses this block for the storage area network (SAN) at MSDC facilities. Placing host traffic in this range creates conflicts with storage connectivity. Resolving either conflict after the cluster is live requires a full cluster rebuild. Contact MacStadium before the cluster is bootstrapped if there is any question about subnet selection. ## Requesting a custom subnet If `10.221.188.0/23` conflicts with your organization's network (for example, your VPN or corporate routing overlaps with it), contact your MacStadium account team to request a different subnet. Any alternative must be a subnet within `10.0.0.0/8`. ## Checklist before bootstrapping * [ ] Confirm the assigned host subnet falls within `10.0.0.0/8` * [ ] Confirm it does not overlap with your VPN or corporate network * [ ] If you need a different subnet, request it from MacStadium before cluster bootstrap # Connect to your Orka cluster via VPN Source: https://docs.macstadium.com/orka/networking-with-orka-at-macstadium/vpn-connection Connect to your Orka cluster's Cisco ASAv via VPN with OpenConnect or Cisco AnyConnect. Required before managing VMs or configuring cluster networking. ## Before You Begin * The VPN server address: your firewall's public IP, shown at the top of the firewall's section in [My Cloud](/macstadium/macstadium-overview/ip-plan). * The VPN username and password: shown under **Credentials** in the firewall's section in My Cloud. Select **Show** to reveal them. ## When VPN is required Your Orka cluster sits behind a dedicated Cisco ASAv firewall. VMs and the Orka management plane are on a private network and not reachable from the public internet without VPN. | Scenario | VPN required? | | ----------------------------------------------------------------------- | ----------------------------------------------------- | | `orka3` CLI commands (deploy, list, delete VMs) | Yes | | Orka web UI | Yes | | SSH into a VM | Yes | | VNC / Screen Sharing into a VM | Yes | | CI/CD runner already inside your corporate network (routed through VPN) | Depends on your network topology | | VDI end-user sessions via Citrix Workspace app | No (Citrix proxies the session over outbound TCP 443) | VDI end users do not need a VPN client. Citrix Workspace app establishes the session outbound through Citrix Cloud. VPN is only required for administrators managing the Orka cluster itself. To protect your environment, MacStadium deploys your Orka cluster with a dedicated [Cisco Adaptive Security Virtual Appliance (ASAv)](https://www.cisco.com/c/en/us/products/collateral/security/adaptive-security-virtual-appliance-asav/datasheet-c78-733399.html) firewall. Cisco ASAv runs the same software as physical Cisco ASAs and delivers full ASA firewall and VPN capabilities to the cloud. MacStadium has pre-configured the firewall and has enabled VPN access. All you need to do is run a VPN client and provide the server address and credentials for the connection. ## (Open-Source Option) OpenConnect #### **Why OpenConnect?** If you are a predominantly CLI user, you might want to use [OpenConnect](https://www.infradead.org/openconnect/index.html) - an open-source VPN client available from the command line. ### Download and Install OpenConnect * If you have Homebrew on your system, you can run `brew install openconnect` from your command line. * If you're running on Windows, you can [download](https://www.infradead.org/openconnect/download.html) and [build](https://www.infradead.org/openconnect/building.html) the OpenConnect package yourself or you can use Cisco AnyConnect instead. ### Use OpenConnect 1. From your command line, run the following command. Replace `` with your firewall's public IP from My Cloud. ``` sudo openconnect --protocol=anyconnect // OR if running on Windows openconnect --protocol=anyconnect ``` 2. Follow the prompts. * On the immediate Password prompt, provide your sudo password (the password for your current computer user) and press Enter. * On the Enter 'yes' to accept, 'no' to abort; anything else to view: prompt, type yes and press Enter. * On the Username prompt, provide the VPN username from the firewall's **Credentials** in My Cloud and press Enter. * On the Password prompt, provide the VPN password from the firewall's **Credentials** in My Cloud and press Enter. When the connection is established, you will see a similar output: OpenConnect terminal output showing successful VPN connection **TIP: Want to terminate the VPN connection?** At any time press Ctrl+C on the command line. ## Cisco AnyConnect Secure Mobility Client #### **Why Cisco AnyConnect?** Cisco firewalls are designed to work with the [Cisco AnyConnect Secure Mobility Client](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/tsd-products-support-series-home.html) as a VPN client. If you prefer a GUI VPN client or you're running on Windows, you might want to use Cisco AnyConnect. ### Download and Install Cisco AnyConnect 1. In your browser, navigate to your firewall's public IP from My Cloud. You might need to use https\://. 2. Ignore the certificate warning and proceed to the address. 3. When prompted, enter the VPN credentials from the firewall's **Credentials** in My Cloud.\\ Cisco AnyConnect login prompt for server address and credentials 4. When prompted, download, install, and run the Cisco AnyConnect desktop client. ## Use Cisco AnyConnect 1. Run Cisco AnyConnect Secure Mobility Client. 2. When prompted, enter your firewall's public IP from My Cloud and click Connect.\\ Cisco AnyConnect main screen with server address field 3. If prompted that an untrusted server was blocked, perform the following steps: * Click Change Setting... and deselect Block connections to untrusted servers. * Close the Preferences - VPN window. * Click Connect again.\\ Cisco AnyConnect Preferences with Block connections to untrusted servers option 4. If prompted that the server certificate is untrusted, click Connect Anyway. 5. When prompted, provide your login credentials and click OK. # OCI Images: Deploy VMs Source: https://docs.macstadium.com/orka/oci-images/oci-images-deploy-vms Deploy an Orka VM from any OCI-compatible image by specifying the registry address. Private registries require credentials pre-configured in the namespace. Using an OCI image in your workloads is as simple as just deploying a VM and specifying the address of the image in the registry. If you are working with a private registry, you need to have the [registry credentials configured in the respective namespace](/orka/oci-images/oci-images-manage-registry-credentials) before attempting to deploy. #### **Orka CLI** ``` orka3 vm deploy --image /[:] OR orka3 vm deploy --image /[:] --namespace ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' -H 'Content-Type: application/json' \ -d '{ "image": "/[:]" }' ``` Note that you need to provide the registry path to the image name and optionally its tag. For example: ghcr.io/my-organization/orka-images/orka-arm:latest. You can add as many or as few configuration options as you need, including a user-specified name. If you are using the Orka3 CLI, run orka3 vm deploy --help for more information. If you are using the Orka3 API, see [Deploy a VM](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/vmDeploy). **Did you know?** You can find MacStadium's public vanilla macOS images at [https://github.com/macstadium/orka-images.](https://github.com/macstadium/orka-images) # OCI Images: Manage Registry Credentials Source: https://docs.macstadium.com/orka/oci-images/oci-images-manage-registry-credentials Store and manage OCI registry credentials in Orka with orka3 regcred. Add, override, and remove credentials per namespace for private registry access. How to manage the credentials for working with OCI-compatible registries in Orka 3.0. If you want to work with private OCI images, you need to manage the credentials for the respective registries locally in your cluster. Note that: * You can store only one set of credentials per registry per namespace. * You need to store every set of credentials in every namespace where you might need them. * Only cluster administrators can manage the registry credentials. Orka stores the registry credentials as a [Kubernetes secret](https://kubernetes.io/docs/concepts/configuration/secret/). ## List the Available Registry Credentials #### **Orka CLI** ``` orka3 regcred list OR orka3 regcred list --namespace ``` #### **Orka API** ``` curl -X 'GET' \ '/api/v1/namespaces//secrets/registrycredentials' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` ## Add Registry Credentials Note that the `` for the registry must include the scheme, hostname, and (optionally) port. For example, [https://ghcr.io](https://ghcr.io) or [https://10.221.188.5:30080](https://10.221.188.5:30080). #### **Orka CLI** ``` orka3 regcred add --username --password OR orka3 regcred add --username --password --namespace ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//secrets/registrycredentials/add' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "password": "", "server": "", "username": "" }' ``` If you are adding a server address with the HTTP scheme, you need to allow working with insecure registries. #### **Orka CLI** ``` orka3 regcred add --username --password --allow-insecure ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//secrets/registrycredentials/add' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "allowInsecure": true, "password": "", "server": "", "username": "" }' ``` In the Orka3 CLI you can also read the password via stdin. #### **Orka CLI** ``` echo -n '' | orka3 regcred add --username --password-stdin OR orka3 regcred add --username --password-stdin < ``` ## Override Registry Credentials If you need to change the credentials already added for an OCI-compatible registry, you can replace them. #### **Orka CLI** ``` orka3 regcred add --username --password --replace ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//secrets/registrycredentials/add' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "password": "", "replace": true "server": "", "username": "" }' ``` ## Remove Registry Credentials #### **Orka CLI** ``` orka3 regcred remove OR orka3 regcred remove --namespace ``` #### **Orka API** ``` curl -X 'DELETE' \ '/api/v1/namespaces//secrets/registrycredentials/remove' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "server": "" }' ``` ## (CLI-Only) Get Help ``` orka3 regcred --help orka3 regcred list --help orka3 regcred add --help orka3 regcred remove --help ``` # OCI container images for Orka VMs Source: https://docs.macstadium.com/orka/oci-images/oci-images-overview Deploy Orka VMs using OCI-compatible images from public or private registries. Store, version, and distribute macOS images through standard container workflows. Starting with Orka 3.0.0, you can work with OCI-compatible images. You can deploy a VM using a compatible image straight from a private or public registry, and you can store your images in your own registry. ## Benefits OCI-compatible Orka images provide the following benefits: * The official vanilla macOS images, maintained by MacStadium, are now publicly available at [https://github.com/macstadium/orka-images](https://github.com/macstadium/orka-images). * You can maintain your own images separately from the Orka cluster, saving storage space in the process. * You can maintain versions of your OCI-compatible images. * Deployments using OCI-compatible Orka images are generally faster because of improved caching and storage utilization. ## Workflow Working with OCI-compatible Orka images usually consists of these steps: 1. Set up the credentials for the image registry in the namespace where you will be deploying VMs. * If you are using one of the official images, maintained by MacStadium, you can skip this step. 2. Deploy a VM by specifying the path to the image. Use the VM in your workloads. 3. Preserve any changes made to the VM by saving a new image locally or pushing a version of the image to an OCI-compatible registry. * If you are using one of the official images, maintained by MacStadium, you can preserve your changes by saving a new image locally or pushing to your own private registry. ## Known limitations * You cannot work with OCI images in the Orka Web UI. * You cannot store multiple credentials for the same registry in the same namespace. * You cannot store your registry credentials on the cluster level - you need to store them individually per namespace. * You cannot push changes to the official images, maintained by MacStadium. * Only cluster administrators can manage the registry credentials. # OCI Images: Preserve Changes Source: https://docs.macstadium.com/orka/oci-images/oci-images-preserve-changes Save Orka VM changes by committing locally or pushing to an OCI registry. Covers local cluster saves and registry pushes for macOS disk images (Orka 3.0+). Often in your workloads, you might need to modify the underlying OS configuration or file system of the VM. You might need to preserve these changes for future deployments. When working with OCI-compatible images, you can preserve changes by saving a new image locally in the cluster or pushing your changes to a registry. Note that you cannot push changes to the official images, maintained by MacStadium, unless you are pushing a version to your own registry. **Did you know?** Starting with Orka 3.0, all VM disks are OCI-compatible. So, even if you have deployed from a locally stored image, you can push your VM as an image to an OCI-compatible registry. Before you can push an image to an OCI-compatible registry, you need to have the [registry credentials configured in the respective namespace](/orka/oci-images/oci-images-manage-registry-credentials) before attempting to push the changes. Unlike most `orka3` commands, `vm push` routes through the Orka API server rather than the Kubernetes API. This means a kubeconfig obtained via certificate-based authentication (common in AWS and on-prem deployments) is not sufficient on its own. If you run `vm push` without a valid Orka API token, you will receive an `Unauthorized` error; this error comes from the Orka API server, not the OCI registry, even if it appears registry-related. Before running `vm push`, authenticate with `orka3 login` or `orka3 user set-token` to obtain an Orka API token. #### **Orka CLI** ``` orka3 vm push /[:] OR (if the VM is deployed in a namespace that is not 'orka-default') orka3 vm push /[:] --namespace ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//vms//push' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "imageReference": "/[:]" }' ``` Note that you need to provide the registry path to the image name and optionally its tag. For example: ghcr.io/my-organization/orka-images/orka-arm:latest. This is an async operation. It returns a push job ID (in the vm-push- format) which you can use to check the status of the operation. Note that the push job ID is valid for 1 hour after the operation completes. Note that this check is not available with the Orka3 API. #### **Orka CLI** ``` orka3 vm get-push-status OR (if the VM is deployed in a namespace that is not 'orka-default') orka3 vm get-push-status --namespace ``` ## Save Changes as a New Locally Stored Image If you don't want to push your changes to an OCI-compatible registry, you can save a new image locally to your cluster. #### **Orka CLI** ``` orka3 vm save OR (if the VM is deployed in a namespace that is not 'orka-default') orka3 vm save --namespace ``` #### **Orka API** ``` curl -X 'POST' \ '/api/v1/namespaces//vms//save' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "imageName": "" }' ``` This is an async operation. To check the status of the operation, run: #### **Orka CLI** ``` orka3 image list ``` #### **Orka API** ``` curl -X 'GET' \ '/api/v1/namespaces/orka-default/images/' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` # Migrate NFS Orka images to OCI format with Harbor Source: https://docs.macstadium.com/orka/oci-images/orka-self-service-migrating-nfs-images-to-oci-with-harbor Migrate NFS-based Orka images to OCI format using Harbor on Orka 3.5. Covers orka3 regcred, orka3 vm push, imagecache, and updating CI/CD integrations. **Requires Orka 3.5 or later.** If you're on an earlier version, see the [release notes](/orka/orka-upgrades-and-release-notes/orka-upgrades) for your version before proceeding. This guide walks you through the process of migrating your existing NFS-based images to OCI using Harbor storage in Orka 3.5. ### Prerequisites * Orka cluster upgraded to version 3.5.0 or later * Harbor instance provisioned by MacStadium * Harbor credentials (URL, username, password) from the Harbor OCI Storage entry in your firewall's Credentials section in [My Cloud](/macstadium/macstadium-overview/ip-plan) * VPN connection configured per My Cloud * List of existing NFS images to migrate * Inventory of all integrations currently using these images ### Step 1: Upgrade to Orka 3.5+ You can verify your Orka version using the Orka3 CLI command `orka3 version` If an upgrade is needed: * [Contact MacStadium Support](mailto:support@macstadium.com) to schedule the upgrade * Review the Orka v3.5 (or later) [release notes](https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-35-release-notes) to better understand how upgrading may impact you * Plan for your scheduled upgrade maintenance window ### Step 2: Provision Harbor OCI Registry Submit a support request for Harbor instance provisioning. * Email [support@macstadium.com](mailto:support@macstadium.com) * Request: "Harbor OCI registry provisioning for Orka 3.5" Once the request is complete, you will receive the following: * A Harbor instance URL (Usually the last IP in your Orka subnet, e.g., `https://10.221.189.254`) * Harbor metrics URL (e.g., `http://10.221.189.254:9090/metrics`) * Project Admin username + password * Default project name (usually this is set to `library`) Access the [Harbor web interface](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli): * Connect to VPN (per My Cloud) * Navigate to your Harbor instance URL in your browser * Log in using the Harbor credentials from your firewall's Credentials section in My Cloud * Verify you can access your project dashboard ### Step 3: Configure Orka to Connect to Harbor * Add your Harbor registry credentials to Orka using the Orka3 CLI: ``` orka3 regcred add -u -p ``` * Verify your credentials using ``` orka3 regcred list ``` * **Note:** Registry credentials are namespace-specific. If you use namespaces other than `orka-default`, add credentials to each namespace: ``` orka3 regcred add -u -p --namespace ``` ### Step 4: Convert NFS Images to OCI Format * Confirm the image(s) you'd like to migrate by running `orka3 image list` and noting the image(s) to convert. * Deploy a VM from the specified NFS image: ``` orka3 vm deploy --image "" --name "migration-temp-vm" --cpu 4 --memory 8G ``` * Wait for the VM to begin running ``` orka3 vm list migration-temp-vm ``` * Push the VM as an OCI image to Harbor: ``` orka3 vm push migration-temp-vm /library/: ``` * Monitor push status using ``` orka3 vm get-push-status vm-push-temp-vm ``` * After pushing to Harbor, cache the new OCI image on your Orka nodes: ``` orka3 imagecache add /library/: --all ``` * To cache the image on a specific node, run: ``` orka3 imagecache add /library/: --nodes ``` * Monitor image caching status: ``` orka3 imagecache info /library/: ``` * Clean up the temporary VM by running: ``` orka3 vm delete migration-temp-vm ``` To do so via the Harbor web UI: * Log in to the Harbor web interface * Navigate to 'Projects' -> 'Library' * Click 'Repositories' * Verify your image appears with the correct tag, repeating the process for each NFS image to migrate ### Step 5: Update CI/CD Integrations #### GitHub Actions Old workflow example: ``` name: Run build uses: macstadium/orka-actions@v1 with: image: ventura-base cpu: 4 ``` New workflow example: ``` - name: Run build uses: macstadium/orka-actions@v1 with: image: 10.221.189.254/library/sequoia-base:v1.0 cpu: 4 ``` ### Jenkins Old Jenkinsfile example: ``` orkaVM(image: 'ventura-base', cpu: 4, memory: '8G') {  // build steps  } ``` New Jenkinsfile example: ``` orkaVM(image: '10.221.189.254/library/sequoia-base:v1.0', cpu: 4, memory: '8G') {  // build steps  } ``` #### GitLab CI Old `.gitlab-ci.yml` example: ``` variables: ORKA_IMAGE: ventura-base ``` New `.gitlab-ci.yml` workflow example: ``` variables: ORKA_IMAGE: 10.221.189.254/library/sequoia-base:v1.0 ``` #### Packer Templates Old HCL: ``` source "macstadium-orka" "build" { source_image = "sequoia-base" image_name = "custom-build" } ``` New HCL: ``` source "macstadium-orka" "build" { source_image = "10.221.189.254/library/sequoia-base:v1.0" image_name = "10.221.189.254/library/custom-build:v1.0" } ``` Packer-built images should also be pushed to Harbor using the new OCI format. ### Validation and Testing * Example test VM deployment from an OCI image ``` orka3 vm deploy --image "10.221.189.254/library/sequoia-base:v1.0" --name "validation-vm" --cpu 4 --memory 8G ``` * Verify the VM boots successfully using ``` orka3 vm list validation-vm ``` * Use `orka3 vm vnc validation-vm` to get the VNC connection information for the VM * Run any integration smoke tests your organization uses * Monitor Harbor storage ### Migration Best Practices * Keep NFS images available during transition * Migrate integrations gradually (not all at once) * Test OCI images thoroughly before removing NFS versions * Maintain rollback capability * Use consistent, semantic naming conventions for images, such as: ``` /library/-: * (e.g. `10.221.189.254/library/sequoia-xcode16:v1.0`) ``` * Pre-cache frequently used images on all nodes * Schedule image caching during off-peak hours For more information on using Harbor with the Orka3 CLI, see [Using Harbor OCI Storage with the Orka CLI](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli). # Using Harbor OCI Storage with the Orka CLI Source: https://docs.macstadium.com/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli Orka Harbor OCI storage comes preconfigured with everything needed to push and pull macOS VM images using the Orka CLI. Users are provided with a Project. **Requires Orka 3.5 or later.** If you're on an earlier version, see the [release notes](/orka/orka-upgrades-and-release-notes/orka-upgrades) for your version before proceeding. Orka Harbor OCI storage comes preconfigured with everything needed to push and pull macOS VM images using the Orka CLI. Users are provided with a **Project Admin** account, giving them full control over project repositories and user management within their assigned project(s). Harbor OCI storage architecture diagram showing Orka and Harbor integration ### Getting Your Credentials Your Harbor credentials will be provided to you by our support team, and appear under the Harbor OCI Storage entry in your firewall's Credentials section in [My Cloud](/macstadium/macstadium-overview/ip-plan). These will include your: * Harbor URL * Harbor metrics URL * Username * Password ### Accessing the Harbor Web Interface #### Initial Login 1. You will need to be logged in to the Orka CLI using the `orka3 login` command in your terminal, and connected to the VPN as outlined in My Cloud. 2. Navigate to your Harbor URL, found under the Harbor OCI Storage entry in your firewall's Credentials section in My Cloud, in a web browser. This will typically be the last available IP in your Orka subnet. Example: [https://10.221.189.254](https://10.221.189.254/). Your Harbor metrics URL will differ, and have the /metrics destination. Example: [http://10.221.189.254:9090/metrics](http://10.221.189.254:9090/metrics). Each Harbor instance includes a [Let’s Encrypt](https://letsencrypt.org/) certificate, enabling you to access your instance via FQDN by adding the appropriate entry to your local hosts file. 3. Click ‘Log in’ Harbor web interface login screen 1. Enter your username and password 2. Click ‘Log in’ ### Harbor Dashboard Overview Once logged in, you’ll see the Harbor dashboard, with several key sections: * **Projects:** Your assigned project where you can manage repositories. If you require more than one project, please [reach out to our Support team](mailto:support@macstadium.com) for assistance. Harbor dashboard showing Projects section * **Repositories:** Container image repositories within your project Harbor dashboard showing Repositories section * **Users:** Project-level user management (limited to your project scope). To add users, please open a support ticket. ### Key Harbor Web Interface Features #### Project Summary The project section provides an overview of: * The total number of repositories in your project * Your storage usage and quota limits * Recent activity and statistics * Project members and roles #### Repository Management The ‘repositories’ section provides a detailed overview of: * All the repositories within your project * Browsing image tags and versions * Delete images if necessary (see ‘Garbage collection’ section below) #### User Management As a Project Admin, you can: * View existing project users * Manage user roles within your project scope * **Note:** To add new users to your project, please [contact the MacStadium Support team](mailto:support@macstadium.com). ### Using Harbor with the Orka CLI Add credentials to Orka to access the Harbor OCI repository: `orka3 regcred add -u -p https://` The `https://` scheme is required. Omitting it or using `http://` will cause push operations to fail with an App Transport Security (ATS) error on the Orka nodes. ### Pulling Images Instruct all Orka nodes to fetch an image from the OCI repository: `orka3 imagecache add /library/ --all` Cache the image to a single node: `orka3 imagecache add /library/ --nodes ` Monitor the status of the image being fetched: `orka3 imagecache info /library/` For more information, run `orka3 regcred --help` command in the Orka CLI. ### Pushing Images The state of a running VM is saved on the host and pushed to your Harbor container registry. This operation is applicable only to Apple silicon-based VMs. The provided image must be in the following format: `server.com/repository/image:tag`. If `--namespace` is not set, Harbor assumes that the VM is running in the `orka-default` namespace.\ Registry credentials must exist in the same namespace as the VM. Registry credentials are required to authenticate to the registry for the push operation. For more information, run `orka3 regcred --help` in the Orka CLI. Pushing an OCI image is an async operation. To check the status of the operation, run:\ `orka3 vm get-push-status JOB_NAME` #### Usage `orka3 vm push VM_NAME IMAGE[:TAG] [flags]` ### Image Management and Deletion #### Deleting Images **Note:** Images must be deleted through Harbor, not via the Orka CLI. 1. Log in to the Harbor web interface 2. Navigate to your project 3. Select the repository that contains the image for deletion 4. Check the box next to the image tag(s) you want to delete 5. Click ‘DELETE’ to confirm the action Harbor repository with image tags selected for deletion ### Garbage Collection * **Default schedule:** Garbage collection runs hourly to reclaim storage space from deleted images * **Timing:** Garbage collection occurs hourly, at the top of the hour * **Custom scheduling:** If you would like to adjust your instance’s garbage collection schedule, please [contact our support team](mailto:support@macstadium.com). Please note that deleted images are not immediately removed from storage. They are marked for deletion and then cleaned up during the next garbage collection cycle. ### Storage Quota and Limits Your Harbor instance comes with pre-defined storage quotas. You can monitor your resource usage via the Harbor web interface under your project settings. If you attempt to push an image and have hit your storage quota, you will be met with an internal server error. #### Example ``` Image push progress: 8% Error: internal error (13): Unexpected status code: 500 orka-engine image push 90gbventurassh.orkasi -u admin -p Harbor12345 0.26s user 0.04s system 0% cpu 51.752 total ``` If you encounter this error, we recommend logging into your Harbor instance using the instructions above, and verifying that you have not hit your storage quota. This can be viewed in the Harbor web interface, on the right side of the screen. Harbor project settings showing storage quota usage If you have hit your quota and need to free up space on your instance urgently, or need to increase your storage limits for any reason, please contact our support team. ### Advanced Features and Configurations For more detailed information about Harbor’s advanced features and capabilities, please refer to the official Harbor documentation: * **Harbor documentation:**[ https://goharbor.io/](https://goharbor.io/) * **User guide:**[ https://goharbor.io/docs/2.13.0/working-with-projects/](https://goharbor.io/docs/2.13.0/working-with-projects/) * **Administration:**[ https://goharbor.io/docs/2.13.0/administration/](https://goharbor.io/docs/2.13.0/administration/) * **Scheduled maintenance:** We are currently finalizing our maintenance process for platform updates. These updates will require scheduled downtime to ensure system security and performance. We will provide advance notice via email and MacStadium portal notification of all planned maintenance windows, and their impact on service availability. These details will be added to our documentation once they are complete. ### Troubleshooting #### Push Fails with an App Transport Security Error If `orka3 vm get-push-status` returns an error referencing App Transport Security (ATS) or a secure connection requirement: ``` pushing image failed — The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. ``` This means the Orka node attempted to connect to Harbor over HTTP instead of HTTPS. The most common cause is a registry credential added without the `https://` scheme. To fix it, remove the existing credential and re-add it with `https://`: ```bash theme={null} orka3 regcred remove orka3 regcred add -u -p https:// ``` ### Additional Support #### Adding Users If you need to add additional users to your project, please [contact the MacStadium Support team](mailto:support@macstadium.com) with: * The email address of the user to be added * The desired role for each user * Your project name #### Configuration Changes For any configuration changes such as custom garbage collection schedules, storage quota increases, or advanced security settings, please contact our support team. #### Support Channels * Email [support@macstadium.com](mailto:support@macstadium.com) * Orka documentation: [https://docs.macstadium.com/orka](https://docs.macstadium.com/orka) # Cluster Access Management: Overview Source: https://docs.macstadium.com/orka/orka-cluster-access/cluster-access-management-overview Orka access control overview: SSO login, RBAC roles, namespaces, and role bindings. Covers Admin, Tech, and service account permissions across namespaces. Starting with Orka 3.0, Orka uses Single Sign-On (SSO) and Kubernetes role-based access control (RBAC) for user management. Users log in with their MacStadium Customer Portal credentials. What they can do depends on the role assigned to their account. ## How roles work Roles exist in two places: the Customer Portal and the Orka cluster. They map to each other based on the role assigned in the Portal. **Customer Portal roles:** * **Admin**: full control of the Portal account and the Orka cluster. Can invite users, manage billing, and administer cluster resources. * **Tech**: developer access. Can deploy and manage VMs, images, and VM configs. Cannot manage users or namespaces. * **Billing**: read-only Portal access. Cannot perform any cluster actions. **Orka cluster roles:** * Admin Portal users get the **Administrator** cluster role. * Tech Portal users get the **Technical** cluster role. * **Service accounts** are cluster-only accounts for CI/CD integrations. They are not tied to a Portal account. ## Role-based access matrix Within the Customer Portal, the Admin, Tech, and Billing roles have the following capabilities: Customer Portal role-based access matrix for Admin, Tech, and Billing roles Within the Orka cluster: | Operation | Admin | Tech | Billing | Admin SA (Orka Small Teams-only) | Regular SA | | --------------------------------------------------- | ----- | ----------------------------- | ------- | -------------------------------- | -------------------------------------------------------------- | | Log in with CP credentials | ✅ | ✅ | ✅ | ❌ | ❌ | | Log in with authentication token | ✅ | ✅ | ❌ | ✅ | ✅ | | Log out | ✅ | ✅ | ✅ | ✅ | ✅ | | Manage users | ✅ | ❌ | ❌ | ❌ | ❌ | | Manage service accounts, including token generation | ✅ | ❌ | ❌ | ✅ | ❌ | | Print authentication token | ✅ | ✅ | ✅ | ✅ | ✅ | | Manage namespaces | ✅ | ❌ | ❌ | ✅ | ❌ | | Manage role bindings | ✅ | ❌ | ❌ | ✅ | ❌ | | List nodes | ✅ | ✅ | ❌ | ✅ | ✅ | | Manage nodes | ✅ | ❌ | ❌ | ✅ | ❌ | | Access and work in the `orka-default` namespace | ✅ | Yes (Admin can revoke access) | ❌ | ✅ | If created in `orka-default`; otherwise based on role bindings | | Access and work in custom `orka-` namespaces | ✅ | Based on role bindings | ❌ | ✅ | If created in the namespace; otherwise based on role bindings | | View information about all VMs in the namespace | ✅ | ✅ | ❌ | ✅ | ✅ | | Deploy VMs in the namespace | ✅ | ✅ | ❌ | ✅ | ✅ | | Manage the VM state of all VMs in the namespace | ✅ | ✅ | ❌ | ✅ | ✅ | | Delete own VMs in the namespace | ✅ | ✅ | ❌ | ✅ | ✅ | | Delete other subjects' VMs in the namespace | ✅ | ❌ | ❌ | ✅ | ❌ | | Manage VM configs (except deleting) | ✅ | ✅ | ❌ | ✅ | ✅ | | Delete own VM configs | ✅ | ✅ | ❌ | ✅ | ✅ | | Delete other owners' VMs | ✅ | ❌ | ❌ | ✅ | ❌ | | Manage images | ✅ | ✅ | ❌ | ✅ | ✅ | | List and pull remote images | ✅ | ✅ | ❌ | ✅ | ✅ | | Manage ISOs | ✅ | ✅ | ❌ | ✅ | ✅ | | List and pull remote ISOs | ✅ | ✅ | ❌ | ✅ | ✅ | ## Common admin workflows These are the most frequent access management tasks an Orka cluster administrator performs. ### Adding a user to the cluster 1. In the MacStadium Customer Portal, an account Admin invites the user and sets their role (Admin or Tech). 2. The user accepts the invite and sets their credentials. 3. The user logs in to the Orka cluster with their Portal credentials. ### Adding a service account for CI/CD 1. A cluster administrator creates the service account in the target namespace. 2. If the service account needs access to additional namespaces, the administrator configures the appropriate role bindings. ### Isolating resources with namespaces Administrators can create namespaces to dedicate resources to specific teams or workflows. 1. Create the namespace. 2. Assign nodes to the namespace. (Nodes cannot be shared across namespaces.) 3. Add users or service accounts as subjects to the namespace's role binding. ### Modifying or revoking access * To change a user's role or disable them: edit or disable their account in the MacStadium Customer Portal. * To revoke a service account's access: delete the service account in the Orka cluster. * To add or remove namespace access: update the relevant role bindings in the cluster. ## Key terms | Term | Where | Definition | | --------------- | --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | Account | Customer Portal | The top-level entity managing one or more Orka clusters. All account users are shared across clusters on the same account. | | Account user | Customer Portal | A person belonging to the account. Can assume one role: Admin, Tech, or Billing. | | Cluster user | Orka cluster | A Portal account user who has logged in to the cluster. Maps to Administrator or Technical based on their Portal role. | | Service account | Orka cluster | A cluster-only account for CI/CD integrations. Not linked to a Portal account; tokens are valid for 1 year by default. | | Namespace | Orka cluster | Isolates resources (VMs, images, nodes) from other namespaces. Users and service accounts need explicit role binding access to each namespace. | | Role | Orka cluster | A Kubernetes RBAC role: Administrator or Technical. Created automatically when a namespace is created. | | Role binding | Orka cluster | Links cluster users or service accounts to a namespace. Admins manage role binding subjects manually. | # Customer Portal: Manage Account Users Source: https://docs.macstadium.com/orka/orka-cluster-access/customer-portal-manage-account-users Manage Orka cluster users via the MacStadium Customer Portal: invite new members, assign Admin, Tech, or Billing roles, and control namespace access. Because your cluster is configured to rely on Single-Sign-On (SSO) with your Customer Portal credentials, all user management for your cluster occurs in the Customer Portal. ## Before You Begin Log into the MacStadium Customer Portal. ## Invite New Account Users As an administrator, you might need to add new users or administrators to the account and determine their roles. If a member of your team needs to access the Orka cluster, you can invite them to your Customer Portal account. 1. Click the account menu in the top right corner of the screen. 2. In the account menu, click Users.\\ MacStadium Customer Portal account menu with Users option 3. Click + Add, fill in the New User form, and click Create. * Note that you cannot invite users who already belong to another account. * When choosing a role for the user, keep in mind the [role-based access matrix](/orka/orka-cluster-access/cluster-access-management-overview). This sends an invitation to the specified email. The invited user must accept the invite and complete the process. ## Edit Account Users If needed, you can update the details for a user of your account. You can also change their account role. 1. Click the account menu in the top right corner of the screen. 2. In the account menu, click Users.\\ MacStadium Customer Portal account menu with Users option 3. Locate the user whose details or role you want to modify and click Edit. If you don't see the user in the list, select the Show disabled checkbox and look through the list again. 4. Update the user details or role. Note that a role change will not affect the respective cluster user directly, if they are currently logged in the Orka cluster. For the change to take effect, the user must obtain a new authentication token by logging out and logging back in. * When choosing a role for the user, keep in mind the [role-based access matrix](/orka/orka-cluster-access/cluster-access-management-overview). ## Disable Account Users If you need to revoke the access of a member of your team to the Orka cluster, you can disable their account user in the Customer Portal. Note that this will not affect the respective cluster user directly, if they are currently logged in the Orka cluster. For the change to take effect, the user must obtain a new authentication token by logging out and logging back in. 1. Click the account menu in the top right corner of the screen. 2. In the account menu, click Users.\\ MacStadium Customer Portal account menu with Users option 3. Select the Show disabled checkbox and locate the user that you want to re-enable. 4. Click Enable. # Authentication and RBAC Source: https://docs.macstadium.com/orka/orka-cluster-access/orka-authentication-and-rbac How Orka handles authentication and authorization: OIDC provider options, default RBAC roles and bindings, group mapping configuration, and migration guidance. Orka does not have a separate authentication system. It relies entirely on Kubernetes authentication and authorization. When you use the `orka3` CLI, it communicates with the Kubernetes API server the same way `kubectl` does. If your `kubectl` configuration works, `orka3` works too. For most commands, the CLI passes your credentials (a static token, client certificate, or an exec-based plugin token) to the Kubernetes API server. The API server validates those credentials against its configured authentication methods, then applies RBAC rules to determine what the user can do. For some operations like `vm push`, the CLI sends the token to the Orka API server instead, because VM uploads require permissions to manage Kubernetes jobs that Orka users do not have directly. ```mermaid theme={null} flowchart TD A[User / Service Account] --> B["Identity Provider\n(OIDC / Certs / IAM)"] B -->|credentials in kubeconfig| C[Orka CLI] C --> D{Command Type} D -->|"credentials passed\nvm create, node list, etc"| E[Kubernetes API Server] D -->|"static token\nfor vm push"| F[Orka API Server] F --> E E -->|validates credentials| G[Kubernetes RBAC\nFinal Authorization Decision] ``` For API and CI/CD integrations, use a dedicated service account with a long-lived token rather than a user token. User tokens expire (default: 1 hour) and are not suitable for automation. ## Default RBAC resources Orka automatically creates a set of ClusterRoles and RoleBindings in every deployment, regardless of which identity provider is used. These resources control access to Orka functionality, not to the broader Kubernetes cluster. ### Roles | Role | Scope | Purpose | | ---------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------- | | `orka-admin` | Namespaced | Full Orka administrative permissions for managing Orka resources, nodes, and `orka-registry` secrets in `orka-*` namespaces | | `orka-dev` | Namespaced | Developer permissions for managing Orka resources within a namespace | | `orka-namespace-admin` | Cluster-wide | Permissions to create, list, and delete namespaces | | `orka-clusterwide-dev` | Cluster-wide | Read-only access to Orka CRDs across the cluster | ### Bindings | Binding | Type | Scope | Default subjects | Role | Purpose | | ------------------------------ | ------------------ | ------------ | --------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------- | | `orka-admin` | RoleBinding | `orka-*` | `oidc:Administrator` group | `orka-admin` | Grants Orka admin permissions in the default Orka namespace | | `orka-admin` | ClusterRoleBinding | Cluster-wide | `orka-support-admin` ServiceAccount | `orka-admin` | Gives the support admin ServiceAccount Orka admin access | | `orka-dev` | RoleBinding | `orka-*` | `oidc:Technical`, `oidc:Administrator` groups | `orka-dev` | Grants developer-level permissions in Orka namespaces | | `orka-dev` | ClusterRoleBinding | Cluster-wide | `orka-support-admin` ServiceAccount | `orka-dev` | Ensures the support admin ServiceAccount has developer-level access | | `orka-namespace-admin` | ClusterRoleBinding | Cluster-wide | `oidc:Administrator` group, `orka-support-admin` SA | `orka-namespace-admin` | Allows admins and the support account to manage Orka namespaces | | `orka-clusterwide-dev` | ClusterRoleBinding | Cluster-wide | `oidc:Administrator`, `oidc:Technical` groups | `orka-clusterwide-dev` | Grants cluster-wide read-only access to Orka CRDs | | `orka-support-clusterwide-dev` | ClusterRoleBinding | Cluster-wide | `orka-support-admin` ServiceAccount | `orka-clusterwide-dev` | Gives the support account visibility into Orka CRDs across the cluster | ### Namespace provisioning When you create a new `orka-*` namespace with the Orka CLI, the Orka operator automatically adds two RoleBindings in that namespace: one for `orka-admin` and one for `orka-dev`. Admin users are added as subjects automatically. Developers and service accounts must be added explicitly by an admin using `orka3 rb add-subject`. When a new service account is created, it is automatically added to the `orka-dev` RoleBinding in the namespace it was created in. ## Default configuration: MacStadium OIDC provider By default, Orka clusters use the MacStadium OIDC provider. User identities and permissions are managed through the MacStadium Portal, and `orka3 login` connects to this provider. If you want to use your own identity provider, MacStadium can enable SSO through the MacStadium Portal. In that case, Orka continues to use the same OIDC endpoint, which federates with your external identity system. The CLI login continues to work as usual because the MacStadium OIDC endpoint remains the source of authentication. The MacStadium OIDC provider maps users to two groups: * `oidc:Administrator` for Orka administrators * `oidc:Technical` for Orka developers ## Custom OIDC providers Because Orka delegates authentication entirely to Kubernetes, any valid Kubernetes authentication method works with Orka automatically. Common examples include Keycloak, Okta, Auth0, and Dex. `orka3 login` works only with the MacStadium OIDC provider. All other authentication flows, including token-based logins, exec plugins, and cloud CLI-based methods, are fully supported. Token expiration behavior depends on your cluster and provider configuration. For stable, long-running automation, use a service account token: ```bash theme={null} orka3 sa create orka3 sa token # default: 1 year orka3 sa token --no-expiration # useful for EKS, which enforces a max expiry ``` ## No OIDC provider Orka can run without any OIDC provider. In this case, authentication is handled by Kubernetes using certificates, static tokens, or cloud IAM integrations. If your existing kubeconfig allows you to run `kubectl` commands, it will also allow you to run `orka3` commands. `orka3 login` does not work without an OIDC provider. When Orka creates a new namespace, it adds the standard RoleBindings for `orka-admin` and `orka-dev`. Since there is no identity provider to supply groups, you must edit those RoleBindings manually to add your users, groups, or service accounts. If your Kubernetes cluster already uses groups from client certificates or other mechanisms, and those group names match Orka's defaults, no manual changes are needed. ## Configuring RBAC group mapping Orka's default group names are: ```yaml theme={null} admin_oidc_group_name: oidc:Administrator dev_oidc_group_name: oidc:Technical ``` You can override these in Ansible (requires Orka 3.6+) if you use a custom OIDC provider or no provider at all. When using a custom OIDC provider, configure the Kubernetes API server to match your provider's group claims: ``` --oidc-groups-prefix="oidc:" --oidc-groups-claim="cognito:groups" ``` The claim name above (`cognito:groups`) is specific to AWS Cognito. Adjust it to match your provider's claim, such as `groups` or `roles`. ## Migrating from MacStadium OIDC to a custom OIDC provider 1. Reconfigure the Kubernetes API server with your new OIDC settings (`--oidc-issuer-url`, `--oidc-client-id`, `--oidc-groups-claim`, and others). 2. **\[Requires Orka 3.6+]** Update your Ansible variables if group names change: ```yaml theme={null} admin_oidc_group_name: dev_oidc_group_name: ``` 3. Restart all Orka services (`orka-apiserver`, `orka-operator`, `orka-webhooks`) to apply the changes. After migration, `orka3 login` will no longer work. Users should switch to kubeconfig-based authentication such as `kubectl oidc-login`. If your new provider uses different group names, update the existing RoleBindings to reflect those names. ## Limitations * `orka3 login` works only with the MacStadium OIDC provider. * Commands that require a static token (`orka3 user get-token`, `orka3 vm push`) do not work if authentication is handled dynamically through an exec plugin. Use a service account token instead: ```bash theme={null} orka3 sa create orka3 sa token orka3 user set-token ``` * The Orka API and all Orka integrations require static tokens. * With custom or no OIDC providers, RoleBindings may need to be updated manually unless your provider's groups match Orka's configured group names. * There is no `orka3` command to add users or service accounts to the `orka-admin` RoleBinding. To elevate a user to admin, add them to the admin OIDC group or edit the admin RoleBinding directly. To elevate a service account to admin, edit the admin RoleBinding directly. ## Troubleshooting **`kubectl` works but `orka3` commands fail:** Check whether your kubeconfig user has a static token defined. Some `orka3` commands require one. **"Access denied" in a newly created namespace:** Verify that the RoleBindings in that namespace include your user or group. **Orka does not recognize group memberships from your identity provider:** Review the API server flags `--oidc-groups-prefix` and `--oidc-groups-claim` and confirm they match your provider's configuration. # Log in to your Orka cluster for the first time Source: https://docs.macstadium.com/orka/orka-cluster-access/orka-cluster-access-the-cluster Complete the cluster invitation process, connect via VPN, get your Orka API URL, and log in. Covers first-time registration and CLI authentication steps. To be able to work with your Orka cluster, you need to log in. ## Complete the invitation process This section is applicable only to users who have been recently invited to join an Orka customer account. After the account administrator invites you to the account, you need to complete the invitation process. 1. In your email inbox, look for an email from MacStadium Support titled MacStadium Portal Invitation. * You might need to check your Spam folder. 2. Click the link to the customer portal and sign in with the temporary credentials provided in the invitation. 3. When prompted, change your password. 4. When prompted, fill in the Complete Registration form and click Complete Registration. ## Connect to the cluster via VPN Review our[ VPN documentation](/orka/networking-with-orka-at-macstadium/vpn-connection) for the steps to connect to your VPN. ## Get your Orka API URL #### **What's your Orka API URL?** You can get your Orka API URL from the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan): * For clusters deployed before Orka 2.1, it's the .100 address for your Private-1 network (usually, 10.221.188.100), prefixed with http. For example: [http://10.221.188.100](http://10.221.188.100). * For clusters deployed with Orka 2.1 or later, it's the .20 address for your Private-1 network (usually 10.221.188.20), prefixed with http. For example: [http://10.221.188.20](http://10.221.188.20). * You can also use `https://` and `https://` (if configured). To get the Orka domain for your Orka cluster, contact MacStadium. To use an external custom domain, see here. You can use `http://`, `https://`, and `https://` interchangeably in your workflows. ## Log in to the Orka cluster Orka customers log in to their cluster with their MacStadium Customer Portal credentials. Based on the role bindings configured for the respective user, they can access one or more namespaces. ### Using the Orka3 CLI If this is the first time you are logging in after installing the Orka CLI, you need to add the `` to your CLI configuration: ``` orka3 config set --api-url ``` If you have already configured the endpoint, run the following command: ``` orka3 login ``` The Orka3 CLI launches a new browser window. Enter your credentials for the MacStadium Customer Portal and click Sign In. Return to the Orka3 CLI. ### Using the Orka Web UI If you are using Orka Web UI, complete the following steps: 1. In the Orka CLI, run the following command: ``` orka3 user get-token ``` Or, if you have a service account: ``` orka3 serviceaccount token ``` 2. In the browser, navigate to your `` and, when prompted, provide the token obtained in Step 1. User tokens have a lifetime of 1 hour. Service account tokens have a lifetime of 1 year. If you rely mostly on the Orka Web UI, you might want to use a service account token instead of a user token. ### Using the Orka3 API If you are using the Orka API, complete the following steps: 1. In the Orka3 CLI, run the following command: ``` orka3 user get-token ``` Or, if you have a service account: ``` orka3 serviceaccount token ``` 2. In the browser, navigate to your `/api/v1/swagger` and click Authorize. 3. In the Value text box, type `Bearer ` and click Authorize. 4. Replace `` with the token obtained in Step 1. 5. Click Close User tokens have a lifetime of one hour. Service account tokens have a lifetime of one year. If you rely mostly on the Orka3 API, you might want to use a service account token instead of a user token. ## CI/CD integrations: Log in to the Orka cluster Service accounts are intended for use with CI/CD integrations. They don't require username/password credentials to log in and let CI/CD integrations bypass the browser login. The tokens for service accounts also have an extended duration of one year. 1. Create a service account. #### **Orka CLI** ``` orka3 sa create [--namespace ] E.g. To create the 'sa-jenkins' service account in the 'orka-test' namespace, run: orka3 sa create sa-jenkins --namespace orka-test ``` #### **Orka API** ``` curl -X 'POST' \ 'http:///api/v1/namespaces//serviceaccounts/' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -d '' ``` 2. Generate a token. #### **Orka CLI** ``` orka3 serviceaccount token ``` #### **Orka API** ``` curl -X 'POST' \ 'http:///api/v1/namespaces//serviceaccounts//token' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ }' ``` 3. Use the obtained credentials in your CI/CD integrations. # Orka Cluster: Manage Access to Resources Source: https://docs.macstadium.com/orka/orka-cluster-access/orka-cluster-manage-access-to-resources Admin guide: create namespaces, add subjects to role bindings, and isolate Orka resources for specific users, teams, or CI/CD service accounts. (Admin-only) How to manage the access to your cluster resources with namespaces and role bindings. Orka uses namespaces to isolate and dedicate resources to users and teams within the cluster. This replaces the earlier node dedication model (also known as "grouping"). Orka relies on RBAC for user access management. Both roles and role bindings are created and maintained automatically by Orka. Cluster administrators can manually add subjects to the role binding for a namespace, which grants the respective users and service accounts access to the namespace. All cluster administrators have access to all namespaces. The resources within a namespace are completely isolated from one another and cannot be shared between namespaces. By default, users and service accounts limited to a specific namespace cannot access the resources in other namespaces, unless added to the respective role bindings. By managing namespaces and the subjects of role bindings, administrators can isolate and dedicate resources to specific users or emulate the concept of teams in the cluster. For example, an administrator might create a namespace dedicated to a team and then add the users belonging to this team to the namespace role binding. Or an administrator might create a namespace dedicated exclusively to CI/CD and limit its access only to service accounts. ## Before You Begin 1. Connect to your cluster via VPN. See [here](/orka/networking-with-orka-at-macstadium/vpn-connection). 2. [Log in](/orka/orka-cluster-access/orka-cluster-access-the-cluster) as an administrator. ## Create a Namespace You can create regular namespaces where you can deploy and run Orka VMs, or you can create a sandboxed namespace where you can deploy and run only Kubernetes custom pods. 1. Connect to your cluster via VPN. 2. Log in as an administrator. 3. Run the following command: #### **Orka CLI** ```bash theme={null} orka3 namespace create ``` Or, if you want to create a sandboxed namespace: ```bash theme={null} orka3 namespace create --enable-custom-pods ``` #### **Orka API** ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "enableCustomPods": false, "name": "" }' ``` Or, if you want to create a sandboxed namespace: ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "enableCustomPods": true, "name": "" }' ``` Your namespace name must meet the following requirements: * Begins with the `orka-` prefix. * Does not exceed 63 characters (including the prefix). * Consists of lowercase alphanumeric characters or dashes (`-`). * The string ends with an alphanumeric character. * The name is unique to the cluster. ## Grant Access to the Namespace You can dedicate a pool of resources to one or more users or service accounts by assigning them to a specific namespace. 1. To add one or more users, run the following command: #### **Orka CLI** ```bash theme={null} # Add a single user orka3 rb add-subject --user user@company.com [--namespace ] # Add multiple users orka3 rb add-subject --user user_1@company.com,user_2@company.com [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces//rolebindings/orka-dev/subjects/add' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "users": [ "user@company.com" ] }' ``` 2. To add one or more service accounts, run the following command: #### **Orka CLI** ```bash theme={null} # Add a single service account orka3 rb add-subject --serviceaccount : [--namespace ] # Add multiple service accounts orka3 rb add-subject --serviceaccount :,: [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces//rolebindings/orka-dev/subjects/add' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "serviceaccounts": [ { "name": "", "namespace": "" } ] }' ``` ## Dedicate Resources to the Namespace The resources within a namespace are completely isolated and cannot be shared between namespaces. By default, users and service accounts limited to a specific namespace cannot access the resources in other namespaces, unless added to the respective role binding. Formerly, this feature was known as node dedication and was achieved with node and user grouping. Run the following command: #### **Orka CLI** ```bash theme={null} orka3 node namespace [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces//nodes//namespace' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "namespace": "" }' ``` There must be no running VMs on the node. ## Revoke Access to a Specific Namespace If needed, you can revoke the access of a user or a service account to a namespace. You need to remove the respective subjects from the respective role binding. 1. To remove one or more users, run the following command: #### **Orka CLI** ```bash theme={null} # Remove a single user orka3 rb remove-subject --user user@company.com [--namespace ] # Remove multiple users orka3 rb remove-subject --user user_1@company.com,user_2@company.com [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'DELETE' \ 'http:///api/v1/namespaces//rolebindings/orka-dev/subjects/remove' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "users": [ "user@company.com" ] }' ``` 2. To remove one or more service accounts, run the following command: #### **Orka CLI** ```bash theme={null} # Remove a single service account orka3 rb remove-subject --serviceaccount : [--namespace ] # Remove multiple service accounts orka3 rb remove-subject --serviceaccount :,: [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'DELETE' \ 'http:///api/v1/namespaces//rolebindings/orka-dev/subjects/remove' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "serviceaccounts": [ { "name": "", "namespace": "" } ] }' ``` ## Remove Resources from a Namespace If needed, you can move unused resources (nodes) across namespaces. 1. Verify that there are no VMs deployed on the node. 2. Run the following command: #### **Orka CLI** ```bash theme={null} orka3 node namespace [--namespace ] ``` #### **Orka API** ```bash theme={null} curl -X 'POST' \ 'http:///api/v1/namespaces//nodes//namespace' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "namespace": "" }' ``` # Orka Cluster: Manage Service Accounts Source: https://docs.macstadium.com/orka/orka-cluster-access/orka-cluster-manage-service-accounts Admin guide: create and manage Orka service accounts for CI/CD integrations. Service accounts use 1-year tokens and bypass browser SSO login. (Admin-only) How to manage service accounts in your Orka cluster. Service accounts are intended for use with CI/CD integrations. They don't require username/password credentials to log in and let CI/CD integrations bypass the browser login. The tokens for service accounts also have an extended duration of 1 year. Administrators can manage service accounts only from the Orka cluster. Administrators can manage users and other administrators only from the Customer Portal. See [Customer Portal: Manage Users](/orka/orka-cluster-access/customer-portal-manage-account-users). ## Before You Begin 1. Connect to your cluster via VPN. See [here](/orka/networking-with-orka-at-macstadium/vpn-connection). 2. [Log in](/orka/orka-cluster-access/orka-cluster-access-the-cluster) as an administrator. ## Create a Service Account You can create a service account with access to the orka-default namespace or to another custom namespace. You can later add the service account to additional role bindings for other namespaces. Run the following command: #### **Orka CLI** ``` orka3 sa create [--namespace ] ``` If `` is not provided, Orka creates the service account in the `orka-default` namespace. #### **Orka API** ``` curl -X 'POST' \ 'http:///api/v1/namespaces//serviceaccounts/' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -d '' ``` ## Obtain a Service Account Token To use a service account, you need to obtain a token for it. Service account tokens have a lifetime of 1 year. Run the following command: #### **Orka CLI** ``` orka3 serviceaccount token ``` #### **Orka API** ``` curl -X 'POST' \ 'http:///api/v1/namespaces//serviceaccounts//token' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ }' ``` ## Delete a Service Account You can delete a service account that you no longer need or whose access you want to revoke. This operation invalidates all authentication tokens issued for the respective service account. Run the following command: #### **Orka CLI** ``` orka3 sa delete [--namespace ] ``` If `` is not provided, Orka tries to delete the service account from the `orka-default` namespace. #### **Orka API** ``` curl -X 'DELETE' \ 'http:///api/v1/namespaces//serviceaccounts/' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` # Understanding Orka Credentials Source: https://docs.macstadium.com/orka/orka-cluster-access/understanding-orka-credentials Learn how Orka's three credential systems work, when to use each, and how to avoid the common mistake of using short-lived tokens in CI/CD pipelines. New Orka users typically hit three different credential prompts before they can do anything useful, and none of the three are the same thing. Here's how they fit together. ## The three systems ### 1. MacStadium portal credentials Your MacStadium account username and password. Use these to log in to [portal.macstadium.com](https://portal.macstadium.com) to access My Cloud, manage billing, and request changes to your cluster. These credentials have nothing to do with Orka itself. They don't let you deploy VMs or run CLI commands. ### 2. Orka user tokens Orka's own authentication layer, separate from the portal. You log in with: ```bash theme={null} orka3 login ``` This mints a **short-lived token that expires after 1 hour.** The token is scoped to your Orka namespace and lets you run CLI commands, deploy VMs, manage images, and access the web UI. Do not use `orka3 login` or `orka3 user get-token` in CI/CD pipelines. Tokens expire after 1 hour and will break long-running jobs. **For CI/CD, use service accounts instead:** ```bash theme={null} orka3 sa create orka3 sa token --no-expiration ``` Service account tokens are long-lived (default: 1 year) or non-expiring, and are designed to be injected as environment variables in your pipeline. See [Manage Service Accounts](/orka/orka-cluster-access/orka-cluster-manage-service-accounts) for the full workflow. ### 3. VM credentials The macOS username and password inside each VM. These are what you use to SSH in or connect via Screen Sharing. MacStadium base images ship with default credentials: * **Username:** `admin` * **Password:** `admin` Change the default VM password after your first login. The default `admin/admin` credentials are well known and your VMs are accessible to anyone with VPN access to your cluster. ## Quick reference | Credential | Used for | Expires | | ----------------------- | -------------------------------------------------- | ----------------------------- | | MacStadium portal login | portal.macstadium.com (billing, My Cloud, account) | No | | `orka3 login` token | CLI and web UI (human use) | 1 hour | | Service account token | CI/CD pipelines and automation | 1 year (or never) | | VM credentials | SSH, VNC into VMs | Never (until you change them) | ## Common mistakes **Using `orka3 login` in a pipeline.** The token will expire mid-job and cause confusing authentication errors. Use a service account. **Rotating portal credentials and expecting Orka to break.** They're independent: changing your portal password doesn't affect your Orka tokens or service accounts. **Leaving VM credentials at `admin/admin`.** Every VM on your cluster shares the same default, so a single compromised VM credential means all of them are exposed. # 2.4.x and 3.0.x to 3.1.x and above: Backward Compatibility Source: https://docs.macstadium.com/orka/orka-cluster-migration-from-24-3x/24x-and-30x-to-31x-and-above-backward-compatibility Upgrading to Orka 3.1+: the legacy API is removed. Switch to orka3 CLI, update all integrations, and ensure Customer Portal access for all team members. **You're reading Orka 2.x migration documentation.** Orka 2.x is no longer actively maintained. If you haven't upgraded yet, see the [Orka 3.x documentation](/orka/orka-overview/orka-overview) to get started. Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). What continues to work out-of-the-box right after the migration from Orka 2.4.x and Orka 3.0.x to Orka 3.1.x and above. The old Orka API is removed in Orka 3.1. You need to make sure that you are using: 1. You are using the new [orka3 CLI](/orka/quick-start-guides/orka3-cli-quick-start) 2. You are using the new [Orka API](/orka/quick-start-guides/orka3-api-quick-start) 3. You have updated your [Orka Integrations](/orka/orka-overview/tools-integrations) to their latest version (**recommended**) or an older version that uses the new Orka API or CLI 4. You have [given access to everyone](/orka/orka-cluster-access/cluster-access-management-overview) on your team that needs to access the Orka cluster inside the MacStadium Portal If you are upgrading from Orka 2.4.x you should review the CLI and API mapping to understand how to migrate your integrations with Orka. * CLI Mapping: [2.4.x to 3.0.0 CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) * API Mapping: [2.4.x to 3.0.0 API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-api-mapping) * Orka3 API documentation: [macstadium.github.io/orka-api-docs](https://macstadium.github.io/orka-api-docs/) **Note** The public IP support in Orka 3.0.x is limited to the Jenkins and TeamCity plugins. If you require public IPs for the Orka API and nodes for other integrations or the CLI, you need to use Orka 3.1.x or above. # Post-migration tasks after upgrading Orka 2.4.x to 3.0.0 Source: https://docs.macstadium.com/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration Post-migration checklist for Orka 2.4.x to 3.0.0: update to the orka3 CLI, configure user access via Customer Portal, and set up Web UI authentication. **You're reading Orka 2.x migration documentation.** Orka 2.x is no longer actively maintained. If you haven't upgraded yet, see the [Orka 3.x documentation](/orka/orka-overview/orka-overview) to get started. Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). What do you need to do after the migration from 2.4.x to 3.0.0 completes? Although Orka 3.0.0 provides some backward compatibility and ensures that multiple environment features persist, you might need to complete the following list of tasks to ensure that you can benefit from all available features and improvements after migrating from Orka 2.4.x to Orka 3.0.0. ## Manage access to the cluster MacStadium Customer Portal account administrators must handle the post-migration user management. All team members who need to be able to access the cluster must be among the users of your MacStadium Customer Portal account. All team members must be in the Admin or Tech role. Customer Portal account administrators might need to [invite additional team members](/orka/orka-cluster-access/customer-portal-manage-account-users). Users might need to complete the invitation process. ## Configure your tools Orka CLI users need to upgrade to Orka 3.0.0 CLI. ``` brew install orka3 ``` If you prefer to use the Orka Web UI, you need to get an authentication token for it. You can use a user token (duration: 1 hour) or a service account token (duration: 1 year or custom). ``` orka3 user get-token OR orka3 sa create && orka3 sa token ``` MacStadium will gradually roll out updates to the Orka CI/CD integrations. If a new version becomes available, consider upgrading the respective integration. ## Create service accounts for your CI/CD integrations CI/CD integrations will continue to work out-of-the-box after the migration. MacStadium will gradually roll out updates to the Orka CI/CD integrations. To avoid future issues, you need to update your CI/CD integrations to the latest available version. After you upgrade your CI/CD integrations to Orka 3.0.0, you need to create dedicated service account tokens for your tools and re-configure them to use the updated authentication method. ``` orka3 sa create [--namespace ] ``` ## Re-create sandboxed nodes and redeploy custom pods Orka 3.0.0 introduces a new way to handle sandboxing. First, you need to create a dedicated namespace with enabled custom pods. Next, you need to move one or more nodes to that namespace. You also need to provide access to the namespace to all users and service accounts that require access. ``` orka3 ns create orka-sandbox --enable-custom-pods orka3 node namespace orka-sandbox orka3 rb add-subject --namespace orka-sandbox --user user@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-test:sa-githubactions ``` After that, you can re-create your custom pods. For any custom pods you need to re-create, add the following toleration to the pod. Provide the name for the sandbox namespace under value. **YAML** ``` {"key": "orka.macstadium.com/namespace-reserved", "value": "orka-sandbox"} ``` Finally, re-create your custom Kubernetes resources in the sandbox namespace. For example: ``` kubectl {create|apply} --namespace orka-sandbox ``` ## Re-create node tags (node affinity) Although all VM tags persist in the respective VM configurations, all node tags are removed during the migration. You need to manually re-apply them. Note that you can apply only one tag at a time. To apply multiple tags to a node, you need to run the command multiple times. ``` orka3 node tag ``` ## Re-create user and node grouping (node dedication) Orka 3.0.0 introduces a new way to handle resource dedication - via namespaces. For more information, see [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). First, you must create a namespace that you will isolate for one or more users. Next, you need to move nodes to this namespace. This lets you dedicate the resources in the namespace to the respective users. You must also add the respective users or service accounts as subjects to the role binding for the namespace. ``` orka3 ns create orka-dedicated orka3 node namespace orka-dedicated orka3 rb add-subject --namespace orka-dedicated --user user@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-test:sa-githubactions ``` ## Re-create VMs Moving to Orka 3.0.0 removes all deployed VMs but retains all VM configurations. You need to manually re-deploy all VMs that you want to use from the respective VM configurations. Note that after the migration, you will see all VM configurations for all users on the cluster. You will also begin to see all VMs for all users in the respective namespace. ``` orka3 vm deploy --config [--namespace ] ``` ## Update Orka VM Tools across your images You must update existing Apple silicon-based images stored locally in the cluster to use Orka VM Tools 3.0. Remote images are already upgraded to use Orka VM Tools 3.0. First, deploy a VM using the image that you want to update. Next, connect to the VM via SSH and upgrade the local installation of the Orka VM Tools. Finally, commit the changes to the image. ``` orka3 vm deploy --image ssh @ -p brew upgrade orka-vm-tools exit orka3 vm commit ``` ## (Optional) Remove/re-configure VM configurations or images that you no longer need After the migration, you will begin to see all VM configurations for all users on the cluster. You might want to clean up the cluster from unneeded VM configurations and images. ``` orka3 vm-config delete orka3 image delete ``` ## Update any custom automation you might have Custom automation around the basic scenario should be backward compatible and continue working out of the box after the migration. However, you might need to re-work more complex custom automation that relies on deprecated or changed features. Use the [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-api-mapping) to figure out how to migrate your custom automation to Orka 3.0.0. # 2.4.x to 3.0.0: API Mapping Source: https://docs.macstadium.com/orka/orka-cluster-migration-from-24-3x/24x-to-300-api-mapping Map Orka 2.4.x REST API endpoints to Orka 3.0.0: auth, tokens, VMs, VM configs, images, nodes, and removed endpoints with their Orka3 API replacements. **You're reading Orka 2.x migration documentation.** Orka 2.x is no longer actively maintained. If you haven't upgraded yet, see the [Orka 3.x documentation](/orka/orka-overview/orka-overview) to get started. Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). How do Orka 2.4.x API endpoints map to Orka 3.0.0? Use the following mapping to figure out how to migrate your API-based custom automation to Orka 3.0.0. | Orka 2.4.x API | Orka3 API | | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `GET/POST/DELETE/PUT /users` | Removed. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). | | `POST /users/password` | Removed. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). | | `POST /users/groups/myUserGroup` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | `POST /users/groups/$ungrouped` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | `POST /token` | For a user: `orka3 user get-token`
For a service account: `POST /api/v1/namespaces/{namespace}/serviceaccounts/{serviceaccount}/token` | | `DELETE /token` | Removed. Tokens are invalidated at the end of their duration (1 hour for users, or 1 year or custom for service accounts), or when the respective user or service account is removed from the cluster. | | `GET /resources/vm/list` | `GET /api/v1/namespaces/{namespace}/vms`
`GET /api/v1/namespaces/{namespace}/vmconfigs` | | `GET /resources/vm/list/all` | Removed. `GET /api/v1/namespaces/{namespace}/vms` and `GET /api/v1/namespaces/{namespace}/vmconfigs` now list all VMs and VM configurations for all users in the namespace. | | `GET /resources/vm/list/{user}` | Removed. `GET /api/v1/namespaces/{namespace}/vms` and `GET /api/v1/namespaces/{namespace}/vmconfigs` now list all VMs and VM configurations for all users in the namespace. | | `GET /resources/vm/status/{vm}` | `GET /api/v1/namespaces/{namespace}/vms/{vm}` | | `GET /resources/vm/configs` | `GET /api/v1/namespaces/{namespace}/vmconfigs` | | `GET /resources/vm/configs/myorkavm` | `GET /api/v1/namespaces/{namespace}/vmconfigs/{vmconfig}` | | `POST /resources/vm/create` | `POST /api/v1/namespaces/{namespace}/vmconfigs` | | `POST /resources/vm/deploy` | `POST /api/v1/namespaces/{namespace}/vms` | | `DELETE /resources/vm/delete` | `DELETE /api/v1/namespaces/{namespace}/vms/{vm}` | | `DELETE /resources/vm/purge` | `DELETE /api/v1/namespaces/{namespace}/vms/{vm}`
`DELETE /api/v1/namespaces/{namespace}/vmconfigs/{vmconfig}` | | `POST /resources/vm/exec/start` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/exec` | | `POST /resources/vm/exec/stop` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/exec` | | `POST /resources/vm/exec/resume` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/exec` | | `POST /resources/vm/exec/suspend` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/exec` | | `POST /resources/vm/exec/revert` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/exec` | | `POST /resources/vm/list-disks` | Removed. Attached disks are no longer available. | | `POST /resources/vm/attach-disk` | Removed. Attached disks are no longer available. | | `POST /resources/vm/configs/save-state` | Removed. VM states are no longer available. | | `POST /resources/vm/configs/myorkavm/delete-state` | Removed. VM states are no longer available. | | `GET /resources/node/list` | `GET /api/v1/namespaces/{namespace}/nodes` | | `GET /resources/node/list/all` | Removed. | | `GET /resources/node/status/{node}` | Removed. Use `GET /api/v1/namespaces/{namespace}/nodes` instead. | | `GET /resources/ports` | Removed. | | `POST /resources/node/sandbox` | Removed. Sandboxing is now handled via namespaces. | | `DELETE /resources/node/sandbox` | Removed. Sandboxing is now handled via namespaces. | | `POST /resources/node/groups/myUserGroup` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | `POST /resources/node/groups/$ungrouped` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | `POST /resources/node/tag/{tag}` | `POST /api/v1/namespaces/{namespace}/nodes/{name}/tag` | | `DELETE /resources/node/tag/{tag}` | `POST /api/v1/namespaces/{namespace}/nodes/{name}/untag` | | `GET /resources/image/list` | `GET /api/v1/namespaces/{namespace}/images` | | `POST /resources/image/rename` | Removed. Use `POST /api/v1/namespaces/{namespace}/images/{image}/description` to set a user-friendly custom description instead. | | `POST /resources/image/copy` | `POST /api/v1/namespaces/{namespace}/images/{image}/copy` | | `GET /resources/image/list-remote` | `GET /api/v1/namespaces/{namespace}/remoteimages` | | `POST /resources/image/pull` | `POST /api/v1/namespaces/{namespace}/remoteimages/{remoteimage}/pull` | | `POST /resources/image/delete` | `DELETE /api/v1/namespaces/{namespace}/images/{image}` | | `POST /resources/image/commit` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/commit` | | `POST /resources/image/save` | `POST /api/v1/namespaces/{namespace}/vms/{vm}/save` | | `POST /resources/image/resize` | No API endpoint is available. Use `orka3 vm resize` instead. | | `POST /resources/image/generate` | `POST /api/v1/namespaces/{namespace}/images` | | `POST /resources/image/upload` | `POST /api/v1/namespaces/{namespace}/upload/image` | | `GET /resources/image/download/{image}` | `GET /api/v1/namespaces/{namespace}/images/{image}/download` | | `GET /resources/image/checksum/{image}` | No API endpoint is available. | | `GET /resources/iso/list` | `GET /api/v1/namespaces/{namespace}/isos` | | `GET /resources/iso/list-remote` | `GET /api/v1/namespaces/{namespace}/remoteimages` | | `POST /resources/iso/pull` | `POST /api/v1/namespaces/{namespace}/remoteisos/{remoteiso}/pull` | | `POST /resources/iso/rename` | Removed. Use `POST /api/v1/namespaces/{namespace}/isos/{iso}/description` to set a user-friendly custom description instead | | `POST /resources/iso/copy` | `POST /api/v1/namespaces/{namespace}/isos/{iso}/copy` | | `POST /resources/iso/delete` | `DELETE /api/v1/namespaces/{namespace}/isos/{iso}` | | `POST /resources/iso/upload` | `POST /api/v1/namespaces/{namespace}/upload/iso` | | `GET/POST/DELETE /resources/kube-account` | Removed. | | `POST /resources/kube-account/regenerate` | Removed. | | `GET /resources/kube-account/download` | Removed. | | `POST /logs/query?limit=10` | Removed. | | `DELETE /logs` | Removed. | | `POST /logs/query?logs20=true` | Removed. | | `GET /token` | Removed. | | `GET /health-check` | Removed. | | `GET /version` | Removed. | | `GET /version/?all=true` | Removed. | | `GET /validation-requirements` | Removed. User credentials are handled via the MacStadium Customer Portal. | | `GET /validate-license-key` | Removed. License keys are obsolete. | | `GET /default-base-image` | Removed. | | `POST /resources/cert/set` | `POST /api/v1/upload/cert` | # 2.4.x to 3.0.0: CLI Mapping Source: https://docs.macstadium.com/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping Map Orka 2.4.x CLI commands to their Orka3 equivalents: config, login, VM management, images, nodes, and removed commands replaced by namespaces and RBAC. **You're reading Orka 2.x migration documentation.** Orka 2.x is no longer actively maintained. If you haven't upgraded yet, see the [Orka 3.x documentation](/orka/orka-overview/orka-overview) to get started. Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). How do Orka 2.4.x CLI commands map to Orka 3.0.0? Use the following mapping to figure out how to migrate your CLI-based custom automation to Orka 3.0.0. | Orka 2.4.x CLI | Orka3 CLI | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `orka config` | `orka3 config` | | `orka login` | `orka3 login` | | `orka logout` | `orka3 user logout` | | `orka version` | `orka3 version` | | `orka user ` | Removed. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). | | `orka user group` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/iaas/azure/verify-azure). | | `orka node list` | `orka3 node list` | | `orka node status` | `orka3 node list -o wide` | | `orka node sandbox` | Removed. Sandboxing is now handled via namespaces. | | `orka node unsandbox` | Removed. Sandboxing is now handled via namespaces. | | `orka node tag` | `orka3 node tag ` | | `orka node untag` | `orka3 node untag ` | | `orka node group` | Removed. Grouping is now handled via namespaces and role bindings. See [Orka Cluster: Manage Access to Resources](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | `orka vm list` | `orka3 vm list` | | `orka vm configs` | `orka3 vm-config list` | | `orka vm status` | `orka3 vm list -o wide` | | `orka vm create-config` | `orka3 vm-config create` | | `orka vm create` | Removed. You can now deploy VMs without a VM config. | | `orka vm deploy` | `orka3 vm deploy` | | `orka vm list-disks` | Removed. Attached disks are no longer available. | | `orka vm attach-disk` | Removed. Attached disks are no longer available. | | `orka vm save-state` | Removed. VM states are no longer available. | | `orka vm delete-state` | Removed. VM states are no longer available. | | `orka vm start` / `orka vm stop` | `orka3 vm start` / `orka3 vm stop` | | `orka vm resume` / `orka vm suspend` | `orka3 vm resume` / `orka3 vm suspend` | | `orka vm delete` | `orka3 vm delete` | | `orka vm purge` | `orka3 vm delete && orka3 vm-config delete ` | | `orka vm revert` | `orka3 vm revert` | | `orka image list` | `orka3 image list` | | `orka image list-remote` | `orka3 remote-image list` | | `orka image pull` | `orka3 remote-image pull` | | `orka image generate` | `orka3 image generate` | | `orka image rename` | Removed. Use `orka3 image set-description` to set a user-friendly custom description instead. | | `orka image copy` | `orka3 image copy` | | `orka image save` | `orka3 vm save` | | `orka image commit` | `orka3 vm commit` | | `orka image resize` | `orka3 vm resize` | | `orka image upload` | `POST /api/v1/namespaces/{namespace}/upload/image` | | `orka image download` | `GET /api/v1/namespaces/{namespace}/images/{image}/download` | | `orka iso list` | `orka3 iso list` | | `orka iso list-remote` | `orka3 remote-iso list` | | `orka iso pull` | `orka3 remote-iso pull` | | `orka iso upload` | `POST /api/v1/namespaces/{namespace}/upload/iso` | | `orka iso rename` | Removed. Use `orka3 iso set-description` to set a user-friendly custom description instead. | | `orka iso copy` | `orka3 iso copy` | | `orka iso delete` | `orka3 iso delete` | | `orka kube ` | Removed. | # 2.4.x to 3.0.0: What Persists Source: https://docs.macstadium.com/orka/orka-cluster-migration-from-24-3x/24x-to-300-what-persists After migrating Orka 2.4.x to 3.0.0: VM configs and images carry over, but VMs, node tags, user groups, and sandboxed nodes must be recreated. **You're reading Orka 2.x migration documentation.** Orka 2.x is no longer actively maintained. If you haven't upgraded yet, see the [Orka 3.x documentation](/orka/orka-overview/orka-overview) to get started. Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). How will your environment look like after migrating from 2.4.x to 3.0.0? Orka 3.0.0 upgrades the Orka Platform along with the virtualization and orchestration layer. See [Orka Upgrades](/orka/orka-upgrades-and-release-notes/orka-upgrades). The following table outlines which environment features persist and which [you'll need to re-create after the migration](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration) from Orka 2.4.x to 3.0.0. | Environment feature | Does it persist after the migration? | Details | Do I need to do anything? | | ------------------------------------------------------------------------------ | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Cluster configurations](/orka/orka-resources/cluster-configurations) | ✅ | Cluster settings like GPU passthrough, VM Internet and network isolation, and nested virtualization continue to work as expected. | No. | | Self-signed or custom TLS certificates for access via custom domains and HTTPs | ✅ | All self-signed or custom TLS certificates are retained. | No. | | Sandboxed nodes | ❌ | All sandboxed nodes are returned to their original state. | Re-create your sandboxing with [custom namespaces](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources#create-a-namespace) with the `--enable-custom-pods` setting. | | Node dedication (grouping) | ❌ | All user and node grouping is removed. | Re-create node dedication with [custom namespaces](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). | | Users | ❗️ | Orka 3.0 introduces a new way to manage users and log in to your cluster.

All existing users are retained, and you can still use them to log in with earlier versions of the Orka CLI or the Orka CI/CD integrations. | Configure user access to the cluster. See [here](/orka/orka-cluster-access/cluster-access-management-overview). | | Deployed VMs | ❌ | All deployed VMs are removed.

Some settings, such as custom ports and metadata, are available only during deployment and are not retained in the VM configuration. | Re-create any VMs you might want to use or re-deploy them from the migrated VM configurations. | | VM configurations | ✅ | All VM configurations are migrated to the new format.

VM configurations with attached disk no longer have an attached disk. | Clean up any VM configurations that you no longer need. | | Node affinity for VMs (tagging) | ❗️ | All existing VM configurations retain their tag settings.

All nodes lose their applied tags. | Re-apply the missing node tags. | | Images (locally stored on the cluster) | ✅ | All images are migrated to the new format and naming convention.

The old name is retained in the `Description` field. | Manually update the Orka VM Tools on all Apple silicon-based images and commit the changes. | | Images (cached on each Apple silicon node) | ❌ | The image cache is removed from each node. | Existing Apple silicon-based images should be saved or committed to take advantage of the new "thin-provisioned" format, and then cached per-node on VM deployment. | | ISOs (locally stored on the cluster) | ✅ | All ISOs are migrated to the new format and naming convention.

The old name is retained in the `Description` field. | No. | | Remote images | ✅ | All remote images are migrated to the new format and naming convention. | No. | | Remote ISOs | ✅ | All remote ISOs are migrated to the new format and naming convention. | No. | # Performance: GPU Passthrough Source: https://docs.macstadium.com/orka/orka-configuration/performance-gpu-passthrough Intel-only: enable GPU passthrough for Orka VMs using orka3 vm deploy --gpu. Covers cluster prerequisites, per-VM defaults, and node-level limitations. GPU passthrough configuration applies only to Intel-based VMs. GPU passthrough is always enabled on Apple silicon VMs and cannot be disabled. For more information, see [Feature Parity: Apple Hardware](/orka/compatibility/feature-parity-apple-hardware) and [Compatibility: Performance Improving Features](/orka/compatibility/compatibility-performance-improving-features). When GPU passthrough is enabled for a cluster, VMs with GPU passthrough enabled can access and use the host GPU for their workloads. GPU passthrough must be enabled on the Intel-based nodes in your cluster before you can use it on VMs. Contact the [MacStadium team](https://portal.macstadium.com/) to request that GPU passthrough is enabled on your nodes. ## Defaults GPU passthrough is disabled at the VM level for all Intel-based VMs, even when it is enabled in the cluster. You must explicitly enable it at deploy time or in a VM config template. ## Limitations * You can deploy only one VM with GPU passthrough per Intel-based node at a time. * GPU passthrough and VNC cannot work together on Intel-based VMs. Enabling GPU passthrough automatically disables the VNC console. Always pass `--disable-vnc` alongside `--gpu`. Make sure you can still access the VM via SSH or Apple Screen Sharing before enabling GPU passthrough. * GPU passthrough is always enabled for Apple silicon-based nodes and VMs and cannot be disabled. ## Enable GPU passthrough in a VM config template Create a reusable template with GPU passthrough enabled: ```bash theme={null} orka3 vm-config create gpu-config --image --gpu --disable-vnc ``` ## Deploy a VM with GPU passthrough To deploy a VM with GPU passthrough enabled, pass `--gpu` and `--disable-vnc`: ```bash theme={null} orka3 vm deploy --config gpu-config --gpu --disable-vnc ``` You can also override a template's GPU setting at deploy time: ```bash theme={null} # Enable orka3 vm deploy --config --gpu --disable-vnc # Disable orka3 vm deploy --config --gpu=false ``` # What's new in Orka Desktop 3.1.0 Source: https://docs.macstadium.com/orka/orka-desktop/orka-desktop-310-release-notes Orka Desktop 3.1.0 adds macOS 26 Tahoe guest image support, updated OCI image format compatibility, local storage mounting, and shared clipboard. We are excited to announce the latest [Orka Desktop 3.1.0](https://github.com/macstadium/orka-desktop/releases/tag/3.1.0) release, which includes the following new features and improvements: Support for macOS 26 guest images, updated OCI image format compatibility, local storage mounting accessible from within the Orka Desktop UI, and shared clipboard functionality. ## New Features ### macOS 26 Tahoe guest image support: #### Key capabilities: Orka Desktop 3.1.0 brings with it support for running macOS 26 Tahoe guest VM images. This allows Orka Desktop users to start using Tahoe guest images for their VMs. #### Getting started: Get started with Tahoe by downloading the latest Tahoe image from [OrkaHub](https://orkahub.com/), or our [Tahoe package](https://github.com/orgs/macstadium/packages/container/package/orka-images%2Ftahoe) in the MacStadium orka-images repository on GitHub. You can run Tahoe guest VMs using the Orka CLI or Orka Desktop. #### Technical requirements: * A Sequoia 15.5+ host is required in order to run a macOS Tahoe 26 guest image. * Orka does not currently officially support running Tahoe on a host machine. We will support macOS 26 hosts in the upcoming Orka 3.6.0 release. ### Improvements * Clipboard sharing is now supported * Clipboard sharing and host folder sharing features both require Orka VM tools v3.5.0 to be installed in the VM * Available via [brew](https://formulae.brew.sh/cask/orka-vm-tools) or direct download at: [https://orka-tools.s3.us-east-1.amazonaws.com/orka-vm-tools/official/3.5.0/orka-vm-tools.pkg](https://orka-tools.s3.us-east-1.amazonaws.com/orka-vm-tools/official/3.5.0/orka-vm-tools.pkg) * Local storage mounting is available via the Orka Desktop UI VMStorageUI.png * An updated OCI image format is now supported ### Known issues When running macOS 15.6.1 and attempting to install a VM from the “latest” IPSW using Orka Desktop, the VZ API downloads the macOS 26 Tahoe IPSW. However, the installation fails with a popup message urging users to update the software. failedVMinstallDesktop.png #### Workarounds: * macOS 15.6.1 users can resolve this issue using any of the following workarounds: * Install XCode 26 - This enables Tahoe VM installation with Orka Desktop * Download a specific IPSW - Manually select an IPSW instead of using “latest” * Upgrade your host machine - Update your host machine to macOS Tahoe ### Bug fixes * VMs now duplicate correctly * Orka Desktop no longer sporadically crashes when pushing/pulling an image from an OCI repository * Dynamic resolution and DPI settings are now retained after pulling an image # Orka Desktop 3.0 local macOS virtualization tool Source: https://docs.macstadium.com/orka/orka-desktop/welcome-to-orka-desktop-30 Free macOS virtualization for individual workstations. Build and test VM images locally, then push to an OCI registry for use in a shared Orka cluster. ## Orka Desktop by MacStadium **Orka Desktop** is a free, no-obligation virtualization tool designed for individual macOS workstations. These workstations can be a local MacBook, a hosted Mac mini or Studio by MacStadium, AWS, or an on-premises solution. Once deployed, **Orka Desktop** lets you create a seamless workflow for running the same image on any device. You can build and test an image locally, then upload it to the cloud. This is much easier than needing bespoke technologies and individual processes to test, share, and configure virtualized images. **Orka Desktop** integrates with other cloud-based, licensed MacStadium products, like **Orka**. For example, you can upload an image built and tested with **Orka Desktop** to a container repository shared with an Orka cloud instance. Publishing local images to the Orka cloud means you can develop locally and deploy globally, offering flexibility, scalability, and an on-ramp to use MacStadium products more effectively. You can publish any image to a container registry, for example, GitHub Packages or DockerHub, and then pull it into the **Orka Cluster**. Orka Desktop is available from the following locations: * MacStadium website: [macstadium.com](https://www.macstadium.com/) * GitHub releases: [macstadium/orka-desktop](https://github.com/macstadium/orka-desktop/releases) * Homebrew: `brew install orka-desktop` **Orka Desktop Requirements** Apple M1 with 8GB RAM, and 50GB disk space macOS 15.0+ (Sequoia) **Registry Requirements** 1. Pull - You can pull from the registry 2. Push - You can push to the registry 3. Content Discovery - You can list or otherwise query the content stored in the registry 4. Content Management - You can control the full life cycle of the content stored in the registry All registries conforming to this specification must support all APIs in the Pull category. Registries should also support the Push, Content Discovery, and Content Management categories. A registry claiming conformance with one of these specification categories must implement all APIs in the claimed category. ## OCI Image Overview The Open Container Initiative (OCI) is an open governance structure for the express purpose of creating open industry standards around container formats and runtimes. You can deploy a VM using a compatible image from a private or public registry, and store images in your own registry. ## Installation and Set Up in 3 Easy Steps **Orka Desktop** has a clear and intuitive GUI, which makes it easy to transition to using Orka in the cloud. It provides information about your system, available images, and VMs. 1. Download Orka Desktop. Move to your Applications folder. Run Orka Desktop. 2. Create a New Virtual Machine (VM). There are two options for creating a new VM: * **Clean Install**, where the image is created from an existing IPSW file. * **Pull Image**, where the image is pulled from an Image Repository (based on an existing OCI image that is available via a Container Registry). 3. Use the VM. * IPSW (Apple Software/Firmware) is a file format used in macOS firmware for devices equipped with Apple silicon. * There is also the option to pull the latest IPSW directly from Apple's servers, which is detailed in the Other IPSW Options section. ## Downloading Orka Desktop * MacStadium website: [macstadium.com](https://www.macstadium.com/) * MacStadium GitHub repo: [macstadium/orka-desktop](https://github.com/macstadium/orka-desktop/releases) * Brew package manager: `brew install orka-desktop` Orka Desktop main interface showing system information and VM list *Orka Desktop* Orka Desktop download confirmation dialog *Confirmation Box* ## Creating a New Virtual Machine (Clean Install via IPSW Files) 1. Download Orka Desktop. 2. Open the Orka Desktop tool and the *System Information* screen displays. 3. Click + **Create New VM**.\\ Create New VM button in Orka Desktop 4. When the new Virtual Machine dialog box opens, select **Clean Install** (based on an IPSW); then use the **Name** field to name the VM.\\ New VM dialog with Clean Install selected and Name field * In this example, the new VM is called New Name Here, and at the same time, that name appears on the left-hand side of the screen, under the list of available Virtual Machines. * The VM is now in a pending installation state. 5. If you want to select an existing IPSW file, select **Other** from the dropdown menu.\\ IPSW dropdown with Other option highlighted to select an existing file *Other (to select from an existing IPSW file)* Selecting the **Other** dropdown opens a folder where you can pick the existing IPSW file to install. 6. If you do not have a local IPSW file to use for the new VM, select Download Latest to get the latest files from Apple.\\ IPSW dropdown with Download Latest option highlighted *Download Latest (to get the latest files from Apple)* Selecting the Download Latest dropdown opens a confirmation box. 7. Use the stepped sliders to manually adjust the number of CPUs, and the amount of Memory and Storage that you want to allocate to the VM.\\ VM resource sliders for CPU count, memory, and storage allocation *Confirmation Box* 8. Use the Display Resolution dropdown to set the resolution of the screen when running Console into the image. 9. Use the Image Data Location to select the location of the saved files.Image Data Location field in VM creation settings\ *Image Data Location* 10. Click Install and the progress bar displays the install progress. When the install completes, there is a new VM available on the Orka Desktop, which can be used to Start, Pause, Resume, Stop, or Console into. ## Creating a New Virtual Machine (Pull from OCI Image) 1. Download Orka Desktop. 2. Open the Orka Desktop tool and the *System Information* screen displays. 3. Click + **Create New VM**Create New VM button in Orka Desktop 4. When the new Virtual Machine dialog box opens, select **Pull from an Image**; then use the **Name** field to name the VM.\\ New VM dialog with Pull from an Image option selected *Pull from an Image* * In this example, the new VM is called New VM Pulled From Image, and at the same time, that name appears on the left-hand side of the screen, under the list of available Virtual Machines. * The VM is now in a pending installation state. 5. Complete all fields with the required information. 6. Use the stepped sliders to manually adjust the number of CPUs, and the amount of Memory and Storage that you want to allocate to the VM. 7. Use the Display Resolution dropdown to set the resolution of the screen when running Console into the image.\\ VM display resolution and resource configuration fields 8. Click **Pull**. Configuration warning message for exceeded recommended VM resource limits ### Configuration Warnings When adding CPU Count and Memory Size, the Orka Desktop application displays a warning message if the recommended sizes are exceeded. CPU Count Warning for exceeding recommended limit *CPU Count Warning* Memory Size Warning for exceeding recommended limit *Memory Size Warning* ## Starting the VM 1. Click an existing VM on the left-hand side. In this example, the VM is Orka3. 2. Click Start.\\ Start button for a selected VM in Orka Desktop 3. A separate window opens and the VM starts. VM starting in a separate window in Orka Desktop *VM Starting* Starting a VM for the first time may take several minutes. * This VM might be configured to run a different version of macOS from your host, so you can test the same software in two different environments. Note that you can only use OSs in VMs that are more recent than the OS running on the host. * You can install Xcode and use the VM as a build machine for iOS apps. * IT admins can test Mobile Device Management (MDM) profiles using VMs without maintaining several Mac mini machines. You can perform MDM profile testing on a VM created by Orka Desktop. * Apple has limited the ability to sign into iCloud with an Apple ID within a VM. ## Stop a VM If a VM is running, then click the Start button to Stop it. Stop button for a running VM in Orka Desktop ## Console into a VM Think of this functionality as a graphical console, which opens the VM display in a UI screen. In other words, it opens a new screen for interactions with guest OS. Console button to open graphical VM display in Orka Desktop ## Resume VM Resumes a VM that was paused. Resume button for a paused VM in Orka Desktop ## Push to OCI Registry You can push the image to an OCI registry so that others can download and use it. This is helpful for sharing an image across a team. For example, an IT admin can create and configure an image and push it to a shared location, then team members can access that image and begin using it. You can also push an image to a shared registry for testing purposes. 1. Select an existing VM. 2. Click **Push to OCI Registry**.Push to OCI Registry button for a selected VM 3. Complete the required fields and click **Push**.Push to OCI Registry form with registry credentials fields 4. A progress bar appears while the image is being pushed. Progress bar while image is being pushed to OCI registry *Progress Bar* Push success message after image is pushed to OCI registry *Push Success Message* ## Managing the VM Right-click an existing VM to display a dropdown menu. Right-click context menu on a VM showing Duplicate, Push to OCI Registry, and Delete options *Right Click on VM* * **Duplicate** = Duplicate can be used for upgrade testing. Use Duplicate to create a copy of the existing VM, then test the upgrade to a new VM. * **Push to OCI Registry** = Push your image to an OCI registry. * **Delete** = Delete is used to delete the VM from Orka Desktop. ## Log Files The following information is found in the log file: directory, image directory, and default VM settings. The log file has four sections, with the following information: * Node Info (Contains system details, for example, chip, cores, memory, OS version, and so on). * Image Info (Lists images, creates new image, deploys new VM based on an image). * VM Details (For each running VM, there are actions like, Open Screenshare, Open SSH, Stop, Save, Save As, View Log actions). * Logs (Running logs, and any other useful information for debugging.) Orka Desktop log file view with Node Info, Image Info, VM Details, and Logs sections ## About Click About to confirm the version number of the product. Orka Desktop About screen showing product version number ## Settings Use to set log file location, VM directory, and other information. Orka Desktop Settings panel with log file location and VM directory options * Orka Desktop automatically starts a Console (screen share) session with the VM when Start is selected. * Managing and debugging issues with the VMs is made simple with a comprehensive list of actions available, including the ability to view and traverse log files and other artifacts. ## Other IPSW Options Download the appropriate files from [developer.apple.com](https://developer.apple.com). Apple Developer portal IPSW download page ## Personal Access Token (PAT) with GitHub A Personal Access Token (PAT) is used to push or pull from a container repository hosted by GitHub (ghcr.io). First, create a PAT and use those credentials. Other container repositories may only use a username and password for credentials. Consult the instructions for the container repository you are using. To use ghcr.io with Orka Desktop, see the [GitHub documentation](https://docs.github.com/en). ## Community and Support Use the GitHub project for your support needs. The [Discussions](https://github.com/macstadium/orka-desktop/discussions) section is available for questions, feedback, or sharing your use case, and the [Issues](https://github.com/macstadium/orka-desktop/issues) section is for filing bugs or feature requests. # Buildkite Source: https://docs.macstadium.com/orka/orka-devops-integrations/buildkite Connect Orka to Buildkite with the MacStadium plugin. Use permanent agents reused across builds or ephemeral agents created per pipeline run. How to use Buildkite with your Orka environment. MacStadium provides seamless **[integration between Orka and Buildkite](https://github.com/macstadium/orka-integrations/tree/master/Buildkite)**. You can work with permanent or ephemeral agents. Orka 3.1.x and above requires version [v2.0.0+](https://github.com/macstadium/orka-integrations/releases/tag/v2.0.0) of the plugin. ## Set Up a Permanent Agent Permanent agents are useful when you need to reuse your agents frequently and you don't want to recreate them every time. For the latest information about how to set up a permanent Buildkite agent, see [Using a Permanent Buildkite Agent to Run CI/CD Pipelines in Orka](https://github.com/macstadium/orka-integrations/tree/master/Buildkite/permanent-agent.md). ## Set Up an Ephemeral Agent Ephemeral agents are useful when you want to automatically create and delete agents based on the needs of your workflows. For the latest information about how to set up an ephemeral Buildkite agent, see [Using an Ephemeral Buildkite Agent to Run CI/CD Pipelines in Orka](https://github.com/macstadium/orka-integrations/tree/master/Buildkite/ephemeral-agent.md). # Claude Code integration with the Orka3 CLI Source: https://docs.macstadium.com/orka/orka-devops-integrations/claude-code Use Claude Code with the Orka3 CLI skill to deploy VMs, troubleshoot cluster issues, and automate CI/CD workflows on your Orka environment from the terminal. The Orka3 CLI skill gives [Claude Code](https://claude.ai/code) deep knowledge of the Orka CLI and, when you're authenticated and connected to the VPN, the ability to run commands directly against your cluster. You can ask questions in plain English, have Claude generate and execute `orka3` commands on your behalf, or use it to build and test automation workflows, all from your terminal. Direct cluster access requires an active VPN connection and an authenticated `orka3` session. Without those, Claude answers from documentation only and suggests commands for you to run yourself. ## What You Can Do **Ask questions and get accurate answers** * "What images are available in my namespace?" * "What's the difference between `vm save` and `vm commit`?" * "How do I pre-cache an image across all ARM nodes?" **Have Claude run commands for you** With your permission, Claude can execute `orka3` commands directly: deploy VMs, check node status, manage images, create service accounts. You confirm before anything runs. **Build and test automation** Claude can help you write CI/CD pipeline configuration, generate service account setup scripts, and test workflows end-to-end against a live cluster. **Troubleshoot live issues** * "My VM deployed but SSH isn't working. Check what's running." * "Image pull is stuck at Pending. What's the status?" * "List all VMs in the staging namespace and show me which ones are idle" ## How It Works The skill loads as a system prompt when you open Claude Code. It gives Claude structured knowledge about: * Every `orka3` command and its flags * CI/CD authentication patterns (service accounts, token scopes) * Intel vs. Apple silicon feature differences * Async operation patterns (save, commit, push, imagecache) * Common error messages and how to resolve them When the `orka3` CLI is available in your environment, Claude can also run commands directly and interpret the output in context. ## Getting Started Installation instructions and the full skill source are in the GitHub repository: **[github.com/macstadium/orka3-cli-claude-skill](https://github.com/macstadium/orka3-cli-claude-skill)** You'll need Claude Code installed and a valid Anthropic API key. The skill installs in a single command. ## Tips for Getting the Most Out of It * **Give Claude context about your environment.** Mention whether you're on Intel or Apple silicon nodes, and which Orka version you're running. Claude will tailor commands accordingly. * **For CI/CD questions, describe your pipeline.** Tell Claude which CI platform you're using and whether you're running inside a container. The auth approach is different. * **Ask follow-up questions.** If a suggested command doesn't match your setup, explain why and Claude will adjust. * **For long-running operations, ask how to check status.** Image saves, commits, and pushes are async. Claude knows the right status-check commands. # GitHub Actions integration for Orka Source: https://docs.macstadium.com/orka/orka-devops-integrations/github-actions Run macOS CI/CD builds on Orka with GitHub Actions using dynamic ephemeral runners. Runners scale automatically with demand and deprovision after each job. MacStadium provides a dynamic ephemeral runner integration for GitHub Actions. Runners scale automatically based on demand, so you're not paying for idle VMs between builds. If you are on Orka 3.1.x, run the most recent [release version](https://github.com/macstadium/orka-github-actions-integration/releases) to get the latest features and fixes. ## Set Up the Dynamic Ephemeral Runner For setup instructions and the latest documentation, see the [orka-github-actions-integration](https://github.com/macstadium/orka-github-actions-integration/) repository. # GitLab Source: https://docs.macstadium.com/orka/orka-devops-integrations/gitlab Connect Orka to GitLab CI/CD with the MacStadium integration. Use Shell executors for permanent runners or custom executors for ephemeral, per-pipeline VMs. How to use GitLab with your Orka environment. MacStadium provides seamless **[integration between Orka and GitLab](https://github.com/macstadium/orka-integrations/tree/master/GitLab)**. Both Shell and custom executors are supported. MacStadium provides scripts and a template configuration for custom executors. Orka 3.1.x and above requires version [v2.0.0+](https://github.com/macstadium/orka-integrations/releases/tag/v2.0.0) of the integration. ## Set Up a Shell Executor Shell executors are useful when you need permanent executors that you can reuse across builds. For the latest information about how to work with a Shell executor in Orka, see [Using a GitLab Shell Executor to Run CI/CD Pipelines in Orka](https://github.com/macstadium/orka-integrations/blob/master/GitLab/shell-executor.md). ## Set Up a Custom Executor Custom executors are useful when you need to work with ephemeral executors and automate their management. With a custom executor, an executor is created before the pipeline is run and destroyed after the pipeline is complete. For the latest information about how to work with a custom executor in Orka, see [Using a GitLab Custom Executor to Run CI/CD Pipelines in Orka](https://github.com/macstadium/orka-integrations/blob/master/GitLab/custom-executor.md). Cache restoration and artifact downloading require the `gitlab-runner` binary to be present inside the Orka VM. If your pipeline logs show "Missing gitlab-runner. Extracting cache is disabled." or "Missing gitlab-runner. Artifacts downloading is disabled.", install the `gitlab-runner` binary in your base image before creating your VM config. ## Run concurrent builds By default, the [config template](https://github.com/macstadium/orka-integrations/blob/master/GitLab/template-config.md) sets `concurrent = 1`, which means only one build runs at a time. To run multiple builds simultaneously, update two settings in your `config.toml`: * `concurrent` (global): the total number of jobs that can run at the same time across all runners. * `limit` (per runner, under `[[runners]]`): the maximum number of jobs this specific runner handles concurrently. Both values should match. For example, to allow 10 concurrent builds: ```toml theme={null} concurrent = 10 [[runners]] name = "orka-runner" executor = "custom" limit = 10 ... ``` See the [GitLab Runner advanced configuration](https://docs.gitlab.com/runner/configuration/advanced-configuration.html) for the full list of options. # Jenkins plugin for Orka macOS build agents Source: https://docs.macstadium.com/orka/orka-devops-integrations/jenkins Provision permanent and ephemeral macOS build agents with the Orka Jenkins plugin. Covers plugin installation, agent configuration, and credential setup. How to use Jenkins with your Orka environment. The [**Orka by MacStadium plugin for Jenkins**](https://plugins.jenkins.io/macstadium-orka) lets you provision permanent and ephemeral Jenkins agents in your Orka environment. The provisioning of permanent agents is useful when you need to have complete manual control over the process and the lifecycle of the agents. The provisioning of ephemeral agents is useful when you need to automatically create and delete agents based on the needs of your workflows. Orka 3.1.x and above requires version [v2.0.0+](https://github.com/jenkinsci/macstadium-orka-plugin/releases/tag/macstadium-orka-2.01) of the plugin. If you are running Orka 2.x, use plugin version 1.35. ## Install the Plugin The Orka by MacStadium plugin is available in the [Jenkins Plugin Manager](https://plugins.jenkins.io/macstadium-orka). For more information about how to install publicly available Jenkins plugins, see [Jenkins Documentation: Managing Plugins](https://jenkins.io/doc/book/managing/plugins/). If you need to manually build, package, and run the plugin yourself, visit the [plugin repo](https://github.com/jenkinsci/macstadium-orka-plugin) for the latest information. ## Provision Agents with the Plugin Your Jenkins master must be connected to your Orka environment through VPN before provisioning agents. Use a [VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection) for temporary connectivity, or set up a [site-to-site VPN tunnel](/orka/networking-with-orka-at-macstadium/aws-orka-connections) for a persistent connection. The [Orka by MacStadium plugin wiki](https://wiki.jenkins.io/display/JENKINS/Orka+by+MacStadium) provides the latest information about how to use the plugin. If you are deploying Apple silicon images for the first time on an ARM-based node, increase the Jenkins agent connection timeout to account for the longer initial boot time. ## How to Enable Logging for the Orka Plugin for Jenkins If you're troubleshooting issues with the Orka plugin for Jenkins (current version: [**v2.09**](https://github.com/jenkinsci/macstadium-orka-plugin/releases/tag/macstadium-orka-2.09)), you can enable detailed plugin logging directly from the Jenkins interface using the built-in System Log feature. ## Steps to Enable the Orka Plugin Logger 1. In Jenkins, go to **Manage Jenkins** -> **System Log**. 2. Click **Add new log recorder**. 3. Enter a name for the log recorder (e.g., `Orka Plugin`). 4. Click **Add** under **Loggers**. 5. In the **Logger** field, enter: ``` io.jenkins.plugins.orka ``` 6. Set the **Log Level** to **All**. 7. Click **Save**. Jenkins will now capture detailed logs for the Orka plugin. You can view them by returning to **Manage Jenkins** → **System Log** and selecting the recorder you created. ## Performance Note Using the **All** log level is the most verbose setting and can slow down Jenkins. If you notice performance degradation, you can limit logging to the core cloud class instead: * In the **Logger** field, use: ``` io.jenkins.plugins.orka.OrkaCloud ``` * Keep the log level set to **All**. This collects the most relevant logs while reducing overall volume. ## Plugin Requirements * **Orka by MacStadium 3.0+** -- The current plugin requires Orka 3.0 or later. * A **VPN connection** to your Orka environment is required. Your Jenkins master must have network visibility to the Orka cluster. ## Need More Help? If you're still experiencing issues after reviewing the logs, contact [MacStadium Support](mailto:support@macstadium.com) and include the log output for faster troubleshooting. # Packer plugin for automated Orka image builds Source: https://docs.macstadium.com/orka/orka-devops-integrations/packer Automate macOS image creation with the Orka Packer Plugin. Define image configurations as code and integrate Orka image builds into your CI/CD pipeline. How to use Packer with your Orka environment The **[Orka Packer Plugin](https://github.com/macstadium/packer-plugin-macstadium-orka)** works with Packer and lets you automate the creation of Orka golden images. Tired of manually configuring and building your Orka images? The Orka Packer plugin is a great tool to use for automating your image builds. Not only is it easy to use and a great addition to any CI/CD pipeline, it can be used with additional plugins, such as Jenkins. Orka 3.1.x and above requires version [3.0.0+](https://github.com/macstadium/packer-plugin-macstadium-orka/releases/tag/v3.0.1) of the plugin. ## Before You Begin ### VPN connectivity Make sure that your local environment is connected to your Orka environment through VPN. You can use a [VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection) to establish temporary connectivity, or you can create a [site-to-site VPN tunnel](/orka/networking-with-orka-at-macstadium/aws-orka-connections) to keep the connection alive at all times. ### Service account token The plugin requires an `orka_auth_token` to authenticate with your Orka cluster. This **must** be a service account token. Personal user tokens expire after one hour, which is typically not enough time for a full image build, and will cause builds to fail mid-run. **Step 1: Create a service account** ```bash theme={null} orka3 sa create packer-sa ``` You only need to do this once. Use a descriptive name that makes the purpose of the account clear. **Step 2: Generate a token** ```bash theme={null} orka3 sa token packer-sa ``` By default, service account tokens are valid for one year. Copy the token value from the output. **Step 3: Store the token as a secret** Store the token in your CI/CD platform's secret manager (for example, GitHub Actions secrets, GitLab CI/CD variables, or Jenkins credentials). Name it `ORKA_AUTH_TOKEN`. Never commit the token value to your repository. **Step 4: Reference the token in your Packer template** Declare the variable so Packer reads it from your environment at build time: ```hcl theme={null} variable "orka_auth_token" { default = env("ORKA_AUTH_TOKEN") } source "macstadium-orka" "image" { orka_auth_token = var.orka_auth_token # ... } ``` Then pass the variable when running builds locally: ```bash theme={null} ORKA_AUTH_TOKEN= packer build template.pkr.hcl ``` In CI/CD, the secret is injected automatically as an environment variable, so no extra steps are needed if you've named it `ORKA_AUTH_TOKEN`. ## Working with the Plugin For latest information on installing the plugin, please visit **[Orka Packer Plugin Installation](https://github.com/macstadium/packer-plugin-macstadium-orka/blob/main/README.md)**. For latest information on using the plugin, please visit **[Orka Packer Plugin Usage](https://github.com/macstadium/packer-plugin-macstadium-orka/blob/main/docs/USAGE.md)**. For latest information on configuring the plugin, please visit **[Orka Packer Plugin Configuration](https://github.com/macstadium/packer-plugin-macstadium-orka/blob/main/docs/builders/config.mdx)**. Looking for a working starting point? Ready-to-use Packer templates are available on [OrkaHub](https://orkahub.com). Find them in the [packer-plugin-macstadium-orka](https://github.com/macstadium/packer-plugin-macstadium-orka) repository and copy or adapt them for your own image builds. **Contributing:** The Orka Packer Plugin is open-sourced under the GNU GPL v3 license. To raise an issue with the plugin feel free to describe it by [opening a new issue in the Github repository](https://github.com/macstadium/packer-plugin-macstadium-orka/issues/new). To contribute to the source code by fixing a bug or adding a feature, review the [CONTRIBUTING guidelines](https://github.com/macstadium/packer-plugin-macstadium-orka#contributing). # TeamCity plugin for Orka macOS build agents Source: https://docs.macstadium.com/orka/orka-devops-integrations/teamcity Connect Orka to TeamCity using the MacStadium plugin to provision and destroy ephemeral macOS build agents. Covers plugin installation and configuration. How to use TeamCity with your Orka environment. MacStadium provides seamless **integration between Orka and [TeamCity](https://www.jetbrains.com/teamcity/)**. The TeamCity plugin automatically spins up and destroys ephemeral agents. Orka 3.1.x and above requires version [2.0.0+](https://plugins.jetbrains.com/plugin/13662-orka-by-macstadium/edit/versions/stable/433857) of the plugin. ## Set up the integration Make sure that your TeamCity server is connected to your Orka environment through VPN. You can use a [VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection) to establish temporary connectivity, or you can create a [site-to-site VPN tunnel](/orka/networking-with-orka-at-macstadium/aws-orka-connections) to keep the connection alive at all times. MacStadium provides a TeamCity plugin that you need to install and configure. Install it directly from the [JetBrains Marketplace](https://plugins.jetbrains.com/plugin/13662-orka-by-macstadium). For the latest information about how to set up the TeamCity plugin, see [Orka by MacStadium TeamCity Plugin Setup](https://github.com/macstadium/orka-teamcity-plugin/blob/master/wiki/setup.md). For the latest information about how to use the TeamCity plugin, see [Orka by MacStadium TeamCity Plugin Usage](https://github.com/macstadium/orka-teamcity-plugin/blob/master/wiki/usage.md). ## Known issues * You might experience a timeout when deploying an Apple ARM-based agent from a VM config for the first time on a node. Every subsequent deployment on the same ARM-based node though will be successful. # Managing your Orka license Source: https://docs.macstadium.com/orka/orka-engine/managing-your-orka-license Access the LicenseSpring customer portal for your Orka Engine license: find credentials, monitor seat usage, and track node activations across hosts. Your Orka license is managed through the LicenseSpring customer portal, a separate system from the MacStadium portal. This page covers how to get in, what your credentials are, and what you can do once you're logged in. ## Portal access **Portal URL:** [macstadium.users.licensespring.com](https://macstadium.users.licensespring.com) MacStadium creates your portal account when your license is provisioned. Your login credentials arrive in the same email that delivers your license key, so no separate signup is needed. ### Your credentials | Field | Value | | -------- | ----------------------------------------------------- | | Email | The email address on your MacStadium account | | Password | The generated password in your license delivery email | Your portal password is separate from your MacStadium portal password. The email address is the same. Change your password on first login. If you need to reset credentials or can't locate them, contact [support@macstadium.com](mailto:support@macstadium.com). ## What you can see The portal shows the current state of your license: * Your license key * License type (trial or commercial) * Current seat usage: active nodes vs. your maximum * License expiry date * Activation history ## Revoking a node activation Orka Engine licenses are floating, meaning the seat limit is concurrent, not total. If a node is decommissioned or replaced and the old activation is still holding a seat, you can release it from the portal. Find the activation in your license history and select the option to revoke it. The seat becomes available immediately. ## Email notifications LicenseSpring sends automatic notifications to your portal email when: * Your license expires in 30 days * Your license has expired * A node activates your license * You are approaching your seat limit * Your seat limit has been reached ## Getting help For questions about your license, seat increases, or renewals, contact [support@macstadium.com](mailto:support@macstadium.com). # Orka Engine standalone macOS VM management Source: https://docs.macstadium.com/orka/orka-engine/orka-engine-30 Deploy and manage macOS VMs on Apple silicon hosts via CLI without a Kubernetes control plane. Uses OCI-compatible images for lightweight VM provisioning. Orka Engine provides macOS virtualization via Command Line Interface (CLI) on individual hosts without complex orchestration layers. It can automate the deployment and management of VMs on macOS servers within a data center, supporting the ability to run VMs based on different images. ## Key Concepts * A host (or node) is a physical computer with a host macOS and an installation of Orka Engine. * An image is the bits on disk representing a VM that can be used for saving state and sharing. * MacStadium base VM Orka images are macOS OCI-compatible VM images stored in the public GitHub Container Registry at [ghcr.io/macstadium/orka-images](https://ghcr.io/macstadium/orka-images). No credentials are required to pull from this registry. ## What’s in the Release * Deploy Orka Engine on an Apple silicon host on private or public infrastructure via a Command Line Interface (CLI). * List Virtual Machines and running status * Restart Virtual Machines * Stop Virtual Machines * Clone Virtual Machine images * Edit Virtual Machine settings (CPUs, Memory, Display Resolution, DPI) * Delete Virtual Machines * Save Virtual Machines * Push VMs to OCI-compliant registry * Pull VMs from OCI registry * List available VM images on local file system * Copy VMs on local file system * Delete VMs from local file system * Create and deploy Orka OCI compliant VM images * Deploy headless VMs (no display console) ## System Requirements * Apple silicon Mac (M1 or later) with 8 GB RAM and 50 GB disk space * macOS 15.0+ (Sequoia) ## Obtaining an Orka License Key Your license key is included in your order confirmation from MacStadium. If you don't have it, retrieve it from the [customer portal](https://macstadium.users.licensespring.com) or contact [support@macstadium.com](mailto:support@macstadium.com). For portal access and credential details, see [Managing your Orka license](/orka/orka-engine/managing-your-orka-license). Activate your license: `orka-engine license set --key YOUR_KEY` You can also download Orka Engine directly at: [https://distribution.macstadium.com/orka-engine/official/3.6.0/orka-engine.pkg](https://distribution.macstadium.com/orka-engine/official/3.6.0/orka-engine.pkg) ## Installation To install Orka Engine on any Apple silicon Mac (M1 or later) running macOS 15.0 (Sequoia) or later, download and run the installer package. The Orka Engine installer is self-guided and takes less than a minute to install successfully. Simply double click or right click open the **orka-engine.pkg** file from the source download directory and follow the prompts. macOS installer window for orka-engine showing the Introduction step Orka Engine app icon showing an orca whale with a terminal prompt symbol ## Getting Started The following commands will quickly introduce basic features of the Orka Engine CLI including: * Open Terminal * Run `orka-engine --help` to see the CLI tree structure: commands, subcommands and options/flags. * Run (deploy) a new VM based on Apple's latest IPSW file using `orka-engine vm run` * List the VM and its status (running) with the `orka-engine vm list` * Save that VM as an image using `orka-engine vm save` * Listing images available on disk with `orka-engine image list` * Stop a VM with **ctrl-c** in terminal window bound to running VM or by closing the Dock item * Run a base template VM image hosted from MacStadium using `orka-engine vm run` * `orka-engine vm run latest-sonoma --image ghcr.io/macstadium/orka-images/sonoma:latest` * Pulling remote images locally using `orka-engine image pull` * Starting a VM in the stopped state with `orka-engine vm start` * Pushing a configured CI/CD customized VM to an OCI container registry `orka-engine image push` ## Open Terminal After Orka Engine is installed, open a terminal window. The command `orka-engine` is installed at `/usr/local/bin/orka-engine` - this should be in the \$PATH for most users by default. ## Using orka-engine --help The `orka-engine --help` command lists the three subcommands, `vm` to manage VMs, `image` to manage images, and `host` to see information about the host. `orka-engine vm --help` provides a list of operations that can be taken on VMs, such as `run`, `list`, `save`, and `start`. `orka-engine vm run --help` provides details on all the options that can be provided when taking the `vm run` operation. ## Running a VM Based on the Latest IPSW File Orka Engine can download the latest IPSW and start a VM with a hard disk of 90 GB. To get started with Orka Engine, run the first VM. If there is no locally stored image, then the quickest way to get started is to use the most recently published IPSW files. Orka Engine has a built-in ability to download the latest IPSW and start a VM with a hard disk of 90 GB using the following command: ``` orka-engine vm run latest-ipsw --ipsw latest --disk-size 90 ``` `orka-engine vm run` is a blocking function. Open another terminal window to interface with orka-engine for other functions while the VM is running. Stop a VM with **ctrl-c** or via the UI window **Menu - > Quit**. ## Common Options when Running a VM Orka Engine provides a number of options to control the VM runtime, including specifying CPU, memory, disk, and display details. If no options are provided, then defaults are used. The following example sets CPU allocation of 4, memory allocation of 8GB, and display resolution settings for 4K with a 23” display (3840 x 2160, DPI=185): ```bash theme={null} orka-engine vm run sonoma-base-4k --ipsw latest --disk-size 90 --cpu 4 --memory 8192 --display-width 3840 --display-height 2160 --display-dpi 185 ``` **Another common option is to run headless, and Orka Engine provides an option:** The `--disable-graphical-console` flag: * Runs the VM without VNC access * Reduces resource overhead * Is ideal for automated testing and CI/CD pipelines * Ensures the VM remains accessible via SSH (if configured) Without the graphical console, you must use SSH or other non-GUI methods to interact with the VM. ```bash theme={null} orka-engine vm run sonoma-base --image latest-ipsw --disable-graphical-console sonoma-fix ``` ## Listing Current Running VMs Orka Engine can list the name and resource consumption of VMs that are currently running or stopped on a local host. Terminal output of orka-engine vm list showing a VM named latest-ipsw with 2 CPUs, 4096M memory, in running state ## Saving a VM as an Image To configure the VM with different macOS settings, install dependencies or tools, or configure a bug reproduction environment. Save the current state of a running VM as an image, as long as the VM name is available (see `orka-engine vm list` command for the VM name). For example, `orka-engine vm save latest-ipsw sonoma146-vanilla` saves the VM called `latest-ipsw` as an image with the name **sonoma146-vanilla**. Terminal confirmation: The image 'sonoma146-vanilla' for VM 'latest-ipsw' has been successfully saved ## Listing Images Available on Disk Orka Engine lists the images that are available on the local host. These images are used for starting a new VM immediately. ## Stopping a VM To stop a headless VM or a VM with a display console, enter **ctrl-c** (from the terminal window the VM was started with), or if deployed with a display console, by choosing the Apple icon in the VM and selecting Shut Down…. ## Running a VM Based on a MacStadium Hosted Image MacStadium hosts a number of Sequoia, Sonoma, and Ventura images on [GitHub - macstadium/orka-images: Public images for Apple silicon-based Orka virtual machines](https://github.com/macstadium/orka-images/). In `orka-engine vm`, specify an `--image` option to be the URL of an image coming from an OCI registry. ```bash theme={null} orka-engine vm run sonoma-latest --image ghcr.io/macstadium/orka-images/sonoma:latest ``` ``` Starting VM sonoma-latest with MAC address f6:59:c1:15:5e:cb ``` 1. Once the GUI starts up, the credentials are **admin/admin**. 2. Once logged in, the VM is ready for use or additional software and tools installation. ## Reviewing Current List of VMs (in VMs orka-engine) It is now possible to start a second terminal and run `orka-engine vm list`, and the following output appears, (which indicates that the previously running `latest-ipsw` VM has been stopped), and the recent `sonoma-latest` is now running. ``` NAME CPU MEMORY STATE latest-ipsw 2 8192M running sonoma146-vanilla 2 4096M stopped sonoma-latest 2 4096M stopped ``` Once VMs are in a stopped state, they can either be: * left in a stopped state * restarted with the `orka-engine vm start ` * deleted with the `orka-engine vm delete` commands To retain these changes, make sure to use `orka-engine vm save`. ## Starting a VM from the Stopped State If the VM `latest-ipsw` is stopped in the above example, then it can be started again with the following command: `orka-engine vm start` ## Deleting a VM If the VM `latest-ipsw` is stopped in the above example, then it can be deleted with the `orka-engine vm delete ` command. ## Pulling Remote Images Locally In previous examples, `orka-engine vm run` was used to both *pull* (or download) a remote image to the local device and to *run* the VM. There are cases where users may just want to download an image, and `orka-engine image pull` supports this. `orka-engine image pull ghcr.io/macstadium/orka-images/ventura:no-sip` `Image pull progress: 100%` When the image pull is complete, it is available in `orka-engine image list` and usable with `orka-engine vm run --image `. ## Pushing local Images to Registry If the previously run sonoma-latest image has been modified and saved with the necessary CI tools, then the image can be shared with team members by storing it on the team OCI repo and naming it **sequoiaCI**; on the repo, use the `orka-engine image push` command. The default local Orka Engine VM image files system path is `/Users//.local/share/orka/data/` where the host\_username is **admin** in this example and the container registry is [ghcr.io](http://ghcr.io/) and the repo credentials are username=**dev1** and password=**repo**. `orka-engine image push --username dev1 --password repo /Users/admin/.local/share/orka/data/sonoma-latest ghcr.io/images/sequoiaCI:latest ` ## Recent Improvements ### Orka Engine 3.5.2 * macOS 26 Tahoe compatibility fixes for image deletion, copying, and tagging * Display resolution now applies correctly for Sequoia guests with custom resolution settings (requires updating Orka VM Tools on existing images) ### Orka Engine 3.5.1 * Fixed sporadic NAT networking failures on M4 Pro nodes. Orka now detects and self-heals NAT connectivity issues automatically. ## Known Issues * Orka Engine VMs may become unresponsive and show a black/blank screen for a few minutes before activating from sleep or a fresh boot. * Orka Engine VMs may show a flickering screen when the mouse or keyboard attempts to wake the VM from sleep mode. * Orka Engine VM may experience slow network performance. * **Workaround**: Restart the VM. * Orka Engine and Orka Desktop share the same VM image directory on the local file system and discrepancies may develop between available VM images, if both applications are installed on the same host and VMs are added or deleted using both applications. # Orka on AWS architecture and deployment overview Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/orka-on-aws-getting-started Deploy Orka on AWS with EC2 Mac nodes, Amazon EKS, and ECR for OCI images. Architecture overview and steps to orchestrate macOS VMs in your AWS account. Orka is an orchestration and virtualization layer for Mac build infrastructures based on Kubernetes and OCI technology. Orka lets you orchestrate macOS in a cloud environment using Kubernetes on genuine Apple hardware. With Orka (also referred to as Orka Cluster) on AWS, you can integrate macOS development and macOS CI/CD directly into your AWS workflows and environments. ## How does Orka on AWS work? The diagram below illustrates the architecture of an Orka Cluster on AWS, detailing how it integrates with Amazon EC2 Mac instances, Amazon EKS (Elastic Kubernetes Service), and Amazon ECR (Elastic Container Registry) within a customer’s AWS account. Orka Cluster on AWS architecture diagram showing EC2 Mac, EKS, ECR, and Orka components within a customer's AWS account The EC2 Mac hosts are set up with Orka AMIs, which provide a stable runtime for virtual machines. Each VM is deployed on the host using an OCI image, which can be fetched from Amazon ECR or an external OCI Registry. The use of OCI images enables rapid deployment (within a few minutes) of different macOS versions, pre-configured with various tools and optionally with SIP (System Integrity Protection) disabled. This addresses challenges that typically exist on Mac EC2 without Orka VMs. An EKS cluster will integrate with CI tools, CLI, or API, and orchestrate workloads, including spin-up and tear-down of VMs, and scheduled caching of images as needed. Key elements in the architecture include: * Customer's AWS Account, which houses all the AWS Cloud components for the Customer. The Orka Cluster is software that is installed into various AWS Cloud components, like EKS, EC2 Mac, and ECR. * Customer's VPC containing Amazon Mac EC2 instances, which run the Orka AMI as the base environment for Orka VMs. Orka VMs dynamically launch workloads as OCI Images from ECR or an external OCI Registry. * An EKS, which runs an Amazon EKS cluster managing Orka EKS components for orchestration and automation. * Amazon ECR serves as a container registry within AWS. Or an external OCI Registry, such as GitHub Container Registry, Docker Registry. * Orka Users interacting with the system via CLI, API, or CI tools. ## Considerations for Deployment in AWS * EKS Deployment * Orka must be deployed in a dedicated EKS cluster running v1.35. Orka limits certain cluster operations (such as what namespaces can be created and what pods can be deployed), and user management is restrictive. We will use a set of Ansible scripts (a common deployment method we follow, independent of the deployment location). For AWS, we will provide an image with the required playbooks & roles. It will be flexible and easy to parameterize, customize, and troubleshoot in case something goes wrong. * Storage * We recommend using ECR or alternative OCI repositories for image storage. * Mac EC2 * We will provide an AMI based on an official AWS macOS base image that includes our tooling (Virtual Kubelet, Orka Engine) and a bootstrap script that accepts the EKS parameters to connect as an Orka worker node. * We have a new AMI available that supports the external NVMe disk available with M4 instances. Per the [official Amazon docs](https://aws.amazon.com/ec2/instance-types/mac/): "Amazon EC2 M4 Mac instances come with a new 2TB instance store volume per EC2 Mac Dedicated Host, providing low latency storage for improved caching and build/test performance." The new AMI is compatible with Orka 3.5 and later, and all EC2 Apple silicon Mac instance types (M1, M2, M4). By default: * The NVMe disk is used for Orka storage of VM and image data on M4 instances only * Autologin is enabled for the `ec2-user`, and is required when running a Sequoia guest OS or newer The `ENABLE_NVME_DISK` and `ENABLE_AUTOLOGIN` variables are **not** required. These are set to `true` by default, and either variable may be disabled if needed: ```bash theme={null} #!/bin/bash export ENABLE_NVME_DISK=false # disable NVMe disk, use EBS storage instead export ENABLE_AUTOLOGIN=false # disable autologin for ec2-user on bootstrap /usr/local/bin/bootstrap-orka ``` * Networking * Apple silicon nodes don’t have a direct tie-in to the traditional k8s networking stack. With Orka, we provide a private network, expose certain ports, and require NATing for access. We do provide modes for network isolation and internet isolation. We provide documentation below for how to expose Orka services outside of the cluster. As of Orka 3.5.0, we also support [bridge networking mode](/orka/orka-on-aws-and-on-prem/using-bridge-networking-with-orka-350), enabling the ability to get an IP on a subnet in your VPC. * User Management and Authorization * Users need to register at portal.macstadium.com, as all user management is handled through the portal service. Customers can also use their own OIDC identity provider. See [OIDC Provider Setup](#oidc-provider-setup) below. * Logging, Monitoring, and Alerting * We provide documentation below on how to centralize logging into CloudWatch, consume metrics, and configure alerts via OpenTelemetry or CloudWatch. * Backups * We will provide an S3-compatible backup target and best practices on what to backup. * API Server SSL * We will provide instructions for putting an AWS load balancer in front of the Orka API and configuring SSL Certificates. ### Networking and VPC Considerations We recommend that you deploy the Orka services to a distinct VPC and implement your networking via VPC peering. This will allow the necessary networking to interact with VMs and the control plane. Within the VPC, the following are ports that should be exposed for different services. * EKS running v1.35 * Orka Operator: TCP 8080 (metrics), TCP 8081 (health check), TCP 443 (webhook), Linux worker nodes should be accessible from within the cluster on any port. Does not require Internet access. * Orka OIDC Provider: TCP 443. Requires connectivity to the authentication provider. * EC2 Mac Nodes * Virtual Kubelet / Orka Engine AMI: Ingress ports can be internal to the cluster network. The customer should allow ingress to all ports within the network. The following ports should be open to all networks that need access to the VMs: TCP 5900-6200 (Screenshare), TCP 5999-6299 (VNC), and TCP 8822-9122 (SSH). In general, we recommend allowing outbound requests uniformly for forward compatibility. > **NOTE**: SSH/Screen Share/VNC ports are globally tracked and allocated. The ranges given above are applicable to each Apple silicon node. ## Install Overview 1. **Talk to your MacStadium Account Team about your Orka on AWS install.** 1. Provide MacStadium with your AWS account ID and region to be used. This is needed so that the Orka AMI can be shared with your account. 2. Follow the installation steps below for the EKS Cluster and the CodeBuild role. 1. **Take note of the EKS Node IAM role and the CodeBuild role ARN.** You'll use these later in this guide to create access entries for each role; you do not need to share them with MacStadium. 3. MacStadium provides customers with an OIDC Client ID to use during CodeBuild execution and with AMI details so they can install Orka software onto EC2 Mac. 4. Follow the steps below to update your build spec with the OIDC Client ID, set up IAM roles so that CodeBuild can manage the EKS cluster, and execute CodeBuild to install Orka Services into the EKS cluster. 5. Follow the steps below to set up the OIDC Provider 6. Follow the steps below to expose the Orka API service via Load Balancer 7. Follow the steps below to configure EC2 Macs to be able to interface with the EKS cluster and install Orka software via AMI. ## EKS Install Steps 1. Orka must be deployed in a dedicated EKS cluster for running v1.35. 1. Orka limits certain cluster operations (such as what namespaces can be created and what pods can be deployed), and user management is restrictive. 2. To set up the cluster, follow the AWS guidelines for [EKS Auto Mode](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-automode.html) or the [EKS QuickStart](https://docs.aws.amazon.com/eks/latest/userguide/quickstart.html). 2. **Recommendations**: 1. Select the same region for the cluster as the one used for deploying the EC2 Mac nodes to avoid costly cross-region traffic. 2. Deploy the cluster in private subnets only, as none of the Orka services need to be accessed from the Internet directly. 3. Deploy at least two Linux worker nodes for resiliency and high availability. 3. **Note down the ARN of the** [**EKS Node IAM role**](https://docs.aws.amazon.com/eks/latest/userguide/create-node-role.html)**.** You'll use it to create an EKS access entry for the node later in this guide (see [EKS Access Policies](#eks-access-policies)). 4. **Optional:** 1. Set Cluster endpoint access to “Private” to restrict access to your cluster API from the Internet. 1. This setting depends on your access needs. All Orka clients (CLI, integrations, etc.) must have connectivity to the cluster. 2. Use EKS API for Cluster authentication mode. 1. This is the [newest authentication mode for EKS](https://aws.amazon.com/blogs/containers/a-deep-dive-into-simplified-amazon-eks-access-management-controls/), replacing the old aws-auth config map. 5. Orka Cluster installs itself into EKS using Ansible scripts. 1. **MacStadium support will provide an OIDC Client ID** 2. Additional considerations 1. The Ansible runner must have connectivity to the cluster API. 2. The Ansible runner must have Cluster Admin privileges to set up the cluster. 3. MacStadium recommends using CodeBuild to run Ansible and configure the EKS cluster. CodeBuild provides direct visibility to the cluster, alleviating networking concerns. ### Set up a CodeBuild project to run Orka Installation into the EKS Cluster MacStadium recommends using CodeBuild to run Ansible and configure the EKS cluster. CodeBuild provides direct visibility to the cluster, alleviating networking concerns. To set up a CodeBuild project as an Ansible runner: 1. **Allow AWS to create the CodeBuild role for you. Note down the name and ARN of the role; you will need it to create an access entry and modify the role's permissions later in these steps.** 2. Select the following options: 1. Project type - Default project 2. Source - no source 3. Environment 1. Provisioning model - on-demand 2. Environment image - custom type 3. Compute - EC2 4. Environment type - Linux Container 5. Image registry - Other registry 1. Under External registry URL, enter `ghcr.io/macstadium/orka-ansible-aws:` where `` is the Orka version. 3. (Optional) Set VPC, Subnets and security group to be used by CodeBuild. This is only needed if the EKS access is set to private. To do that: 1. Click Additional Configuration 2. Select the VPC where your cluster is deployed 3. Select the subnets which EKS uses 4. Select a security group that has access to the EKS API 4. In the BuildSpec, add the following commands: ``` - aws eks update-kubeconfig --name {cluster_name} --region {region} - ansible-playbook /ansible/site.yml -e "k8s_api_address={k8s_api_address}" -e "kube_oidc_client_id={kube_oidc_client_id}" ``` Where: `{cluster_name}` - the name of your EKS cluster `{region}` - the region where the cluster is deployed `{k8s_api_address}` - the K8s API address of your cluster. In the EKS console, open your cluster's **Overview** tab and copy the **API server endpoint**. `{kube_oidc_client_id}` - the OIDC client ID provided by MacStadium 5. Save the configuration. 6. Next, Configure CodeBuild to manage the EKS cluster: 1. Manage the EKS cluster. To enable CodeBuild to manage the EKS cluster, complete the following steps: 1. The IAM Role needs a policy to manage EKS. To do this: Navigate to the IAM role. Attach a policy (managed or inline) with: * Action: `eks:*` * Resource: The ARN of the EKS cluster to be configured. 2. The IAM role must have Cluster Admin permissions. To do this: Navigate to the Cluster and go to the `Access` tab. Click `Create access entry`. Select the ARN of the CodeBuild role with type `Standard`. Click Next. Select `AmazonEKSClusterAdminPolicy` with `Cluster` scope. Click `Add Policy`. Click `Next → Create`. 7. Once all permissions are configured, you can run CodeBuild, which will install the Orka services within the cluster. Please capture your `EKS cluster name` and `EKS cluster VPC region` for use in bootstrap script needed for Configuring EC2 Macs. ### OIDC Provider Setup To use the Orka API/CLI, you need to set up the OIDC provider. The issuer URL and client ID will be provided by MacStadium. To set up the provider: * Go to the Cluster Access tab. * Click `Associate Identity Provider`. * Add the `Issuer URL` provided by MacStadium. * Add the `Client ID` provided by MacStadium. * Add `cognito:groups` for the `Groups claim`. * Add `oidc:` for the `Groups prefix`. ### Exposing the Orka API Service To use the CLI, you need access to the Orka API service, which is also utilized by some integrations (e.g., Jenkins). Please review the [Orka API reference](https://macstadium.github.io/orka-api-docs/) for more details. We recommend using the [AWS Load Balancer Controller](https://kubernetes-sigs.github.io/aws-load-balancer-controller/latest/) to expose the service. ### Cluster Admin Access By default, Orka's validator webhooks restrict certain operations (including deleting another user's VM) to cluster admins only. On AWS and on-prem deployments, cluster admin status must be explicitly configured. This differs from MacStadium-hosted clusters, where kubeadm automatically establishes the `kubeadm:cluster-admins` group. The default admin group for AWS and on-prem is `orka:cluster-admins`. To use a different group, set the `cluster_admin_group` Ansible variable before running the installation playbook. To grant a user cluster admin access, add them to the `orka:cluster-admins` group (or your configured group) in your identity provider. ### Web UI The Orka Web UI is not actively maintained and is not recommended for production use. If you need to access it, you can expose the web UI service using an ingress controller or load balancer; see [Exposing the Orka API Service](#exposing-the-orka-api-service) for the approach. ## EC2 Mac Install Steps Before deploying a Mac EC2 instance, ensure that an IAM role exists meeting the below requirements. An EKS access policy must be added to grant the role permissions in Kubernetes. Additionally, a security group that allows access to the EKS control plane from the Mac instance is required. ### IAM Policies The instance must have an IAM role with the `AmazonEKSWorkerNodePolicy` attached. This is required for the node to authenticate to the EKS cluster. We also recommend the `AmazonSSMManagedInstanceCore` policy so the instance can be accessed by SSM for troubleshooting. ### EKS Access Policies The node IAM role must have EKS Cluster Admin permissions. This is necessary as the Mac node manages nodes and pods inside the cluster. To do this: * Navigate to the Cluster and go to the `Access` tab. * Click `Create access entry`. * Select the ARN of the Mac node IAM role with type `Standard`. * Click Next. * Select `AmazonEKSClusterAdminPolicy` with `Cluster` scope. * Click `Add Policy`. * Click `Next → Create`. ### Security Groups You must attach a security group to allow traffic between the managed Kubernetes control plane and the Mac node. For more information: [Amazon EKS security group requirements and considerations](https://docs.aws.amazon.com/eks/latest/userguide/sec-group-reqs.html?icmpid=docs_eks_help_panel_hp_cluster_configure_security_groups) ## Provisioning Steps 1. We will provide an AMI based on an official AWS macOS base image that includes our tooling (Virtual Kubelet, Orka Engine) 2. The AMI will additionally include a bootstrap script that should be run via user data. See the section below for more detailed information 3. The IAM role must be linked to an instance profile and attached to the instance 4. The security group allowing access to the EKS control plane must be attached to the instance 5. We recommend at least 500GB of storage for the host. The size depends on: 6. The size of the images you are using 7. The number of images you plan to have cached on the nodes ## Obtaining an Orka License Key Your license key is included in your order confirmation from MacStadium. If you don't have it, retrieve it from the [customer portal](https://macstadium.users.licensespring.com) or contact [support@macstadium.com](mailto:support@macstadium.com). For portal access and credential details, see [Managing your Orka license](/orka/orka-engine/managing-your-orka-license). Activate your license: ``` orka-engine license set --key YOUR_KEY ``` You can also download Orka Engine directly from MacStadium. Contact your account representative for the current installer link. ### Bootstrap Script The AMI includes a bootstrap script that can be run via [user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html) and accepts the following parameters to connect as an Orka worker node: * EKS cluster name, EKS cluster VPC region, Orka License Key (provided by MacStadium) * The customer should pass the following as user data when launching an instance: ``` #!/bin/bash /usr/local/bin/bootstrap-orka ``` This will attach the node to the EKS cluster as a self-managed node. ## Using ECR for Image Storage and Management You will need to have the following for use with ECR: * ECR Authentication: Credentials are required to push and pull to/from private ECR repositories. For public ECR this is required only for push * IAM Policies: The authentication token is scoped with the appropriate permissions to push and/or pull images based on IAM policies ### ECR Authentication If you plan to use `orka3 vm push` with ECR, run `orka3 login` or `orka3 user set-token` first. The `vm push` command requires an Orka API token in addition to ECR credentials. IAM-based or certificate-based kubeconfig authentication is not sufficient for `vm push` on its own. An `Unauthorized` error from `vm push` in this context indicates a missing Orka API token, not an ECR authentication issue. You can get credentials for use with a private ECR registry with the aws CLI as follows: ``` aws ecr get-login-password --region ``` For a public ECR registry: ``` aws ecr-public get-login-password --region us-east-1 ``` You can then configure the credentials for the Orka cluster using the token: ``` aws ecr get-login-password --region | orka3 regcred add -u AWS --password-stdin https://.dkr.ecr..amazonaws.com ``` The token is scoped for image push/pull operations based on the IAM policies configured for the calling entity: whichever user or role calls the `aws ecr get-login-password` command. The token is valid for 12 hours and will need to be refreshed regularly. See [AWS ECR registry authentication](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry_auth.html#registry-auth-token). A future release will improve upon this with a credential helper. ### IAM Policies for ECR The entity that fetches the authentication token needs to have appropriate permissions to push and/or pull images. #### Private Registry For a private registry, the following policies contain the minimum set of permissions: * Pull: [AmazonEC2ContainerRegistryReadOnly](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-2#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAmazonEC2ContainerRegistryReadOnly) * Push: [AmazonEC2ContainerRegistryPowerUser](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-2#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAmazonEC2ContainerRegistryPowerUser) #### Public Registry For a public registry, the following policies contain the minimum set of permissions: * Pull: [AmazonElasticContainerRegistryPublicReadOnly](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-2#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAmazonElasticContainerRegistryPublicReadOnly) * Push: [AmazonElasticContainerRegistryPublicPowerUser](https://us-east-1.console.aws.amazon.com/iam/home?region=us-east-2#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAmazonElasticContainerRegistryPublicPowerUser) ## Mac Node Deprovisioning Steps To deprovision a Mac Node you need to: 1. Delete the Mac instance 2. (Optional) Release the Mac dedicated host if you no longer need it 3. Delete the Kubernetes node by running `kubectl delete node ` where `` is the name of the node you want to deprovision ## Logging, Monitoring, and Alerting ### OpenTelemetry Standards Logging and monitoring conform to OpenTelemetry best practices, meaning that metrics can be scraped from the appropriate resources via Prometheus and visualized with Grafana using Prometheus as a data source. Logs can be exposed on EC2 Mac workers via CloudWatch or by installing a `promtail` service, allowing them to be aggregated through Loki. If you prefer to use CloudWatch, you can reference [AWS documentation for consuming OpenTelemetry endpoints](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-OpenTelemetry-Sections.html) and the [agent installation guide](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html) to integrate with your existing logging system. #### Key Log Sources | What | Resource | Accessing | Purpose | | ----------------------- | ------------ | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- | | Virtual Kubelet Logs | Mac EC2 Node | Via promtail: `/var/log/virtual-kubelet/vk.log` | Interactions between EKS and worker node for managing virtualization. | | Orka Engine Server Logs | Mac EC2 Node | Via promtail: `/opt/orka/logs/com.macstadium.orka-engine.server.managed.log` | Orka Engine process lifecycle, VM start/stop events, and errors. | | Orka VM Logs | Mac EC2 Node | Via promtail: `/opt/orka/logs/vm/` | Per-VM runtime logs. | | Pod Logs | EKS | Kubernetes Client, Kubernetes Dashboard, Helm Chart further exposing logs to a secondary service | All Kubernetes-level behavior | #### Key Metrics A list of metrics covering the following is available: Orka API Server, Orka Operator Metrics. Any metrics exposed by default within EC2 Mac instances can be referenced via CloudWatch. CPU utilization and network traffic are examples of metrics that are made available natively through CloudWatch. ## FAQ ### Does Orka Cluster support Intel nodes on AWS? Unfortunately, Orka Cluster does not support Intel Nodes on AWS. While the 3.x version of Orka Cluster generally supports Intel, the support requires a wipe of the machine and an install of our custom-built Linux-based OS. This operation is not supported on AWS EC2 Mac. ### How is macOS 15 Sequoia supported on AWS? macOS 15 Sequoia guest OSes (VMs) will not work out of the box on AWS EC2 Mac. This is due to the newly required Apple ID guest functionality in Sequoia guest OS images which requires the host user that starts the VM to have a login keychain, even if they do not intend to use the Apple ID guest functionality. This is discussed in the [Apple Virtualization documentation](https://developer.apple.com/documentation/virtualization/using-icloud-with-macos-virtual-machines). Unfortunately, Marketplace security requirements do not allow the setup of any credentials on the host OS. As a result, we have two options for macOS 15 support: 1. After setting up your EC2 Mac, you will need to set up a login keychain on the host OS before running the Sequoia OS Orka VM image. 2. MacStadium will supply a Sequoia OCI image that is upgraded from a Sonoma image rather than created from a Sequoia IPSW on Sequoia host. This will run without the Apple ID functionality in guest. # Orka on AWS: Private VPC Access Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/orka-on-aws-vpc-access Use AWS SSM port forwarding to log in to Orka and connect to Mac VMs when your cluster's Orka API is not exposed to the public internet. By default, the Orka API on AWS runs inside your VPC and is not accessible from the internet. If your cluster is configured this way, you won't be able to run `orka3 login` or connect to VMs directly from your local machine. Instead, you'll route that traffic through a bastion (jumpbox) host using AWS Systems Manager (SSM) port forwarding. This guide covers: * Logging in with `orka3 login` from a jumpbox * Connecting to a VM via SSH * Connecting to a VM via Screen Share or VNC This guide applies to Orka on AWS deployments where the Orka API is restricted to private VPC access. If your Orka API is exposed via a public load balancer, you can run `orka3 login` directly from your local machine and do not need this guide. ## Prerequisites Before you start, confirm the following: * Your bastion host has the `AmazonSSMManagedInstanceCore` IAM policy attached. See [IAM Policies](/orka/orka-on-aws-and-on-prem/orka-on-aws-getting-started#iam-policies) in the getting started guide. * The [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) is installed and configured on your local machine. * The [AWS Session Manager plugin](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html) is installed on your local machine. * The `orka3` CLI is installed on your bastion host. * You have the SSM-managed instance ID of your bastion host. ## Log in with `orka3 login` When the Orka API is private, `orka3 login` must run on the jumpbox, not your local machine. The browser-based auth flow still completes in a browser on your local machine, with the two sides connected by an SSM tunnel. **Step 1: Open an SSM port forwarding session from your local machine.** ```bash theme={null} aws ssm start-session \ --target \ --document-name AWS-StartPortForwardingSession \ --parameters '{"portNumber":["51234"],"localPortNumber":["51234"]}' ``` Replace `` with the instance ID of your bastion host (for example, `i-0abc123def456789`). Leave this terminal session running. **Step 2: On your bastion host, run `orka3 login`.** ```bash theme={null} orka3 login ``` The command outputs a browser URL for the authentication flow. **Step 3: Copy that URL and open it in a browser on your local machine.** Complete the login in the browser. Once you finish, the `orka3 login` session on the jumpbox will confirm authentication. ## Connect to a VM via SSH This section applies only when your Mac nodes are EC2 instances inside the AWS VPC. For hybrid deployments (EKS on AWS + on-premises Mac nodes), VM connections go through your on-premises network, not SSM. To SSH into a running VM, you need the private IP of the Mac EC2 node running the VM. You can retrieve this from `orka3 vm list`. Orka VMs use NAT by default, so you target the node IP, not the VM's internal IP. **Step 1: On your local machine, open an SSM port forwarding session that targets the VM's private IP.** ```bash theme={null} aws ssm start-session \ --target \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":[""],"portNumber":["8822"],"localPortNumber":["8822"]}' ``` Replace `` with your bastion instance ID and `` with the private IP of the Mac EC2 node (for example, `10.0.1.50`). The SSH port range for Orka VMs starts at `8822`. **Step 2: SSH to localhost on the forwarded port.** ```bash theme={null} ssh -p 8822 admin@localhost ``` The default username for MacStadium base images is `admin`. If your image uses a different user, substitute accordingly. ## Connect to a VM via Screen Share or VNC The process mirrors SSH, using the appropriate port instead. **Screen Share (port 5900 and above):** ```bash theme={null} aws ssm start-session \ --target \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":[""],"portNumber":["5900"],"localPortNumber":["5900"]}' ``` **VNC (port 5999 and above):** ```bash theme={null} aws ssm start-session \ --target \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":[""],"portNumber":["5999"],"localPortNumber":["5999"]}' ``` Once the tunnel is open, connect your Screen Share or VNC client to `localhost` on the forwarded port. To use Screen Share (port 5900), macOS Screen Sharing must be enabled in the guest VM (System Settings > Sharing > Screen Sharing). For VNC connections on port 5999, the VNC server runs on the host; no guest configuration is required. ## Port reference | Service | Default starting port | | ------------ | --------------------- | | SSH | 8822 | | Screen Share | 5900 | | VNC | 5999 | Each port range covers all VMs across a single Mac EC2 node. See [Networking and VPC Considerations](/orka/orka-on-aws-and-on-prem/orka-on-aws-getting-started#networking-and-vpc-considerations) for the full port ranges. # Orka On-Prem architecture and networking overview Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/orka-on-prem-getting-started Run Orka on your own Mac hardware with a Kubernetes control plane. Covers on-prem architecture, networking, and OCI image registry integration. With Orka On-Prem, you can now effortlessly integrate macOS development and macOS CI/CD into your On-Prem Mac Compute and Kubernetes-based workflows and environments. Don't have Kubernetes experience on-prem? Don't worry, MacStadium can configure a Hybrid Cluster using any Managed k8s Service like AWS Elastic Kubernetes Service, Google Kubernetes Engine, Azure Kubernetes Service, or using MacStadium hosted Kubernetes. # How does Orka On-Prem work? The diagram below illustrates the architecture of an Orka Cluster On-Prem, detailing how it integrates with Kubernetes 1.35, Mac compute hosts, and OCI Registries for image storage. Orka On-Prem architecture diagram showing Kubernetes, Mac nodes, and OCI registry The Kubernetes 1.35 Cluster provides a runtime for the Orka Cluster Services. The Mac hosts are set up with Orka Engine (VM Runtime), which provides a stable runtime for virtual machines. VMs are deployed to the host using an OCI image, which can be fetched from any OCI registry, such as Artifactory, GitHub Container Repo (GHCR), or Amazon ECR. The use of OCI images enables sub-minute deployment of different macOS versions, pre-configured with various tools and optionally with SIP (System Integrity Protection) disabled. This addresses challenges that typically exist on Mac without Orka VMs. CI tools will integrate via the Orka API installed into Kubernetes, or the CLI or API it exposes to orchestrate workloads, including spin-up and tear-down of VMs, and scheduled caching of images as needed. Key elements in the architecture include: * A private network configuration for Orka. * A dedicated Kubernetes 1.35 cluster, which runs Orka Cluster Services for orchestration and automation. * Mac Nodes to be used for compute, usually on-prem. * An OCI Registry such as Artifactory, GitHub Container Registry, Docker Registry, AWS ECR, or others. * A load balancer for Orka Users to interact with the Orka Services on Kubernetes via CLI, API, or CI tools. ## Networking Considerations The Orka VMs use the 192.168.64.0/24 network. This is a virtual network on each of the hosts and it is not directly accessible. You might experience issues if your Orka VMs need to access services that are in a network that overlaps with their virtual network. For the Apple silicon nodes, the following ports should be open to all networks that need access to the VMs: TCP 5900-6200 (Screenshare), TCP 5999-6299 (VNC), and TCP 8822-9122 (SSH). In general, we recommend allowing outbound requests uniformly for forward compatibility. > **NOTE**: SSH/Screen Share/VNC ports are globally tracked and allocated. The ranges given above are applicable to each Apple silicon node. # Install Steps ## Kubernetes Requirements and Initial Steps Orka requires a dedicated Kubernetes 1.35 cluster to run. * Orka requires a dedicated cluster because it limits certain cluster operations (such as what namespaces can be created and what pods can be deployed), and user management is generally more restrictive. We recommend following the [official guidelines](https://kubernetes.io/docs/setup/) for setting up a Kubernetes cluster. The official recommended tool for setting up Kubernetes clusters is [kubeadm](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/). If you are familiar with Ansible, you could also use [Kubespray](https://kubespray.io/) to set up your cluster. If you do not have experience with Kubernetes, MacStadium can host and manage the Kubernetes cluster for you in our Data Centers, or you can use an AWS EKS service to run your Orka Cluster Services. The following assumes you are installing and managing your own Kubernetes cluster. ### Setting up OIDC for Authentication Orka uses OIDC for user authentication. Make sure to configure the MacStadium OIDC provider in your Kubernetes cluster. This can be done by setting the following values for your Kubernetes API Server: ``` --oidc-issuer-url=KUBE_OIDC_URL # Provided by MacStadium --oidc-client-id=KUBE_OIDC_CLIENT_ID # Provided by MacStadium --oidc-username-claim=email --oidc-groups-claim=cognito:groups --oidc-username-prefix=- '--oidc-groups-prefix=oidc:' ``` If you are using kubeadm to set up your cluster, you can pass these values as extra args to the apiServer property in the ClusterConfiguration resource: ``` apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration ... apiServer: extraArgs: oidc-issuer-url: "KUBE_OIDC_URL" # Provided by MacStadium oidc-client-id: "KUBE_OIDC_CLIENT_ID" # Provided by MacStadium oidc-username-claim: "email" oidc-groups-claim: "cognito:groups" oidc-username-prefix: "-" oidc-groups-prefix: "oidc:" ... ``` Alternatively, you could also add these manually as ApiServer arguments by editing the ApiServer config file (usually /etc/kubernetes/manifests/kube-apiserver.yaml). ### Obtaining an Orka License Key Your license key is included in your order confirmation from MacStadium. If you don't have it, retrieve it from the [customer portal](https://macstadium.users.licensespring.com) or contact [support@macstadium.com](mailto:support@macstadium.com). For portal access and credential details, see [Managing your Orka license](/orka/orka-engine/managing-your-orka-license). Add your license key to `cluster.yml` under `orka_engine_license_key` before running the installer (see below). ### Installing the Orka Cluster Services MacStadium provides the Orka Cluster Services installer as a public container image on GitHub Container Registry (GHCR). You will need an environment with outbound internet access to pull the Ansible image, connectivity to the Kubernetes API, and cluster admin access. 1. Ensure the Ansible runner is set up correctly: 2. The Ansible runner must have connectivity to the cluster API. 3. The Ansible runner must have Cluster Admin privileges to set up the cluster (i.e. a kube config with admin privileges) 4. On the host create a file called `cluster.yml`. This file will contain Ansible variables needed for the Orka setup. Add the following content: ``` k8s_api_address: # The address to the K8s API of your cluster. Must start with the protocol (https:// or http://) kube_oidc_client_id: # Provided by MacStadium orka_engine_license_key: # Provided by MacStadium ## Optionally - Configure tolerations and selectors ## This is needed to get the Orka services deployed on the control plane nodes # configure_orka_tolerations: # - key: node-role.kubernetes.io/control-plane # effect: NoSchedule # operator: Exists # orka_node_selector: | # node-role.kubernetes.io/control-plane: "" ``` 3. Run the Ansible container: ``` docker run -it -v :/root/.kube/config -v ./cluster.yml:/ansible/group_vars/all/cluster.yml ghcr.io/macstadium/orka-ansible-onprem: bash ``` where `` is the path to your kubeconfig (typically `~/.kube/config`), `cluster.yml` is the file created in the previous step, and `` is the Orka version you are installing (e.g. `3.6.0`). 4. Make sure you are in the `/ansible` directory 5. You can now run the Ansible playbook: ``` ansible-playbook site.yml ``` ### Exposing the Orka API Service To use the CLI, you need access to the Orka API service, which is also utilized by some integrations (e.g., Jenkins). `orka3 vm push` requires an Orka API token. Run `orka3 login` or `orka3 user set-token` before pushing images. On-prem deployments commonly use certificate-based kubeconfig authentication, which is not sufficient for `vm push`. If you encounter an `Unauthorized` error from `vm push`, this indicates a missing Orka API token, not an OCI registry issue. Currently, the service is exposed as `ClusterIP` service called `orka-apiserver` in the default namespace. One way to expose the service is to use something like [MetalLB](https://metallb.io/) to expose the service as LoadBalancer so it can be reached from outside the cluster. ### Cluster Admin Access By default, Orka's validator webhooks restrict certain operations (including deleting another user's VM) to cluster admins only. On AWS and on-prem deployments, cluster admin status must be explicitly configured. This differs from MacStadium-hosted clusters, where kubeadm automatically establishes the `kubeadm:cluster-admins` group. The default admin group for AWS and on-prem is `orka:cluster-admins`. To use a different group, set the `cluster_admin_group` Ansible variable before running the installation playbook. To grant a user cluster admin access, add them to the `orka:cluster-admins` group (or your configured group) in your identity provider. ### Web UI The Orka Web UI is not actively maintained and is not recommended for production use. If you need to access it, you can expose the web UI service using an ingress controller or load balancer; see [Exposing the Orka API Service](#exposing-the-orka-api-service) for the approach. ## Setting Up Mac Nodes ### Prerequisites All of your Mac nodes need to: 1. Have a common user created. This user needs admin privileges 2. SSH is enabled for this user 3. An SSH key is setup for this user, so that SSH connections using SSH keys are allowed 4. `python3` ### Setup MacStadium provides another Ansible playbook that allows you to configure your Mac nodes with the software needed to run these nodes as Kubernetes worker nodes. To set up the Mac Nodes: 1. Ensure the `cluster.yml` file is present and the values are correct 2. Create a new file called nodes.yml with the following content: ``` host_password: # The password of the user setup on the Mac nodes ansible_user: # The user setup on the Mac nodes ``` 3. Create an inventory file called `hosts` with the following content: ``` [arm-nodes] # Add the IPs of the nodes that need to be configured # One IP per line # (Optional) You can set osx_node_hostname={hostname} next to the IP to set a custom name of the node # (Optional) You can set osx_node_kubelet_node_ip={host_ip} Needed if you want to set a specific IP or the virtual kubelet is unable to resolve it automatically # Example: # 10.221.188.30 osx_node_hostname=mini-1 osx_node_kubelet_node_ip=10.221.188.30 ``` 4. Run the same Ansible image that was used to configure the Orka services: ``` docker run -it -v :/root/.kube/config -v ./cluster.yml:/ansible/group_vars/all/cluster.yml -v ./nodes.yml:/ansible/group_vars/arm-nodes/nodes.yml -v ./hosts:/ansible/hosts -v :/root/.ssh/id_rsa ghcr.io/macstadium/orka-ansible-onprem: bash ``` where `` is the path to your kubeconfig (typically `~/.kube/config`), `` is the SSH key used to connect to the Mac nodes, and `` is the Orka version (e.g. `3.6.0`). 5. Ensure you are in the `/ansible` directory. 6. Run the configuration playbook: ``` ansible-playbook configure-arm.yml -i hosts --ask-become-pass ``` You will be asked for the ansible\_user password. This is needed so that Ansible can set up autologin for the hosts. This is needed so you can run Sequoia VMs. ## Setting Up Backups Orka backups are exports of the Orka specific resources within the cluster: 1. Orka Nodes 2. Virtualmachine configs 3. Service Accounts 4. RoleBindings There are two main ways to backup the Orka resources: 1. Implement the backup logic yourself 1. You define the resources that need to be backed up and how often 2. You define where the backups are stored 2. Use the functionality provided by MacStadium 1. MacStadium provides an Ansible playbook that: 2. Sets up a cronjob that runs every 30 min by default 3. The cronjob exports the resources mentioned above by default 4. The job stores the backups in an S3 bucket that you have specified ### Using The MacStadium Provided Backup To use the MacStadium provided functionality you need to: 1. Create an AWS S3 bucket and generate AWS access id and secret access key that provide permissions to write to the bucket 2. Run the Ansible image provided by MacStadium and mount a backup.yml file with the following content ``` aws_access_key_id_backup: # The creds that allow access to the S3 bucket aws_secret_access_key_backup: # The creds that allow access to the S3 bucket service_account: admin-user # You can also provide another service account here. It needs cluster-wide admin permissions s3_backup_path: # path to your s3 bucket. For example s3://my-backup-bucket ``` 3. Run the container ```bash theme={null} docker run -it -v :/root/.kube/config -v backup.yml:/ansible/group_vars/all/backup.yml ghcr.io/macstadium/orka-ansible-onprem: bash ``` 4. Run the backup playbook inside the `/ansible` folder ```bash theme={null} ansible-playbook backup.yml ``` ### Implementing Your Own Backup The recommended way to backup Orka resources is via a CronJob, similar to what MacStadium provides out of the box. The resources you need to backup are: 1. All namespaces with the label orka.macstadium.com/namespace ```bash theme={null} kubectl get namespaces -l orka.macstadium.com/namespace=true -o yaml | yq eval 'del(.items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.creationTimestamp, .items[].metadata.annotations, .items[].metadata.spec, .items[].metadata.generation, .items[].status, .items[].spec)' ``` Note - we are removing some metadata as otherwise restore would fail. 2. OrkaNodes, VirtualMachineConfigs, ServiceAccounts, Rolebindings from these namespaces Note - you need to remove some metadata from these resources. To do that, run the following: ```bash theme={null} kubectl get "$resource" -n "$namespace" -o yaml | yq eval 'del(.items[].metadata.resourceVersion, .items[].metadata.uid, .items[].metadata.creationTimestamp, .items[].metadata.selfLink, .items[].metadata.managedFields, .items[].metadata.ownerReferences, .items[].metadata.generation, .items[].status)' ``` These resources can be stored in a yml file, which you can archive and store somewhere. # Logging, Monitoring, and Alerting ## OpenTelemetry Standards Logging and monitoring conform to OpenTelemetry best practices, meaning that metrics can be scraped from the appropriate resources via Prometheus and visualized with Grafana using Prometheus as a data source. Logs can be exposed on Mac workers by installing a `promtail` service, allowing them to be aggregated through Loki. #### Key Log Sources | What | Resource | Accessing | Purpose | | -------------------- | -------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- | | Virtual Kubelet Logs | Mac Node | Via promtail: `/usr/local/virtual-kubelet/vk.log` | Interactions between k8s and worker node for managing virtualization. | | Orka VM Logs | Mac Node | Via promtail: `/Users/administrator/.local/state/virtual-kubelet/vm-logs/*` | Logs pertaining to the lifecycle of a specific VM | | Pod Logs | k8s | Kubernetes Client, Kubernetes Dashboard, Helm Chart further exposing logs to a secondary service | All Kubernetes-level behavior | #### Orka v3.4+ Log Sources | What | Resource | Accessing | Purpose | | -------------------- | ----------- | ------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------- | | Virtual Kubelet Logs | Mac Node | Via promtail: `/var/log/virtual-kubelet/vk.log` | Interactions between k8s and worker node for managing virtualization. | | Orka VM Logs | Mac Node | Via promtail: `/opt/orka/logs/vm/` | Logs pertaining to the lifecycle of a specific VM | | Orka Engine Logs | Engine Node | `/opt/orka/logs/com.macstadium.orka-engine.server.managed.log` | Logs pertaining to Orka Engine | | Pod Logs | k8s | Kubernetes Client, Kubernetes Dashboard, Helm Chart further exposing logs to a secondary service | All Kubernetes-level behavior | #### Key Metrics A list of metrics covering the following is available: Orka API Server, Orka Operator Metrics. ## Troubleshooting For help diagnosing failed VM deployments, locked keychain errors, and Virtual Kubelet issues on on-prem nodes, see the [Orka Anywhere On-Prem Troubleshooting guide](/orka/orka-on-aws-and-on-prem/orka-on-prem-troubleshooting). # Orka Anywhere On-Prem: Troubleshooting VM Deployments Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/orka-on-prem-troubleshooting Diagnose failed Orka Anywhere on-prem VM deployments: log locations, keychain and GUI session issues, Virtual Kubelet SIGKILL, and Kubernetes isolation. When a VM deployment fails in an Orka Anywhere on-prem cluster, the error surfacing in the operator logs is usually generic: `Unable to deploy the VM as the underlying VM process has crashed.` The actual root cause almost always lives on the Mac node itself, not in the cluster. This guide covers where those logs are, how to find which node a failed deployment landed on, and how to work through the most common failures. Commands and paths in this guide reflect Orka 3.6.x. ## The two services on each Mac node Every Mac node in an on-prem Orka cluster runs two services: * **Orka Engine:** manages the VM process lifecycle and launches VMs as the configured virtual machine user. * **Virtual Kubelet:** registers the node with Kubernetes and manages VMs as pods. It will delete any VM it doesn't recognize. Understanding which service is responsible for a failure determines where to look and what to fix. ## Log and config locations | What | Path | | ---------------------------- | ------------------------------------------------------------------------ | | Orka Engine server log | `/opt/orka/logs/com.macstadium.orka-engine.server.managed.log` | | Orka VM logs | `/opt/orka/logs/vm/` | | Virtual Kubelet log | `/var/log/virtual-kubelet/vk.log` | | Orka Engine LaunchDaemon | `/Library/LaunchDaemons/com.macstadium.orka-engine.server.managed.plist` | | Virtual Kubelet LaunchDaemon | `/Library/LaunchDaemons/orka.virtual.kubeletd.plist` | These paths apply to Orka 3.4 and later. For Orka 3.3 and earlier, see [Logging, Monitoring, and Alerting](/orka/orka-on-aws-and-on-prem/orka-on-prem-getting-started#logging-monitoring-and-alerting) in the on-prem getting started guide. ## Find which node a failed VM landed on Failed VMs are cleaned up automatically, so they won't appear in `orka3 vm list`. The operator logs name the failed VMI but not the node; Kubernetes events name the node. Cross-reference by VMI name: ```shell theme={null} # 1. Find the failed VMI name in the operator logs kubectl logs -n default deployment/orka-operator --since=1h | grep -i "error\|fail" # 2. Match it to a Scheduled event to identify the node # orka-default is the default VM namespace kubectl events -n orka-default -w # Example output: "Successfully assigned orka-default/ to orka-mini-NN" ``` Once you have the node name, SSH into it and read the Orka Engine log and Virtual Kubelet log. Kubernetes reports a node as `Ready` even if it cannot successfully provision VMs. If a node fails consistently, cordon it to stop the scheduler from sending more work to it while you investigate: ```shell theme={null} kubectl cordon ``` To bring it back after resolving the issue: `kubectl uncordon ` As an Orka-native alternative, `orka3 node namespace ` moves the node to a different namespace, which takes it out of rotation for any namespace where VMs are actively being deployed. ## Common root causes ### Locked keychain or wrong GUI user **Engine log signature:** `VZErrorDomain Code=-9 "The virtual machine encountered a security error."` Starting with Sequoia (macOS 15) guests, the macOS Virtualization framework requires an unlocked login keychain on the host. The keychain is only unlocked when its owning user has an active GUI session. Orka runs the VM as the configured virtual machine user, so that user must be the one logged into the GUI on the node. **What to check:** * Run `who` on the node. The VM user should have a `console` session. * Via Screen Sharing or KVM, confirm the VM user holds the foreground GUI session. The trap: autologin and a `console` entry in `who` can look correct while a different user is actually in the foreground, leaving the VM user's keychain locked. * Check `ORKA_ENGINE_VIRTUAL_MACHINE_USER` in the Orka Engine LaunchDaemon plist (`/Library/LaunchDaemons/com.macstadium.orka-engine.server.managed.plist`) and confirm it matches the intended autologin user. **Fix:** ensure the VM user is logged into the GUI. Cordon affected nodes as immediate mitigation. This issue is most common on nodes with two user accounts, for example an `admin` account and a separate VM user, where the wrong user ends up in the foreground after a reboot. Standardize so the VM user is also the autologin user. ### Guest requires a newer host OS Some guest images require a minimum host macOS version. If a specific image consistently fails on a subset of nodes, compare those nodes' host OS versions against nodes where the image deploys successfully. ### VM process SIGKILLed right after start **Engine log signature:** `VM ... exited with code 9` appearing seconds after the VM registers with the Engine socket, with no `VZErrorDomain` error. Exit code 9 is SIGKILL from the Virtual Kubelet, not Orka Engine. The VK sends SIGKILL on every VM termination, including normal deletes, so this log line is always expected and is not itself a signal of a problem. What matters is the surrounding log context explaining why the kill happened. To diagnose: raise the VK log level and look at the entries immediately before the kill (see [Manage the Virtual Kubelet service](#manage-the-virtual-kubelet-service) below), or bypass Kubernetes entirely to confirm whether the VM process starts cleanly on its own (see [Run a VM directly with Orka Engine](#run-a-vm-directly-with-orka-engine) below). ## Manage the Virtual Kubelet service The Virtual Kubelet's default log level is `error`. Raising it to `info` gives you visibility into scheduling decisions and VM lifecycle events. To change the log level, stop the service, edit the plist, then restart: ```shell theme={null} sudo launchctl bootout system /Library/LaunchDaemons/orka.virtual.kubeletd.plist # Edit LOG_LEVEL to "info" in the plist, then reload: sudo launchctl bootstrap system /Library/LaunchDaemons/orka.virtual.kubeletd.plist ``` After reloading, redeploy to the node and watch `vk.log`: ```shell theme={null} orka3 vm deploy --image --node ``` ## Run a VM directly with Orka Engine Running a VM directly through the Orka Engine binary removes Kubernetes and the Virtual Kubelet from the picture and streams logs to the terminal. Use this when you need to confirm whether the problem is in the VM process itself or in the Kubernetes layer. Stop the Virtual Kubelet before running a VM directly. If both are running simultaneously, the kubelet will delete the VM it doesn't manage. ```shell theme={null} # Stop the Virtual Kubelet sudo launchctl bootout system /Library/LaunchDaemons/orka.virtual.kubeletd.plist # Run the VM (attached mode streams logs to the terminal) orka-engine vm run --image foo # For detached mode, logs go to /opt/orka/logs/vm/ orka-engine vm run --image foo -d # Clean up when done, then restore the Virtual Kubelet orka-engine vm delete foo sudo launchctl bootstrap system /Library/LaunchDaemons/orka.virtual.kubeletd.plist ``` ## Error signature reference | Signature | Where | Meaning | | ------------------------------------------------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | `Unable to deploy the VM as the underlying VM process has crashed.` | Operator logs / VMI status | Generic crash. Identify the node via `kubectl events`, then read the node logs. | | `VZErrorDomain Code=-9 "...security error..."` | Orka Engine log | Locked keychain or wrong foreground GUI user. See [Locked keychain or wrong GUI user](#locked-keychain-or-wrong-gui-user). | | `VM ... exited with code 9` after socket registration | Orka Engine log | SIGKILL from the Virtual Kubelet. See [VM process SIGKILLed right after start](#vm-process-sigkilled-right-after-start). | | `403 ... VM config name must be a valid DNS-1035 label` | Orka API | Name must be lowercase alphanumeric or `-`, start with a letter, end with alphanumeric, and be 50 characters or fewer. | ## Still stuck? If the node logs don't point to a clear root cause, contact [MacStadium support](mailto:support@macstadium.com) and include the relevant excerpts from the Orka Engine log and Virtual Kubelet log from the node where the failure occurred. # Risk Assessment and Mitigation Plan for Orka on AWS Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/risk-assessment-and-mitigation-plan-for-orka-on-aws Risk assessment for Orka on AWS: security, reliability, cost, and operational risks with mitigations for EKS and EC2 Mac deployments. The following is a structured risk assessment and mitigation guide for Orka on AWS. ## Risk Assessment Summary Using AWS Well-Architected Framework Below is a short mapping of risk areas to the AWS Well-Architected Framework: | **Pillar** | **Associated Risks** | **Mitigation Focus** | | ---------------------- | --------------------------------------------------- | ---------------------------------------------- | | Security | IAM/config errors, network exposure, cluster access | Least privilege, secure VPC rules, monitoring | | Reliability | Single control plane points, operational limits | HA EKS nodes, automated recoveries | | Operational Excellence | Restricted operational model | Documented runbooks, controlled governance | | Cost Optimization | Over-provisioned resources | Autoscaling, right-sizing of clusters | | Performance Efficiency | Network, storage, ECR latency | Region alignment, use of NVMe where applicable | | Sustainability | Inefficient resource use | Autoscale down unused resources | ## Detailed Description of Risk Areas and Mitigation ### Security & Identity Management **Risk Description** * Orka on AWS integrates with EKS, EC2 Mac instances, CodeBuild, IAM roles, OIDC providers, and ECR. Improper IAM permissions or misconfigured identity providers can lead to privilege escalation or unauthorized access. * Sensitive actions (e.g., attaching `eks:*` policies, Cluster Admin rights) are required for setup. **Potential Impact** * Unauthorized access to cluster control plane, EC2 Mac hosts, or ECR images. * Compromise of build artifacts, credentials, or production infrastructure. **Mitigation Considerations** * Apply least privilege IAM role principles; avoid broad `eks:*` permissions where not necessary and use scoped policies. * Implement IAM Access Analyzer and regular permission reviews. * Enable multi-factor authentication (MFA) and use strong OIDC client configurations. * Monitor identity provider and token usage via AWS CloudTrail and GuardDuty. ### Networking **Risk Description** * Orka requires exposing certain ports (e.g., for VNC, SSH, metrics) within the VPC. Misconfiguration of security groups/VPC rules could inadvertently expose traffic. * NAT, network isolation, or VPC peering may be complex, introducing misconfigurations. **Potential Impact** * Unauthorized access to Orka or macOS VMs. * Increased attack surface. **Mitigation Considerations** * Use strict security group rules with least network exposure; restrict ingress only to necessary CIDRs. * Deploy private subnets with NAT gateways for necessary egress rather than public IPs. * Use AWS Network Firewall or AWS Security Hub to detect insecure configurations. ### EKS Operational Restrictions **Risk Description** * Orka limits namespace creation and pod deployment, and user management is restricted. This increases governance for customers who must manage operations within those constraints. **Potential Impact** * Misunderstanding of restrictions could slow deployments or create gaps in observability. **Mitigation Considerations** * Clearly document the operational limits and integrate them into internal DevOps runbooks. * Provide automated validations (i.e. via pipeline checks) for compliance with Orka constraints. ### Backups, Logging & Monitoring **Risk Description** * Centralized logging mechanisms (CloudWatch, OpenTelemetry) and backups are suggested but not enforced by default. **Potential Impact** * Missed detection of security or performance incidents. * Loss of critical state or configuration data during outages. **Mitigation Considerations** * Enforce centralized logging and metric aggregation pipelines with retention policies. * Configure alerts and dashboards for key signals (node failures, burst traffic, unexpected auth events). * Automate backups to S3, with lifecycle rules and access restrictions. ### Registry Credential Management for Images **Risk Description** * Credentials for ECR access are time-bound and require frequent refresh. Incorrect handling can lead to build failures or credential exposure. **Potential Impact** * CI/CD disruptions, build failures, or stale credentials leading to outages. **Mitigation Considerations** * Use automated credential rotation integrated into workflows. * Store credentials securely (i.e. AWS Secrets Manager) and enforce short TTLs with refresh policies. # Using Bridge Networking with Orka 3.5.0 Source: https://docs.macstadium.com/orka/orka-on-aws-and-on-prem/using-bridge-networking-with-orka-350 Configure bridge networking for Orka 3.5.0 on-prem: VMs receive IP addresses directly from your DHCP server, enabling direct network access without NAT. **Requires Orka 3.5.0 or later.** If you're on an earlier version, see the [release notes](/orka/orka-upgrades-and-release-notes/orka-upgrades) for your version before proceeding. Bridged networking allows Orka VMs running Orka 3.5.0 to connect directly to a physical network as a native device, receiving their own IP address from the network's DHCP server. This enables direct communication with other network devices and services without the use of NAT, and is configurable automatically using Orka alongside your existing DHCP server. ## Getting Started To set up bridge networking in your Orka on-prem cluster, you will need to set the following variables in your host's `cluster.yml` file: 1. `vm_network_mode: bridge` This is used to specify the network mode to your Orka services, and is added to your `cluster.yml` file. For instructions on how to set up this file, please refer to the [Orka On-Prem: Getting Started documentation](/orka/orka-on-aws-and-on-prem/orka-on-prem-getting-started). 2. `osx_node_vm_network_interface: ` * `host_interface` is the interface on the host that the DHCP server is accessible on * If the host interface is the same on every host, you can set this in the `nodes.yml` file * If the host interface differs between hosts, this can be set per host in the hosts file **Example:** ``` [arm-nodes] 10.221.188.30 osx_node_vm_network_interface=vlan0 10.221.188.31 osx_node_vm_network_interface=vlan1 ``` ### VNC Access When bridge mode is active, you will see a deploy output similar to the following example: ``` NAME IP SSH VNC SCREENSHARE STATUS vm-2gdws 10.221.190.85 22 6000 5900 Running ``` SSH and screen sharing are accessible on port 22 and port 5900 on the VM IP (10.221.190.85). As VNC runs on the host, rather than the VM, VNC is accessible on port 6000 on the host IP. To obtain the host, enter the following commands: 1. `orka3 vm list -o wide` to get the host name 2. `orka3 node list -o wide` to get the host IP **Known Issue:** The WebUI connection string says For VNC use and uses the VM IP instead of the Host IP. ### Technical Requirements and Limitations 1. You can configure Orka using **either** NAT or bridged networking mode. 2. It is not possible to run both networking modes at the same time. 3. You cannot have two VMs running using different networking modes simultaneously. 4. All VMs must be deleted before switching the networking mode. If your Orka cluster is running NAT and needs to be switched to bridge networking, all VMs must be deleted beforehand. ### Common Issues **Issue:** The Orka VM has a private IP from the 192.168.64.0/24 CIDR **Solution:** 1. `vm_network_mode: bridge` was set in the `cluster.yml` file 2. `osx_node_vm_network_interface: ` was **not** set in the `nodes.yml` or the `hosts` file 3. Rerun the host configuration with `osx_node_vm_network_interface: ` set to the correct value # Orka compatibility matrix for macOS and hardware Source: https://docs.macstadium.com/orka/orka-overview/compatibility-matrix Supported macOS versions, host OS requirements, and Orka cluster compatibility by hardware (M1/M2/M4, Intel). Verify your configuration before deploying. This page provides compatibility information for Orka clusters, including supported VM operating systems, host requirements, and feature availability. Use this guide to ensure your Orka configuration meets the necessary requirements. **Note:** Recommended versions of Orka include the latest features and bug fixes. ## Apple silicon Compatibility | VM OS Version | Recommended Orka Cluster Version | Required Orka Cluster Version | Required Host Version | | ---------------- | -------------------------------- | ----------------------------- | --------------------- | | macOS 26 Tahoe | 3.5 | 3.5+ | MacOS 15.5+ | | macOS 15 Sequoia | 3.5 | 3.0+ | MacOS 15+ | | macOS 14 Sonoma | 3.5 | 3.0+ | MacOS 14+ | | macOS 13 Ventura | 3.5 | 2.4+ | MacOS 13+ | ## M4 Compatibility Requirements * Recommended Host OS Update: MacStadium recommends upgrading Host OSes with M4 to at least macOS 15.2. This resolves compatibility problems with older VM OSes. * Known Issue: If the Host OS is earlier than macOS 15.2, VM OSes older than macOS 13.4 will not start. * Alternative Solution: If upgrading the Host OS to 15.2 is not possible, use namespaces or tags to differentiate hosts with M4 from those using M2 or M1. Then, route workloads requiring VM OSes older than macOS 13.4 to compatible hosts. ## OCI Image Overview The Open Container Initiative (OCI) is an open standard for container formats and runtimes. MacStadium provides OCI-formatted images for Apple silicon-compatible virtual machines, which are available on [OrkaHub](https://orkahub.com/). You can deploy VMs using compatible images from public or private registries and store your own images in any OCI-compliant registry. For more information on OCI Images, see [OCI Images](/orka/oci-images/oci-images-overview) ## Intel Compatibility (Legacy) | VM OS Version | Recommended Orka Cluster Version | Required Orka Cluster Version | | ------------------ | -------------------------------- | ----------------------------- | | macOS 15 (Sequoia) | 3.5+ | 3.2+ | | macOS 14 (Sonoma) | 3.5+ | 3.0+ | | macOS 13 (Ventura) | 3.5+ | 2.4+ | * Note: macOS 26 (Tahoe) will not be supported on Intel. ## Intel Image Format (Legacy) Intel images are available through a remote network storage mount within MacStadium's infrastructure. These images are designed for Intel-based virtual machines, and can be accessed directly from the mounted storage. ## Intel-Related Networking and Performance Improving Features (Legacy) | macOS version | I/O boost | Network boost | GPU passthrough | | ------------------ | --------- | ------------- | ---------------- | | macOS 14 (Sonoma) | ✅\* | ✅ | Available \*\*\* | | macOS 14 (Sonoma) | ✅ | ✅ | Available \* | | macOS 13 (Ventura) | ✅ | ✅ | Available \* | * By default, GPU passthrough is disabled for VM configurations and VMs. When you enable GPU passthrough for an Intel VM, this automatically disables VNC for the VM. Make sure that you will be able to access the VM by SSH or Apple Screen Sharing before enabling GPU passthrough. # Orka macOS virtualization platform overview Source: https://docs.macstadium.com/orka/orka-overview/orka-overview Orka by MacStadium: macOS virtualization on Apple silicon with Kubernetes-native scheduling. Supports CI/CD, VDI, and AI workloads in cloud or on-prem. ## About Orka is an enterprise platform that provides virtualization and orchestration for macOS-based workloads. It scales to hundreds of nodes, supporting fast spin-up and tear-down of virtualized macOS images. You can install Orka on MacStadium, AWS, using other managed Kubernetes offerings, or fully on-premises. Orka is optimized to provide virtualization natively for Apple silicon, and provides some level of support for Intel-based Mac computers and OS versions. It provides two classes of capabilities: * Virtualization (optimized for Apple silicon and macOS, with Apple Hypervisor interface, while still retaining support for Intel-based Macs) * Orchestration (designed for scalability, speed, and reliability, with native K8S-based scheduling) Orka can be deployed to the MacStadium Cloud, AWS, or on-premises. You can access Orka via the CLI, API, or through direct integration with common CI (continuous integration) systems such as Jenkins, GitHub Actions, GitLab, BuildKite (See [Orka Tools & Integrations](/orka/orka-overview/tools-integrations) for a complete list of integrations). Some of the most frequent use cases and workloads for Orka Cluster include: * Private CI cluster supporting iOS or macOS builds from Jenkins, GitHub Actions, Packer, GitLab, or your custom continuous integration tooling. * Testing environments for your macOS and iOS apps. * Virtual desktops * Custom application logic running on macOS ## Overview An Orka deployment typically consists of: * A fleet of MacStadium Bare Metal Mac hosts running virtualization interfaces to macOS compute resources. The fleet must be network-connected via mesh networks, VPNs, tunnels, or other mechanisms. * An OCI registry to serve as the image repository to store and distribute the images to the fleet, where they are used as VMs. * A control plane that facilitates orchestration, including provisioning and de-provisioning of VMs across hosts. The control plane can run in a Kubernetes or Ansible environment. * For DevOps use cases and ephemeral environments, a Kubernetes (k8s) control plane is recommended. An API Server exposes the k8s control plane to those who manage the workloads on the cluster. * For VDI use cases and long-lived VM environments, an Ansible-based control plane is recommended. A set of Ansible scripts are provided to those who manage the workloads on the cluster. An Orka environment can start with as few as two nodes and can scale to hundreds of nodes if needed. The MacStadium team can help confirm the size and scaling. This document will focus on using k8s as the control plane for Orka. For details on managing an Orka environment with the Ansible-based control plane, see [MacStadium VDI](/remote-desktop-vdi/getting-started/self-hosted). ## Key Concepts * The [Orka CLI](/orka/orka-overview/tools-integrations) (`orka3`) is the primary interface to working with Orka when the control plane is a k8s environment. It is perfect for both manual use and automation. * To build an automated CI/CD system, look into the available [Orka integrations](/orka/orka-overview/tools-integrations) - from Jenkins to GitHub Actions. The Orka team continuously adds to the list of supported solutions. * The [Orka Web UI](/orka/quick-start-guides/web-ui-quick-start) provides a quick way to manage Orka. Currently, the Web UI offers limited functionality compared to the Orka3 CLI and the Orka3 API. Orka running in the MacStadium Cloud or AWS may be behind a firewall and may require a VPN to access. ## Terminology * **API Server**: Provides access to the cluster from the CLI, API or CI integrations. The API Server must be accessible to the CLI, API or CI Integrations controlling the Orka instance. * **Bare Metal Macs**: MacStadium has a variety of standard Mac models that run the virtualization software to manage and use the macOS compute resources * **Control Plane**: Facilitates the orchestration activities, which includes provisioning and de-provisioning of VMs across the fleet of hosts that are running virtualization interfaces to macOS compute resources. This runs natively inside of Kubernetes for optimal performance and scale. (This is abstracted away from you, so you never need to interface with Kubernetes unless you want to.) * **Host (or Node)**: A physical computer with a host macOS and an installation of Orka Virtualization software * **Image (or OCI Image)**: Bits on disk that represent VM storage. Images can be deployed as a VM in an Orka and provide the OS, file system, and built-in storage used by the VM. * **OCI** refers to the standard format that the image is packaged with. Images are stored in any OCI-compliant registry. Starting with Orka 3.2, MacStadium has begun storing OCI-compliant images for various versions of the macOS in our public GitHub registry viewable at [GitHub - macstadium/orka-images: Public images for Apple silicon-based Orka virtual machines](https://github.com/macstadium/orka-images/). * A **VM** is a virtual machine runtime on top of the macOS host. The VM runs a guest OS image and macOS supports up to 2 running VMs per host. ## System Requirements Bare Metal Mac Nodes: * Apple silicon Support: Apple M1+ with 16GB RAM and 512GB disk space. (MacStadium recommends 1TB disk space); macOS 15.0+ (Sequoia) * Apple Intel Support: Mac Intel with 16GB RAM and 1TB disk space; macOS 15.0+ (Sequoia) Kubernetes: * When running in the MacStadium Cloud, MacStadium will install, configure, and manage the k8s versions required. * When running in AWS, EKS will be required. MacStadium will assist you with the installation and configuration of Orka into the EKS environment. * When running On-Prem, Orka will need to be installed into an isolated k8s environment. MacStadium will assist you with the install and configuration of Orka into your k8s environment. ## Getting Started Orka can be purchased and deployed by meeting with MacStadium Field Engineering teams. The MacStadium team works with you to size, fit, install, and configure the Orka deployment. Once installed and configured, the following steps and commands quickly introduce the basic features of Orka: 1. First-time setup: * If deploying within MacStadium, review [My Cloud](/macstadium/macstadium-overview/ip-plan) and configure networking access. If deploying within AWS or On-Prem, review your network access to ensure you have access to the Orka API Server. * Install and configure the `orka3` client with the `api-url` * Manage users via the Portal 2. Run `orka3 login` and `orka3 user get-token` to sign into the cluster control plane 3. Learn the 3 main objects to work with: nodes, images, and vms 4. Deploy and Connect to a New VM 5. Modify, Save, and Stop the VM 6. Manage Image Caching behaviors Take the customized VM and integrate it with a CI tool. ## 1. First Time Setup **Review My Cloud and set up networking** 1. If deploying within MacStadium, sign in to your account at [portal.macstadium.com](https://portal.macstadium.com/login) and open **My Cloud**.\ If deploying within AWS or On-Prem, make sure to connect to the network such that you have access to the API Server. * Use the `ORKA_API_URL` with the Firewall / VPN information to connect to the Orka outside the Portal. * Use the `.20` address for the `Private-1` network (usually `10.221.188.20`), prefixed with http. For example: [http://10.221.188.20](http://10.221.188.20/). 2. Connect to the [Cluster via a VPN](/orka/networking-with-orka-at-macstadium/vpn-connection) or other mesh network to ensure access to your API Server. Verify the network connection is active from your calling application (for example, a local laptop with the `orka3` client, or a CI system that executes builds). * MacStadium currently provides VPN based access. Use a VPN client to connect to the cluster using the firewall's public IP and credentials from that firewall's Credentials section in My Cloud. * MacStadium supports customers who wish to bring their own mesh networks or other tools. 3. Keep the VPN connection to the cluster live. **Install and Configure orka3 CLI** 1. Visit the links below to download and install the orka3 CLI binary for the local environment. * [Orka CLI: latest release](/orka/orka-upgrades-and-release-notes/orka-35-release-notes) 2. Configure the local `orka3` environment with the appropriate ORKA\_API\_URL so the CLI knows where to connect. This step is a one-time effort. * In the Orka3 CLI, run `orka3 config set --api-url `. Invite users in the Portal via the [**Users- >Add New Users**](/orka/orka-cluster-access/customer-portal-manage-account-users) flow. ## 2. Run orka3 Login to Sign into the Control Plane orka3 is the CLI to interface with the Orka. Once connected to the VPN or mesh network, login and retrieve a token that can be used for subsequent interactions. 1. Use the orka3 CLI to login. The below command opens a web browser to support authentication with the MacStadium Customer Portal credentials. `orka3 login` 2. Obtain a token by running the following command to login to the cluster and obtain an authentication token. The token authenticates uniquely with Orka. This operation stores a token locally at `~/.kube/config` file. `orka3 user get-token` 3. *Optional* - Use the Orka3 API, provide the `Authorization: Bearer ` header in the API calls or authorize the Swagger UI at `/api/v1/swagger`. 4. *Optional* - For CI/CD integrations, authenticate with a dedicated service account. Tokens obtained via `orka3 login` and `orka3 user get-token` expire after 1 hour. Do not use them for CI/CD automation. Instead, use service accounts: `orka3 serviceaccount token `. See [Service Accounts](/orka/orka-cluster-access/orka-cluster-manage-service-accounts) for setup instructions. ## 3. Learn the 3 Main Objects **Nodes**, **images**, and **VMs** * Use `orka3 node list` to see a list of nodes or hosts in the cluster. Use the `-o wide` option to see more information about the nodes * Use `orka3 image list` to see information about the images available to the cluster for running as VMs * Use `orka3 vm list` to see information about the current VMs running in the cluster ## 4. Deploy and Connect to a New VM * Launch a VM from a base image, including options to load from the OCI registry. * For legacy users, there is a demonstrated loading from an NFS mount. * Access the VM via **SSH**, **VNC**, or **Apple Screen Sharing**. To deploy a VM, an image is required. Check the MacStadium registry on ghcr.io and pull an image, if the local image list is empty, or use an image from an OCI-compatible registry. Check [https://github.com/macstadium/orka-images](https://github.com/macstadium/orka-images) for the latest available OCI-compatible images provided by MacStadium. The images available out-of-the-box provide a pre-configured disk size and a pre-installed OS. ## 5. Modify, Save, and Stop the VM * Install dependencies or configure the environment for CI builds. * Once customized, save the VM configuration as a new image for future use. ## 6. Manage Image Caches Manage images stored on Orka nodes. By adding images to a node before deploying a VM, you can reduce the delay caused by remote or local image pulls, providing consistent deployment times. ## Recent Feature Highlights Key capabilities added since Orka 3.0: * **Public IP support** (3.1): Configure the CLI with a public API IP for use outside the private network. * **Scheduled image caching** (3.2): Pre-cache VM images on nodes before CI jobs run to eliminate pull delays. * **Display resolution flags** (3.4): Set `--display-width`, `--display-height`, and `--display-dpi` at VM deploy or config time. IPSW VMs default to 1920×1080×96. * **Harbor as default OCI storage** (3.5): New Orka deployments use Harbor OCI storage by default. Existing NFS-based deployments are not affected. * **Bridged networking** (3.5, on-prem only): VMs can connect directly to a physical network via DHCP. ## Next Steps - Integrate with CI Tooling See [Orka Tools & Integrations](/orka/orka-overview/tools-integrations) # Orka tools, CLI downloads, and CI/CD plugins Source: https://docs.macstadium.com/orka/orka-overview/tools-integrations Download Orka3 CLI binaries for macOS, Linux, and Windows, plus Orka VM Tools and CI/CD integrations for Jenkins, GitHub Actions, GitLab, and Buildkite. Tools for accessing the Orka service. CI/CD integrations for Orka. ## Orka3 CLI Visit the links below to download a version of the Orka CLI binary that matches your environment. | Release | Notes | macOS ARM | macOS AMD | Linux | Windows | | --------------------------- | -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | Orka3 CLI v3.6.3 *(Latest)* | [Release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes#orka-363) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.3/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.3/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.3/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.3/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.6.2 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes#orka-362) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.2/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.2/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.2/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.2/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.6.1 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.1/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.1/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.1/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.1/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.6.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.6.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.5.2 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-35-release-notes) | [Download](https://cli-builds-public.s3.amazonaws.com/official/3.5.2/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.amazonaws.com/official/3.5.2/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.2/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.2/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.5.1 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-35-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.1/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.1/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.1/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.1/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.5.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-35-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.5.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.4.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-34-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.4.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.4.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.4.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.4.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.3.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-33-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.3.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.3.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.3.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.3.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.2.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-32-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.2.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.2.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.2.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.2.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.1.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-31-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.1.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.1.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.1.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.1.0/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.0.2 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-30-release-notes#orka-v302) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.2/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.2/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.2/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.2/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.0.1 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-30-release-notes#orka-v301) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.1/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.1/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.1/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.1/orka3/windows/amd64/orka3.exe) | | Orka3 CLI v3.0.0 | [Release notes](/orka/orka-upgrades-and-release-notes/orka-30-release-notes) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.0/orka3/macos/arm64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.0/orka3/macos/amd64/orka3.pkg) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.0/orka3/linux/amd64/orka3.tar.gz) | [Download](https://cli-builds-public.s3.eu-west-1.amazonaws.com/official/3.0.0/orka3/windows/amd64/orka3.exe) | Complete the installation * On macOS, run the `orka3.pkg` package and complete the installation. * On Linux, unpack the archive and move the `orka3` executable to your `PATH` location (for example: `/usr/local/bin`). The file is already set as an executable. * On Windows, add the folder containing the downloaded executable to your `Path` system variable. Using Homebrew? Try `brew install --cask orka3`. ### Orka3 CLI v3.6.3 `orka3 imagecache remove` is now generally available (previously early access in 3.6.2). The `(Admin-only)` label has been removed from the `orka3 imagecache add` help text; the command does not require administrator privileges. For the full list of changes in this release, see the [Orka 3.6.3 release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes#orka-363). ### Orka3 CLI v3.6.2 CLI help text image references have been updated. For the full list of changes in this release, see the [Orka 3.6.2 release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes#orka-362). ## Orka3 API In addition to the [Orka CLI](/orka/quick-start-guides/orka3-cli-quick-start), MacStadium offers full-featured API integration as well. Check the [API Documentation](https://macstadium.github.io/orka-api-docs/) for more details. You can also use the Swagger UI to run API calls directly against your Orka cluster. Go to `/api/v1/swagger`. ## Orka Web UI For a more user-friendly way to manage your Orka environment, you can use the [Orka Web UI](/orka/quick-start-guides/web-ui-quick-start). ## CI/CD integrations MacStadium is constantly working on expanding the list of Orka integrations with leading CI/CD solutions. * [**Jenkins**](/orka/orka-devops-integrations/jenkins) * [**GitLab**](/orka/orka-devops-integrations/gitlab) * [**Buildkite**](/orka/orka-devops-integrations/buildkite) * [**TeamCity**](/orka/orka-devops-integrations/teamcity) * [**GitHub Actions**](/orka/orka-devops-integrations/github-actions) ## Orka VM Tools for ARM VMs Always run matching versions across your Orka cluster, Orka CLI, Orka VM Tools, and any CI/CD integrations. A version mismatch can cause deployment failures, broken image caching, and unexpected behavior. For example, if your cluster runs 3.5.x, your CLI and VM Tools should also run 3.5.x. **Using Homebrew?** Run `brew install orka-vm-tools` for a fresh install. To update an existing installation, run `brew upgrade orka-vm-tools`. Make sure to `commit` or `save` the changes to the base image and redeploy any existing VMs. Orka VM Tools are guest tools installed on your ARM-based VMs. They enable features like Disk Image Resize and VM Metadata. Visit the links below to download a version of the Orka VM Tools binary that matches your environment. | Release | macOS ARM | | ------------------------------- | -------------------------------------------------------------------------------------------------------- | | Orka VM Tools v3.6.0 *(Latest)* | [Download](https://orka-tools.s3.amazonaws.com/orka-vm-tools/official/3.6.0/orka-vm-tools.pkg) | | Orka VM Tools v3.5.2 | [Download](https://orka-tools.s3.amazonaws.com/orka-vm-tools/official/3.5.2/orka-vm-tools.pkg) | | Orka VM Tools v3.5.0 | [Download](https://orka-tools.s3.us-east-1.amazonaws.com/orka-vm-tools/official/3.5.0/orka-vm-tools.pkg) | | Orka VM Tools v3.3.0 | [Download](https://orka-tools.s3.amazonaws.com/orka-vm-tools/official/3.3.0/orka-vm-tools.pkg) | | Orka VM Tools v3.0.2 | [Download](https://orka-tools.s3.amazonaws.com/orka-vm-tools/official/3.0.2/orka-vm-tools.pkg) | | Orka VM Tools v3.0.0 | [Download](https://orka-tools.s3.amazonaws.com/orka-vm-tools/official/3.0.0/orka-vm-tools.pkg) | # Apple silicon Mac servers in Orka Source: https://docs.macstadium.com/orka/orka-resources/apple-silicon-based-support Run CI/CD on Apple silicon Mac servers with Orka. Create arm64 VMs, use image caching, and understand differences from Intel-based nodes. How to create VMs on Apple silicon-based nodes (also: Apple ARM-based nodes). Features and limitations. ## Overview Orka supports clusters of Apple silicon-based nodes (also: Apple ARM-based nodes) for running CI/CD workflows. Apple silicon-based nodes can be added to an existing cluster alongside Intel-based nodes, giving you a mixed Intel and Apple silicon cluster. Supported VM operations on Apple silicon-based nodes include deploy, delete, and list, as well as connecting to a VM via SSH or Screenshare. VMs deployed on Apple silicon-based nodes use Apple silicon images. A VM is deployed on an Apple silicon-based or Intel-based node depending on the chosen image. VMs based on Intel images (with the amd64 type) are deployed on Intel nodes and VMs based on Apple silicon images (with the arm64 type) are deployed on Apple silicon-based nodes. Orka image list showing arm64 and amd64 image types #### **Deployment on Apple silicon-based nodes** When a VM is deployed on an Apple silicon-based node and this is the first time the image is used on that node, the deployment takes longer, about 4 minutes. Further deployments of VMs using the same image on the same node happen almost immediately and take about 5 seconds. To keep deployment times fast, you might want to make sure you deploy a VM on all nodes every time you create a new image. Keep in mind though, that images are cached on the nodes. If you try to deploy a VM from an image that is not cached and there is not enough space on the node, the oldest cached image(s) will be deleted to free space for the new one. Below is a full list of features included in the Apple silicon-based support: Orka 3.5.2: * Per-instance shared attached disk sizing (AWS via user data; on-prem via Ansible) * CLI auto-reads default namespace from kubeconfig context (`ORKA_DEFAULT_NAMESPACE` override available) * macOS 26 Tahoe compatibility fixes (image deletion, copying, tagging) Orka 3.5.0: * macOS 26 Tahoe guest support (requires Sequoia 15.5 host) * Harbor OCI storage is now the default for new deployments * Bridged networking support (on-prem only) * Shared VM storage disabled by default for new deployments Orka 3.4: * Display resolution CLI flags: `--display-width`, `--display-height`, `--display-dpi` on `orka3 vm deploy` and `orka3 vm create` * IPSW VMs default to 1920×1080×96 resolution Orka 3.3: * `orka3 version` and `orka3 node list -o wide` now show component versions * Burst capacity support (elastic on-demand nodes) * Harbor OCI registry support added (became default in 3.5) * Hardware UUID generation control (3.3.2): consistent or dynamic Hardware UUIDs configurable per cluster Orka 3.2: * macOS 15 Sequoia support * Scheduled image caching * Apple ID authentication (Apple silicon hosts running Sequoia only; VM must be created from a Sequoia IPSW) Orka 3.1: * Public IP support in CLI and all integrations * `orka3 image list -o wide` shows disk size and storage size Orka 3.0: * Enable custom pods (formerly, sandboxing) * OCI-compatible images Orka 2.3: * VMs - macOS Ventura support, VNC connectivity Orka 2.2: * VMs - VM metadata * Images - resize * Integration with TeamCity Orka 2.1: * VM port mappings * VM Internet Isolation * VM Network Isolation * Images - copy, rename * Storage - shared attached disk, secondary storage * Integration with Tekton Orka 2.0: * VM configs - create, get, purge * VMs - deploy, delete, list, check status, connect via SSH, connect via Screenshare * Nodes - list, check status, list ports, dedicate * Images - list, rename, list remote, pull, delete, commit, save * Kube accounts - list, create, delete, regenerate, download kube-config * Users - all operations * Tokens - all operations * Logs - all operations * Environment checks - all operations * Integration with Jenkins, Gitlab, Buildkite, Github Actions, Packer #### **GPU Passthrough and IO Boost** With VMs based on Apple silicon images, GPU Passthrough comes out of the box. Therefore, the corresponding option `--gpu` is not applicable to them and will be ignored. ## Limitations You can deploy up to 2 VMs per Apple silicon-based node. This is an Apple EULA requirement and applies to all Apple silicon hardware generations. 1. The following operations are not supported on Apple silicon-based nodes: * VMs: stop, start, suspend, resume (these are Intel-only operations due to Apple Virtualization Framework limitations) * Images: download, upload Below is a list of the ones that are not applicable to Apple silicon-based VMs: * Images - generate empty storage * ISOs - all operations * Nested virtualization * Bring your own macOS serial number feature 2. If you deploy a VM on an Apple silicon-based node and try to log in to your iCloud account you might receive an error 'The action could not be completed'. This is a limitation of the Apple Virtualization Framework. As a workaround, you can download the needed software via a web browser and install it manually. 3. There are cases reported by customers that some VMs might not be accessed via ScreenShare, but only SSH. Further investigation shows that this is caused by a failed GPU module under the new Apple silicon architecture. There are also some external bug reports related to the issue [here](https://discuss.bitrise.io/t/known-issue-with-the-m1-open-beta-simulator-gpu-hang/20268) and [here](https://support.bitrise.io/hc/en-us/articles/5362027816093-Known-issue-with-the-M1-open-beta-Simulator-GPU-hang-). 4. VM revert is not supported due to limitations of the Apple Virtualization Framework. 5. Shared VM storage on Apple silicon-based nodes requires macOS Sequoia or later. 6. After you resize an Apple silicon-based VM and attempt to upgrade to a newer macOS version, the upgrade might fail or you might experience other issues with your VM. This is a limitation of the Apple Virtualization framework and applies to all macOS versions. **Workaround:** Upgrade the macOS image before resizing. If you have already resized, deploy a fresh VM from an unresized image and upgrade from there. # Orka Burst for on-demand elastic cluster capacity Source: https://docs.macstadium.com/orka/orka-resources/burst Scale your Orka cluster with Burst, which provides dedicated on-demand capacity during heavy CI/CD workloads. Learn how to enable and manage elastic nodes. # Overview Orka Burst provides dedicated, on-demand access to elastic cluster capacity when needed. It’s designed to grow your cluster size during heavy workloads, without the commitment of annual contracts. When required, you can enable burst capacity directly from your MacStadium Admin Portal. Orka Burst requires a one-time setup maintenance window to provision and configure the burst nodes. Once configured (see [Check burst status](#check-burst-status) below to confirm which nodes are burst-enabled), additional burst nodes are available within 15 minutes and billed only for the time used. # Key Concepts * A burst node is an on-demand, contractually provisioned node you can add to your cluster during high-workload periods. * Only administrators can start and stop burst nodes via the MacStadium Admin Portal. * Burst nodes are powered on/off manually by an admin user in the portal. * You cannot manage burst nodes directly within the Kubernetes cluster; node management commands are restricted for security. * Orka tags (similar to Kubernetes labels) can be used for monitoring burst nodes via Prometheus (`kube-node-labels` metric) or other tools. # First Time Setup * Contact your MacStadium sales team to enable Orka Burst on your cluster. * Log in to the MacStadium Admin Portal with an admin-level account. * Click the “Enable Burst” toggle and confirm to provision your burst nodes. MacStadium Admin Portal Enable Burst toggle * Click ‘Confirm’ to accept the use of the contracted service Orka Burst. Orka Burst confirmation dialog * When all scheduled burst workloads have completed and no remaining CI jobs are scheduled on burst runners, manually drain the Orka Burst nodes and move them to a different namespace. * After the empty Orka Burst nodes have been successfully moved to a different namespace, navigate back to the MacStadium Portal and click ‘Disable Burst’. MacStadium Admin Portal Disable Burst button # Enable/Disable Burst ## **Enable Orka Burst** After MacStadium support configures your burst nodes, you can turn them on via the portal. Enabling burst powers on the nodes and adds them to your cluster (this typically completes within 15 minutes). ## **Disable Orka Burst** Orka Burst has no knowledge of currently executing workloads, and as a result, any currently running jobs will fail and need to be rescheduled by the preferred scheduler controller. You may need to clean up failed workloads if the scheduled workloads are executing on disabled burst nodes, as Orka Burst is being disabled. When Burst is disabled, the nodes are powered down and removed from the cluster. Plan to disable burst during a period of low cluster utilization, and coordinate with your engineering team to drain or move any active workloads first. If your burst nodes are in the same namespace as your normal Orka nodes, move them to a separate namespace before disabling Orka Burst. This sandboxes the node and ensures no additional workloads are scheduled on it. You are responsible for monitoring burst node usage and moving nodes when no workloads are running on them. Once your cluster has passed its peak utilization, work with your engineering team to move idle burst machines to a separate namespace. ## **Removing Failing Workloads** 1. Identify the failing workload: `kubectl get --namespace=` and look for pods in CrashLoopBackoff, Failed, or Error status. 2. Delete the workload: `kubectl delete pod --namespace=` * Graceful deletion: use a `preStop` hook to allow pods to clean up before `SIGTERM`. * Forced deletion: add `--force --grace-period=0` to the delete command. 3. Confirm cleanup and reschedule your CI jobs once burst nodes are back online. # Automate burst via the Portal API For teams that manage CI/CD infrastructure programmatically, MacStadium provides a GraphQL API at `https://portal.macstadium.com/graphql` that gives you direct control over burst state. You can wire enable/disable into a pipeline trigger, a cron job, or a queue-depth-based scaler without anyone touching the portal. This API is actively used and supported. A formal versioning and stability commitment is on the roadmap. Until then, the operations documented here are stable but the broader API surface may change. All examples use `curl`, but any HTTP client works: POST to `https://portal.macstadium.com/graphql` with the appropriate `Authorization` header and JSON body. ## Get an API token You'll need a Portal user token with read/write access. To create one: 1. Log in to the [MacStadium Admin Portal](https://portal.macstadium.com) with an admin account. 2. Open the account menu and go to **Users**, then select the **Tokens** tab. 3. Create a new token and set read/write permissions. Copy the token and store it as an environment variable or CI/CD secret; you'll use it as `$TOKEN` in all requests below. This token is separate from the Orka service account tokens you use with the `orka3` CLI. Service account tokens authenticate against your Orka cluster; Portal tokens authenticate against `portal.macstadium.com`. ## Find your cluster ID The burst mutations require a cluster `id`, which is different from the human-readable `displayId`. Run this once to look it up: ```bash theme={null} curl -X POST https://portal.macstadium.com/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{"query":"{ viewer { account { orkaServices(pagination:{offset:0,limit:50}) { edges { node { id displayId } } } } } }"}' ``` The response lists all clusters on your account. The `displayId` is the human-readable name you recognize from the portal; the `id` is the opaque identifier you'll use in all subsequent requests. ```json theme={null} { "data": { "viewer": { "account": { "orkaServices": { "edges": [ { "node": { "id": "", "displayId": "my-orka-cluster" } } ] } } } } } ``` ## Check burst status ```bash theme={null} curl -X POST https://portal.macstadium.com/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "query": "query GetOrkaServiceById($id: ID!) { node(id: $id) { ... on OrkaService { id displayId name status hasBurst burstEnabled burstLastTime actions { canUpdate cannotUpdateReasons } } } }", "variables": { "id": "" } }' ``` Key fields in the response: | Field | Description | | --------------------- | --------------------------------------------------- | | `hasBurst` | Whether the cluster is provisioned with burst nodes | | `burstEnabled` | Current burst state | | `burstLastTime` | Timestamp of the last burst state change | | `canUpdate` | Whether burst can be toggled right now | | `cannotUpdateReasons` | If `canUpdate` is false, the reason | Check `canUpdate` before firing a mutation. A cluster mid-transition or in an error state will return `canUpdate: false`, and the mutation will fail if you don't check first. ## Enable burst ```bash theme={null} curl -X POST https://portal.macstadium.com/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "query": "mutation UpdateOrkaBurst($input: UpdateOrkaBurstInput!) { updateOrkaBurst(input: $input) { service { id displayId burstEnabled burstLastTime } } }", "variables": { "input": { "id": "", "state": true } } }' ``` A successful response returns the updated `burstEnabled: true` and a new `burstLastTime`. Burst nodes are typically available within 15 minutes. ## Disable burst Burst has no visibility into running workloads. Disabling burst while jobs are executing on burst nodes will cause those jobs to fail and require rescheduling. Review the workload drain steps in the [Enable/Disable Burst](#enabledisable-burst) section above before triggering a disable, especially from automation where no human is reviewing cluster state. ```bash theme={null} curl -X POST https://portal.macstadium.com/graphql \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "query": "mutation UpdateOrkaBurst($input: UpdateOrkaBurstInput!) { updateOrkaBurst(input: $input) { service { id displayId burstEnabled burstLastTime } } }", "variables": { "input": { "id": "", "state": false } } }' ``` ## Automation patterns **Pipeline trigger**: Call the enable mutation at the start of a heavy CI workflow and the disable mutation in a cleanup job at the end, after completing the [workload drain steps](#disable-orka-burst). This fits naturally as a wrapper job in GitHub Actions or GitLab CI that bookends your build runs. **Off-peak scheduler**: Run a cron job that disables burst during known low-utilization windows and re-enables it before peak hours. Pull `canUpdate` from the status query before each mutation so the job skips safely if the cluster isn't ready to toggle. **Queue-depth scaler**: Watch your CI queue depth and fire the enable mutation when pending jobs pass a threshold. If you're already tracking runner utilization, the burst toggle is a short hop from there. ## Monitoring burst consumption `burstLastTime` tells you when burst state last changed. If you need to track consumption against a pre-paid credit balance, contact [support@macstadium.com](mailto:support@macstadium.com) and your CSM can pull current usage data for your account. # Cluster Configurations Source: https://docs.macstadium.com/orka/orka-resources/cluster-configurations Cluster-level Orka settings: VM scheduling algorithm (default vs. most-allocated), GPU passthrough, VM internet isolation, and VM network isolation. What configurations are available on a cluster level and how to change them Every Orka cluster is provisioned with some defaults that can be further changed upon request. This page describes the cluster level features and their default values. ## VM Scheduling Introduced with Orka 2.0, VM scheduling allows you to control the algorithm used when scheduling VMs between the nodes. If no changes are applied, the default scheduling algorithm is used where VMs are scheduled in such a way that keeps balance between free and used resources on each node. It can be changed to the value of most-allocated where VMs are scheduled in a way that tries to exhaust resources on one node before starting scheduling on another. You can also control the VM scheduling algorithm when creating a VM configuration and when deploying a VM. [Read more about VM scheduling in the MacStadium blog.](https://www.macstadium.com/blog/vm-scheduling-in-orka-2.0) ## GPU Passthrough Introduced with Orka 1.5.0 for MacPro hosts and with Orka 1.7.0 for Mac Mini hosts, GPU Passthrough allows you to use the GPU available on a node from within a VM deployed on that node. It is disabled by default and can be enabled in the cluster either at the time of cluster provisioning or during an API update. **Intel only:** GPU passthrough is available for Mac Intel nodes only. This configuration does not apply to Apple silicon nodes. [Read more about GPU Passthrough, how to enable it and how to use it.](/orka/orka-configuration/performance-gpu-passthrough) ## VM Internet Isolation Introduced with Orka 1.5.3, VM Internet isolation lets you control internet access from within VMs. It is disabled by default. When enabled, VMs cannot access the internet. The feature can be enabled during cluster provisioning or Orka upgrade. [See how to request an Orka upgrade.](/orka/orka-upgrades-and-release-notes/orka-upgrades) ## VM Network Isolation Introduced with Orka 1.5.1, VM network isolation lets you control access from one VM to another and from a VM to the Orka API. It is disabled by default. When enabled, VMs cannot communicate with each other and cannot access the Orka API. The feature can be enabled during cluster provisioning or Orka upgrade. [See how to request an Orka upgrade.](/orka/orka-upgrades-and-release-notes/orka-upgrades) ## Burst Capacity Introduced in Orka 3.3, Orka Burst gives you dedicated, on-demand access to elastic cluster capacity. Burst nodes are provisioned temporarily and returned when the workload completes, letting you handle spikes without permanently expanding your cluster footprint. To add burst nodes to your account, contact MacStadium through the [Account Portal](https://portal.macstadium.com/). ## Hardware UUID Generation Control Introduced in Orka 3.3.2, clusters can be configured for either consistent or dynamic Hardware UUID generation: * **Consistent Hardware UUIDs** (default): each VM deployed from the same image gets the same Hardware UUID and serial number. Useful for code signing workflows that require a stable machine identifier across deployments. * **Dynamic Hardware UUIDs**: each deployment gets a unique Hardware UUID and serial number. Useful for VDI, MDM enrollment, and remote desktop use cases where each VM represents a distinct machine. [Contact support](/macstadium/support/support) to change this setting for your cluster. **Hardware UUID vs. Provisioning UDID** These are different identifiers. This setting controls the Hardware UUID, which appears as "Hardware UUID" in System Information. The Provisioning UDID used by Apple's signing and Provisioning Profile system is separate and is not controlled by any Orka setting. On macOS 15 (Sequoia) ARM VMs, Provisioning UDIDs may not stay consistent across deployments from the same image. This is a known issue with how macOS generates Provisioning UDIDs on Sequoia hosts, and Apple has an open bug against it. If your signing workflow requires stable Provisioning UDIDs, the current workaround is to start with a macOS 14 (Sonoma) base image, upgrade the guest to macOS 15 in-place, then save it with `orka3 vm save`. VMs deployed from that saved image inherit the Provisioning UDID from the save point. ## Component Version Visibility Introduced in Orka 3.3, you can check which version of each Orka component is running: ``` orka3 version orka3 node list -o wide ``` ## Display Resolution per VM Introduced in Orka 3.4, you can set custom display resolution when deploying or configuring a VM: ``` orka3 vm deploy --image --display-width 2560 --display-height 1600 --display-dpi 320 ``` Available flags: `--display-width`, `--display-height`, `--display-dpi`. These flags work with both `orka3 vm deploy` and `orka3 vm create`. VMs created from IPSW files default to 1920×1080×96 if no display flags are specified. Constraints: width 320–3840 px, height 480–2160 px, DPI 60–240 px (320 px optional max). ## Harbor OCI Storage Introduced in Orka 3.3.2 and made the default in Orka 3.5, Harbor OCI storage is MacStadium's managed image registry. New Orka deployments use Harbor by default. Existing NFS-based deployments retain their current configuration. Capabilities include OCI-compliant image storage, role-based access control, activity auditing, and Prometheus metrics support. See [Using Harbor OCI Storage with the Orka CLI](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli) for setup details. ## Bridged Networking Introduced in Orka 3.5 for on-prem deployments. Bridged networking lets Orka VMs connect directly to a physical network as native devices, receiving IP addresses from your existing DHCP server. This enables direct communication with other network devices without NAT. Customers must configure their own DHCP server. Static IP assignment through Orka is not currently supported. Bridged networking is available for on-prem deployments only. See [Bridge Networking with Orka](/orka/orka-on-aws-and-on-prem/using-bridge-networking-with-orka-350) for configuration steps. ## Custom-Pods Namespace: Read-Only Access to the Containers File System Introduced with Orka 1.5.2, this feature lets you control access to the container's root file system from resources deployed in custom-pods namespaces. It is disabled by default, which means resources have read/write access to the container's root file system. When enabled, the container's root file system is read-only for resources in the namespace. Check Kubernetes [Security Contexts](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) and the readOnlyRootFilesystem field for more information. The feature can be enabled during cluster provisioning or Orka upgrade. [See how to request an Orka upgrade.](/orka/orka-upgrades-and-release-notes/orka-upgrades) # Consuming Metrics from Prometheus Source: https://docs.macstadium.com/orka/orka-resources/consuming-metrics-from-prometheus Scrape Prometheus metrics from your Orka cluster: server, operator, and node exporter endpoints. Covers Prometheus config, the web console, and Grafana. How to aggregate data from Prometheus node exporters and access the Prometheus web console It is possible to collect Prometheus metrics directly from your Orka cluster, including host metrics for each node in the cluster as well as metrics for the Orka API server and operator. Prometheus metrics support has been available since Orka 3.0. Starting with Orka 3.5, clusters using Harbor OCI storage also have Prometheus metrics available for the Harbor registry. Contact support to confirm your Harbor Prometheus endpoint if you're on Orka 3.5 or later. ## Integrating Orka metrics with an existing Prometheus instance If your organization is already using Prometheus and you wish to collect additional data from your Orka cluster, follow the instructions in this section. ### Orka Server and Operator Metrics #### A Note About the Orka Server Starting with Orka 3.0, the API server is no longer primarily responsible for managing Orka VMs. Instead, the operator is primarily responsible for managing the lifecycle of Orka VMs and other resources. Clients such as the orka3 CLI speak directly to the Kubernetes API instead of the Orka API. As a consequence, metrics for the Orka API Server are generally less relevant, unless you are using workflows and integrations that still rely on the legacy API server. Metrics for the Orka server and operator are available via the /metrics endpoint of the Orka load balancer address. For most environments this is typically 10.221.188.20 or 10.221.188.100, but check the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan) if you aren't sure. Use port 8080 in the endpoint for the operator metrics. To verify you are able to access the Orka server and operator metrics, try cURLing the endpoints: **curl** ``` curl -I 10.221.188.20/metrics curl -I 10.221.188.20:8080/metrics ``` You should receive a response of 200 OK if all is well. To view descriptions and additional information on the available Orka server metrics, try `curl 10.221.188.20/metrics`. For Orka operator metrics, try `curl 10.221.188.20:8080/metrics`. In order to scrape the Orka server and operator metrics, add jobs to your Prometheus configuration: **prometheus.yml** ``` scrape_configs: # ... - job_name: 'orka/orka-server' scrape_interval: 30s scrape_timeout: 30s metrics_path: /metrics scheme: http static_configs: - targets: ['10.221.188.20'] labels: service: 'orka-server' - job_name: 'orka/orka-operator' scrape_interval: 30s scrape_timeout: 30s metrics_path: /metrics scheme: http static_configs: - targets: ['10.221.188.20:8080'] labels: service: 'orka-operator' ``` ### Prometheus node exporters Every node in the Orka cluster runs a Prometheus Node Exporter on port 9100. This includes both Intel and ARM nodes. To ensure you are able to scrape the node exporter data, try cURLing the metrics endpoint from any node: **curl** ``` curl -I http://10.221.188.31:9100/metrics ``` If the node exporter is running and reachable from outside the cluster, you should receive a response of 200 OK. **Outside access:** If your Prometheus instance is hosted outside of the cluster, make sure that TCP traffic is permitted to port 9100 for all hosts on the Orka private network. For more information, see [My Cloud](/macstadium/macstadium-overview/ip-plan). In order to scrape the node exporter data, add a job to your Prometheus configuration. For example: **prometheus.yml** ``` scrape_configs: # ... - job_name: 'orka/node-exporter' scrape_interval: 5s static_configs: - targets: ['10.221.188.5:9100', '10.221.188.6:9100', '10.221.188.7:9100'] labels: group: 'master' - targets: ['10.221.188.31:9100', '10.221.188.32:9100', '10.221.188.33:9100'] labels: group: 'x86' - targets: ['10.221.188.34:9100'] labels: group: 'arm' ``` As an alternative to the static config, you can use [file-based service discovery](https://prometheus.io/docs/guides/file-sd/) to scrape the targets. ## GitHub Actions integration metrics The [Orka GitHub Actions integration](https://github.com/macstadium/orka-github-actions-integration) can optionally expose Prometheus metrics for runner scale set statistics. This is opt-in and disabled by default. ### Enable metrics Set the following environment variables when running the integration: | Variable | Default | Description | | ----------------------- | ------- | --------------------------------------------------------------------- | | `ENABLE_METRICS` | `false` | Set to `true` to expose a `/metrics` endpoint. | | `METRICS_ADDR` | `:8080` | Address where the metrics endpoint listens. | | `METRICS_POLL_INTERVAL` | `30s` | How often runner scale set statistics are polled (e.g., `30s`, `1m`). | ### Available metrics All metrics carry a `runner_name` label corresponding to the runner scale set name. | Metric | Description | | ------------------------------------------- | ---------------------------------------------- | | `runner_scale_set_total_available_jobs` | Jobs available to be assigned to a runner | | `runner_scale_set_total_acquired_jobs` | Jobs acquired by a runner but not yet assigned | | `runner_scale_set_total_assigned_jobs` | Jobs assigned to a specific runner | | `runner_scale_set_total_running_jobs` | Jobs currently executing | | `runner_scale_set_total_registered_runners` | Runners registered with GitHub | | `runner_scale_set_total_busy_runners` | Runners currently processing a job | | `runner_scale_set_total_idle_runners` | Runners registered but not processing a job | ### Scrape configuration Add a job to your `prometheus.yml` to scrape the integration: ```yaml theme={null} scrape_configs: # ... - job_name: 'orka/gha-runner' scrape_interval: 30s metrics_path: /metrics scheme: http static_configs: - targets: [':8080'] labels: service: 'orka-gha-runner' ``` Replace `` with the hostname or IP of the machine running the GitHub Actions integration. The port should match `METRICS_ADDR` (default `8080`). # Orka image caching for faster VM deployments Source: https://docs.macstadium.com/orka/orka-resources/image-caching Pre-download OCI images to Orka nodes before deployment to eliminate pull delays during CI runtime. Available in Orka 3.2 and later for Apple silicon clusters. **Requires Orka 3.2 or later** on an Apple silicon cluster. If you're on an earlier version, this feature is not available. # About Image Caching lets you download Orka images ahead of time to any node in the Orka cluster. Pre-caching images provides faster and more reliable VM deployments by reducing delays caused by network bandwidth issues. Without Image Caching, automated CI jobs pull new images from a remote OCI registry or the local cluster datastore (NFS) during CI runtime, which can cause delays. # System Requirements Scheduled Caching is available for: * Orka 3.2+ * macOS computers based on Apple silicon # Overview The first time a VM is run on a node, the image needs to be cached locally on that node. Previously, you could not bypass this step before running automated CI pipeline jobs. Since initial image pull speed depends on image size, network bandwidth, and node resource utilization, a build using a new VM image can take several minutes and produce inconsistent deployment times. Scheduled Caching lets you bypass these delays by pre-caching new images on Orka cluster nodes before CI automation starts. The cluster knows which nodes have necessary images cached, greatly reducing image loading and scheduled downtime. If a node cache lacks a needed image, you can pick nodes for cache operations and stipulate that VMs deploy on those nodes using those images. In other words, Scheduled Caching is an asynchronous operation. ## Key Concepts * Image Caching allows preemptive copying of an Orka VM image on any cluster node member, to avoid delays caused by network bandwidth when images are pulled from an OCI registry or the cluster NFS datastore. * An image is the bits on disk representing a VM that can be used for saving state and sharing modifications. * MacStadium base VM Orka images are macOS OCI compliant VM images stored in our public GitHub registry [ghcr.io/macstadium/orka-images/](https://ghcr.io/macstadium/orka-images/) with user credentials user/pwd: **admin/admin**, have Homebrew package manager installed, orka-vm-tools installed, and have screen sharing enabled and SSH access enabled. * Cluster local storage is an NFS mounted filesystem for storing images locally (local registry service). NFS is a legacy storage path. For clusters on Orka 3.5 or later, OCI-based storage via Harbor is recommended. See [Migrating NFS images to OCI with Harbor](/orka/oci-images/orka-self-service-migrating-nfs-images-to-oci-with-harbor). * A VM is a virtual runtime on top of the macOS host. The VM runs a guest OS image and macOS supports up to 2 running VMs per cluster node. * Sequoia refers to macOS 15 (the latest Sequoia release available from Apple’s servers). macOS 26 Tahoe is also available as a guest OS starting in Orka 3.5. Orka can deploy a VM from multiple image sources: a cloud image datastore (OCI registry service), cached images on a cluster node member, and Orka’s local cluster registry (NFS, legacy). There are three distinct CLI commands to display each storage type and the images available on that datastore. # Getting Started To get started with Scheduled Caching via the Orka3 CLI, take the following steps: 1. Run `orka3 imagecache -h` to see the CLI tree structure: commands, subcommands and options/flags 2. Run `orka3 image list` to view images used by the Orka cluster so far 3. Run `orka3 imagecache list` to view images currently stored on Orka Cluster nodes 4. View the Orka Cluster node names by typing `orka3 node list` 5. Add a new image to a cluster node `orka3 imagecache add` 6. Check the status of an image caching operation `orka3 imagecache info` 7. Rapidly deploy a new VM using a recently cached Orka image on a specific node `orka3 vm deploy --image --node ` # Image Caching FAQs General information and guidance on Scheduled Caching * **Does caching have an impact on running VMs?** * Caching small images (16 GB) may be unnoticeable in VMs with long-running build times. (If a build takes 10 minutes, then a cache operation of 1 minute has a lower impact on the overall duration of the build job.) * The greater the number of images cached, the more significant the impact on a running VM on that node, due to resource contention. The image caching operation consumes resources on the node, particularly disk I/O. * **How many cache operations can run at once?** * Currently, a cache job requires 0.5 CPU to run. On a machine with 8 CPU available, it can run a maximum of 16 jobs. * Caching more images simultaneously is faster than caching multiple images sequentially. * **Does caching have an impact on build performance?** * Performance is impacted depending on the number of cache operations running. * MacStadium recommends that build jobs and caching operations not run concurrently unless: * The actual image size is small. * Long-running builds are active, and a small performance hit is acceptable. * **Does caching have an impact on the performance of other cache operations?** * Yes. A VM running on a node with an active caching job will see a noticeable increase in task execution time, proportional to the size of the image being written. * **Does caching have an impact on network, memory, or CPU performance?** * Nodes with an active caching download can impact a VM’s performance, including network I/O operations and CPU/memory availability. * **Does caching have an impact on cluster performance?** * The Orka scheduler may experience increased latency on any node running active caching operations. * **Can I delete images from a cluster node cache?** * Yes, on Orka 3.6.3 and later. Use `orka3 imagecache remove IMAGE_NAME --nodes NODE_NAME` to remove a cached image from a specific node, `--all` to remove from every node in the namespace, or `--tags` to target nodes by tag. This also covers images that were cached automatically when a VM was deployed. Removal is asynchronous; run `orka3 imagecache info IMAGE_NAME` to check the status. See [orka3 imagecache remove](/orka/orka3-cli-reference/image-management#orka3-imagecache-remove) for the full reference. Do not run this command while VMs are actively being deployed from that image: if removal runs between a deployment's pull and clone stages, the deployment may fail with a generic error. **Orka 3.5.1 fix:** `orka3 ic add` previously failed silently when caching images to nodes in custom namespaces. This is resolved in Orka 3.5.1. If you cache images to non-default namespaces, upgrade to 3.5.1 or later and re-cache any previously failed images. # Orka Required URL Rules for Filtering Source: https://docs.macstadium.com/orka/orka-resources/orka-required-url-rules-for-filtering Required URL allowlist rules for Orka Cluster. Covers client-side and LAN-side rulesets tested on Cisco Firepower for customers who filter outbound traffic. ## About Orka Cluster was designed with minimal internet access to increase security, however, you must set up some restricted internet access. This document lists the required URLs that must be enabled to use Orka Cluster. These are rulesets tested on a Cisco virtual Firepower appliance, running the Firepower Threat Defense operating system. These rulesets permit the minimum amount of traffic required for Orka functionality. Orka Cluster customers must manage these URLs to support Orka Cluster functionality. This only applies to customers who have security requirements that filter URLs, either from the MacStadium side or through tunneling traffic to another firewall. The rulesets below cover two traffic categories: Client-Side and LAN-Side. ## Overview The ruleset are divided into two sections: * **Client-Side Traffic:** Any traffic whose destination is the Orka API controller, the Orka physical hosts, the Orka virtual machines, and the single sign-on (SSO). * **LAN-Side Traffic:** Any traffic originating from the Orka network that exists behind the firewall. The document assumes that the Orka network is on `10.221.188.x`. ## Rulesets ### Client-Side Ruleset | Source | Destination | Protocol and Port # | Applications | URLs | Descriptions | | --------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | Permit Client | Public DNS server | | DNS | | DNS Resolution | | Permit Client | Public DNS server | | DNS over HTTPS | | DNS Resolution | | Permit Client | | | HTTP
HTTPS | [http://idp.macstadium.com](http://idp.macstadium.com/)
sso.macstadium.com | Single sign-on requirement | | Permit Client | API Controllers
10.221.188.19
10.221.188.20 | HTTP
TCP 6443 | | | .19 requires TCP/6443 - Ku. LB
.20 requires HTTP - ORKA API | | Permit Client | 10.221.188.22 | | HTTPS | | Traefik - a reverse proxy
Use case: if customer is using HTTPS to access ORKA | | Permit Client | 10.221.188.31 through 10.221.189.254 | TCP 5900-6200 (Screenshare)
TCP 5999-6299 (VNC)
TCP 8822-9122 (SSH) | | | Reserved ports for interacting with created VMs. These ranges are globally tracked and allocated per Apple silicon node. | | Permit Client | 10.221.188.0/23 | | ICMP
SSH | | Ask/Requirement for ORKA Support during troubleshooting sessions | | **Deny Client** | ANY | | | | A catch all deny rule if traffic doesn't match the above | ### LAN-Side Ruleset | Source | Destination | Protocol and Port # | Applications | URLs | Descriptions | | --------------------- | -------------------------------------------------------------------- | --------------------------------------------------- | ------------------------------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Permit Orka Network | ANY | | NTP | | Client and Administration requirement for DNS and NTP services | | Permit Orka Network | ANY | | DNS | | Client and Administration requirement for DNS and NTP services | | Permit Orka Network | ANY | | DNS over HTTPS | | Client and Administration requirement for DNS and NTP services | | Permit Orka Network | 207.254.1.172
207.254.72.172
208.83.0.22
199.19.85.74 | TCP 2049 | | | NFS needed for Remote ISO shares. Set per market; where client download ISO files from MacStadium:
ATL - 207.254.1.172,
LSV - 207.254.72.172,
DUB - 208.83.0.22,
SJC - 199.19.85.74 | | Permit Orka Network | | | HTTP | mirror.math.princeton.edu | FCOS Linux Internal Packages: for the environment during the provisioning process; where dependencies are pulled - administration purposes; not client usage | | Permit Orka Network | | | HTTPS | hooks.slack.com | Action Runner (typically 10.221.188.10) to update Slack - administration purposes; not needed for client use | | Permit Orka Network | | | HTTPS | us-west2-docker.pkg.dev | Needed for Administrative purpose; in case POD needs to repull image; for client; if they are deploying Intel VMs then this rule is needed. | | Permit Orka Network | | | HTTPS
Web Applications
SSL Client | production.cloudflare.docker.com | Requirement for Docker certificates | | Permit Orka Network | | | HTTPS | hub.docker.com | Administration rule requirement: Requirement for Docker Container Images | | Permit Orka Network | | | | k8s.gcr.io | Administration rule requirement; Requirement for K8S Container Images | | Permit Orka Network | | TCP 10259
TCP 2379
TCP 2380
TCP 6443 | | registry.k8s.io | Administration traffic; client use not necessary: review rules | | Permit Orka Network | | | HTTPS | pkgs.k8s.io | Administration Stacks requirement | | Permit Orka Network | | | HTTPS | k8s.io | catch-all for the URL | | Permit Orka Network | | | HTTP
HTTPS | get.helm.sh | Administration Requirement for K8 Stack | | Permit Orka Network | | | HTTPS | projectcalico.org | Administration Requirement for K8 Stack | | Permit Orka Network | | | HTTPS | updates.cdn-apple.com | Client and Administration requirement - especially based on VMs OS | | Permit Orka Network | | | HTTPS | configuration.apple.com | Client and Administration requirement - especially based on VMs OS | | Permit Orka Network | | | HTTPS | adc.apple.com | Client and Administration requirement - especially based on VMs OS | | Permit Orka Network | | | HTTPS | swscan.apple.com | Client and Administration requirement - especially based on VMs OS | | Permit Orka Network | | | HTTPS | apple.com | Catchall for any other apple site that appeared as blocked during the earlier POC session | | Permit Orka Network | | | HTTPS | formulae.brew\.sh | Client and Administration requirement - dependency for MacOs package manager | | Permit Orka Network | | | Amazon Web Services | | Administration Requirement for ORKA Stack | | Permit Orka Network | | | HTTPS | mimir.nap.macstadium.com | Administration Requirement for monitoring Stack | | Permit Orka Network | | | HTTPS | grafana.orka.dev | Administration Requirement for monitoring Stack | | Permit Orka Network | | | HTTPS | dns-challenge-validator.orka.dev | Client and Administration Requirement for Certificate Validation | | Permit Orka Network | | | HTTPS | loki.orka.dev | Administration Requirement for monitoring Stack | | Permit Orka Network | | | HTTPS | orka.dev | Catch-all for the URL | | Permit Orka Network | | | HTTPS | pypi.org | Administration Requirement for Docker Authentication | | Permit Orka Network | | | HTTPS | pypi.org | Administration Requirement for Docker Authentication | | Permit Orka Network | | | HTTPS | auth.docker.io | Administration Requirement for Container images | | Permit Orka Network | | | HTTPS | charts.jetstack.io | Administration Requirement for Container images | | Permit Orka Network | | | HTTPS | fedoraproject.org | Administration Requirement for Container images | | Permit Orka Network | | | HTTPS | edge.kernel.org | Administration Requirement for Container images | | Permit Orka Network | | | HTTPS | files.pythonhosted.org | Administration Requirement for python dependencies | | Permit Orka Network | | | HTTPS | ghcr.io | Administration Requirement for Container and Client images | | Permit Orka Network | | | Github | | Client and Admin Requirement for OCI | | Permit Orka Network | | | HTTPS | quay.io | Administration Requirement for Container and Client images | | Permit Orka Network | | | HTTPS | packages.cloud.google.com | Administration Requirement for Container images | | **Deny Orka Network** | ANY | | | | A catch all deny rule if traffic doesn't match the above | # Resiliency, High Availability, and Disaster Recovery Source: https://docs.macstadium.com/orka/orka-resources/resiliency-high-availability-and-disaster-recovery Orka HA and DR: k8s control plane resiliency, image storage options, VM runtime behavior, and guidance for multi-cluster and backup configurations. The following will provide guidelines for resiliency, HA, and DR capabilities regarding Orka. ## About Orka provides orchestration and virtualization for virtualized runtime environments on macOS. It is particularly well-suited for continuous integration (CI) build and test processes. ## Overview This document outlines the built-in Resiliency, High Availability (HA), and Disaster Recovery (DR) capabilities of Orka Cluster components when hosted on MacStadium. The document also outlines additional solutions, which can be implemented with added complexity and cost to achieve more advanced setups. It is important to note that HA/DR setups can vary significantly in complexity and cost, based on individual needs. Orka Cluster provides substantial resiliency as part of its core offering, which is achieved by balancing effectiveness, sound expectations, and shared responsibilities between MacStadium and our customers. ## Key Components When considering resiliency, HA, and DR for Orka, we focus on three main software considerations of the system: * Control Plane that orchestrates the workloads * Images that can be instantiated as VMs * VM Runtimes that are executing the workloads See the following diagram of these components. ![Orka Cluster 3 architecture diagram showing the control plane, OCI registry, and bare metal Mac host components](https://files.readme.io/4225fbdf28c4fd19feb3eb4b8935792c0cda9b167ddcbb83e6d7d87ecb1a27da-Orka_Cluster_3_Arch_Diagrams.png) Each component has a different approach and set of requirements to support the availability and recoverability of the Orka environment. ### Control Plane The Control Plane is built on k8s, and is responsible for managing and distributing workloads across the system. **Resiliency/HA Capabilities** * When hosted by MacStadium, Orka Cluster employs an *active-active* control plane architecture, utilizing three VM hosts located in a single site\*. If a node goes down, another node takes over while the failed node restarts. * Active-active control plane is enabled with *Orka Cluster Advanced*. * This setup provides a level of resiliency and High Availability (HA) if one or two control plane nodes fail, so the system can continue orchestrating workloads without interruption. **DR Capabilities** * MacStadium implements regular backups of control plane configurations, which are stored on the master nodes on the NFS mount. * In the unlikely event of a complete control plane loss, our Disaster Recovery (DR) plans include the ability to redeploy the control plane based on the most recent backup. ### Images Images are the saved state of a VM on disk that can be used to run VMs. **Resiliency/HA Capabilities** * When hosted by MacStadium, Orka Cluster stores images in a Pure storage array, known for its high level of resiliency. RAID capabilities provide protection against drive failures. * If you prefer more control or have existing storage solutions, Orka Cluster supports image storage on any OCI-compliant repository. You can implement High Availability (HA) solutions using the capabilities provided by the repository. **DR Capabilities** * The Pure storage arrays can take backups at scheduled intervals and store data in adjacent storage for an additional price. * If you run an OCI-compliant repository, you can implement DR solutions using the capabilities provided by the repository. ### Harbor OCI Storage Starting with Orka 3.5, Harbor OCI storage is the default managed storage solution for new Orka deployments. Harbor is a MacStadium-managed, OCI-compliant image registry that provides: * Secure image storage with role-based access control * Activity auditing and compliance tracking * Prometheus metrics support * Automatic resource scaling based on available Orka nodes Existing deployments using Pure NFS storage retain their current configuration. Customers running Harbor can implement DR solutions using the capabilities of their OCI registry. See [Using Harbor OCI Storage with the Orka CLI](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli) for details. ### VM Runtimes VM Runtimes are the ephemeral macOS instances themselves. These VMs typically execute a job and return some artifacts (such as a build) when complete. **Resiliency/HA Capabilities** * In a failure, these VMs are quickly and easily restarted by the calling applications. The VMs run on a single macOS host/node and do not provide any built-in HA capabilities. **DR Capabilities** * VMs are intended to be ephemeral and do not implement DR capabilities. ## Redundant data centers To achieve a resilient solution across multiple data centers, MacStadium works with customers to architect a solution to route traffic between multiple geographic sites. These solutions are designed for customers who need near-continuous uptime and wish to mitigate risks associated with localized disruptions. They are not out of the box and require additional design considerations with our team. ### Cluster deployment across data centers In a redundant data center configuration, you can balance workloads between data centers using a load balancer or traffic router that sits above both clusters. You can distribute and route workloads to the most suitable site based on resource availability or performance considerations. This solution supports use cases like high availability, blue/green deployments, and rolling upgrades. It also enables testing of new deployments without risking production environments and allows for a controlled fallback if any issues are encountered. In the event of a failure at one data center, the load balancer is reconfigured and redirects all traffic to the operational cluster. The details of this failover mechanism are designed to meet the SLAs of the customer. ## Additional Responsibilities Effective High Availability / Disaster Recovery is a shared responsibility between MacStadium and our customers. Understanding these responsibilities is crucial for maintaining a strong HA/DR posture. ### MacStadium Responsibilities * MacStadium is committed to ensuring that all hardware provided to the customer is operational and performing as expected. * In the event of a failure, MacStadium is prepared to rebuild an Orka Cluster environment specific to that customer. This ensures that customers can resume operations as quickly as possible. * MacStadium continuously monitors and maintains the underlying infrastructure to prevent potential issues before they impact customer operations. ### Customer Responsibilities * If you store images in OCI-compliant repositories, implementing and managing DR plans for these images is your responsibility. * Maintain up-to-date documentation of your Orka Cluster configurations to facilitate faster recovery. # Shared VM storage for Orka CI artifacts Source: https://docs.macstadium.com/orka/orka-resources/shared-vm-storage Mount a shared storage volume across Orka VMs for CI artifact caching. Available for Apple silicon and Intel VMs running macOS Ventura or later. | Platform | Status | Notes | | ----------------------------------------- | --------------------------------------------------------------------------------------- | ---------------------- | | Apple silicon, macOS Ventura and later | Supported as of [Orka 3.0](/orka/orka-upgrades-and-release-notes/orka-30-release-notes) | Requires Orka VM Tools | | Intel, macOS Ventura (13) and Sonoma (14) | Supported | | **Orka 3.5 default change:** Shared VM storage is disabled by default for new Orka deployments. Existing deployments retain the previous setting (enabled). To enable shared storage on a new deployment, open a support ticket. **Orka 3.5.2:** Per-instance shared attached disk sizing is now supported. On AWS, set `VM_SHARED_DISK_SIZE` in each instance's user data script. On-prem, set `osx_node_orka_vm_shared_disk_size` via Ansible. See the [Orka 3.5.2 release notes](/orka/orka-upgrades-and-release-notes/orka-35-release-notes) for full setup steps. ## Overview Starting with Orka 1.6.0, all deployed Intel-based VMs will have access to a shared storage volume in the cluster. Starting with Orka 2.1.0, all deployed ARM-based VMs will have access to the same shared storage. This storage can be used to cache build artifacts in-between stages of your CI/CD pipeline, for example, or host Xcode installers and other build dependencies. Orka offers two different ways to utilize shared VM storage: 1. By default, the VM shared storage directory will be placed on the primary NFS storage export for your cluster. This means that VM shared storage will share storage space with VM images and ISOs, so please keep this in mind! 2. Optionally, you may request to provision a secondary storage export that will be dedicated to shared storage. This is ideal if you plan to share a lot of data between your CI/CD pipeline builds. ## Shared Storage in ARM-based VMs In ARM-based VMs the shared storage will be automatically mounted and available to use. Same storage is shared between ARM-based and Intel-based VMs. To use shared VM storage with VMs deployed on ARM nodes, your image must include Orka VM Tools. Orka VM Tools is required for shared storage to automount in the VM. [Learn more about pulling an image](/orka/orka3-cli-reference/image-management) ## Shared Storage in Intel-based VMs ``` sudo mount_9p orka ``` The volume will be mounted at /Volumes/orka. The first time you attempt to access the filesystem via Terminal, you will be asked to grant the Terminal application permissions to access files on a network volume: macOS prompt requesting Terminal access to network volume Click the OK button to allow access. You will then be able to access files on the volume: Terminal showing /Volumes/orka mounted and accessible ## Automount shared storage in Intel-based VMs Instead of mounting the shared storage manually after every OS restart, you can create a /Library/LaunchDaemons/com.mount9p.plist to handle automounting the shared storage. 1. Connect to your VM via SSH. ``` ssh @ -p ``` 2. Make sure that /Volumes/orka is already mounted on the VM. ``` ls /Volumes ``` 3. If not already mounted, mount the shared VM storage. ``` sudo mount_9p orka ``` 4. Navigate to /Library/LaunchDaemons and create a com.mount9p.plist file. ``` cd /Library/LaunchDaemons ls sudo vim com.mount9p.plist ``` 5. Copy the following contents and paste them in Vim. Type :wq to save and exit.\ com.mount9p.plist ``` Label com.mount9p.plist RunAtLoad StandardErrorPath /var/log/mount_9p_error.log StandardOutPath /var/log/mount_9p.log ProgramArguments /bin/bash -c mkdir -p /Volumes/orka && mount_9p orka ``` 6. Change the ownership and permissions for com.mount9p.plist. ``` sudo chown root:wheel /Library/LaunchDaemons/com.mount9p.plist sudo chmod 600 /Library/LaunchDaemons/com.mount9p.plist ``` 7. Reboot the VM and save or commit the VM image. ## Limitations ### Reading and Writing Data You may encounter permissions issues when reading or writing data to the shared storage volume. In order to get around this, you may need to become the root user to write data to the shared storage volume. If you need to give a specific user read and write access to files, you can add that user to the group 107. For example, if your CI user is called machine-user create the group ci: ``` sudo dscl . create /Groups/ci sudo dscl . create /Groups/ci gid 107 sudo dscl . create /Groups/ci passwd '*' sudo dscl . create /Groups/ci GroupMembership machine-user ``` Confirm the above changes were made with the command dscl . read /Groups/ci. Reboot the virtual machine and save or commit the VM image to persist these changes. Files must be given group write access to be modified by the user you have added to the 107 group. For example, `sudo chmod g+w myfile.txt`. ### Cluster storage limits If you are using the default primary storage export in your cluster for shared VM storage, keep in mind that this storage is also used to host your Orka VM images and other data. This should be acceptable for sharing a limited set of files between virtual machines but is not recommended for intensive IO. In the case that you require frequent use of multiple reads and writes to the shared storage volume, setting up dedicated secondary storage is highly recommended. ## Known Issues When connecting to the VM over SSH and attempting to access the shared storage volume, you may encounter the error orka: Operation not permitted: Terminal showing "orka: Operation not permitted" SSH error To fix this issue, connect to the VM via VNC and navigate to **System Settings → Privacy & Security → Full Disk Access**. Click the padlock to make changes: macOS Security and Privacy Full Disk Access settings with padlock You will then be prompted to enter your password. Next, click the checkbox next to sshd-keygen-wrapper: Full Disk Access list with sshd-keygen-wrapper checkbox selected Click the padlock again to prevent further changes. You should now be able to access the shared storage volume over an SSH connection. **IMPORTANT** Make sure to save or commit the VM image after completing the above steps to persist changes. # Orka VM Tools for guest services on ARM VMs Source: https://docs.macstadium.com/orka/orka-resources/vm-tools Orka VM Tools are pre-installed guest services required for disk resize, VM metadata, and shared storage on macOS 12 or later Apple silicon virtual machines. Orka VM Tools is a collection of background services that let Orka communicate with the guest operating system on Apple silicon VMs. They start automatically when the guest OS starts, and they enable features that require coordination between the host and the VM. Orka VM Tools are only compatible with ARM-based guest operating systems running macOS 12 or later. The following Orka features require Orka VM Tools: * [Disk resize](/orka/orka3-cli-reference/vm-lifecycle-management): resize the VM's disk without redeploying * [Shared attached disk](/orka/orka-resources/shared-vm-storage): attach a shared disk to multiple VMs simultaneously Always run the Orka VM Tools version that matches your cluster and other Orka tools and integrations. A version mismatch can cause disk resizing and shared storage failures. For example, if your cluster runs 3.x, your Orka VM Tools should also run 3.x. ## Pre-installed on MacStadium base images Orka VM Tools come pre-installed on all ARM base images that MacStadium provides. When you deploy from a MacStadium image, no separate installation step is needed. If you're building a custom image from scratch or updating an existing VM, use Homebrew to install or upgrade VM Tools inside the guest: ```bash theme={null} # Install brew install orka-vm-tools # Upgrade to the latest version brew upgrade orka-vm-tools ``` Run `brew upgrade orka-vm-tools` after upgrading your cluster to keep VM Tools in sync with the cluster version. ## Checking VM Tools status Orka VM Tools run in the background as a daemon. To confirm they are running inside a VM: ```bash theme={null} sudo launchctl list com.orka.vm.tools ``` Terminal output of launchctl list showing Orka VM Tools running # Working with Orka VM metadata and custom tags Source: https://docs.macstadium.com/orka/orka-resources/working-with-vm-metadata Read default Orka VM metadata and attach custom key-value tags at deployment using the Orka3 CLI or API to track environment, owner, or build context. When you deploy a VM, Orka assigns default metadata to the VM. You can also add your own custom metadata during deployment via the Orka CLI or API. With VM metadata, you have more ways to identify and manage running VMs in addition to the data visible with `list` and `status` operations. You might find this helpful for your CI/CD workflows. Metadata is stored in the format `{"key": "my key", "value": "my value"}`. Every VM stores its metadata on a metadata server. You can query this metadata server to retrieve the metadata only from within the VM. To use VM metadata with Apple silicon-based VMs, you need to have [a compatible version of Orka VM Tools](/orka/orka-resources/vm-tools) installed on the VM. ## Types of VM metadata Orka always defines a **default metadata set** that provides information about your VM. Every VM has access to its default VM metadata. All default metadata keys (reserved keys) are prefixed with `orka_`. | Default metadata key | Description | | -------------------- | ---------------------------------------------------------------------- | | `orka_vm_id` | The VM ID. This is a unique ID that is generated and assigned by Orka. | | `orka_vm_name` | The VM name, as specified by the VM configuration. | | `orka_node_name` | The name of the node where the VM is deployed. | | `orka_base_image` | The base image used by the VM. | | `orka_cpu` | The number of CPUs for the VM. | | `orka_memory` | The RAM memory for the VM. | **Custom metadata** is stored in the format `{"key": "my key", "value": "my value"}`. You can use it to pass string values to your VM. ## Limitations to working with VM metadata * You cannot override the default VM metadata. * You can set custom VM metadata only at deploy time, not after the VM is running. * You cannot store the VM metadata for use from other VMs with the `vm save` and `vm commit` operations. * You cannot reset your VM metadata with the `vm revert` operation. This operation does not affect VM metadata. * The custom VM metadata applies only to the VM instance for which it was specified. * The VM metadata is not protected by authentication or cryptographic methods. It is, however, accessible only from the VM. * The VM metadata is not affected by the `vm start/stop/suspend/resume` operations. * The VM metadata server is not protected by authentication or cryptographic methods. * The VM metadata server cannot handle special characters in metadata retrieval requests (for example, space). ## Deploy a VM with custom metadata Do not store sensitive data, such as passwords or long-lived encryption keys, as VM metadata. Although accessible only from within the VM, the VM metadata is **not** protected by authentication or cryptographic methods. Anyone with direct access to the VM, and potentially any software running on the VM, can query and view the metadata. 1. Connect to your cluster via VPN. For more information, see [VPN Connection](/orka/networking-with-orka-at-macstadium/vpn-connection). 2. Deploy a VM with custom metadata using the CLI or API. **Orka CLI** ```bash theme={null} orka3 vm deploy --image --metadata 'key1=value1,key2=value2' ``` Keys and values cannot contain commas (`,`) or equal signs (`=`). **Orka API** ```bash theme={null} curl --location -g --request POST 'http:///api/v1/namespaces/{namespace}/vms' --header 'Content-Type: application/json' --header 'Authorization: Bearer ' --data-raw '{"orka_vm_name": "", "vm_metadata": { "items": [{"key": "", "value": "" }] }}' ``` ## Retrieve VM metadata To retrieve your VM metadata, you need to query the metadata server. This server is accessible only from within the VM, and is **not** protected by authentication or cryptographic methods. When you request information from the metadata server, your request and the subsequent metadata response never leave the Orka macOS VM. The server returns the metadata in a JSON format. 1. Connect to your cluster via VPN. For more information, see [VPN Connection](/orka/networking-with-orka-at-macstadium/vpn-connection). 2. Connect to the VM via VNC, SSH, or Screen Sharing. 3. From within the VM, query the metadata server. This retrieves all the available metadata for the VM. ``` curl http://169.254.169.254/metadata/ ``` The IP address `169.254.169.254` is a [link-local address](https://en.wikipedia.org/wiki/Link-local_address) and is accessible only from within the VM. All metadata values are defined as sub-paths below this root URL. The metadata endpoint is served by the Orka VM Tools launchd agent, which may take a few seconds to bind after the VM boots. If you're querying the endpoint from a startup script, gate on readiness before proceeding to avoid intermittent timeouts: ```bash theme={null} until curl -fs --max-time 2 http://169.254.169.254/metadata/ >/dev/null; do sleep 1; done ``` 4. To retrieve a specific VM metadata value for a specific key, pass the following request: ``` curl http://169.254.169.254/metadata/ curl http://169.254.169.254/metadata/ ``` **Using special characters in your keys?** Replace special characters in your key names with their correct encoded versions in your request. For example, run `curl http://169.254.169.254/metadata/my%20key` instead of `curl http://169.254.169.254/metadata/my key`. ## Use VM metadata in CI/CD 1. Pass the VM metadata when deploying the build agent instances OR use a permanent agent already deployed with VM metadata. 2. Retrieve the metadata as part of your CI/CD workflow. 3. Use the metadata values as needed to identify or manage the build agents. # Kubernetes upgrade guide Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/kubernetes-upgrade-guide How Orka API server, operator, and webhook services behave during a Kubernetes cluster upgrade, and best practices to minimize disruption to running VMs. Orka does not change how you upgrade Kubernetes. Follow the standard upgrade practices for your Kubernetes provider. This page explains how Orka services are affected during an upgrade and what you can do to minimize disruption. Orka 3.6 is validated against Kubernetes 1.35 on both on-prem and AWS EKS. Running VMs are not affected by a Kubernetes upgrade. Mac nodes are not part of the upgrade process and do not restart. ## Service behavior during an upgrade The standard Kubernetes node upgrade process cordons and drains each node, evicting pods and rescheduling them to available nodes. Services with a single replica may experience brief downtime during this window. | Service | Replicas (default) | Impact if down | | --------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | API Server | 1 | API calls fail. Most integrations retry automatically, so downtime is often not noticeable. The `orka3` CLI continues working for all commands except `login` and `vm push`. | | Operator | 1 | Changes to Orka resources are not processed: VMs do not get scheduled or deleted. When the Operator comes back up, all queued changes are processed. No data is lost. | | Webhooks | 3 | No requests pass while down. | | Virtual Kubelet | Runs on each Mac host | The node cannot manage VMs. After a period of time the node is marked Not Ready by Kubernetes. | **Running VMs are not affected** by downtime of any of these services. ### Virtual Kubelet The Virtual Kubelet does not need to be upgraded as part of a Kubernetes upgrade. It is forward-compatible with new Kubernetes versions and MacStadium will notify you if an upgrade is ever required. ### Operator leader election The Operator uses a leader election model: only one pod is active at a time. If the active Operator pod is evicted during an upgrade, leader election takes up to 15 seconds. During this window, VM deployments may be slower but will not error. ## Minimizing disruption If you need the Orka API Server and Operator to remain available throughout the upgrade: 1. Increase the replica count for the API Server and Operator deployments. 2. Add a PodDisruptionBudget for the API Server, Operator, and Webhooks to ensure at least one healthy pod remains during node drain. ```yaml theme={null} apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: orka-apiserver-pdb spec: minAvailable: 1 selector: matchLabels: app: orka-apiserver --- apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: orka-operator-pdb spec: minAvailable: 1 selector: matchLabels: app: orka-operator ``` If you use a PodDisruptionBudget, you must have at least 2 replicas for that deployment. A PDB with `minAvailable: 1` on a single-replica deployment will prevent Kubernetes from evicting the pod, blocking the upgrade. ## Post-upgrade verification After completing the upgrade, verify that the Orka environment is fully operational. **Nodes are ready:** ```bash theme={null} kubectl get nodes # or orka3 node list ``` All nodes should be present and in Ready state. **Orka services are running:** ```bash theme={null} kubectl get pods ``` Verify that `orka-apiserver`, `orka-operator`, `orka-webhook`, and `cert-manager` pods are running. **VM deployment works:** ```bash theme={null} orka3 vm deploy --image ``` **API is reachable:** ```bash theme={null} curl /api/v1/cluster-info ``` Expect a `200` response. ## Support If you have questions or require assistance, please [contact our support team](mailto:support@macstadium.com). # Orka 3.0 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-30-release-notes Orka 3.0 introduced SSO, native Kubernetes, OCI registry support, the new orka3 CLI, and macOS Sonoma images. Patch notes for v3.0.1-3.0.3 also included. ## Orka v3.0.3 ## Improvements and fixes * Deploying two or more Intel VMs from the same config or with no config at all on the same node resulted in incorrect networking rules. This could cause connections (SSH, VNC, etc...) to one of the VMs to be redirected to another VM on the same node ## Orka v3.0.2 ## Improvements and fixes * Allow creation of non-expiring ServiceAccount tokens * Improve VM stability when deploying on Mac Studios * Allow running VMs with 128GB memory on Mac Studios * Fix pushing OCI images to some private registries * Improve VM Metadata stability. In some cases VM Tools were not starting, causing metadata to not be available ## Orka v3.0.1 ## Improvements and fixes * Fixed a sporadic issue when saving an image * Enhance cluster resource management when arm nodes encounter limitations that prevent the deployment of more than 2 VMs. ### OCI images * Image pull performance has improved and is faster now. * Memory consumption during image pull operations is reduced for a smoother experience. * Enhanced the efficiency of batched layers pull, optimizing the overall image handling process. * Fixed an issue when bad credentials are provided when pulling an image. ### CLI * The CLI now ensures stable connectivity by addressing an issue where it sporadically connected to the IPv6 address of Cognito, leading to login failures. * The image save command is fixed now to provide accurate error messages when using image names with uppercase letters. Previously, an incorrect error message was displayed in such scenarios. ## Orka v3.0.0 Orka 3.0.0 is a major Orka release that brings Single Sign-On and native Kubernetes capabilities to your Orka clusters. All Orka tools and services have been completely reworked to provide improved usability, native Kubernetes interaction, more scalability, and improved performance. To benefit from the latest Orka release, you must migrate to Orka 3.0.0. This is both an Orka and a virtualization and orchestration layer upgrade. ## New features ### Orka 3.0.0 now provides vanilla macOS 14 Sonoma images and ISOs You can now deploy and work with Intel-based and Apple silicon-based VMs running on macOS 14 Sonoma. The latest vanilla Sonoma images and ISOs reside in the remote repository. ``` orka3 remote-image list orka3 remote-image pull ``` (Intel-only) If you experience degraded performance on Intel-based Sonoma VMs, you might want to disable all animations. Orka 3.0.0 also provides an OCI-compatible Apple silicon-based macOS 14 Sonoma image in GitHub Packages. To deploy a VM with it, just run: ``` orka3 vm deploy --image ghcr.io/macstadium/orka-images/sonoma:latest ``` ### Orka 3.0.0 now provides truly native Kubernetes functionality All Orka resources are rewritten to be Kubernetes native. This lets you use `kubectl` in addition to the Orka3 CLI and the new Orka3 API in Orka 3.0.0. ### Orka 3.0.0 lets you work with images from OCI-compatible registries You can now deploy VMs that pull an image straight from an OCI-compatible registry (such as GitHub Packages). ``` orka3 vm deploy -i ghcr.io/my-organization/orka-images/orka-arm:latest ``` Or you can push a VM's disk as an image to an OCI-compatible registry. ``` orka3 vm push server.com/repository/image:tag ``` This feature is available only for Apple silicon-based VMs and images. Registry credentials are required to push an image. For more information, run `orka3 regcred --help`. Check [https://github.com/macstadium/orka-images](https://github.com/macstadium/orka-images) for the latest OCI-compatible images offered by MacStadium. ### Orka 3.0.0 now runs on Kubernetes 1.27 Orka's virtualization and orchestration layer now runs on Kubernetes 1.27. If you're working with the Kubernetes layer directly, review the deprecated and removed Kubernetes features and resolve any pending issues before requesting an upgrade of your environment. To update your custom pods, review the official Kubernetes guides on how to upgrade between versions. ### The new Orka 3.0.0 API is more straightforward and capable Orka 3.0.0 now provides a more unrestrained and capable API to manage your cluster. All endpoints are organized in a clearer way and follow enterprise industry standards. In addition, Orka 3.0.0 now provides a Swagger UI, which lets you use the Orka3 API straight from your cluster. Navigate to `http:///api/v1/swagger`, provide an authentication token, and start utilizing the new Orka 3.0.0 API. ### The new Orka 3.0.0 CLI is automation-friendly and kubectl-inspired The new Orka 3.0.0 CLI took inspiration from `kubectl` and follows its well-known syntax. If you're familiar with `kubectl`, you will find the new and improved Orka3 CLI easier to use. If you're new to Kubernetes, the new Orka3 CLI will help you stride into the world of native Kubernetes understanding. The Orka3 CLI was rewritten with automation in mind. You will find that it no longer provides interactive mode and relies on detailed command-line user input instead. All commands have been rewritten to become more intuitive for easy extensibility. Many arguments are now positional, so you don't have to write lengthy flags and flag arguments. Autocompletion and many command aliases are now available to ensure that the Orka3 CLI is as easy to use as possible. ### Orka 3.0.0 brings Single Sign-On, RBAC, and service accounts Starting with Orka 3.0, Orka relies on Single Sign-On (SSO), service accounts, and the Kubernetes concept of role-based access control (RBAC) for user management. Orka users log in to their clusters with their MacStadium Customer Portal credentials. All user management happens in the MacStadium Customer Portal, including assigning user roles. Based on the role bindings configured for the respective user in the cluster, they can access one or more namespaces. For improved security, user authentication tokens (generated during login) have a lifecycle of one hour. ### Orka 3.0.0 introduces namespaces, native resource isolation, and dedication Among the native Kubernetes capabilities of Orka 3.0.0 are namespaces. By default, all Orka users have access to the `orka-default` namespace. However, to apply resource dedication and isolation in your cluster, you can create more namespaces with the `orka-` prefix. Next, you need to move one or more nodes to the new namespace and configure the role binding for the namespace. ``` orka3 ns create orka-dedicated orka3 node namespace orka-dedicated orka3 rb add-subject --namespace orka-dedicated --user user@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-test:sa-githubactions ``` Nodes moved to a namespace become dedicated to this namespace, and only users and service accounts added to the respective role binding have access to this node and its computational resources. Formerly, you were able to create node dedication by creating user groups and applying the groups to the respective node. ### Orka 3.0.0 handles sandboxing via namespaces Orka 3.0 introduces a new way to handle sandboxing - with namespaces. First, you need to create a dedicated namespace with enabled custom pods. Next, you need to move one or more nodes to that namespace. You also need to provide access to the namespace to all users and service accounts that require access. ``` orka3 ns create orka-sandbox --enable-custom-pods orka node orka-sandbox orka3 rb add-subject --namespace orka-dedicated --user user@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-test:sa-githubactions ``` After that, you can deploy custom pods. For any custom pods you want to run, add the following toleration to the pod. Provide the name for the sandbox namespace under `value`. ``` {"key": "orka.macstadium.com/namespace-reserved", "value": "orka-sandbox"} ``` ### Orka 3.0.0 no longer requires VM configurations You can now deploy a VM without creating or specifying a VM configuration. Deploying a VM is now as simple as running: ``` orka3 vm deploy --image ``` You can specify an image stored locally in your cluster or the complete image path to an OCI-compatible registry. ### Orka 3.0.0 lets you download ISOs on your local machine You can now download any ISO stored in your cluster to your local machine for editing and testing. ``` curl -X 'GET' \ 'http:///api/v1/namespaces/orka-default/isos//download' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -o '' ``` ### Orka 3.0.0 lets you add comprehensive descriptions for images and ISOs Images and ISOs now have an extra field - description. You can use it to provide important details about the image, such as macOS version, origin (local, remote, copied or pulled), owner, or even specific OS settings. It's up to you. Use the `orka3 image set-description` or `orka3 iso set-description` command, or the `POST /api/v1/namespaces/{namespace}/images/{image}/description` or `/api/v1/namespaces/{namespace}/isos/{iso}/description` endpoints. ## Removed and deprecated features ### Orka 2.x API Orka 2.x API and earlier versions are now **deprecated**, and backward compatibility will be removed in a future release. You must migrate your custom Orka functionality to use the new Orka3 API or the new Orka3 CLI instead. See [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping). If you need help moving away from the Orka 2.x API, contact the support team through the [MacStadium portal](https://portal.macstadium.com/). ### Orka 2.x CLI Orka 2.x CLI and earlier versions are now **deprecated**, and backward compatibility will be removed in a future release. You must migrate your custom Orka functionality to use the new Orka3 API or the new Orka3 CLI instead. See [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping). If you need help moving away from the Orka 2.x CLI, contact the support team through the [MacStadium portal](https://portal.macstadium.com/). ### User logs Logging 1.0 and Logging 2.0 are now **removed**. The Orka team is gathering information about this feature and might consider implementing an updated version or an alternative solution. ### Shared VM storage for Apple silicon-based Monterey VMs [Shared VM storage](/orka/orka-resources/shared-vm-storage) is now **removed** for Apple silicon-based VMs running macOS Monterey. Intel-based Monterey VMs are not affected. To continue using shared VM storage, upgrade your Apple silicon-based Monterey VMs to macOS Ventura OR switch to Intel-based Monterey VMs. ### Saved state The following features are now **removed:** * Saving the state of a running VM to the respective VM configuration * Deploying a VM from a VM configuration with a saved state * Deleting a saved state from a VM configuration ### Attached storage (from Orka images) The following features are now **removed:** * Creating VM configurations with an attached Orka image for additional storage * Attaching an Orka image for additional storage during deployment * Listing the currently attached disks ### Node dedication The earlier implementation of node dedication is now **removed**. To configure user access to a particular node, use namespaces instead. For more information, see [here](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration). ### Sandboxing The earlier implementation of sandboxing is now **removed**. You need to use a namespace with enabled custom pods to run custom pods in your cluster. For more information, see [here](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration). ### Yes/no argument values Passing `yes` or `no` as arguments to boolean flags is now **removed**. Use `true` or `false` instead. ### Re-configuring I/O Boost The following features are now **removed:** * Configuring I/O Boost for VM configurations * Overriding I/O Boost during deployment I/O Boost is now always enabled. You **will not be able** to work with VMs running macOS versions earlier than Mojave 10.14.5. ## Improvements Orka 3.0.0 introduces the following improvements: * The caching of Apple silicon-based images is now improved to reduce deployment and boot times. * Apple silicon-based images now take up significantly less space (on average) on your cluster's storage. Existing images in the local cluster storage are not automatically converted to the new format. You must save or commit your existing images from a newly deployed VM to take advantage of this benefit. * When listing the deployed VMs, Orka 3.0.0 lists all VMs for all users in the respective namespace. * When listing VM configurations, Orka 3.0.0 now lists all VM configurations for all users in the cluster. * Pull, generate, and copy operations for images and ISOs are now async operations and no longer block the console. You can check the progress of the operation by running `orka3 image list -o wide` or `orka3 iso list -o wide`. * VM commit and VM save are now async operations and no longer block the console. You can check the progress of the operation by running `orka3 image list -o wide` or `orka3 iso list -o wide`. ## Known issues * Nested virtualization is not available on macOS 14 Sonoma VMs. This is a limitation of the Apple virtualization framework.\ **Workaround:** None. * Orka 3.0.0 and 3.0.1 CLI do not allow users with NAT'ed public IPs to authenticate with the new Portal-based format. This capability will be introduced soon.\ **Workaround:** Deploy the CLI within Orka's network. * You might experience performance issues when running Xcode 15 on your Orka VMs.\ **Workaround:** Try updating your OS to macOS 14 Sonoma. * You cannot disable System Integrity Protection on the base Sonoma image.\ **Workaround:** MacStadium has published a new base Sonoma image with System Integrity Protection (SIP) disabled [here](https://github.com/macstadium/orka-images/tree/main?tab=readme-ov-file#sip-disabled). * You cannot enable Kernel extensions. This is an Apple limitation.\ **Workaround:** None. * You might be unable to update existing Intel-based VMs to macOS Ventura or later. This limitation relates to the Orka image design and the Apple virtualization framework.\ **Workaround:** Re-create your VM from one of the MacStadium official images for the respective macOS version you are trying to upgrade. Next, apply any missing updates within this OS version. * VM isolation between Intel and Apple-silicon based VMs doesn't work.\ **Workaround:** None. * You might experience degraded performance on Intel-based VMs running macOS 14 Sonoma.\ **Workaround:** Disable animations for the VM. For more information, see [here](https://support.apple.com/en-gb/guide/mac-help/mchlc03f57a1/mac). * You cannot purge VMs from the **VMs** tab in the Web UI. When you try to purge a VM, the Web UI shows the following error message: `No VMs with that name exist in Orka`.\ **Workaround:** Run **Purge** from the **VM Configs** tab. * The Web UI lets you manage only resources in the `orka-default` namespace.\ **Workaround:** For other workspaces, use the Orka3 CLI or the Orka3 API instead. * When downloading a large-size ISO or image from the Swagger UI, the UI might become unresponsive, and you might lose your operation's progress.\ **Workaround:** Use `curl` instead and provide a path on the local file system with the `-o ` flag. * When checking the status of a VM, Orka 3.0.0 will list it as running even when stopped or suspended.\ **Workaround: None.** * The Orka 2.x CLI doesn't respect the `tag required` setting from the VM configuration and defaults its value to `no`.\ **Workaround:** If you want to deploy a VM with an enabled `tag required`, manually set it to `yes` in the interactive prompt or via the `--tag-required yes` flag in direct mode. * After you resize an Apple silicon-based VM running macOS Ventura and attempt to upgrade to a newer macOS version, the upgrade might fail, or you might experience other issues with your VM. This is a limitation of the current resize design and the Apple virtualization framework.\ **Workaround:** If possible, upgrade the image before resizing. * After you resize an Apple silicon-based VM running macOS Monterey and attempt to upgrade to a newer macOS version, the upgrade might fail, or you might experience other issues with your VM. This is a limitation of the current resize design and the Apple virtualization framework.\ **Workaround:** If possible, upgrade the image before resizing. * After you resize an Apple silicon-based VM running macOS Ventura, you can no longer connect via VNC to the VM.\ **Workaround:** If possible, use SSH or Apple Screen Sharing. * After you upgrade an existing Apple silicon-based VM to a non-latest macOS version (for example, 13.2.1 when 13.3 is the latest), the VM becomes unresponsive, and you can no longer use it. The Apple virtualization framework causes this issue. We have reported the issue to Apple.\ **Workaround:** Always upgrade to the latest macOS version. * macOS Ventura VMs created from ISO return to the Recovery (ISO install) screen after restart if you don't manually select to boot macOS from the boot menu.\ **Workaround:** Select the second option from the boot menu (`macOS Installer` during the final steps of the setup or `Macintosh HD` after you have completed the installation) after every restart. If you miss the boot menu and end up at the Recovery screen, restart the VM from the Apple menu in the top left corner.\ Once you're done with your current OS configuration, [commit the changes or save a new image](/orka/orka3-cli-reference/image-management) from the VM. Use the image to create and deploy macOS Ventura VMs. * Intel-based Ventura VMs created with the Orka Web UI might not work as expected. This occurs because the **Net Boost** option is disabled by default when creating new VM configs in the Web UI. However, Intel-based Ventura VMs require **Net Boost** to be enabled to work properly.\ **Workaround:** Select the **Net Boost** checkbox when creating Intel-based Ventura VMs. * You cannot access your shared VM storage after you update your Orka VM Tools from 2.3.x or earlier to 2.4.0 or later on an existing Monterey VM. The storage will still be listed under `/Volumes/orka` but you will not be able to access any content on it.
**Workaround:** `Commit` or `save` the base image with the updated Orka VM Tools and re-create your Monterey VMs. Alternatively, use the latest default `.orkasi` image to re-create your VMs. * If you set the default output to JSON, you can no longer use the Orka CLI in interactive mode.\ **Workaround:** Use direct mode with the `-y` flag instead. * You can simultaneously start multiple **pull remote image** or **copy image** operations in the Orka Web UI. This might cause Orka to become unresponsive until all operations are complete. You cannot use Orka with any Orka tools and integrations during that time.\ **Workaround:** Wait for all running operations to complete. * Sometimes, Orka might become unresponsive during a **pull remote image** or **copy image** operation and might start returning authentication errors.\ Wait for the operation to complete. * Apple silicon-based VMs are not able to run applications that require kernel extensions. We have filed the problem with Apple and are communicating with them through our contacts to solve it. * Any VMs deployed on Apple silicon-based nodes before Orka 2.1.0 might not be functional after the upgrade to the latest Orka release.\ **Workaround:** Delete and redeploy the VMs. * Users running older versions of Orka will start seeing Apple silicon images when running `orka image list-remote`. These images are not supported in older versions of Orka, and attempting to pull them will result in an error.\ **Workaround:** Ignore the images or upgrade to Orka 2.1.0+. * There is a known issue with authentication to certain OCI registries, such as AWS ECR. This will be remedied in a coming version of Orka. * If you deploy a VM on an Apple silicon-based node and try to log in to your iCloud account, you might receive an error 'The action could not be completed'. This is a limitation of the Apple Virtualization Framework.\ **Workaround:** Download the needed software via a web browser and install it manually. ![Xcode "Verifying Xcode" dialog causing git operations to hang on an Orka VM](https://files.readme.io/4534063-7a9f7a8-Screenshot_2022-02-07_at_16_12_18.png) * If your git-related operations are hanging, and nothing happens on an Orka VM, your Xcode is probably stuck in the "Verifying Xcode dialog" state. To ensure this is the case, you can connect to your VM via VNC, start the Xcode application and check if you will get a small window saying "Verifying Xcode".\ **Workaround:** VNC to the VM and wait for the verification process to complete or execute the following command from the Terminal to disable Xcode verification: ``` xattr -d com.apple.quarantine '/Applications/Xcode.app' ``` ## How to upgrade Orka 3.0.0 is a virtualization and orchestration layer upgrade. For more information, see [Orka Upgrades](/orka/orka-upgrades-and-release-notes/orka-upgrades#virtualization-and-orchestration-layer-upgrades-kubernetes-docker-or-linux). This release requires a maintenance window of up to 3 hours depending on the size of the cluster. 1. Submit a ticket through the [MacStadium portal](https://portal.macstadium.com/). 2. Schedule a time for the maintenance window that works for you through the link provided in the ticket.\ The suggested time(s) must be **Monday through Thursday, 6 am or 10 pm PST (9 am or 1 pm EST)**, depending on MacStadium Global Operations calendar availability. 3. Follow [this migration guide](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration) to configure your cluster and tools after the migration. If you have any CLI-based or API-based custom automation, review the [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) to decide how to migrate it. # Orka 3.1 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-31-release-notes Orka 3.1 adds public IP support across CLI and integrations, Intel support for High Sierra and Mojave, and performance improvements for large clusters. New features, improved functionality, and bug fixes in Orka v3.1.x\ Released: May 9, 2024 Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. ## Orka v3.1.0 Orka 3.1.0 is a major Orka release that brings support for public IPs for all integrations. It also contains performance improvements for big clusters. ## New features ### Orka 3.1.0 now provides support for public IPs in the CLI and integrations In Orka 3.0.x you were able to use public IPs only from the Jenkins and TeamCity plugins. Orka 3.1.0 allows you to use public IPs from the CLI and other integrations. To do that, use the public API IP provided by the Orka team to configure the CLI or the integrations ``` orka3 config set --api-url ``` ### (Intel-only) Support for old OS versions Orka 3.1.0 allows the deployment of High Sierra and Mojave. To do that, ensure that legacy IO is enabled and net boost is disabled for the VM ``` orka3 vm deploy -i mojave.img --legacy-io --disable-net-boost ``` ### Image size details Orka 3.1.0 provides information about the image disk size as well as the actual size it takes on the storage. To get this information, run ``` orka3 image list -o wide NAME DESCRIPTION SIZE STORAGE SIZE TYPE STATE ERROR sonoma-90gb-orka3-arm sonoma-90gb-orka3-arm 90G 16G arm64 Ready ``` *size* - This is the disk size of any VM deployed with that image *storage size* - This is the size the image takes on the storage ## Removed and deprecated features ### Orka 2.x API Orka 2.x API and earlier versions are now **removed**. You must migrate your custom Orka functionality to use the new Orka3 API or the new Orka3 CLI instead. See [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping). If you need help moving away from the Orka 2.x API, contact the support team through the [MacStadium portal](https://portal.macstadium.com/). ### Orka 2.x CLI Orka 2.x CLI and earlier versions are now **removed**. You must migrate your custom Orka functionality to use the new Orka3 API or the new Orka3 CLI instead. See [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) , [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x and 3.0.x to 3.1.x and above: Backward Compatibility](/orka/orka-cluster-migration-from-24-3x/24x-and-30x-to-31x-and-above-backward-compatibility). If you need help moving away from the Orka 2.x CLI, contact the support team through the [MacStadium portal](https://portal.macstadium.com/). ## Improvements Orka 3.1.0. introduces the following improvements: * Performance improvements in clusters > 20 nodes. All Orka commands should run faster and should not degrade under heavier load. * Improved image resize behavior. In previous versions, if there is not enough disk space on the host, the system would cancel the image resize operation. The system now cleans old images from the cache to free space for the resized VM. ## Known issues * Nested virtualization is not available on macOS 14 Sonoma VMs. This is a limitation of the Apple virtualization framework.\ **Workaround:** None. * You might experience performance issues when running Xcode 15 on your Orka VMs.\ **Workaround:** Try updating your OS to macOS 14 Sonoma. * You cannot disable System Integrity Protection on the base Sonoma image.\ **Workaround:** MacStadium has published a new base Sonoma image with System Integrity Protection (SIP) disabled [here](https://github.com/macstadium/orka-images/tree/main?tab=readme-ov-file#sip-disabled). * You cannot enable Kernel extensions. This is an Apple limitation.\ **Workaround:** None. * You might be unable to update existing Intel-based VMs to macOS Ventura or later. This limitation relates to the Orka image design and the Apple virtualization framework.\ **Workaround:** Re-create your VM from one of the MacStadium official images for the respective macOS version you are trying to upgrade. Next, apply any missing updates within this OS version. * VM isolation between Intel and Apple-silicon based VMs doesn't work.\ **Workaround:** None. * You might experience degraded performance on Intel-based VMs running macOS 14 Sonoma.\ **Workaround:** Disable animations for the VM. For more information, see [here](https://support.apple.com/en-gb/guide/mac-help/mchlc03f57a1/mac). * You cannot purge VMs from the **VMs** tab in the Web UI. When you try to purge a VM, the Web UI shows the following error message: `No VMs with that name exist in Orka`.\ **Workaround:** Run **Purge** from the **VM Configs** tab. * The Web UI lets you manage only resources in the `orka-default` namespace.\ **Workaround:** For other workspaces, use the Orka3 CLI or the Orka3 API instead. * When downloading a large-size ISO or image from the Swagger UI, the UI might become unresponsive, and you might lose your operation's progress.\ **Workaround:** Use `curl` instead and provide a path on the local file system with the `-o ` flag. * When checking the status of a VM, Orka 3.0.0 will list it as running even when stopped or suspended.\ **Workaround: None.** * After you resize an Apple silicon-based VM running macOS Ventura and attempt to upgrade to a newer macOS version, the upgrade might fail, or you might experience other issues with your VM. This is a limitation of the current resize design and the Apple virtualization framework.\ **Workaround:** If possible, upgrade the image before resizing. * After you resize an Apple silicon-based VM running macOS Monterey and attempt to upgrade to a newer macOS version, the upgrade might fail, or you might experience other issues with your VM. This is a limitation of the current resize design and the Apple virtualization framework.\ **Workaround:** If possible, upgrade the image before resizing. * After you resize an Apple silicon-based VM running macOS Ventura, you can no longer connect via VNC to the VM.\ **Workaround:** If possible, use SSH or Apple Screen Sharing. * After you upgrade an existing Apple silicon-based VM to a non-latest macOS version (for example, 13.2.1 when 13.3 is the latest), the VM becomes unresponsive, and you can no longer use it. The Apple virtualization framework causes this issue. We have reported the issue to Apple.\ **Workaround:** Always upgrade to the latest macOS version. * macOS Ventura VMs created from ISO return to the Recovery (ISO install) screen after restart if you don't manually select to boot macOS from the boot menu.\ **Workaround:** Select the second option from the boot menu (`macOS Installer` during the final steps of the setup or `Macintosh HD` after you have completed the installation) after every restart. If you miss the boot menu and end up at the Recovery screen, restart the VM from the Apple menu in the top left corner.\ Once you're done with your current OS configuration, [commit the changes or save a new image](/orka/orka3-cli-reference/image-management) from the VM. Use the image to create and deploy macOS Ventura VMs. * Intel-based Ventura VMs created with the Orka Web UI might not work as expected. This occurs because the **Net Boost** option is disabled by default when creating new VM configs in the Web UI. However, Intel-based Ventura VMs require **Net Boost** to be enabled to work properly.\ **Workaround:** Select the **Net Boost** checkbox when creating Intel-based Ventura VMs. * You cannot access your shared VM storage after you update your Orka VM Tools from 2.3.x or earlier to 2.4.0 or later on an existing Monterey VM. The storage will still be listed under the /Volumes/orka`but you will not be able to access any content on it.
**Workaround:**`Commit`or`save`the base image with the updated Orka VM Tools and re-create your Monterey VMs. Alternatively, use the latest default`.orkasi\` image to re-create your VMs. * If you set the default output to JSON, you can no longer use the Orka CLI in interactive mode.\ **Workaround:** Use direct mode with the `-y` flag instead. * You can simultaneously start multiple **pull remote image** or **copy image** operations in the Orka Web UI. This might cause Orka to become unresponsive until all operations are complete. You cannot use Orka with any Orka tools and integrations during that time.\ **Workaround:** Wait for all running operations to complete. * Sometimes, Orka might become unresponsive during a **pull remote image** or **copy image** operation and might start returning authentication errors.\ Wait for the operation to complete. * Apple silicon-based VMs are not able to run applications that require kernel extensions. We have filed the problem with Apple and are communicating with them through our contacts to solve it. * Any VMs deployed on Apple silicon-based nodes before Orka 2.1.0 might not be functional after the upgrade to the latest Orka release.\ **Workaround:** Delete and redeploy the VMs. * Users running older versions of Orka will start seeing Apple silicon images when running `orka image list-remote`. These images are not supported in older versions of Orka, and attempting to pull them will result in an error.\ **Workaround:** Ignore the images or upgrade to Orka 2.1.0+. * There is a known issue with authentication to certain OCI registries, such as AWS ECR. This will be remedied in a coming version of Orka. * If you deploy a VM on an Apple silicon-based node and try to log in to your iCloud account, you might receive an error 'The action could not be completed'. This is a limitation of the Apple Virtualization Framework.\ **Workaround:** Download the needed software via a web browser and install it manually. ![Xcode "Verifying Xcode" dialog causing git operations to hang on an Orka VM](https://files.readme.io/4534063-7a9f7a8-Screenshot_2022-02-07_at_16_12_18.png) * If your git-related operations are hanging, and nothing happens on an Orka VM, your Xcode is probably stuck in the "Verifying Xcode dialog" state. To ensure this is the case, you can connect to your VM via VNC, start the Xcode application and check if you will get a small window saying "Verifying Xcode".\ **Workaround:** VNC to the VM and wait for the verification process to complete or execute the following command from the Terminal to disable Xcode verification: ``` xattr -d com.apple.quarantine '/Applications/Xcode.app' ``` ## How to upgrade Orka 3.1.0 is a new Orka release upgrade. For more information, see [Orka Upgrades](/orka/orka-upgrades-and-release-notes/orka-upgrades#virtualization-and-orchestration-layer-upgrades-kubernetes-docker-or-linux). This release requires a maintenance window of up to 3 hours depending on the size of the cluster. 1. Submit a ticket through the [MacStadium portal](https://portal.macstadium.com/). 2. Schedule a time for the maintenance window that works for you through the link provided in the ticket.\ The suggested time(s) must be **Monday through Thursday, 6 am or 10 pm PST (9 am or 1 pm EST)**, depending on MacStadium Global Operations calendar availability. 3. Follow [this migration guide](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration) to configure your cluster and tools after the migration. If you are upgraded from Orka 2.4.x, review the [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) to decide how to migrate it. # Orka 3.2 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-32-release-notes Orka 3.2 release notes: scheduled image caching, Apple ID authentication on Sequoia, Apple silicon architecture detection, and bug fixes. **IMPORTANT** Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. ## Orka 3.2.2 ## Improvements and fixes ### Fix: incomplete VM deletion Addressed an issue with Orka preventing Kubernetes garbage collector from fully deleting a VM after the underlying pod is deleted first, particularly if a Kubernetes `foregroundDeletion` finalizer is present in the VM. ### Fix: Custom users created during authentication Custom users created during authentication now have Orka cluster admin privileges. The change is proactive and prevents a future patch release to elevate users with cluster admin privileges. ### New feature: Apple ID Authentication Apple ID login is now available to Orka customers running Sequoia host machines on Apple silicon hardware. ### Requirements and Limitations #### Supported configurations: * Host machine: macOS Sequoia on Apple silicon * Guest OS (VM): macOS Sequoia updated via IPSW #### Limitations: * The Host OS must be running macOS Sequoia or later * The Guest OS (VM) **must** be created using a Sequoia IPSW. Apple ID login **will not** work with VMs that were upgraded from previous versions of macOS like Sonoma. ### Setup instructions: To set up an Apple ID compatible VM environment with Orka: 1. Download [Orka Desktop](/orka/orka-desktop/welcome-to-orka-desktop-30) to begin the VM creation process. Make sure your Host OS is Sequoia or later. 2. Build a new guest image using a [Sequoia IPSW file](https://github.com/macstadium/orka-images/pkgs/container/orka-images%2Fsequoia) with the requirements specified above. 3. Test and use your new VM locally. 4. If you want to deploy the image to your Orka cluster, use Orka Desktop to push your image to an OCI repository, and then use the [Orka CLI](/orka/orka-overview/tools-integrations) to deploy to your Orka cluster. Ensure that your host system meets the requirements above before creating your Sequoia guest machine. For more detailed instructions, refer to the following Apple documentation: [https://developer.apple.com/documentation/Virtualization/using-icloud-with-macos-virtual-machines](https://developer.apple.com/documentation/Virtualization/using-icloud-with-macos-virtual-machines) ## Orka 3.2.1 ## Improvements and fixes ### Image caching deletion fix The Orka Operator can in rare occurrences fail to update an Orka node status if a cache deletion operation does not fully complete. This can cause numerous unexpected errors including subsequent image cache failures. The Operator can now recover node status properly even after a cache deletion operation fails. ### Fix: Issue where image import directory was removed by the cache clearing process Previously, when importing an image, the destination directory was created prior to extracting the image to a temporary location. Users were experiencing an issue where the extraction process did not complete prior to a caching process starting. Upon seeing that space is needed, empty directories would then be pruned in the cache. This would then result in the destination directory being removed, and when trying to move files into place, the process would fail due to the destination directory no longer existing. This was fixed in Orka 3.2.1, and the destination directory is now created at the time when the extracted files are moved into place. Additionally, temporary files are now cleaned up during caching, resolving an issue where users were unable to cache additional images due to temporary files previously not being deleted as expected. ### Orka node status logic update In corner cases during cache operations, an incorrect/outdated node status is returned during the operation resulting in a failure. The logic was improved to prevent this condition. ### Improved Orka node architecture detection To ensure a node type is properly identified in mixed node environments, Intel vs. Apple silicon (M-series) systems, the system info is checked with the node label to identify architecture type. ### GitHub Actions Plugin null VM name issue A recent upstream change to the ARC project caused previously used variables that Orka runners used to provide unique names to Orka runners return null VM names. The [v1.1.5 GitHub Actions Orka plugin](https://github.com/macstadium/orka-github-actions-integration/releases/tag/1.1.5) was changed to use natively created VM names from Kubernetes. The plugin also now implements `jobId` to identify jobs to improve support of concurrent/multiple runners. ## Orka 3.2.0 What’s New in the Release Orka Cluster version 3.2 introduces a new feature, Scheduled Caching, and also provides support for Sequoia 15.0 VM images. Sequoia support is dependent on requesting that some or all nodes are upgraded to Sequoia 15.0 in the upgrade request service ticket. ## Scheduled Caching Scheduled caching enables users to configure their Orka clusters to proactively pull VM images, avoiding long startup times when the VM is first run. The scheduled caching feature requires planning for target nodes and optimal maintenance window periods. There is a noticeable impact on VMs running during image cache downloads (particularly on I/O operations). It is best to avoid caching while scheduling running builds unless the image size is smaller than 16GB. The cache downloads directly from OCI repositories are currently slower than normal image download times by approximately 2-3x. For the beta release it is better to cache from NFS stores. If necessary, pull repo images down to NFS stores and then begin cache downloads to cluster nodes. Caching an image to more than five nodes simultaneously also adds delay to cache download completion time. ## Sequoia Support The Orka Cluster 3.2 release also introduces official support for macOS Sequoia release 15.0. To deploy Sequoia based VMs on your cluster you will need to have your cluster nodes upgraded to the Sequoia 15.0 release as well as the host OS is a dependency of running a Sequoia guest OS. When requesting your Orka Cluster upgrade to release 3.2 you should also specify any nodes you wish to run Sequoia VMs on as well so the OS can be upgraded. ## Kubernetes update While upgrading Orka Cluster to release 3.2, MacStadium will also upgrade the cluster to Kubernetes stable version 1.3.0. This process must be done serially upgrading to each successive version from the current version, typically 1.5.3. Therefore, an Orka Cluster upgrade requires a longer maintenance window, and coupled with a possible node OS update, adds additional potential steps extending the entire upgrade duration even longer. For larger install bases, over 25 nodes, it is important to consider these upgrade duration factors when requesting your software upgrade. ## Upgrading * A scheduled maintenance window is required. * This release requires a maintenance window of up to 3 hours depending on the size of the cluster. * Orka 3.2.0 is a new Orka release upgrade. For more information, see [Orka Upgrades](/orka/orka-upgrades-and-release-notes/orka-upgrades#virtualization-and-orchestration-layer-upgrades-kubernetes-docker-or-linux). * For customers who have not yet upgraded to Orka Cluster 3.0.0 please read the [migration guide](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration) before submitting a ticket. 1. Submit a ticket through the [MacStadium portal](https://idp.macstadium.com/login?scope=aws.cognito.signin.user.admin+email+openid+phone+profile\&response_type=code\&client_id=os594upi12pn9ab16hmtk0akp\&redirect_uri=https%3A%2F%2Fportal.macstadium.com%2Foauth%2Fredirect\&state=eyJsYXN0VmlzaXRlZFVybCI6Ii8ifQ). 2. Schedule a time for the maintenance window that works using the link provided in the ticket.\ The suggested time must be **Monday through Thursday, 6 am or 10 pm PST (9 am or 1 pm EST)**, depending on MacStadium Global Operations calendar availability. 3. Follow this [migration guide](/orka/orka-cluster-migration-from-24-3x/24x-to-300-after-the-migration) to configure your cluster and tools after the migration. If you are upgraded from Orka 2.4.x, review the [2.4.x to 3.0.0: CLI Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-cli-mapping) and [2.4.x to 3.0.0: API Mapping](/orka/orka-cluster-migration-from-24-3x/24x-to-300-api-mapping) to decide how to migrate it. # Orka 3.3 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-33-release-notes Orka 3.3 release notes: Orka Burst for elastic capacity, Hardware UUID generation controls, Kubernetes 1.33, Harbor OCI support, and Jamf MDM fixes. **IMPORTANT** Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. # Orka 3.3.3 ## Improvements and Fixes Orka 3.3.3 addresses an issue that may cause ARM nodes to become non-operational under certain workloads. This problem is caused by a bug wherein: * Orka does not delete VMs in certain cases, leading to VMs running out of space * This leaves impacted VMs in a stopped state * VMs are then unreachable This causes Orka to crash, which could lead to VMs not being cleaned up. ### Who is affected: All customers running workloads that rapidly deploy multiple VMs may be affected. This includes any environment with medium-high utilization of ARM-based nodes. ### Impact: When this issue occurs: * Nodes may run out of space * VMs may not be assigned a valid MAC address and will be inaccessible ### Customer downtime: This is a zero-downtime operation and has no effect on already running VMs. ### Next steps: We recommend that all customers using Orka 3.3.0 and above apply this hotfix immediately, especially those that are operating medium or large-load ARM-based infrastructure, or high-volume VM deployments. If you have any questions or require assistance, please [contact our support team](https://docs.macstadium.com/docs/support). # Orka 3.3.2 ## Improvements and Fixes Orka 3.3.2 is a patch release that provides a system-level control to determine if VMs have consistent or dynamic Hardware UUID generation. * Consistent Hardware UUID generation is good for use cases that require the same Hardware UUID and serial number for each deployment. This is often the case for code signing or other workflows that expect a specific machine identifier. * Dynamic Hardware UUID generation is good for use cases that require unique identifiers, such as VDI or remote desktop use cases where each desktop is assigned to an individual user. MDM integration may also depend on having unique Hardware UUIDs. The default system behavior is consistent Hardware UUIDs. [Contact our support team](/macstadium/support/support) to switch to dynamic Hardware UUID generation. OCI integration now supports Harbor as a repository. # Orka 3.3.1 ## Improvements and Fixes Orka 3.3.1 is a patch release that addresses compatibility issues with JAMF MDM. # Orka 3.3.0 ## New Features * [Orka Burst](/orka/orka-resources/burst) is now available to customers, providing dedicated, on-demand access to elastic cluster capacity as needed. If you are interested in adding burst nodes to your account, please get in touch with MacStadium through your Account Portal. * Component versions are now shown with the `orka3 version` and `orka3 node list -o wide` commands. * Orka worker nodes are upgraded to macOS 15.5. ## Fixes and Improvements * Orka has been updated from Kubernetes v1.30 to v1.33. [Upgrade Information.](/orka/orka-upgrades-and-release-notes/orka-upgrades) * Internal upgrades to Kubernetes networking components for greater stability on the control plane. * Orka now handles the permission alert for non-privileged applications in Sequoia 15.4. * Starting with macOS Sequoia, macOS triggers a graphical permissions alert whenever a non-privileged application attempts to communicate with anything on the local network (e.g., pulling an image from an OCI registry hosted on a separate machine on the local network). As a result of this change, the Orka Engine is now deployed as a LaunchDaemon. * Custom certificates uploaded by clients will persist on API restart and upgrades. * VMs now generate unique identifiers under Apple's guidelines. More details on the impact of this change are in the Known Issues section. * All fixes released in the Orka 3.2 series are included. [3.2.2](/orka/orka-upgrades-and-release-notes/orka-32-release-notes) [3.2.1](/orka/orka-upgrades-and-release-notes/orka-32-release-notes) **Known Issues** If you implement code signing workflows in Orka, review your workflows before deciding to upgrade to 3.3.0. The 3.3.0 release implements behaviors to align with Apple’s guidelines for Virtualization regarding identifiers, as discussed in [VZMacMachineIdentifier | Apple Developer Documentation](https://developer.apple.com/documentation/virtualization/vzmacmachineidentifier), such that VMs are always created with a unique machine identifier. In previous versions of Orka, when creating a new macOS VM using `orka3 vm deploy --image $OCI_IMAGE` or cloning an existing VM, the new VM inherited the machine identifier from the source image or VM. This change conflicted with Apple’s guidelines and was updated in the Orka 3.3.0 release to align with Apple's official guidelines. Due to this change and other code signing workflows in macOS 15 (see: [Apple Developer Forum](https://developer.apple.com/forums/thread/787500?answerId=843094022#843094022)) that depend on a persistent (or repeatable) machine identifier may fail, as provisioning profiles can no longer be reused across newly created or cloned VMs. Teams using these workflows should regenerate profiles for each VM or consider alternate provisioning strategies that account for dynamic identifiers. Subsequent releases of Orka will offer an alternative approach to ensure that code signing workflows can execute in VMs. # Orka 3.4 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-34-release-notes Orka 3.4 release notes: custom VM display resolution settings, NFS image caching hotfix, and ARM node stability improvements for high-volume deployments. **IMPORTANT** Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. # Orka 3.4.2 ## Hotfix: Image Caching Issues with NFS Summary: Previously, when an image cached from NFS was updated at the source, Orka could occasionally fail to properly detect and refresh the outdated cached version. Instead, the VM would continue running silently using the stale image without any warning or error from Orka. Additionally, during the caching process, some stale or temporary images were not properly cleaned up, leading to potential storage issues. ### Who is affected: All customers using NFS images are impacted. Those with large image sizes and frequent image updates are more likely to encounter this issue first. ### Impact: * Customers using NFS storage may unknowingly run VMs with outdated images * No errors or alerts are generated in Orka, making the issue difficult to detect * Hosts may eventually run out of disk space due to accumulation of old or orphaned images ### Customer downtime: This is a zero-downtime operation and has no effect on already running VMs. ### Next steps: We recommend that all customers using Orka 3.3.0 and above using NFS apply this hotfix immediately to ensure proper image updates and prevent storage issues. If you have any questions or require assistance, please [contact our support team](/macstadium/support/support). # Orka 3.4.1 ## Improvements and Bug Fixes This release addresses an issue that may cause ARM nodes to become non-operational under certain workloads. This problem is caused by a bug wherein: * Orka does not delete VMs in certain cases, leading to VMs running out of space * This leaves impacted VMs in a stopped state * VMs are then unreachable This causes Orka to crash, which could lead to VMs not being cleaned up. ### Who is affected: All customers running workloads that rapidly deploy multiple VMs may be affected. This includes any environment with medium-high utilization of ARM-based nodes. ### Impact: When this issue occurs: * Nodes may run out of space * VMs may not be assigned a valid MAC address and will be inaccessible ### Customer downtime: This is a zero-downtime operation and has no effect on already running VMs. ### Next steps: We recommend that all customers using Orka 3.4.0 and above apply this fix immediately, especially those that are operating medium or large-load ARM-based infrastructure, or high-volume VM deployments. If you have any questions or require assistance, please [contact our support team](https://docs.macstadium.com/docs/support). # Orka 3.4.0 ## New Features In Orka 3.4.0, you can set custom display settings when deploying or configuring a VM as part of your UI testing workflow. You can access this workflow via the Orka CLI. These instructions assume you are currently logged into your Orka cluster, and can access your VMs using Apple Screen Sharing and an applicable image running a version of macOS. ### Set display settings at VM deployment: The `orka3 vm deploy` command has the following new options: `--display-width` - Adjust console display window width in pixels\ `--display-height` - Adjust console display window height in pixels\ `--display-dpi` - Adjust console display density in pixels In the following example, we have specified a VM deployment running Sequoia 15.4.1 with a height of 2560px, a width of 1600px, and a DPI of 320px. ![New Orka 3.4.0 CLI commands for setting VM display width, height, and DPI](https://files.readme.io/79d6d1a80e934cda1ca93d3454f2ea49e80ad8fa035a19fd04a79cf226f7d3ff-Orka3VMDeployDisplay.png) New Orka 3.4.0 CLI commands for setting VM display width, height, and DPI ### Examples: Deploy a VM running MacOS Sequoia 15.4.1 with a display width of 2560x1600px and 320px display DPI (HiDPI):`orka3 vm deploy --image ghcr.io/macstadium/orka-images/sequoia:15.4.1 --display-width 2560 --display-height 1600 --display-dpi 320` Deploy a VM running the latest version of Mac OS Sequoia (15.5) with a display width of 1920x1080px and a display DPI of 90px:`orka3 vm deploy --image ghcr.io/macstadium/orka-images/sequoia:latest --display-width 1920 --display-height 1080 --display-dpi 90` After the VM is successfully created, the display settings specified in the CLI will be reflected in the VM’s display as was specified by the user: ![A deployed Sequoia VM login screen with display resolution configurations set using the Orka 3.4.0 CLI](https://files.readme.io/4833d28cfc9e5f3729ad7ec180d99031154338bcc0ec6dd7e0c2f18d80c72e68-2500pxdisplay.png) A deployed Sequoia VM login screen with display resolution configurations set using the Orka 3.4.0 CLI ### Set display settings for VM configurations: The `orka3 vm create` command has the following new options: `--display-width` - Adjust console display window width in pixels\ `--display-height` - Adjust console display window height in pixels\ `--display-dpi` - Adjust console display density in pixels The following constraints apply to both deployed and configured VMs: * Supports a minimum width of 320 px. * Supports a maximum width of 3840 px. * Supports a minimum height of 480 px. * Supports maximum height of 2160 px. * Supports a minimum DPI of 60 px. * Supports a maximum DPI of 240 px. * Supports an optional maximum DPI of 320 px. If you select an unsupported resolution, you will see the following error(s): ![Display height error when deploying a VM on Orka 3.4.0](https://files.readme.io/f3bd9de408206ca12bb54e03a96bc1b3c8366deedb2259c247564584f3dfb1fd-VMDisplayError.png) Display height error when deploying a VM on Orka 3.4.0 ### Set display settings via Orka API at VM deployment You can now set custom display settings when deploying a VM via the Orka API. The `POST /api/v1/namespaces/{namespace}/vms` route now accepts the following fields: `displayWidth` - Adjust console display width in pixels\ `displayHeight`- Adjust console display height in pixels\ `displayDPI`- Adjust console display density in pixels ### Set display settings via Orka API at VM configuration You can now set custom display settings when configuring a VM via the Orka API. The `POST /api/v1/namespaces/{namespace}/vmconfigs` route now accepts the following fields: `displayWidth` - Adjust console display width in pixels\ `displayHeight`- Adjust console display height in pixels\ `displayDPI`- Adjust console display density in pixels ![Example of adjusting display resolution via the Orka API](https://files.readme.io/de67ce365385061f628624269790ba087d85347ef0ae70ff97b41d326c8532e8-APIDisplayResolution.png) Example of adjusting display resolution via the Orka API The following constraints apply to both deployed and configured VMs: * Supports a minimum width of 320 px. * Supports a maximum width of 3840 px. * Supports a minimum height of 480 px. * Supports maximum height of 2160 px. * Supports a minimum DPI of 60 px. * Supports a maximum DPI of 240 px. * Supports an optional maximum DPI of 320 px. ### Improvements to existing features Internal improvements resulting in faster deployment times overall. VMs created from an IPSW now have a default display resolution of 1920x1080x96 px. ### Bug fixes This release addresses the [known issue](/orka/orka-upgrades-and-release-notes/orka-33-release-notes) in Orka 3.3.0 involving virtualization and unique machine identifiers. Unique machine ID/UUID configuration is now behind a feature flag. Customers who need unique machine IDs for their Orka environment should [raise a support ticket](https://docs.macstadium.com/docs/ticketing-and-support-1) with MacStadium to control this behavior for their cluster. Orka no longer sends cookies when interacting with OCI registries # Orka 3.5 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-35-release-notes Orka 3.5 release notes covering shared attached disk configuration, CLI namespace resolution, OCI image stability fixes, and macOS Tahoe and Sequoia support. **IMPORTANT** Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. ## Orka 3.5.2 ### Release summary Orka 3.5.2 delivers enhanced storage management capabilities, streamlined CLI workflows, and significant reliability improvements across the platform. This release introduces native shared attached disk configuration, eliminating manual storage provisioning steps for VM deployments. The Orka CLI now uses intelligent namespace resolution by leveraging your available `orka` kubeconfig context. Additionally, Orka 3.5.2 includes critical stability enhancements for OCI image operations, macOS Tahoe and Sequoia compatibility fixes, and improved operator behavior in multi-namespace environments. ## New Features ### VM Shared Attached Disk Configuration: The Orka AMI now supports automatic setup of VM shared attached disks during instance initialization #### Key capabilities: * Flexible deployment control: Enable or disable shared disk usage globally using the `vm_shared_disk_enabled: true` variable * Instance-level disk sizing: Specify shared disk size for each Mac instance via user data script (AWS) or via Ansible (on-prem) * Consistent VM storage: When enabled, all VMs deployed from the instance will automatically use the shared attached disk, ensuring standardized storage configuration across your infrastructure. On Apple silicon nodes, only one VM may run per node at a time when this feature is enabled. See [Critical limitation for Apple silicon](#technical-requirements) below. #### Getting started: #### First-time disk installation (per-host): When a shared attached disk is used for the first time on a host, you need to format and mount it from inside the first VM deployed on that host. This is a one-time step per host. All subsequent VMs deployed on the same host will have the disk auto-mounted at `/Volumes/shared` on boot. 1. Inside the guest VM, identify the shared disk: ``` diskutil list internal physical ``` Look for the disk identifier in the output. The disk will initially be unformatted and will not contain a filesystem. 2. Format and mount the disk: ``` diskutil eraseDisk -noEFI JHFS+ shared /dev/ ``` Replace `` with the identifier from the previous step (e.g., `disk1`). The disk will be automatically mounted at `/Volumes/shared`. These steps only need to be performed once per host, for the first VM deployed on that host. Every VM subsequently deployed on the same host will have the shared attached disk auto-mounted on boot at `/Volumes/shared`. For AWS deployments (two-step process): To enable shared attached disk support for your Orka instance: 1. Set up a [CodeBuild project](/orka/orka-on-aws-and-on-prem/orka-on-aws-getting-started#6-setup-a-codebuild-project-to-run-orka-installation-into-the-eks-cluster-) (if one is not already configured) and set: `vm_shared_disk_enabled: true` 2. Configure each EC2 Mac Instance. Set the `VM_SHARED_DISK_SIZE` environment variable to the desired size as part of the user data script during instance launch: ``` #!/bin/bash export VM_SHARED_DISK_SIZE=500 /usr/local/bin/bootstrap-orka ``` **Note:** Both steps are required. The `VM_SHARED_DISK_SIZE` environment variable must be set for *each instance* , but the `vm_shared_disk_enabled` variable is set *once* globally. 3. The bootstrap script will automatically configure the instance to use the VM shared disk feature, and applies to all VM deployments from the instance 4. All subsequent VM deployments from this instance will utilize the shared attached disk To disable the feature, first set `vm_shared_disk_enabled: false` in Ansible and re-run your CodeBuild project, then terminate and re-create your EC2 Mac instances. #### Technical requirements: * Your cluster has been upgraded to Orka v3.5.2 (Note that clusters must be at least on Orka 3.4 / k8s v1.33 to be upgraded to 3.5.2) * Global configuration: The `vm_shared_disk_enabled: true` variable must be set in Ansible (this is disabled by default) * AWS only: The `VM_SHARED_DISK_SIZE` environment variable must be set in the user data script for each EC2 Mac instance to enable the feature * For Apple silicon nodes: Shared attached disk support is **disabled** by default: `vm_shared_disk_enabled: false`. * On-prem only: Optionally set `osx_node_orka_vm_shared_disk_size` to specify disk size. This variable does not apply to AWS deployments. **Critical limitation for Apple silicon:** When shared attached disk is enabled, only **one** VM may run per Apple silicon node at a time. Plan your node capacity accordingly. * Users running AWS: Note that the `VM_SHARED_DISK_SIZE` environment variable must be set in the user data script to enable the feature ### Default Namespace Detection in Orka CLI The Orka CLI now reads the default namespace directly from your `orka` kubeconfig context, implementing hierarchical namespace resolution with environment-level overrides also available. #### Key capabilities: * Automatic namespace detection: The Orka CLI now automatically derives the default namespace from your `orka` kubeconfig context, eliminating the need to repeatedly specify namespaces in commands * You can manually set the `ORKA_DEFAULT_NAMESPACE` in order to override the kubeconfig-derived namespace for specific workflows or environments #### Getting started: #### Set a custom default namespace ``` export ORKA_DEFAULT_NAMESPACE=my-team-namespace orka3 vm list kubectl config set-context orka --namespace=orka-default ``` #### Technical requirements: * Orka CLI version 3.5.2 or later * Valid `orka` kubeconfig file with configured context * Optional: Set the `ORKA_DEFAULT_NAMESPACE` environment variable if a custom namespace override is needed * Existing namespace-specific flags (e.g., `--namespace`) will continue to work and take precedence over default namespace settings ## Improvements * Reliability improvements for OCI image operations * VM troubleshooting and logging improvements * Orka Engine VM start timeout is now configurable via Ansible * Image push/pull streaming operations now fail with a timeout if the Orka Engine server is unavailable * Cache cleanup has been serialized to avoid concurrent cleanup failures, ensuring cache lock file permissions remain consistent * Reduced noise and fixed behavior in non-default namespaces * Orka no longer tries to process unsupported ECR refresh jobs when new namespaces are created * The image caching state is updated correctly when caching an already-cached image after a node moves to a different namespace ## Bug fixes * macOS Tahoe 26.0 compatibility fixes for image deletion, copying, and tagging * Pulling public images from GitHub Container Registry succeeds even when registry credentials are configured (automatic retry without credentials) * Orka VM tools v3.5.2 now applies the configured display resolution correctly for Sequoia guests with custom resolution settings * **Note:** You must update Orka VM tools on your existing images to receive this fix. New images created with Orka 3.5.2 will include the updated VM tools automatically. ## Orka 3.5.1 ### Release summary The Orka v3.5.1 hotfix addresses five issues affecting ARM nodes, Orka operator, and the Orka CLI. All fixes can be deployed with zero downtime. ### Fixed issues #### NAT Networking on M4 Pro Issue: Sporadic connectivity failures where VMs using NAT networking on M4 Pro nodes cannot reach the internet or LAN. Fix: Added automatic detection and self-healing for NAT networking issues. If self-healing fails, the VM deployment will fail and the VM will be deleted. Note that most common integrations (e.g., Jenkins) will then simply re-deploy the VM. #### Node Resource Display in Custom Namespaces Issue: `orka3 node list -o wide` incorrectly showed resource usage for nodes in non-default namespaces. This issue was cosmetic only, and had no impact on scheduling VMs. Fix: Corrected resource reporting logic to accurately display usage across all namespaces. #### Image Caching in Custom Namespaces Issue: `orka3 ic add` silently failed when caching images to nodes in custom namespaces. Fix: Image caching now works correctly across all namespaces. You will need to re-cache any previously failed images after applying this hotfix. #### Service Account Permissions Loss Issue: Service accounts lost RBAC permissions during Ansible maintenance operations, breaking automated workflows. Fix: Modified maintenance playbooks to preserve service account role bindings. Note: If you are running a previous version of Orka and are experiencing this issue, you can verify service account permissions and manually restore if needed using `orka3 rb add-subject`. #### SSO Login JWT Decoding Issue: `orka3 login` with SSO failed for certain identity providers with the error "invalid ID token: illegal base64 data". Fix: Enhanced JWT token decoding to support a wider range of identity provider token formats. Update to the latest Orka CLI version and test SSO login. ### Deployment The Orka v3.5.1 hotfix patch is a zero-downtime deployment. Note that Orka clusters must be at least on Orka v3.4+ / k8s v1.33 to be upgraded to v3.5.1. ### Support If you have questions or require assistance, please [contact our support team.](mailto:support@macstadium.com) ## Orka 3.5.0 We are excited to announce the latest Orka release, which brings with it significant networking enhancements, expanded guest OS support, and improved storage capabilities. Orka 3.5.0 also includes various bug fixes, improvements to performance optimization, and stability enhancements. ## New Features ### Bridged networking support: Customers must configure their own DHCP server on the network infrastructure. Static IP configuration through Orka is not currently supported. The release of Orka 3.5.0 brings with it new support for bridged networking for customers running [Orka On-Prem](/orka/orka-on-aws-and-on-prem/orka-on-prem-getting-started), enabling seamless connectivity from a virtual environment to a physical network environment. #### Key capabilities: Bridged networking allows Orka VMs to connect directly to a physical network as a native device, receiving their own IP address from the network’s DHCP server. This enables direct communication with other network devices and services without the use of NAT, and is configurable automatically using Orka alongside your existing DHCP server. #### Getting started: For more information on getting started using bridge networking with Orka, please visit: [Bridge networking with Orka](/orka/orka-on-aws-and-on-prem/using-bridge-networking-with-orka-350). ### MacOS 26 Tahoe guest support: #### Key capabilities: Orka 3.5.0 now allows users to create guest VM images using MacOS 26 (Tahoe). #### Getting started: You can get started with Tahoe by downloading the latest image from [OrkaHub](https://orkahub.com/), or our Tahoe package in the [orka-images repository](https://github.com/orgs/macstadium/packages/container/package/orka-images%2Ftahoe). Tahoe guest VMs can be run using the Orka CLI, or by using Orka Desktop. #### Technical requirements: * A Sequoia 15.5 host is required in order to run a MacOS Tahoe 26 guest image * Orka does not currently officially support running Tahoe on a host machine. We aim to officially support MacOS 26 hosts in the upcoming Orka 3.6.0 release. ### OCI storage: Orka 3.5.0 introduces Harbor OCI storage as an alternative to NFS storage in Orka. OCI is now our default managed storage solution for new Orka customers (existing customers will keep their current storage). Your OCI instance comes preconfigured with everything needed to push and pull macOS VM images using the Orka CLI. When you purchase hosted storage through MacStadium, OCI is included as a managed service with automatic resource scaling based on your available Orka nodes. While external repositories will still remain supported for use with Orka, our managed Harbor instance provides better performance and reliability. #### Key capabilities: * Secure, OCI-compliant image storage and management * Role-based access control and user management * Activity auditing and compliance tracking * Push and pull images directly from the Orka CLI to your Harbor registry * Prometheus support for Harbor #### Technical requirements: For technical requirements, see [Using Harbor OCI Storage with the Orka CLI](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli). ## Improvements * VM shared storage is now **disabled** by default for new Orka deployments. If you are a new Orka customer and require shared storage for your VMs, please open a support ticket to opt-in and enable this feature in your cluster. Existing Orka deployments are not impacted by this change, and will retain the previous setting (enabled). * Performance and stability improvements have been made to the Orka Nodes. * New [Packer template examples](https://github.com/macstadium/packer-plugin-macstadium-orka/tree/main/examples) are now available, adding popular developer tools such as Homebrew, Cocoapods, Swift, xcodes, Git, and Fastlane on top of our latest existing MacOS Tahoe and MacOS Sequoia 15.5 base images. * NFS connection is now self-healing * VM deletion time has been improved * Runtime reporting has been improved ## Bug fixes * Orphan VM logic has been updated to include removing stopped VMs automatically * Public IP feature awareness has been added to the Orka API server * VMs will no longer pull images if an image is already running ## Known Issues * VM data loss during upgrade: Upgrading from Orka 3.4 to Orka 3.5 will result in VM loss. Ensure you save/backup all virtual machines before proceeding with the upgrade, then redeploy them afterward. # Orka 3.6 Release Notes Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-36-release-notes Orka 3.6 release notes: Orka Upgrade Service, Kubernetes 1.35, VM network isolation, CloudFront artifact distribution, and patches 3.6.2 and 3.6.3. **IMPORTANT** Always ensure that your cluster, Orka tools and integrations, and Orka VM Tools run matching versions. For example, the respective available 3.x versions. **Upgrading to 3.6.0 requires Orka 3.2.x.** Contact [MacStadium support](mailto:support@macstadium.com) if you need a staged upgrade. **Some maintenance operations, such as adding Mac compute nodes, require the latest patch version** (the .z in x.y.z). Patch upgrades are zero-downtime, include the latest bug fixes, and can be requested through [MacStadium support](mailto:support@macstadium.com). For downtime expectations, VM impact, and preparation steps by upgrade type, see [Upgrading Orka](/orka/orka-upgrades-and-release-notes/orka-upgrades). ## Orka 3.6.3 ### Release summary Orka 3.6.3 makes image cache removal generally available: `orka3 imagecache remove` and the `POST /v1/imagecache/remove` API endpoint, introduced as early access in Orka 3.6.2, are now available to all customers. The release also adds cache tracking for images cached automatically during VM deployment, normalizes image cache naming to prevent duplicate cache entries, and updates dependencies to address CVEs. ### New features #### Image cache removal is generally available Image cache removal, introduced as early access in Orka 3.6.2, is generally available as of Orka 3.6.3. Use `orka3 imagecache remove` or the `POST /v1/imagecache/remove` API endpoint to remove cached images from Apple silicon nodes: reclaim disk space, rotate old images, and automate image lifecycle policies without MacStadium intervention. Do not remove an image while VMs are actively being deployed from it on the target node; wait for in-flight deployments to complete first. For usage, examples, and details on this limitation, see [Image caching](/orka/orka-resources/image-caching), the [orka3 CLI reference](/orka/orka3-cli-reference/image-management#orka3-imagecache-remove), and the [Orka API reference](https://macstadium.github.io/orka-api-docs/). ### Improvements **Image cache** * Images cached automatically during VM deployment on Apple silicon nodes are now tracked as cache entries, the same as images cached explicitly with `orka3 imagecache add`. They appear in `orka3 imagecache info` output and can be removed with `orka3 imagecache remove`, without re-downloading the image. * Image cache names are normalized when caching, so the same image referenced in different formats no longer creates duplicate cache entries. * The `(Admin-only)` label has been removed from the `orka3 imagecache add` help text. The command does not require administrator privileges. **Networking** * VM network isolation allow-list rules are now enforced with explicit precedence over block rules, rather than relying on chain ordering. No effect on existing allow-list configurations. ### Bug fixes * Fixed: `imagecache add` with a `:latest` tag created duplicate and stale `ImageCache` CRDs due to missing tag normalization. * Fixed: The API did not accept single-encoded image names in the imagecache path. * Fixed: VMs deployed to a Mac node with an IP address recently freed by another VM could experience hung NFS mounts, caused by stale firewall connection state left over from the previous VM. VM lifecycle operations now flush this state on deploy and delete. ### Security * Updated `golang.org/x/crypto`, `golang.org/x/net`, `swift-nio`, and other dependencies to address CVEs. ## Orka 3.6.2 ### Release summary Orka 3.6.2 introduces `orka3 imagecache remove` and a corresponding `POST /v1/imagecache/remove` API endpoint as early access, fixes a VM runtime deadlock, adds UDP support for host/guest port reservations, ships code-signed `darwin-arm64` binaries for the Virtual Kubelet and Upgrade Service agent, and includes an updated GitHub Actions integration (v1.1.14). ### New features #### Image cache removal (early access) Image cache removal shipped in Orka 3.6.2 as early access. It is generally available as of Orka 3.6.3. Orka 3.6.2 adds `orka3 imagecache remove` and a corresponding `POST /v1/imagecache/remove` API endpoint, enabling selective removal of cached images from Apple silicon nodes. Before this release, removing a cached image required a support ticket and manual intervention by MacStadium. Customers can now remove images directly to reclaim disk space, rotate old images, and support automated image lifecycle policies. Key behaviors: * Supports `--nodes`, `--tags`, and `--all` for targeted or cluster-wide removal, consistent with `imagecache add` * Removal is asynchronous; use `orka3 imagecache info` to check status For usage and examples, see [Image caching](/orka/orka-resources/image-caching), the [orka3 CLI reference](/orka/orka3-cli-reference/image-management#orka3-imagecache-remove), and the [Orka API reference](https://macstadium.github.io/orka-api-docs/). ### Improvements **AWS deployments** Upgrading tooling on ARM nodes no longer requires replacing the AMI. Previously, an ARM tooling upgrade required deleting the instance, waiting approximately 2 hours for the replacement to provision, redeploying, and reapplying any custom namespace or tag configuration. ARM nodes can now receive tooling updates in place. **On-prem deployments** * Network isolation policy Ansible variables are now available for on-prem deployments. The VM network isolation feature introduced in Orka 3.6.0 can now be configured via Ansible for on-prem clusters. Contact [MacStadium support](mailto:support@macstadium.com) to configure network isolation policies for your cluster. **Platform** * VM port reservations now support an optional protocol suffix. Use `:/udp` or `:/tcp` when deploying a VM. The protocol is case-insensitive and defaults to TCP if omitted. * The Virtual Kubelet and Upgrade Service agent darwin-arm64 binaries are now code-signed with a Developer ID certificate in CI. * CLI help text image references have been updated. **GitHub Actions integration** The GitHub Actions integration releases independently of Orka and is compatible with Orka 3.x. Version 1.1.14 is available. * The integration now tracks in-flight VM deployments to prevent over-provisioning when multiple jobs start at the same time. * On restart, the integration reconciles existing VMs rather than ignoring them. Running VMs are adopted and cleaned up when their jobs finish; failed or non-running VMs are cleaned up immediately, preventing orphaned VMs from consuming cluster resources. Controlled by the new `ENABLE_RECONCILIATION` environment variable (default: `True`). * The integration now reuses an existing runner scale set on restart instead of creating a new one, allowing in-progress jobs to continue uninterrupted. Controlled by the new `MANAGE_RUNNER_SCALE_SETS` environment variable (default: `True`). * Improved resilience for curl download errors during VM provisioning. ### Bug fixes * Fixed: VM deadlock on long-lived VMs. * Fixed: Intel node disk performance regression. ### Known issues **imagecache remove and concurrent VM deployments** `orka3 imagecache remove` is not protected against concurrent VM deployments. If removal runs during the brief window between a deployment's pull and clone stages on the same node, the deployment may fail with a generic error. Do not run `imagecache remove` while VMs are actively being deployed from that image on the target node. Wait for in-flight deployments to complete first. See the [orka3 imagecache remove reference](/orka/orka3-cli-reference/image-management#orka3-imagecache-remove) for details. ### Upgrade notes **CLI API URL for clusters with public NAT IPs** If your cluster has public NAT IPs or a custom domain configured for the Orka API, the CLI now uses TLS based on a feature flag returned by the API rather than by detecting whether the configured address is a public IP. If your CLI is configured to use the internal IP address (`http://10.221.188.20`) on a cluster with public API access, connections will time out after upgrading to 3.6.2. Update your CLI configuration to use your public NAT IP or custom domain: ```bash theme={null} orka3 config set --api-url https:// ``` If you do not have a public URL or custom domain, no action is needed. ## Orka 3.6.0 ### Release summary Orka 3.6.0 introduces the Orka Upgrade Service: a Kubernetes-native update mechanism that enables MacStadium to deliver cluster upgrades to your environment. This release validates Orka against Kubernetes 1.35 on both on-prem and EKS, and adds configurable VM network isolation policies for Apple silicon nodes. Orka artifacts are now distributed publicly via CloudFront, eliminating the need for AWS credentials to pull binaries and images. The release also includes Jenkins and Packer plugin updates, GitHub Actions integration improvements, and automated Orka VM Tools updates. ## New features ### Orka Upgrade Service Orka 3.6.0 ships the Orka Upgrade Service: a Kubernetes-native update mechanism that allows MacStadium to push Orka cluster upgrades to your environment. This initial release establishes the upgrade infrastructure. Future releases will expose available update versions to cluster administrators and allow them to control deployment timing. #### Upgrade Service version visibility `orka3 version` now includes the Upgrade Service operator version. `kubectl get orkanodes -o wide` shows the Upgrade Service agent version alongside each node. ### Kubernetes 1.35 support Orka 3.6 is validated against Kubernetes 1.35 on both on-prem deployments and AWS EKS. EKS customers can upgrade their clusters on schedule without risk of breaking Orka. A few things worth knowing during a Kubernetes upgrade: * Running VMs are not affected. Mac nodes are not part of the Kubernetes upgrade and do not restart. * The Virtual Kubelet does not need to be upgraded and is forward-compatible with new Kubernetes versions. * The API Server, Operator, and Webhooks may have brief downtime during node cordon/drain. Most `orka3` CLI commands continue working during this window; only `login` and `vm push` require the API server. If the Operator pod is evicted during an upgrade, leader election takes up to 15 seconds. During this window VM deployments may be slower, but will not error. ### VM network isolation This feature is available on Apple silicon nodes only. Orka 3.6.0 introduces configurable VM network isolation policies for Apple silicon nodes. MacStadium can configure explicit allow and deny rules by CIDR block, restricting which networks a VM can reach without changes to your broader network infrastructure. This is particularly useful in multi-tenant environments and for customers with security requirements around VM-level network segmentation. By default, VMs on MacStadium-hosted clusters have access to the storage network blocked. All other traffic, including internet access and VM-to-VM communication on the same node, is allowed unless explicitly restricted. Policy changes apply to VMs deployed after the change. VMs already running are not affected. To configure network isolation policies for your cluster, contact [MacStadium support](mailto:support@macstadium.com). ### Automated Orka VM Tools updates Orka VM Tools are now automatically updated in MacStadium's base images on GitHub Container Registry (GHCR) with each Orka release. Images pulled from the [orka-images GHCR repo](https://github.com/macstadium/orka-images) now ship with the current VM Tools version automatically, without requiring manual installation. ## Improvements ### AWS and on-prem deployments Several improvements reduce the operational footprint and permission requirements for AWS and on-prem deployments: * Orka no longer installs its own cert-manager if one is already present in the cluster. You can skip the bundled installation and use your existing cert-manager instead, eliminating version and configuration conflicts. * The permissions required for Orka to run have been scoped to least-privilege: separate, minimal credential sets are now defined for Orka configuration, the Virtual Kubelet, ECR access, and backup operations. * Webhook footprint has been reduced: the Pod webhook, ISO and image webhooks, and rolebinding webhook have been removed from AWS and on-prem installations. ### Integrations * **Jenkins OCI image support:** The [Orka Jenkins plugin](https://github.com/jenkinsci/macstadium-orka-plugin) now supports OCI images. Previously the plugin only allowed selecting images from NFS storage; you can now specify an OCI image directly. * **Packer plugin bridge networking:** The [Orka Packer plugin](https://github.com/macstadium/packer-plugin-macstadium-orka) now supports bridge networking, which was introduced in Orka 3.5 but was not supported in the plugin until this release. * **GitHub Actions runner metrics:** The [Orka GitHub Actions integration](https://github.com/macstadium/orka-github-actions-integration) now exposes an optional Prometheus metrics endpoint for runner scale set statistics. When enabled, the endpoint publishes labeled metrics per scale set with a configurable polling interval. The endpoint is opt-in and disabled by default. * **GitHub Actions integration reliability:** The Orka GitHub Actions runner now includes improved VM cleanup logic, an orphaned VM watcher that automatically removes VMs with no active runner, and expanded logging for better job observability. ### Platform * **ECDSA SSH key support:** The Orka API now accepts ECDSA keys when uploading certificates. Previously only RSA keys were supported. * **Prometheus metrics on port 443 with TLS:** The Orka Prometheus data collector is now exposed on port 443 with TLS, unblocking use in environments that require all monitoring traffic to run over a secure port. * **Object storage for cluster config backups:** Orka cluster configuration backups are now stored via object storage instead of NFS, improving backup reliability and decoupling them from NFS availability. * **Improved VM start error diagnostics:** VM start failures during concurrent operations that previously produced empty error messages now surface actionable diagnostic information, including VZErrorDomain errors and configuration issues. * **Public artifact distribution via CloudFront:** Orka binaries and container images are now distributed publicly via CloudFront. AWS and on-prem deployments no longer require AWS credentials to pull Orka artifacts. * `orka3 version` reports Upgrade Service versions: The CLI now includes Upgrade Service operator and agent versions in version output. * Improved error message reporting from the Orka Engine for VM start failures. ## Bug fixes * Fixed: Operator fails to configure Intel VMs * Fixed: Calico network plugin setup fails on Orka 3.5 clusters * Fixed: VM image push retries fail intermittently * Fixed: VK kubeconfig creation fails for on-prem deployments * Fixed: `orka3 vm save` fails when the cluster uses OCI image storage * Fixed: Updated the Kubernetes API TCP ingress route to use the built-in `kubernetes` service. If you manage your own Orka deployment and use public NAT IPs, apply the update by running: ```bash theme={null} ansible-playbook -i hosts kubernetes.yml -e "k8s_reverse_proxy_enable=true" --tags k8s-reverse-proxy ``` ## Support If you have questions or require assistance, please [contact our support team](mailto:support@macstadium.com). # How to upgrade your Orka cluster Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/orka-upgrades Upgrade your Orka cluster via a MacStadium support ticket with a scheduled maintenance window. Covers upgrade types, prep steps, and post-upgrade tasks. When MacStadium is hosting your Orka environment, Orka upgrades require a scheduled maintenance window. Some Orka upgrades might require additional preparation on your side. ## Requesting an upgrade 1. Check the release notes for the version that you want to upgrade to. Complete the suggested preparation, if any. 2. Submit a ticket through the MacStadium portal. 3. Schedule a time for the maintenance window that works for you through the link provided in the ticket. * The suggested time(s) must be Monday through Thursday, 9am or 1pm EST, depending on availability in the [MacStadium Global Operations calendar](https://calendly.com/macstadium-global-operations/orka-upgrade). 4. After the upgrade is complete, you might need to [download and install](/orka/orka-overview/tools-integrations) a new Orka CLI version and/or restore any missing resources (based on the type of upgrade). ## Types of upgrades ### New Orka releases This is the most common type of Orka upgrade. Orka releases bring new CLI and API versions with new features, improved functionality, and critical bug fixes. #### **Preparing for the upgrade** Make sure that during the maintenance window there are no running workflows (for example, deploying a VM and running a build).\ As part of this upgrade, you might need to [download and install](/orka/orka-overview/tools-integrations) a new Orka CLI version. Service Account tokens must be regenerated after this upgrade. Any automated workflows using service account tokens will fail until tokens are regenerated with `orka3 serviceaccount token `. | Aspect | Notes | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Maintenance window | Up to 3 hours. Must be scheduled with the MacStadium support team. | | Access to the environment | During the maintenance window, the environment is inaccessible. After the maintenance window, access is restored. You can reach your environment at the original IP, Orka domain, or external custom domain. | | Orka users | Orka users persist. | | Service Accounts | Your custom service accounts persist. | | VMs and VM configs | VM configs persist. VMs may be deleted. After the upgrade completes, you can redeploy them from the respective VM configs. | | Images and ISOs | Images and ISOs persist. | | Image cache (Apple silicon nodes) | The image cache is removed from each node. | | Namespaces | Your custom namespaces persist. | | RoleBindings | Your custom permissions persist. | | Kubernetes Pods and services | Your custom Pods and services persist. | #### Patch version upgrades Orka patch releases (for example, 3.5.0 → 3.5.2) deliver bug fixes and stability improvements between minor releases. Patch upgrades are zero-downtime: no preparation is required, and running VMs and workflows are not interrupted. **Adding nodes to your cluster requires the latest patch version.** If your cluster is on an older patch version, node additions will fail. Request a patch upgrade before submitting a node add request. | Aspect | Notes | | --------------------------------- | ------------------------------------------------ | | Maintenance window | None required. Patch upgrades are zero-downtime. | | Access to the environment | Uninterrupted throughout the upgrade. | | Orka users | Persist. | | Service Accounts | Persist. Tokens do not need to be regenerated. | | VMs and VM configs | Persist. Running VMs are not affected. | | Images and ISOs | Persist. | | Image cache (Apple silicon nodes) | Persists. | | Namespaces and RoleBindings | Persist. | ### Virtualization and orchestration layer upgrades (Kubernetes, Docker, or Linux) Occasionally, the Orka team upgrades the components of the virtualization and orchestration layer to a newer version. The version in Orka might run a few versions behind the latest and greatest release to ensure that the virtualization layer and orchestration layer are stable and bug-free. #### **Preparing for the upgrade** * Make sure that during the maintenance window there are no running workflows (for example, deploying a VM and running a build). * If this is a Kubernetes upgrade and you are working with the Kubernetes layer directly, make sure to address any deprecated APIs. Service Account tokens must be regenerated after this upgrade. Any automated workflows using service account tokens will fail until tokens are regenerated with `orka3 serviceaccount token `. | Aspect | Notes | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Maintenance window | Up to 3 hours. Must be [scheduled](/orka/orka-upgrades-and-release-notes/orka-upgrades#requesting-an-upgrade) with the MacStadium support team. | | Access to the environment | During the maintenance window, the environment is inaccessible. After the maintenance window, access is restored. You can reach your environment at the original IP, Orka domain, or external custom domain. | | Orka users | Orka users persist. | | Service Accounts | Your custom service accounts persist. | | VMs and VM configs | VM configs persist. VMs are deleted. After the upgrade completes, you can redeploy them from the respective VM configs. | | Registry credentials | Registry credentials do not persist and will need to be regenerated after the upgrade. | | Images & ISOs | Images and ISOs persist. | | Image cache (Apple silicon nodes) | The image cache is removed from each node. | | Namespaces | Your custom namespaces persist. | | RoleBindings | Your custom permissions persist. | | Kubernetes Pods and services | Your custom Pods and services are lost. You need to recreate them. | # Upgrading Orka on AWS Source: https://docs.macstadium.com/orka/orka-upgrades-and-release-notes/upgrading-orka-on-aws Upgrade your Orka cluster on AWS from 3.5 to 3.6. Covers the Orka services upgrade and the new Ansible-based in-place tooling upgrade for ARM Mac nodes, including SSH and SSM requirements. Orka on AWS upgrades are self-service. You run the upgrade using the same CodeBuild project used for installation, pointed at the Orka 3.6 Ansible image. There are two parts: * **Services upgrade:** upgrades the Orka Kubernetes services on EKS. * **Node tooling upgrade:** updates the Virtual Kubelet and Orka Engine on your ARM Mac nodes in place. Review the [3.6 release notes](/orka/orka-upgrades-and-release-notes/orka-36-release-notes) before upgrading. ## Before you upgrade ### Verify your node tags The upgrade uses a dynamic Ansible inventory to identify your ARM nodes. Each ARM EC2 Mac instance must have the EC2 tag: * **Key:** `role` * **Value:** `orka-arm` Instances without this tag will not be selected by the inventory and will be skipped. Verify this tag is applied to all ARM nodes before proceeding. ### Check your ARM node SSH configuration Starting with the 3.5 to 3.6 upgrade, ARM node tooling is updated in place using Ansible rather than replacing the AMI. For this to work, your ARM EC2 Mac instances must accept SSH connections on port 22 for the `ec2-user` account using key-based authentication. EC2 Mac instances launched with a key pair have this enabled by default. Your security group must allow inbound TCP port 22 from your CodeBuild subnets. If your nodes cannot accept SSH, the upgrade can run over SSM instead. SSM upgrades require an S3 bucket in the same region as your ARM nodes for Ansible file transfer, and can take significantly longer (up to 4 hours). SSH is strongly recommended. ### Enabling SSH on nodes launched without a key pair If your nodes were not launched with a key pair and do not accept SSH connections, you can use SSM to install a public SSH key first, then proceed with the faster SSH upgrade path. This requires your instances to be SSM-managed: the `AmazonSSMManagedInstanceCore` policy must be attached to the instance profile. To set this up: 1. Generate an SSH key pair (ed25519 or RSA). 2. Run the following SSM command to install the public key on all tagged ARM nodes: ```shell theme={null} aws ssm send-command \ --document-name "AWS-RunShellScript" \ --targets "Key=tag:role,Values=orka-arm" \ --parameters '{"commands":[ "mkdir -p /Users/ec2-user/.ssh", "echo \"\" >> /Users/ec2-user/.ssh/authorized_keys", "chmod 700 /Users/ec2-user/.ssh", "chmod 600 /Users/ec2-user/.ssh/authorized_keys", "chown -R ec2-user /Users/ec2-user/.ssh" ]}' ``` The identity running `send-command` requires `ssm:SendCommand` on the target instances and on the `AWS-RunShellScript` document, plus `ssm:GetCommandInvocation`. 3. Store the private key in AWS Secrets Manager as a plaintext secret. 4. Grant your CodeBuild service role permission to read the secret: ```json theme={null} { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:*:*:secret:*" } ``` 5. Ensure your security group allows inbound TCP port 22 from your CodeBuild subnets. Once the key is installed, proceed with the SSH upgrade path below. To rotate the stored SSH key pair automatically, see [How to use AWS Secrets Manager to securely store and rotate SSH key pairs](https://aws.amazon.com/blogs/security/how-to-use-aws-secrets-manager-securely-store-rotate-ssh-key-pairs/). ### Multi-region deployments The upgrade discovers ARM nodes in the region set by `AWS_DEFAULT_REGION` on the CodeBuild project, defaulting to `us-east-1`. If your ARM nodes span multiple AWS regions, you can either configure multiple steps in a single CodeBuild project (one per region), or trigger separate runs with a region override: ```shell theme={null} aws codebuild start-build --project-name \ --environment-variables-override name=AWS_DEFAULT_REGION,value=us-west-2,type=PLAINTEXT ``` ## Upgrading the Orka services The Orka Kubernetes services are upgraded the same way they were installed: run the CodeBuild project pointed at the Orka 3.6 Ansible image. For setup details, see [Getting started with Orka on AWS](/orka/orka-on-aws-and-on-prem/orka-on-aws-getting-started). No additional configuration is required. ## Upgrading ARM node tooling ### Over SSH (recommended) Store your SSH private key in AWS Secrets Manager as a plaintext secret. Give your CodeBuild service role permission to read it: ```json theme={null} { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:*:*:secret:*" } ``` Update your CodeBuild buildspec to pull the key and run the upgrade playbook: ```yaml theme={null} version: 0.2 env: shell: bash variables: AWS_DEFAULT_REGION: "us-east-1" secrets-manager: SSH_PRIVATE_KEY: "" phases: install: commands: - apt-get update - apt-get install -y openssh-client - mkdir -p ~/.ssh - printf "%s\n" "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keygen -y -f ~/.ssh/id_rsa >/dev/null build: commands: - ansible-playbook -i arm.ssh.aws_ec2.yml configure-arm.yml --private-key ~/.ssh/id_rsa ``` Start the CodeBuild project. Ansible runs nodes in parallel; a typical deployment completes in under 10 minutes. For large numbers of nodes, timing scales with node count. ### Over SSM Use this method only if SSH cannot be enabled. SSM upgrades may take up to 4 hours per run. Requirements: 1. Instances are SSM-managed (`AmazonSSMManagedInstanceCore` policy attached to the instance profile). 2. An S3 bucket in the same region as your ARM nodes. Set the `ANSIBLE_AWS_SSM_BUCKET` environment variable on the CodeBuild project to the bucket name. 3. CodeBuild service role permissions for Session Manager: ```json theme={null} { "Effect": "Allow", "Action": [ "ssm:StartSession", "ssm:TerminateSession", "ssm:ResumeSession", "ssm:DescribeSessions", "ssm:GetConnectionStatus" ], "Resource": [ "arn:aws:ec2:::instance/*", "arn:aws:ssm:::document/SSM-SessionManagerRunShell", "arn:aws:ssm:::session/*" ] } ``` 4. CodeBuild service role permissions on the S3 bucket: ```json theme={null} [ { "Effect": "Allow", "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"], "Resource": "arn:aws:s3:::bucket-name/*" }, { "Effect": "Allow", "Action": ["s3:ListBucket", "s3:GetBucketLocation"], "Resource": "arn:aws:s3:::bucket-name" } ] ``` Run the upgrade playbook: ```shell theme={null} ansible-playbook -i arm.ssm.aws_ec2.yml configure-arm.yml ``` ## Changing node values By default, all configuration is read from the running node and reapplied automatically. You can also run the playbook independently to change a value without a full upgrade, for example to rename a node. Pass the value as an extra variable: | Value | Variable | | ------------- | ------------------------------------------- | | Node hostname | `-e override_node_hostname=` | | License key | `-e override_orka_engine_license_key=` | Example: ```shell theme={null} ansible-playbook -i arm.ssh.aws_ec2.yml configure-arm.yml --private-key ~/.ssh/id_rsa -e override_node_hostname=arm-node-1 ``` ## What changes in 3.5 to 3.6 ### ARM node tooling updates no longer require provisioning a new EC2 Mac instance Previously, updating tooling on ARM nodes required replacing the EC2 Mac AMI: the instance had to be deleted, a new one provisioned (a process that takes approximately 2 hours), and the node's name, namespace, and custom tags had to be manually reapplied. Starting with the 3.5 to 3.6 upgrade path, ARM node tooling is updated in place using Ansible over SSH. Ansible runs nodes in parallel; a typical deployment completes in under 10 minutes. The following are read from the running node and reapplied automatically: node name, node IP, cluster registration, license key, VM quota, and storage layout (including data volumes on instances with local NVMe). Running VMs are not interrupted. AMI replacement is still required when the host operating system needs to be upgraded. Release notes will call this out explicitly when it applies. ### Upgrade Service is installed As part of the 3.6 upgrade, the Orka Upgrade Service is deployed to your cluster. This will enable smoother tooling updates in future Orka releases without requiring you to provision new EC2 Mac instances. ### AWS credentials no longer required for artifact distribution Orka binaries and container images are now distributed publicly via CloudFront. You no longer need AWS credentials configured to pull Orka artifacts during upgrades or deployments. ### cert-manager behavior change Orka no longer installs its own cert-manager when configured to skip the bundled installation. This is not auto-detected: if you want Orka to skip cert-manager, configure the installation explicitly. If your cluster runs its own cert-manager and you previously experienced version or configuration conflicts with Orka's bundled installation, those conflicts can now be avoided by opting out. If your automation or tooling depends on Orka's cert-manager specifically, verify your setup before upgrading. ## Hybrid deployments (EKS control plane + on-premises Mac nodes) If your Orka deployment combines an EKS control plane on AWS with Mac nodes on-premises, the upgrade follows the same pattern as installation: each component is upgraded using the workflow for where it runs. * **EKS control plane and AWS services**: Follow the AWS upgrade flow in this guide. * **On-premises Mac nodes**: Follow the on-premises upgrade flow using your on-premises Ansible installation. SSH access to the nodes must be available via the same network path used during installation. The Orka Upgrade Service deploys identically regardless of whether nodes are on AWS or on-premises. For on-premises installation and upgrade prerequisites, see [Getting started with Orka on-premises](/orka/orka-on-aws-and-on-prem/orka-on-prem-getting-started). ## After the upgrade [Download and install](/orka/orka-overview/tools-integrations) the Orka 3.6 CLI if you haven't already. # Authentication and User Management Source: https://docs.macstadium.com/orka/orka3-cli-reference/authentication-and-user-management orka3 login, user get-token, logout, and service account token commands: the full authentication reference for Orka cluster access and CI/CD automation. ## Logging In ### orka3 login Log in to your Orka cluster with your MacStadium Customer Portal credentials. This operation launches a browser window with a login form. **Prerequisites:** You must be an administrator or a member of your company account in the MacStadium Customer Portal. If you can't access the MacStadium Customer Portal, contact your account administrator and request to be invited to the account. After you log in successfully, Orka generates an authentication token and stores it in `~/.kube/config`. **Syntax:** ```bash theme={null} orka3 login [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for login ``` **Examples:** ```bash theme={null} # Log in to your Orka cluster with your MacStadium Customer Portal credentials orka3 login ``` ### orka3 user login Alternative command for logging in. Functions identically to `orka3 login`. **Syntax:** ```bash theme={null} orka3 user login [flags] ``` **Examples:** ```bash theme={null} # Log in to your Orka cluster orka3 user login ``` ### orka3 user logout Log out of the Orka cluster. **Syntax:** ```bash theme={null} orka3 user logout [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for logout ``` **Examples:** ```bash theme={null} # Log out of your Orka cluster orka3 user logout ``` ## Managing Tokens ### orka3 user get-token Print your authentication token from `~/.kube/config`. You can use this token to log in to the Web UI or work with the Orka API. **Syntax:** ```bash theme={null} orka3 user get-token [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for get-token ``` **Examples:** ```bash theme={null} # Print your authentication token from your ~/.kube/config orka3 user get-token ``` ### orka3 user set-token Log in with a valid authentication token. This operation lets you bypass logging in through the browser. You can obtain a token by: * Printing your authentication token: `orka3 user get-token` * Generating a service account token: `orka3 serviceaccount token SERVICE_ACCOUNT_NAME` **Syntax:** ```bash theme={null} orka3 user set-token VALID_TOKEN [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for set-token ``` **Examples:** ```bash theme={null} # Log in with a valid authentication token orka3 user set-token VALID_TOKEN ``` ## Service Accounts Service accounts are intended for use by CI/CD integrations and automation. To use the cluster with one of the available Orka integrations, create a service account, obtain an authentication token for it, and configure the token in your preferred integration. **Admin Only:** All service account operations require administrative privileges. If `--namespace` is not set, operations default to the `orka-default` namespace. ### orka3 serviceaccount create Create a service account with the specified name in the orka-default namespace or another specified namespace. After the service account is created, you cannot move it across namespaces. **Service Account Name Requirements:** * Does not exceed 253 characters * Consists of lowercase alphanumeric characters, dashes (-) or periods (.) * Begins and ends with a lowercase alphanumeric character * Must be unique to the namespace After creating a service account, obtain a token for it: ```bash theme={null} orka3 serviceaccount token SERVICE_ACCOUNT_NAME ``` **Syntax:** ```bash theme={null} orka3 serviceaccount create SERVICE_ACCOUNT_NAME [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for create -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Create a service account in the 'orka-default' namespace orka3 serviceaccount create sa-jenkins # Shorter alias orka3 sa create sa-jenkins # Create a service account in the specified namespace orka3 sa create sa-jenkins-test --namespace orka-test ``` ### orka3 serviceaccount list List the service accounts in the orka-default namespace or another specified namespace. You can also use this command to check if a specific service account already exists. **Syntax:** ```bash theme={null} orka3 serviceaccount list [SERVICE_ACCOUNT_NAME] [--namespace TARGET_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List the existing service accounts in the 'orka-default' namespace orka3 sa list # List the existing service accounts for the specified namespace orka3 sa list --namespace orka-test # Check if the specified service account already exists orka3 sa list sa-jenkins # Check if the specified service account exists in a specific namespace orka3 sa list sa-jenkins --namespace orka-test ``` ### orka3 serviceaccount token Obtain an authentication token for the specified service account name. * If `--duration` is not set, the token is valid for 8760 hours (1 year). Orka might return a token with a shorter or longer lifetime. * If `--namespace` is not set, assumes the service account is in the orka-default namespace. **Syntax:** ```bash theme={null} orka3 serviceaccount token SERVICE_ACCOUNT_NAME [--duration DURATION] [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} --duration duration Token lifetime in minutes or hours (default 8760h0m0s) -h, --help Display help for token --no-expiration Create token with no expiration (mutually exclusive with --duration) -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Obtain a token for the specified service account orka3 sa token sa-jenkins # Obtain a token for a service account in a specific namespace orka3 sa token sa-jenkins-test --namespace orka-test # Obtain a token with a custom duration (must be in minutes or hours) orka3 sa token sa-jenkins --duration 1h # Create a token with no expiration orka3 sa token sa-jenkins --no-expiration ``` ### orka3 serviceaccount delete Delete one or more service accounts in the orka-default namespace or another specified namespace. Deleting a service account also invalidates any tokens associated with it. This cannot be undone. **Syntax:** ```bash theme={null} orka3 serviceaccount delete SERVICE_ACCOUNT_NAME [SERVICE_ACCOUNT_NAME_2 ...] [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for delete -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Delete the specified service account in the 'orka-default' namespace orka3 sa delete sa-jenkins # Delete the specified service account in the 'orka-test' namespace orka3 sa delete sa-jenkins --namespace orka-test # Delete multiple service accounts orka3 sa delete sa-jenkins sa-jenkins-test ``` # Command Quick Reference Source: https://docs.macstadium.com/orka/orka3-cli-reference/command-quick-reference Quick-reference tables for all Orka3 CLI commands: configuration, authentication, VMs, images, nodes, namespaces, and service accounts. ## All commands by category ### Configuration and setup | Command | Description | Alias | | ------------------- | ------------------------------ | ----- | | `orka3 config set` | Set the Orka service URL | | | `orka3 config view` | View current CLI configuration | | | `orka3 completion` | Generate shell autocompletion | | | `orka3 version` | Print CLI version | | ### Authentication | Command | Description | Alias | | ---------------------- | -------------------------- | ----- | | `orka3 login` | Log in to Orka cluster | | | `orka3 user login` | Log in to Orka cluster | | | `orka3 user logout` | Log out of Orka cluster | | | `orka3 user get-token` | Print authentication token | | | `orka3 user set-token` | Log in with token | | ### Image management | Command | Description | Alias | | ----------------------------- | --------------------------------- | ----- | | `orka3 image list` | List local images | | | `orka3 image copy` | Copy an image | | | `orka3 image generate` | (Intel-only) Generate empty image | | | `orka3 image delete` | Delete images | | | `orka3 image set-description` | Set image description | | | `orka3 imagecache add` | Cache image on nodes | `ic` | | `orka3 imagecache info` | View image caching status | `ic` | | `orka3 imagecache list` | List cached images | `ic` | ### ISO management (Intel only) | Command | Description | Alias | | --------------------------- | ------------------- | ----- | | `orka3 iso list` | List local ISOs | | | `orka3 iso copy` | Copy an ISO | | | `orka3 iso delete` | Delete ISOs | | | `orka3 iso set-description` | Set ISO description | | ### VM operations | Command | Description | Alias | | -------------------------- | ------------------------------- | ----- | | `orka3 vm deploy` | Deploy a VM | | | `orka3 vm list` | List VMs | | | `orka3 vm delete` | Delete VMs | | | `orka3 vm save` | Save new image from VM | | | `orka3 vm commit` | Update image from VM | | | `orka3 vm resize` | Resize VM disk | | | `orka3 vm push` | (ARM-only) Push to OCI registry | | | `orka3 vm get-push-status` | (ARM-only) View push status | | | `orka3 vm start` | (Intel-only) Power ON VM | | | `orka3 vm stop` | (Intel-only) Power OFF VM | | | `orka3 vm suspend` | (Intel-only) Suspend VM | | | `orka3 vm resume` | (Intel-only) Resume VM | | | `orka3 vm revert` | (Intel-only) Revert VM to image | | ### VM configuration templates | Command | Description | Alias | | ------------------------ | -------------------------------- | ----- | | `orka3 vm-config create` | Create VM configuration template | `vmc` | | `orka3 vm-config list` | List VM configurations | `vmc` | | `orka3 vm-config delete` | Delete VM configurations | `vmc` | ### Infrastructure management (admin) | Command | Description | Alias | | ------------------------ | ------------------------------ | ----- | | `orka3 node list` | List nodes | | | `orka3 node tag` | (Admin) Tag node for affinity | | | `orka3 node untag` | (Admin) Remove node tag | | | `orka3 node namespace` | (Admin) Move node to namespace | | | `orka3 namespace create` | (Admin) Create namespace | | | `orka3 namespace list` | (Admin) List namespaces | | | `orka3 namespace delete` | (Admin) Delete namespace | | ### Access control (admin) | Command | Description | Alias | | ---------------------------------- | --------------------------------- | ----- | | `orka3 serviceaccount create` | (Admin) Create service account | `sa` | | `orka3 serviceaccount list` | (Admin) List service accounts | `sa` | | `orka3 serviceaccount token` | (Admin) Get service account token | `sa` | | `orka3 serviceaccount delete` | (Admin) Delete service account | `sa` | | `orka3 rolebinding add-subject` | (Admin) Grant namespace access | `rb` | | `orka3 rolebinding list-subjects` | (Admin) List namespace access | `rb` | | `orka3 rolebinding remove-subject` | (Admin) Revoke namespace access | `rb` | ### OCI registry integration (admin) | Command | Description | Alias | | --------------------------------- | ----------------------------------- | --------- | | `orka3 registrycredential add` | (Admin) Add registry credentials | `regcred` | | `orka3 registrycredential list` | (Admin) List registry credentials | `regcred` | | `orka3 registrycredential remove` | (Admin) Remove registry credentials | `regcred` | ## Common flags and options ### Global flags | Flag | Description | | ----------------- | --------------------------------------------- | | `-h, --help` | Display help for any command | | `-n, --namespace` | Specify namespace (default: orka-default) | | `-o, --output` | Output format: table (default), wide, or json | ### VM deployment flags | Flag | Description | | ----------------- | -------------------------------- | | `-i, --image` | Base image (required) | | `-c, --cpu` | Number of CPU cores | | `-m, --memory` | RAM in gigabytes | | `--node` | Specific node for deployment | | `--tag` | Node affinity tag | | `--tag-required` | Require tagged nodes | | `--config` | VM configuration template | | `--generate-name` | Generate unique name with suffix | ## Architecture-specific commands ### Intel only (amd64) * `orka3 image generate` - Generate empty images * `orka3 iso` commands - Manage ISOs * `orka3 vm start/stop` - Power control * `orka3 vm suspend/resume` - Suspend state * `orka3 vm revert` - Revert to image * `--iso` flag - Attach ISO during deployment * `--gpu` flag - Enable GPU passthrough * `--system-serial` flag - Custom serial number * `--disable-net-boost` flag - Disable network boost ### Apple silicon only (arm64) * `orka3 vm push` - Push to OCI registry * `orka3 vm get-push-status` - Check push status * `orka3 imagecache` commands - Image caching on nodes * OCI image support - Deploy from OCI registries ## Deprecated commands The following commands are deprecated and will be removed in future releases. Use OCI registries and `orka3 imagecache` instead. * `orka3 remote-image list` * `orka3 remote-image pull` * `orka3 remote-iso list` * `orka3 remote-iso pull` # Manage macOS VM images with the Orka3 CLI Source: https://docs.macstadium.com/orka/orka3-cli-reference/image-management Orka3 CLI image commands: list, pull, push, and manage macOS images for Intel and Apple silicon VMs, including local cluster and OCI registry sources. ## Understanding Orka images Images are used to spin up VMs in Orka. An image contains the macOS operating system, applications, and any configurations you've set up. **Image architecture types** * **amd64 architecture** - Intel-based images (previously denoted by an `.img` extension) * **arm64 architecture** - Apple silicon-based images (previously denoted by an `.orkasi` extension) Extensions are no longer required as part of an image name. The architecture is determined automatically. **Image accessibility** Local images are accessible from all namespaces in your Orka cluster. ## Local image commands ### orka3 image list List the locally stored images in your Orka cluster. (Note, you may not have any images until you run `imagecache` or a `vm deploy` command) **Syntax:** ```bash theme={null} orka3 image list [IMAGE_NAME_1 [IMAGE_NAME_2 ...]] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json ``` If `--output` is not set, prints only essential information in a table format. Use `wide` for additional error information or `json` for JSON output. **Examples:** ```bash theme={null} # List the images stored locally in your Orka cluster orka3 image list # Check if the specified image exists locally orka3 image list 90gbventurassh.img # Check if the specified images exist locally orka3 image list 90gbventurassh.img 90gbventurassh.orkasi # List images and print output as JSON orka3 image list --output json # Show additional error information for locally stored images orka3 image list --output wide # Show additional error information for a specific image orka3 image list 90gbventurassh.orkasi --output wide ``` ### orka3 image copy Copy the specified image and set a new name for the copy. **Image name requirements:** * Does not exceed 63 characters including the file extension (if set) * Consists of lowercase alphanumeric characters, dashes (-) or periods (.) * Must be unique to the cluster By default, this operation also copies the description of the source image. You can explicitly change the description during this operation. Copying an image is an async operation. To check the status: `orka3 image list IMAGE_COPY_NAME` **Syntax:** ```bash theme={null} orka3 image copy IMAGE_NAME IMAGE_COPY_NAME [--description 'DESCRIPTION'] [flags] ``` **Options:** ``` -d, --description string (Optional) Custom description for the copy -h, --help Display help for copy ``` **Examples:** ```bash theme={null} # Copy an image orka3 image copy 90gbventurassh.orkasi 90gbventurassh-copy.orkasi # Copy an image with a custom description orka3 image copy 90gbventurassh.orkasi 90gbventurassh-copy.orkasi --description 'user@company.com copied this image' ``` ### orka3 image generate (Intel-only) Generate a new empty image with the specified size. Use an empty image to perform a fresh macOS install from ISO. Generated images are always created as amd64 images (Intel-based images) and are accessible from all namespaces. Generating an image is an async operation. To check the status: `orka3 image list GENERATED_IMAGE_NAME` **Syntax:** ```bash theme={null} orka3 image generate IMAGE_NAME SIZE [--description 'DESCRIPTION'] [flags] ``` **Options:** ``` -d, --description string (Optional) Custom description for the generated image -h, --help Display help for generate ``` **Examples:** ```bash theme={null} # Generate an empty 120GB image orka3 image generate 120gbemptyimage 120G # Generate an empty 120GB image with a custom description orka3 image generate 120gbemptyimage 120G --description 'user@company.com created this empty image' ``` ### orka3 image set-description Set a custom description for the specified image. This can be helpful to identify the owner of the image, where it originated from, or how it is used across workflows. This operation overrides the existing description and cannot be undone. **Syntax:** ```bash theme={null} orka3 image set-description IMAGE_NAME DESCRIPTION [flags] ``` **Options:** ``` -h, --help Display help for set-description ``` **Examples:** ```bash theme={null} # Set a custom description for an image orka3 image set-description 90gbventurassh.orkasi 'user@company.com set this description' ``` ### orka3 image delete Delete the specified locally stored images. This operation cannot be undone. VMs or VM configurations that use this image are affected and might stop working as expected. **Syntax:** ```bash theme={null} orka3 image delete IMAGE_NAME [IMAGE_NAME_2 ...] [flags] ``` **Options:** ``` -h, --help Display help for delete ``` **Examples:** ```bash theme={null} # Delete an image from your Orka cluster orka3 image delete 90gbventurassh.orkasi # Delete multiple images orka3 image delete 90gbventurassh.orkasi 90gbventurassh.img ``` ## Image cache commands Manage images stored on Orka cluster nodes. By adding images to a node before deployment of a VM using that base image, you can manage and control the delay caused by remote or even local cluster storage image pulls, providing consistent deployment times. Image cache operations are only supported for Apple silicon nodes. The alias for `imagecache` is `ic`. ### orka3 imagecache add Cache the specified image on the specified node(s). Add an image to one, a select number, or all cluster node namespace members or members of a tagged node group. The image must be pulled in the cluster before caching it on the node(s), unless it is an OCI image. For OCI images, make sure you have the necessary credentials to pull the OCI image. Caching an image is an async operation. To check the status: `orka3 imagecache info IMAGE_NAME` The `--nodes`, `--tags`, and `--all` flags are mutually exclusive. **Syntax:** ```bash theme={null} orka3 imagecache add IMAGE_NAME [--namespace CURRENT_NAMESPACE] {--nodes | --tags | --all} [flags] ``` **Options:** ``` --all Cache the image on all nodes in the current namespace -h, --help Display help for add --nodes string The node(s) on which to cache the image --tags string The node tag(s) by which to filter nodes -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Cache an image on a specific node orka3 imagecache add ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10 # Cache an image on multiple nodes orka3 imagecache add ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10,mini-arm-11 # Cache an image on all nodes in the current namespace orka3 imagecache add ghcr.io/macstadium/orka-images/sequoia:latest --all # Cache an image on nodes with specific tags orka3 imagecache add ghcr.io/macstadium/orka-images/sequoia:latest --tags my-tag,my-other-tag # Cache an image on a node in a specific namespace orka3 imagecache add ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10 --namespace my-namespace ``` ### orka3 imagecache info Display the caching status of an image across nodes. Use this to verify if images are available for deployment ("ready" status) or if the caching operation is still active ("caching" status). **Syntax:** ```bash theme={null} orka3 imagecache info IMAGE_NAME [--namespace CURRENT_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for info -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Display the caching status of an image orka3 imagecache info sonoma-90gb-orka3-arm # Display the caching status of an OCI image (latest is the default tag) orka3 imagecache info ghcr.io/macstadium/orka-images/sonoma # Display the caching status of an OCI image with a specific tag orka3 imagecache info ghcr.io/macstadium/orka-images/sonoma:14.0 ``` ### orka3 imagecache list List cached images across nodes. Provides information about cached images such as image tag (OCI repo pulled images only), the image-id (a unique identifier from manifest), the sparse size of the image, and the number of nodes the image is cached on. **Syntax:** ```bash theme={null} orka3 imagecache list [IMAGE_NAME_1 IMAGE_NAME_2 ...] [--namespace CURRENT_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List all cached images on all nodes orka3 imagecache list # Check if a specific image is cached on any node orka3 imagecache list sonoma-90gb-orka3-arm # Check if an OCI image is cached (latest is the default tag) orka3 imagecache list ghcr.io/macstadium/orka-images/sequoia # Check if an OCI image with tag is cached orka3 imagecache list ghcr.io/macstadium/orka-images/sonoma:14.0 # Check multiple images orka3 imagecache list sonoma-90gb-orka3-arm ghcr.io/macstadium/orka-images/sonoma:14.0 # List all cached images as JSON orka3 imagecache list --output json ``` ### orka3 imagecache remove Available in Orka 3.6.3 and later. Remove a cached image from one or more nodes. Use this to free disk space on specific nodes, rotate stale images, or remove images that were cached automatically when a VM was deployed. Removal is asynchronous: the command initiates the operation and returns immediately. Run `orka3 imagecache info IMAGE_NAME` to check the status. The `--nodes`, `--tags`, and `--all` flags are mutually exclusive. Exactly one is required. Do not remove an image while VMs are actively being deployed from it on the same node. If removal runs during the brief window between a deployment's pull and clone stages, the deployment may fail with a generic error. The race window is typically seconds, but there is no automatic protection against it. Wait for in-flight deployments to complete before removing a cached image. **Syntax:** ```bash theme={null} orka3 imagecache remove IMAGE_NAME [--namespace CURRENT_NAMESPACE] {--nodes | --tags | --all} [flags] ``` **Options:** ``` --all Remove the cached image from all nodes in the current namespace -h, --help Display help for remove --nodes string The node(s) from which to remove the cached image --tags string The node tag(s) by which to filter nodes (matches nodes with ALL listed tags) -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Remove from a specific node orka3 imagecache remove ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10 # Remove from multiple nodes orka3 imagecache remove ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10,mini-arm-11 # Remove from all nodes in the current namespace orka3 imagecache remove ghcr.io/macstadium/orka-images/sequoia:latest --all # Remove from nodes with specific tags orka3 imagecache remove ghcr.io/macstadium/orka-images/sequoia:latest --tags my-tag,my-other-tag # Remove from a node in a specific namespace orka3 imagecache remove ghcr.io/macstadium/orka-images/sequoia:latest --nodes mini-arm-10 --namespace my-namespace ``` **Removal states:** | State | Meaning | | ---------- | ---------------------------------------------------------------------------- | | `Removing` | Remove job is running on the target node | | `Failed` | Remove job failed; image stays cached. To retry, run the same command again. | If the targeted node no longer exists, the cache entry is cleaned up immediately. If the image is not currently cached on a targeted node, the operation completes without error. If removal reaches `Failed` and retrying does not resolve it, contact [support@macstadium.com](mailto:support@macstadium.com). ## Remote images (deprecated) This functionality will be removed in future releases. MacStadium recommends using OCI registries for image storage and management. The `orka3 imagecache` command should be used as a replacement to load images into the cluster. ### orka3 remote-image list List the available images in the remote repository or look for specific images in the remote repository. **Syntax:** ```bash theme={null} orka3 remote-image list [IMAGE_NAME_1 [IMAGE_NAME_2 ...]] [--output wide|json] [flags] ``` **Examples:** ```bash theme={null} # List available remote images orka3 remote-image list # Check if a specific image exists remotely orka3 remote-image list 90gbventurassh.img # Check if multiple specific images exist remotely orka3 remote-image list 90gbventurassh.img 90gbventurassh.orkasi ``` ### orka3 remote-image pull Copy an image from the remote repository and store it locally in the Orka cluster. You can keep the original name or set a new name in the local cluster storage. Pulling a remote image is an async operation. To check the status: `orka3 image list PULLED_IMAGE_NAME` **Syntax:** ```bash theme={null} orka3 remote-image pull REMOTE_IMAGE_NAME [NEW_LOCAL_IMAGE] [--description 'DESCRIPTION'] [flags] ``` **Examples:** ```bash theme={null} # Pull an image from the remote repository orka3 remote-image pull 90gbventurassh.orkasi # Pull and rename an image orka3 remote-image pull 90gbventurassh.orkasi 90gbventurassh2023.orkasi # Pull an image with a custom description orka3 remote-image pull 90gbventurassh.orkasi --description 'user@company.com pulled this image' ``` # Orka namespace management with the CLI Source: https://docs.macstadium.com/orka/orka3-cli-reference/namespace-management Create and manage Orka namespaces to isolate resources and control user access. Covers namespace creation, listing, and rolebinding management. **Admin only:** All namespace operations require administrative privileges. ## Understanding namespaces Namespaces are used for grouping and dedicating resources to specific Orka users or service accounts. All users have access to the `orka-default` namespace. Based on specific rolebindings, a user or a service account might also be able to access the resources within additional namespaces. **Key concepts:** * **Resource isolation:** VMs, nodes, and resources in one namespace are separate from other namespaces * **Access control:** Users and service accounts must be granted access to namespaces via rolebindings * **Default namespace:** All users have access to `orka-default` by default * **Custom pods:** Some namespaces can be configured to run custom Kubernetes resources instead of Orka VMs **All cluster namespaces must have the `orka-` prefix.** ## Creating namespaces ### orka3 namespace create Create a new namespace with the specified name. **Namespace name requirements:** * Begins with the `orka-` prefix * Does not exceed 63 characters (including the prefix) * Consists of lowercase alphanumeric characters or dashes (-) * Ends with an alphanumeric character * Must be unique to the cluster If `--enable-custom-pods` is set, creates a new namespace dedicated to running custom K8s resources (formerly sandboxing). Orka VMs cannot be deployed in that namespace. **After creating a namespace:** 1. Move one or more nodes to the namespace to provide computational resources: ```bash theme={null} orka3 node namespace NODE --namespace NAMESPACE ``` 2. Provide explicit access to users or service accounts: ```bash theme={null} orka3 rolebinding add-subject --namespace NAMESPACE --user EMAIL orka3 rolebinding add-subject --namespace NAMESPACE --serviceaccount SA_NAMESPACE:SERVICE_ACCOUNT ``` **Syntax:** ```bash theme={null} orka3 namespace create NAMESPACE_NAME [flags] ``` **Options:** ``` --enable-custom-pods Configure namespace for custom pods (formerly sandboxing) -h, --help Display help for create ``` **Examples:** ```bash theme={null} # Create a new namespace orka3 namespace create orka-test # Create a namespace for custom pods (cannot run Orka VMs) orka3 namespace create orka-cp --enable-custom-pods ``` ## Listing namespaces ### orka3 namespace list List all namespaces for the Orka cluster. Use this command to check if one or more specific namespaces already exist. **Syntax:** ```bash theme={null} orka3 namespace list [NAMESPACE_1 [NAMESPACE_2 ...]] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json ``` **Examples:** ```bash theme={null} # List existing namespaces for your Orka cluster orka3 namespace list # Check if a specific namespace exists orka3 namespace list orka-test # Check if several specific namespaces exist orka3 namespace list orka-test orka-production ``` ## Deleting namespaces ### orka3 namespace delete Delete the specified namespace. All VMs (or custom pods) must be removed and nodes must be moved out of the namespace before running this operation. This is a destructive operation and cannot be undone. To restore a deleted namespace, re-create it, move the respective Orka nodes, and re-add the respective users to the respective role bindings. **Syntax:** ```bash theme={null} orka3 namespace delete NAMESPACE_NAME [NAMESPACE_2 ...] [flags] ``` **Options:** ``` -h, --help Display help for delete -t, --timeout duration (Optional) Time to wait before giving up (default 1h0m0s) ``` **Examples:** ```bash theme={null} # Delete a namespace orka3 namespace delete orka-test # Delete multiple namespaces orka3 namespace delete orka-test orka-production ``` # Orka node management with the CLI Source: https://docs.macstadium.com/orka/orka3-cli-reference/node-management View and manage Orka nodes, the physical Mac hardware providing compute for your VMs. Covers listing nodes, checking state, and filtering by architecture. ## Understanding Orka nodes Orka nodes are the physical Mac hardware in your cluster that provide compute resources for running VMs. Each node can host multiple VMs based on its available CPU, memory, and storage resources. **Node types:** * **Intel nodes (amd64):** Mac Pro, Mac mini (Intel), iMac Pro * **Apple silicon nodes (arm64):** Mac mini (M1/M2/M3), Mac Studio **Key concepts:** * **Namespaces:** Nodes belong to a namespace and provide resources only to VMs in that namespace * **Node affinity:** Tags can be applied to nodes to control which nodes VMs are deployed to * **Resource management:** Nodes have limited CPU, memory, and storage that is shared among VMs If `--namespace` is not set, node commands operate in the `orka-default` namespace. ## Listing nodes ### orka3 node list Show basic or extended information about Orka nodes. Based on the specified output, the command returns information ranging from available resources and status to node IP and architecture. **Syntax:** ```bash theme={null} orka3 node list [NODE_NAME_1 [NODE_NAME_2 ...]] [--namespace TARGET_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List all Orka nodes in the 'orka-default' namespace orka3 node list # List all nodes (extended table) orka3 node list --output wide # List all nodes in a specific namespace (basic table) orka3 node list --namespace orka-test # List all nodes in a specific namespace (extended table) orka3 node list --namespace orka-test --output wide # Show basic information about a specific node orka3 node list mini-1 # Show detailed information about a specific node orka3 node list mini-1 --output wide # Show basic information about multiple nodes orka3 node list mini-1 mini-2 # Show detailed information about multiple nodes orka3 node list mini-1 mini-2 --output wide # Print information in JSON format orka3 node list --output json ``` ## Node tagging for affinity Node affinity indicates that the tagged node is preferred for the deployment of VMs with the same tag. Orka first attempts to deploy on any nodes with the respective tag, before moving to the remaining nodes in the environment. Orka attempts to deploy on other nodes only if the VM setting to require a tag is `no`. **Admin only:** Node tagging and untagging require administrative privileges. ### orka3 node tag Tag the specified Orka node for targeted VM deployment (set node affinity). **Tag requirements:** * Does not exceed 63 characters * Consists of alphanumeric characters, dashes (-), underscores (\_), or periods (.) * Begins and ends with an alphanumeric character * Set only one tag at a time (run the command separately for each tag) To list the tags applied to a node, run: ```bash theme={null} orka3 node list NAME [--namespace NAMESPACE] --output wide ``` **Syntax:** ```bash theme={null} orka3 node tag NODE_NAME TAG [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ``` -h, --help Display help for tag -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Tag a node in the 'orka-default' namespace orka3 node tag mini-1 jenkins # Tag a node in a specific namespace orka3 node tag mini-1 --namespace orka-test jenkins # Check if the tag was applied as expected orka3 node list mini-1 --output wide ``` ### orka3 node untag Untag the specified Orka node for targeted VM deployment (remove node affinity). Remove only one tag at a time (run the command separately for each tag). **Syntax:** ```bash theme={null} orka3 node untag NODE_NAME TAG [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ``` -h, --help Display help for untag -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Remove a tag from a node orka3 node untag mini-1 my-tag # Remove a tag from a node in a specific namespace orka3 node untag mini-1 --namespace orka-test my-tag # Check if the tag was removed as expected orka3 node list mini-1 --output wide ``` ## Moving nodes between namespaces ### orka3 node namespace Move Orka nodes across namespaces. This is also known as node dedication. **Admin only:** Moving nodes between namespaces requires administrative privileges. After creating a new namespace, move one or more nodes to the namespace to provide it with computational resources. **Syntax:** ```bash theme={null} orka3 node namespace NODE [--namespace CURRENT_NAMESPACE] TARGET_NAMESPACE [flags] ``` **Options:** ``` -h, --help Display help for namespace -n, --namespace string (Optional) Current namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Move a node from 'orka-default' to 'orka-test' orka3 node namespace mini-1 orka-test # Move a node from 'orka-test' to 'orka-production' orka3 node namespace mini-1 --namespace orka-test orka-production # Move a node back to 'orka-default' orka3 node namespace mini-1 --namespace orka-production orka-default ``` # OCI Registry Integration Source: https://docs.macstadium.com/orka/orka3-cli-reference/oci-registry-integration OCI (Open Container Initiative) registry credentials are required to push and pull OCI-compatible Apple silicon-based Orka images to or from private. ## About OCI Images in Orka OCI (Open Container Initiative) registry credentials are required to push and pull OCI-compatible Apple silicon-based Orka images to or from private repositories. **Important:** OCI images are available only for Apple silicon-based VMs. This is the recommended modern approach for image storage and management. **Common OCI Registries:** * GitHub Container Registry (ghcr.io) * Docker Hub * Harbor * Private registries **Working with OCI Images:** * To deploy a VM using an OCI image: `orka3 vm deploy --image server.com/repository/image:tag` * To push an image to an OCI registry: `orka3 vm push VM_NAME server.com/repository/image:tag` ## Managing Registry Credentials **Admin Only:** All registry credential operations require administrative privileges. If `--namespace` is not set, operations default to the `orka-default` namespace. The shorthand alias for `registrycredential` is `regcred`. ### orka3 registrycredential add Add credentials for the specified OCI registry server in the orka-default namespace or the specified namespace. Use this to add new credentials for a new server, or replace existing credentials for an existing server. **Server Address Requirements:** * Must include the scheme, hostname and (optionally) port * Examples: `https://ghcr.io` or `https://10.221.188.5:30080` If insecure communication is allowed, requests to the registry server will fall back to HTTP when HTTPS is unavailable (disabled by default). **Syntax:** ```bash theme={null} orka3 registrycredential add SERVER --username USERNAME {--password PASSWORD | --password-stdin} [--replace] [--allow-insecure] [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} --allow-insecure (Optional) Falls back to HTTP if HTTPS is unavailable -h, --help Display help for add -p, --password string Password for registry authentication --password-stdin Read the password from stdin --replace (Optional) Replaces credentials for the specified server -u, --username string (Required) Username for registry authentication -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Add registry credentials for GitHub Packages in a specific namespace orka3 regcred add https://ghcr.io --username whoami --password ghp_*** --namespace orka-test # Read the password from stdin echo -n "$PASSWORD" | orka3 regcred add https://ghcr.io --username whoami --password-stdin # Read the password from file over stdin orka3 regcred add https://ghcr.io --username whoami --password-stdin < password.txt # Add credentials for an insecure server orka3 regcred add --allow-insecure http://10.221.188.5:30080 --username admin --password p@ssw0rd # Replace existing credentials for GitHub Packages orka3 regcred add --replace https://ghcr.io --username whoami --password ghp_*** ``` ### orka3 registrycredential list List the OCI registry servers that have stored credentials in the orka-default namespace or the specified namespace. **Syntax:** ```bash theme={null} orka3 registrycredential list [--namespace TARGET_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List OCI registry servers in the 'orka-default' namespace orka3 regcred list # Show additional information about each registry server orka3 regcred list --output wide --namespace orka-test ``` ### orka3 registrycredential remove Remove the authentication credentials for the specified registry server in the orka-default namespace or the specified namespace. **Syntax:** ```bash theme={null} orka3 registrycredential remove SERVER [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for remove -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Remove registry credentials for GitHub Packages in 'orka-default' orka3 regcred remove https://ghcr.io # Remove registry credentials for a private server in a specific namespace orka3 regcred remove http://10.221.188.5:30080 --namespace orka-test ``` ## Working with OCI Images ### Deploying VMs from OCI Images When deploying a VM, you can specify an OCI image by its full path: ```bash theme={null} # Deploy a VM from an OCI-compatible image in GitHub Packages orka3 vm deploy -i ghcr.io/my-organization/orka-images/orka-arm:latest # Deploy a VM from a specific tagged version orka3 vm deploy -i ghcr.io/my-organization/orka-images/orka-arm:14.0 ``` ### Pushing Images to OCI Registries The state of a running VM can be saved and pushed to an OCI-compatible registry. This operation is applicable only to Apple silicon-based VMs. For more information, see the [VM Lifecycle Management](/orka/orka3-cli-reference/vm-lifecycle-management) article. ### Caching OCI Images You can cache OCI images directly on cluster nodes without pulling them to local storage first: ```bash theme={null} # Cache an OCI image on specific nodes orka3 imagecache add ghcr.io/my-organization/orka-images/orka-arm:latest --nodes mini-arm-10 # Check caching status of an OCI image orka3 imagecache info ghcr.io/my-organization/orka-images/orka-arm:latest ``` # Orka3 CLI Overview & Configuration Source: https://docs.macstadium.com/orka/orka3-cli-reference/orka3-cli-overview-configuration Orka3 CLI command structure, global options, and configuration. Learn how to set your API URL, enable shell autocompletion, and navigate built-in help. ## Getting Started with orka3 **Basic Usage** The Orka3 CLI follows a consistent command structure: ``` orka3 [command] [subcommand] [flags] ``` **Global Help** ``` orka3 --help ``` **Available Options** ``` -h, --help Display help for orka3 ``` **Main Command Groups** * `orka3 completion` - Generate autocompletion scripts for your shell * `orka3 config` - Manage the local Orka CLI configuration * `orka3 image` - Manage locally stored images * `orka3 imagecache` - Manage individual cluster node(s) image cache * `orka3 iso` - Manage locally stored ISOs * `orka3 login` - Log in to your Orka cluster * `orka3 namespace` - (Admin-only) Manage namespaces * `orka3 node` - Manage Orka nodes * `orka3 registrycredential` - (Admin-only) Manage OCI registry credentials * `orka3 rolebinding` - (Admin-only) Manage rolebindings * `orka3 serviceaccount` - (Admin-only) Manage service accounts * `orka3 user` - Manage your authentication with Orka * `orka3 version` - Print the current version of the Orka CLI * `orka3 vm` - Manage VMs * `orka3 vm-config` - Manage VM configurations ## Configuration Commands The `orka3 config` command group manages your local Orka CLI configuration. The first time you run the Orka CLI, you must set the Orka service URL. All Orka CLI commands are executed against this address. **orka3 config set** Set the Orka service URL for your environment. **Syntax:** ``` orka3 config set --api-url ORKA_SERVICE_URL [flags] ``` **Determining Your Service URL:** * For environments initially deployed with **Orka 2.1 or later**: typically `http://10.221.188.20` * For environments initially deployed **before Orka 2.1**: typically `http://10.221.188.100` If your cluster has public NAT IPs or a custom domain configured for the Orka API, use your public URL instead of the internal IP address. Using the internal IP on a cluster with public API access will result in connection timeouts. You can also use the built-in Orka domain (COMPANY.orka.app) or an external custom domain if configured. **Options:** ``` -a, --api-url string (Required) The Orka service URL -h, --help Display help for set ``` **Examples:** ``` # Set your Orka service URL to 10.221.188.20 (Orka 2.1+) orka3 config set --api-url http://10.221.188.20 # Set your Orka service URL to 10.221.188.100 (pre-Orka 2.1) orka3 config set --api-url http://10.221.188.100 # Set your Orka service URL to your built-in Orka domain orka3 config set --api-url https://company.orka.app # Set your Orka service URL to an external custom domain orka3 config set --api-url https://company.com ``` **orka3 config view** View the current local Orka CLI configuration. **Syntax:** ``` orka3 config view [flags] ``` **Options:** ``` -h, --help Display help for view ``` **Examples:** ``` # Print your current Orka CLI configuration orka3 config view ``` ## Shell completion setup The Orka CLI can generate autocompletion scripts for your shell, making it easier to discover commands and options. **Supported Shells** * bash * fish * powershell * zsh **Generate Completion Script** ``` orka3 completion [shell] ``` See each sub-command's help for details on how to use the generated script. **Options:** ``` -h, --help Display help for completion ``` **Bash Completion** This script depends on the bash-completion package. If it is not installed, install it via your OS's package manager. *Load completions in the current shell session:* ``` source <(orka3 completion bash) ``` *Load completions for every new session (Linux):* ``` orka3 completion bash > /etc/bash_completion.d/orka3 ``` *Load completions for every new session (macOS):* ``` orka3 completion bash > $(brew --prefix)/etc/bash_completion.d/orka3 ``` A new shell must be started for this setup to take effect. **Options:** ``` -h, --help Display help for bash --no-descriptions Disable completion descriptions ``` **Fish Completion** *Load completions in the current shell session:* ``` orka3 completion fish | source ``` *Load completions for every new session:* ``` orka3 completion fish > ~/.config/fish/completions/orka3.fish ``` A new shell must be started for this setup to take effect. **Syntax:** ``` orka3 completion fish [flags] ``` **Options:** ``` -h, --help Display help for fish --no-descriptions Disable completion descriptions ``` **PowerShell Completion** *Load completions in your current shell session:* ``` orka3 completion powershell | Out-String | Invoke-Expression ``` To load completions for every new session, add the output of the above command to your PowerShell profile. **Syntax:** ``` orka3 completion powershell [flags] ``` **Options:** ``` -h, --help Display help for powershell --no-descriptions Disable completion descriptions ``` **Zsh Completion** If shell completion is not already enabled in your environment, enable it first: ``` echo "autoload -U compinit; compinit" >> ~/.zshrc ``` *Load completions in the current shell session:* ``` source <(orka3 completion zsh) ``` *Load completions for every new session (Linux):* ``` orka3 completion zsh > "${fpath[1]}/_orka3" ``` *Load completions for every new session (macOS):* ``` orka3 completion zsh > $(brew --prefix)/share/zsh/site-functions/_orka3 ``` A new shell must be started for this setup to take effect. **Syntax:** ``` orka3 completion zsh [flags] ``` **Options:** ``` -h, --help Display help for zsh --no-descriptions Disable completion descriptions ``` ## Checking CLI Version **orka3 version** Print the current version of the Orka CLI. **Syntax:** ``` orka3 version [flags] ``` **Options:** ``` -h, --help Display help for version ``` **Examples:** ``` # Print the current version of the Orka CLI orka3 version ``` The version output includes information about the CLI build and compatibility with your Orka cluster. # Output formats and Getting Help Source: https://docs.macstadium.com/orka/orka3-cli-reference/output-formats-and-getting-help Use --help on any Orka3 CLI command for built-in documentation. Covers output format options: default table, -o wide, -o json, and -o yaml. ## Using Built-in Help ### Global Help Every command in the Orka CLI has built-in help documentation that you can access using the `--help` or `-h` flag. ```bash theme={null} # Get help for the main command orka3 --help # Get help for a specific command orka3 vm --help # Get help for a sub-command orka3 vm deploy --help # Get help for configuration commands orka3 config --help ``` ### Command Structure The help output for each command typically includes: * **Synopsis:** A brief description of what the command does * **Usage:** The command syntax with required and optional parameters * **Options:** Available flags and their descriptions * **Examples:** Common usage examples * **Sub-commands:** Related commands (if applicable) ### Finding Commands Start with the main help to browse available command groups: ```bash theme={null} orka3 --help ``` Then drill down into specific command groups: ```bash theme={null} # View all VM-related commands orka3 vm --help # View all image-related commands orka3 image --help # View all node-related commands orka3 node --help ``` ## Understanding Output Formats Many Orka CLI commands support multiple output formats to suit different use cases. ### Available Output Formats | Format | Flag | Description | Best For | | --------- | -------------------------- | -------------------------------------------------- | ------------------------------------------------ | | **Table** | `--output table` (default) | Human-readable table with essential information | Terminal viewing, quick status checks | | **Wide** | `--output wide` | Extended table with additional columns and details | Detailed troubleshooting, viewing all properties | | **JSON** | `--output json` | Machine-readable JSON format | Scripting, automation, parsing with jq | ### Using Output Formats ```bash theme={null} # Default table output orka3 vm list # Extended table with more details orka3 vm list --output wide # JSON output for scripting orka3 vm list --output json # Short form orka3 vm list -o json ``` ### Commands Supporting Output Formats The following command groups support the `--output` flag: * `orka3 vm list` * `orka3 vm-config list` * `orka3 node list` * `orka3 namespace list` * `orka3 image list` * `orka3 imagecache list` * `orka3 imagecache info` * `orka3 iso list` * `orka3 serviceaccount list` * `orka3 rolebinding list-subjects` * `orka3 registrycredential list` ### Working with JSON Output JSON output is particularly useful for automation and scripting. You can use tools like `jq` to parse and filter the results: ```bash theme={null} # Get all VM names orka3 vm list -o json | jq -r '.items[].name' # Get VMs with more than 4 CPUs orka3 vm list -o json | jq '.items[] | select(.cpu > 4)' # Count total VMs orka3 vm list -o json | jq '.items | length' # Get node IPs orka3 node list -o json | jq -r '.items[].ip' ``` ## Common Help Patterns ### Discovering Available Commands ```bash theme={null} # List all main command groups orka3 --help # List all VM commands orka3 vm --help # List all image commands orka3 image --help ``` ### Understanding Flags ```bash theme={null} # See all flags for a command orka3 vm deploy --help # See namespace-related options orka3 vm list --help | grep namespace # See output format options orka3 node list --help | grep output ``` ### Finding Examples Most command help includes an "Examples" section with common use cases: ```bash theme={null} # View examples for VM deployment orka3 vm deploy --help # View examples for image management orka3 image copy --help # View examples for namespace management orka3 namespace create --help ``` ## Quick Tips ### Command Aliases Many commands have short aliases for faster typing: | Full Command | Alias | | -------------------------- | --------------- | | `orka3 vm-config` | `orka3 vmc` | | `orka3 serviceaccount` | `orka3 sa` | | `orka3 rolebinding` | `orka3 rb` | | `orka3 registrycredential` | `orka3 regcred` | | `orka3 imagecache` | `orka3 ic` | ### Flag Shortcuts | Full Flag | Short Flag | | ------------- | ---------- | | `--help` | `-h` | | `--output` | `-o` | | `--namespace` | `-n` | | `--image` | `-i` | | `--cpu` | `-c` | | `--memory` | `-m` | ### Checking Async Operations Some operations are asynchronous. Here's how to check their status: * **Image operations:** `orka3 image list IMAGE_NAME` * **ISO operations:** `orka3 iso list ISO_NAME` * **Image caching:** `orka3 imagecache info IMAGE_NAME` * **Image push:** `orka3 vm get-push-status JOB_NAME` # Role-Based Access Control (RBAC) Source: https://docs.macstadium.com/orka/orka3-cli-reference/role-based-access-control-rbac Manage Orka RBAC: roles, rolebindings, and subjects. Control which users and service accounts can access which namespaces and resources. **Admin only:** All rolebinding operations require administrative privileges. ## Understanding RBAC in Orka Orka relies on RBAC (role-based access control) for the management of user access to resources. In Orka, RBAC consists of the following elements: * **Roles:** A set of permissions. Roles are managed by MacStadium. * **Subjects:** Users and service accounts which can be bound to a role. Subjects are managed by Orka users with administrative privileges. * **Namespaces:** Groups of resources dedicated to specific users or service accounts. Namespaces are managed by Orka users with administrative privileges. * **Rolebindings:** K8s objects describing which subjects belong to which role and which subjects can access which namespaces. Rolebindings are managed by Orka users with administrative privileges. **Default access:** * All admin users have access to all namespaces * All non-admin users have user access to the `orka-default` namespace **Granting access:** * To grant a user access to a specific namespace, add that user as a subject to the rolebinding for the namespace * Service accounts automatically have access to the namespace where they were created * To grant a service account access to a specific namespace, add that service account as a subject to the rolebinding for the namespace If `--namespace` is not set, rolebinding commands operate in the `orka-default` namespace. The shorthand alias for `rolebinding` is `rb`. ## Managing rolebindings ### orka3 rolebinding add-subject Add a subject to the rolebinding for the specified namespace. This grants the user or the service account access to the specified namespace. **Syntax:** ```bash theme={null} orka3 rolebinding add-subject --namespace TARGET_NAMESPACE --user EMAIL_1[,EMAIL_2,...] AND/OR --serviceaccount SA_NAMESPACE_1:SERVICE_ACCOUNT_1[,SA_NAMESPACE_2:SERVICE_ACCOUNT_2,...] [flags] ``` **Options:** ``` -h, --help Display help for add-subject -s, --serviceaccount strings Service accounts (NAMESPACE:SERVICE_ACCOUNT format, comma-separated) -u, --user strings Users (email addresses, comma-separated) -n, --namespace string (Optional) Target namespace (default "orka-default") ``` **Examples:** ```bash theme={null} # Grant a user access to a namespace orka3 rb add-subject --namespace orka-test --user user@company.com # Grant multiple users access to a namespace orka3 rb add-subject --namespace orka-test --user user1@company.com,user2@company.com # Grant a service account access to a namespace orka3 rb add-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins # Grant multiple service accounts access orka3 rb add-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins,orka-production:sa-release-builds # Grant multiple users and service accounts access orka3 rb add-subject --namespace orka-test --user user1@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-production:sa-release-builds ``` ### orka3 rolebinding list-subjects List all rolebinding subjects, along with their kind, in the orka-default namespace or another specified namespace. **Syntax:** ```bash theme={null} orka3 rolebinding list-subjects [--namespace TARGET_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ``` -h, --help Display help for list-subjects -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List subjects in the 'orka-default' namespace rolebinding orka3 rb list-subjects # List subjects in a specific namespace rolebinding orka3 rb list-subjects --namespace orka-test ``` ### orka3 rolebinding remove-subject Remove a subject from a rolebinding. This revokes the user or service account access to the specified namespace. **Syntax:** ```bash theme={null} orka3 rolebinding remove-subject --user EMAIL_1[,EMAIL_2,...] AND/OR --serviceaccount SA_NAMESPACE_1:SERVICE_ACCOUNT_1[,SA_NAMESPACE_2:SERVICE_ACCOUNT_2,...] [--namespace TARGET_NAMESPACE] [flags] ``` **Options:** ``` -h, --help Display help for remove-subject -s, --serviceaccount strings Service accounts to remove (NAMESPACE:SERVICE_ACCOUNT format, comma-separated) -u, --user strings Users to remove (email addresses, comma-separated) -n, --namespace string (Optional) Target namespace (default "orka-default") ``` **Examples:** ```bash theme={null} # Revoke access to a namespace for a user orka3 rb remove-subject --namespace orka-test --user user@company.com # Revoke access for multiple users orka3 rb remove-subject --namespace orka-test --user user1@company.com,user2@company.com # Revoke access for a service account orka3 rb remove-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins # Revoke access for multiple service accounts orka3 rb remove-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins,orka-production:sa-release-builds # Revoke access for multiple users and service accounts orka3 rb remove-subject --namespace orka-test --user user1@company.com,user2@company.com --serviceaccount orka-default:sa-jenkins,orka-production:sa-release-builds ``` ## Common workflows ### Adding and removing access **Common workflow:** 1. **Create a namespace:** ```bash theme={null} orka3 namespace create orka-test ``` 2. **Move nodes to the namespace:** ```bash theme={null} orka3 node namespace mini-1 orka-test orka3 node namespace mini-2 orka-test ``` 3. **Grant users access:** ```bash theme={null} orka3 rb add-subject --namespace orka-test --user user@company.com ``` 4. **Grant service accounts access:** ```bash theme={null} orka3 rb add-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins ``` 5. **Verify access:** ```bash theme={null} orka3 rb list-subjects --namespace orka-test ``` ### Service account access Service accounts are automatically granted access to the namespace where they are created. To grant a service account access to additional namespaces, use the rolebinding commands: ```bash theme={null} # Create service account in orka-default orka3 sa create sa-jenkins # Grant access to orka-test namespace orka3 rb add-subject --namespace orka-test --serviceaccount orka-default:sa-jenkins # Grant access to orka-production namespace orka3 rb add-subject --namespace orka-production --serviceaccount orka-default:sa-jenkins ``` # VM Deployment and Configuration Source: https://docs.macstadium.com/orka/orka3-cli-reference/vm-deployment-and-configuration VM configurations (templates) allow you to define reusable settings for deploying virtual machines. All VM configurations reside in the orka-default. ## VM Configuration Templates VM configurations (templates) allow you to define reusable settings for deploying virtual machines. All VM configurations reside in the `orka-default` namespace and are available to all users and service accounts with access to orka-default. The shorthand alias for `vm-config` is `vmc`. ### orka3 vm-config create Create a VM configuration (template) with the specified settings. The required minimum configuration consists of a base image to use. **VM Configuration Name Requirements:** * Does not exceed 50 characters * Consists of lowercase alphanumeric characters or dashes (-) * Starts with an alphabetic character and ends with an alphanumeric character * Must be unique to the cluster **Syntax:** ```bash theme={null} orka3 vm-config create VM_CONFIGURATION_NAME [flags] ``` **Options:** ```bash theme={null} -c, --cpu int (Optional) Number of CPU cores for the VM (default 3) --disable-net-boost (Optional) (Intel-only) Disables network performance boost --disable-vnc (Optional) Disable VNC (ensure SSH/Screen Sharing is enabled) -g, --gpu (Optional) (Intel-only) Enable GPU passthrough -h, --help Display help for create -i, --image string (Required) Base image (local or OCI) --iso string (Optional) (Intel-only) ISO name to attach -m, --memory float (Optional) RAM in gigabytes --scheduler string (Optional) Scheduler: 'default' or 'most-allocated' --system-serial string (Optional) (Intel-only) Custom serial number --tag string (Optional) Node affinity tag --tag-required (Optional) Require tagged nodes for deployment ``` **Examples:** ```bash theme={null} # Create a template for an Intel-based VM orka3 vmc create medium-ventura-vm --image 90gbventurassh.img --cpu 6 # Create a template for an Apple silicon VM using an OCI image orka3 vmc create small-arm-vm -i ghcr.io/my-org/orka-images/orka-arm:latest --cpu 4 # Create a template with 5GB RAM orka3 vmc create medium-ventura-arm-vm --image 90gbventurassh.orkasi --memory 5 # (Intel-only) Create a template for OS install from ISO orka3 vmc create fresh-ventura-vm --image 90gbempty.img --iso ventura.iso # (Intel-only) Create a template with a custom serial number orka3 vmc create medium-ventura-vm --image 90gbventurassh.img --system-serial A00BC123D4 # Create a template with flexible node affinity orka3 vmc create medium-ventura-vm --image 90gbventurassh.orkasi --tag jenkins-builds --tag-required=false # Create a template with strict node affinity orka3 vmc create medium-ventura-vm --image 90gbventurassh.orkasi --tag jenkins-builds --tag-required=true # Create a template that uses the most-allocated scheduler orka3 vmc create medium-ventura-vm --image 90gbventurassh.orkasi --scheduler most-allocated # (Intel-only) Create a template with GPU passthrough orka3 vmc create medium-ventura-vm --image 90gbventurassh.img --gpu=true --disable-vnc # Create a template with disabled VNC orka3 vmc create medium-ventura-vm --image 90gbventurassh.img --disable-vnc ``` ### orka3 vm-config list Show basic or extended information about the available VM configurations. You can list all available configurations or show information about one or more specified VM configurations. **Syntax:** ```bash theme={null} orka3 vm-config list [VM_CONFIGURATION_1 [VM_CONFIGURATION_2 ...]] [--output wide|json] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json ``` **Examples:** ```bash theme={null} # List basic information about available VM configurations orka3 vmc list # List extended information orka3 vmc list --output wide # Show basic information about a specific VM configuration orka3 vmc list small-ventura-vm # Show extended information about a specific VM configuration orka3 vmc list small-ventura-vm --output wide # Show information about multiple VM configurations orka3 vmc list small-ventura small-sonoma # Return output as JSON orka3 vmc list --output json ``` ### orka3 vm-config delete Delete the specified VM configurations (templates). **Syntax:** ```bash theme={null} orka3 vm-config delete VM_CONFIGURATION_NAME [VM_CONFIGURATION_NAME_2 ...] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for delete ``` **Examples:** ```bash theme={null} # Delete a VM configuration orka3 vmc delete small-ventura-arm-vm # Delete multiple VM configurations orka3 vmc delete medium-ventura-vm medium-ventura-arm-vm ``` ## Deploying VMs ### orka3 vm deploy Deploy a VM with the specified configuration. The minimum required configuration consists of an image and a number of CPU cores to assign to the VM. **VM Name Behavior:** * **When VM\_NAME is not provided:** Orka generates a unique name consisting of 'vm-' and a unique suffix * **When VM\_NAME is provided:** Orka attempts to create the VM using the provided name (must be unique) * **When both VM\_NAME and --generate-name are provided:** Orka generates a unique name based on VM\_NAME with a unique suffix **VM Name Requirements (when provided):** * Does not exceed 63 characters (including any generated suffix) * Consists of lowercase alphanumeric characters or dashes (-) * Starts with an alphabetic character and ends with an alphanumeric character * Must be unique to the namespace **Note:** Some settings are Intel-only (amd64 architecture) and some settings might be mutually exclusive. **Syntax:** ```bash theme={null} orka3 vm deploy [VM_NAME] --image IMAGE_NAME [flags] orka3 vm deploy [VM_NAME] --config VM_CONFIGURATION_NAME [flags] ``` **Options:** ```bash theme={null} --config string (Optional) VM template name -c, --cpu int (Optional) Number of CPU cores --disable-net-boost (Optional) (Intel-only) Disable network boost --disable-vnc (Optional) Disable VNC --generate-name (Optional) Generate unique name with suffix -g, --gpu (Optional) (Intel-only) Enable GPU passthrough -h, --help Display help for deploy -i, --image string (Required) Base image (local or OCI) --iso string (Optional) (Intel-only) ISO name -m, --memory float (Optional) RAM in gigabytes --metadata stringToString (Optional) Custom metadata (key1=value1,key2=value2) --node string (Optional) Specific node for deployment -o, --output string (Optional) Output format: json|wide -p, --ports strings (Optional) Port mapping (NODE_PORT:VM_PORT) --scheduler string (Optional) Scheduler: 'default' or 'most-allocated' --system-serial string (Optional) (Intel-only) Custom serial number --tag string (Optional) Node affinity tag --tag-required (Optional) Require tagged nodes --timeout int (Optional) Deployment timeout in minutes (default 10) -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples - Basic Deployments:** ```bash theme={null} # Deploy a VM from a local Orka image orka3 vm deploy -i 90gbventurassh.orkasi # Deploy a VM from an OCI image orka3 vm deploy -i ghcr.io/my-organization/orka-images/orka-arm:latest # Deploy with specified name, image, and CPU orka3 vm deploy small-ventura-vm -i 90gbventurassh.orkasi -c 4 # Deploy with unique name generation orka3 vm deploy small-ventura-vm -i 90gbventurassh.orkasi --generate-name # Deploy with specified memory and random name orka3 vm deploy -i 90gbventurassh.orkasi -m 10 # Deploy and display extended information orka3 vm deploy -i 90gbventurassh.orkasi --output wide # Deploy with custom timeout orka3 vm deploy -i 90gbventurassh.orkasi --timeout 1 ``` **Examples - Targeted Deployments:** ```bash theme={null} # Deploy on a selected node orka3 vm deploy -i 90gbventurassh.orkasi --node mini-arm-14 # Deploy on a selected node in a specific namespace orka3 vm deploy -i 90gbventurassh.orkasi --node mini-arm-14 --namespace orka-test # Deploy in a specific namespace orka3 vm deploy -i 90gbventurassh.orkasi --namespace orka-test # Deploy with flexible node affinity orka3 vm deploy -i 90gbventurassh.orkasi --tag jenkins-builds --tag-required=false # Deploy with strict node affinity orka3 vm deploy -i 90gbventurassh.orkasi --tag jenkins-builds --tag-required=true # Deploy using the most-allocated scheduler orka3 vm deploy -i 90gbventurassh.orkasi --scheduler most-allocated ``` **Examples - Advanced Deployments:** ```bash theme={null} # Deploy with disabled VNC orka3 vm deploy -i 90gbventurassh.img --disable-vnc # Deploy with custom metadata orka3 vm deploy -i 90gbventurassh.img --metadata 'foo=1,baz=https://example.com' # Deploy with custom port mapping orka3 vm deploy -i 90gbventurassh.img --ports 9000:4000,9001:4001 ``` **Examples - Intel-Only Deployments:** ```bash theme={null} # Deploy with ISO for fresh macOS install orka3 vm deploy -i emptydisk.img --iso ventura.iso # Deploy with custom serial number orka3 vm deploy -i 90gbventurassh.img --system-serial A00BC123D4 # Deploy with GPU passthrough orka3 vm deploy -i 90gbventurassh.img --gpu=true --disable-vnc # Deploy with disabled network boost orka3 vm deploy -i 90gbventurassh.img --disable-net-boost ``` **Examples - VM Configuration Deployments:** ```bash theme={null} # Deploy from existing VM config with random name orka3 vm deploy --config small-ventura-config # Deploy from existing VM config with specified name orka3 vm deploy small-ventura-vm --config small-ventura-config # Deploy from VM config and override CPU and memory orka3 vm deploy --config small-ventura-config -c 6 --memory 16 ``` ## Listing VMs ### orka3 vm list Show basic or extended information about the specified VM(s). Stopped or suspended VMs appear as 'Running' when listed. Do not rely on the displayed status to confirm a VM is active before scheduling work against it. **Syntax:** ```bash theme={null} orka3 vm list [VM_NAME_1 [VM_NAME_2 ...]] [--namespace TARGET_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for list -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # List all VMs in the 'orka-default' namespace orka3 vm list # List all VMs (extended table) orka3 vm list --output wide # List all VMs in a specific namespace orka3 vm list --namespace orka-test # List all VMs in a specific namespace (extended table) orka3 vm list --namespace orka-test --output wide # Show basic information about a specific VM orka3 vm list small-ventura-vm # Show detailed information about a specific VM orka3 vm list small-ventura-vm --output wide # Show information about multiple VMs orka3 vm list small-ventura-vm small-sonoma-vm # Print information in JSON format orka3 vm list --output json ``` ## Deleting VMs ### orka3 vm delete Delete the specified VMs. This frees up the respective resources and ports on the respective Orka node. This operation cannot be undone. You will not be able to restore any unsaved or uncommitted data from the VM. **Syntax:** ```bash theme={null} orka3 vm delete VM_NAME [VM_NAME_2 ...] [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for delete -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Delete a VM from the 'orka-default' namespace orka3 vm delete small-ventura-vm # Delete VMs from a specific namespace orka3 vm delete small-ventura-vm small-ventura-arm-vm --namespace orka-test ``` # VM Lifecycle Management Source: https://docs.macstadium.com/orka/orka3-cli-reference/vm-lifecycle-management Save a new image from a running VM. This saves the file system and the state of the OS, including any running applications. You can preserve the original. ## Saving Images ### orka3 vm save Save a new image from a running VM. This saves the file system and the state of the OS, including any running applications. You can preserve the original image and deploy new VMs with the applied changes from the new image. **Image Name Requirements:** * Does not exceed 63 characters including the file extension (if set) * Consists of lowercase alphanumeric characters, dashes (-) or periods (.) * Must be unique to the cluster **Note:** Saving a new image is an async operation. To check the status: `orka3 image list NEW_IMAGE_NAME`. This operation does not affect the original image of the VM. This operation restarts the VM. **Syntax:** ```bash theme={null} orka3 vm save VM_NAME NEW_IMAGE_NAME [--description 'DESCRIPTION'] [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -d, --description string (Optional) Custom description for the new image -h, --help Display help for save -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Save a new image from a running VM orka3 vm save medium-ventura-vm 120gbmodifiedventura # Save a new image from a VM in a specific namespace orka3 vm save medium-ventura-vm 120gbmodifiedventura --namespace orka-test # Save a new image with a custom description orka3 vm save medium-ventura-vm 120gbmodifiedventura --description 'user@company.com saved this image' ``` ### orka3 vm commit Update an existing image from a running VM. Take the changes from the specified deployed VM and commit them back to its respective base image. For Intel-based VMs, the image must not be in use by any other VMs. This operation applies any file system changes and the state of the OS, including any running applications, to the original image. **Note:** Committing changes to an existing image is an async operation. To check the status: `orka3 image list IMAGE_NAME`. This operation restarts the VM. **Syntax:** ```bash theme={null} orka3 vm commit VM_NAME [--description 'DESCRIPTION'] [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -d, --description string (Optional) New description for the original image -h, --help Display help for commit -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Commit changes to the original image orka3 vm commit small-ventura-vm # Commit changes from a VM in a specific namespace orka3 vm commit small-ventura-vm --namespace orka-test # Commit changes and set a new description for the image orka3 vm commit small-ventura-vm --description 'user@company.com updated this image' ``` ## Pushing to OCI Registries ### orka3 vm push (Apple silicon-only) The state of a running VM is saved on the host and pushed to an OCI-compatible registry. The provided image must be in the following format: `server.com/repository/image:tag`. The `:tag` portion is optional and defaults to `latest` if not provided. **Requirements:** * Registry credentials must exist in the same namespace as the VM * This is an async operation. To check the status: `orka3 vm get-push-status JOB_NAME` **Syntax:** ```bash theme={null} orka3 vm push VM_NAME IMAGE[:TAG] [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for push -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Push an image to GitHub Packages from a running VM orka3 vm push vm-5rjn4 ghcr.io/myorg/orka-images/base:latest # Push from a VM in a specific namespace orka3 vm push vm-fxwj5 ghcr.io/myorg/orka-images/base:latest --namespace orka-test ``` ### orka3 vm get-push-status (Apple silicon-only) View the status of an image being pushed to an OCI-compatible registry. The status is viewable for one (1) hour after finishing, after which point the underlying job is cleaned up. If a job name is not provided, the status of all current image push operations is shown. The job name is initially shown when the image push operation is started. **Syntax:** ```bash theme={null} orka3 vm get-push-status [JOB_NAME] [--namespace CURRENT_VM_NAMESPACE] [--output wide|json] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for get-push-status -o, --output string (Optional) Output format: table (default)|wide|json -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # View the status of all images being pushed orka3 vm get-push-status # View the status for a specific image by job name orka3 vm get-push-status vm-push-qxjjf ``` ## Resizing VM Disks ### orka3 vm resize Resize the disk of a running VM; but only increase the size of the disk. **Architecture-Specific Behavior:** * **For Apple silicon-based VMs (arm64):** Nothing is needed after the command completes * **For Intel-based VMs (amd64):** Provide SSH access credentials for Orka to complete the resize and repartition automatically. If not provided, it must be completed manually For Intel-based VMs, you can save or commit the modified image manually: ```bash theme={null} orka3 vm save VM_NAME NEW_IMAGE_NAME orka3 vm commit VM_NAME ``` Resize always assumes working in GB. This operation restarts the VM. **Syntax:** ```bash theme={null} orka3 vm resize VM_NAME NEW_DISK_SIZE [--user SSH_USER] [--password SSH_PASSWORD] [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for resize -p, --password string (Optional) (Intel-only) SSH password for automatic repartition -u, --user string (Optional) (Intel-only) SSH user for automatic repartition -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Resize a VM disk to 100GB orka3 vm resize small-ventura-vm 100 # Resize a VM disk in a specific namespace orka3 vm resize my-vm 100 --namespace orka-test # (Intel-only) Resize with automatic repartition orka3 vm resize small-intel-vm 100 --user admin --password admin ``` ## Power Operations (Intel Only) **Note:** Power operations are only available for Intel-based VMs. Stopped or suspended VMs appear as 'Running' when listed with `orka3 vm list`. ### orka3 vm start Power ON a stopped VM. The `orka3 vm stop` and `orka3 vm start` sequence acts as a VM reboot. **Syntax:** ```bash theme={null} orka3 vm start VM_NAME [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for start -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Power ON a stopped VM orka3 vm start small-ventura-vm # Power ON a VM in a specific namespace orka3 vm start small-ventura-vm --namespace orka-test ``` ### orka3 vm stop Power OFF a running VM. The `orka3 vm stop` and `orka3 vm start` sequence acts as a VM reboot. **Syntax:** ```bash theme={null} orka3 vm stop VM_NAME [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for stop -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Power OFF a running VM orka3 vm stop small-ventura-vm # Power OFF a VM in a specific namespace orka3 vm stop small-ventura-vm --namespace orka-test ``` ### orka3 vm suspend Suspend a running VM. This operation freezes all running processes on the VM, without turning it off. The `orka3 vm suspend` and `orka3 vm resume` sequence acts as putting the VM on hold then resuming it. **Syntax:** ```bash theme={null} orka3 vm suspend VM_NAME [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for suspend -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Suspend a running VM orka3 vm suspend small-ventura-vm # Suspend a VM in a specific namespace orka3 vm suspend small-ventura-vm --namespace orka-test ``` ### orka3 vm resume Resume a suspended VM. This operation resumes all suspended processes on the VM, without turning it on. **Syntax:** ```bash theme={null} orka3 vm resume VM_NAME [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for resume -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Resume a suspended VM orka3 vm resume small-ventura-vm # Resume a VM in a specific namespace orka3 vm resume small-ventura-vm --namespace orka-test ``` ## Reverting VMs (Intel Only) ### orka3 vm revert (Intel-only) Revert a VM to the latest state of its image. This operation restarts the VM. This operation cannot be undone. Any unsaved or uncommitted data will be lost and unable to be retrieved. **Syntax:** ```bash theme={null} orka3 vm revert VM_NAME [--namespace CURRENT_VM_NAMESPACE] [flags] ``` **Options:** ```bash theme={null} -h, --help Display help for revert -n, --namespace string (Optional) Namespace scope (default "orka-default") ``` **Examples:** ```bash theme={null} # Revert a VM to its original image state orka3 vm revert small-ventura-vm # Revert a VM in a specific namespace orka3 vm revert small-ventura-vm --namespace orka-test ``` # Orka CI/CD integrations quick start guide Source: https://docs.macstadium.com/orka/quick-start-guides/cicd-integrations-quick-start Step-by-step setup for Orka's CI/CD integrations: GitHub Actions, GitLab, Jenkins, Packer, TeamCity, and Buildkite. Includes connecting to your Orka cluster. How to get started with your preferred CI/CD integration. Learn how to set it up for the first time and how to get help. #### **The Ultimate Quick Start** If you want to skip the detailed explanations, just run through these steps on your own: 1. Review the list of available integrations at [Orka Tools & Integrations](/orka/orka-overview/tools-integrations) and select the one you want to use. 2. Create a service account and get a token. 3. List the available VMs and images. 4. Create a VM config for your workflow with the CLI. 5. Complete the CI/CD integration setup as per its instructions. Orka provides many integrations and plugins to set up a CI/CD pipeline with your preferred service provider. You can also build an in-house CI/CD integration with the [Orka3 CLI](/orka/quick-start-guides/orka3-cli-quick-start) or the [Orka3 API](/orka/quick-start-guides/orka3-api-quick-start). This page focuses on the ready CI/CD solutions for Orka. The Orka CI/CD integrations are most useful if you have: * Basic Orka knowledge and basic or advanced knowledge about your preferred CI/CD provider * Workflows that require automation Most CI/CD integrations rely on SSH to connect to the VM where your builds run and provide both permanent and ephemeral build agent options. * **Permanent build agent:** A running VM that persists between pipeline iterations. The VM is never destroyed and the pipeline reuses it on every run. * **Ephemeral build agent:** A VM that spins up for the duration of one pipeline run and is destroyed after. ## 1. Before You Begin 1. Make sure you can access the account for your cluster in the MacStadium Customer Portal. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). 2. Get your VPN connection information from [My Cloud](https://portal.macstadium.com/my-cloud) in the MacStadium Portal. 3. Connect to your Orka cluster via VPN. Make sure that your CI/CD integration can reach the cluster via VPN. 1. [Download and install a VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection). Note that if you're using a custom Orka domain, you might need to make some additional configuration changes. 2. Use your firewall's public IP as the server address, and the username and password from that firewall's Credentials section in My Cloud. 4. Install the Orka3 CLI on your system. ## 2. Some Orka CI/CD Basics * CI/CD integrations must target your Orka API URL. If you are using an [Orka domain](/orka/networking-with-orka-at-macstadium/built-in-orka-domains) or an [external custom domain](/orka/networking-with-orka-at-macstadium/external-custom-domains), you must ensure that the CI/CD integration can resolve the domain. **What's your Orka API URL?** You can get your Orka API URL from the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan): * For clusters deployed before Orka 2.1, it's the `.100` address for your `Private-1` network (usually, `10.221.188.100`), prefixed with `http`. For example: `http://10.221.188.100`. * For clusters deployed with Orka 2.1 or later, it's the `.20` address for your `Private-1` network (usually `10.221.188.20`), prefixed with `http`. For example: `http://10.221.188.20`. * You can also use `https://` and `https://` (if configured). To get the [Orka domain](/orka/networking-with-orka-at-macstadium/built-in-orka-domains) for your Orka cluster, [contact MacStadium support](https://portal.macstadium.com/login). To use an external custom domain, see [here](/orka/networking-with-orka-at-macstadium/external-custom-domains). Note that you can use `http://`, `https://`, and `https://` interchangeably in your workflows. ## 3. Pick Your CI/CD Integration Go to [Orka Tools & Integrations](/orka/orka-overview/tools-integrations) and review the latest list of available integrations. Pick the one you want to use and navigate to its detailed setup instructions (usually available in the respective repo or official integration page). ## 4. Create a Service Account and Get a Token Orka clusters now require authentication via Single Sign-On or via service account token. Service accounts are intended for use with CI/CD integrations. They don't require username/password credentials to log in and let CI/CD integrations bypass the browser login via the Orka3 CLI. The tokens for service accounts also have an extended duration of 1 year. ```bash theme={null} # Create the service account orka3 sa create # Generate a token: copy this and store it as a secret in your CI/CD system orka3 sa token ``` Grab the token from the output of `orka3 sa token` and store it as a secret in your CI/CD system. Use it to authenticate the integration with your Orka cluster. These commands create a service account in the `orka-default` namespace and obtain a valid token for it. If you need your CI/CD integration to be able to work in additional namespaces, you need to create the service account in the respective namespace or [configure the respective role bindings](/orka/orka-cluster-access/orka-cluster-manage-access-to-resources). ## 5. Create the Template for Your Permanent or Ephemeral Agent 1. Check if there are any VM configs on your environment. ```bash theme={null} orka3 vm-config list ``` 2. List the available base images: ```bash theme={null} orka3 image list ``` MacStadium maintains a public OCI registry at `ghcr.io/macstadium/orka-images` with pre-built macOS images. You don't need to pull images manually; you can reference them directly in your VM config. 3. Create your first VM config: ```bash theme={null} orka3 vmc create --image ghcr.io/macstadium/orka-images/sonoma:latest --cpu 4 ``` **VM config name requirements:** The name must not exceed 50 characters, consist of lowercase alphanumeric characters or dashes (-), start with an alphabetic character, and end with an alphanumeric character. The name must be unique in the cluster. Your CI/CD pipeline will use this VM config to spin up permanent or ephemeral agents. Every agent is a deployed VM instance of a VM config. If you're using a custom image or installing from ISO, SSH or Screen Sharing may not be enabled by default. In that case, connect via VNC first, then enable them in the OS. ## 6. Complete the CI/CD Setup Revisit the setup instructions for your preferred Orka CI/CD integration. Fill in any configuration fields as needed. Note that you might need to provide the SSH credentials for the VM. By default, MacStadium's official images use `admin/admin` credentials. Change this after first login. ## Next Steps Pick your integration and follow the guide for your CI/CD platform: * [GitHub Actions](/orka/orka-devops-integrations/github-actions) * [GitLab CI](/orka/orka-devops-integrations/gitlab) * [Jenkins](/orka/orka-devops-integrations/jenkins) * [Buildkite](/orka/orka-devops-integrations/buildkite) * [TeamCity](/orka/orka-devops-integrations/teamcity) Not sure which to use? See [Tools and Integrations](/orka/orka-overview/tools-integrations) for the full list. # Deploy your first VM with the Orka3 REST API Source: https://docs.macstadium.com/orka/quick-start-guides/orka3-api-quick-start Get started with the Orka3 REST API: authenticate with a CLI token, deploy VMs, manage images, and build custom integrations with your Orka cluster. Getting started with the Orka3 API. Learn the basic operations and how to get help. The ultimate quick start If you want to skip the detailed explanations, just run through these steps on your own: 1. Get an authentication token from the Orka3 CLI. 2. [List your nodes](https://macstadium.github.io/orka-api-docs/#tag/Nodes/operation/listNodes) and check their state in the response. 3. List the available [VMs](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/listVMs) with the API. 4. [Deploy your first VM instance](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/vmDeploy). 5. Run Apple Screen Sharing to connect to the VM instance. Use `vnc://:` with the IP and port from the deploy response from Step 4. Use the `admin/admin` credentials. 6. Once you login be sure to change the login credentials, apply the latest OS updates, and install (or upgrade) the Orka VM Tools for added security and functionality. 7. [Commit](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/imageCommit) or [save the changes](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/imageSave) to a new base image (use the VM name from Step 4). 8. [Deploy another VM instance](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/vmDeploy). 9. Run Apple Screen Sharing and connect to the newly deployed VM. Use the connection information returned in Step 8. 10. [Delete](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/deleteVM) your VM instances. 11. [List](https://macstadium.github.io/orka-api-docs/#tag/VMs/operation/listVMs) your VMs. The Orka3 API requires you to configure and execute the requests on your own. In addition to completing everyday tasks, the Orka3 API lets you create your in-house integration and automation. The Orka3 API will be most useful to: * Advanced users * Users with workflows that require automation ## Before You Begin 1. Make sure you can access the account for your cluster in the MacStadium Customer Portal. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). 2. Get your VPN connection information from [My Cloud](https://portal.macstadium.com/my-cloud) in the MacStadium Portal. 3. Connect to your Orka cluster via VPN. * [Download and install a VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection). Note that if you're using a custom Orka domain, you might need to make some additional configuration changes. * Use your firewall's public IP as the server address, and the username and password from that firewall's Credentials section in My Cloud. ## Some Orka3 API Basics * You need to target your Orka API URL in your API calls. * You need to provide the `Authorization: Bearer ` header in your API calls. ### What's Your Orka API URL? You can get your Orka API URL from the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan): * It's the `.20` address for your `Private-1` network (usually `10.221.188.20`), prefixed with `http`. For example: `http://10.221.188.20`. * You can also use `https://` and `https://` (if configured). To get the [Orka domain](/orka/networking-with-orka-at-macstadium/built-in-orka-domains) for your Orka cluster, [contact MacStadium support](https://portal.macstadium.com/login). To use an external custom domain, see [here](/orka/networking-with-orka-at-macstadium/external-custom-domains). You can use `http://`, `https://`, and `https://` interchangeably in your workflows. * The Orka3 API is a RESTful API and conforms to enterprise industry standards. The full API reference, including all endpoints, request bodies, and response schemas, is at [macstadium.github.io/orka-api-docs](https://macstadium.github.io/orka-api-docs/). Use it alongside this quick start to explore operations not covered here. All sample API calls from this point use generic placeholder values. Replace the Orka API URL, token, and any other placeholders with values from your environment. Sample responses are piped through a JSON formatter, so yours may look different. ## Get a Token from the Orka3 CLI For all API calls, you need to provide the `Authorization: Bearer ` header. The Orka3 API currently does not let you log in from it directly and obtain a token. You will need to obtain your token from the Orka3 CLI. Orka lets you log in with your MacStadium Customer Portal credentials. Based on the role configured in the Customer Portal, you will have administrative or regular user privileges. By default, you will have access to the `orka-default` namespace. If you have been added to additional role bindings, you might be able to access additional namespaces. ```bash theme={null} orka3 login ``` Orka will launch a new browser tab (or window) and let you log in via the provided form. After you log in, you can return to the command line and run more `orka3` commands. Your token is stored locally in the `~/.kube/config` file. Personal tokens (SSO login) are valid for one hour. Afterward, you must log in again to obtain a new token. For CI/CD automation, use a service account token instead. Service account tokens are valid for one year by default and don't require browser-based login. See [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start) for details. You now need to get your Orka authentication token from your `~/.kube/config`: ```bash theme={null} orka3 user get-token ``` ## Deploy Your First VM Instance You can use the built-in Swagger UI to execute API calls directly against your cluster. In your browser, navigate to `/api/v1/swagger`, click **Authorize**, and type `Bearer `. For every call that you want to run, just click **Try it out** and fill the required details. 1. Check the available resources in your cluster: **cURL** ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/nodes' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` **Response** ```json theme={null} { "items": [ { "name": "macpro-4", "namespace": "orka-default", "nodeIP": "10.221.189.11", "availableCpu": 12, "availableMemory": "31.23G", "availableGpu": 0, "allocatableCpu": 12, "allocatableMemory": "31.23G", "allocatableGpu": 0, "nodeType": "WORKER", "phase": "READY", "orkaTags": [] }, { "name": "mini-arm-13", "namespace": "orka-default", "nodeIP": "10.221.189.13", "availableCpu": 5, "availableMemory": "11.20G", "availableGpu": 0, "allocatableCpu": 8, "allocatableMemory": "16.00G", "allocatableGpu": 0, "nodeType": "WORKER", "phase": "READY", "orkaTags": [] } ] } ``` This API call provides an overview of your nodes. It shows the actual IP, the state, and the available resources on each node. 2. Check if there are any VMs on your environment. **cURL** ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` **Response** ```json theme={null} { "items": [] } ``` This API call lists all VM instances in the `orka-default` namespace. If nothing prints, no one has created any VM instances yet. 3. List the available base images: ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/images' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` MacStadium maintains a public OCI registry at `ghcr.io/macstadium/orka-images` with pre-built macOS images. You don't need to pull images manually; you can deploy directly from the registry in the next step. 4. Deploying a VM requires only a base image. Run: **cURL** ```bash theme={null} curl -X 'POST' \ '/api/v1/namespaces/orka-default/vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "image": "ghcr.io/macstadium/orka-images/sequoia:latest" }' ``` **Response** ```json theme={null} { "name": "vm-cznfv", "node": "mini-arm-13", "memory": "4.80Gi", "ip": "10.221.189.13", "ssh": 8822, "vnc": 5999, "screenshare": 5901, "status": "Running" } ``` The bare minimum required argument is `image`. Orka creates a VM with 3 CPUs and assigns a randomly generated name. 5. What happens if you list your VMs again now? **cURL** ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` **Response** ```json theme={null} { "items": [ { "name": "vm-l4qgb", "ip": "10.221.189.13", "cpu": 3, "deployDate": "2023-10-10T19:56:21Z", "image": "ghcr.io/macstadium/orka-images/sequoia:latest", "gpuPassthrough": false, "memory": "4.80Gi", "node": "mini-arm-13", "screenshare": 5901, "ssh": 8822, "status": "Running", "vnc": 5999 } ] } ``` The API now returns information about your running VM. The `GET /api/v1/namespaces/orka-default/vms` call shows system information for your VMs, including IP and connection ports. Note that even though `screenshare` and `ssh` ports are always listed, you won't be able to use them unless the respective connection type is enabled in macOS. This is a security limitation of the OS. When you have a lot of VMs, use `GET /api/v1/namespaces/orka-default/vms/` to get system information for a single VM instead of listing all of them. 6. Check your nodes to see how many resources are now in use. **cURL** ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/nodes' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` ## Experience Your VM Instance 1. Look at the last output of `GET /api/v1/namespaces/orka-default/vms` again. Get that IP and `screenshare` port. 2. Launch Apple Screen Sharing on your local machine. In **Connect To:**, type `vnc://:`. This step works only on macOS. On Linux or Windows, launch your preferred VNC client and connect to `:`. One more thing to remember is that Screen Sharing needs to be already enabled on the macOS. Most of the time, this is not the case (especially on clean OS installs or after an ISO install (Intel only)), and you will need to enable the setting yourself. The good news is that MacStadium pre-built images are already preconfigured for you, and you can enjoy out-of-the-box Screen Sharing and SSH connectivity. If you're using a custom image or installing from ISO (Intel only), SSH and Screen Sharing are not enabled by default. Connect via VNC first, then enable them in the OS. 3. When prompted by Apple Screen Sharing, provide the credentials for the VM (`admin/admin`). You will be prompted for the password one more time when Apple connects to the VM. 4. On the VM, launch **System Settings** > **Users & Groups**. Select the **Admin** user and click **Change password**. Set the `Admin` user password to whatever works for you. 5. (Optional) Inside the VM, launch the Terminal application and run the following command. If Orka VM Tools is not yet installed: ```bash theme={null} brew install orka-vm-tools ``` If Orka VM Tools is already installed and needs updating: ```bash theme={null} brew upgrade orka-vm-tools ``` This action ensures that your VM is running the latest version of the [Orka VM Tools](/orka/orka-resources/vm-tools). This collection of services lets Orka manage the guest operating system on Apple silicon-based VMs more efficiently and enables vital features, such as [shared VM storage](/orka/orka-resources/shared-vm-storage). If your cluster is not running the latest Orka version, download and install an [Orka VM Tools](/orka/orka-resources/vm-tools) that matches the version of your cluster. 6. Always apply the latest OS updates and restart the VM. ## Preserve the Image Changes Changing a running VM's configuration or file system does not affect its base image. As soon as you delete the VM, your changes will be lost, and you will need to recreate them manually on other VMs. To make changes permanent, push your image to an OCI-compatible registry. This is the recommended approach for Apple silicon clusters on Orka 3.5 or later. 1. Push the image to your OCI-compatible registry: **cURL** ```bash theme={null} curl -X 'POST' \ '/api/v1/namespaces/orka-default/vms//push' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "imageReference": "/:" }' ``` **Response** ```json theme={null} { "jobName": "" } ``` If you are on Intel or need to write to NFS local cluster storage instead of an OCI registry, use `commit` (overwrites the original base image) or `save` (creates a new image): **Commit** ```bash theme={null} curl -X 'POST' \ '/api/v1/namespaces/orka-default/vms//commit' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "description": "Committed from " }' ``` **Save** ```bash theme={null} curl -X 'POST' \ '/api/v1/namespaces/orka-default/vms//save' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "description": "Saved from ", "imageName": "" }' ``` Both operations restart the VM. NFS local storage is being phased out in favor of OCI. 2. See how the changes are preserved for yourself. Deploy a new VM instance from your image: **cURL** ```bash theme={null} curl -X 'POST' \ '/api/v1/namespaces/orka-default/vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "image": "" }' ``` 3. Launch Apple Screen Sharing and connect to the newly deployed VM instance. Use the updated admin credentials to log in. ## Time to Say Goodbye When your VM instances have served their purpose, you can `delete` them. 1. Remove the VM instances you created until now: **cURL** ```bash theme={null} curl -X 'DELETE' \ '/api/v1/namespaces/orka-default/vms/' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` 2. List your VMs again. **cURL** ```bash theme={null} curl -X 'GET' \ '/api/v1/namespaces/orka-default/vms' \ -H 'accept: application/json' \ -H 'Authorization: Bearer ' ``` ## Next Steps * [CLI Quick Start](/orka/quick-start-guides/orka3-cli-quick-start): manage VMs interactively with the Orka3 CLI * [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start): automate VM deployment in your build pipeline * [Tools and Integrations](/orka/orka-overview/tools-integrations): browse available integrations # Deploy your first VM with the Orka3 CLI Source: https://docs.macstadium.com/orka/quick-start-guides/orka3-cli-quick-start Get started with the Orka3 CLI: configure your API URL, log in, list nodes and images, deploy VMs, commit changes to a new base image, and clean up. Working with the Orka3 CLI is straightforward and friendly. Learn how to quickly get set up for the first time, basic operations, and how to get help. If you want to skip the detailed explanations, just run through these steps on your own: 1. `orka3 config set --api-url ` 2. `orka3 completion {bash|fish|powershell|zsh}` 3. `orka3 login` 4. `orka3 node list` 5. `orka3 vm list` (you should see 0 results) 6. `orka3 vm deploy --image ghcr.io/macstadium/orka-images/sequoia:latest` 7. `orka3 image list` (this will return the list of locally stored images) 8. `orka3 vm list ` and `orka3 vm list -o wide` 9. Run Apple Screen Sharing to connect to the VM instance. Use `vnc://:` with the IP and port from Step 8. Use the `admin/admin` credentials. 10. On the VM, change the login credentials, apply the latest OS updates, and install (or upgrade) the Orka VM Tools for added security and functionality. 11. `orka3 vm push ` (Apple silicon, recommended) or `orka3 vm commit ` / `orka3 vm save ` (writes to NFS local storage) 12. `orka3 vm deploy --image -y` (use the name of the newly saved image or the original image, if you committed the changes to it). 13. Run Apple Screen Sharing and connect to the newly deployed VM. Use the connection information printed by `orka3 vm deploy`. Verify that your changes are there. 14. `orka3 vm delete ` 15. `orka3 vm list` The Orka3 CLI is the most immersive way to get started with Orka. It provides easy-to-use commands, command autocompletion, and comprehensive built-in help. The Orka3 CLI will be helpful to: * Beginner and advanced users. * Users with manual workflows. * Users with workflows that require automation. ## 1. Before You Begin 1. Ensure you can access your cluster account in the MacStadium Customer Portal. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). 2. Get your VPN connection information from [My Cloud](https://portal.macstadium.com/my-cloud) in the MacStadium Portal. 3. Connect to your Orka cluster via VPN. * [Download and install a VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection). Note that if you're using a custom Orka domain, you might need to make some additional configuration changes. * Use your firewall's public IP as the server address, and the username and password from that firewall's Credentials section in My Cloud. ## 2. Download and Configure the Orka3 CLI 1. Download and install the latest [Orka3 CLI](/orka/orka-overview/tools-integrations) that matches your environment version. * On macOS, run the `pkg` executable. * On Linux, unpack the archive and move the executable to `/usr/local/bin`. * On Windows, add the directory of the executable to your `PATH`. **TIP**: Using Homebrew? Try `brew install orka3`. 2. Launch your preferred command-line tool (e.g., the Terminal on macOS) and run the following command: ```bash theme={null} orka3 config set --api-url ``` This operation is a one-time effort. With it, you set the Orka service endpoint for your cluster. #### **What's Your Orka API URL?** You can get your Orka API URL from the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan): * For clusters deployed with Orka 2.1 or later, it's the `.20` address for your `Private-1` network (usually `10.221.188.20`), prefixed with `http`. For example: `http://10.221.188.20`. * You can also use `https://` and `https://` (if configured). To get the [Orka domain](/orka/networking-with-orka-at-macstadium/external-custom-domains) for your Orka cluster, [contact MacStadium support](https://portal.macstadium.com/login). To use an external custom domain, see [here](/orka/networking-with-orka-at-macstadium/external-custom-domains). Note that you can use `http://`, `https://`, and `https://` interchangeably in your workflows. When connecting via HTTPS with a custom domain, the Orka3 CLI requires a valid TLS certificate from a trusted certificate authority. Self-signed certificates are not supported. 3. Enable command autocompletion for the Orka3 CLI ```bash theme={null} orka3 completion {bash|fish|powershell|zsh} ``` The Orka3 CLI prints detailed instructions for the selected shell type. ## 3. Authenticate with Your Cluster Orka lets you log in with your MacStadium Customer Portal credentials. Your access privileges are based on the role configured by your account admin in the Customer Portal. By default, you will have access to the orka-default namespace. You can access additional namespaces if you have been added to additional role bindings. ```bash theme={null} orka3 login ``` Orka will launch a new browser tab (or window) and let you log in via the provided form. After you log in, you can return to the command line and run additional `orka3` commands. Your token is stored locally in the `~/.kube/config` file. Personal tokens (SSO login) are valid for one hour. Afterward, you must log in again to obtain a new token. For CI/CD automation, use a service account token instead. Service account tokens are valid for one year by default and don't require browser-based login. See [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start) for details. ## 4. Create and Deploy Your First VM Instance 1. Open a new command-line prompt and run: ```bash theme={null} orka3 node list ``` This command shows basic information about the nodes in the `orka-default` namespace. Re-run this command as you deploy VM instances later on to keep track of the available resources on your nodes. 2. Run: ```bash theme={null} orka3 vm list ``` This command lists all VM instances in the `orka-default` namespace. If nothing prints, no one has created any VM instances yet. 3. List any images already stored locally in your cluster: ```bash theme={null} orka3 image list ``` MacStadium maintains a public OCI registry at `ghcr.io/macstadium/orka-images` with pre-built macOS images. You don't need to pull images manually; you can deploy directly from the registry in the next step. 4. Deploy a VM: ```bash theme={null} orka3 vm deploy --image ghcr.io/macstadium/orka-images/sequoia:latest ``` Orka creates a VM with the specified image and 3 CPUs and assigns a randomly generated name. 5. Check your nodes and VMs. * Re-run `orka3 node list`. Did the number of available resources change? * List your VMs: ```bash theme={null} orka3 vm list ``` You should now see your VM in the list. For more detailed output, run `orka3 vm list --output wide`, which shows architecture, base image, CPU, memory, and connection ports. Note that `Screenshare` and `SSH` ports are always listed, but you won't be able to use them unless the respective connection type is enabled in macOS. To filter by name, use `orka3 vm list `. ## 5. Experience Your VM Instance 1. Look at the last output of `orka3 vm list` again. Get that IP and `Screenshare` port. 2. Launch Apple Screen Sharing on your local machine (`Cmd+K` in Finder). Type `vnc://:`. One more thing to remember is that Screen Sharing must already be enabled on the macOS. This is usually not the case (especially on clean OS installs or after an ISO install), and you will need to enable the setting yourself. The good news is that `ghcr.io/macstadium/orka-images/sequoia:latest` is already preconfigured for you, and you can enjoy out-of-the-box Screen Sharing and SSH connectivity. 3. When prompted by Apple Screen Sharing, provide the credentials for the VM (`admin/admin`). You will be prompted for the password again - when Apple connects to the VM. 4. On the VM, launch **System Settings** > **Users & Groups**. Select the **Admin** user and click **Change password**. Set the `Admin` user password to whatever works for you. 5. (Optional) Launch the Terminal and run the following command. If Orka VM Tools is not yet installed: ```bash theme={null} brew install orka-vm-tools ``` If Orka VM Tools is already installed and you need to update it: ```bash theme={null} brew upgrade orka-vm-tools ``` This action ensures that your VM is running the latest version of the [Orka VM Tools](/orka/orka-resources/vm-tools). This collection of services lets Orka manage the guest operating system on Apple silicon-based VMs more efficiently and enables key features, such as [shared VM storage](/orka/orka-resources/shared-vm-storage). If your cluster and CLI are not running the latest Orka version, download and install an [Orka VM Tools](/orka/orka-resources/vm-tools) that matches the versions of your cluster and Orka3 CLI. 6. Apply the latest OS updates and restart the VM. ## 6. Preserve the Image Changes Changing a running VM's configuration or file system does not affect its base image. As soon as you delete the VM, your changes will be lost, and you will need to recreate them manually on other VMs. To make changes permanent, push your image to an OCI-compatible registry. This is the recommended approach for Apple silicon clusters on Orka 3.5 or later. See [Using Harbor OCI Storage with the Orka CLI](/orka/oci-images/using-harbor-oci-storage-with-the-orka-cli). 1. Push the image to your OCI-compatible registry. This retains the updated admin password and OS updates on future deployments. Return to the command line on your local machine and run: ```bash theme={null} orka3 regcred --username --password [--allow-insecure] orka3 vm push ``` You can get the `` from `orka3 vm list`. Registry credentials are required; run `orka3 regcred --help` for more information. If you are on Intel or need to write to NFS local cluster storage instead of an OCI registry, use `vm commit` (overwrites the original base image) or `vm save` (creates a new image). NFS local storage is being phased out in favor of OCI. Run `orka3 vm commit --help` or `orka3 vm save --help` for details. 2. See how the changes are preserved for yourself. Deploy a new VM instance: ```bash theme={null} orka3 vm deploy --image ``` 3. Launch Apple Screen Sharing and connect to the newly deployed VM instance. Use the updated admin credentials to log in. ## 7. Delete VMs *This section is optional.* When your VM instances have served their purpose, you can `delete` them. 1. Remove all VM instances you created until now: ```bash theme={null} orka3 vm delete ``` 2. List your VMs again. ```bash theme={null} orka3 vm list ``` ## Next Steps Now that you've deployed and managed your first VM, you're ready to integrate Orka with your CI/CD pipeline: * [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start): set up a service account, create a VM template, and connect Orka to your build system * [Orka VM Tools](/orka/orka-resources/vm-tools): install Orka VM Tools on Apple silicon VMs to enable shared storage and other features * [Tools and Integrations](/orka/orka-overview/tools-integrations): browse all available Orka CLI versions and CI/CD integrations # Orka Web UI quick start guide Source: https://docs.macstadium.com/orka/quick-start-guides/web-ui-quick-start Get started with the Orka Web UI: browse nodes and images, create VM configs, deploy VMs, connect via Screen Sharing, and save changes as a new base image. Getting started with the Orka UI is quick, simple, and straightforward. Learn how to quickly get set up for the first time, basic operations, and how to get help. If you want to skip the detailed explanations, just run through these steps on your own: 1. Obtain an authentication token. 2. Launch the Orka UI in your browser at ``. 3. Go to **Nodes**. 4. Go to **Images**. 5. Go to **VM Configs** and click **Create config** (select an available macOS image, 3 for CPU and vCPU, leave VNC enabled). 6. Click **Deploy Config** and wait for the confirmation. 7. Go to **VMs** and check the connection information for the instance. 8. Use Apple Screen Sharing to connect to the VM instance. Example: `vnc://:` with the IP and port from Step 7. Use the `admin/admin` credentials. 9. Once you login be sure to change the login credentials, apply the latest OS updates, and install (or upgrade) the Orka VM Tools for added security and functionality. 10. Return to the UI. On the **VMs** page, select your VM instance and click **More** > **Save as new image** at the top. 11. Return to the UI. Go to the **Images** page and make sure that your new image appears in the list. 12. On the **VMs** page, select your VM instance and click **More** > **Delete** at the top. 13. Make sure that the list of VMs is empty. 14. Go to **VM configs** and verify that your template is preserved. The Orka UI is a user-friendly way to get started with Orka. It provides basic capabilities and a clean UI. The Orka UI will be most beneficial to: * Beginner users. * Users with predominantly manual workflows. ## 1. Before You Begin 1. Ensure you can access your cluster account in the MacStadium Customer Portal. See [Cluster Access Management: Overview](/orka/orka-cluster-access/cluster-access-management-overview). 2. Get your VPN connection information from [My Cloud](https://portal.macstadium.com/my-cloud) in the MacStadium Portal. 3. Connect to your Orka cluster via VPN. 1. [Download and install a VPN client](/orka/networking-with-orka-at-macstadium/vpn-connection). Note that you might need to make additional configuration changes if you're using a custom Orka domain. 2. Use your firewall's public IP as the server address, and the username and password from that firewall's Credentials section in My Cloud. ## 2. Authenticate with the Cluster Orka lets you log in with your MacStadium Customer Portal credentials. Your access privileges are based on the role configured by your account admin in the Customer Portal. By default, you will have access to the `orka-default` namespace. You can access additional namespaces if you have been added to additional role bindings. ```bash theme={null} orka3 login ``` Orka will launch a new browser tab (or window) and let you log in via the SSO-enabled form. After you log in, you can return to the command line and run additional `orka3` commands. Your token is stored locally in the `~/.kube/config` file. Personal tokens (SSO login) are valid for one hour. Afterward, you must log in again to obtain a new token. For CI/CD automation, use a service account token instead. Service account tokens are valid for one year by default and don't require browser-based login. See [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start) for details. You now need to get your Orka authentication token from your `~/.kube/config`: ```bash theme={null} orka3 user get-token ``` ## 3. Launch the Orka UI * In your browser, navigate to your Orka API URL. **What's your Orka API URL?** You can get your Orka API URL from the IP Allocation table in [My Cloud](/macstadium/macstadium-overview/ip-plan): * For clusters deployed before Orka 2.1, it's the `.100` address for your `Private-1` network (usually, `10.221.188.100`), prefixed with `http`. For example: `http://10.221.188.100`. * For clusters deployed with Orka 2.1 or later, it's the `.20` address for your `Private-1` network (usually `10.221.188.20`), prefixed with `http`. For example: `http://10.221.188.20`. * You can also use `https://` and `https://` (if configured). To get the [Orka domain](/orka/networking-with-orka-at-macstadium/built-in-orka-domains) for your Orka cluster, [contact MacStadium support](https://portal.macstadium.com/login). To use an external custom domain, see [here](/orka/networking-with-orka-at-macstadium/external-custom-domains). Note that you can use `http://`, `https://`, and `https://` interchangeably in your workflows. Orka UI login page in browser ## 4. Create and Deploy Your First VM Instance **Known limitations** The Orka Web UI works only in the `orka-default` namespace. The Orka Web UI does not let you deploy VM instances without a VM configuration. The Orka Web UI works only with images stored locally in the cluster or stored in the remote repository. You cannot deploy VMs using images from OCI-compatible registries. 1. In the sidebar, click **Nodes**. This page provides information about the current state of your nodes, including the available resources. Orka UI Nodes page showing available resources 2. In the sidebar, click **Images**. You will likely see one or more macOS images listed. MacStadium pre-built images come with an admin user configured and SSH and Apple Screen Sharing access enabled. 3. In the sidebar, click **VM Configs**. If this is your first time using Orka, you will get a blank screen. 4. On the **VM Configs** page, click **Create config** and fill in the form: * **Name:** Set any user-friendly name that will help you recognize the VM. * **Base image:** Select an available macOS image from the list. (Note that the settings in the dialog change based on the selected image type.) * **CPU:** Set to 3. This is the number of CPUs for the VM. * **vCPU:** Set to 3. Unless the CPU is 3, it must be half of or the exact number of CPUs. This denotes if hyperthreading is enabled. For example, if the vCPU equals CPU, hyperthreading is enabled. * **Memory (G):** Leave blank. Orka automatically assigns memory when this field is empty. If you provide a value, it overrides the default and allocates the specified amount. **VM name requirements:** The name must not exceed 38 characters, must contain only lowercase alphanumeric characters (0-9, a-z) and dashes (-), and must begin and end with an alphanumeric character. Create VM config form with name, image, CPU, and vCPU fields This creates a VM config. 5. On the **VM Configs** page, select your newly created template and click **Deploy config**. Make sure that your template is selected and click **Deploy**. Wait for the loading UI at the bottom of the dialog to complete. A success message should pop up at the top of the screen. This deploys a VM instance from your template. 6. Go to the **VMs** page. Now that you have deployed your first VM instance, you will see it in the list. Orka UI VMs page listing deployed VM instances with connection info This screen shows essential connection information about your VM. 7. Go to the **Nodes** page again. Did the number of available resources change? ## 5. Experience Your VM Instance 1. Return to the **VMs** page and click the **Connection** button for your VM. VM connection popup showing VNC URL and port 2. Launch Apple Screen Sharing on your local machine (In **Finder**, press `Cmd+K`). In the **Connect to Server** dialog, paste the information from the pop-up. (`vnc://10.221.189.13:5903` in the example above). This step works only on macOS. On Linux or Windows, launch your preferred VNC client and connect to `:`. One more thing to remember is that Screen Sharing must already be enabled within your macOS VM. This is usually not the case (especially on clean OS installs or after an ISO install (Intel only)), and you must enable the setting yourself. This also applies to SSH connectivity. The good news is that MacStadium pre-built images are already preconfigured for you, and you can enjoy out-of-the-box Screen Sharing and SSH connectivity. If you're using a custom image or installing from ISO (Intel only), SSH and Screen Sharing are not enabled by default. Connect via VNC first, then enable them in the OS. 3. When prompted by Apple Screen Sharing, provide the credentials for the VM (`admin/admin`). You will be prompted for the password again when Apple connects to the VM. 4. On the VM, launch **System Settings** > **Users & Groups**. Select the **Admin** user and click **Change password**. Set the `Admin` user password to whatever works for you. 5. (Optional) Launch the Terminal application and run the following command. If Orka VM Tools is not yet installed: ```bash theme={null} brew install orka-vm-tools ``` If Orka VM Tools is already installed and needs updating: ```bash theme={null} brew upgrade orka-vm-tools ``` This action ensures that your VM is running the latest version of the [Orka VM Tools](/orka/orka-resources/vm-tools). This collection of services lets Orka manage the guest operating system on Apple silicon-based VMs more efficiently and enables vital features, such as [shared VM storage](/orka/orka-resources/shared-vm-storage). If your cluster is not running the latest Orka version, download and install an [Orka VM Tools](/orka/orka-overview/tools-integrations) that matches the version of your cluster. 6. Always apply the latest OS updates and restart the VM. ## 6. Create a New Base Image Changing the configuration or the file system of a running VM does not affect its base image. As soon as you delete the VM, your changes will be lost, and you will need to recreate them manually on other VMs. You can save the changes as a new image to create changes that stick and appear on future deployments. This operation restarts the VM. After it completes, you need to create a new VM config that references the new image before you can deploy from it. 1. Return to the Web UI. On the **VMs** page, select your VM. Select **More** > **Save as new image**. VM More menu with Save as new image option highlighted 2. Provide a name for the new image and click **Save**. Save as new image dialog with name input field Wait for the operation to complete. It might take a while. There is no progress indicator, but the operation runs in the background. When the operation completes, the dialog closes, and a success notification appears. 3. After the operation completes, go to the **Images** page. Did your new image appear there? To use your newly created image, you need to create a new VM config that references it. ## 7. Delete VMs *This section is optional.* When your VM configs and instances have served their purpose, you can remove them. Deleting a VM instance always preserves the original VM config, and you can deploy new instances from it at any time. * On the **VMs** page, select your VM. Select **More** > **Delete**. When prompted, confirm that you want to delete the VM. VM More menu with Delete option highlighted When the page refreshes, you should not see any more VM instances. Your VM config is still available on the **VM Configs** page, and you can deploy new instances from it. Note that the changes you made to your deleted VM instance will not be present on newly deployed instances. ## Next Steps * [CI/CD Integrations Quick Start](/orka/quick-start-guides/cicd-integrations-quick-start): automate VM deployment in your build pipeline * [Orka VM Tools](/orka/orka-resources/vm-tools): enable shared storage and additional features on Apple silicon VMs * [Tools and Integrations](/orka/orka-overview/tools-integrations): browse available integrations # MacStadium Cloud Access with Teradici PCoIP Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/cloud-access Cloud Access delivers low-latency remote macOS desktops powered by Teradici PCoIP. Designed for video editing, game development, and creative workloads. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). With low latency, color accuracy, and distortion-free graphics, MacStadium's Cloud Access, [powered by Teradici](https://www.teradici.com/pcoip-technology/what-is-pcoip), lets you use the full capabilities of macOS for graphics-intensive workloads on Macs in the cloud that perform as if they were within arm’s reach. Cloud Access offers a unique opportunity for your team to work on top-of-the-line macOS machines that can be accessed securely from anywhere -- whether that means the home office, a mobile media lab, or anything in between. ### Suggested use cases * Video and Entertainment * Game Development * Secure macOS Workstations * Remote Development Environment ## Cloud Access features ### Encrypted connection With Cloud Access, your data will never leave the highly secure MacStadium cloud -- only the encrypted pixels from the remote machine are transferred over the network to a user's local workstation, which means your data is truly secure. ### Extremely low latency Industry-leading, lossless image compression technology delivers a user experience that feels as though your cloud-hosted Mac is physically at your local workstation. ### Audio support Cloud Access features full audio support for Macs hosted in the cloud, unlike traditional VPN solutions. ### Multi-Monitor support Cloud Access hosted by MacStadium supports a maximum of four displays at a maximum resolution of 4K UHD (3840×2160). If you are using a monitor that has more than 3840 pixels in either dimension, you must scale your display to 3840x2160 or lower before launching the PCoIP Client. ### MFA integration You can set up and configure MFA for your end users to safely and securely authenticate over VPN into your MacStadium environment. ### Using Jamf with Cloud Access Yes, you can manage your Cloud Access machines using Jamf. Currently manual enrollment is the only method to integrate your machines into Jamf. MacStadium is reviewing automation so that admins can more easily enroll machines into Jamf MDM. ### USB Passthrough Teradici does not currently support USB passthrough. ### Disabling copy/paste As an admin, you can enable or disable security settings at the keyboard level, such as disabling copy/paste for end users so they are restricted from moving data off the secure Cloud Access machines. ### Working from home with low performance endpoint devices When using a home PC or laptop with a PCoIP Software Client for macOS or Windows, Teradici recommends at least a 1.6 GHz dual-core Intel Core i5 processor (2011 era or newer) with 4 GB of RAM or higher for dual 1080p displays. Some thin clients or endpoint devices with Ubuntu 18.04 and PCoIP Linux Client 2020.04 can take advantage of PCoIP Ultra GPU Optimizations. For information on configuring the PCoIP Client H.264 hardware decoder, see [Configuring H.264 hardware decode in the PCoIP client](https://www.teradici.com//web-help/pcoip_client/linux/23.01/configuration/h264_hardware_decode/). Once configured, this provides improved network bandwidth efficiency and higher frame rates even with limited CPU performance. # Cloud Access Customer Environment Tips Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/cloud-access-customer-environment-tips Tips for MacStadium Cloud Access (HP Anyware/PCoIP): network setup, TCP/UDP 4172 port requirements, latency reduction, and when to escalate to support. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). Cloud Access, powered by [HP Anyware](https://anyware.hp.com/), enables secure, high-performance remote access to dedicated macOS systems hosted by MacStadium. This guide outlines how you can optimize connection quality and reduce latency when connecting to your MacStadium host. ### Network and Connectivity **Goal:** Maintain a stable, low-latency connection to your remote Mac. * Use a wired Ethernet connection whenever possible. Wi-Fi interference often causes pixelation or dropped sessions. * Avoid hotel, guest, or captive Wi-Fi networks that may throttle UDP traffic. * Confirm that your network allows TCP 4172 and UDP 4172, which HP Anyware uses for the PCoIP protocol. * If you are on a corporate network, ask your IT team to whitelist these ports or exclude them from VPN tunnels. * Disable VPNs, packet-inspection firewalls, or content-filtering software during testing if frequent disconnects occur. * Restart your modem or router if you notice high latency or inconsistent throughput. If performance remains unstable after checking these items, record the time of the issue and contact MacStadium Support for network-path diagnostics. ### Display and Performance **Goal:** Preserve image clarity and minimize lag while using macOS remotely. * Start with your local display set to 1080p or lower; 4K or Retina scaling requires greater bandwidth. * When troubleshooting, connect with a single monitor. Multiple displays increase GPU and network load. * In the HP Anyware Client preferences, select H.264 for best overall compatibility with macOS hosts. * Close background apps that use bandwidth such as streaming, video calls, or large downloads. * If you encounter a black or frozen screen, end the session, wait 30 seconds, then reconnect. If the issue continues, MacStadium Support can verify the host's virtual display configuration. ### Session Stability and Timeouts **Goal:** Avoid unplanned session interruptions or idle timeouts. * To end your session, close the HP Anyware client window. Do not use the macOS **Log Out** option from within the session. Logging out of macOS breaks the remote display state and prevents future PCoIP connections until the host is rebooted. * Stay active within your session; extended inactivity may trigger an automatic disconnect. * If disconnected unexpectedly, reconnect within one to two minutes; your macOS session usually remains active. * If the HP Anyware Client re-prompts for credentials after a disconnect, note the message and contact Support. * Keep the Client window open if stepping away briefly. Frequent reconnects in short intervals can create session conflicts. ### Client Software and Updates **Goal:** Maintain compatibility between the HP Anyware Client and the macOS agent. * Download the latest Client for your platform at [https://www.hpanyware.com/downloads](https://www.hpanyware.com/downloads). * Avoid beta or outdated versions; macOS agents are maintained on current release tracks. * Restart your local computer periodically to clear cached network sessions. * If switching between Wi-Fi and Ethernet, reconnect the Client to re-establish the PCoIP session. * Include your Client version and OS type (for example, Windows 11 v24.06 Client or macOS 14.5 Client) in any Support request. ### Common Symptoms and Recommended Actions | Symptom | Likely Cause | Recommended Action | | ------------------------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Screen remains black or frozen | macOS host display adapter not initialized | End session and reconnect; if persistent, MacStadium Support can refresh the host display service | | Image quality drops or becomes blocky | Network congestion or limited bandwidth | Run a speed test at [https://www.speedtest.net](https://www.speedtest.net); share results with Support | | Repeated disconnects | VPN or firewall interference | Try wired Ethernet or temporarily disable VPN | | Session ends after idle time | Broker timeout policy | Reconnect and report if the timeout seems unusually short | | "Unable to connect to agent" | macOS host agent service offline | Contact Support with the timestamp and error text | | Error 6405 | PCoIP agent failed to launch remote session | Reboot the host; if the error followed a macOS logout within the session, a reboot is required to restore access. See [Cloud Access Troubleshooting](/remote-desktop-vdi/cloud-access-legacy/cloud-access-troubleshooting) | ### Need Help? Contact [support@macstadium.com](mailto:support@macstadium.com) to open a ticket. For host-side troubleshooting, error codes, diagnostic steps, and what to include in your ticket, see [Cloud Access Troubleshooting](/remote-desktop-vdi/cloud-access-legacy/cloud-access-troubleshooting). # Cloud Access troubleshooting Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/cloud-access-troubleshooting Troubleshoot MacStadium Cloud Access connection issues: 6405 errors, MDM firewall conflicts, latency diagnosis, and session end guidance for HP Anyware PCoIP. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). ## Ending a session correctly Close the HP Anyware client window to end your session. Don't use the macOS **Log Out** option from within the session. Logging out of macOS breaks the remote display state and prevents future PCoIP connections until the host is rebooted. If you previously ended a session by logging out of macOS and can no longer connect, reboot the host to restore access. ## Known issues **Agent versions 22.07 through 23.12.0: reduced bandwidth** These versions contain a bug that significantly reduces the bandwidth the PCoIP Graphics Agent uses. Upgrade to a later agent version to resolve it. Download the latest release from [HP Anyware](https://anyware.hp.com/). **Agent version 26.01.0: first connection after reboot always fails** Version 26.01.0 contains a bug where the first PCoIP connection attempt after any host reboot fails. Retrying the connection immediately succeeds. This bug is fixed in version 26.01.1 and later. Upgrade to at least 26.01.1 to avoid this behavior. **Switching users is not supported** A bug introduced before version 23.12.2 prevents user switching. If an administrator account logs in and exits, a second user attempting to access a different account will see a 6405 error. Avoid logging out if multiple accounts share a device across shifts. Reboot the host to recover. **MDM authentication conflicts** Jamf Connect and other MDM SSO, MFA, or authentication methods can conflict with the PCoIP agent's authentication database when both attempt to take priority. Reboot the host, or reinstall the PCoIP agent if the conflict persists. ## MDM and firewall configuration If your organization manages host machines with an MDM solution, MDM profiles can override settings that PCoIP requires. ### Apple Firewall re-enabled by MDM MDM solutions typically push firewall policy on a recurring check-in schedule (often every 30 minutes). If your MDM enforces the Apple Firewall, disabling the firewall manually won't hold, because the MDM will re-enable it on the next check-in. The correct fix is to keep the firewall enabled and add explicit PCoIP application exceptions. Unlike a blanket firewall disable, application exceptions survive MDM check-ins. Run the following commands on the host to add the exceptions: ```bash theme={null} sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "/Applications/PCoIP Agent/pcoip-agent" sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp "/Applications/PCoIP Agent/pcoip-agent" ``` To confirm the exception is set: ```bash theme={null} sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps | grep -i pcoip ``` ### Energy settings reverted by MDM Some MDM configurations disable **Wake for network access** and **Start up after power failure** on macOS hosts. If these settings are turned off, a host that goes to sleep becomes unreachable until someone physically wakes it or reboots it. If you see these settings reverting after you enable them, your MDM policy is overriding them. Contact your MDM administrator and request an exception for machines running in a data center, where remote wakeability is required for normal operation. Energy settings affect whether a sleeping machine can be reached. They have no effect on the quality or speed of an already-active PCoIP session. If your machine is reachable and connected, energy settings are not the source of latency. ## 6405 error A 6405 error means the PCoIP agent failed to launch a remote session. Rebooting the host resolves most 6405 errors. Before rebooting, check whether FileVault is enabled: ```bash theme={null} fdesetup status ``` If FileVault is enabled, reboot using an authenticated restart to avoid a pre-boot password prompt: ```bash theme={null} sudo fdesetup authrestart ``` If you can't SSH in, use Screen Share or VNC to access the host and reboot from there. ### Specific causes **macOS logout within the session** If a user logs out of macOS from within the PCoIP session (using the Apple menu Log Out option), the remote display state is broken. Future PCoIP connections will fail until the host is rebooted. Resolution: reboot the host. **Screen Share or VNC session is active** An active Screen Share or VNC session blocks PCoIP connections. PCoIP is a 1-to-1 protocol and can't establish a session while another remote display connection is open. Resolution: disconnect all Screen Share and VNC sessions, then retry PCoIP. If you use Screen Share to troubleshoot, always disconnect (don't just close the window) before the user attempts to reconnect via PCoIP. **Dialog box open on the remote desktop** If a dialog box is open on the remote machine's desktop (for example, a system prompt triggered by an MDM profile applying, a screensaver password dialog, or an app alert), the PCoIP agent can't establish a new session. Resolution: connect via Screen Share, dismiss the dialog, disconnect Screen Share, then retry PCoIP. **Switching users** If multiple accounts exist on the same Mac and a user closes their PCoIP session while still logged in to macOS, a second account can't log in. The agent can't switch accounts, which appears as a 6405 error. Resolution: reboot the host, or connect via Screen Share and select **Log Out** or **Switch User**, then retry PCoIP. The second attempt may be needed before access is granted. **Multiple users attempting the same machine** If a device is already in use and a second user tries to connect, they'll receive a 6405 error. PCoIP is a 1-to-1 connection. Confirm no one else is using the device before connecting. In rare cases a persistent 6405 error remains even after the active user disconnects. Resolution: reboot the host. **Graphics agent crash** In rare cases the PCoIP Graphics Agent crashes. Resolution: reboot the host, or connect via Screen Share and relaunch the PCoIP agent from Applications. **Adding a new profile without rebooting** If a new macOS user profile is created on the host and the host isn't rebooted afterward, the PCoIP agent can't launch on that profile. Resolution: reboot the host. **Unstable connection** If the network connection drops before the PCoIP session is fully torn down, the agent may be left in a state that returns a 6405 on the next connection attempt. Resolution: wait a few minutes for the session to time out, or reboot the host. ## Poor connectivity and latency ### Expected latency by location PCoIP session quality depends heavily on the round-trip time (RTT) between your client machine and the host. The following table shows typical RTT ranges by location relative to MacStadium's Atlanta data center. | Client location | Typical RTT | | ------------------ | ----------- | | Atlanta area | Under 50 ms | | Continental US | 50–100 ms | | Europe | 120–180 ms | | India / South Asia | 200–300 ms | Connections from India or other international locations will have a latency floor in the 200–300 ms range due to physical distance. This is expected and can't be reduced through host-side configuration. If your users are connecting internationally and find PCoIP sessions too slow to work in, consider requesting a host in MacStadium's Dublin data center to reduce round-trip distance. Use the HP Anyware client (PCoIP) rather than macOS Screen Share for remote work sessions. PCoIP is optimized for high-latency, low-bandwidth connections and provides a significantly better experience than Screen Share over long distances. ### PCoIP session statistics The HP Anyware client includes a built-in statistics panel that shows real-time session metrics. This is the most direct way to diagnose PCoIP session quality. To open it: in the HP Anyware client, go to **Connection** > **Show Statistics** (or press **Shift+Ctrl+Alt+S** on Windows, **Shift+Cmd+Alt+S** on Mac). The statistics panel shows: * **Round-trip time (RTT):** end-to-end latency between your client and the host * **Packet loss:** percentage of packets lost in each direction * **Bandwidth:** current transmit and receive throughput * **Codec:** the image codec in use Share a screenshot of this panel when opening a support ticket for latency issues. It gives the support team the data needed to assess whether the issue is on the network path, the host, or the client. ### Traceroute A traceroute shows the network path between your client machine and the host, including the latency at each hop. Run a traceroute when you suspect a specific network segment is causing latency or packet loss. If your host is on a private subnet behind a MacStadium firewall, connect to the VPN before running the traceroute. Without it, you'll only be able to trace to the public firewall IP rather than the host itself. On Windows, open Command Prompt and run: ``` tracert [HOST_IP] ``` On Mac or Linux, open Terminal and run: ```bash theme={null} traceroute [HOST_IP] ``` Replace `[HOST_IP]` with the IP address of your host. If the host is behind a firewall and VPN isn't available, use the public IP address of the firewall instead. Paste the full output into your support ticket. The output shows each hop, its IP, and the RTT at that hop. Hops with high RTT or timeouts indicate where latency is being introduced. Example output (IPs redacted): ``` traceroute to 208.52.182.247 (208.52.182.247), 64 hops max, 52 byte packets 1 10.0.0.1 8.914 ms 2.984 ms 2.059 ms 2 * * * 3 * * * 4 * * * 5 * * * 6 * * * 7 * * * 48.276 ms 8 * * * 45.972 ms 9 * * * 122.881 ms 10 * * * 177.364 ms 11 208.52.182.247 180.874 ms 209.880 ms 88.599 ms ``` ### Speed test If the traceroute doesn't reveal a specific problematic hop, run a speed test from your client machine to check available bandwidth. Open a browser and go to [speedtest.net](https://www.speedtest.net) and run the test. For PCoIP sessions, download speeds of at least 10 Mbps and upload speeds of at least 5 Mbps are generally sufficient for standard desktop use. Higher-resolution or graphically intensive sessions may require more bandwidth. Share the speed test results with MacStadium support alongside the traceroute output. ## When to contact MacStadium support MacStadium support can intervene on the macOS host side for: * Sessions that repeatedly fail to connect or drop after a few seconds * A display that remains blank after multiple reconnects * "Agent unreachable" or "Connection refused" messages * Login succeeds but the desktop never renders * A recent macOS update, reboot, or sleep state appears to have interrupted access ## What to include in your ticket * Approximate time and timezone of the failure * Any error messages shown in the HP Anyware Client * Your Client OS and version * A screenshot of the HP Anyware session statistics panel. Open it from **Connection > Show Statistics** in the client (Windows: Shift+Ctrl+Alt+S, Mac: Shift+Cmd+Alt+S). It shows real-time RTT, packet loss, and bandwidth, and helps support diagnose whether the issue is on the network path or the host. * A short description of what you were doing when the issue occurred Submit tickets to [support@macstadium.com](mailto:support@macstadium.com). ## Quick checklist before opening a ticket * Verify your internet speed (10 Mbps minimum, 25 Mbps recommended) * Try a wired connection if on Wi-Fi * Update to the latest HP Anyware Client * Note the exact error message and time of occurrence ## Related * [Cloud Access Customer Environment Tips](/remote-desktop-vdi/cloud-access-legacy/cloud-access-customer-environment-tips) # Connect to Your Cloud (SSH) Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-ssh Enable SSH access on your MacStadium ESXi host by starting the TSM-SSH service from the embedded host client. Supported on ESXi 6.0 Update 2 and later. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). MacStadium understands that your workflow shouldn't need to be retooled to use our infrastructure as a service. To that end, we also offer simple connections to your private cloud via SSH. ## Prerequisite ESXi server running version 6.0 U2 or later as well as a local computer with a web browser and SSH client.\* 1. Navigate to your ESXi server’s embedded host client using the IP address or domain name. 2. Enable SSH Screen 1 3. Select Manage in the left sidebar Navigator to access the settings for your host 4. Enable SSH Screen 2 5. Select the Services tab. 6. Enable SSH Screen 3 * There are two services we’ll pay attention to here: **TSM** (ESXi Shell) and **TSM-SSH** (SSH), with the latter being our main goal. 7. Highlight the **TSM-SSH service (SSH)** and either right-click or use the menu item at the top of the window to select Start. 8. Enable SSH Screen 4 * If you’d like to use the ESXi Shell remotely over SSH, go ahead and complete the same process for the TSM service. * If you’re only granting temporary access and will either stop the service manually after use or you wish for the service to be off when you next restart ESXi or the server, you can stop here. * If you’d like SSH (or SSH and the ESXi Shell) to remain on and persist through reboots, continue to the next step. 9. Persistent SSH access across ESXi host reboots 10. By right-clicking on a service or clicking the Actions menu item, you can adjust the policy for the service. This means you can set the service to remain on based on firewall ports or with the host and after restart. # Connect to Your Cloud (via VPN) Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-via-vpn Connect to your MacStadium cloud via VPN using credentials from your IP Plan. Covers Cisco AnyConnect setup and step-by-step connection instructions. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). After signup, an IP Plan is sent, which contains all the information for setup and configuration access to the cloud environment. The recommended method of access is via a Virtual Private Network (VPN), which provides an easy to implement and secure connection. ## (Open-source option) OpenConnect CLI users, should use [OpenConnect](https://www.infradead.org/openconnect/index.html) - an open-source VPN client available from the command line. ## Download and install OpenConnect * If [Homebrew](https://brew.sh/) is installed, then run `brew install openconnect` from the command line. * If Windows is running, then [download](https://www.infradead.org/openconnect/download.html) and [build](https://www.infradead.org/openconnect/building.html) the OpenConnect package; or use Cisco AnyConnect instead. Cisco firewalls are designed to work with the [Cisco AnyConnect Secure Mobility Client](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/tsd-products-support-series-home.html) as a VPN client. Users who want a GUI VPN client or are running Windows, should use Cisco AnyConnect. ## Download AnyConnect If a VPN client is needed, then MacStadium recommends [Cisco AnyConnect](/remote-desktop-vdi/cloud-access-legacy/setup-vpn-using-cisco-anyconnect). 1. Open the IP Plan from MacStadium Portal > account menu > Files. 2. Open the file and locate the VPN Server section. 3. From the browser, visit `https://`. * **NOTE:** Firefox may be needed to get past the self-signed certificate blocker. 4. When prompted, provide the VPN credentials from the IP Plan. After logging in, download a licensed version of AnyConnect directly from the firewall. ## Setup Process 1. Log in using the username and password given to you in your IP Plan. 2. Cisco AnyConnect SecureMobility will then check to see if your personal computer has Java installed. If it is installed, Java will be used. If not, you will be given a direct download link. Simply click the link to begin the download and subsequent installation process. 3. Follow the installation prompts to complete the install. 4. Once installation has completed: * Select Settings * Uncheck “Block connections to untrusted servers,” as the Cisco ASA appliance by default will be using a self signed certificate. 5. From the main screen, enter the IP Address provided in your IP Plan, and click connect. 6. Finally, to connect to your private MacStadium Cloud, simply enter your username and password once more. # Connect to Your Cloud (Windows) Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/connect-to-your-cloud-windows The Cisco VPN client for Windows is now deprecated. If you need to connect to your MacStadium cloud from a Windows machine, you can use the free Shrew. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). The Cisco VPN client for Windows is now deprecated. If you need to connect to your MacStadium cloud from a Windows machine, you can use the free Shrew Soft VPN client instead. 1. Go to the Shrew Soft Inc. website at [https://www.shrew.net/download/vpn](https://www.shrew.net/download/vpn) and download the VPN client for Windows. * **NOTE**: Although OS Support indicates 2K/XP/Vista/7/8, MacStadium has verified that the client works with Windows 10 as well. 2. Run the installer and follow the prompts. When asked, select Standard Edition. 3. After the installation completes, find and run the VPN Access Manager. 4. Click Add+\\ Shrew Soft VPN Access Manager with Add button highlighted 5. Enter the IP address of your firewall WAN IP.\\ Shrew Soft VPN site configuration with firewall WAN IP address field 6. Go to the Authentication tab. From the Authentication Method drop-down menu select Mutual PSK + XAuth. 7. On the Local Identity sub-tab, in the FQDN String text box, enter your group authentication name.\\ Shrew Soft Local Identity tab with FQDN String field for group authentication name 8. On the Credentials sub-tab, in the Pre Shared Key text box enter your group authentication password. Click Save.\\ Shrew Soft Credentials tab with Pre Shared Key field 9. On the home screen, select the now available VPN.\\ Shrew Soft VPN Access Manager home screen with new VPN listed 10. When prompted, enter your VPN credentials and click Connect.\\ Shrew Soft VPN showing Tunnel enabled status after successful connection 11. When you see Tunnel enabled, you are connected to the VPN. # Getting Started with Cloud Access Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/getting-started-with-cloud-access Install the HP Anyware PCoIP Cloud Access client and connect to your MacStadium Mac. macOS .dmg install; credentials are provided in your service ticket. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). ## Installing the Cloud Access Client First, you'll need to [download](https://anyware.hp.com/downloads) and install the HP Anyware PCoIP client on your local machine. To do so, simply follow the above link and download the .dmg file onto your local machine. Then, to complete the installation, drag the PCoIP Client icon into the applications folder, and double click to execute the install. HP Anyware PCoIP client installer dragged into Applications folder Agree to the user license agreement, and click install. ## Connecting to Your Mac Your required credentials will be provided in the [service ticket](https://portal.macstadium.com/) describing your Cloud Access deployment. HP Anyware PCoIP client connection screen with server address field # Setup VPN using Cisco AnyConnect Source: https://docs.macstadium.com/remote-desktop-vdi/cloud-access-legacy/setup-vpn-using-cisco-anyconnect Set up Cisco AnyConnect SecureMobility to access your MacStadium Private Cloud via VPN. Uses server address and credentials from your IP Plan. **Cloud Access is no longer sold directly by MacStadium.** Renewals are supported, but new customers should purchase [HP Anyware](https://anyware.hp.com/) directly. This documentation is preserved for existing customers. For remote macOS access, see [MacStadium VDI](/remote-desktop-vdi/overview/prerequisites). Questions? Contact [support@macstadium.com](mailto:support@macstadium.com). Upon signup, you will receive an IP Plan that contains all the information you will need to configure access to your cloud environment. The simplest and recommended method of gaining access is via a Virtual Private Network (VPN). This provides an easy to implement, secure connection. We highly recommend the [Cisco AnyConnect SecureMobility](https://www.cisco.com/c/en/us/support/security/anyconnect-secure-mobility-client/series.html) as a means of gaining access to your Mac Private Cloud. ## Setup Process 1. Log in using the username and password given to you in your IP Plan. 2. Cisco AnyConnect SecureMobility will then check to see if your personal computer has Java installed. If it is installed, Java will be used. If not, you will be given a direct download link. Simply click the link to begin the download and subsequent installation process. 3. Follow the installation prompts to complete the install. 4. Once installation has completed: * Select Settings * Uncheck “Block connections to untrusted servers,” as the Cisco ASA appliance by default will be using a self signed certificate. 5. From the main screen, enter the IP Address provided in your IP Plan, and click connect. 6. Finally, to connect to your Mac Private Cloud, simply enter your username and password once more. # Advanced configuration Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/advanced-configuration Advanced MacStadium VDI setup: bridged networking, HDX tuning, resource allocation, Ansible extensions, CI/CD integration, and multi-tenant config. This page covers advanced configuration topics for production MacStadium VDI environments. These are optional enhancements beyond the initial deployment. You don't need them to get started, but they unlock performance, scale, and automation capabilities. ## Performance optimization ### Bridged networking configuration When using bridged networking, VMs connect directly to your physical network as native devices, receiving their own IP address from your network's DHCP server. This enables direct communication with other network devices without NAT. **Requirements:** * A working DHCP server on your network that can assign IPs to VMs * Sufficient IP addresses in your subnet (one per VM) * All existing VMs must be deleted before switching modes * MacStadium VDI running Orka Engine 3.5+ **Important limitations:** * You cannot run NAT and bridged networking simultaneously * All VMs in your cluster must use the same networking mode * Switching modes requires deleting all VMs first **CVAD (on-prem Citrix) deployments require bridge networking for VDA enrollment.** Without it, VMs receive NAT IPs (192.168.64.x) that the Citrix Delivery Controller cannot reach for enrollment, unless custom port-forwarding is configured on the customer side. For Citrix DaaS or Workspace/VDA testing without CVAD, NAT mode is sufficient. **Configuration:** Bridged networking is configured in your MacStadium VDI cluster configuration files before deploying VMs. **Step 1: Configure cluster-wide bridge mode** Edit `cluster.yml` on your MacStadium VDI management node: ```yaml theme={null} vm_network_mode: bridge ``` **Step 2: Configure host network interface** Specify which physical network interface on your Orka hosts connects to your DHCP-enabled network. Option A: Same interface on all hosts. Edit `nodes.yml`: ```yaml theme={null} osx_node_vm_network_interface: en0 # or vlan0, en1, etc. ``` Option B: Different interfaces per host. Edit your `hosts` inventory file: ```ini theme={null} [arm-nodes] 10.221.188.30 osx_node_vm_network_interface=vlan0 10.221.188.31 osx_node_vm_network_interface=vlan1 10.221.188.32 osx_node_vm_network_interface=en0 ``` To determine the correct interface, SSH to each Orka host and check: ```bash theme={null} ssh admin@10.221.188.30 "ifconfig | grep -E '^[a-z]|inet '" ``` Look for the interface with an IP in your corporate network range. **Step 3: Delete all existing VMs** You cannot switch networking modes with VMs running. Delete all VMs before proceeding. ```bash theme={null} ansible-playbook -i inventory list.yml ansible-playbook -i inventory delete.yml -e "vm_name=" ``` *Run the delete command once for each VM.* **Step 4: Apply configuration changes** ```bash theme={null} ansible-playbook -i inventory configure-hosts.yml ``` **Step 5: Deploy VMs with bridged networking** ```bash theme={null} ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` **Step 6: Verify VMs received DHCP addresses** ```bash theme={null} ansible-playbook -i inventory list.yml ``` VMs should show IP addresses from your corporate network range, not `192.168.64.x`. **Troubleshooting bridged networking:** If VMs have `192.168.64.x` addresses instead of corporate IPs, bridge mode isn't configured correctly: 1. Verify `vm_network_mode: bridge` is set in `cluster.yml` 2. Verify `osx_node_vm_network_interface` is set correctly in `nodes.yml` or `hosts` 3. Confirm the interface name is correct: SSH to host and run `ifconfig` 4. Rerun host configuration: `ansible-playbook -i inventory configure-hosts.yml` 5. Delete and redeploy affected VMs If VMs can't reach network services after getting DHCP addresses, verify your DHCP server provides valid gateway and DNS settings: ```bash theme={null} ssh admin@ "route -n get default" ssh admin@ "cat /etc/resolv.conf" ``` For complex bridged networking issues, contact [MacStadium Support](mailto:support@macstadium.com). *** ### HDX tuning for latency-sensitive workloads For users editing video, audio, or using graphics-intensive applications who report lag or stuttering: **1. Enable Adaptive Transport (Framehawk) for high-latency connections:** Citrix Cloud Console → Policies → Create new policy → HDX Adaptive Transport → set "Adaptive Transport" to "Preferred" → apply to affected Delivery Groups. **2. Adjust visual quality settings:** For users on high-bandwidth connections: Policies → Visual Display → Visual Quality → "Build to Lossless" For users on low-bandwidth connections: Policies → Visual Display → Visual Quality → "Medium" **3. Enable GPU acceleration (M4 Macs):** M4 Macs support GPU passthrough for VMs. Requirements: Orka 3.5+, macOS 15.5+ on the host, specific VM configuration. GPU acceleration is not yet automated in the Orka Engine Ansible playbooks. Contact MacStadium support for GPU-enabled VM deployment guidance. **4. Test with Citrix HDX Monitor:** Download the [Citrix HDX Monitor tool](https://cis.citrix.com/hdx/download/) to identify bottlenecks: network latency, bandwidth constraints, and frame rate drops. Use results to fine-tune HDX policies further. *** ### Resource allocation (CPU, memory, storage) Default VM resources are inherited from the golden image, typically 4 CPU cores, 8 GB RAM, 90 GB storage. To change resources, modify the VM configuration and create a new golden image: ```bash theme={null} # SSH into the Orka node ssh admin@10.0.100.10 # Stop the VM orka-engine vm stop # Resize (6 CPU cores, 16 GB memory) orka-engine vm resize --cpu 6 --memory 16 # Start the VM orka-engine vm start ``` Then create a new golden image from the resized VM: ```bash theme={null} ansible-playbook -i inventory create_image.yml -e "vm_image=" -e "remote_image_name=registry.example.com/citrix-vda/sonoma-highspec:v1.0" ``` Recommended high-spec configuration for power users: 8+ CPU cores, 32 GB RAM, 500 GB storage. Overprovisioning resources reduces VM density on hosts. Monitor host utilization to ensure you're not running fewer VMs than capacity allows. *** ## Automation enhancements ### Extending Ansible playbooks The [orka-engine-orchestration](https://github.com/macstadium/orka-engine-orchestration) playbooks provide core functionality. Common extensions include: **Automated image update workflow:** ```yaml theme={null} # update-golden-image.yml --- - name: Automated image update workflow hosts: localhost tasks: - name: Deploy test VM command: > ansible-playbook -i inventory deploy.yml -e "vm_name=image-test-01" -e "vm_image=[CURRENT_IMAGE]" - name: Wait for VM to be ready pause: minutes: 3 # Note: OS update installation still requires manual intervention via VNC - name: Create new golden image command: > ansible-playbook -i inventory create_image.yml -e "vm_image=[CURRENT_IMAGE]" -e "remote_image_name=[NEW_IMAGE]" -e "registry_username=[REGISTRY_USER]" -e "registry_password=[REGISTRY_PASS]" - name: Clean up test VM command: > ansible-playbook -i inventory delete.yml -e "vm_name=image-test-01" ``` **Scheduled capacity scaling:** ```bash theme={null} # Scale up at 7 AM weekdays 0 7 * * 1-5 /path/to/scale-up.sh # Scale down at 7 PM weekdays 0 19 * * 1-5 /path/to/scale-down.sh ``` **Health check automation:** ```yaml theme={null} # health-check.yml --- - name: VM health check hosts: hosts tasks: - name: Check VMs are running shell: orka-engine vm list --format json register: vm_list - name: Alert if VMs are down debug: msg: "WARNING: [VM_LIST_STDOUT___FROM_JSON___SELECTATTR'] VMs are not running" when: (vm_list.stdout | from_json | selectattr('status', 'ne', 'running') | list | length) > 0 ``` Schedule this every 15 minutes and pipe output to your monitoring system. *** ### Integrating with CI/CD pipelines Automatically build and deploy updated golden images when application code changes. **Example: GitHub Actions workflow:** ```yaml theme={null} # .github/workflows/deploy-vdi-image.yml name: Deploy Updated VDI Image on: push: branches: [main] paths: - 'app/**' jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build application run: ./build.sh - name: Deploy test VM run: | ansible-playbook -i inventory deploy.yml -e "vm_name=image-test-01" -e "vm_image=registry.example.com/citrix-vda/dev-base:latest" - name: Copy application to test VM run: scp -r ./dist admin@:/Applications/YourApp.app - name: Run automated tests run: ssh admin@ "./run-tests.sh" - name: Create new golden image if tests pass run: | ansible-playbook -i inventory create_image.yml -e "vm_image=image-test-abc123" -e "remote_image_name=registry.example.com/citrix-vda/dev-tools:[GITHUB_SHA]" -e "registry_username=[SECRETS_REGISTRY_USER]" -e "registry_password=[SECRETS_REGISTRY_PASS]" - name: Deploy to production run: | ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-dev-01" -e "vm_image=registry.example.com/citrix-vda/dev-tools:[GITHUB_SHA]" ``` *** ### Scheduled maintenance tasks Use this schedule as a baseline: | Frequency | Tasks | | --------- | --------------------------------------------------------------------------------- | | Daily | Capacity check, VM health check (VMs registered with Citrix) | | Weekly | Review capacity trends, check for macOS updates, review user feedback | | Monthly | Image security patches, Citrix policy review, backup verification | | Quarterly | Major application updates, Citrix VDA updates, DR test, host hardware maintenance | *** ## Multi-tenant considerations ### Isolation strategies **Option 1: Delivery Group separation** Deploy all VMs from shared infrastructure. Separate users into different Citrix Delivery Groups with different policies per group. Simple and resource-efficient, but teams share hardware and one team's resource spike affects others. **Option 2: VM group separation** Deploy separate VM groups per tenant (`citrix-vda-finance`, `citrix-vda-engineering`), each with its own golden image. Groups still share Orka hosts. **Option 3: Host-level separation** Allocate specific Orka hosts to specific tenants: ```ini theme={null} [finance_hosts] mac-node-1 ansible_host=10.0.100.10 mac-node-2 ansible_host=10.0.100.11 [engineering_hosts] mac-node-3 ansible_host=10.0.100.12 mac-node-4 ansible_host=10.0.100.13 ``` Deploy tenant VMs only to their assigned hosts: ```bash theme={null} ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" --limit finance_hosts ``` Complete resource isolation with no noisy-neighbor problems, but reduced flexibility and potential underutilization. *** ### Chargeback and cost allocation Track resources per tenant: ```bash theme={null} # Count finance VMs ansible-playbook -i inventory list.yml | grep citrix-vda-finance | wc -l # Count engineering VMs ansible-playbook -i inventory list.yml | grep citrix-vda-engineering | wc -l ``` Calculate per-VM cost: divide host cost (hardware + MacStadium hosting) by VMs per host, then multiply by VM count per tenant. *** ### Tenant-specific policies Apply different Citrix policies per tenant: 1. Create separate Delivery Groups per tenant 2. Create policies with appropriate settings per tenant (for example, Finance: no clipboard, no file transfer; Engineering: full access) 3. Filter policies by Delivery Group name Each tenant gets appropriate controls without affecting others. # Android virtual devices Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/android-virtual-devices Run Android emulators natively on Apple silicon host nodes alongside MacStadium VDI macOS desktops, with automatic ADB connectivity to your VM. Mobile developers using MacStadium VDI often need Android emulator access alongside their macOS desktop for testing, debugging, or running Android apps in parallel with their Citrix-managed session. Android emulators cannot run inside a macOS virtual machine. The Apple Virtualization Framework does not support nested virtualization, so the emulator has no access to the hardware hypervisor it requires. Running an emulator inside a VM is not a supported path. MacStadium VDI solves this by running the Android emulator natively on the Apple silicon host node, on the same physical machine as your macOS VM. An ADB relay is automatically configured between the host-side emulator and your VM, so your desktop session can reach the Android device over ADB without manual network setup or a third-party emulator service. ## Prerequisites Before setting up Android Virtual Devices, ensure: * MacStadium VDI is deployed and operational (see the [Deployment Guide](/remote-desktop-vdi/getting-started/self-hosted)) * Ansible runner has `sshpass` installed * The target macOS VM is running on a host node where the Android SDK will be installed ## Install the Android SDK Run this on the Ansible runner to install the Android SDK on your host nodes. This installs: * Homebrew (if not already present) * Eclipse Temurin JDK 21 * Android command-line tools, platform-tools, and emulator packages * `socat` (used to set up the ADB relay between the host and your VM) * A `run-avd` script at `/opt/orka/bin/run-avd` It also configures `JAVA_HOME`, `ANDROID_HOME`, and `PATH` in the host's `.zshrc`. ```bash theme={null} ansible-playbook install_android_sdk.yml -i inventory ``` To force reinstallation on hosts where the SDK is already present: ```bash theme={null} ansible-playbook install_android_sdk.yml -i inventory -e "install_android_sdk_force=true" ``` ## Install SDK platforms and system images Once the Android SDK is installed, install the platform and system images you want to use for your AVDs. ```bash theme={null} ansible-playbook sdkmanager_install.yml -i inventory ``` This installs platform `android-35` with `default` and `google_apis` system images by default. To specify a different platform or image types: ```bash theme={null} ansible-playbook sdkmanager_install.yml -i inventory -e "platform=android-34" -e "image_types=default,google_apis,google_apis_playstore" ``` Available variables: * `platform`: Android platform to install (default: `android-35`) * `image_types`: comma-separated list of system image types (default: `default,google_apis`) ## Create an Android virtual device AVDs are tied to a specific VM. The AVD name is derived automatically from the VM name using the pattern `{vm_name}-avd-{index}`, where the index increments for each additional AVD on that VM (for example, `my-vm-avd-0`, `my-vm-avd-1`). Run with `--tags plan` first to preview which host the AVD will be created on: ```bash theme={null} ansible-playbook deploy_avd.yml -i inventory -e "vm_name=my-vm" --tags plan ``` Then create the AVD: ```bash theme={null} ansible-playbook deploy_avd.yml -i inventory -e "vm_name=my-vm" ``` The playbook locates the host running the specified VM, determines the next available AVD index, creates the AVD, and sets up network connectivity between the host-side emulator and the VM. Available variables: * `vm_name` *(required)*: name of the running VM the AVD should be associated with * `platform`: Android platform to use (default: `android-35`) * `image_type`: system image type (default: `default`) * `run_avd`: whether to start the AVD immediately after creation (default: `true`) * `cpu`: vCPUs to allocate to the AVD * `memory`: memory in MB to allocate to the AVD Example with custom settings: ```bash theme={null} ansible-playbook deploy_avd.yml -i inventory -e "vm_name=my-vm" -e "platform=android-34" -e "image_type=google_apis" -e "cpu=4" -e "memory=2048" ``` ## Manage Android virtual devices ### Start, stop, or delete an AVD Use `avd.yml` to bring an AVD to a desired state. The playbook is idempotent - it will not attempt to start an already running AVD, stop an already stopped one, or delete one that does not exist. ```bash theme={null} ansible-playbook avd.yml -i inventory -e "vm_name=my-vm" -e "desired_state=running" ``` Valid values for `desired_state`: `running`, `stopped`, `absent` When only one AVD exists for a VM, it is selected automatically. If multiple AVDs exist, specify which one using `avd_index`: ```bash theme={null} ansible-playbook avd.yml -i inventory -e "vm_name=my-vm" -e "desired_state=absent" -e "avd_index=1" ``` To preview the planned action without making changes: ```bash theme={null} ansible-playbook avd.yml -i inventory -e "vm_name=my-vm" -e "desired_state=running" --tags plan ``` ### List AVDs To list all AVDs across all hosts: ```bash theme={null} ansible-playbook list_avds.yml -i inventory ``` To filter by VM: ```bash theme={null} ansible-playbook list_avds.yml -i inventory -e "vm_name=my-vm" ``` Each AVD is displayed with its host and status. Running AVDs include additional details: PID, gateway IP, and ADB relay port. ### Delete an AVD To delete a specific AVD by index: ```bash theme={null} ansible-playbook delete_avd.yml -i inventory -e "vm_name=my-vm" -e "avd_index=0" ``` If the AVD is currently running, the playbook stops it before deleting. Required variables: * `vm_name`: name of the VM the AVD is associated with * `avd_index`: index of the AVD to delete (for example, `0` for `my-vm-avd-0`) ## Uninstall SDK platforms and system images To uninstall a specific platform and all of its system images from host nodes: ```bash theme={null} ansible-playbook sdkmanager_uninstall.yml -i inventory ``` This uninstalls `android-35` by default. To target a different platform: ```bash theme={null} ansible-playbook sdkmanager_uninstall.yml -i inventory -e "platform=android-34" ``` # Ansible playbook implementation Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/ansible-playbook-implementation Automate Citrix VDA deployment on Orka VMs with Ansible playbooks. Covers inventory, task sequencing, variables, and VM lifecycle operations for macOS VDI. Ansible playbooks automate VM lifecycle operations for Citrix VDA deployment. These are automation scripts written in YAML that define a series of tasks to be executed on remote systems. They describe the desired state of your infrastructure and document the steps needed to achieve it. All playbooks on this page are sourced from the [orka-engine-orchestration](https://github.com/macstadium/orka-engine-orchestration) repository. The **management UI** is the recommended interface for day-to-day playbook execution. It provides a browser-based dashboard with pre-configured task templates for every playbook listed here. The CLI is available for advanced workflows and troubleshooting. See [Getting Started: MSDC-Hosted](/remote-desktop-vdi/getting-started/msdc-hosted) or [Getting Started: Self-Hosted](/remote-desktop-vdi/getting-started/self-hosted) for management UI setup instructions. **How playbooks work:** A playbook contains one or more "plays," each targeting specific hosts and executing a sequence of tasks: 1. **Inventory** defines which hosts to target (for example, the `hosts` group containing your physical Mac machines) 2. **Tasks** specify actions to perform (deploy VM, install software, configure settings) 3. **Variables** customize behavior for different environments or use cases 4. **Handlers** respond to changes (restart services after configuration updates) An example of an inventory file: ``` [hosts] 10.0.0.31 10.0.0.32 10.0.0.33 ``` Playbooks eliminate manual work by automating repetitive tasks, ensuring consistency, rapid recovery, providing audit trails, and simplifying updates. Each task in a playbook runs sequentially, and if any task fails, Ansible reports the error and stops execution, preventing partial deployments. ### Core Ansible Playbook Examples #### VM Deploy ``` # Plan deployment (dry-run) ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-01" -e "vm_image=" --tags plan # Execute deployment ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-01" -e "vm_image=" ``` #### Delete a Single VM ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-abc123" -e "desired_state=absent" ``` #### Delete a VM by Name ``` # Plan deletion (dry-run) ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-test-01" --tags plan # Execute deletion ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-test-01" ``` *Run this command once for each VM to remove.* To delete a VM on a specific host, use: ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-abc123" -e "desired_state=absent" --limit 10.0.100.10 ``` Create backup file(s) before deleting a VM Note: This implementation does not have a dedicated backup Ansible playbook. To preserve VM configurations: 1. Use `create_image.yml` to create versioned images 2. Store images in your OCI registry 3. To restore: Deploy new VMs from the backed-up image version **VM deletion playbook workflow:** 1. Deletes VM from Orka Engine 2. Frees up resources on host #### Create a VM Image `create_image.yml` is the primary way to build a golden image for your VDI fleet. It deploys a temporary VM from a base image, runs your configuration scripts, commits the result to your OCI registry with a version tag, then deletes the temporary VM. The resulting image is the source for all VM deployments. See [Golden image lifecycle](/remote-desktop-vdi/configuration/image-management#golden-image-lifecycle) for the full build-to-deploy loop. ``` ansible-playbook -i inventory create_image.yml -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" -e "remote_image_name=registry.example.com/citrix-vda/sonoma-golden:v1.0" ``` Before running: 1. Place your configuration scripts (VDA install, etc.) in the `/scripts` directory 2. Scripts will be executed in alphabetical order 3. Example scripts: ``` - 01_install_dotnet.sh - 02_install_citrix_vda.sh - 03_configure_system.sh ``` #### Cache a VM Image `pull_image.yml` pre-pulls an image to all hosts in your inventory so VMs deploy immediately without waiting for a registry download. Run this after `create_image.yml` and before deploying VMs in production. ``` ansible-playbook -i inventory pull_image.yml -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` Note: `pull_image.yml` automatically caches the image on all hosts in the inventory. #### Recreate a VM Image This implementation doesn't have a dedicated playbook. To refresh VMs with a new image: ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-abc123" -e "desired_state=absent" ``` **VM recreation playbook workflow:** 1. Delete existing VM 2. Create a new VM from specified image #### Provision User to VM Provisions a new admin user account on a running VM. The playbook connects to the VM via the Mac host as a jump proxy, so `sshpass` must be installed on the Ansible runner. Apple Command Line Tools will be installed on the VM automatically if not already present. ```bash theme={null} ansible-playbook -i inventory provision_user.yml -e "vm_name=" -e "vm_username=" -e "vm_password=" -e "new_username=" -e "new_user_password=" ``` The playbook is idempotent. If the user already exists it will skip creation. #### Install Citrix VDA Installs Citrix Virtual Delivery Agent on a running VM. The playbook locates the VM across all hosts, installs prerequisites (.NET runtime, developer tools), sets the VM hostname, downloads and installs the Citrix VDA package, grants required TCC permissions, then reboots the VM to complete installation. `sshpass` must be installed on the Ansible runner. We recommend hosting your Citrix VDA installer in an S3 bucket with a presigned URL. ```bash theme={null} ansible-playbook -i inventory install_citrix_vda.yml -e "vm_name=" -e "vm_username=" -e "vm_password=" -e "citrix_installer_url=" -e "hostname_suffix=" ``` Where: * `vm_name`: the exact name of the running VM (also used as the VM hostname) * `citrix_installer_url`: download URL for the Citrix VDA `.dmg` * `hostname_suffix`: domain suffix appended to `vm_name` to form the full hostname (for example, `corp.example.com`). Leave blank to use the VM name as the hostname. #### Register Citrix VDA Registers an installed Citrix VDA with a Delivery Controller using an enrollment token. Run this after `install_citrix_vda.yml` has completed successfully. ```bash theme={null} ansible-playbook -i inventory register_citrix_vda.yml -e "vm_name=" -e "vm_username=" -e "vm_password=" -e "enrollment_token=" ``` ### Playbook Customization for Your Environment The Ansible playbook examples referenced throughout this document will require additional customization to match your infrastructure and organizational requirements. **Environment-specific variables:** Create a `group_vars/all.yml` file with the following settings as an example: ``` ansible_user: admin vm_image: registry.example.com/citrix-vda/sonoma-finance:latest max_vms_per_host: 2 ``` ### Test Basic VM Lifecycle Operations Before deploying to production, validate all playbook operations in a test environment. #### Test sequence Verify Ansible can reach all hosts in your inventory. Run `pull_image.yml` to confirm image pulls succeed on all hosts. Deploy a test VM using `deploy.yml` and confirm it appears in the output of `list.yml`. Run `install_citrix_vda.yml` and `register_citrix_vda.yml` against the test VM, then confirm the VDA registers in Citrix Cloud. Start, stop, and restart the test VM to confirm lifecycle operations complete without errors. Run `create_image.yml` to produce a golden image and confirm it appears in your OCI registry. Delete the test VM and redeploy from the golden image to confirm the recreation path works. Delete the test VM using `delete.yml` and confirm it is removed from `list.yml` output. Launch a Citrix session to the new VM and confirm a user can connect successfully. If any step fails, rerun the failing playbook with `-vvv` for detailed output: ```bash theme={null} ansible-playbook -i inventory deploy.yml -vvv -e "vm_name=test-vm-debug" -e "vm_image=" ``` # Apple Business Manager and MDM with MacStadium Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/apple-business-manager-and-mobile-device-management-with-macstadium How Apple Business Manager and MDM tools like Jamf and Intune integrate with MacStadium for bare metal Mac and Orka host enrollment. To support IT management activities for MacStadium customers, it is important to understand the interaction and constraints between Apple Business Manager (ABM) and common Mobile Device Management (MDM) or Unified Endpoint Management (UEM) tools. This page covers host-level enrollment through Apple Business Manager, which applies to bare metal Macs and Orka host machines. macOS VMs provisioned by Orka can't be registered with ABM directly. See [MDM enrollment for MacStadium VDI desktops](/remote-desktop-vdi/configuration/mdm-enrollment) for the VM enrollment workflow instead. ## Key concepts **ABM** is the Apple tool that enables an organization to register their Mac devices with their organization. **MDM/UEM tools** enable enterprise configuration and management of Mac devices. Integration with ABM can enable scalable workflows such as auto-enrollment of new and existing ABM devices to the MDM/UEM directory. Common examples of MDM/UEM tools are Jamf, Kandji, Workspace ONE, and Microsoft Intune. When ABM is paired with an MDM/UEM platform, organizations can deploy, configure, and manage Mac devices across the enterprise with consistent policy enforcement and zero-touch provisioning. ## Registering your MacStadium devices ![Diagram of the MacStadium device registration process for Apple Business Manager MDM assignment](https://files.readme.io/ecd074c1754281e381130bc0bf82a959d0741481c2dc406878ea40e229d28fc2-MDMAssignment.png) This is different from a standard ABM setup. Normally, your organization owns the ABM instance and assigns devices to your MDM server directly. On MacStadium, MacStadium owns the ABM registration for your hardware, and you connect your MDM server to it through a token exchange. MacStadium creates an MDM Server entry for your account inside MacStadium's own Apple Business Manager instance. Retrieve the public key from your MDM platform (Jamf, Kandji, Workspace ONE, or Intune) and send it to your MacStadium account team. MacStadium generates a token from your public key and sends it back to you. Upload the token to your MDM platform to link it to the MDM Server entry MacStadium created in ABM. Once the token is installed, MacStadium adds your MacStadium Apple hardware to the ABM MDM Server record. From that point on, every Apple server added to this ABM MDM Server auto-enrolls into your MDM platform automatically. ## Supported MDM/UEM platforms The following table lists the MDM/UEM platforms supported with MacStadium. | Tool | Notable features | | ---------------- | ------------------------------------------------------------------------ | | Jamf Pro | Deep Apple platform integration, customizable scripts, AppConfig support | | Kandji | Pre-built automation library ("Blueprints"), strong security posture | | Workspace ONE | Cross-platform UEM, identity and access control | | Microsoft Intune | Integrated with Microsoft 365 ecosystem, Azure AD compliance policies | ## Learn more about Apple Business Manager This page covers how ABM and MDM/UEM integration work specifically on MacStadium. For general background on Apple Business Manager itself (Automated Device Enrollment, Volume Purchase Program, Managed Apple IDs, and Federated Authentication), see [Apple's Business Manager documentation](https://support.apple.com/guide/apple-business-manager/welcome/web). ## Get started Interested in evaluating how MacStadium's offerings work together with MDM, UEM, and ABM to solve your business needs? [Contact us for a consultation specific to your implementation.](https://www.macstadium.com/contact-sales) Want to learn more about deploying Citrix VDA for macOS on MacStadium? See [Citrix DaaS configuration](/remote-desktop-vdi/configuration/citrix-daas-configuration). # Citrix DaaS configuration Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/citrix-daas-configuration Connect Orka VMs or bare metal Macs to Citrix Cloud for MacStadium VDI: Machine Catalogs, enrollment tokens, VDA install, Delivery Groups, and Rendezvous. Complete these steps in order. Machines must have Citrix VDA installed and be registered in a Machine Catalog before you assign users to a Delivery Group. Doing these out of order prevents sessions from launching. ## Before you begin You need: * An active Citrix DaaS subscription (Standard tier or above) * Admin access to [Citrix Cloud Console](https://citrix.cloud.com) * Your Citrix Cloud customer ID (visible in the Cloud Console) * One of the following, depending on your deployment: * **Orka VM:** at least one VM deployed with bridged networking (`network_interface=en0`). See [Getting Started: MSDC-Hosted](/remote-desktop-vdi/getting-started/msdc-hosted) or [Getting Started: Self-Hosted](/remote-desktop-vdi/getting-started/self-hosted) if you haven't done this yet. You also need `sshpass` installed on your Ansible runner, required by the VDA playbooks. * **Bare metal Mac:** a provisioned host with SSH or Screen Sharing access. See [VDI on bare metal Mac](/remote-desktop-vdi/overview/bare-metal-mac-vdi). *** ## Step 1: Create a Machine Catalog Machine Catalogs are logical groupings of VMs in Citrix. Because Apple's licensing requirements mean Citrix treats each Mac as a physical device, use the Remote PC Access catalog type. 1. In **Citrix Cloud Console**, go to **Web Studio** → **Machine Catalogs**. 2. Click **Create Machine Catalog**. 3. Select **Remote PC Access**. 4. Under machine power management, select **Machines that are not power managed**. Orka manages the VM lifecycle, and bare metal Mac hosts aren't power managed by Citrix either. 5. Set the session type to **Single-session**. 6. For user assignment, choose based on your use case: * **Random (pooled):** users get any available desktop (non-persistent) * **Static (dedicated):** users get the same desktop each session (persistent) 7. For non-domain-joined Macs, select **No, do not add to Active Directory**. 8. Name the catalog using a pattern that reflects the OS version, hardware profile, and purpose. For example: `Orka-macOS-Sequoia-Standard-Engineering`. 9. Skip adding machines for now. VMs and bare metal hosts register automatically using the enrollment token after VDA is installed. *** ## Step 2: Generate an enrollment token The enrollment token authenticates VDA registration and associates each VM with your Machine Catalog. 1. In **Web Studio**, go to **Machine Catalogs** and select the catalog you just created. 2. Click **Enable Enrollment Token**. 3. Give the token a descriptive name (for example, `Orka-Finance-2026-Q2`). 4. Set an expiration that covers your deployment window. 5. Copy the token immediately. It's shown only once. If you lose it, generate a new one. If you're on Orka VM, store the token in your Ansible Vault: ```yaml theme={null} vault_citrix_enrollment_token: "your-token-here" vault_citrix_customer_id: "YOUR_CUSTOMER_ID" ``` If you're on bare metal Mac, there's no Ansible Vault. Store the token in your password manager instead. *** ## Step 3: Install Citrix VDA Machines must be reachable over the network before you install VDA. Orka VMs on NAT networking can't be reached directly by Citrix Cloud or end users, and you can't change the network mode after a VM is deployed. We recommend hosting the Citrix VDA `.dmg` in an S3 bucket with a presigned URL. The playbook downloads it directly to the VM. From the management UI, run the **VDI | Install Citrix VDA** template. Or run from the CLI: ```bash theme={null} ansible-playbook -i inventory install_citrix_vda.yml -e "vm_name=" -e "vm_username=" -e "vm_password=" -e "citrix_installer_url=" -e "hostname_suffix=" ``` | Variable | Description | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `vm_name` | Exact name of the running VM. Also used as the VM hostname. | | `citrix_installer_url` | Download URL for the Citrix VDA `.dmg`. | | `hostname_suffix` | Domain suffix appended to `vm_name` to form the full hostname (for example, `corp.example.com`). Leave blank to use the VM name alone. | The playbook installs .NET runtime prerequisites, sets the VM hostname, downloads and installs the VDA package, grants required TCC permissions, and reboots the VM. Wait for the reboot to complete before continuing to Step 4. ### Building VDA into a golden image For fleet deployments, build VDA into your golden image instead of installing it per VM. Add your VDA install script to the `/scripts` directory and run `create_image.yml`. VMs deployed from that image have VDA pre-installed and only need to be registered. See [Image management](/remote-desktop-vdi/configuration/image-management) for the full build workflow. Bare metal Macs have no Orka Engine, no management UI, and no Ansible playbooks. Install the Citrix VDA directly on the host. 1. In Citrix Cloud Console, go to **Web Studio** > **Utilities** and download the Citrix VDA for macOS `.dmg`. 2. Copy the `.dmg` to the host over SSH or Screen Sharing. 3. Set the hostname to match your naming convention before installing. The VDA registers using the hostname at install time. 4. Run the installer on the host and grant the TCC (Privacy & Security) permissions it requests. See [Citrix's VDA for macOS installation guide](https://docs.citrix.com/en-us/mac-vda/install) for the exact prompts; they vary by macOS version. 5. Reboot the host. Wait for the reboot to complete before continuing to Step 4. There's no golden image step for bare metal. Each host is installed and registered individually. *** ## Step 4: Register the VDA After the VM reboots, register it with Citrix Cloud using the enrollment token. From the management UI, run the **VDI | Register Citrix VDA** template. Or run from the CLI: ```bash theme={null} ansible-playbook -i inventory register_citrix_vda.yml -e "vm_name=" -e "vm_username=" -e "vm_password=" -e "enrollment_token=" ``` The Citrix VDA installer prompts for your Citrix Cloud customer ID and enrollment token during setup. Enter them there to register the host. See [Citrix's VDA for macOS installation guide](https://docs.citrix.com/en-us/mac-vda/install) if you need to re-register a host after installation; the reconfiguration steps vary by VDA release. *** ## Step 5: Verify registration After registration, the machine should appear in your Machine Catalog within a few minutes. 1. In **Web Studio**, go to **Machine Catalogs** and select your catalog. 2. Confirm the machine appears with **Registration state: Registered** and **Power state: On**. If it doesn't appear, check the VDA logs: ``` /Library/Application Support/Citrix/VDA/Logs/ ``` *** ## Step 6: Configure a Delivery Group Delivery Groups control which users can access which machines and define session policies. Complete Steps 3 through 5 for all machines before assigning users. Users assigned to a Delivery Group with no registered machines can't launch sessions. 1. In **Web Studio**, go to **Delivery Groups** and click **Create Delivery Group**. 2. Select the Machine Catalog from Step 1 and specify how many machines to include. 3. Name the group descriptively, for example: `Finance-macOS-VDI`. 4. Set the display name users see in Citrix Workspace. 5. Select **Published Desktop** as the delivery type. 6. Configure session policies: timeout, idle behavior, and reconnection rules. 7. Once your machines show as Registered in Step 5, add the users or groups who should have access. **Authentication options:** * Active Directory users or groups (domain-joined environments) * Azure AD, Okta, or other SAML providers * Individual user accounts **Multiple Delivery Groups from one catalog:** You can create multiple groups from the same catalog to manage access granularly. For example, a standard group and a power-user group with different session policies, both drawing from the same pool of Mac hosts. *** ## Rendezvous protocol Rendezvous enables HDX connections from non-domain-joined VDAs to Citrix Cloud without an on-premises StoreFront or NetScaler Gateway. The VDA opens an outbound WebSocket connection to Citrix Gateway Service, so no inbound ports are required. Rendezvous is enabled by default in Citrix DaaS environments with non-domain-joined machines. To verify or configure it: 1. In **Web Studio**, go to **Configuration** → **Policies**. 2. Edit or create a policy for your Delivery Group. 3. Under **ICA/HDX settings**, confirm: * **Rendezvous Protocol:** enabled * **HDX Adaptive Transport:** Preferred * **WebSocket connections:** allowed **Network requirement:** machines need outbound access to `*.*.nssvc.net` on TCP/UDP 443. No inbound ports are required. *** ## SSO authentication By default, users authenticate through Citrix Workspace and then see a macOS login screen. With SSO enabled on the VDA, Workspace credentials pass through to macOS automatically and the user lands directly in their desktop. A few things to know before enabling it: * Username and password only. FAS, smart cards, and passwordless providers are not supported. * The macOS account credentials must match the user's Workspace credentials exactly. * SSO conflicts with Jamf Pro/Connect and other tools that customize the macOS login process. If your machines are managed that way, SSO won't work. * The **Allow users not in Active Directory to use this delivery group** checkbox must be unchecked on the Delivery Group. For setup steps, see [SSO Authentication](https://docs.citrix.com/en-us/mac-vda/configure/authentication/non-sso-authentication.html) in the Citrix VDA for macOS documentation. *** ## Troubleshooting ### Machine doesn't appear in the Machine Catalog * Check that the enrollment token hasn't expired and was copied without truncation. * Confirm outbound HTTPS (TCP 443) is allowed to `*.xendesktop.net` and `*.*.nssvc.net`. * Confirm the token is associated with the correct Machine Catalog. * Check VDA logs at `/Library/Application Support/Citrix/VDA/Logs/`. ### VDA service not running On Orka VM, check the service status through Ansible: ```bash theme={null} ansible -i inventory all -m shell -a "sudo launchctl list | grep citrix" ``` Restart it with: ```bash theme={null} ansible -i inventory all -m shell -a "sudo launchctl kickstart -k system/com.citrix.vda" ``` On bare metal Mac, run the same `launchctl` commands directly on the host over SSH; there's no Ansible layer in between. ### Rendezvous connections failing * Confirm outbound access to `*.*.nssvc.net:443` from the machine. * Check whether an HTTP proxy is blocking WebSocket traffic. * Review VDA logs for Rendezvous registration errors. * Verify the Citrix Workspace app version is 2402 or later on client machines. ### Token errors * **Expired token:** generate a new token in Web Studio, update your Vault (Orka VM) or password manager (bare metal Mac), and re-register. * **Wrong Machine Catalog:** verify the token is associated with the correct catalog in Web Studio. * **Customer ID mismatch:** confirm the customer ID matches your Citrix Cloud tenant. # MacStadium VDI customer environment tips Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/customer-environment-tips Best practices for deploying Citrix HDX and HP Anyware PCoIP on MacStadium: MDM enrollment, permissions, networking, and performance tuning. ## Overview These are recommended best practices for deploying Citrix HDX and HP Anyware PCoIP on MacStadium infrastructure. This document provides guidance on MDM enrollment, permissions, networking, and performance tuning. Sections that differ by protocol use tabs. *** ## Security and encryption Disable FileVault unless your security policy requires it. If a machine with FileVault enabled powers down, a MacStadium Data Center Technician must intervene locally before it can be accessed remotely. If encryption is required, coordinate with MacStadium to set up secure restart scripts that automate reboots and recovery before enabling it. Note: If your organization requires the use of FileVault, it is highly recommended that macOS Tahoe is used on your host devices. Apple released a pre-boot SSH capability in Tahoe that allows for remote disk decryption as an alternative to physical DCT intervention. FileVault is not officially supported by MacStadium. Use an MDM solution (Jamf Pro, Kandji, or Intune) to enforce your security baseline. See [MDM Policies and Permissions](#mdm-policies-and-permissions) for VDI-specific configuration. *** ## MDM enrollment for VMs Apple Business Manager (ABM) Automated Device Enrollment is not available for virtual machines. Apple identifies VM hardware identifiers as virtual and blocks auto-enrollment. This cannot be worked around. The standard approach is user-initiated enrollment scripted into your golden image. A LaunchDaemon runs at first boot to install the management framework. A LaunchAgent runs at login to prompt the user to approve the MDM profile. That approval is a macOS requirement on unsupervised devices. MacStadium's tested and supported enrollment process for VMs at scale uses Jamf Pro. For a full walkthrough, see [Jamf Enrollment for MacStadium VDI Desktops](/remote-desktop-vdi/configuration/mdm-enrollment). The LaunchDaemon/LaunchAgent pattern is the same for Intune and Kandji, but MacStadium is still validating and developing optimized guidance for those platforms. A few things to get right before sealing the image: * Set enrollment tokens to expire on a schedule aligned to your image rotation cycle. * Verify enrollment on a test VM before promoting to production: `profiles status -type enrollment` should return `MDM enrollment: Yes`. * Do not seal the image with an MDM profile or management framework already present. For image build and versioning guidance, see [VDI Golden Image Management](/remote-desktop-vdi/configuration/image-management). *** ## MDM policies and permissions Configure and test these before sealing your golden image. Some permissions cannot be pre-approved via MDM, so they need to be granted manually on a clean VM before the image is sealed. ### Privacy preferences (PPPC / TCC) | Permission | Required? | MDM pre-approvable? | | ---------------- | -------------------------- | ---------------------------------- | | Accessibility | Required | Yes | | Screen Recording | Required | No (grant manually before sealing) | | Microphone | Optional (audio redirect) | No (user-controlled) | | Camera | Optional (webcam redirect) | No (user-controlled) | **Bundle IDs for PPPC profiles:** | Application | Bundle ID | Team ID | | ---------------------- | ------------------- | ------------ | | Citrix Workspace / VDA | `com.citrix.ctxism` | `S272Y5R93J` | ### System extensions Citrix VDA installs system extensions for camera and USB redirection. Pre-approve these to prevent user-facing prompts. | Extension | Bundle ID | Type | Team ID | | ---------------- | ---------------------------------------- | ---------------- | ------------ | | Camera extension | `com.citrix.mvda.vdacfg.cameraextension` | System extension | `S272Y5R93J` | | USB redirection | `com.citrix.kext.gusb` | Kernel extension | `S272Y5R93J` | On macOS 15 (Sequoia), admin users can remove system extensions via System Settings. Jamf Pro 11.9.1+ and Kandji 3.x both support marking extensions as non-removable. Citrix also installs background services under `/Library/LaunchAgents` and `/Library/LaunchDaemons`. On Ventura and later, users see a "Background Items Added" notification on first login. This is expected. Do not suppress or disable these services. ### Privacy preferences (PPPC / TCC) | Permission | Required? | MDM pre-approvable? | | ---------------- | --------- | ---------------------------------- | | Accessibility | Required | Yes | | Screen Recording | Required | No (grant manually before sealing) | | Microphone | Optional | No (user-controlled) | | Camera | Optional | No (user-controlled) | **Bundle IDs for PPPC profiles:** | Application | Bundle ID | Team ID | | --------------------- | ------------------------------- | ------------------- | | HP Anyware Client | `com.teradici.swiftclient` | Not published by HP | | HP Anyware User Agent | `com.teradici.pcoip-user-agent` | Not published by HP | HP does not document Team ID information for HP Anyware. To generate a code requirement string for use in a PPPC payload, run this against the installed host agent: ```bash theme={null} # Locate the agent mdfind "kMDItemCFBundleIdentifier == 'com.teradici.pcoip-user-agent'" # Generate the code requirement string codesign -dr - /path/to/PCoIPAgent.app ``` Paste the `designated =>` line from the output into the Code Requirement field of your MDM's PPPC payload. ### Apple Firewall MDM solutions typically enforce the Apple Firewall on a recurring check-in schedule (every 30 minutes with some platforms). Disabling the firewall manually does not hold if your MDM profile re-enables it on check-in. Add PCoIP application exceptions instead of disabling the firewall. Application exceptions survive MDM check-ins: ```bash theme={null} sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add "/Applications/PCoIP Agent/pcoip-agent" sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp "/Applications/PCoIP Agent/pcoip-agent" ``` To verify the exception is set: ```bash theme={null} sudo /usr/libexec/ApplicationFirewall/socketfilterfw --listapps | grep -i pcoip ``` ### Session management Train users to end PCoIP sessions by closing the HP Anyware client window. Using the macOS **Log Out** option from within an active PCoIP session breaks the remote display state and prevents future connections until the host is rebooted. This applies to all macOS versions running the HP Anyware Graphics Agent. If a host is in a broken display state due to a macOS logout within a session, a reboot is required to restore access. Reboots can be performed via SSH or Screen Share. ### MDM platform notes | Platform | PPPC | System Extensions | Notes | | ---------------- | ------------------------------------------ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Jamf Pro | Privacy Preferences Policy Control payload | System Extensions payload (Team ID `S272Y5R93J`) | MacStadium's tested and supported platform for VM enrollment at scale. For HP Anyware, generate the code requirement string with `codesign -dr -` and paste it manually. See the [Jamf Enrollment guide](/remote-desktop-vdi/configuration/mdm-enrollment). | | Microsoft Intune | Custom Configuration Profile (macOS XML) | Endpoint Security > macOS System Extensions | Deploy HP Anyware or Citrix Workspace as a macOS DMG app via the Apps blade. Optimized VM enrollment guidance for Intune is in development. | | Kandji | Privacy Preferences Library Item | System Extensions Library Item (Team ID `S272Y5R93J`) | 3.x supports non-removable extensions on macOS 15. Optimized VM enrollment guidance for Kandji is in development. | *** ## Networking and connectivity Disable packet inspection and SSL interception on VDI session traffic. Both HDX and PCoIP are sensitive to latency added by middleboxes. Route sessions as directly as possible and avoid unnecessary proxy hops. **Required ports:** | Protocol | Ports | | ------------------ | ------------------ | | Primary session | TCP/UDP 1494, 2598 | | Broker / licensing | TCP 443 | | EDT (performance) | UDP 1494, 2598 | Enable EDT (UDP 1494/2598) where possible. It provides noticeably better performance over variable-quality connections compared to TCP-only transport. | Protocol | Ports | | ------------------ | -------------- | | Primary session | UDP 4172 | | Session fallback | TCP 4172 | | Broker / licensing | TCP 443, 60443 | **Bandwidth planning per concurrent user:** | Workload type | Recommended | | -------------------------------- | ----------- | | General productivity / coding | 2-3 Mbps | | Design / graphics | 5-10 Mbps | | Video editing / high-performance | 15-25 Mbps | Maintain a secondary administrative access path (VNC or MacStadium remote console) independent of your VDI session for recovery scenarios. *** ## Performance tuning ### macOS settings (both protocols) Disable desktop animations and transparency effects before sealing your image: **System Settings > Accessibility > Display > Reduce Motion** and **Reduce Transparency**. Disable screen saver, hot corners, and idle timers: ```bash theme={null} sudo pmset -a sleep 0 disksleep 0 displaysleep 0 ``` MacStadium hosts use wired Ethernet. If any nodes in your cluster are on Wi-Fi, disable Wi-Fi power saving to prevent the NIC from dropping into a low-power state during active sessions. ### Protocol-specific tuning Configure transport via Citrix Workspace App for Mac settings: EDT, H.264/H.265 codec selection, and audio quality profiles. See the [Citrix Workspace App for Mac docs](https://docs.citrix.com/en-us/citrix-workspace-app-for-mac) for the full tuning reference. Configure via `/Library/Preferences/com.teradici.pcoip-agent.plist`. Set before sealing or push via MDM config profile: ```bash theme={null} # Bandwidth ceiling in kbps (default: 900000, effectively uncapped) sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.max_link_rate -int 25000 # Image quality floor/ceiling, 0-100 (defaults: 40 / 80) sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.minimum_image_quality -int 40 sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.maximum_initial_image_quality -int 80 # Frame rate ceiling in fps (default: 30) sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.maximum_frame_rate -int 30 # Audio bandwidth ceiling in kbps (default: 512) sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.audio_bandwidth_limit -int 256 # MTU size in bytes (default: 1200) sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.mtu_size -int 1200 # Build-to-lossless: 0 = off (default), 1 = on # Sharpens to pixel-perfect during idle; useful for design review, increases bandwidth sudo defaults write /Library/Preferences/com.teradici.pcoip-agent pcoip.enable_build_to_lossless -int 0 ``` Changes take effect after the PCoIP agent service restarts or the VM reboots. *** ## Management and policy Define MDM policies before sealing your golden image. A baseline for MacStadium VDI: | Category | Policies | | ----------------- | ----------------------------------------------------------------------------------------------------------------- | | Must be enabled | Remote management, System Integrity Protection, disable end-user restart and shutdown | | Should be enabled | Password complexity, software firewall, Gatekeeper, software update enforcement | | Avoid | User lockout policies requiring local physical recovery; FileVault without a MacStadium-coordinated recovery plan | Do not apply aggressive idle timeout or auto-sleep policies that conflict with active session stability. See [VDI Golden Image Management](/remote-desktop-vdi/configuration/image-management) for incorporating MDM configuration into your image build pipeline. *** ## Backup and recovery Keep machines in an always-on or wake-on-network state. Maintain a secondary administrative connection (VNC or MacStadium secure console) that does not depend on your VDI session. Enable Time Machine or equivalent backup on a schedule that meets your retention requirements. VDI sessions are not a substitute for enterprise backup. *** ## Quick reference | | Citrix HDX | HP Anyware PCoIP | | ---------------------- | ----------------------------- | ----------------------------------------------------- | | Session ports | TCP/UDP 1494, 2598; TCP 443 | UDP/TCP 4172; TCP 443, 60443 | | Main bundle ID | `com.citrix.ctxism` | `com.teradici.swiftclient` | | System extensions | Camera kext, USB kext | None | | Accessibility (MDM) | Pre-approvable | Pre-approvable | | Screen Recording (MDM) | Grant manually before sealing | Grant manually before sealing | | MDM enrollment | User-initiated only | User-initiated only | | Agent variants | VDA | Graphics Agent, Standard Agent | | Agent config | Citrix Workspace settings | `/Library/Preferences/com.teradici.pcoip-agent.plist` | **Related:** * [Jamf Enrollment for MacStadium VDI Desktops](/remote-desktop-vdi/configuration/mdm-enrollment) * [VDI Golden Image Management](/remote-desktop-vdi/configuration/image-management) * [Citrix Workspace App for Mac](https://docs.citrix.com/en-us/citrix-workspace-app-for-mac) * [HP Anyware Documentation](https://anyware.hp.com/web-help/pcoip_client/mac/24.03/) * [Apple Platform Security Guide](https://help.apple.com/pdf/security/en_US/apple-platform-security-guide.pdf) # VDI golden image management Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/image-management Create and manage golden images for MacStadium VDI: build images with Citrix VDA pre-installed, automate builds with Ansible, and distribute across hosts. Image management is critical for maintaining a scalable MacStadium VDI environment. This page covers creating a golden image with Citrix VDA pre-installed, automating image builds, distributing images across hosts, and version control practices for long-term maintenance. ## Golden image lifecycle Every VM in your fleet is deployed from a golden image, a versioned snapshot of macOS with Citrix VDA and your organization's applications pre-installed. The lifecycle repeats with each update cycle: Golden image lifecycle diagram 1. **Base image:** Start from a MacStadium public base image (`ghcr.io/macstadium/orka-images/sequoia:latest` or similar). 2. **Build:** Run `create_image.yml`: it deploys a temporary VM, executes your scripts in the `/scripts` directory, commits the result, pushes the image to your OCI registry, and cleans up. 3. **Version:** Tag the image with a version (`v1.0`, `v1.1`, etc.) before pushing to your registry. Tag as `:latest` once validated. 4. **Cache:** Run `pull_image.yml` to pre-pull the image to all hosts. This avoids download delays at deployment time. 5. **Deploy:** Run `deploy.yml` to provision VMs from the cached image. VMs are ready for Citrix VDA registration immediately. 6. **Update:** Apply patches or new applications, run `create_image.yml` again with a new version tag, test, then repeat from step 4. Run all playbooks from the management UI for day-to-day image operations. See [Getting Started: MSDC-Hosted](/remote-desktop-vdi/getting-started/msdc-hosted) or [Getting Started: Self-Hosted](/remote-desktop-vdi/getting-started/self-hosted) for setup instructions. ## Creating a Golden Image with Citrix VDA Golden images serve as templates for rapid VM deployment. A well-crafted golden image contains the base OS, Citrix VDA, and any additional software your users need, all pre-configured and ready to deploy. VMs that are deployed from a golden image are ready for immediate use, with no additional setup required. ### Golden Image Creation Workflow #### Create a VM Image ``` ansible-playbook -i inventory create_image.yml -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" -e "remote_image_name=registry.example.com/citrix-vda/sonoma-golden:v1.0" ``` Before running: 1. Place your configuration scripts (VDA install, etc.) in the `/scripts` directory 2. Scripts will be executed in alphabetical order 3. Example scripts: ``` scripts=( 01_install_dotnet.sh 02_install_citrix_vda.sh 03_configure_system.sh ) ``` #### Update a VM to a New Image This implementation doesn’t have a dedicated playbook. To refresh VMs with a new image: ``` # Step 1: Delete the existing VM ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-abc123" -e "desired_state=absent" # Step 2: Deploy a replacement VM from the new image version ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-golden:v2.0" ``` ## Cache Management ### Cache a VM Image ``` ansible-playbook -i inventory pull_image.yml -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` Note: `pull_image.yml` automatically caches the image on all hosts in the inventory. ## Version Control Best Practices 1. Monitor image cache status 2. Remove outdated images when new versions are released 3. Establish proper version control for images, using [semantic versioning](https://semver.org/) for image tags and naming conventions 4. Maintain multiple image tags for flexibility 5. Maintain a CHANGELOG.MD or detailed README.MD file documenting changes for each released version of an image 6. Commit changes before building VM images, tagging releases in Git to match the image version 7. If problems arise with a new image, roll back to a previous version 8. Define your image retention policy by addressing the following questions: 1. How long will you keep old image versions? 2. Which images will you always want to retain for rollback purposes? 3. When will you delete older image versions to free space if needed? 4. Will you store major image versions indefinitely? (Strongly recommended for auditing/compliance.) 5. When will you delete images tagged as dev/staging? 9. Test before promoting images to production. 10. Communicate image updates: 1. Notify all impacted stakeholders about updates to VM images. 2. Announce new versions as needed in team channels. 3. Document breaking changes. 4. Schedule production deployments to take place during maintenance windows. 5. Before updating an image, provide stakeholders with a rollback plan. # MDM enrollment for MacStadium VDI desktops Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/mdm-enrollment Enroll Orka-provisioned macOS VMs into Jamf Pro, Microsoft Intune, or Iru (Kandji) using a golden image with LaunchDaemon and LaunchAgent scripts. This guide walks through how to enroll Orka-provisioned macOS VMs into your MDM platform of choice. MacStadium provides verified guidance for [Jamf Pro](https://www.jamf.com) and [Microsoft Intune](https://intune.microsoft.com). Guidance for [Iru](https://iru.io) (formerly Kandji) is included as a starting point and is pending final validation. *** ## What's different about VMs The same Apple constraint applies across all three platforms: Apple Business Manager (ABM) does not support virtual machines, so the zero-touch automated enrollment paths (ADE for Jamf, ADE for Intune) aren't available for MacStadium VDI desktops. On macOS 10.13 and later, the available route is user-driven enrollment, which installs an MDM profile the user must explicitly approve in System Settings. That approval step can't be automated away. What you can do is get it down to a single click: a LaunchDaemon baked into the golden image preps the VM at boot, and a LaunchAgent surfaces the enrollment prompt at first login. On macOS 11 or later, [Apple's documentation](https://support.apple.com/guide/deployment/about-device-supervision-dep1d89f0bff/web) confirms that Macs enrolled via profile-based Device Enrollment (the mechanism Jamf UIE, Intune Company Portal, and Iru's Enrollment Portal all use) are supervised. ABM is not required for supervision on macOS 11+. This means Orka VMs running macOS 11 or later will be supervised after enrollment. See each platform's tab for details on what this enables. Because the MDM profile is installed without ABM, a user with local admin rights can remove it after installation. See [Security considerations](#security-considerations) before deploying to environments where MDM persistence is a compliance requirement. *** ### How it works Two components go into your golden image. A **LaunchDaemon** runs at boot as root. It downloads the Jamf binary from your Jamf Pro server, installs the management framework, and creates a computer record in Jamf Pro. No user interaction required. A **LaunchAgent** runs at each login. If MDM enrollment isn't complete, it shows the user a dialog and opens Safari to the Jamf enrollment page. The user completes SSO authentication, clears the pre-filled username field, clicks Enroll, clicks Download, then approves the profile in System Settings > General > Device Management. The prompt repeats at each login until enrollment is confirmed, then removes itself. Both components remove themselves once MDM enrollment is confirmed. *** ### What you need * Your Jamf Pro instance URL (for example, `https://yourcompany.jamfcloud.com`) * Jamf Pro admin access to configure User-Initiated Enrollment * Access to your Orka golden image **These instructions were written and verified against Jamf Pro 11.25.2 and macOS 15.6.1.** Navigation and feature placement have changed across major versions of Jamf Pro. If your instance looks different, see the [Jamf Pro documentation](https://learn.jamf.com) for your specific version. *** 1. Click **Settings** at the bottom of the left sidebar. 2. Under the **Global** tab, select **User-Initiated Enrollment**. 3. On the **Computers** tab, confirm user-initiated enrollment is enabled. Save if you made changes. Enrollment invitations in Jamf Pro 11 live under Computers, but may be inside the UIE settings screen in previous versions. 1. Click **Computers** at the top of the left sidebar. 2. Click **Enrollment Invitations** in the sidebar. 3. Click **New** and follow the prompts. Set the expiration date as far out as your instance allows, and align it to your image rotation schedule so the invitation doesn't go stale before you re-seal the image. 4. Scope the invitation to a specific Jamf site or LDAP group if needed. 5. After saving, open the invitation record and copy the **Invitation ID**. This is the value you'll use as `INVITATION_CODE` in the LaunchDaemon and LaunchAgent scripts that follow. Add the following script to your golden image at `/usr/local/bin/jamf-enroll.sh`. Fill in your `JSS_URL` and `INVITATION_CODE`, and swap out `com.yourcompany` for your reverse-domain identifier throughout. ```bash theme={null} mkdir -p /usr/local/bin ``` ```bash theme={null} #!/bin/bash # Runs at boot via LaunchDaemon. Installs the Jamf management framework # and creates a computer record in Jamf Pro. MDM profile installation # is handled separately via the login prompt. JSS_URL="https://yourcompany.jamfcloud.com" INVITATION_CODE="YOUR_INVITATION_CODE_HERE" JAMF_BINARY="/usr/local/jamf/bin/jamf" TMP_JAMF="/tmp/jamf" DAEMON_PLIST="/Library/LaunchDaemons/com.yourcompany.jamf-enroll.plist" LOG="/var/log/jamf-enroll.log" MAX_ATTEMPTS=10 ATTEMPT_FILE="/var/tmp/.jamf-enroll-attempts" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG" } attempts=0 [ -f "$ATTEMPT_FILE" ] && attempts=$(cat "$ATTEMPT_FILE") if [ "$attempts" -ge "$MAX_ATTEMPTS" ]; then log "Max attempts ($MAX_ATTEMPTS) reached. Verify invitation code and JSS reachability." exit 1 fi if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then log "MDM enrolled. Cleaning up LaunchDaemon." launchctl unload "$DAEMON_PLIST" 2>/dev/null rm -f "$DAEMON_PLIST" "/usr/local/bin/jamf-enroll.sh" "$ATTEMPT_FILE" exit 0 fi network_ready=false for i in $(seq 1 12); do if curl -s --connect-timeout 5 -o /dev/null "${JSS_URL}/healthCheck.html"; then network_ready=true break fi log "Waiting for network... attempt $i" sleep 5 done if [ "$network_ready" = false ]; then log "Network not available. Will retry at next boot." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 1 fi if [ ! -f "$JAMF_BINARY" ]; then log "Downloading Jamf binary." curl -ks --connect-timeout 10 --max-time 60 "${JSS_URL}/bin/jamf" -o "$TMP_JAMF" if [ $? -ne 0 ] || [ ! -s "$TMP_JAMF" ]; then log "Download failed. Will retry." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 1 fi chmod +x "$TMP_JAMF" JAMF_BINARY="$TMP_JAMF" fi "$JAMF_BINARY" createConf -url "$JSS_URL" >> "$LOG" 2>&1 log "Initiating Jamf framework enrollment." echo $((attempts + 1)) > "$ATTEMPT_FILE" "$JAMF_BINARY" enroll -invitation "$INVITATION_CODE" -jssUrl "$JSS_URL" >> "$LOG" 2>&1 log "Enrollment command finished with exit code $?." ``` ```bash theme={null} chmod 755 /usr/local/bin/jamf-enroll.sh ``` Add this to your golden image at `/Library/LaunchDaemons/com.yourcompany.jamf-enroll.plist`. Update the label to use your reverse-domain identifier. ```xml theme={null} Label com.yourcompany.jamf-enroll ProgramArguments /bin/bash /usr/local/bin/jamf-enroll.sh RunAtLoad StartInterval 300 StandardOutPath /var/log/jamf-enroll.log StandardErrorPath /var/log/jamf-enroll.log ``` ```bash theme={null} chown root:wheel /Library/LaunchDaemons/com.yourcompany.jamf-enroll.plist chmod 644 /Library/LaunchDaemons/com.yourcompany.jamf-enroll.plist ``` Add the following script to your golden image at `/usr/local/bin/jamf-enroll-prompt.sh`. Fill in your `JSS_URL`, `INVITATION_CODE`, and reverse-domain identifier. ```bash theme={null} #!/bin/bash # Runs at login via LaunchAgent. Prompts the user to complete MDM enrollment # via Safari. Cleans itself up once enrollment is confirmed. JSS_URL="https://yourcompany.jamfcloud.com" INVITATION_CODE="YOUR_INVITATION_CODE_HERE" AGENT_PLIST="/Library/LaunchAgents/com.yourcompany.jamf-enroll-prompt.plist" if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then launchctl unload "$AGENT_PLIST" 2>/dev/null rm -f "$AGENT_PLIST" "/usr/local/bin/jamf-enroll-prompt.sh" exit 0 fi button=$(osascript < Add this to your golden image at `/Library/LaunchAgents/com.yourcompany.jamf-enroll-prompt.plist`. Update the label to use your reverse-domain identifier. ```xml theme={null} Label com.yourcompany.jamf-enroll-prompt ProgramArguments /bin/bash /usr/local/bin/jamf-enroll-prompt.sh RunAtLoad ``` ```bash theme={null} chown root:wheel /Library/LaunchAgents/com.yourcompany.jamf-enroll-prompt.plist chmod 644 /Library/LaunchAgents/com.yourcompany.jamf-enroll-prompt.plist ``` 1. Don't load the LaunchDaemon or LaunchAgent in the image itself. They load on first boot and first login of each provisioned VM. 2. Confirm no MDM profile is already enrolled: `profiles status -type enrollment` should return "MDM enrollment: No". 3. Confirm no Jamf management framework is already installed. If `/Library/Application Support/JAMF/` exists, remove it before sealing: `sudo rm -rf "/Library/Application Support/JAMF/"`. 4. Publish the image in Orka. *** ### Verifying enrollment After provisioning a VM from your updated golden image: ```bash theme={null} # Check what the LaunchDaemon did cat /var/log/jamf-enroll.log # Confirm MDM profile was installed after the user approved profiles status -type enrollment ``` In Jamf Pro, go to **Computers > Search Computers** and search for the VM by hostname or hardware UUID (get it with `system_profiler SPHardwareDataType | grep UUID`). Confirm a computer record was created and check the **Management** tab to verify the MDM profile is listed. *** ### A few things worth knowing **Each VM gets its own record.** Orka assigns each VM a unique hardware UUID, so every desktop shows up as a separate computer in Jamf. When you destroy and reprovision a VM, the new instance creates a new record. Stale records from old VMs stick around until you clean them up manually, so plan for that in high-churn environments. **Watch your invitation expiry.** If the enrollment invitation expires, the script hits its retry limit and stops trying. For long-lived golden images, set the invitation to "Never Expires." If you rotate invitations, update the script and re-seal the image before the old code goes stale. **The image contains credentials.** The enrollment script has your Jamf server URL and invitation code baked in. Apply the same access controls to this image that you'd use for any artifact holding credentials. **VMs on macOS 11+ are supervised via profile-based enrollment.** Per [Apple's documentation](https://support.apple.com/guide/deployment/about-device-supervision-dep1d89f0bff/web), Mac computers running macOS 11 or later that enroll via profile-based Device Enrollment (which is what Jamf User-Initiated Enrollment uses) are supervised, no ADE required. This means supervision-gated features (kernel extension policy, certain payloads) are available. Note that Jamf UIE does not set the profile as non-removable by default; for that, your Jamf administrator must configure `PayloadRemovalDisallowed` in the enrollment profile. **If enrollment isn't triggering,** check `/var/log/jamf-enroll.log`. The most common causes are the VM not having network access when the daemon first runs, an expired invitation code, or an MDM profile already present in the image before sealing. Microsoft officially supports macOS VMs in Intune **for testing purposes only**. Deploying VMs as production employee devices is not a supported scenario. See [Enroll virtual macOS machines for testing](https://learn.microsoft.com/en-us/intune/intune-service/enrollment/macos-enroll#enroll-virtual-macos-machines-for-testing) in Microsoft's documentation. MacStadium documents this workflow because customers ask for it, but production deployments are outside Microsoft's support boundary. ### How it works Two components go into your golden image. A **LaunchDaemon** runs at boot as root. It waits for network availability, confirms the Intune service endpoint is reachable, and verifies that the Company Portal app is present on disk. Unlike the Jamf flow, there is no daemon-initiated enrollment step: Intune has no equivalent of `jamf enroll` that pre-creates a record. The entire enrollment is gated on the user signing in to Company Portal with their Entra ID account, so the daemon's job is to confirm prerequisites are in place and monitor enrollment state. A **LaunchAgent** runs at each login. If MDM enrollment isn't complete, it shows the user a dialog and opens Company Portal. The user signs in with their work account, follows the in-app steps to download the management profile, then approves the profile in System Settings > General > Device Management. The prompt repeats at each login until enrollment is confirmed, then removes itself. Both components remove themselves once MDM enrollment is confirmed. *** ### What you need * A Microsoft Intune tenant with macOS device enrollment configured * An active **Apple MDM Push Certificate** uploaded to Intune (annual renewal required) * Entra ID (Azure AD) accounts for your end users, licensed for Intune (M365 E3/E5, EMS E3/E5, or an Intune standalone SKU) * Access to your Orka golden image * The Company Portal `.pkg` installer downloaded from [https://go.microsoft.com/fwlink/?linkid=853070](https://go.microsoft.com/fwlink/?linkid=853070) **These instructions were written and verified against macOS 15.6.1 and the Microsoft Intune admin center as of May 2026.** Microsoft's admin console layout and feature placement shift over time. If your tenant looks different, see the [macOS device enrollment guide for Microsoft Intune](https://learn.microsoft.com/en-us/intune/device-enrollment/apple/guide-macos) for the current navigation. *** The push certificate is required for Intune to communicate with Apple's MDM service. If you already manage iOS or macOS devices in Intune, this is already in place. 1. In the [Intune admin center](https://intune.microsoft.com), go to **Devices > Enrollment > Apple > Apple MDM Push certificate**. 2. If no certificate is listed, follow Microsoft's [Get an Apple MDM Push certificate for Intune](https://learn.microsoft.com/en-us/intune/device-enrollment/apple/create-mdm-push-certificate) procedure. You'll grant Microsoft permission to send push notifications, download a CSR, upload it to [https://identity.apple.com](https://identity.apple.com), then upload the resulting `.pem` back into Intune. 3. Record the **Apple ID** used to create the certificate. Apple only allows renewal from the same Apple ID, and the certificate expires every 365 days. Store this in your team's password manager. 1. In **Devices > Enrollment**, confirm **Intune** is set as the MDM authority for your tenant. 2. Under **Enrollment device platform restrictions**, confirm macOS device enrollment is allowed for the user groups that will own VDI desktops. Each end user enrolling a VM must have an Intune license assigned (M365 E3/E5, EMS, or Intune standalone). Without a license, Company Portal sign-in will succeed but enrollment will fail with a licensing error. Assign licenses in the [Microsoft 365 admin center](https://admin.microsoft.com) or via group-based licensing in Entra ID. Bake the latest Company Portal `.pkg` into the golden image rather than downloading it at boot. Pre-staging avoids a network dependency at first boot and keeps the install version pinned to whatever you tested against. ```bash theme={null} curl -L -o /tmp/CompanyPortal-Installer.pkg "https://go.microsoft.com/fwlink/?linkid=853070" sudo installer -pkg /tmp/CompanyPortal-Installer.pkg -target / ls -d "/Applications/Company Portal.app" ``` Once installed, Company Portal updates itself via Microsoft AutoUpdate on managed devices. You don't need to chase point releases. Refresh it on your normal image rotation cadence. Add the following script to your golden image at `/usr/local/bin/intune-enroll.sh`. Swap `com.yourcompany` for your reverse-domain identifier if you want to namespace it differently. ```bash theme={null} mkdir -p /usr/local/bin ``` ```bash theme={null} #!/bin/bash # Runs at boot via LaunchDaemon. Verifies prerequisites for Intune enrollment # (network reachability and Company Portal presence) and monitors enrollment # state. The actual MDM profile install is a user-driven step handled by the # LaunchAgent. Self-removes once MDM enrollment is confirmed. INTUNE_ENDPOINT="https://manage.microsoft.com" COMPANY_PORTAL_APP="/Applications/Company Portal.app" DAEMON_PLIST="/Library/LaunchDaemons/com.yourcompany.intune-enroll.plist" LOG="/var/log/intune-enroll.log" MAX_ATTEMPTS=10 ATTEMPT_FILE="/var/tmp/.intune-enroll-attempts" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG" } attempts=0 [ -f "$ATTEMPT_FILE" ] && attempts=$(cat "$ATTEMPT_FILE") if [ "$attempts" -ge "$MAX_ATTEMPTS" ]; then log "Max attempts ($MAX_ATTEMPTS) reached. Verify Company Portal install and tenant reachability." exit 1 fi if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then log "MDM enrolled. Cleaning up LaunchDaemon." launchctl unload "$DAEMON_PLIST" 2>/dev/null rm -f "$DAEMON_PLIST" "/usr/local/bin/intune-enroll.sh" "$ATTEMPT_FILE" exit 0 fi network_ready=false for i in $(seq 1 12); do if curl -s --connect-timeout 5 -o /dev/null -w "%{http_code}" "${INTUNE_ENDPOINT}" | grep -qE "^(200|301|302|400|401|403)$"; then network_ready=true break fi log "Waiting for network... attempt $i" sleep 5 done if [ "$network_ready" = false ]; then log "Network not available or Intune endpoint unreachable. Will retry at next interval." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 1 fi if [ ! -d "$COMPANY_PORTAL_APP" ]; then log "ERROR: Company Portal.app not found at $COMPANY_PORTAL_APP. Re-seal the golden image with Company Portal installed." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 1 fi log "Prerequisites OK. Awaiting user login to complete enrollment via Company Portal." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 0 ``` ```bash theme={null} chmod 755 /usr/local/bin/intune-enroll.sh ``` Add this to your golden image at `/Library/LaunchDaemons/com.yourcompany.intune-enroll.plist`. ```xml theme={null} Label com.yourcompany.intune-enroll ProgramArguments /bin/bash /usr/local/bin/intune-enroll.sh RunAtLoad StartInterval 300 StandardOutPath /var/log/intune-enroll.log StandardErrorPath /var/log/intune-enroll.log ``` ```bash theme={null} chown root:wheel /Library/LaunchDaemons/com.yourcompany.intune-enroll.plist chmod 644 /Library/LaunchDaemons/com.yourcompany.intune-enroll.plist ``` Add the following script to your golden image at `/usr/local/bin/intune-enroll-prompt.sh`. ```bash theme={null} #!/bin/bash # Runs at login via LaunchAgent. Prompts the user to complete MDM enrollment # via the Company Portal app. Cleans itself up once enrollment is confirmed. COMPANY_PORTAL_APP="/Applications/Company Portal.app" AGENT_PLIST="/Library/LaunchAgents/com.yourcompany.intune-enroll-prompt.plist" if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then launchctl unload "$AGENT_PLIST" 2>/dev/null rm -f "$AGENT_PLIST" "/usr/local/bin/intune-enroll-prompt.sh" exit 0 fi if [ ! -d "$COMPANY_PORTAL_APP" ]; then osascript </dev/null 2>&1 display dialog "This Mac desktop is missing the Company Portal app required for device enrollment. Please contact your IT administrator." \ buttons {"OK"} \ default button "OK" \ with title "Device Enrollment Unavailable" \ with icon stop EOF exit 1 fi button=$(osascript < General > Device Management." \ buttons {"Remind Me Later", "Enroll Now"} \ default button "Enroll Now" \ with title "Device Enrollment Required" \ with icon caution) EOF ) [ "$button" = "Enroll Now" ] && open -a "$COMPANY_PORTAL_APP" exit 0 ``` ```bash theme={null} chmod 755 /usr/local/bin/intune-enroll-prompt.sh ``` Add this to your golden image at `/Library/LaunchAgents/com.yourcompany.intune-enroll-prompt.plist`. ```xml theme={null} Label com.yourcompany.intune-enroll-prompt ProgramArguments /bin/bash /usr/local/bin/intune-enroll-prompt.sh RunAtLoad ``` ```bash theme={null} chown root:wheel /Library/LaunchAgents/com.yourcompany.intune-enroll-prompt.plist chmod 644 /Library/LaunchAgents/com.yourcompany.intune-enroll-prompt.plist ``` 1. Don't load the LaunchDaemon or LaunchAgent in the image itself. They load on first boot and first login of each provisioned VM. 2. Confirm no MDM profile is already enrolled: `profiles status -type enrollment` should return "MDM enrollment: No". 3. Confirm Company Portal is present: `ls -d "/Applications/Company Portal.app"`. 4. If you've previously enrolled this image into Intune for testing, remove the residue before sealing: ```bash theme={null} sudo profiles remove -type enrollment # only if a stale enrollment profile exists sudo rm -rf "/Library/Application Support/com.microsoft.CompanyPortalMac" ``` 5. Publish the image in Orka. *** ### Verifying enrollment After provisioning a VM from your updated golden image: ```bash theme={null} # Check what the LaunchDaemon did cat /var/log/intune-enroll.log # Confirm MDM profile was installed after the user approved profiles status -type enrollment ``` In the Intune admin center, go to **Devices > macOS > All devices** and search by hostname or serial number. The hardware UUID Orka assigns to the VM appears in Intune as the device's hardware identifier. Pull it locally with `system_profiler SPHardwareDataType | grep UUID`. *** ### A few things worth knowing **Each VM gets its own record.** Orka assigns each VM a unique hardware UUID, so every desktop shows up as a separate device in Intune. When you destroy and reprovision a VM, the new instance creates a new record. Stale records stick around until you clean them up manually (via the admin center or Microsoft Graph). Plan for periodic cleanup in high-churn environments. **No invitation code, but there is an enrollment surface.** Unlike Jamf, Intune doesn't bake an enrollment secret into the image. The user authenticates with their own Entra ID credentials, which removes credential-leak risk. It also means anyone with a valid licensed Entra ID account and VM access can enroll it into your tenant. Restrict this via a Conditional Access policy or device platform restriction scoped to the Entra ID group your VDI users belong to. **Watch the APNs certificate expiry.** The Apple MDM Push Certificate expires every 365 days. If it lapses, all macOS enrollment and management of already-enrolled devices breaks until you renew it from the same Apple ID that created it. Add a calendar reminder 30 days out and store the Apple ID in your team's password manager. **Company Portal updates itself.** Once the device is enrolled, Microsoft AutoUpdate keeps Company Portal current. You only need to refresh the version baked into the golden image on your normal rotation cadence. **Intune turns on supervision for macOS 11+ user-approved enrollments.** Per [Microsoft's documentation](https://learn.microsoft.com/en-us/intune/intune-service/enrollment/macos-enroll#user-approved-enrollment), Intune automatically enables supervision for devices running macOS 11 or later that enroll via Company Portal. For VMs, this means supervision-requiring features (certain configuration payloads, bootstrap token escrow) may work. Given that Microsoft only supports VMs for testing, validate your specific compliance requirements before relying on supervision behavior in production. **If enrollment isn't triggering,** check `/var/log/intune-enroll.log`. Common causes: no network at boot, Company Portal missing from the image, or the user's Entra ID account lacks an Intune license (which surfaces as a Company Portal sign-in error rather than a daemon-side failure). This guide has not been verified against a live Iru installation. MacStadium is still developing and validating the recommended enrollment pattern for Iru. Use it as a starting point and contact [support@macstadium.com](mailto:support@macstadium.com) for current guidance before deploying to production. ### How it works Two components go into your golden image. A **LaunchDaemon** runs at boot as root. It waits for network availability and confirms the Iru service endpoint is reachable. Unlike Jamf, there is no binary to download or daemon-initiated enrollment command. The daemon's job is to verify network prerequisites and monitor enrollment state. A **LaunchAgent** runs at each login. If MDM enrollment isn't complete, it shows the user a dialog and opens Safari to your Iru enrollment URL. The user authenticates with their work account, downloads the management profile, and approves it in System Settings > General > Device Management. The prompt repeats at each login until enrollment is confirmed, then removes itself. Both components remove themselves once MDM enrollment is confirmed. *** ### What you need * An active Iru tenant * Your Iru enrollment URL and Blueprint access code (from your Iru admin console under **Enrollment > Manual Enrollment**) * SSO configured in Iru if your organization uses federated login * Access to your Orka golden image *** In the Iru admin console, go to **Enrollment > Manual Enrollment**. Enable the Enrollment Portal if it isn't already on, then toggle on the Blueprint you want VMs to enroll into. Copy the **Enrollment Code** for that Blueprint. The enrollment URL you'll bake into the LaunchAgent script takes this form (per [Iru's documentation](https://support.kandji.io/kb/configuring-device-enrollment)): ``` https://yourcompany.kandji.io/enroll/access-code/ENROLLMENTCODE ``` Replace `yourcompany` with your Iru subdomain and `ENROLLMENTCODE` with the code from your Blueprint (remove the dash between the two number groups). Add the following script to your golden image at `/usr/local/bin/iru-enroll.sh`. Swap `com.yourcompany` for your reverse-domain identifier. ```bash theme={null} mkdir -p /usr/local/bin ``` ```bash theme={null} #!/bin/bash # Runs at boot via LaunchDaemon. Verifies network prerequisites for Iru # enrollment and monitors enrollment state. Self-removes once MDM enrollment # is confirmed. IRU_ENDPOINT="https://kandji.io" DAEMON_PLIST="/Library/LaunchDaemons/com.yourcompany.iru-enroll.plist" LOG="/var/log/iru-enroll.log" MAX_ATTEMPTS=10 ATTEMPT_FILE="/var/tmp/.iru-enroll-attempts" log() { echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG" } attempts=0 [ -f "$ATTEMPT_FILE" ] && attempts=$(cat "$ATTEMPT_FILE") if [ "$attempts" -ge "$MAX_ATTEMPTS" ]; then log "Max attempts ($MAX_ATTEMPTS) reached. Verify network and Iru endpoint reachability." exit 1 fi if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then log "MDM enrolled. Cleaning up LaunchDaemon." launchctl unload "$DAEMON_PLIST" 2>/dev/null rm -f "$DAEMON_PLIST" "/usr/local/bin/iru-enroll.sh" "$ATTEMPT_FILE" exit 0 fi network_ready=false for i in $(seq 1 12); do if curl -s --connect-timeout 5 -o /dev/null "${IRU_ENDPOINT}"; then network_ready=true break fi log "Waiting for network... attempt $i" sleep 5 done if [ "$network_ready" = false ]; then log "Network not available. Will retry at next interval." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 1 fi log "Prerequisites OK. Awaiting user login to complete enrollment via Iru enrollment URL." echo $((attempts + 1)) > "$ATTEMPT_FILE" exit 0 ``` ```bash theme={null} chmod 755 /usr/local/bin/iru-enroll.sh ``` Add this to your golden image at `/Library/LaunchDaemons/com.yourcompany.iru-enroll.plist`. ```xml theme={null} Label com.yourcompany.iru-enroll ProgramArguments /bin/bash /usr/local/bin/iru-enroll.sh RunAtLoad StartInterval 300 StandardOutPath /var/log/iru-enroll.log StandardErrorPath /var/log/iru-enroll.log ``` ```bash theme={null} chown root:wheel /Library/LaunchDaemons/com.yourcompany.iru-enroll.plist chmod 644 /Library/LaunchDaemons/com.yourcompany.iru-enroll.plist ``` Add the following script to your golden image at `/usr/local/bin/iru-enroll-prompt.sh`. Replace `YOUR_IRU_ENROLLMENT_URL` with the URL from your Iru admin console. ```bash theme={null} #!/bin/bash # Runs at login via LaunchAgent. Prompts the user to complete MDM enrollment # via the Iru enrollment URL. Cleans itself up once enrollment is confirmed. IRU_ENROLLMENT_URL="https://yourcompany.kandji.io/enroll/access-code/YOUR_ENROLLMENT_CODE" AGENT_PLIST="/Library/LaunchAgents/com.yourcompany.iru-enroll-prompt.plist" if profiles status -type enrollment 2>/dev/null | grep -q "MDM enrollment: Yes"; then launchctl unload "$AGENT_PLIST" 2>/dev/null rm -f "$AGENT_PLIST" "/usr/local/bin/iru-enroll-prompt.sh" exit 0 fi button=$(osascript < Add this to your golden image at `/Library/LaunchAgents/com.yourcompany.iru-enroll-prompt.plist`. ```xml theme={null} Label com.yourcompany.iru-enroll-prompt ProgramArguments /bin/bash /usr/local/bin/iru-enroll-prompt.sh RunAtLoad ``` ```bash theme={null} chown root:wheel /Library/LaunchAgents/com.yourcompany.iru-enroll-prompt.plist chmod 644 /Library/LaunchAgents/com.yourcompany.iru-enroll-prompt.plist ``` 1. Don't load the LaunchDaemon or LaunchAgent in the image itself. They load on first boot and first login of each provisioned VM. 2. Confirm no MDM profile is already enrolled: `profiles status -type enrollment` should return "MDM enrollment: No". 3. Publish the image in Orka. *** ### Verifying enrollment After provisioning a VM from your updated golden image: ```bash theme={null} # Check what the LaunchDaemon did cat /var/log/iru-enroll.log # Confirm MDM profile was installed after the user approved profiles status -type enrollment ``` In the Iru admin console, check **Devices** to confirm the VM appears with an enrolled status. *** ### A few things worth knowing **Each VM gets its own record.** Orka assigns each VM a unique hardware UUID, so every desktop shows up as a separate device in Iru. Plan for periodic cleanup of stale records from destroyed VMs. **The enrollment URL is baked into the image.** The LaunchAgent script contains your Iru enrollment URL. Apply the same access controls to this image that you'd use for any artifact containing configuration secrets. Rotate the URL on a defined schedule if Iru supports it. **macOS devices enrolled via the Iru Enrollment Portal are supervised.** Per [Iru's documentation](https://support.kandji.io/kb/configuring-device-enrollment), macOS devices enrolled through the Enrollment Portal (rather than ADE) are supervised on macOS. This is different from iOS, where supervision requires ADE. For Orka VMs specifically, validate this behavior against a live Iru installation; the general platform behavior is documented, but VM-specific edge cases may apply. **If enrollment isn't triggering,** check `/var/log/iru-enroll.log`. Common causes: no network at boot, or an MDM profile already present in the image before sealing. *** ## Security considerations The following applies across all three MDM platforms, with tool-specific notes where the behavior differs. **A user with local admin rights can remove the MDM profile, unless `PayloadRemovalDisallowed` is set.** Because Orka VMs enroll via profile-based Device Enrollment (not ADE), the MDM profile is removable by default. A user with admin access can open System Settings > General > Device Management and click Remove Management. To prevent this, your MDM must explicitly set `PayloadRemovalDisallowed` in the enrollment profile. Jamf, Intune, and Iru all support this setting, but it's not enabled automatically on user-initiated enrollment flows. Check your MDM's enrollment profile configuration. For Intune specifically, losing the MDM profile triggers a Compliance policy non-compliance state, which Conditional Access can use to automatically block access to corporate apps, a useful side effect that Jamf and Iru don't provide natively. **The LaunchDaemon provides partial recovery, not prevention.** The daemon is configured with a `StartInterval` of 300 seconds, so it re-runs every five minutes and checks enrollment state. If the MDM profile has been removed, the daemon detects the unenrolled state but cannot reinstall the profile silently on an unsupervised device. For Jamf, the daemon can re-create the computer record and reinstall the management framework on its own, but the MDM profile approval still requires user action. For Intune and Iru, the daemon can only ensure the LaunchAgent is in place to re-prompt at next login. It can't force the click-through. There is also a gap window of up to five minutes between profile removal and the next daemon run during which the VM is unmanaged. **Restrict local admin if MDM persistence is a compliance requirement.** The most effective control is to not give the end user admin rights on the VM. Without admin, the user can't remove a profile from System Settings, and the most common removal vectors (`profiles remove`, MDM payload deletion via the UI) require elevation. Standard-user accounts on the VM, with admin held by a separate provisioning identity, close most of this gap. **Monitor for unenrollment.** Treat lost MDM enrollment as an event worth alerting on. * **Jamf:** Create a smart group with the criterion "MDM Profile Removed" is "Yes", or "Last Inventory Update" older than your expected check-in interval. Configure a webhook, email notification, or policy that fires on smart group membership changes. * **Intune:** Create a dynamic device group in Entra ID flagging devices whose `lastSyncDateTime` is older than your expected check-in interval, or whose enrollment state has dropped. Wire it to an Azure Monitor alert or a Logic App webhook. * **Iru:** Use the Iru admin console's device compliance views to surface unenrolled devices. **Treat image credentials as secrets.** The Jamf enrollment script contains your JSS URL and invitation code. The Iru script contains your enrollment URL. A user who extracts these from a running VM can use them to enroll arbitrary devices until the credentials are rotated. Rotate on a defined schedule and re-seal the image, especially after personnel changes. Intune does not bake a credential into the image. Enrollment depends on the user's own Entra ID account and license, which is a smaller attack surface. *** ## References **Jamf Pro** * [Jamf Pro documentation](https://learn.jamf.com) * [User-Initiated Enrollment](https://learn.jamf.com/en-US/bundle/jamf-pro-documentation-current/page/User-Initiated_Enrollment_for_Computers.html) **Microsoft Intune** * [Set up enrollment for macOS devices in Intune](https://learn.microsoft.com/en-us/intune/intune-service/enrollment/macos-enroll) * [Enroll virtual macOS machines for testing](https://learn.microsoft.com/en-us/intune/intune-service/enrollment/macos-enroll#enroll-virtual-macos-machines-for-testing) * [Troubleshoot macOS VM enrollment in Intune](https://learn.microsoft.com/en-us/troubleshoot/mem/intune/device-enrollment/troubleshoot-macos-vm-enrollment) * [User-approved enrollment](https://learn.microsoft.com/en-us/intune/intune-service/enrollment/macos-enroll#user-approved-enrollment) * [Get an Apple MDM Push certificate for Intune](https://learn.microsoft.com/en-us/intune/device-enrollment/apple/create-mdm-push-certificate) **Iru (formerly Kandji)** * [Configuring device enrollment](https://support.kandji.io/kb/configuring-device-enrollment) * [Device enrollment guide for Apple IT](https://www.iru.com/blog/guide-for-apple-it-device-enrollment-uamdm-tcc-and-device-supervision) # USB passthrough guide Source: https://docs.macstadium.com/remote-desktop-vdi/configuration/usb-passthrough-guide USB redirection with Citrix macOS VDA on MacStadium: mass storage, HID devices, and iDevices. Requires Citrix macOS VDA 2409+ and the Citrix Workspace App. Citrix Virtual Delivery Agent (VDA) for macOS supports [USB redirection](https://docs.citrix.com/en-us/mac-vda/configure/general-content-redirection/usb-redirection), allowing locally connected USB devices to be accessed within a remote macOS desktop session hosted on MacStadium infrastructure. This enables developers and power users to interact with USB devices (such as external drives, HID devices, and iPhones/iPads) as if they were physically attached to the remote Mac. ### Supported Devices and Scenarios #### Mass Storage Devices (USB drives, external disks) * Supported beginning with Citrix macOS VDA release 2409. * Requires enabling the USB redirection policy in Citrix DaaS or Citrix Virtual Apps and Desktops. * Works reliably from Windows Citrix Workspace App clients. #### HID Devices * Examples: Wacom tablets, game controllers. * Redirection supported via Generic USB virtual channel. #### iDevices (iPhone/iPad) * Supported beginning with [Citrix macOS VDA release 2507](https://docs.citrix.com/en-us/mac-vda/whats-new). * Enables app developers to connect physical devices for debugging in Xcode. ### Known Limitations Citrix Workspace App for macOS (CWA Mac) * On macOS 15.4 and later, USB mass storage redirection may fail when using the Generic USB virtual channel. * Devices may appear in the Workspace App interface but not mount in Finder. * Known issue under active investigation by Citrix (see Citrix Workspace App for Mac release notes: [About this release | Citrix Workspace™ app for Mac](https://docs.citrix.com/en-us/citrix-workspace-app-for-mac/whats-new.html#known-issues-1)). Performance Constraints * USB passthrough is highly sensitive to network latency. Round-trip latency >150–200ms may prevent devices from mounting properly. * For best results, low-latency connections (\<100ms) are recommended. Client Platform Differences * Windows Workspace clients are more stable for USB redirection today. * macOS Workspace clients may be impacted by ongoing [known issues](https://docs.citrix.com/en-us/mac-vda/known-issues). ### Recommendations * Confirm USB Redirection policy is enabled for the correct Delivery Group in Citrix DaaS/Virtual Apps and Desktops. * If using macOS clients, monitor Citrix release notes for resolution of known issues. * For latency-sensitive testing, use a Windows client or connect from a low-latency environment. * For debugging, collect logs using: ```bash theme={null} sudo xdlcollect ctxsession -v # Check session latency ``` ### Testing guide Target system: * Either Orka VM or MacStadium bare metal Mac, running macOS 14.x or later with Citrix VDA 2409+ installed. * Citrix DaaS or Citrix Virtual Apps & Desktops with USB Redirection policy enabled. * Citrix Workspace App installed on test client(s): * Windows 11 client (recommended baseline). * macOS 15.4+ client (to validate current known issue). Physical USB devices: * Mass storage device (USB drive). * Optional: HID device (Wacom tablet, game controller). * Optional: iPhone/iPad (for developer redirection testing). 1. **Enable policy:** Confirm USB Redirection is enabled for the correct Delivery Group, then allow \~5 minutes for policy propagation. 2. **Connect from client:** Plug the USB device into the local client. Launch Citrix Workspace App, open the macOS VDA desktop session, and check the Devices menu in the Workspace toolbar for the USB device. 3. **Switch redirection mode:** If the device isn't mounted, try switching from Optimized to Generic. On macOS 15.4+, Generic may revert to Optimized (known issue). 4. **Validate in VDA:** Inside the VDA, check Finder for the mount. Run the following to confirm detection: ```bash theme={null} diskutil list ``` 5. **Network latency check:** Run the following and check the output. If latency is greater than 150–200ms, the device may not mount. ```bash theme={null} ctxsession -v ``` 6. **Collect logs (if issues):** Run the following, then save and attach logs for escalation. ```bash theme={null} sudo xdlcollect ``` * **Windows client:** USB mass storage should appear and mount in Finder. * **macOS client:** Device may show but not mount due to known issue. * **HID devices and iDevices:** Should redirect and function if supported by the installed release. # Getting started: MSDC-hosted Source: https://docs.macstadium.com/remote-desktop-vdi/getting-started/msdc-hosted Deploy MacStadium VDI on MacStadium-managed infrastructure. Covers connecting to ready Mac hosts, configuring the environment, and launching your first VMs. MacStadium has already provisioned your Mac hosts, configured networking, and installed macOS. This guide covers everything on your side: connecting to your infrastructure, setting up the orchestration controller, and deploying your first macOS VMs. If you haven't received your VPN credentials, Orka Engine license key, and installer URL from your MacStadium account representative, request those before starting. ## Prerequisites Before you begin, confirm you have the following: * A controller machine (macOS or Linux) with internet access * Minimum: 2 vCPU, 4 GB RAM, 20 GB storage * Recommended: 4 vCPU, 8 GB RAM, 50 GB storage * VPN credentials from MacStadium * IP addresses for your Mac hosts (provided by MacStadium) * Orka Engine license key and installer URL (from your MacStadium account representative) * An administrator account on your controller machine Don't enable FileVault on Mac hosts without coordinating with MacStadium first. If a host with FileVault enabled powers down, a MacStadium data center technician must intervene on-site before the host can be accessed remotely. If your security policy requires FileVault, use macOS Tahoe on your hosts. Tahoe supports pre-boot SSH for remote disk decryption, which avoids the need for on-site intervention. FileVault is not officially supported by MacStadium. See [Security and Encryption](/remote-desktop-vdi/configuration/customer-environment-tips#security-and-encryption) for details. *** ### Connect to your MacStadium network All Mac hosts are on MacStadium's private network. You'll need an active VPN connection before the controller can reach them. Connect using the VPN credentials provided by MacStadium. If you haven't configured your VPN client yet, see [VPN Connection](/orka/networking-with-orka-at-macstadium/vpn-connection). Once connected, verify you can reach your hosts: ```bash theme={null} ping 10.0.100.10 ``` Repeat for each host IP in your fleet. All hosts must be reachable before you continue. ### Set up your controller Run all steps in this section on your controller machine. **Set the hostname** Set a consistent hostname before configuring anything else. Replace `example-controller` with your chosen name. ```bash theme={null} sudo scutil --set ComputerName "example-controller" sudo scutil --set LocalHostName "example-controller" sudo scutil --set HostName "example-controller" dscacheutil -flushcache ``` **Install Homebrew** ```bash theme={null} /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew doctor ``` **Install Ansible** Modern versions of macOS prevent installing Python packages system-wide. Install Ansible through pipx to keep it isolated from the system Python environment. ```bash theme={null} brew install pipx pipx install ansible-core==2.18.4 pipx install ansible==11.4.0 ``` ### Configure SSH access to your hosts Ansible uses SSH key authentication to connect to each Mac host. **Generate an SSH key** If you don't already have one: ```bash theme={null} ssh-keygen -t ed25519 ``` Accept the default file path or specify your own. **Copy the key to each host** Run once per host, substituting the correct IP address: ```bash theme={null} ssh-copy-id administrator@10.0.100.10 ``` Verify the connection before continuing: ```bash theme={null} ssh administrator@10.0.100.10 ``` Repeat for each host in your fleet. ### Configure the orchestration library Run all steps in this section on your controller. **Clone the repository** ```bash theme={null} mkdir -p ~/orka-automation cd ~/orka-automation git clone https://github.com/macstadium/orka-engine-orchestration.git cd orka-engine-orchestration ``` **Create the inventory file** The inventory file tells Ansible which hosts to manage. Add the IP address of each Mac host: ```bash theme={null} mkdir -p dev/group_vars/all touch dev/group_vars/all/main.yml vim inventory ``` Inventory file contents: ```ini theme={null} [hosts] 10.0.100.10 10.0.100.11 10.0.100.12 ``` **Configure group variables** Group variables apply settings across all hosts. Open the file created in the previous step: ```bash theme={null} vim dev/group_vars/all/main.yml ``` File contents: ```yaml theme={null} max_vms_per_host: 2 engine_binary: /usr/local/bin/orka-engine ansible_user: administrator vm_image: ghcr.io/macstadium/orka-images/sequoia:latest ``` | Variable | Description | | ------------------- | ---------------------------------------------------------------------- | | `max_vms_per_host` | Maximum VMs per host. Apple's EULA caps macOS VMs at 2 per host. | | `engine_binary` | Path to the Orka Engine binary | | `ansible_user` | SSH username on each host | | `vm_image` | Default base image for VM deployments | | `network_interface` | (Optional) Network interface for bridged networking, for example `en0` | ### Install Orka Engine This playbook installs Orka Engine on every host in your inventory. It applies your license key and starts the service automatically. ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration ansible-playbook install_engine.yml -i inventory -e "orka_license_key=YOUR-LICENSE-KEY" -e "engine_url=YOUR-INSTALLER-URL" ``` Replace `YOUR-LICENSE-KEY` and `YOUR-INSTALLER-URL` with the values from your MacStadium account representative. **Verify the installation** ```bash theme={null} ansible hosts -i inventory -m shell -a "orka-engine --version" ansible hosts -i inventory -m shell -a "/usr/local/bin/orka-engine info" ``` ### Set up the management UI The management UI is the primary interface for IT administrators. It provides a browser-based dashboard for running orchestration playbooks without touching the CLI. **Install prerequisites** Docker and `uv` are required to run the management UI. ```bash theme={null} brew install docker docker-compose brew install uv ``` Docker Desktop is an alternative if you prefer a GUI installer. **Configure the environment** ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration cp semaphore/.env.example semaphore/.env ``` Generate a 32-byte encryption key: ```bash theme={null} head -c32 /dev/urandom | base64 ``` Open `semaphore/.env` and set the following values: ```bash theme={null} vim semaphore/.env ``` ```env theme={null} SEMAPHORE_ACCESS_KEY_ENCRYPTION=your-generated-key-here ``` Also set your admin username and password in the same file before starting. **Start the management UI** ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration docker compose up -d ``` The management UI is available at `http://localhost:3000`. Log in with the admin credentials you set in the `.env` file. **Configure SSH credentials** **Option A: Setup script (recommended)** ```bash theme={null} SEMAPHORE_ADMIN=$YOUR_ADMIN SEMAPHORE_ADMIN_PASSWORD=$YOUR_ADMIN_PASSWORD uv run ./semaphore/configure_semaphore.py --ssh-key-file $YOUR_KEY ``` Run `uv run ./semaphore/configure_semaphore.py --help` to see all available options, including VM credentials and OCI registry settings. **Option B: Manual (UI)** After logging in, navigate to **Key Store** and edit the Mac Hosts SSH key. Replace the placeholder with the actual SSH username and private key for your Mac hosts. ### Deploy your first VM With your hosts configured and the management UI running, you're ready to deploy a macOS VM. From the management UI, open the **Orka Engine Orchestration** project and run the **VM: Deploy VM** template. Enter a unique `vm_name` and the `vm_image` to use. Or run the playbook directly from the controller: ```bash theme={null} ansible-playbook deploy.yml -i inventory -e "vm_name=vdi-test-01" -e "vm_image=ghcr.io/macstadium/orka-images/sequoia:latest" -e "network_interface=en0" ``` Use `network_interface=en0` (bridged networking) for VDI workloads. This gives VMs direct IP addresses on your network, which Citrix Cloud and end users need to reach them without port forwarding. Verify the VM deployed: ```bash theme={null} ansible-playbook list.yml -i inventory -e "vm_name=vdi-test-01" ``` To preview a deployment without making changes, add `--tags plan`: ```bash theme={null} ansible-playbook deploy.yml -i inventory -e "vm_name=vdi-test-01" -e "vm_image=ghcr.io/macstadium/orka-images/sequoia:latest" --tags plan ``` ## Next steps Your infrastructure is ready. Continue with: Register your VMs with Citrix Cloud and configure delivery groups. Build a golden image with Citrix VDA and your organization's applications pre-installed. All available playbooks and common variable combinations in one place. # Self-hosted MacStadium VDI deployment guide Source: https://docs.macstadium.com/remote-desktop-vdi/getting-started/self-hosted Deploy MacStadium VDI on your own on-premises or AWS infrastructure: hardware prep, networking, Orka Engine installation, and first VM deployment. This guide covers deploying MacStadium VDI on infrastructure you manage. Most steps are the same whether you're deploying on-premises or on AWS. Where the steps diverge, tabs or callout blocks mark the difference. Before you start, confirm you have your Orka Engine license key and installer URL from your MacStadium account representative. ## Prerequisites ### Hardware requirements Each Mac host must meet the following minimum specifications: * Apple silicon processor (any M-series chip) * 8 GB RAM * 256 GB storage * 1 GB Ethernet * macOS 15 (Sequoia) or later Recommended per host for production deployments: * M2 Pro, M4 Pro, or higher * 32 GB RAM * 1 TB+ storage * 10 GB Ethernet * macOS 15 (Sequoia) or 26 (Tahoe) Apple's EULA limits macOS virtual machines to 2 per host, regardless of available resources. ### Controller requirements The Ansible controller is a separate machine (macOS or Linux) that runs orchestration playbooks and the management UI. * Minimum: 2 vCPU, 4 GB RAM, 20 GB storage * Recommended: 4 vCPU, 8 GB RAM, 50 GB storage ### Network requirements * Management VLAN with connectivity between the controller and all Mac hosts * Static IPs or DHCP reservations for each host * Outbound TCP 443 from VMs to Citrix Cloud endpoints (if deploying with Citrix DaaS): * `[customer_ID].xendesktop.net` * `*.*.nssvc.net` * `*.citrixworkspacesapi.net` * Inbound TCP/UDP 1494 and 2598 to VMs for HDX sessions * A VPC with a subnet that can reach your Mac hosts (via Direct Connect or VPN) * Security group rules permitting the same Citrix Cloud outbound traffic listed in the On-Premises tab * Inbound TCP/UDP 1494 and 2598 to your VM security group for HDX sessions * See [AWS networking with Orka](/orka/networking-with-orka-at-macstadium/aws-orka-connections) for VPN tunnel setup between AWS and MacStadium or your on-prem network *** ### Prepare your Mac hosts Run all steps in this section on each physical Mac host. Repeat for every host in your fleet. Don't enable FileVault on Mac hosts without a remote recovery plan. If a host with FileVault enabled powers down, you'll need physical access to decrypt the disk before the host can be managed remotely. If FileVault is required by your security policy, use macOS Tahoe (26). Tahoe supports pre-boot SSH for remote disk decryption. See [Security and Encryption](/remote-desktop-vdi/configuration/customer-environment-tips#security-and-encryption) for details. **Assign a static IP** Assign a static IP to each host before installing Orka Engine. Either configure it manually or use a DHCP reservation. **Manual configuration:** 1. Open System Settings → Network → select your interface (Ethernet or Wi-Fi). 2. Set IP address, subnet mask, router, and DNS servers from your management VLAN. 3. Apply and verify connectivity. **DHCP reservation:** 1. Note the MAC address of each host from System Settings → Network → Details → Hardware. 2. Configure your DHCP server to assign a fixed IP to each MAC address. 3. Verify the host receives the reserved IP. Document the following for each host (you'll need it for the Ansible inventory file): | Field | Example | | ----------------- | ----------------- | | Hostname | mac-node-1 | | IP address | 10.0.100.10 | | MAC address | a1:b2:c3:d4:e5:f6 | | Hardware model | Mac mini M4 | | Network interface | en0 | **Set the hostname** Replace `example-host0` with the appropriate hostname for each machine. Use a short name without dots for `HostName`. ```bash theme={null} sudo scutil --set ComputerName "example-host0" sudo scutil --set LocalHostName "example-host0" sudo scutil --set HostName "host0" dscacheutil -flushcache ``` **Install Homebrew** ```bash theme={null} /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew doctor ``` **Verify Python** Python 3 is required for Ansible to manage the host. It ships with macOS but confirm it's present: ```bash theme={null} python3 --version ``` ### Set up your controller Run all steps in this section on the controller machine. **Set the hostname** ```bash theme={null} sudo scutil --set ComputerName "example-controller" sudo scutil --set LocalHostName "example-controller" sudo scutil --set HostName "example-controller" dscacheutil -flushcache ``` **Install Homebrew** ```bash theme={null} /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew doctor ``` **Install Ansible** Modern versions of macOS prevent installing Python packages system-wide. Install Ansible through pipx to keep it isolated from the system Python environment. ```bash theme={null} brew install pipx pipx install ansible-core==2.18.4 pipx install ansible==11.4.0 ``` ### Configure SSH access to your hosts Ansible uses SSH key authentication to connect to each Mac host. Run these steps on the controller. **Generate an SSH key** If you don't already have one: ```bash theme={null} ssh-keygen -t ed25519 ``` Accept the default file path or specify your own. **Copy the key to each host** Run once per host, substituting the correct IP: ```bash theme={null} ssh-copy-id administrator@10.0.100.10 ``` Verify the connection before continuing: ```bash theme={null} ssh administrator@10.0.100.10 ``` Repeat for every host. ### Configure the orchestration library Run all steps in this section on the controller. **Clone the repository** ```bash theme={null} mkdir -p ~/orka-automation cd ~/orka-automation git clone https://github.com/macstadium/orka-engine-orchestration.git cd orka-engine-orchestration ``` **Create the inventory file** ```bash theme={null} mkdir -p dev/group_vars/all touch dev/group_vars/all/main.yml vim inventory ``` Add the IP address of each host: ```ini theme={null} [hosts] 10.0.100.10 10.0.100.11 10.0.100.12 ``` **Configure group variables** ```bash theme={null} vim dev/group_vars/all/main.yml ``` File contents: ```yaml theme={null} max_vms_per_host: 2 engine_binary: /usr/local/bin/orka-engine ansible_user: administrator vm_image: ghcr.io/macstadium/orka-images/sequoia:latest ``` | Variable | Description | | ------------------- | ---------------------------------------------------------------------- | | `max_vms_per_host` | Maximum VMs per host. Apple's EULA caps macOS VMs at 2 per host. | | `engine_binary` | Path to the Orka Engine binary | | `ansible_user` | SSH username on each host | | `vm_image` | Default base image for VM deployments | | `network_interface` | (Optional) Network interface for bridged networking, for example `en0` | ### Install Orka Engine This playbook installs Orka Engine on every host in your inventory, applies your license key, and starts the service. ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration ansible-playbook install_engine.yml -i inventory -e "orka_license_key=YOUR-LICENSE-KEY" -e "engine_url=YOUR-INSTALLER-URL" ``` Replace `YOUR-LICENSE-KEY` and `YOUR-INSTALLER-URL` with the values from your MacStadium account representative. **Verify the installation** ```bash theme={null} ansible hosts -i inventory -m shell -a "orka-engine --version" ansible hosts -i inventory -m shell -a "/usr/local/bin/orka-engine info" ``` **Force reinstall or upgrade** To reinstall or upgrade to a newer version, add the `install_engine_force` flag: ```bash theme={null} ansible-playbook install_engine.yml -i inventory -e "orka_license_key=YOUR-LICENSE-KEY" -e "engine_url=YOUR-INSTALLER-URL" -e "install_engine_force=true" ``` ### Set up the management UI The management UI is the primary interface for IT administrators. It provides a browser-based dashboard for running orchestration playbooks without touching the CLI. **Install prerequisites** ```bash theme={null} brew install docker docker-compose brew install uv ``` Docker Desktop is an alternative if you prefer a GUI installer. **Configure the environment** ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration cp semaphore/.env.example semaphore/.env ``` Generate a 32-byte encryption key: ```bash theme={null} head -c32 /dev/urandom | base64 ``` Open `semaphore/.env` and paste the key: ```bash theme={null} vim semaphore/.env ``` ```env theme={null} SEMAPHORE_ACCESS_KEY_ENCRYPTION=your-generated-key-here ``` Also set your admin username and password in the same file. **Start the management UI** ```bash theme={null} cd ~/orka-automation/orka-engine-orchestration docker compose up -d ``` The management UI is available at `http://localhost:3000`. Log in with the admin credentials you set in `.env`. **Configure SSH credentials** **Option A: Setup script (recommended)** ```bash theme={null} SEMAPHORE_ADMIN=$YOUR_ADMIN SEMAPHORE_ADMIN_PASSWORD=$YOUR_ADMIN_PASSWORD uv run ./semaphore/configure_semaphore.py --ssh-key-file $YOUR_KEY ``` Run `uv run ./semaphore/configure_semaphore.py --help` to see all options, including VM credentials and OCI registry settings. **Option B: Manual (UI)** After logging in, navigate to **Key Store** and edit the Mac Hosts SSH key. Replace the placeholder with the SSH username and private key for your Mac hosts. ### Deploy your first VM With your hosts configured and the management UI running, you're ready to deploy a macOS VM. From the management UI, open the **Orka Engine Orchestration** project and run the **VM: Deploy VM** template. Enter a unique `vm_name` and the `vm_image` to use. Or run the playbook directly: ```bash theme={null} ansible-playbook deploy.yml -i inventory -e "vm_name=vdi-test-01" -e "vm_image=ghcr.io/macstadium/orka-images/sequoia:latest" -e "network_interface=en0" ``` Use `network_interface=en0` (bridged networking) for VDI workloads. VMs get direct IP addresses on your network, which Citrix Cloud and end users need to reach them without port forwarding. Orka 3.5.0 or later is required for bridged networking. Use your management VLAN interface, typically `en0` for Ethernet. Confirm the interface name on each host with `networksetup -listallhardwareports`. Your VMs need to be reachable from Citrix Cloud and from your end users. Confirm that security group rules permit inbound HDX traffic (TCP/UDP 1494, 2598) to the VM subnet. If end users connect over the internet, ensure your Citrix Gateway is configured accordingly. Verify the VM deployed: ```bash theme={null} ansible-playbook list.yml -i inventory -e "vm_name=vdi-test-01" ``` To preview a deployment without making changes, add `--tags plan`: ```bash theme={null} ansible-playbook deploy.yml -i inventory -e "vm_name=vdi-test-01" -e "vm_image=ghcr.io/macstadium/orka-images/sequoia:latest" --tags plan ``` ## Next steps Your infrastructure is ready. Continue with: Register your VMs with Citrix Cloud and configure delivery groups. Build a golden image with Citrix VDA and your organization's applications pre-installed. All available playbooks and common variable combinations in one place. # IT administrator onboarding guide Source: https://docs.macstadium.com/remote-desktop-vdi/it-admin-onboarding-guide IT admin guide for MacStadium VDI. Covers Ansible, Citrix Cloud, and Orka Engine interfaces, user provisioning, image management, and daily operations. This guide introduces IT administrators to managing a deployed MacStadium VDI environment. Once you've completed the initial deployment following the [MacStadium VDI deployment guide](/remote-desktop-vdi/getting-started/self-hosted), this document covers ongoing operations, user management, and system maintenance. **What this guide covers:** * Understanding your role and responsibilities in the support and maintenance of your organization's MacStadium VDI architecture * Navigating core management interfaces (Ansible, Citrix Cloud, Orka Engine) * Executing common operational tasks (provisioning desktops, managing images, troubleshooting) * Establishing operational best practices for your MacStadium VDI environment ## Your role in managing MacStadium VDI As an administrator, you will be responsible for managing the three interconnected systems that make up MacStadium VDI. These are: **Orka Engine (virtualization layer):** * Hosts macOS VMs on Apple silicon hardware * Manages VM lifecycle (create, start, stop, delete) * Handles image storage and distribution Your responsibility: Managing capacity, host health, and VM distribution. **Citrix DaaS/CVAD (delivery layer):** * Brokers user connections to desktops * Manages Machine Catalogs and Delivery Groups * Controls access policies and user assignments Your responsibility: User entitlements, session policies, and VDA registration. **Ansible (orchestration layer):** * Automates VM deployment and lifecycle operations * Maintains configuration consistency * Coordinates image management across hosts Your responsibility: Playbook execution, inventory management, workflow automation Day-to-day activities can vary, but will often consist of a mix of provisioning new desktops, managing golden images, performance and capacity monitoring, troubleshooting user access issues, and planning capacity expansions. ### Key concepts and terminology **Orka-specific terms:** * Orka host: Physical Mac running Orka Engine (for example, Mac mini M4, Mac Studio) * VM group: A logical collection of VMs managed together (for example, `citrix-vda-finance`, `citrix-vda-engineering`) * Golden image: Template VM with macOS, Citrix VDA, and applications pre-installed * Max VMs per host: Typically two, due to Apple licensing restrictions * Bridged networking: VMs receive IPs directly from your network (no NAT needed) **Citrix-specific terms:** * Machine catalog: Collection of VMs with similar configuration (these map to VM groups in Orka) * Delivery group: Links machine catalog to users and defines access policies * VDA (Virtual delivery agent): Software on macOS VM that registers with Citrix Cloud * Enrollment token: Time-limited credential for VDA registration * Rendezvous protocol: Enables HDX connections to non-domain-joined VMs **Ansible-specific terms:** * Inventory: List of Orka hosts (`dev/inventory`) * Playbook: YAML file (`deploy.yml`, `vm.yml`) * Group vars: Configuration variables shared across hosts (`dev/group_vars/all/main.yml`) * Tags: Selective playbook execution (for example, `--tags plan` for dry runs) ### Architecture overview: MacStadium VDI architecture diagram ## Getting Started ### Ansible access and credentials setup You will want to verify that you have access to all three MacStadium VDI management layers. #### Ansible control node: The Ansible control node (also known as an "Ansible runner") is where you execute playbooks to manage Orka hosts. Access method: SSH to the Ansible control node `ssh admin@ansible-control.example.com` `cd ~/ansible-citrix-orka` Verify Ansible access: `ansible hosts -i dev/inventory -m ping` `ansible --version` (v2.12 or later recommended) #### Credentials stored in Ansible: * SSH keys for Orka hosts: `~/.ssh/ansible_orka_key` * Ansible Vault password: `.vault_pass` (or manually entered) * Ansible Vault contents: Orka API tokens, Citrix enrollment tokens, registry credentials **Common Ansible tasks:** * Deploying VMs: `ansible-playbook -i dev/inventory deploy.yml` * Managing VM state: `ansible-playbook -i dev/inventory vm.yml` * Creating images: `ansible-playbook -i dev/inventory create_image.yml` ## Citrix Cloud Console access and credentials setup Citrix Cloud Console is the web-based management control plane for Citrix DaaS. Access URL: [https://citrix.cloud.com](https://citrix.cloud.com/)\ Login: Your Citrix Cloud administrator credentials #### Key sections: * Web studio: Machine catalogs, delivery groups, enrollment tokens * Monitor: Session metrics, connection quality, active users * Policies: HDX settings, access control, feature restrictions #### Credentials needed: * Citrix Cloud administrator account * Customer ID (visible in Cloud Console, used in VDA configuration) #### Common tasks performed in Citrix Cloud Console: * Generating enrollment tokens * Creating or modifying Delivery Groups * Assigning users to desktops * Monitoring session health ## Orka Hosts As an IT administrator, you will need direct SSH access to physical Macs running Orka Engine. This access is used for troubleshooting, not routine operations. You can access your Orka Engine hosts by SSHing directly to the host IP: `ssh admin@10.0.100.10` When you'll need this: * Debugging Orka Engine issues * Checking disk space: `df -h /var/orka` * Reviewing Orka logs: `sudo tail -100 /var/log/orka-engine.log` * Manually inspecting VMs: `orka-engine vm list` **Credentials:** * SSH key: `~/.ssh/ansible_orka_key` (this is the same key Ansible uses) * User: `admin` (or whichever user was configured during deployment) **Important:** Routine, daily operations should use Ansible playbooks, not direct host access. Direct access is for troubleshooting only. ## OCI registry An OCI registry is a container registry for storing your organization's golden images. This can be public (GHCR) or private (Harbor, Artifactory, etc.) #### MacStadium's public GHCR registry: * URL: `ghcr.io/macstadium/orka-images` * No authentication required * Base images: `sonoma:latest`, `sequoia:latest`, `tahoe:latest` #### Private OCI registry: * URL: Defined in `dev/group_vars/all/main.yml` (for example, `registry.example.com`) * Credentials: Stored in Ansible Vault (`vault_registry_username`, `vault_registry_password`) * Contains: Your golden images with Citrix VDA pre-installed #### Common tasks performed when managing OCI images: * Pulling images: `ansible-playbook -i dev/inventory pull_image.yml` * Creating/pushing images: `ansible-playbook -i dev/inventory create_image.yml` ## Citrix Cloud Console Navigation After logging in to [https://citrix.cloud.com](https://citrix.cloud.com/): 1. Hamburger menu: Navigate between services * Select "DaaS" or "Virtual Apps and Desktops" to access Web Studio 2. Web Studio: * Machine Catalogs: View registered VMs, enrollment tokens * Delivery Groups: User assignments, published desktops * Policies: HDX settings, security policies 3. Monitor tab: * Real-time session data * Connection quality metrics * Historical trends 4. Support menu: * Documentation links * Support case management You may wish to run some quick checks to verify service health: * Machine Catalogs → Select your catalog → Verify VMs show "Registered" * Monitor → Check session launch success rate >95% * Monitor → Verify there have been no "Unregistered" machines in past 24 hours ### Connecting to the Ansible Management Node Initial connection: `ssh admin@ansible-control.example.com`\ `cd ~/ansible-citrix-orka`\ `cat dev/inventory` Expected output: `[hosts]`\ `10.0.100.10`\ `10.0.100.11`\ `10.0.100.12` ### Testing Ansible connectivity `ansible hosts -i dev/inventory -m ping` ### If Ansible connectivity fails: * Verify the SSH key exists: `ls -la ~/.ssh/ansible_orka_key` * Test direct SSH connectivity: `ssh -i ~/.ssh/ansible_orka_key admin@10.0.100.10` * Check that your Ansible inventory file has the correct IPs listed Common environment variables: Review Ansible configuration in `dev/group_vars/all/main.yml`: `cat dev/group_vars/all/main.yml` ##### Key Ansible variables: * `ansible_user`: SSH user (typically `admin`) * `vm_image`: Default golden image path * `max_vms_per_host`: VM capacity limit (typically `2`) * `.vault_pass`: Sensitive credentials (passwords, etc.) are encrypted with Ansible Vault. * View Vault contents with: `ansible-vault view dev/group_vars/all/vault.yml` * Note: Keep your `.vault_pass` secure, never commit it to Git. If this is ever lost, you'll need to recreate your Ansible vault file with new credentials. * Ansible vault contains the following: * `vault_citrix_enrollment_token` * `vault_citrix_customer_id` * `vault_registry_username` / `vault_registry_password` ##### Reviewing Mac Host inventory * List all Orka hosts: `ansible hosts -i dev/inventory --list-hosts` * Check Orka Engine version on all hosts: `ansible hosts -i dev/inventory -m shell -a "orka-engine --version"` * Check capacity per host: ```bash theme={null} ansible-playbook -i dev/inventory list.yml ``` Example output: ``` Host: 10.0.100.10 VMs: citrix-vda-finance-abc123, citrix-vda-finance-def456 Count: 2/2 (at capacity) Host: 10.0.100.11 VMs: citrix-vda-eng-xyz789 Count: 1/2 (available capacity) Host: 10.0.100.12 VMs: (none) Count: 0/2 (available capacity) ``` * Check available disk space: `ansible hosts -i dev/inventory -m shell -a "df -h /var/orka"` Look for: * \<70% used: Healthy * 70-85% used: Plan for cleanup or expansion * > 85% used: Action required (delete old images, expand storage) **Document your inventory:** Create a reference document containing the following information: * Host IP * Hardware model (Mac mini M4, Mac Studio M2 Ultra, etc.) * Current VM count * Available capacity * Network interface (10Gb vs 1Gb) * Notes (for example, "Reserved for engineering team") Having this information documented and updated regularly helps with capacity planning and troubleshooting. ## Core workflows ### Provisioning a new desktop MacStadium VDI VM provisioning flow: sequence diagram showing the IT Admin, Control Plane, Automation, Orka Engine, Image Registry, MDM, and Session Broker steps Follow this workflow when a user requests access to a macOS virtual desktop. Be sure the following prerequisites have been met before proceeding: * The user account exists in your identity provider (Azure AD, Okta, etc.) * The user is assigned to the appropriate Delivery Group in Citrix Cloud * There is available capacity on your Orka hosts (at least 1 VM slot free) * The appropriate golden image is cached on the host(s) 1. Select the appropriate golden image. Determine this based on the user's department/role/access needs: `ansible hosts -i dev/inventory -m shell -a "orka-engine image list"` will list all available images in Orka Engine. For example: `registry.example.com/citrix-vda/sonoma-finance:latest.` If the golden image isn't cached, run:\ `ansible-playbook -i dev/inventory pull_image.yml \ -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:latest"` (This can take 5-15 minutes depending on the image size and your network speed) 2. Run Ansible playbook: VM Deploy Always run `--tags plan` first: `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=citrix-vda-finance \ desired_vms=11" \ --tags plan` This shows the current VM count per host, where new VMs will be deployed, which host has available capacity, and **does not** create VMs (dry run only). When reviewing the plan output, you will want to verify that the new VM will deploy to a host with capacity, the correct golden image will be used, and that the network configuration looks correct. Next, you will want to execute the deployment: `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=citrix-vda-finance \ desired_vms=11 \ vm_image=registry.example.com/citrix-vda/sonoma-finance:latest"` This typically takes between 5-10 minutes, and completes the following steps in the playbook: \- Ansible selects hosts with available inventory\ \- VM is created from the selected golden image\ \- VM boots and VDA service starts\ \- VDA registers with Citrix Cloud using an enrollment token\ \- Desktop appears in the Machine Catalog as "Available" You can monitor the progress of your deployment in another terminal by running the following command: `watch -n 10 'ansible-playbook -i dev/inventory list.yml -e "vm_group=citrix-vda-finance"'` 3. Verify VDA registration in Citrix \- Navigate to Citrix Cloud Console → Web Studio → Machine Catalogs\ \- Select your Machine Catalog (for example, "Orka-macOS-Sonoma-Finance")\ \- Refresh the machine list\ \- New VMs should appear with:\ \- Registration state: 'Registered'\ \- Power state: 'On'\ \- Fault state: 'None' If the VM doesn't appear after 10 minutes, check the VDA service status by running: `ansible-playbook -i dev/inventory list.yml -e "vm_group=citrix-vda-finance"`\ `ansible mac_vms -i dev/inventory -m shell \ -a "sudo launchctl list | grep citrix" \ --limit 10.0.100.10` Expected output: Service running with PID. To confirm this, you can check the VDA logs by running: `ansible mac_vms -i dev/inventory -m shell \ -a "sudo tail -50 /Library/Application\ Support/Citrix/VDA/Logs/vda.log" \ --limit 10.0.100.10` You should see a message similar to: 'Registration successful', or 'Connected to broker'. To troubleshoot VDA registration failures, see the Troubleshooting Quick Reference Guide. 4. Assign to user/delivery group If you're using a static/dedicated assignment: \- In Citrix Cloud Console → Web Studio → Delivery Groups\ \- Select Delivery Group (for example, "Finance-macOS-VDI")\ \- Click "Edit Delivery Group" → "Users" tab\ \- Add user: Search for user account, select, assign to specific VM If using pooled/random assignments: No action is needed if the user has already been assigned to a Delivery Group. The next available VM will be assigned automatically when the user launches a desktop. You will want to verify that the user has access by: \- Having the user launch the Citrix Workspace application\ \- User logs in\ \- Desktop should appear: "Mac OS Finance Desktop" (or configured display name)\ \- User clicks desktop → session launches successfully The desktop should appear in Citrix Workspace immediately after being assigned to a Delivery Group, and should launch within 15-30 seconds. When the provisioning workflow has completed, the user will now have access to their macOS virtual desktop. ### Managing images Golden images are the foundation for rapid desktop provisioning. The image lifecycle is typically: * Create: Build a golden image with macOS + VDA + applications * Test: Deploy a test VM and validate its functionality * Publish: Push your image to an OCI registry with an applicable version tag * Cache: Pull an image to all Orka hosts * Deploy: Use an image for new VM provisioning * Update: Apply patches and create a new image version * Retire: Remove old image versions after migration to a new version is complete You will need to create new golden images when a new application is required for your team (for example, Microsoft Office, Slack, etc.), Citrix VDA updates, or you have department-specific configurations to consider (design tools such as Adobe, or engineering IDEs such as Jetbrains or Visual Studio Code). Before beginning this workflow, ensure the following prerequisites have been met: * Configuration scripts are prepared in the `/scripts` directory * A base macOS image is available * Registry credentials are in Ansible Vault The `create_image.yml` playbook automates the following: * Deploy a temporary VM from a base image * Run configuration scripts * Commit VM to an image * Push image to a container registry with a version tag applied * Delete temporary VM To prepare the configuration steps, you will need to navigate to the `/scripts` directory in your project: `cd ~/ansible-citrix-orka/scripts `\ `ls -la` Scripts execute in alphabetical order. An example script structure would be: `scripts/ `\ `01_install_dotnet.sh .NET Runtime (required for VDA) `\ `02_install_citrix_vda.sh `\ `03_install_office.sh `\ `04_install_slack.sh `\ `05_configure_system.sh `\ `06_cleanup.sh ` Example script (03: install\_office.sh): `#!/bin/bash`\ `set -e`\ `echo "Installing Microsoft Office..."`\ `curl -L -o /tmp/MicrosoftOffice.pkg "https://download.example.com/office.pkg"` `sudo installer -pkg /tmp/MicrosoftOffice.pkg -target /` `if [ -d "/Applications/Microsoft Word.app" ]; then echo "Office installed successfully" else echo "Office installation failed" exit 1 fi` `rm /tmp/MicrosoftOffice.pkg `\ `echo "Office installation complete"` Important notes: * Scripts run as `admin` user with sudo privileges * Test scripts individually before image creation * Include error handling (`set -e`, exit codes) * Clean up temporary files Next, you'll want to run the `create_image` playbook: ```bash theme={null} ansible-playbook -i dev/inventory create_image.yml -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0 registry_username=[VAULT_REGISTRY_USERNAME] registry_password=[VAULT_REGISTRY_PASSWORD]" ``` What happens when running this playbook: * The playbook deploys a temporary VM named `image-builder-[timestamp]` * VM boots (2-3 minutes) * Scripts are copied to the VM via SSH * Scripts execute sequentially * VM shuts down cleanly * The image is committed (in this example, `sonoma-finance:v2.0`) * Image is pushed to `registry.example.com/citrix-vda/sonoma-finance:v2.0` * Temporary VM is deleted This can take 20-40 minutes depending on the number of applications to install, if there are any macOS updates, and the network speed. Testing new images is critical. To test an image before production use, you can run the following Ansible script: `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=test-image-v2 \ desired_vms=1 \ vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0"` You will want to verify that the VM has deployed successfully, the VDA registers with Citrix Cloud, applications launch correctly, there are no errors in the VDA logs, and test users can launch sessions and access applications. If issues are found, you can fix any script errors in the `/scripts` directory, delete the failed image from your container registry, and re-run `create_image.yml` with the corrected scripts. Once the image has been validated, you can tag it as `:latest` for production use. To do so, you can re-run `create_image.yml` or if you have registry access, you can do so via your container registry's CLI (for example, Docker): `docker pull registry.example.com/citrix-vda/sonoma-finance:v2.0 `\ `docker tag registry.example.com/citrix-vda/sonoma-finance:v2.0 \ registry.example.com/citrix-vda/sonoma-finance:latest `\ `docker push registry.example.com/citrix-vda/sonoma-finance:latest` You can also update `dev/group_vars/all/main.yml`: `vm_image: registry.example.com/citrix-vda/sonoma-finance:v2.0` ### Updating Existing Images **Patch an existing golden image:** 1. Pull the current production image 2. Create a new image version with patches applied 3. Test the image thoroughly 4. Update the `vm_image` default to new version 5. Recreate VMs from the new image (for persistent desktops) **For non-persistent (pooled) desktops:** * Update the `vm_image` default image * New sessions will automatically use the updated image * Existing VMs are recreated upon the next user logout **For persistent (dedicated) desktops:** * Schedule a maintenance window * Delete old VMs * Deploy a VM from the newly created image * Restore user data from backups (if applicable) #### Caching Images Across Hosts **Why cache:** * Faster VM deployment (no download wait) * Reduces network bandwidth during deployments * Ensures consistency across hosts ##### Cache images on all hosts: `ansible-playbook -i dev/inventory pull_image.yml \ -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0"` ##### Verify cached image: `ansible hosts -i dev/inventory -m shell -a "orka-engine image list | grep sonoma-finance"` ##### Cache multiple images: ##### `ansible-playbook -i dev/inventory pull_image.yml \ -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:latest"` `ansible-playbook -i dev/inventory pull_image.yml \ -e "remote_image_name=registry.example.com/citrix-vda/sonoma-engineering:latest"` ##### Remove old image versions to free space: `ansible hosts -i dev/inventory -m shell -a "df -h /var/orka"`\ `ansible hosts -i dev/inventory -m shell \ -a "orka-engine image rm sonoma-finance:v1.0"` Best practice: Maintain 2-3 recent versions cached, and delete older versions quarterly. ### Version control and rollback #### **Version numbering scheme:** Use semantic versioning: `MAJOR.MINOR.PATCH` * `v1.0.0` - Initial release * `v1.1.0` - Added new application * `v1.1.1` - Security patch * `v2.0.0` - Major update (macOS version upgrade) Track versions by maintaining a CHANGELOG.MD in your Git repository. If a new image causes issues, you can identify the last known good version by checking the CHANGELOG.MD or registry tags. Next, you will want to update the default image: `vim dev/group_vars/all/main.yml`\ `vm_image: registry.example.com/citrix-vda/sonoma-finance:v1.2.1`(for example, rollback to v1.2.1) Then, you will want to recreate the affected VMs by deleting the VMs using the problematic image, and redeploying from the rollback image: `ansible-playbook -i dev/inventory delete.yml \ -e "vm_group=citrix-vda-finance \ delete_count=10"`\ `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=citrix-vda-finance \ desired_vms=10 \ vm_image=registry.example.com/citrix-vda/sonoma-finance:v1.2.1"` You will want to communicate this change to users: "We've rolled back to the previous desktop image version due to \[the previously identified issue]. Your desktop will be refreshed automatically." Rollback time is estimated to take between 30-60 minutes for 20-30 VMs. ### User assignment and policies This involves managing which users can access specific desktops, and what they can do within active sessions. ### Working with Citrix Delivery Groups Delivery Groups link Machine Catalogs (VMs) to your users. To view existing Delivery Groups: Navigate to Citrix Cloud Console → Web Studio → Delivery Groups. You should then see a list of configured Delivery Groups. For example: `Finance-macOS-VDI` - 50 VMs, pooled, 150 users #### Create a new Delivery Group In a scenario where a team may need new macOS desktops within your MacStadium VDI instance, you can run an Ansible deployment playbook similar to the following example: `ansible-playbook -i dev/inventory deploy.yml \`\ `-e "vm_group=citrix-vda-marketing \`\ `desired_vms=15 \`\ `vm_image=registry.example.com/citrix-vda/sonoma-standard:latest"` After running the playbook, proceed through the following steps: 1. Navigate to Citrix Cloud Console → Delivery Groups → Create New Delivery Group 2. Select machines by choosing the Machine Catalog containing the new VMs created in the previous step(s) 3. Add users by clicking "Add", searching for the specified team, and selecting the correct AD/Azure AD group. Alternatively, you can add users individually. 4. To configure desktops, give them a display name (for example, "macOS Marketing Desktop") and add a description for the VM. 5. Choose 'Add Desktop' as the Delivery Type #### Modify existing Delivery Groups Add a user to an existing group: 1. Delivery Groups → Select group → Edit 2. Users tab → Add → Search for the selected user → Assign Remove user: 1. Delivery Groups → Select group → Edit 2. Users tab → Select user → Remove #### **Assignment types:** ##### **Static (dedicated):** * Each user is assigned permanently to a specific VM * The VM retains the user's settings, files (if they are stored locally) * Best used for: Developers, power users ##### **Pooled (random):** * User gets the next available VM * The VM resets to golden image after logout * Best used for: Individual task workers and call centers ##### **Change assignment type:** Typically, you cannot change an existing Delivery Group's assignment type. Instead, you can do the following: 1. Create a new Delivery Group with the desired assignment type 2. Migrate your users to the new group 3. Delete the old Delivery Group ### Access Control and Entitlements These settings control which users can access desktops and from where. #### **User entitlements:** In Citrix, `entitlements` are what grant users permission to access specific resources. ##### **Grant access:** * Assign the user to a Delivery Group (see Provisioning a new desktop, earlier on this page) * The user sees the assigned desktop in Citrix Workspace immediately ##### **Revoke access:** * Remove the user from a Delivery Group * The desktop disappears from the user's Workspace within 5 minutes ##### **Conditional access:** Require specific conditions for desktop access: 1. Citrix Cloud Console → Web Studio → Policies 2. Create a new policy, or edit an existing policy 3. Configure conditions: * Device type: macOS, iOS, web only * Network location: Internal network only, or allow external network * Device compliance: Require managed device (if using MDM) Example policy: "The finance team can only access desktops from inside the corporate network or via a VPN" ### Multi-factor authentication (MFA): This is enforced at the identity provider level (Azure AD, Okta), not in Citrix directly. Configure MFA from within your IdP: * Require MFA for Citrix Workspace access * Users will be prompted for a second factor during login ### Session Policies and Preferences These control user session behavior. ##### **Session timeout:** 1. Navigate to Citrix Cloud Console → Web Studio → Policies 2. Edit the policy for the necessary Delivery Group 3. Configure session settings: * Session idle timeout: Disconnect after X hours idle (default: 24 hours) * Disconnected session timeout: Log off user(s) after X hours disconnected (default: never) Recommended settings: * Pooled desktops: 8 hours idle, 30 minutes disconnected (aggressive cleanup) * Dedicated desktops: 24 hours idle, never disconnect (preserve work) ##### **Reconnection:** This allows users to reconnect to disconnected sessions: * Policy → Session → Connection → Enable "Session reconnection" * When users close Workspace without logging out, their session is preserved * When users reopen their Workspace, they can reconnect to same session #### **Feature policies (HDX settings):** These control what users can do within sessions. Common policies: ##### **Clipboard:** * Bidirectional: Copy/paste both ways (client ↔ VM) * Client to VM only: Users can paste into the VM, but not copy out * Disabled: No clipboard access Configure: 1. Policies → HDX Settings → Clipboard redirection 2. Select: Allowed / Prohibited / Client to VM only ##### **File transfer:** * Allow: Users can drag files between client and VM * Prohibit: No file transfers are allowed Configure: 1. Policies → HDX Settings → Client drive redirection 2. Select: Allowed / Prohibited ##### **USB redirection:** * Allow specific devices: Keyboards, mice, smart cards * Prohibit all: Block USB entirely Configure: 1. Policies → HDX Settings → USB device redirection 2. Select device classes allowed ##### **Printing:** * Client printer mapping: The user's local printers appear in the VM * Disable: No printing Configure: 1. Policies → Printing → Client printer redirection 2. Select: Allowed / Prohibited ##### **Example policy set (Finance team - secure):** * Clipboard: Client to VM only (prevent data exfiltration) * File transfer: Prohibited * USB: Prohibited * Printing: Allowed * Session timeout: 8 hours idle ##### **Example policy set (Engineering team - open):** * Clipboard: Bidirectional * File transfer: Allowed * USB: Allowed (specific devices) * Printing: Allowed * Session timeout: 24 hours idle ##### **Apply policies to a specific Delivery Group:** 1. Create a policy with the desired settings configured 2. In Citrix Cloud Console, navigate to Policies → Filter → Set filter to Delivery Group name 3. The chosen policy applies to all users in that group Tip: Create policy templates for common user types (Standard, Power User, Secure) and apply these templates to corresponding Delivery Groups to save time during setup. ### Lifecycle operations These consist of day-to-day VM management operations. You will likely need to Start, Stop, and Delete VMs on a regular basis as needed to troubleshoot VM issues, apply configuration changes requiring a restart, and to help conserve resources during off-peak hours. ##### Start a VM: `ansible-playbook -i dev/inventory vm.yml -e "vm_name=webapp-abc123" -e "desired_state=running"` ##### **Stop a VM:** `ansible-playbook -i dev/inventory vm.yml -e "vm_name=webapp-abc123" -e "desired_state=stopped"` After a VM has been stopped, it shuts down gracefully (clean shutdown). The VDA then unregisters from Citrix (the desktop becomes "Unavailable"), and resources are freed on the Orka host. Users cannot access the desktop until the VM has been restarted. ##### Delete a single VM: `ansible-playbook -i dev/inventory vm.yml -e "vm_name=webapp-abc123" -e "desired_state=absent"` You may also need to recreate a VM from a template in order to refresh pooled desktops to a golden image (remove user changes), fix corrupted VMs, or apply an updated golden image to an existing VM. To delete and re-deploy a VM, see the following example Ansible playbook: `ansible-playbook -i dev/inventory vm.yml \ -e "vm_name=citrix-vda-finance-abc123 \ desired_state=absent" ` `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=citrix-vda-finance \ desired_vms=10 \ vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0"` To recreate VMs in a batch, see the following example: `ansible-playbook -i dev/inventory delete.yml \ -e "vm_group=citrix-vda-finance \ delete_count=10"` `ansible-playbook -i dev/inventory deploy.yml \ -e "vm_group=citrix-vda-finance \ desired_vms=10 \ vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0"` To recreate an estimated 10 VMs, this playbook will take 30-60 minutes to run. User impact will vary depending on if VMs are pooled or dedicated. If a VM is pooled, user impact should be minimal if recreation is done during off-hours. If a VM is assigned to a dedicated user, that user will lose their local data unless it is backed up upon VM recreation. It is considered a best practice to schedule VM reconfiguration during specific maintenance windows, and to notify users in advance. When considering the VM deprovisioning and cleanup process, you will want to remove desktop access when a user leaves your organization, or a VM is no longer needed. To remove users from a Citrix Delivery Group: 1. Navigate to Citrix Cloud Console → Delivery Groups → Select group 2. Edit → Users tab → Remove user The desktop will disappear from the user's Workspace immediately. If a VM has been statically assigned, see the following example Ansible playbook to find and delete a specific user's VM: `ansible-playbook -i dev/inventory list.yml -e "vm_group=citrix-vda-finance"` `ansible-playbook -i dev/inventory vm.yml \ -e "vm_name=citrix-vda-finance-abc123 \ desired_state=absent"` If the user's desktop had local data on it, you will want to SSH into the VM before deletion, copy the user's home directory, and delete the VM after the backup has been confirmed. To delete an entire VM group and bulk-deprovision the VMs, run the following Ansible playbook: `ansible-playbook -i dev/inventory delete.yml \ -e "vm_group=citrix-vda-marketing \ delete_count=15"` #### VM cleanup task checklist: 1. Remove User from the Citrix Delivery Group 2. Delete the VM from Orka 3. Archive User data (if necessary) 4. Update capacity tracking spreadsheet/software 5. Confirm that the VM has been removed from the Machine Catalog in Citrix ### Monitoring and Troubleshooting #### Key metrics to watch: ##### Check daily: 1. VM registration status. Check this by navigating to Citrix Cloud Console → Monitor → Machine Catalogs. You will want to look for: 1. Unregistered Machines: Should be 0 2. Power state "Off": Investigate why VMs are powered off 3. Faults: Any VM faults which require attention 2. Session launch success rate. Check this by navigating to Citrix Cloud Console → Monitor → User Activity. 1. Target: >95% success rate. 2. If User Activity is \<95%: Review failed connection attempts, identify any patterns to help determine the cause (specific users, times issues occur, VMs impacted) 3. Host capacity. This can be checked by running: `ansible-playbook -i dev/inventory list.yml` and verifying: 1. Host capacity: Check and confirm there are no hosts at 2/2 VM capacity. 2. Confirm disk space is >85% 3. If yes, plan for disk expansion or cleanup. ##### Check weekly: 1. Performance trends. You can review these by navigating to Citrix Cloud Console → Monitor → Trends. Review the following: 1. Average session launch time (target: \<30 seconds) 2. Session quality (should be "Good" or "Excellent") 3. Peak concurrent users (plan capacity for 20% growth) 2. Host health can be verified by confirming available disk space using: `ansible hosts -i dev/inventory -m shell -a "df -h /var/orka"` 1. Check for any errors in the Orka logs: `ansible hosts -i dev/inventory -m shell \ -a "sudo grep -i error /var/log/orka-engine.log | tail -20"` 3. Image currency 1. Are VMs running the latest golden image version? 2. Are there any security patches pending? 3. If yes, schedule any updates that are needed and communicate any downtime to Users. ##### Check monthly: 1. Capacity planning 1. Confirm your current VM count vs. your total VM capacity 2. Calculate anticipated user growth trends 3. Use these calculations to help determine your projected need for additional hosts 2. User feedback 1. Are there any session quality complaints? If so, what are they, and are there any trends to surface? Track these in an internal spreadsheet or other tool for additional sentiment analysis. 2. Application performance issues 3. Feature requests or service improvements 3. Security review 1. Verify whether enrollment tokens have been rotated in the last 90 days 2. Confirm SSH keys are up-to-date 3. Review audit logs 4. Alert thresholds 1. Set up relevant monitoring alerts via email/Slack/Teams/etc. 2. Confirm which alerts require immediate response (Critical) 1. VDA registration drops below 80% of expected targets 2. All VMs in a Delivery Group are unavailable 3. Host disk space >90% 3. Confirm which alerts require a response within 4 hours: 1. > 10% of sessions launched fail over 15 minutes 2. Host CPU sustained usage >80% for 30 minutes 3. Available disk space >75% 4. If session launch time exceeds baseline by 50%, or a new "Unregistered" VM appears, review this information daily. ### Common issues and resolutions ##### VM deployed, but is not registered in Citrix: Symptoms: * The VM appears in the `list.yml` output * The Citrix Machine Catalog shows no new VM * Desktop is not available in Workspace Resolution: 1. Check the VDA service is running: `ansible mac_vms -i dev/inventory -m shell \ -a "sudo launchctl list | grep citrix" --limit 10.0.100.10` Expected: Service running with PID 2. Check enrollment token: * Citrix Cloud → Machine Catalogs → Enrollment Token * Verify that the token is not expired * If the token is expired: Generate a new enrollment token, update Ansible Vault, and redeploy the VM 3. Check the Citrix VDA logs: `ansible mac_vms -i dev/inventory -m shell \ -a "sudo tail -100 /Library/Application\ Support/Citrix/VDA/Logs/vda.log" \ --limit 10.0.100.10` Look for any registration errors, and follow up on any that appear. 4. Test network connectivity: `ansible mac_vms -i dev/inventory -m shell \ -a "curl -I https://[customer_ID].xendesktop.net" --limit 10.0.100.10` This should return `HTTP 200` If this problem persists, review Guide C: Troubleshooting Quick Reference ##### **Issue: Session launch timeout** **Symptoms:** * User clicks on the desktop in their Citrix Workspace * A connection progress bar appears * The session eventually times out with a "Cannot connect" error **Resolution:** 1. Verify the VM is powered on: `ansible-playbook -i dev/inventory list.yml` 2. Confirm the Citrix Machine Catalog shows that the VM is both "Registered" and "Available" 3. Test Rendezvous connectivity: `ansible mac_vms -i dev/inventory -m shell \ -a "curl -I https://*.nssvc.net" --limit 10.0.100.10` 4. Verify that the firewall allows HDX ports (1494, 2598) 5. Try a different client device to isolate if the problem is a client-side vs. server-side issue ##### **Issue: Disk space full on Orka host** Symptoms: * VM deployment fails with "insufficient space" error * Host disk usage >90% Resolution: 1. Check disk usage: `ansible hosts -i dev/inventory -m shell -a "df -h /var/orka"` 2. List images on the Orka host: `ansible hosts -i dev/inventory -m shell -a "orka-engine image list" --limit 10.0.100.10` 3. Remove old image versions: `ansible hosts -i dev/inventory -m shell \ -a "orka-engine image rm sonoma-finance:v1.0" --limit 10.0.100.10` 4. If inventory is still low: Move VMs to other hosts, expand storage, or add new host(s) ### Log Locations #### **Orka Engine logs:** * Location: `/var/log/orka-engine.log` * View: `sudo tail -100 /var/log/orka-engine.log` * Contains: VM lifecycle events, image operations, errors #### **Citrix VDA logs:** * Location: `/Library/Application Support/Citrix/VDA/Logs/` * Key files: * `vda.log` - Main VDA service log * `registration.log` - Registration events * `broker.log` - Communication with Citrix Cloud * View: `sudo tail -100 /Library/Application\ Support/Citrix/VDA/Logs/vda.log` #### **System logs:** * Location: `/var/log/system.log` * View: `sudo tail -100 /var/log/system.log` * Contains: macOS system events, service crashes #### **Ansible logs:** * Location: Playbook output (stdout) * Verbose mode: Add `-vvv` to playbook command * Example: `ansible-playbook -i dev/inventory deploy.yml -vvv` #### **Centralized logging (if configured):** * Check your logging infrastructure (Splunk, ELK, CloudWatch) * Search by hostname, VM name, or error keywords ### When to Escalate to MacStadium Support Escalate when: * The Orka Engine service crashes repeatedly * If you are unable to deploy VMs after following the documented troubleshooting steps * You suspect hardware failure (host unresponsive) * Image operations fail consistently * You need guidance on capacity planning or architecture changes Before escalating an issue, gather the following information: * The problem description and its symptoms/potential root causes. If you have noticed any trends or patterns when the issue occurs, provide this information as well. * The steps you have already taken to troubleshoot the issue * Relevant log excerpts (Orka Engine, VDA) * Output of any diagnostic commands you have run * Timeline of the issue (when it started, issue frequency) Contact MacStadium Support: * Support Portal: [support@macstadium.com](mailto:support@macstadium.com) * Include: Account ID, affected host IPs, error messages * Attach: Log files, screenshots if helpful Response SLA: * Severity 1 (production down): 1 hour * Severity 2 (degraded service): 4 hours * Severity 3 (question/guidance): 24 hours ### Security and Compliance #### Network Isolation Best Practices ##### **VLAN segmentation:** Your deployment should use separate VLANs: * **Management VLAN:** Orka API, Ansible control node (restricted access) * **VM VLAN:** Citrix VDA VMs (isolated from management) * **User VLAN:** End-user access (if applicable) You can check your VM network configuration by running the following command: `ansible mac_vms -i dev/inventory -m shell -a "ifconfig en0 | grep inet"`. VMs should be on a VM VLAN subnet, not a management VLAN. #### **Firewall rules:** Orka hosts should allow: * Inbound: SSH (port 22) from the Ansible control node only * Inbound: Orka API (port 80/443) from the Ansible control node only * Outbound: Container registry (port 443) * Outbound: Internet access for macOS updates (port 80/443) #### **VMs should allow:** * Inbound: HDX (ports 1494, 2598) from the Citrix Gateway Service * Outbound: Citrix Cloud (port 443 to `*.xendesktop.net`, `*.nssvc.net`) * Outbound: Internet access for application updates #### **Block unnecessary traffic:** * VM-to-VM traffic (unless required by applications) * VM-to-management-VLAN traffic * Direct VM-to-Internet (route connections through a company proxy if required by policy) ### SSH key management ##### Key rotation schedule: Rotate SSH keys annually, and/or after personnel changes. ##### Generate a new SSH key: `ssh-keygen -t ed25519 -C "ansible-orka-2026" -f ~/.ssh/ansible_orka_key_2026` ##### Deploy the new SSH key to your host(s): `ssh-copy-id -i ~/.ssh/ansible_orka_key_2026.pub admin@10.0.100.10`\ `ssh-copy-id -i ~/.ssh/ansible_orka_key_2026.pub admin@10.0.100.11`\ `ssh-copy-id -i ~/.ssh/ansible_orka_key_2026.pub admin@10.0.100.12` ##### Remove old SSH key(s) from a host: `ansible hosts -i dev/inventory -m shell \ -a "sed -i '' '/ansible-orka-2025/d' ~/.ssh/authorized_keys"` #### SSH key storage * Store private keys securely * Never commit private keys to Git * Limit access to keys (only authorized admins) #### If a key is compromised * Generate a new key immediately * Deploy the new SSH key to all hosts * Remove the compromised key from all hosts * Review access logs for unauthorized use * Document the incident for additional review #### Audit logging You will want to enable audit logging for security compliance. ##### Citrix: * Configuration Logging: Tracks changes to Machine Catalogs, Delivery Groups, policies * Access: Citrix Cloud Console → Configuration → Logging * Retention period: 90 days (configurable) ##### Orka: * Orka Engine logs all VM operations * Location: `/var/log/orka-engine.log` * Retention period: Configure log rotation (default: 30 days) ##### Ansible: * Playbook execution logs * Capture stdout: `ansible-playbook ... | tee -a /var/log/ansible-playbook.log` * Include timestamp(s), operator name, and the command(s) executed #### What to log * VM provisioning and deprovisioning * User access grants and revocations * Policy changes * Image updates * Configuration changes #### Log review * Weekly: Review logs for any anomalies * Monthly: Summarize log activity for management * Quarterly: Audit logs for compliance #### Data Sovereignty Considerations Where data resides: ##### VM data: * Stored on the Orka host local disk (`/var/orka`) * A physical location: Your data center (on-premises) or MacStadium data center (hosted) ##### Images: * Stored in an OCI registry * A physical location: Your data center (on-premises) or MacStadium data center (hosted) ##### User data: * Within the VM (ephemeral for pooled access, persistent for dedicated access) * Backup location: Your backup infrastructure ##### Citrix metadata: * Stored in Citrix Cloud (US or EU region, depending on account) * Contains: User assignments, policies, and session logs (no VM content) #### Compliance considerations ##### GDPR (European users): * Ensure Citrix Cloud region is EU * Document data flows * Implement data retention policies (delete VMs when a user leaves the organization) ##### HIPAA (U.S.-based healthcare policy): * Encrypt data at rest (FileVault on VMs) * Encrypt data in transit (HDX uses TLS) * Implement audit logging * Sign BAA with Citrix ##### Data residency requirements: * Deploy Orka hosts in the required geographic region * Use a container registry located in the same region * Verify Citrix Cloud region compliance ### Best practices #### Image Hygiene and Update Cadence ##### Monthly: * Apply macOS security updates to golden images * Update applications (Office, browsers, etc.) * Test the updated image thoroughly * Deploy the image to production ##### Quarterly: * Review installed applications (remove any unused applications) * Update the Citrix VDA to the latest version * Audit image sizes (optimize if these are >50GB) * Document any changes made in your CHANGELOG.MD file and push these updates to Git. ##### Annually: * Upgrade macOS major version (for example, Sonoma → Sequoia) * Review all configuration scripts * Rebuild images from scratch (vs. doing incremental updates) ##### Image testing checklist: 1. VM deploys successfully 2. The VDA registers with Citrix 3. All applications launch as expected 4. No errors appear in the VDA logs 5. Test that user(s) can access the desktop 6. Confirm session performance is acceptable ### Capacity planning ##### Current capacity formula: Total Capacity = (Number of Hosts) × (max\_vms\_per\_host) = (3 hosts) × (2 VMs/host) = 6 VMs ##### Estimate concurrent users: Current users: 50 - Expected growth: +20 per quarter - Concurrent usage rate: 60% (30 users at peak) ##### Calculate your VM needs: Required VMs = (Total Users) × (Concurrent Rate) × (Buffer) = (50) × (0.6) × (1.2 buffer) = 36 VMs ##### Determine your host requirement(s): Hosts Needed = (Required VMs) / (max\_vms\_per\_host) = 36 / 2 = 18 hosts ### Change management procedures Procurement timeline: * Order hosts 60 days before capacity constraint * Allow 14 days for delivery (if hosted with MacStadium) * Allow one week for deployment and testing Monitoring triggers: * VM utilization >75%: Start planning for host expansion * VM utilization >90%: Expedite new hosts ### Backup and Disaster Recovery What to back up: Golden images: * Store these in an OCI registry (off-site) * Maintain at least three recent versions * Test the golden image VM restoration process quarterly #### **User data (persistent desktops only):** * Do daily backups via Time Machine or an enterprise backup tool * 30-day retention of user data * Test data restoration process and procedures monthly #### **Configuration:** * Ansible playbooks and inventory: Store these in a Git repository * Citrix configuration: Export this monthly via PowerShell * Documentation: Store this in a company wiki such as Confluence, in Git, or on a shared drive #### **Disaster recovery scenarios:** ##### **Scenario 1: Single host failure** * Impact: 2 VMs unavailable * RTO: 4 hours * Procedure: 1. Provision a replacement Mac 2. Install Orka Engine on the machine 3. Add the machine to your existing Ansible inventory 4. Pull golden images 5. Deploy VMs to new host from the golden image ##### **Scenario 2: Complete site failure** * Impact: All VMs are unavailable * RTO: 8-12 hours * Procedure: 1. Provision Macs at an alternate site (or host these directly with MacStadium) 2. Restore your last known good Ansible configuration from Git 3. Pull images from your OCI registry 4. Deploy new VMs 5. Verify VDA registration in Citrix ##### **Disaster recovery (DR) testing:** * Annually: Conduct a full DR exercise * Quarterly: Conduct a partial failover test * Document lessons learned ### Change Management Procedures Before any production change: 1. Document the change: * What: Description of the suggested change * Why: Business justification for making the change * Impact: Affected systems, users, and any anticipated downtime * Rollback plan: Steps necessary to revert the change if any issues occur 2. Test in a non-production environment: * Deploy to a test VM group * Validate functionality * Measure performance impact 3. Schedule a change maintenance window: * Communicate the change to users 1 week in advance * Choose a low-usage time (evenings, weekends) * Change duration: 2× expected time (buffer for issues) 4. Execute the change: * Follow the documented change procedure * Monitor for any issues * Validate success criteria has been met * Communicate change completion 5. Post-change review process: * Document the actual vs. planned change(s) * Capture any lessons learned during the change process * Update change procedure(s) if needed #### **Example change: Update golden image from v1.2 to v2.0** ##### **Change request:** * Change: Update finance golden image to v2.0 (adds Microsoft Teams) * Impact: 50 finance VMs, 200 users * Downtime: 2 hours (pooled desktops, off-hours) * Rollback: Revert `vm_image` to v1.2, redeploy VMs ##### **Test plan:** * Deploy 2 test VMs from v2.0 image * Validate Microsoft Teams launches correctly * Test user session quality is acceptable ##### **Change execution plan:** 1. Update `vm_image` in group vars to v2.0 2. Delete any existing VMs: `delete.yml` (30 min) 3. Deploy the new VMs: `deploy.yml` (60 min) 4. Verify VDA registration in Citrix (15 min) 5. Test user sessions (15 min) ##### **Change rollback plan (if adverse issues occur):** 1. Update the `vm_image` back to v1.2 2. Delete v2.0 VMs 3. Redeploy VMs from v1.2 ##### **Change communication:** * 1 week before scheduled change: "Scheduled maintenance Sunday 2 AM-4 AM, desktops will be unavailable" * Day of change: "Maintenance is currently in progress, desktops will be available by 4 AM" * After change is complete: "Maintenance is now complete, Microsoft Teams is now available on finance desktops." ### Resources and support #### Documentation: ##### **MacStadium** * Orka Documentation and Support: [support@macstadium.com](mailto:support@macstadium.com) * Bare Metal Mac Options: [Cloud-hosted Bare Metal Macs | MacStadium](https://www.macstadium.com/bare-metal-mac) ##### **Citrix** * VDA for macOS Documentation: [Citrix Virtual Delivery Agent for macOS](https://docs.citrix.com/en-us/mac-vda) * System Requirements: [System Requirements | Citrix Virtual Delivery Agent for macOS](https://docs.citrix.com/en-us/mac-vda/system-requirements) * Citrix Cloud Console: [https://citrix.cloud.com](https://citrix.cloud.com/) * Citrix Support: [Citrix Support](https://support.citrix.com/) ##### **Ansible:** * Ansible Documentation: [Ansible Community | Ansible documentation](https://docs.ansible.com/) * Ansible Vault Guide: [https://docs.ansible.com/ansible/latest/user\_guide/vault.html](https://docs.ansible.com/ansible/latest/user_guide/vault.html) #### Support Contact Information ##### **MacStadium Support:** * Portal: [support@macstadium.com](mailto:support@macstadium.com) * Email: [support@macstadium.com](mailto:support@macstadium.com) * Phone: Available in support portal * Hours: 24/7 for Severity 1, business hours for others * SLA: 1 hour (Sev 1), 4 hours (Sev 2), 24 hours (Sev 3) When contacting MacStadium support, please provide the following information: * Your Account ID * Affected host IPs or VM names * Problem description and timeline * The troubleshooting steps you have already taken * Log excerpts (Orka Engine, VDA) ##### **Citrix Support:** * Portal: [Citrix Support](https://support.citrix.com/) * Access via Citrix Cloud Console → Support * Include: Your Customer ID, Machine Catalog name, applicable error messages #### **Citrix community forums:** * Citrix Discussions: [https://discussions.citrix.com](https://discussions.citrix.com/) * Citrix Community: [Citrix Community](https://community.citrix.com/) # MacStadium VDI 1.0 release notes Source: https://docs.macstadium.com/remote-desktop-vdi/macstadium-vdi-deployment/vdi-10-release-notes MacStadium VDI 1.0 release notes: web-based management UI, automated Citrix VDA provisioning, OCI image support, and Android Virtual Device capabilities. MacStadium VDI is a separate product from Orka Cluster. These release notes cover VDI-specific features only. They do not apply to standard Orka cluster deployments. ## MacStadium VDI 1.0 ### Release summary MacStadium VDI 1.0 is the initial production release of MacStadium's virtual desktop platform. This release delivers a web-based management UI, automated Citrix VDA provisioning, OCI image support, Android Virtual Device capabilities, and a full set of VM lifecycle management tools. ### Requirements * Valid MacStadium VDI license * Apple silicon Mac nodes (Intel is not supported) * macOS 13 (Ventura), 14 (Sonoma), 15 (Sequoia), or 26 (Tahoe) on host nodes * Ansible control node with `sshpass` installed and `Docker` installed * Each physical Mac supports a maximum of two concurrent macOS VMs (Apple EULA) **For Citrix deployments:** * Active Citrix DaaS or CVAD subscription * Citrix Workspace app 2402 or later * Network configured per Citrix VDA requirements ## New features ### Management UI MacStadium VDI ships with a web-based management UI (built on an open-source Ansible GUI) that runs via Docker Compose. The management UI is distributed as a prebuilt Docker image maintained by MacStadium, so end users do not need to build it themselves. It comes with all task templates pre-loaded, so IT administrators can manage VDI deployments through a web interface without invoking Ansible directly. After initial setup, operators only need to update SSH credentials in the key store. Available task templates cover the full VM lifecycle: deploy, list, manage VM state (`running`, `stopped`, `absent`), delete, create and push images, pull images, install the [Orka Engine](https://github.com/macstadium/orka-engine-orchestration), Citrix VDA installation and enrollment, and Android AVD management. **Prerequisites:** Docker and [uv](https://docs.astral.sh/uv/) must be installed. ### Automated Citrix VDA installation and enrollment Citrix VDA installation and registration are fully automated via Ansible playbooks. The provisioning flow handles VDA agent download, TCC permission setup (required for remote access on macOS), and enrollment against a Citrix Cloud token, all without manual steps on the VM. A SIP-disabled base image is required for TCC automation (for example, `ghcr.io/macstadium/orka-images/sequoia:latest-no-sip`). ### OCI image support VDI deployments can push and pull VM images to and from OCI registries, including private registries with rotating credentials (ECR supported). When deploying a VM, you can specify whether the image is public or private; private images trigger automatic registry authentication before the pull. This brings VDI image management in line with standard Orka OCI storage workflows. ### VM provisioning and management * Deployments accept RAM, CPU, and network interface as parameters, giving operators direct control over VM resource allocation and networking configuration (including bridge networking) at deploy time. * VM IP addresses are displayed in both deploy and list outputs, eliminating the need to look up IPs separately after provisioning. * `provision_user.yml` creates macOS admin user accounts on running VMs via SSH. It is available as the **VM: Provision User to VM** task template in the management UI, or can be run directly via Ansible. * Image `list` and `delete` operations are available as management UI tasks. * VMs can be managed and deleted by name prefix, making bulk operations across groups of VMs simpler. ### Android Virtual Device support MacStadium VDI supports running Android Virtual Devices (AVDs) alongside macOS desktop sessions. Android emulators cannot run inside a macOS VM due to Apple Virtualization Framework limitations that prevent nested virtualization. Orka's solution runs the emulator directly on the physical host node and sets up a `socat` relay. Once an AVD is provisioned, the system outputs an IP address and port that you use to connect from your macOS VM session: ``` adb connect : ``` This lets you develop and test Android apps from your virtualized Mac desktop without configuring the relay infrastructure yourself. AVDs are provisioned and managed via Ansible playbooks. The following playbooks are available: * **Setup:** `install_android_sdk.yml` installs Homebrew, the Android SDK, and supporting tools on the host node. `sdkmanager_install.yml` installs additional SDK platforms and system images. `list_avd_profiles.yml` lists available device profiles before creating an AVD. * **Lifecycle:** Deploy and create AVDs scoped to specific VMs (`deploy_avd.yml`), list running AVDs (`list_avds.yml`), and delete a specific AVD (`delete_avd.yml`). * **State management:** `avd.yml` manages ongoing AVD state via a `desired_state` parameter: `running`, `stopped`, or `absent`. #### VM configuration requirements macOS VMs that connect to AVDs must have `scrcpy` and `adb` installed. The simplest installation path is Homebrew: ```bash theme={null} brew install scrcpy android-platform-tools ``` These tools can also be baked into a golden image so every provisioned VM has them available out of the box. #### Prerequisites * MacStadium VDI deployed and operational * Contact [MacStadium support](mailto:support@macstadium.com) to enable AVD provisioning for your environment For full setup and architecture details, see [Android Virtual Devices](/remote-desktop-vdi/configuration/android-virtual-devices). ## Notes **First-boot behavior on macOS Tahoe:** When deploying a macOS Tahoe VM for the first time with a fresh machine ID, the VM will prompt for Apple ID sign-in and FileVault setup before reaching the desktop. This is expected behavior. A fresh machine ID gives each VM a unique serial number, which is required for MDM enrollment and allows users to sign in with their Apple ID. This prompt appears on first boot only and does not recur across stop/start cycles. ## Support If you have questions or require assistance, please [contact our support team](mailto:support@macstadium.com). # Bulk VM lifecycle management Source: https://docs.macstadium.com/remote-desktop-vdi/operations/bulk-vm-lifecycle Deploy, configure, and tear down groups of macOS VMs in a MacStadium VDI deployment using the bulk_vm_lifecycle.py script and the management UI API. The `semaphore/bulk_vm_lifecycle.py` script drives the management UI REST API to act on groups of macOS VMs that share a common name prefix. Use it when you need to provision, configure, manage, or tear down many VMs at once without running a separate management UI task for each one. For individual VM operations, see the [Day-2 operations guide](/remote-desktop-vdi/operations/day-2-operations-guide). ## Before you begin * Your MacStadium VDI deployment is complete and the management UI is configured. This page assumes you have a working deployment with active VMs. * [`uv`](https://docs.astral.sh/uv/) is installed on the workstation where you'll run the script. * You have admin credentials for the management UI. * To use `install-citrix`, you'll need a download URL for the Citrix VDA `.dmg` (for example, an S3 presigned URL) and your domain's hostname suffix. ## Configure credentials The script reads credentials from flags, environment variables, or a `semaphore/.env` file. The env file approach keeps credentials out of your shell history: ``` SEMAPHORE_URL=http://[MANAGEMENT_UI_HOST]:3000 SEMAPHORE_ADMIN=[ADMIN_USERNAME] SEMAPHORE_ADMIN_PASSWORD=[ADMIN_PASSWORD] ``` You can also supply these values as flags on any subcommand: `--semaphore-url`, `--semaphore-admin`, and `--semaphore-password`. ## Deploy a group of VMs The `deploy` subcommand provisions VMs in parallel, each named with your prefix followed by a random 8-character hex suffix (for example, `demo-a1b2c3d4`). It writes the generated names to a manifest at `semaphore/.bulk_vms_[PREFIX].json` for use by later subcommands. ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py deploy --prefix [PREFIX] --count [COUNT] --vm-image [IMAGE_URL] --cpu [VCPUS] --memory [MEMORY_MB] ``` Running `deploy` again with the same prefix merges new names into the existing manifest rather than overwriting it. If the OCI image requires authentication, pass `--private-image` to use the credentials stored in the `OCI Credentials` environment. To attach a host network interface instead of NAT, pass `--network-interface en0`. ## List the group The `list` subcommand runs the List VMs template with `vm_name` set to your prefix. The underlying playbook treats `vm_name` as a regex anchor, returning every VM whose name starts with the prefix. ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py list --prefix [PREFIX] ``` ## Start and stop the group The `manage` subcommand sets every VM matching the prefix to `running`, `stopped`, or `absent`. Each call is a single management UI task: the playbook loops over all matching VMs inside one Ansible run. To stop the group: ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py manage --prefix [PREFIX] --state stopped ``` To start it again: ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py manage --prefix [PREFIX] --state running ``` ## Provision a user across the group The `provision-user` subcommand reads the manifest and submits one parallel task per VM. The underlying playbook requires an exact VM name match, so the manifest must exist before you run this subcommand. ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py provision-user --prefix [PREFIX] --username [USERNAME] --password [PASSWORD] ``` If you need to target a set of VMs that differs from the manifest, pass `--vm-names [VM_NAME_1],[VM_NAME_2]` instead. ## Install the Citrix VDA across the group The `install-citrix` subcommand reads the manifest and submits one parallel task per VM, installing the Citrix VDA on each one. ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py install-citrix --prefix [PREFIX] --citrix-installer-url [INSTALLER_URL] --hostname-suffix [HOSTNAME_SUFFIX] ``` Each task installs developer tools and .NET prerequisites, sets the VM hostname to `[VM_NAME][HOSTNAME_SUFFIX]`, installs the VDA, and reboots the VM to complete installation. Each VM reboots at the end of its task. If your hosts can't handle every VM rebooting simultaneously, lower `--concurrency` to spread the load. The default task timeout is 1800 seconds; raise it with `--task-timeout [SECONDS]` if your installer download is slow. After installation, register each VM using the `VDI | Register Citrix VDA` template in the management UI. The script doesn't handle enrollment tokens, which are issued per machine and must be applied individually. See [Citrix DaaS configuration](/remote-desktop-vdi/configuration/citrix-daas-configuration) for registration steps. ## Delete the group The `delete` subcommand is a convenience wrapper for `manage --state absent`. It prompts for confirmation before submitting and removes the manifest once every task succeeds. If any task fails, the manifest is kept so you can re-run. Deleting VMs is irreversible. Run `list` first to confirm the prefix matches only the VMs you intend to remove. ```bash theme={null} uv run semaphore/bulk_vm_lifecycle.py delete --prefix [PREFIX] ``` Pass `--yes` to skip the confirmation prompt in non-interactive environments such as CI pipelines. ## Common flags The following flags apply to every subcommand. | Flag | Default | Purpose | | ---------------------- | ------------------------------------------- | ------------------------------------------------------------------------------ | | `--semaphore-url` | `http://localhost:3000` or `$SEMAPHORE_URL` | Management UI base URL | | `--semaphore-admin` | `$SEMAPHORE_ADMIN` or `admin` | Admin username | | `--semaphore-password` | `$SEMAPHORE_ADMIN_PASSWORD` or `changeme` | Admin password | | `--project-name` | `Orka Engine Orchestration` | Project that owns the templates | | `--wait` / `--no-wait` | `--wait` | Poll until terminal state, or return immediately after submission | | `--poll-interval` | `3.0` | Seconds between status polls | | `--task-timeout` | `1800.0` | Per-task timeout in seconds | | `--concurrency` | `5` | Parallel task submissions for `deploy`, `provision-user`, and `install-citrix` | ## The VM manifest When `deploy` runs, it writes a manifest at `semaphore/.bulk_vms_[PREFIX].json` recording the VM names it created. The `provision-user` and `install-citrix` subcommands read this file to fan out per-VM tasks, because their underlying playbooks require exact name matches. ```json theme={null} { "prefix": "demo", "created_at": "2026-06-04T18:00:00+00:00", "vm_names": [ "demo-a1b2c3d4", "demo-e5f6a7b8" ] } ``` The manifest is a local file on your workstation. You can delete it by hand to start fresh; subsequent `manage` and `delete` calls fall back to server-side prefix matching when no manifest is present. The `delete` subcommand removes the manifest automatically once every task succeeds. ## Operational notes ### Prefix constraints Prefixes must start and end with a lowercase letter or digit and contain only lowercase letters, digits, and hyphens. The maximum length is 32 characters. Prefixes that don't meet these constraints will produce invalid VM names and cause the deploy task to fail. ### Concurrency `deploy`, `provision-user`, and `install-citrix` parallelize through a thread pool. The default `--concurrency 5` works well for most deployments. Lower it if the management UI or the underlying hosts become saturated. `manage` and `delete` are single management UI tasks. Their runtime scales with the number of matched VMs because the playbook loops over them inside one Ansible run. ### Scheduling cleanup For routine teardown, you can automate `delete` in a cron job or CI pipeline. The following cron entry runs a delete every Friday at 10 PM: ``` 0 22 * * 5 uv run /path/to/semaphore/bulk_vm_lifecycle.py delete --prefix [PREFIX] --yes --no-wait ``` For related CLI operations, see the [Ansible quick reference](/remote-desktop-vdi/reference/ansible-quick-reference). # MacStadium VDI day-2 operations guide Source: https://docs.macstadium.com/remote-desktop-vdi/operations/day-2-operations-guide Ongoing operations for a production MacStadium VDI deployment: capacity planning, image management, user lifecycle, and backup and recovery. This guide covers the ongoing operational tasks for managing a production MacStadium VDI environment. It assumes your deployment is complete, users are onboarded, and you're now responsible for day-to-day operations and maintenance. For a full list of available playbooks and common variable combinations, see the [Ansible quick reference](/remote-desktop-vdi/reference/ansible-quick-reference). What this guide covers: * Routine capacity and image management * User lifecycle operations * Backup and recovery What this guide assumes: * You've completed the initial deployment process * You're familiar with basic Orka operations * You have admin access to Citrix Cloud, Orka hosts, and your Ansible control node * Your environment is operational with active users Prerequisites: * SSH access to MacStadium VDI hosts * Citrix Cloud admin credentials * A project set up with an Ansible control node running Orka Engine * You have access to your container registry For advanced configuration topics (bridged networking, HDX tuning, automation, multi-tenancy), see [Advanced Configuration](/remote-desktop-vdi/configuration/advanced-configuration). For incident response, change management, and compliance, see [Incident Response & Change Management](/remote-desktop-vdi/operations/incident-response). ### Routine operations #### Capacity management ##### Monitoring host utilization: Check the current VM distribution across your Orka hosts by running the following Ansible script: ``` ansible-playbook -i inventory list.yml ``` This playbook shows all your environment's VMs, and which host each is running on. You'll want to watch out for uneven host distribution (for example, one host is overloaded while others remain idle), any hosts approaching their VM limit, and watch for any resource warnings in the log output. To check your existing host resource usage, run the following Ansible script: ``` ansible hosts -i inventory -m shell -a "top -l 1 | grep -E 'CPU|PhysMem'" ``` You will want to monitor CPU usage, and make sure this doesn't go above 80% sustained. You'll also want to observe memory pressure (swap usage), and confirm the amount of available disk space on `/var/orka`. ##### Setting up basic monitoring Use a cron job to capture daily stats on your Ansible control node. For example, the following cron job would add daily capacity to an existing Ansible node daily at 6:00 AM: ``` # Open crontab editor crontab -e # Add this cron entry inside the editor: 0 6 * * * ansible-playbook -i /path/to/inventory list.yml > /var/log/orka-capacity-$(date +\%Y\%m\%d).log ``` You will want to review your Ansible logs weekly to help you spot trends before they become larger issues. #### Scaling up: Adding new Mac hosts ##### **When you need to scale up:** * Your existing Orka hosts are consistently above 70% CPU utilization * Users are reporting slowness during peak hours * You are planning to add more desktops than your current host capacity supports #### Steps to add a new Mac host: 1. Provision physical Mac hardware with MacStadium * Contact MacStadium support to add nodes to your private cloud * Request a host in the same subnet as your existing infrastructure * Install MacStadium VDI on your new Mac host machine(s) 2. Add host to Ansible inventory Edit `inventory.ini`: ``` [hosts] mac-node-1 ansible_host=10.0.100.10 mac-node-2 ansible_host=10.0.100.11 mac-node-3 ansible_host=10.0.100.12 mac-node-4 ansible_host=10.0.100.13 # New host [all:vars] ansible_user=admin ansible_become=yes ``` 3. Verify connectivity to the new host: ``` ansible mac-node-4 -i inventory -m ping ``` 4. Confirm the Orka Engine version matches existing host(s): ``` ansible hosts -i inventory -m shell -a "orka-engine --version" ``` If the new host has a different Orka version, upgrade any existing hosts or downgrade the new host to match. Version mismatches can cause deployment issues. 5. Pull required images to the new host: ``` ansible-playbook -i inventory pull_image.yml -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0" --limit mac-node-4 ``` Repeat this for each image your environment uses. This prevents slow first deployments when users need desktops on the new host. 6. Test VM deployment on the new host: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=test-new-host-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0" --limit mac-node-4 ``` Verify the test VM boots, registers with Citrix VDA, and is accessible. Once this is confirmed, you can then delete the test VM by running: ``` ansible-playbook -i inventory delete.yml -e "vm_name=test-new-host-01" ``` 7. Deploy production VMs With your new host successfully verified, you can now deploy additional desktops. Use your existing Ansible playbook(s) to automatically distribute VMs across all available hosts. ``` ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` *Run this command once for each additional VM, using a unique `vm_name` each time.* This may take anywhere between 2-4 hours for full host integration and testing. ### Scaling Down: Decommissioning Hosts #### **When you might scale down:** * Your user count has reduced (for example, seasonal workers have been offboarded) * You are consolidating to newer hardware * Cost optimization during low-usage periods **Important note:** Decommissioning MacStadium VDI hosts requires migrating or deleting VMs first. MacStadium VDI does not support live VM migration between hosts. ##### **Steps to decommission a host:** 1. Identify VMs on the target host: ``` ansible-playbook -i inventory list.yml | grep mac-node-4 ``` You will want to note all VM names running on the host you're removing. 2. Choose your migration strategy: **Option A:** Delete and redeploy pooled desktops. These can be deleted and recreated on other hosts without impacting users. ``` # Delete specific VM ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-finance-abc123" -e "desired_state=absent" # Redeploy VM ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-new-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` **Option B:** Snapshot and recreate VMs for dedicated desktops with user data. If users have local data that must be preserved: 1. Notify users 48 hours in advance 2. Have your users back up critical data to their network drives 3. Take VM snapshots 4. Delete VMs from the old host and redeploy them on the remaining hosts 5. Restore your user data from existing backups Most environments avoid this by enforcing network storage policies where user data is never stored locally on VMs. 6. Remove the host from your Ansible inventory Edit `inventory.ini` and remove the host: ``` [hosts] mac-node-1 ansible_host=10.0.100.10 mac-node-2 ansible_host=10.0.100.11 mac-node-3 ansible_host=10.0.100.12 mac-node-4 ansible_host=10.0.100.13 # Removed ``` 4. Verify VM distribution across hosts ``` ansible-playbook -i inventory list.yml ``` Confirm that your VMs are now running only on the remaining hosts. 5. Contact MacStadium to decommission hardware Once a MacStadium VDI host is empty and removed from your inventory, notify MacStadium support to remove the node from your private cloud. Estimated timeline: This may take between 4-8 hours depending on your VM count and migration complexity. ## Image updates and patching ### macOS Security Updates Frequency: Monthly (as Apple releases updates) Testing requirement: Always test updates on non-production VMs before rolling out to users. Recommended workflow: ##### Create a test image 1. Deploy a test VM from your current golden image: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=image-test-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` 2. Access the test VM and install updates ``` # SSH into the Orka node ssh admin@10.0.100.10 # List VMs and filter for the test VM orka-engine vm list | grep image-test # Open VNC connection to the VM open vnc://10.0.101.50 ``` Inside the VM: * Navigate to System Settings → General → Software Update * Install all available updates * Reboot as needed 3. Verify Citrix VDA still functions: * Check VDA registration: System Preferences → Citrix VDA * Test user login through Citrix Workspace * Test HDX features (clipboard, file transfer, USB) * Run the following example Ansible playbook to capture the updated VM as a new image version: ``` ansible-playbook -i inventory create_image.yml -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0" -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.1" ``` 4. Delete the test VM ``` ansible-playbook -i inventory delete.yml -e "vm_name=image-test-01" ``` ##### Pilot update rollout You may want to deploy the updated image to a small group of users first, as seen in the following example Ansible playbook: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-pilot-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.1" ``` *Run this command once for each additional pilot VM, using a unique `vm_name` each time.* You will want to monitor the updated image deployment for 3-5 business days, collecting user feedback on any new issues or errors, performance changes, and application compatibility issues that may arise. ##### Full production rollout If the pilot succeeds, you can proceed to update all VMs in production. For pooled desktops, this process is straightforward, as seen in the following Ansible playbook example: ``` # Delete existing VMs from finance group ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-01" _Run this command once for each VM to remove._ # Redeploy with new image version ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.1" _Run this command once for each additional VM, using a unique `vm_name` each time._ ``` You will want to schedule the update to take place during a scheduled maintenance window (evenings or weekends are recommended) to avoid user disruption. For dedicated desktops, users will lose their local data unless it has been backed up. You will want to notify your users in advance (5 business days recommended) and provide them with data backup instructions. Estimated update timeline: One week (testing) + one day (pilot) + 1-2 hours (full production rollout) #### Application Updates Frequency: Varies by application (update applications quarterly or as-needed) Process: Use the same process as described in the macOS Security Updates section, but you will want to modify the VM to install application updates before creating a new golden image. Example: Updating Xcode 1. Deploy a test VM from the current golden image 2. Install new Xcode version from Mac App Store or Apple Developer 3. Test Xcode functionality (build a test project) 4. Create a new golden image 5. Pilot the new golden image with your developer team 6. Roll the new golden image out to production Note: Keep a CHANGELOG.MD file to show what's included in each image version. You can use image tags to track this: * `registry.example.com/citrix-vda/dev-tools:v1.0` - Xcode 14.3, Sonoma 14.0 * `registry.example.com/citrix-vda/dev-tools:v1.1` - Xcode 15.0, Sonoma 14.1 * `registry.example.com/citrix-vda/dev-tools:v1.2` - Xcode 15.2, Sonoma 14.3 You will want to store your CHANGELOG.MD file in your project's git repository alongside your Ansible playbooks. #### Citrix VDA Updates Frequency: Quarterly (Citrix releases updates every 3-4 months) Check for updates: Citrix Cloud Console → Updates & Announcements Update Process: 1. Download the new VDA installer from Citrix 2. Deploy a test VM from your current golden image 3. Install the new VDA version: * Copy the VDA installer to the VM * Run the VDA installer (this may require uninstalling the old version first) * Reboot the VM 4. Verify VDA registration and HDX functionality works as expected 5. Create a new golden image with the updated Citrix VDA version 6. Pilot the new image and roll out to production using the same process described in the macOS Security Updates section Note: Always test Citrix VDA updates in a non-production environment, as these can occasionally introduce compatibility issues with specific macOS versions or applications. Rollback plan: Keep the previous golden image version available for 30 days after production rollout. If any issues arise, you can quickly redeploy from the old image as seen in the following Ansible playbook: ``` # Delete existing VMs from finance group ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-01" _Run this command once for each VM to remove._ # Redeploy with previous image version (rollback) ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.0" _Run this command once for each additional VM, using a unique `vm_name` each time._ ``` ### User Lifecycle #### Onboarding New Users **Scenario:** A new employee needs access to a macOS desktop. For pooled desktops: 1. Add the new user to a Citrix Delivery Group: Navigate to Citrix Cloud Console → Manage → Delivery Groups → Select group → Edit Click the "Users" tab → Add users → Search by name or email → Select → Save 2. Verify capacity Check if you have unassigned VMs available: ``` ansible-playbook -i inventory list.yml | wc -l ``` Compare the listed VM count against the number of users in the Delivery Group. If you need more desktops, review the following example Ansible playbook: ``` # Add two more desktops ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-11" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-12" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` 3. User logs in The user opens Citrix Workspace, authenticates, and clicks their assigned desktop. Citrix then assigns them an available VM from the pool. Expected wait time: 5 minutes for admin tasks + 2-3 minutes for user's first login. For dedicated desktops: Follow the same process described for pooled desktops, but ensure you deploy exactly as many VMs as you have users. Each user gets their own VM with persistent data. #### Reassigning Desktops Scenario: A user moves to a different department and needs different applications. For pooled desktops: 1. Remove the user from their old Delivery Group 2. Add user to the new Delivery Group 3. User logs out and logs back in, and gets assigned a VM from the new pool No VM changes are needed, as the user automatically gets a different desktop. For dedicated desktops: If the user needs to keep their data, this requires manual intervention: 1. Have the user back up their important files to network storage 2. Delete the user's old VM 3. Deploy a new VM from the appropriate golden image 4. Add the user to their new Delivery Group 5. The user then restores their backed-up files Alternatively, if user data doesn't need to be preserved, proceed to delete the old VM and deploy a new one. #### Offboarding and Data Retention Scenario: An employee leaves the company or no longer needs macOS access. Process: 1. Remove user from the Citrix Delivery Group Citrix Cloud Console → Manage → Delivery Groups → Select group → Edit → Users → Remove user → Save 2. For dedicated desktops: handle data retention If the user had a dedicated VM, decide: **Option A:** Keep VM for 30 days (common policy) Do nothing immediately. Keep the VM running, but inaccessible. After 30 days: ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-finance-abc123" -e "desired_state=absent" ``` **Option B:** Archive user data before VM deletion 1. SSH to the Orka host running the VM 2. Use `orka-engine vm backup` or host-level snapshots to capture the VM disk (if your environment supports this) 3. Store the VM backup for the required retention period (check your company's data retention policies) 4. Delete the VM **Option C:** Immediate deletion (pooled desktops) For pooled desktops where user data isn't preserved, there is no action needed. Users simply can't log in anymore, and their next login will assign them to a different VM (if they regain access later). Reclaim capacity if needed: After offboarding multiple users, you may have excess VMs. If usage is consistently below capacity: ``` # List VMs in finance group ansible-playbook -i inventory list.yml | grep citrix-vda-finance # Delete 3 VMs from finance group ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-10" ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-11" ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-12" ``` ### Backup and Recovery #### VM Snapshot Strategies Important limitation: Orka Engine does not have native VM snapshot functionality built into the Ansible playbooks. Snapshots must be handled at the host storage level. Available backup approaches: Approach 1: Golden image versioning (this is recommended for most environments) Rather than backing up individual VMs, maintain version history of your golden images. This works well for pooled desktops where user data isn't stored on VMs. How it works: * Keep the last 3-4 versions of each golden image in your container registry * If any issues arise, redeploy VMs from the previous golden image version * User data is stored on network file shares, not on VMs Implementation: ``` ansible-playbook -i inventory create_image.yml -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.1" -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.2" ``` In your container registry, configure your image retention policies to keep the number of image versions specified: * Production images: It is recommended to keep the last four golden image versions (approximately 4-6 months) * Development/test images: Keep the last two golden image versions Approach 2: Host-level storage snapshots (for dedicated desktops) If your users have dedicated VMs with local data that must be preserved, use host-level tools: 1. SSH to your MacStadium VDI host 2. Use APFS snapshot capabilities on the host: ``` # Create a Time Machine local snapshot tmutil localsnapshot # Or use custom scripts to snapshot /var/orka/vms/ ``` 3. Restore the desktop by copying the image snapshot back to the VM disk location **Note:** This approach is not automated in MacStadium VDI. You'll need to build custom tooling or manual procedures. Approach 3: Third-party backup tools Some environments integrate enterprise backup tools (Veeam, Commvault, etc.) at the host level. Consult your backup vendor's documentation for macOS virtualization support. ### Image Backup Procedures #### Backup your golden images regularly: **Method 1:** Container registry replication Configure your container registry to replicate to a secondary registry for disaster recovery. Primary: `registry.example.com`\ Secondary: `backup-registry.example.com` (located in a different datacenter) Most container registries (Docker, GitHub Container Registry, Harbor, JFrog Artifactory) support replication. Consult your registry's official documentation for more information. **Method 2:** Export images to file storage Manually export images for offline backup: ``` ansible-playbook -i inventory pull_image.yml -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` ### Disaster Recovery Runbook #### Scenario: Complete loss of Orka hosts (datacenter failure) Prerequisites: * Secondary MacStadium VDI environment located in a different datacenter (requires MacStadium private cloud in multiple locations) * Golden images replicated to a secondary registry accessible from the DR site * Ansible inventory configured with DR hosts ##### **Recovery steps:** 1. Update your Ansible inventory to point to the specified disaster recovery hosts ``` [hosts] mac-dr-node-1 ansible_host=10.1.100.10 mac-dr-node-2 ansible_host=10.1.100.11 [all:vars] ansible_user=admin ansible_become=yes ``` 2. Pull images to disaster recovery hosts ``` ansible-playbook -i inventory-dr pull_image.yml -e "remote_image_name=backup-registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` 3. Deploy VMs in the disaster recovery environment ``` ansible-playbook -i inventory-dr deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=backup-registry.example.com/citrix-vda/sonoma-finance:v2.0" ``` *Run this command once for each additional VM, using a unique `vm_name` each time.* 4\. Update Citrix Cloud configuration VMs will automatically register with Citrix Cloud if: * The specified disaster recovery VMs can reach Citrix Cloud (outbound HTTPS) * Citrix VDA configuration includes the correct Cloud Connector details If Cloud Connectors are also lost, you'll need to deploy new ones in the disaster recovery environment first. See [Citrix documentation for Cloud Connector installation](https://docs.citrix.com/en-us/citrix-cloud/citrix-cloud-resource-locations/citrix-cloud-connector/installation.html). 5. Notify users of temporary environment changes Users may experience: * Different VM IP addresses (if you have IP-based network policies) * Slightly different VM performance characteristics * Needing to reconnect to their desktop through Citrix Workspace Expected RTO (Recovery Time Objective): 2-4 hours depending on your VM count and image sizes. **Expected RPO (Recovery Point Objective):** This depends on your golden image replication frequency. With real-time registry replication: Recovery in minutes.\ With daily image backups: Expect up to 24 hours of configuration changes will be lost. Cost consideration: Most customers don't maintain a full disaster recovery environment due to hardware costs. Alternatively, you can accept longer RTO periods and work with MacStadium to provision new hosts on-demand during disaster recovery. ### Data Restoration Workflows #### Scenario: User accidentally deletes important files ##### **For pooled desktops:** User data should not be stored on VMs. Redirect users to restore from network file shares, OneDrive, or other corporate backup systems. If user data was incorrectly stored on a pooled VM and is now lost, there is no recovery path. Use this as a learning opportunity to reinforce data storage policies. ##### **For dedicated desktops:** Recovery depends on your backup approach. If you are using host-level snapshots: 1. SSH to the MacStadium VDI host 2. Stop the affected VM: ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-finance-abc123" -e "desired_state=stopped" ``` 3. Restore VM disk from snapshot (manual process; depends on host storage configuration) Start the affected VM: ``` ansible-playbook -i inventory vm.yml -e "vm_name=citrix-vda-finance-abc123" -e "desired_state=running" ``` If using third-party backup tools, follow your vendor's restore procedures to restore specific files or a full VM. **Best practice:** Train users that local VM storage is not backed up. Enforce policies requiring all important user data to be stored on network drives, cloud storage, or source control systems. # Deprovision and recover Mac hosts with Jamf Pro Source: https://docs.macstadium.com/remote-desktop-vdi/operations/deprovision-and-recover-mac-hosts Set up a Jamf Pro workflow that automatically restores a bare metal Mac host to a remotely accessible state after a wipe, with no on-site intervention required. This page applies to bare metal Mac host deployments only. It does not apply to MacStadium VDI or virtual machines, which cannot be registered with Apple Business Manager. This guide describes a tested, repeatable procedure for deprovisioning bare metal Mac hosts via Jamf Pro and automatically restoring them to a remotely accessible state. After an administrator issues the wipe command, the machine re-enrolls, enables SSH, and enables Screen Sharing, with no further action from the administrator. Two script variants are available. Choose the one that fits your workflow: * **With temporary user**: creates a standard local account with a forced password change on first login. A user can connect via VNC immediately with temporary credentials. * **Login screen only**: enables SSH and Screen Sharing and brings the machine to the macOS login screen. An administrator creates the user account separately. This workflow depends on Automated Device Enrollment (ADE) via [Apple Business Manager](https://support.apple.com/guide/apple-business-manager) (ABM), which requires physical hardware registered to your ABM account. One-time setup takes approximately 30 minutes. Subsequent wipe-to-accessible cycles take 5 to 10 minutes depending on network conditions. ## How it works When a wipe is issued, the following sequence runs automatically: 1. The Mac reboots, connects to the network over wired Ethernet, and contacts Apple's activation servers. 2. ADE applies the PreStage profile, skipping all Setup Assistant screens and creating a managed admin account. 3. The Mac enrolls in Jamf Pro. An enrollment-triggered policy fires immediately. 4. **(With temporary user only)** The policy script creates a standard local temporary user account and forces a password change on first login. 5. The script enables SSH directly on the machine. 6. The script calls the Jamf API to send the `EnableRemoteDesktop` MDM command to the device. 7. Jamf pushes the MDM command. Screen Sharing is enabled. ## Prerequisites * The Mac is physically connected via wired Ethernet with DHCP enabled on the switch port. * The Mac is assigned to your MDM server in Apple Business Manager (ABM). * The Mac supports Erase All Content and Settings: Apple silicon or Intel with T2 chip, running macOS 12.0.1 or later. * You have Jamf Pro admin access to create PreStage profiles, API clients, smart groups, scripts, and policies. ## One-time setup Complete these steps once. After setup, the recovery loop runs automatically for every subsequent wipe. In Jamf Pro, go to **Computers > PreStage Enrollments** and open or create the PreStage for your Mac fleet. **General tab:** Ensure the PreStage is assigned to your target devices in ABM. A device must be assigned to this PreStage the first time its serial number is added to Jamf Pro. Once assigned, it stays in scope for all future wipes and no further action is required. To handle the initial assignment automatically, enable **Automatically assign new devices** on the General tab. Jamf recommends this for single-ADE setups. If you manage multiple PreStages, assign devices manually: confirm the device is assigned to your Jamf Pro MDM server in ABM, sync the token in Jamf Pro under **Settings > Global > Device Enrollment Program**, then add the device under the PreStage's **Devices** tab. See [Automated Device Enrollment for Computers](https://learn.jamf.com/r/en-US/jamf-pro-documentation-current/Automated_Device_Enrollment_for_Computers) in the Jamf Pro documentation. **Setup Assistant tab:** Select all items to skip. The machine must advance through Setup Assistant completely unattended. **Account Settings tab:** * Enable **Create a managed local administrator account during macOS Setup Assistant**. * Set a username (for example, `administrator`) and password. * Enable **Make the managed local administrator account MDM-enabled**. * Under **Local User Account Type**, select **Skip**. This prevents macOS from presenting the account creation screen during Setup Assistant. Go to **Settings > API Roles and Clients**. Create an API Role with the following settings: * Name: `Remote Access Provisioning` * Privileges: **Read Computers** and **Send Computer Remote Desktop Command** Then create an API Client: * Display Name: `Remote Access Provisioning` * Role: assign the role you just created * Token lifetime: 60 seconds * Status: enabled Copy the **Client ID** and **Client Secret** after saving. This group gives you visibility into machines that still need remote access enabled. It is not used as a policy scope. * Name: `Remote Management - Disabled` * Criteria: `Remote Desktop Enabled` is `No` After a successful recovery, the machine drops out of this group automatically. Using enrollment method as the criterion avoids race conditions with inventory collection timing. * Name: `ADE Enrolled Machines` * Criteria: `Enrollment Method` is `PreStage Enrollment` * Optional: add `PreStage Enrollment` is `[your PreStage name]` to target a specific PreStage. Go to **Settings > Computer Management > Scripts > New**. Set the Display Name to `Enable Remote Access Post-Enrollment`. Choose the script variant that fits your workflow, then complete the Options and Script tabs as shown. On the **Options** tab, set the following parameter labels: * Parameter 4: `API Client ID` * Parameter 5: `API Client Secret` * Parameter 6: `Jamf Pro URL` * Parameter 7: `Temp Username` * Parameter 8: `Temp Password` On the **Script** tab, paste the following: ```bash theme={null} #!/bin/bash ############################################################################### # enable_remote_access.sh # # Triggered by Jamf Pro enrollment complete policy. # - Creates a standard local temporary user account # - Forces password change on first login # - Enables SSH (Remote Login) directly via systemsetup # - Calls the Jamf Pro API to send the Enable Remote Desktop MDM command # to this device using its own serial number for lookup # # Parameters: # $4 - Jamf Pro API Client ID # $5 - Jamf Pro API Client Secret # $6 - Jamf Pro URL (e.g. https://[yourinstance].jamfcloud.com) # $7 - Temporary local username (e.g. tempuser) # $8 - Temporary local password ############################################################################### CLIENT_ID="$4" CLIENT_SECRET="$5" JAMF_URL="$6" TEMP_USER="$7" TEMP_PASS="$8" if [[ -z "$CLIENT_ID" || -z "$CLIENT_SECRET" || -z "$JAMF_URL" ]]; then echo "ERROR: Missing required parameters. Check Parameter 4 (Client ID), 5 (Client Secret), 6 (Jamf URL)." exit 1 fi if [[ -z "$TEMP_USER" || -z "$TEMP_PASS" ]]; then echo "ERROR: Missing temp user parameters. Check Parameter 7 (username) and 8 (password)." exit 1 fi JAMF_URL="${JAMF_URL%/}" # Create temporary standard local user echo "Creating temporary local user: $TEMP_USER..." /usr/sbin/sysadminctl -addUser "$TEMP_USER" -fullName "Temporary User" -password "$TEMP_PASS" if [[ $? -eq 0 ]]; then echo "User $TEMP_USER created." else echo "WARNING: sysadminctl returned an error. User may not have been created." fi # Force password change on first login /usr/bin/pwpolicy -u "$TEMP_USER" -setpolicy "newPasswordRequired=1" if [[ $? -eq 0 ]]; then echo "Password change required on first login." else echo "WARNING: Could not set newPasswordRequired policy for $TEMP_USER." fi # Enable SSH (Remote Login) locally -- no MDM command required echo "Enabling SSH (Remote Login)..." /usr/sbin/systemsetup -setremotelogin on if [[ $? -eq 0 ]]; then echo "SSH enabled." else echo "WARNING: systemsetup -setremotelogin returned an error. SSH may not be enabled." fi # Get bearer token echo "Requesting API token..." TOKEN_RESPONSE=$(curl -s -X POST "$JAMF_URL/api/oauth/token" -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&grant_type=client_credentials") TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4) if [[ -z "$TOKEN" ]]; then echo "ERROR: Failed to obtain API token. Check Client ID and Secret." echo "Response: $TOKEN_RESPONSE" exit 1 fi echo "Token obtained." # Get this device's serial number SERIAL=$(system_profiler SPHardwareDataType | awk '/Serial Number/{print $4}') if [[ -z "$SERIAL" ]]; then echo "ERROR: Could not determine serial number." exit 1 fi echo "Serial number: $SERIAL" # Brief pause for Jamf DB write lag after enrollment sleep 20 # Look up Jamf device ID by serial number echo "Looking up Jamf ID for serial $SERIAL..." COMPUTER_XML=$(curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/xml" "$JAMF_URL/JSSResource/computers/serialnumber/$SERIAL") COMPUTER_ID=$(echo "$COMPUTER_XML" | xpath -q -e "//computer/general/id/text()" 2>/dev/null) if [[ -z "$COMPUTER_ID" ]]; then echo "ERROR: Could not find Jamf ID for serial $SERIAL." echo "Response: $COMPUTER_XML" exit 1 fi echo "Jamf ID: $COMPUTER_ID" # Send Enable Remote Desktop MDM command via Jamf API echo "Sending Enable Remote Desktop command..." COMMAND_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "Authorization: Bearer $TOKEN" "$JAMF_URL/JSSResource/computercommands/command/EnableRemoteDesktop/id/$COMPUTER_ID") if [[ "$COMMAND_RESPONSE" == "201" ]]; then echo "SUCCESS: Enable Remote Desktop command queued for device ID $COMPUTER_ID." exit 0 else echo "ERROR: API returned HTTP $COMMAND_RESPONSE when sending remote desktop command." exit 1 fi ``` On the **Options** tab, set the following parameter labels: * Parameter 4: `API Client ID` * Parameter 5: `API Client Secret` * Parameter 6: `Jamf Pro URL` On the **Script** tab, paste the following: ```bash theme={null} #!/bin/bash ############################################################################### # enable_remote_access.sh # # Triggered by Jamf Pro enrollment complete policy. # - Enables SSH (Remote Login) directly via systemsetup # - Calls the Jamf Pro API to send the Enable Remote Desktop MDM command # to this device using its own serial number for lookup # # The machine is brought to the macOS login screen. An administrator # creates the user account separately. # # Parameters: # $4 - Jamf Pro API Client ID # $5 - Jamf Pro API Client Secret # $6 - Jamf Pro URL (e.g. https://[yourinstance].jamfcloud.com) ############################################################################### CLIENT_ID="$4" CLIENT_SECRET="$5" JAMF_URL="$6" if [[ -z "$CLIENT_ID" || -z "$CLIENT_SECRET" || -z "$JAMF_URL" ]]; then echo "ERROR: Missing required parameters. Check Parameter 4 (Client ID), 5 (Client Secret), 6 (Jamf URL)." exit 1 fi JAMF_URL="${JAMF_URL%/}" # Enable SSH (Remote Login) locally -- no MDM command required echo "Enabling SSH (Remote Login)..." /usr/sbin/systemsetup -setremotelogin on if [[ $? -eq 0 ]]; then echo "SSH enabled." else echo "WARNING: systemsetup -setremotelogin returned an error. SSH may not be enabled." fi # Get bearer token echo "Requesting API token..." TOKEN_RESPONSE=$(curl -s -X POST "$JAMF_URL/api/oauth/token" -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&grant_type=client_credentials") TOKEN=$(echo "$TOKEN_RESPONSE" | grep -o '"access_token":"[^"]*"' | cut -d'"' -f4) if [[ -z "$TOKEN" ]]; then echo "ERROR: Failed to obtain API token. Check Client ID and Secret." echo "Response: $TOKEN_RESPONSE" exit 1 fi echo "Token obtained." # Get this device's serial number SERIAL=$(system_profiler SPHardwareDataType | awk '/Serial Number/{print $4}') if [[ -z "$SERIAL" ]]; then echo "ERROR: Could not determine serial number." exit 1 fi echo "Serial number: $SERIAL" # Brief pause for Jamf DB write lag after enrollment sleep 20 # Look up Jamf device ID by serial number echo "Looking up Jamf ID for serial $SERIAL..." COMPUTER_XML=$(curl -s -H "Authorization: Bearer $TOKEN" -H "Accept: application/xml" "$JAMF_URL/JSSResource/computers/serialnumber/$SERIAL") COMPUTER_ID=$(echo "$COMPUTER_XML" | xpath -q -e "//computer/general/id/text()" 2>/dev/null) if [[ -z "$COMPUTER_ID" ]]; then echo "ERROR: Could not find Jamf ID for serial $SERIAL." echo "Response: $COMPUTER_XML" exit 1 fi echo "Jamf ID: $COMPUTER_ID" # Send Enable Remote Desktop MDM command via Jamf API echo "Sending Enable Remote Desktop command..." COMMAND_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "Authorization: Bearer $TOKEN" "$JAMF_URL/JSSResource/computercommands/command/EnableRemoteDesktop/id/$COMPUTER_ID") if [[ "$COMMAND_RESPONSE" == "201" ]]; then echo "SUCCESS: Enable Remote Desktop command queued for device ID $COMPUTER_ID." exit 0 else echo "ERROR: API returned HTTP $COMMAND_RESPONSE when sending remote desktop command." exit 1 fi ``` On a freshly wiped macOS install, `/usr/bin/python3` is a stub that triggers an Xcode Command Line Tools install prompt. In a headless session this fails silently. The script uses `grep` and `cut` instead, which are always available. Go to **Computers > Policies > New**. **General payload:** * Display Name: `Enable Remote Access - Post Enrollment` * Trigger: **Enrollment Complete** * Execution Frequency: **Ongoing** **Scripts payload:** Add `Enable Remote Access Post-Enrollment` and fill in the parameters for the script variant you chose. * Parameter 4: your API Client ID * Parameter 5: your API Client Secret * Parameter 6: `https://[yourinstance].jamfcloud.com` * Parameter 7: temp username (for example, `tempuser`) * Parameter 8: temp password * Parameter 4: your API Client ID * Parameter 5: your API Client Secret * Parameter 6: `https://[yourinstance].jamfcloud.com` **Scope tab:** Scope to the `ADE Enrolled Machines` Smart Group. Save the policy. ## Recovery procedure Once setup is complete, recovering a machine requires a single action. 1. In Jamf Pro, open the target machine's inventory record. 2. Click **Management > Wipe Computer**. * Only check **Clear Activation Lock** if Activation Lock is confirmed active on the device. * If prompted for a wipe passcode, enter any 6-digit value (for example, `123456`). The secure enclave wipe bypasses it on modern macOS. 3. Click **Wipe**. No further action is required. The machine reboots, re-enrolls, and the policy runs automatically. SSH is enabled and Screen Sharing is enabled. If you used the **With temporary user** script, the temporary user account is also created. Hand the credentials to the user so they can connect via VNC. They'll be prompted to set a new password on first login. **Monitoring progress:** Refresh **Computers** until the machine reappears (typically 5 to 10 minutes). Open the computer record and check **History > Policy Logs** to confirm the script exited with code 0. Then check **History > Management Commands** to see `EnableRemoteDesktop` move from Pending to Completed. Policy Logs is the leading indicator: if the script succeeded, SSH is already up (and the temporary user account exists, if you used that variant) before the MDM command finishes. ## Verify the recovery * **Policy Logs:** `Enable Remote Access - Post Enrollment` ran and exited with code 0. * **Management Commands:** `EnableRemoteDesktop` shows status Completed. * **SSH:** `ssh administrator@[machine-ip]` SSH as the managed admin account created by the PreStage (for example, `administrator`), not as the temporary user. If you used the **With temporary user** script, the temp user has a forced password change policy set. macOS can only fulfill that requirement via the GUI, so any SSH session authenticated as the temp user will close immediately after password entry. The managed admin account has no such policy and works over SSH without restriction. * **Screen Sharing:** connect to `vnc://[machine-ip]` and log in. Use the temporary credentials if you used the **With temporary user** script. * The machine no longer appears in the `Remote Management - Disabled` Smart Group. ## Troubleshooting | Symptom | Likely cause | Fix | | ------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | | Machine stuck on account creation screen after wipe | Local User Account Type in PreStage not set to Skip | Edit PreStage Account Settings and select Skip under Local User Account Type | | Machine does not appear in Jamf after wipe | ABM assignment not synced to Jamf | Go to Settings > Global > Device Enrollment Program > your ABM token > Sync Now | | Script fails with token error | Client ID or Secret incorrect in policy parameters | Edit the policy Scripts payload and verify Parameters 4 and 5 | | Temp user not created (with temporary user script only) | Username or password missing from policy parameters | Edit the policy Scripts payload and verify Parameters 7 and 8 | | Policy never fires after enrollment | Trigger not set to Enrollment Complete, or machine not in ADE Enrolled Machines group | Verify the policy trigger and Smart Group criteria | | EnableRemoteDesktop queued but never completes | Machine lost network before Jamf could push the MDM command | Confirm wired Ethernet and DHCP; re-run the policy manually | # Incident response and change management Source: https://docs.macstadium.com/remote-desktop-vdi/operations/incident-response Incident triage, escalation procedures, post-incident reviews, change management checklists, communication templates, KPIs, and compliance for MacStadium VDI. This page covers incident response, change management, reporting, and compliance for production MacStadium VDI environments. For day-to-day operational tasks, see the [Day-2 Operations Guide](/remote-desktop-vdi/operations/day-2-operations-guide). For troubleshooting specific symptoms, see [Troubleshooting Quick Reference](/remote-desktop-vdi/reference/troubleshooting-quick-reference). *** ## Incident response ### Recognizing common failure modes **Symptom: User can't connect to desktop** Possible causes: VM not running, VDA not registered with Citrix, network connectivity issue, Citrix Cloud issue. ```bash theme={null} # Verify VM is running ansible-playbook -i inventory list.yml | grep # SSH to host and check VDA status ssh admin@ # VNC into VM to check VDA registration open vnc://:6000 ``` **Symptom: Desktop is slow or unresponsive** Possible causes: Host overloaded (too many VMs), VM resource starvation, network latency. ```bash theme={null} # Check host CPU/memory ansible hosts -i inventory -m shell -a "top -l 1 | head -20" # Check VM count per host ansible-playbook -i inventory list.yml ``` **Symptom: VMs fail to deploy** Possible causes: Host out of disk space, image pull failure, Orka Engine error. ```bash theme={null} # Check disk space ansible hosts -i inventory -m shell -a "df -h /var/orka" # Test image pull manually ansible-playbook -i inventory pull_image.yml -e "remote_image_name=" -v ``` **Symptom: All VMs down after host reboot** Cause: VMs don't auto-start after host reboot by default. ```bash theme={null} # Start all VMs on affected host ansible-playbook -i inventory list.yml | grep [HOST-NAME] | awk '{print $1}' | xargs -I {} ansible-playbook -i inventory vm.yml -e "vm_name={}" -e "desired_state=running" ``` Consider scripting auto-start behavior or coordinating with MacStadium to enable auto-start features. *** ### Triage decision tree ``` User reports issue ↓ Can OTHER users connect? ├─ NO → Check Citrix Cloud status, Cloud Connectors, network └─ YES → Issue is specific to this user or their VM ↓ Can user connect to OTHER desktops? ├─ NO → User account issue, check Citrix permissions └─ YES → Issue is specific to this user's assigned VM ↓ Is VM running? ├─ NO → Start VM, check why it stopped └─ YES → Check VDA registration ↓ Is VDA registered? ├─ NO → Restart VDA service or restart VM └─ YES → Performance or application issue ↓ Check host resources, VM resources, HDX settings ``` *** ### Escalation procedures | Level | Who | When | | ------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------- | | **Level 1:** Team Lead / Senior Admin | Handle yourself | Single user issues, VM restarts, minor performance tuning, user account management | | **Level 2:** Infrastructure Team | Escalate | Multiple users affected, suspected host hardware failure, network infrastructure involved, capacity planning needed | | **Level 3:** MacStadium Support | Escalate | Orka Engine failures, host hardware failures, datacenter network failures, new host provisioning | | **Level 4:** Citrix Support | Escalate | Citrix Cloud outage, VDA registration failures across all VMs, HDX protocol issues, Citrix policy problems | **Escalation email template:** ``` Subject: [URGENT] VDI Issue: [BRIEF_DESCRIPTION] Impact: - Users affected: X - Severity: High / Medium / Low - Business impact: [DESCRIPTION] Problem: [CLEAR_DESCRIPTION] Steps taken: 1. [WHAT_YOUVE_TRIED] 2. [TROUBLESHOOTING_DONE] 3. [RESULTS] Next steps needed: [WHAT_YOU_NEED_FROM_THE_ESCALATION_TEAM] Contact: [YOUR_NAME], [PHONE], [EMAIL] ``` *** ### Post-incident review template Complete this for any incident affecting more than 10 users or lasting more than an hour. ``` Incident Summary - Date/Time: - Duration: - Users impacted: - Services affected: Timeline - Issue first reported: - Investigation started: - Root cause identified: - Resolution implemented: - Service restored: Root Cause: (What caused the issue) Resolution: (What fixed it) Preventative Measures: - Short-term (this week): - Long-term (this month): Action Items - Task 1: Assigned to [NAME], Due [DATE] - Task 2: Assigned to [NAME], Due [DATE] ``` Store post-incident reviews in your documentation repository for future reference. *** ## Change management ### Pre-change checklists Before any production change, verify: * [ ] Change window scheduled and communicated to users * [ ] Backup/snapshot of current image state available * [ ] Rollback plan documented and tested * [ ] Testing completed in a non-production environment * [ ] Required approvals obtained * [ ] Monitoring in place to detect issues * [ ] Team available for the duration of the change For image updates specifically: * [ ] New golden image tested on at least one VM * [ ] Citrix VDA registration verified * [ ] HDX features tested (clipboard, file transfer, USB) * [ ] Applications tested and functional * [ ] Pilot group identified * [ ] Previous image version retained for rollback *** ### Testing procedures For new golden images: 1. **Deployment test:** Deploy one VM, verify it boots within 3 minutes and gets network connectivity. 2. **VDA registration test:** Check System Preferences → Citrix VDA shows "Registered"; verify VM appears as "Available" in Citrix Cloud Console. 3. **User connectivity test:** Assign a test user, launch desktop from Citrix Workspace, verify connection. 4. **HDX feature test:** Test clipboard, file transfer (if enabled), printing (if enabled), application launching. 5. **Application functionality test:** Launch each business-critical application, perform a basic workflow, check for errors. 6. **Performance test:** Measure login time (target: under 30 seconds), check CPU/memory at idle, check responsiveness during typical tasks. Document results with image name, test date, tester name, and pass/fail for each item. *** ### Rollback plans Write rollback procedures *before* starting any change. **Example: Image update rollback** If a new image causes issues within the first 24 hours: 1. Stop new deployments immediately. 2. Revert affected VMs: ```bash theme={null} # Delete new VMs ansible-playbook -i inventory delete.yml -e "vm_name=citrix-vda-finance-01" # Redeploy with previous version ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:v2.1" ``` 3. Verify users can connect to rolled-back VMs. 4. Document what went wrong for post-incident review. Estimated rollback time: 30-45 minutes for 10 VMs. **Example: Citrix policy change rollback** 1. Revert the policy in Citrix Cloud Console: Policies → Select policy → Edit → Restore previous settings. 2. Force policy refresh: have users log out and back in, or wait 30 minutes for automatic refresh. Estimated rollback time: 5-10 minutes. *** ### Communication templates **Planned maintenance (send 3-5 business days in advance):** ``` Subject: Scheduled VDI Maintenance We will be performing maintenance on the macOS virtual desktop environment on [DATE] from [START_TIME] to [END_TIME] [TIMEZONE]. What to expect: - Brief interruption to desktop access (approximately 15 minutes) - You may need to reconnect through Citrix Workspace after maintenance - All data stored on network drives will be unaffected What we're doing: - Installing macOS security updates - Updating desktop images with latest applications Questions? Contact [SUPPORT_EMAIL]. IT Team ``` **Emergency maintenance (send immediately when issue detected):** ``` Subject: URGENT: VDI Service Interruption We are currently experiencing an issue with the macOS virtual desktop service. Some users may be unable to connect or experiencing poor performance. Current status: - Issue first detected: [TIME] - Users impacted: [ESTIMATED_NUMBER] - IT team actively working on resolution Workaround (if available): [ANY_TEMPORARY_WORKAROUND] We will send updates every 30 minutes until resolved. Next update: [TIME] IT Team ``` **Resolution notification:** ``` Subject: RESOLVED: VDI Service Restored The macOS virtual desktop service issue has been resolved. All services are now operating normally. Summary: - Issue duration: [START_TIME] to [END_TIME] - Root cause: [BRIEF_NON_TECHNICAL_EXPLANATION] - Resolution: [WHAT_WAS_DONE] If you continue to experience issues, contact [SUPPORT_EMAIL]. Thank you for your patience, IT Team ``` *** ## Metrics and reporting ### Key performance indicators | KPI | Target | Measurement | | --------------------- | ----------------------------------- | ---------------------------------------------------- | | Availability | 99.5% uptime during business hours | % of time VMs are registered and available in Citrix | | Login time | under 30 seconds | Desktop launch to usable desktop | | Session latency | under 100ms round-trip | HDX session latency | | Frame rate | 30 FPS for typical office workloads | HDX session frame rate | | Capacity utilization | 70–80% at peak | VMs in use / total VMs | | Capacity headroom | 20–30% spare | Spare VMs / total VMs | | Support ticket volume | Track trend | VDI-related tickets per month | | User satisfaction | 4.0/5.0+ | Quarterly survey | | Cost per user | Track trend | Total infrastructure cost / active users | *** ### User satisfaction tracking Quarterly survey questions: 1. Rate your overall satisfaction with the macOS virtual desktop (1–5) 2. How often do you experience connectivity issues? (Never / Rarely / Sometimes / Often) 3. How would you rate desktop performance for your daily tasks? (Poor / Fair / Good / Excellent) 4. What applications or features would improve your experience? 5. Any other feedback? Review support tickets weekly for recurring issues, patterns by user group, and correlation with recent changes. Address patterns before they become widespread. *** ### Cost analysis and optimization Review quarterly: 1. **Right-size VMs:** Are all users on high-spec VMs when they only need basic? 2. **Eliminate unused capacity:** VMs deployed but not assigned to users? 3. **Image efficiency:** Unnecessary applications in golden images? Can you consolidate? 4. **Licensing:** Citrix licenses for inactive users? Remove inactive accounts quarterly. *** ### Quarterly business review outline Present to leadership/stakeholders each quarter: 1. **Service overview:** Total users, total VMs, uptime %, support ticket trend 2. **Highlights:** Major improvements, issues resolved, user feedback summary 3. **Challenges:** Pain points, resource constraints, technical debt 4. **Roadmap:** Upcoming improvements, capacity planning, technology upgrades 5. **Financials:** Cost per user, budget vs. actual, cost optimization initiatives Keep it business-focused. Leadership cares about user satisfaction, costs, and risks, not Ansible commands. *** ## Reference ### Vendor contacts | Vendor | Purpose | Contact | SLA | | -------------- | ----------------------------------- | ----------------------------------------------------------------- | ----------------------- | | MacStadium | Host hardware, Orka Engine, network | [support@macstadium.com](mailto:support@macstadium.com) | 1 business day response | | Citrix Support | Citrix Cloud, VDA, licensing | [support.citrix.com](https://support.citrix.com) (1-800-424-8749) | Varies by license tier | **Contact MacStadium when:** host is down, Orka Engine failures, new host provisioning, datacenter network issues. **Contact Citrix when:** VDA registration failures, Cloud Connector issues, licensing problems, HDX protocol issues. *** ### Compliance checklist Review quarterly. **Security:** * [ ] VMs patched monthly (macOS updates) * [ ] Citrix VDA is current (or within 2 releases) * [ ] Access logging enabled in Citrix Cloud * [ ] User access reviewed quarterly, inactive users offboarded * [ ] Network segmentation enforced * [ ] Registry credentials rotated every 90 days **Data protection:** * [ ] User data not stored on VMs (network storage only) * [ ] Golden images backed up (at least 3 versions retained) * [ ] Disaster recovery plan documented and tested annually * [ ] VM deletion policy enforced (no orphaned VMs) **Operational:** * [ ] Capacity headroom maintained (20–30% spare VMs) * [ ] Monitoring in place for VM availability * [ ] Change management process followed for all production changes * [ ] Post-mortems completed for major outages * [ ] Documentation kept current **Financial:** * [ ] Chargeback reporting in place (if multi-tenant) * [ ] Monthly cost tracking vs. budget * [ ] Unused licenses identified and reclaimed * [ ] Quarterly cost optimization review # Monitoring and observability Source: https://docs.macstadium.com/remote-desktop-vdi/operations/monitoring Monitor MacStadium VDI VM health, host utilization, and user session state, and integrate metrics and logs with external observability and alerting tools. This page covers monitoring and observability for a production MacStadium VDI environment: what data is available, how to collect it, and how to integrate with external tools. *** ## What the platform exposes ### Orka Engine Orka Engine exposes VM state and host utilization through the CLI and Ansible playbooks. There is no built-in metrics endpoint; monitoring is done by querying Orka through Ansible or the `orka-engine` CLI. **VM state:** ```bash theme={null} # List all VMs and their status ansible-playbook -i inventory list.yml # Check a specific VM ansible-playbook -i inventory list.yml -e "vm_name=" ``` Output includes VM name, IP address, host assignment, and running state. **Host utilization:** ```bash theme={null} # CPU and memory on all hosts ansible hosts -i inventory -m shell -a "top -l 1 | grep -E 'CPU|PhysMem'" # Disk space on all hosts ansible hosts -i inventory -m shell -a "df -h /Users//.local/share/orka/data" # Orka Engine version (confirms service is running) ansible hosts -i inventory -m shell -a "orka-engine --version" ``` **Orka Engine logs:** Located at `/var/log/orka-engine.log` on each Mac host. ```bash theme={null} # Recent errors across all hosts ansible hosts -i inventory -m shell -a "sudo grep -i error /var/log/orka-engine.log | tail -20" # Tail logs on a specific host ansible hosts -i inventory -m shell -a "sudo tail -100 /var/log/orka-engine.log" --limit mac-node-1 ``` ### Management UI The management UI provides task execution history, playbook run logs, and basic job status. All playbook runs are logged with timestamps, operator name, and output. Access at `http://localhost:3000` on your Ansible controller (or wherever you deployed it). ### Citrix Cloud Console Citrix Cloud provides the most complete view of session and VDA health. Key monitoring areas: | Location | What to check | | -------------------------- | ------------------------------------------------------- | | Monitor → Machines | VDA registration state, power state, faults | | Monitor → Sessions | Active sessions, session quality, launch success rate | | Monitor → Cloud Connectors | Connector status and heartbeat | | Monitor → Trends | Historical session launch times, session quality trends | | Monitor → User Activity | Per-user session history and connection attempts | **Target metrics (baseline):** * Unregistered machines: 0 * Session launch success rate: >95% * Average session launch time: under 30 seconds * Cloud Connectors: all "Up" ### Citrix VDA logs (on VMs) Located at `/Library/Application Support/Citrix/VDA/Logs/` on each macOS VM. Key files: * `vda.log`: main VDA service log (registration events, errors) * `registration.log`: registration-specific events * `broker.log`: communication with Citrix Cloud ```bash theme={null} # Access via Ansible through host jump proxy ansible hosts -i inventory -m shell -a "sudo tail -50 /Library/Application\ Support/Citrix/VDA/Logs/vda.log" --limit ``` *** ## Setting up monitoring ### Basic: Ansible-based capacity polling A cron job on the Ansible controller captures daily capacity snapshots: ```bash theme={null} # Add to crontab on the Ansible controller crontab -e # Daily capacity log at 6 AM 0 6 * * * ansible-playbook -i /path/to/inventory list.yml > /var/log/orka-capacity-$(date +\%Y\%m\%d).log # Daily disk space check 30 6 * * * ansible hosts -i /path/to/inventory -m shell -a "df -h /Users//.local/share/orka/data" >> /var/log/orka-disk-$(date +\%Y\%m\%d).log ``` Review these logs weekly to spot trends before they become incidents. ### Health check automation Run `list.yml` on a schedule and scan its output for unexpected VM states. Pipe the output through your alerting system's ingest endpoint (most support a simple `curl` POST to a webhook). Schedule via cron every 15 minutes and treat any non-zero exit code or missing VM name as an alert condition. *** ## Integration with external monitoring tools MacStadium VDI doesn't expose a native metrics API. The general integration pattern is to run Ansible playbooks on a schedule, capture their output to log files, and forward those logs to your monitoring platform using its standard log ingestion agent. For example, with Datadog: install the Datadog Agent on your Ansible controller, configure a log collection rule pointing at your capacity log files (for example, `/var/log/orka-capacity-*.log`), and create a monitor based on log content. The approach is the same for CloudWatch Logs, Grafana Loki, or any other log-based monitoring platform. The log files are the integration point, not a metrics API. For alerting, most platforms support webhook-based notifications. Pipe playbook output through your alerting system's ingest endpoint from your cron jobs. Consult your monitoring platform's documentation for the specific agent configuration and webhook format. *** ## Alerting recommendations ### Critical (page immediately) | Condition | Detection method | | -------------------------------------------- | ----------------------------------------------------------------- | | VDA registration drops below 80% of expected | Citrix Cloud Console → Monitor → Machines | | All VMs in a Delivery Group unavailable | Citrix Cloud Console → Monitor → Machines | | Host disk usage >90% | `df -h /Users//.local/share/orka/data` via Ansible | | Orka Engine service not responding | `orka-engine --version` fails via Ansible | ### Warning (respond within 4 hours) | Condition | Detection method | | ----------------------------------------------------- | ----------------------------------------------------------------- | | >10% of session launches failing over 15 minutes | Citrix Cloud Console → Monitor → Trends | | Host CPU >80% sustained | `top` via Ansible | | Host disk usage >75% | `df -h /Users//.local/share/orka/data` via Ansible | | Session launch time exceeds 30-second baseline by 50% | Citrix Cloud Console → Monitor → Trends | ### Informational (review daily) | Condition | Detection method | | ----------------------------------------- | ----------------------------------------- | | New "Unregistered" VMs appear | Citrix Cloud Console → Monitor → Machines | | VM count per host near `max_vms_per_host` | `list.yml` output | | Image versions on hosts are inconsistent | `orka-engine image list` via Ansible | *** ## MSDC-Hosted vs. Self-Hosted differences MacStadium monitors physical host health, hardware, and data center infrastructure. You don't have access to hardware-level metrics directly. * For host hardware alerts (disk failure, hardware fault), MacStadium's monitoring will detect these and notify you. * For Orka Engine and VM-layer monitoring, use the Ansible-based approach described on this page. * MacStadium can provide infrastructure-level metrics on request. Contact your account representative. You own full-stack observability, from hardware to VDA. In addition to the Ansible-based monitoring described on this page: * Install your standard server monitoring agent (Datadog, New Relic, Prometheus Node Exporter) on each Mac host * Monitor macOS system metrics: CPU, memory, disk I/O, network throughput * Set up hardware health monitoring for disk failures and memory errors * For AWS EC2 Mac instances, use CloudWatch metrics for instance-level monitoring # VDI production rollout checklist Source: https://docs.macstadium.com/remote-desktop-vdi/operations/production-rollout Transition MacStadium VDI from testing to production. Covers user access policies, golden image readiness, monitoring setup, and team training requirements. A production rollout transitions your MacStadium VDI environment from testing to live operation. This step in the deployment lifecycle typically covers configuring user access, operational monitoring, backup strategies, and scaling concerns. Before transitioning to production, you will want to ensure that you have completed environment testing, golden images have been tested and are ready for deployment, troubleshooting procedures have been documented, your operations and support teams have been trained on daily support tasks, and relevant escalation procedures have been defined. ### User Assignment and Access Policies Configures how users access desktops and what permissions they have within the MacStadium VDI environment. #### User Assignment Strategies ##### Dedicated (Static) Assignment * Each user is assigned to a specific VM permanently * Users always connect to the same desktop * The desktop retains user customizations, installed applications, and files * Use case: Power users, developers, or executives who need a persistent workspace ##### Pooled (Random) Assignment * Users get any available VM from pool * VM resets to golden image after user logs out (non-persistent) * No user data is stored on the VM (uses network storage) * Use case: Shared workstations, call centers, task-based work ##### Configuring User Assignment in Citrix Cloud * Navigate to **Citrix Cloud Console → Web Studio → Delivery Groups** * Select your Delivery Group * Configure assignment type: * Static: "Assign to specific user" to map users to specific VMs * Pooled: "Assign randomly" means users get the next available VM * Add users or groups: * Assign Active Directory security groups * Assign Azure AD groups * Add individual users for testing ##### Example Assignment Strategy * Delivery group: Finance-Standard-VDI * Assignment: Pooled (random VM) * Users: Finance department AD Group (200 users) * VM pool: 50 VMs * Session timeout: 8 hours idle * Delivery group: Engineering-Persistent-VDI * Assignment: Static (dedicated VM) * Users: Engineering team AD Group (35 users) * VM pool: 30 VMs * Session timeout: 24 hours idle ### Access Policies #### Network Access Control * Defines where users can connect from (internal network, remote, mobile) * Configure Citrix Gateway for external access * Implement conditional access based on device compliance #### Session Policies Configure session policies in Citrix Cloud → Policies → Session Settings * Session timeout: Auto-disconnect after idle period (default 24 hours) * Reconnection: Allow users to reconnect to disconnected sessions * Multiple sessions: Allow or block concurrent sessions per user * Power management (pooled VMs only): Shut down VMs after extended idle period #### Feature Restrictions Configure HDX policies to enable/disable features as needed. * Clipboard: Enable/disable copy-paste between client and VM * File transfer: Allow/block the ability to drag and drop files * USB redirection: Allow specific devices or block all USB devices * Printing: Enable client printer mapping * Local drive access: Mount client drives in VM #### Example Policy Matrix * Finance team * Clipboard: Enabled (unidirectional, client to VM only) * File transfer: Disabled * Printing: Enabled * USB: Disabled * Engineering team * Clipboard: Bidirectional * File transfer: Enabled * Printing: Enabled * USB: Enabled (specific devices only) #### User Communication Before production rollout, communicate to users: * How to access Citrix Workspace (URL or app download) * Login credentials and authentication requirements * Desktop naming and identification * Session behavior (persistent vs. non-persistent) * IT support contact information * Best practices (save work to network drives, not local desktop) Consider a phased rollout approach if time allows, beginning with a pilot team and progressing through teams/departments until full production adoption has been reached. This allows for additional time to monitor any issues before expanding MacStadium VDI access to further teams. ### Monitoring and Observability Proactive monitoring identifies issues before they impact end users, and provides valuable data for capacity planning and disaster recovery. You may wish to monitor both the infrastructure layer (Orka hosts, network, storage, VMs) and the Citrix layer (VDA registration, machine catalog, sessions, user experience). Host-level monitoring example: ``` # Check disk space for Orka storage ansible hosts -i inventory -m shell -a "df -h /opt/orka" # Check CPU usage ansible hosts -i inventory -m shell -a "top -l 1 | grep 'CPU usage'" # Check memory statistics ansible hosts -i inventory -m shell -a "vm_stat" ``` You may also wish to consider creating an Ansible playbook to run periodic health checks on your infrastructure layer: ``` --- - name: Infrastructure Health Check hosts: hosts tasks: - name: Check Orka Engine running shell: pgrep orka-engine register: orka_status failed_when: orka_status.rc != 0 - name: Check VM count per host shell: /usr/local/bin/orka-engine vm list | wc -l register: vm_count - name: Check disk space shell: df -h | grep -v tmpfs register: disk_status ``` VDA-level health checks (service status, log inspection) should be reviewed via Citrix Cloud Monitor or directly from within individual VMs. For host-level checks, use the Infrastructure Health Check playbook on a schedule. Citrix VDA service health and log monitoring should be observed via Citrix Cloud Monitor (Citrix Cloud Console → Monitor tab). For deeper log inspection, connect directly to the VM and run: ``` sudo launchctl list | grep citrix grep -i 'crash\|error\|fatal' /Library/Application\ Support/Citrix/VDA/Logs/vda.log | tail -20 ``` You can also use Citrix Cloud Monitor (built-in) to track: * Session launch success rate * Average session launch time * Failed connection attempts * Active vs. available desktop count * User login patterns and peak usage times Access this by navigating to: Citrix Cloud Console → Monitor tab You will also want to clearly define an alerting strategy with your team. As an example: * Critical alerts (requiring immediate response) * VDA registration drops below a certain percentage of expected count * All VMs in a Delivery Group are “Unavailable” * Orka host disk space is >90% full * Orka Engine service has crashed * Warning alerts (respond within 1-3 hours) * Session launch failures over a certain percentage within 15 minutes * Host CPU sustained at >80% for 10+ minutes * Disk space is >75% full * VM deployments are failing * Informational alerts (review daily/as needed) * Session launch time exceeds baseline by 50% * Network latency increases * Users log out without proper shutdown You will want to discuss with your team how you wish to structure your alerting tools and dashboards. This includes email or Slack/Teams notifications, PagerDuty or similar services for critical outage alerts, custom scripts, AI agents, or Ansible playbooks that send notifications to system administrators on failures. Dashboard configuration is helpful for teams to visualize the current availability and uptime of the service. This may consist of certain attributes such as the total number of deployed VMs vs. available machines, current active sessions, session launch success rates, host resource utilization, recent alerts or incidents, and capacity utilization. Tools such as Grafana, Datadog, or Citrix Director can be used to create visualizations and dashboards. You may also consider centralizing logs for additional troubleshooting in some cases: * Orka Engine logs: `/opt/orka/logs/com/macstadium.orka-engine.server.managed.log` * VDA logs: `/Library/Application Support/Citrix/VDA/Logs/` * System logs: `/var/log/system.log` Additionally, you can choose to ship your logs to a central logging system (for example, Splunk, CloudWatch) for further research and analysis if deemed appropriate by your organization’s existing data policies and procedures. ### Backup and Recovery Procedures Implementing backup strategies protects against data loss, VM corruption, and infrastructure failures. What to include in backups: VM images (golden images): * Base macOS images with MacStadium VDI pre-installed * Department-specific images with specific software or applications installed * All versions maintained for rollback capabilities VM configuration data: * VM resource allocations (CPU, RAM, network, etc.) * Network bridge settings * Inventory files and Ansible settings User data (persistent desktops only) * User home directories * Application data and settings * Documents and files Citrix configuration: * Machine catalog definitions * Delivery Group settings * Policies and user assignments * Enrollment tokens ### Image Backup Examples Deploy new VMs from the backup image version using cron scheduling: VM image backup consists of ensuring your golden images are pushed to a secondary or off-site OCI registry. You can schedule this by running pull\_image.yml against a backup registry destination on a cron schedule. For example, to re-tag and push an existing image to a backup registry: ``` # Pull latest golden image to local hosts (as a cache/backup step) ansible-playbook -i inventory pull_image.yml -e "remote_image_name=registry.example.com/citrix-vda/sonoma-golden:latest" ``` For persistent VM user data, backup procedures depend on your organization's existing storage infrastructure and are outside the scope of the Orka orchestration tooling. In the event of Orka host failure, take the following steps for system recovery: 1. Provision replacement Mac hardware 2. Add the new host to your Ansible inventory and run the `install_engine.yml` playbook 3. Verify the host has a static IP or DHCP reservation and is reachable via Ansible: `ansible hosts -i inventory -m ping` 4. Pull golden images from container registry 5. Deploy VMs on the new host 6. Citrix VDAs should register automatically with an existing enrollment token Recovery time: Est. between 2-4 hours in the case of MacStadium managed hardware with a spare host available; 5-10 minutes to deploy an image to an Orka host. Provisioning new MacStadium hardware not already available can take 2-3 days. In the event of complete infrastructure loss, a disaster recovery playbook should walk through the following steps: * Provision new Mac hardware * Run `install_engine.yml` against all new hosts to install Orka Engine (see Install Orka Engine section of the Deployment Guide) * Restore Ansible configurations from Git/Bitbucket/etc. * Pull all images from OCI registry * Run Ansible deployment playbooks to recreate VMs * Verify VDA registration and user access * Restore user data from backup storage Recovery time: Est. 4-8 hours depending on company scale When scheduling quarterly disaster planning, consider the following tests: * Simulate VM failures and practice recovery * Test backup restoration procedures * Validate recovery time objectives meet requirements * Document any gaps or process improvements needed #### Backup Process Checklist * Implement VM configuration backup * Configure user data backup for persistent desktops * Export Citrix configurations regularly * Store backups off-site (separate registry or storage) * Define and enforce a data retention policy * Document recovery procedures for common scenarios * Create a disaster recovery playbook * Test recovery procedures quarterly * Validate recovery time objectives are met #### Scale Considerations As your company grows and your needs evolve, you will want to plan for onboarding additional users to your MacStadium VDI instance. When undertaking capacity planning, it is important to ensure that you document your infrastructure’s current state. ##### Example ‘State of Current Infrastructure’ Infrastructure: * 3x Mac Mini M4 (24GB RAM, 512GB storage) * Max VMs per host: 2 (Apple licensing restriction) * Total VM capacity: 6 VMs Current utilization: * Deployed VMs: 4 * Active sessions (peak): 3 * Average resource usage per VM: 4 CPU cores, 8GB RAM * Storage used: 45% (200GB / 512GB) User base: * Total licensed users: 50 * Concurrent usage peak: 60% (30 users) * Current VM user ratio: 1:12.5 Growth projection requires accurately estimating future needs. ##### Three Month Growth Projection * User growth: +30 users (80 total) * Concurrent usage: 60% (48 users) * VMs needed: 10 (current: 4) * Additional hardware: 2x Mac Mini M4 ##### Six Month Growth Projection * User growth: +50 users (100 total) * Concurrent usage: 60% (60 users) * VMs needed: 15 * Additional hardware: 5x Mac Mini M4 ##### Twelve Month Growth Projection * User growth: +100 users (150 total) * Concurrent usage: 65% (98 users) * VMs needed: 25 * Additional hardware: 10x Mac Mini M4 (or 5x Mac Studio for higher density workloads) **Scaling triggers:** Define thresholds that trigger capacity expansion: * VM utilization >80% during business hours: Add 2+ hosts * Session launch wait time >30 seconds: Insufficient available VMs * Host CPU running at >75% sustained load: VMs need more resources or more hosts are needed * Storage >70% full: Add additional storage or clean up old images **Horizontal scaling (adding hosts):** As your user base grows, you may wish to add more Orka hosts: 1. Procure additional Mac hardware meeting minimum MacStadium VDI requirements 2. Install macOS and configure your network (static IP or DHCP reservation) 3. Add the new hosts to your Ansible inventory file and run the installation playbook 4. Verify the new hosts are reachable and Orka Engine is running 5. Add these new hosts to your existing Ansible inventory: ``` [hosts] 10.0.100.10 10.0.100.11 10.0.100.12 10.0.100.13 # New host 10.0.100.14 # New host ``` 6. Cache golden images on new hosts: ``` ansible-playbook -i inventory pull_image.yml --limit 10.0.100.13,10.0.100.14 -e "remote_image_name=registry.example.com/citrix-vda/sonoma-finance:latest" ``` 7. Deploy VMs on new hosts: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-vda-finance-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` *Run this command once for each additional VM, using a unique `vm_name` each time.* **Vertical scaling (increase VM resources):** If users need higher-performance desktops, upgrade to higher-spec Macs: * Mac mini M4 → Mac mini M4 Pro (more CPU cores, RAM) * Mac mini M4 Pro → Mac Studio M2 Ultra (significantly more power) A production rollout marks the transition from project to operational service. With proper user access controls, monitoring, backup procedures, and scaling plans in place, your MacStadium VDI environment is ready to deliver reliable macOS virtual desktops to users at scale. # Validation and testing Source: https://docs.macstadium.com/remote-desktop-vdi/operations/validation-and-testing Validate your Citrix + Orka VDI setup before production: end-to-end connectivity, VM lifecycle, performance baseline, and smoke tests via Citrix Workspace. Completing validation and testing verifies that your Citrix + Orka VDI environment functions correctly before it is deployed to production. This typically consists of testing end-to-end user connectivity, VM lifecycle operations, establishing a performance baseline, and troubleshooting procedures. #### Testing Prerequisites Before beginning the testing and validation process, ensure: * Any and all relevant environment preparation, Citrix DaaS configuration, Mac host provisioning, Ansible playbook configuration, and image management steps have been completed successfully * Golden images have been created and cached on Orka hosts * Test VMs have been successfully deployed with Citrix VDA * VDA registration is confirmed in Citrix Cloud Console * Test user accounts are configured with access to Delivery Groups * The Citrix Workspace app has been installed on test client devices * Network configuration: * VMs deployed with bridged networking OR * Proper NAT/firewall configuration for VDA communication #### End-to-End Connectivity Test via Citrix Workspace This test validates the complete user journey from authentication to desktop usage. 1. Deploy 2-3 test VMs from your golden image, for example: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-test-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-test-02" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ansible-playbook -i inventory deploy.yml -e "vm_name=citrix-test-03" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` 2. Verify VDA registration via the Citrix Cloud Console. Navigate to Manage → Virtual Apps and Desktops → Delivery Groups and confirm the VMs appear with a Registered status. 3. Test authentication workflow * Launch the Citrix Workspace application on the test client * Enter workspace URL or email address * Authenticate with test user credentials * Verify multi-factor authentication (if enabled) **Expected result:** Successful authentication, workspace dashboard loads **Common issues:** * Authentication fails: Verify user exists in identity provider and is assigned to the correct Delivery Group * MFA problems: Check MFA configuration in Citrix Cloud * Workspace URL incorrect: Confirm workspace URL matches Citrix Cloud tenant #### Desktop Visibility Testing in Citrix Workspace 1. Navigate to the ‘Desktops’ tab in Citrix Workspace 2. Verify test desktop appears with the correct display name 3. Confirm desktop icon and description match configuration\ **Expected result:** Desktop(s) visible with correct name from Delivery Group\ **Common issues:** 4. No desktops appear: 1. Check user assignment in the Delivery Group 2. Verify VMs are registered in Citrix Cloud Console 3. Confirm VMs are in an “Available” state (not “In Use” or “Unregistered”) 5. Wrong desktop name 1. Update the desktop display name in Delivery Group settings #### Session Launch Testing in Citrix Workspace 1. Click the desktop to launch 2. Monitor connection progress 3. Time how long it takes the desktop to appear\ **Expected result:** Desktop launches successfully within 15-30 seconds, macOS login screen or desktop appears\ **Common issues:** * **Connection timeout:** Check network connectivity from client to Citrix Cloud. Verify Rendezvous connectivity from within a running VDA session by opening Terminal and running: ```bash theme={null} curl -v https://[customer_ID].xendesktop.net 2>&1 | grep Connected ``` 2. Confirm firewall allows HDX ports (1494, 2598) 3. If you see a black screen, the VDA service may not be running, restart the VDA service from within the VM: ``` sudo launchctl kickstart -k system/com.citrix.vda ``` 4. Slow to launch: Check VM resource allocation and host performance #### Desktop Functionality Testing in Citrix Workspace ##### Display and resolution 1. Verify screen resolution matches client display 2. Test full-screen mode 3. Test windowed mode and window resizing 4. Check multiple monitors are supported, if available ##### Input devices 1. Test keyboard by typing in Notes/TextEdit 2. Test mouse movement and clicks register as expected 3. Test trackpad gestures ##### Application functionality 1. Launch a browser (Safari, Chrome, Firefox, etc.) 2. Launch installed applications (Microsoft Office, Slack) 3. Confirm the ability to open and edit documents 4. Test switching between applications with `Cmd+Tab` **Expected result:** All inputs are responsive, applications launch normally with no lag or stuttering #### Peripheral and Feature Testing in Citrix Workspace ##### Clipboard functionality 1. Test Clipboard (Copy/Paste) functionality 1. Copy text from client device → paste into VM 2. Copy text from VM → paste into client device 3. Test the ability to copy/paste formatted text, images, and files ##### File transfers 1. Drag a file from the client to the VM desktop 2. Download a file from the VM to the client 3. Confirm the downloaded file appears in the correct location and is readable ##### Printing 1. Attempt to print a document 2. Verify client-side printers appear in the VM 3. Test ‘print preview’ functionality 4. Verify printing a document was successful ##### Audio 1. Verify audio plays in VM (System sounds, YouTube videos played in browser, etc.) 2. Verify audio plays on client device 3. Test microphone input (if supported) 4. Test headphone/bluetooth audio output (if supported) ##### USB redirection (if enabled) 1. Connect USB devices to client 2. Verify device appears in VM 3. Test device functionality **Expected result:** All features work as expected with minimal latency **Common issues:** * Clipboard isn’t working: Check HDX policy settings in Citrix * No file transfer: Verify file transfer policies are enabled * Printer issues: Check printer mapping settings in Citrix Workspace * No audio: Verify audio policy and codec settings #### Session Management in Citrix Workspace ##### Disconnect and reconnect 1. Disconnect Citrix Workspace session (close Workspace window without logging out first) 2. Reopen Citrix Workspace and reconnect to the same desktop 3. Verify work is preserved (previously opened documents are still open) ##### Session timeout 1. Leave the workspace session idle for the configured timeout period 2. Verify session disconnects automatically 3. Reconnect and verify session state ##### Multiple sessions (if allowed) 1. Launch second desktop while the first is running 2. Switch between desktops 3. Verify both remain responsive ##### Logging out 1. Log out from the desktop 2. Verify session ends cleanly 3. Desktop returns to “Available” state in Citrix Cloud **Expected result:** Sessions connect/disconnect cleanly, state is preserved, no hung sessions #### Network Resilience Testing in Citrix Workspace ##### Network interruption 1. During an active session, briefly disconnect the client network 2. Reconnect to network after 10-20 seconds 3. Verify session automatically reconnects ##### Bandwidth limitations 1. Simulate low bandwidth (if possible) 2. Verify session adapts (quality is lowered, but still usable) 3. HDX should automatically optimize for available bandwidth **Expected result:** Session survives brief interruptions, and adapts to bandwidth changes #### Multi-User Testing in Citrix Workspace 1. Have multiple users connect simultaneously if testing with pooled (random assignment) desktops 2. Verify each user gets a different VM 3. Confirm there are no conflicts or resource contention 4. Users log out, VMs return to pool 5. Users reconnect, get different (or same) VM based on company policy **Expected result:** Multiple users can connect simultaneously without issues #### Documenting Test Results You may wish to record your test results for future reference or auditing/compliance needs. Things of note to include are: * The date and time a test was performed * Client device type and OS * Network conditions (WiFi, VPN, etc.) * Session launch time and duration * Any issues encountered and their resolution * Screenshots/confirmation of successful connection to a workspace or VM #### VM Lifecycle Validation To properly validate the VM lifecycle works as expected through Ansible automation, you will want to consider testing this in its entirety. The complete VM lifecycle is as follows: `Deploy → Start → Stop → Restart → Backup → Recreate → Delete` These operations form the foundation of desktop pool management with MacStadium VDI. When testing, the following lifecycle phases should be validated: 1. Deploy VM from a golden image: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=lifecycle-test-01" -e "vm_image=registry.example.com/citrix-vda/sonoma-finance:latest" ``` After the VM has been deployed, you will want to confirm the VM has received an IP address from DHCP, it is accessible via SSH, the VDA service has started automatically and has been registered with Citrix Cloud, the desktop appears in Citrix Workspace, and users can successfully launch a session. You may also wish to record the amount of time it takes to complete this workflow from the time launch commands are executed to desktop availability. 2. VM power operations **Start a VM:** ``` ansible-playbook -i inventory vm.yml -e "vm_name=lifecycle-test-abc123" -e "desired_state=running" ``` You will want to confirm that the VM boots successfully, the VDA service restarts automatically, the VDA re-registers with Citrix Cloud, desktop returns to “Available” state, and that users can successfully launch a new session. **Stop a VM:** ``` ansible-playbook -i inventory vm.yml -e "vm_name=lifecycle-test-abc123" -e "desired_state=stopped" ``` You will want to confirm that the VM stops gracefully (clean shutdown), that the VM state changes to “Stopped” in MacStadium VDI, the desktop becomes unavailable in Citrix Workspace, and that no active sessions remain. **Restart a VM (stop then start):** ``` # Stop the VM ansible-playbook -i inventory vm.yml -e "vm_name=lifecycle-test-abc123" -e "desired_state=stopped" # Start the VM ansible-playbook -i inventory vm.yml -e "vm_name=lifecycle-test-abc123" -e "desired_state=running" ``` You will want to confirm that the VM restarts cleanly and without corruption, that boot time is reasonable, all services start correctly, and the desktop is available after restarting. **Recover a VM:** Note: This implementation does not have a dedicated recovery playbook. To recover a VM: 1. Deploy a new VM from a versioned golden image stored in your registry 2. VDA will automatically register with Citrix Cloud using the enrollment token Example: ``` ansible-playbook -i inventory deploy.yml -e "vm_name=recovered-vm-01" -e "vm_image=registry.example.com/backups/sonoma-finance:2025-01-15" ``` You will want to confirm that the VM has been recovered from backup, retains its configuration from the backup point, the VDA re-registers successfully, and the desktop is functional. **Delete a VM:** ``` ansible-playbook -i inventory vm.yml -e "vm_name=lifecycle-test-abc123" -e "desired_state=absent" ``` You will want to confirm the VM has been deleted from MacStadium VDI, the VM has been unregistered from Citrix Cloud, the desktop is removed from Citrix Workspace, resources have been freed on the Orka host. #### Performance and Latency Baselines Establishing performance baselines helps identify potential points of service degradation, and helps validate that your MacStadium VDI environment meets user expectations. Having a baseline established also provides a reference point for troubleshooting, provides capacity planning data for scaling considerations, provides user experience metrics to measure service quality, and allows for regressions to be detected when adverse changes may occur. Some metrics to consider measuring are: 1. VM deployment time * How long does it take from playbook execution to the time a VDA is registered? * To establish a baseline, record the average, minimum, and maximum time across 10+ deployments and set an acceptable target (for example, \<5 minutes for cached images). 2. Session launch time * How long does it take after clicking a desktop in Citrix Workspace to having a usable desktop? * To establish a baseline, test from multiple client locations such as office, remote, or mobile. An example target: \<15 seconds for Rendezvous, \<10 seconds for a direct connection. 3. HDX session quality 1. Record the average framerate during normal desktop use 2. If there is input lag from keyboard/mouse to on-screen updates, how long does it take to resolve? Does the behavior persist upon restart? 3. How long does it take to launch an application within a desktop session? 4. Is video playback quality acceptable? 4. Network latency 1. What is the round-trip time from client to VM? 1. You can measure this using `ping` or HDX diagnostics 2. Test network latency under various conditions and configurations 5. Resource utilization 1. What is the host CPU usage when VMs are running? 2. What is the average memory consumption per VM? 3. What disk I/O patterns are observed? 4. What is the average network bandwidth per session? #### Android Virtual Device Validation If your deployment includes Android Virtual Devices, validate the AVD setup before production use. ##### AVD creation and status 1. Create an AVD for a running VM: ```bash theme={null} ansible-playbook -i inventory deploy_avd.yml -e "vm_name=citrix-test-01" ``` 2. Confirm the AVD appears in the list with a running status: ```bash theme={null} ansible-playbook -i inventory list_avds.yml -e "vm_name=citrix-test-01" ``` **Expected result:** AVD listed with status `running`, host, and ADB relay port visible. ##### ADB connectivity from the VM 1. Inside the Citrix desktop session on `citrix-test-01`, open Terminal. 2. List connected Android devices: ```bash theme={null} adb devices ``` **Expected result:** The host-side emulator appears as a connected device (for example, `emulator-5554 device`). 3. Confirm ADB shell access: ```bash theme={null} adb shell getprop ro.build.version.release ``` **Expected result:** Android version string returned without error. ##### ADB relay port reachability 1. From within the VM, verify the relay port is reachable. The default relay port is shown in the `list_avds.yml` output. ```bash theme={null} nc -zv localhost ``` **Expected result:** Connection succeeds (`Connection to localhost port [tcp/*] succeeded`). ##### AVD lifecycle 1. Stop the AVD and confirm it is no longer listed as running: ```bash theme={null} ansible-playbook -i inventory avd.yml -e "vm_name=citrix-test-01" -e "desired_state=stopped" ansible-playbook -i inventory list_avds.yml -e "vm_name=citrix-test-01" ``` 2. Restart the AVD and re-verify ADB connectivity from the VM: ```bash theme={null} ansible-playbook -i inventory avd.yml -e "vm_name=citrix-test-01" -e "desired_state=running" ``` **Expected result:** AVD restarts cleanly, ADB reconnects automatically, relay port is reachable again. # Architecture Source: https://docs.macstadium.com/remote-desktop-vdi/overview/architecture MacStadium VDI architecture explained: the four system layers, user session flow, control plane responsibilities, and the three deployment models. MacStadium VDI is built on four logical layers: a VDI broker/gateway, a control plane, Apple silicon hosts, and macOS virtual machines. This page describes what each layer does and how they connect. MacStadium VDI architecture overview showing the IT Admin, control plane, Mac hosts, and VDI delivery components ## System components **VDI broker/gateway** The broker is the entry point for end users. It authenticates against your identity provider, enforces SSO, MFA, and conditional access policies, and assigns each user to an available macOS VM. MacStadium VDI works with any VDI platform that supports macOS, including [Citrix DaaS](https://docs.citrix.com/en-us/citrix-daas) and HP Anyware. The broker is always customer-managed or provided as a cloud service by your VDI vendor. MacStadium does not operate it. **Control plane** The control plane is the orchestration layer that manages VM lifecycle, image distribution, and host capacity. It runs on the [Orka Engine](https://www.macstadium.com/orka) and exposes two interfaces: the management UI for day-to-day operations and the Ansible CLI for automation and advanced workflows. In an MSDC-Hosted (MacStadium Data Centers) deployment, MacStadium operates the control plane on your behalf. In Self-Hosted deployments, you run it yourself. **Apple silicon hosts** The hosts are the physical Mac hardware (Mac mini or Mac Studio) running the Orka Engine hypervisor. Each host can run up to two macOS VMs, a limit set by Apple's software license agreement. Adding hosts is how you scale user capacity. **macOS VMs** Each VM is an isolated macOS desktop assigned to a single user session. It runs your golden image, which includes the VDI agent, user-facing applications, MDM enrollment scripts, and any system configuration your organization requires. ## Session connection Connecting a user to their desktop is a two-phase process. In the first phase, the VDI agent installed inside each VM registers itself with the Delivery Controller, the brokering component of your VDI platform. When a user authenticates, the Delivery Controller selects an available VM and notifies the user's client of the assignment. In the second phase, session data (screen, keyboard, mouse, audio) flows directly between the agent on the VM and the user's client. The Delivery Controller is not in the data path. This direct connection is what the remoting protocol carries, so broker availability doesn't affect session performance once a session is established. ## Control plane The control plane handles VM deployment and deletion, golden image distribution to hosts, and host capacity management. IT admins interact with it through two interfaces: * **Management UI:** a web-based interface for triggering operations without writing commands. This is the primary interface for day-to-day work. * **Ansible CLI:** the playbook-based interface for automation, bulk operations, and CI/CD integration. Both interfaces call the same underlying Ansible playbooks. For a full breakdown of how images move from a base image through customization to deployment, see the Image Lifecycle page (coming in a later section). For a step-by-step view of how a VM is provisioned from the moment you request it to the moment it's registered with your session broker, see the VM Provisioning page (coming in the Operations section). ## Identity MacStadium VDI integrates with your existing identity provider (Active Directory, Microsoft Entra ID, or Okta) at the broker layer. Your VDI broker handles authentication, SSO, MFA, and conditional access. User group membership in your directory controls which desktops each user can access. No MacStadium-specific identity configuration is required. ## Networking MacStadium VDI uses bridged networking to give each macOS VM a direct IP address on the host's network. This is required for VDI workloads: the VDA inside each VM must be reachable by your delivery controller for registration, and end-user remoting protocol sessions connect directly to the VM's IP. Without bridged networking, you'd need port forwarding for every VM, which doesn't scale. Bridged networking is configured per deployment using the `network_interface` variable in your Ansible inventory. Set it to the physical interface on each Mac host, typically `en0` for Ethernet. VMs deployed with this setting receive an IP address from your DHCP server or management VLAN, just like any other device on that network. Bridged networking requires Orka Engine 3.5.0 or later and is supported for MSDC-Hosted and Self-Hosted (On-Prem) deployments. For Self-Hosted (AWS), confirm bridged networking support with your MacStadium account representative before relying on it. ## Deployment models MacStadium VDI runs in three deployment configurations. The components and connection flows are the same in all three; what differs is where the hardware lives and who manages the control plane. MacStadium hosts the Apple silicon hardware in a MacStadium data center and operates the control plane on your behalf. You manage the VDI broker, golden images, identity, and shared services such as MDM, monitoring, and DNS. MSDC-Hosted architecture diagram showing end users, VDI broker, identity, and the MacStadium data center with control plane, shared services, and Apple silicon hosts You own and operate the Apple silicon hardware and the control plane in your own data center. MacStadium provides the software and support. You're responsible for all hardware, networking, and shared services. Self-Hosted On-Premises architecture diagram The control plane and hosts run on [EC2 Mac dedicated instances](https://aws.amazon.com/ec2/instance-types/mac/) in your AWS account. The architecture is otherwise identical to on-premises. EC2 Mac hosts have a 24-hour minimum allocation per host. Self-Hosted AWS architecture diagram # VDI on bare metal Mac Source: https://docs.macstadium.com/remote-desktop-vdi/overview/bare-metal-mac-vdi Run VDI software directly on physical Mac hardware co-located in a MacStadium data center, without the MacStadium VDI orchestration layer. Bare Metal Mac is an alternative to MacStadium VDI for organizations that want to run VDI software directly on physical Mac hardware. There are no virtual machines, no Orka Engine, and no MacStadium VDI control plane. You install your VDI agent directly on the macOS host, and each host serves one user. MacStadium co-locates and manages the hardware, provides the network fabric, and handles physical connectivity. You manage everything at the software level. Bare Metal Mac VDI architecture showing end users connecting through a VDI broker to bare metal Mac hosts in a MacStadium data center ## How it works Each Mac host runs macOS directly with your VDI agent installed (such as Citrix VDA for macOS). When a user connects, your VDI broker assigns them to a host and the remoting protocol session runs on bare metal. There is no hypervisor layer between the user and the hardware. Because there are no VMs, there is also no golden image workflow, no Orka Engine, and no management UI or Ansible playbooks. You manage the hosts using your existing tooling: MDM (Jamf, Kandji, or Intune), RMM, and direct SSH access. ## When to choose Bare Metal Mac Bare Metal Mac is a good fit if: * Your workflow depends on full hardware GPU access or other capabilities that macOS VMs don't expose. * You want to run VDI on Mac hardware without adopting the MacStadium VDI orchestration layer. * You already have tooling (MDM, RMM) for managing macOS at scale and don't need VM lifecycle automation. * You're evaluating Mac VDI and want to start with a simpler setup before committing to a full MacStadium VDI deployment. It's less suited to environments that need to scale quickly, provision desktops on demand, or manage large numbers of per-user configurations centrally. For those use cases, [MacStadium VDI](/remote-desktop-vdi/overview/what-is-macstadium-vdi) is a better fit. ## What MacStadium provides | MacStadium manages | You manage | | ------------------------------------- | ------------------------------------------------ | | Mac hardware (Mac mini / Mac Studio) | macOS and software configuration | | Physical co-location and racking | VDI agent installation and updates | | Managed network fabric and firewall | VDI broker | | Static IP assignment and connectivity | MDM and device management | | Hardware replacement and maintenance | Monitoring and logging | | | RMM and remote access tooling | | | Identity and access | | | Network storage (optionally MacStadium-provided) | ## Getting started Contact your MacStadium account team to discuss hardware options, capacity, and co-location requirements for a Bare Metal Mac deployment. There is no self-service onboarding for this option. ## Learn more Mac mini and Mac Studio specs, benchmarks, and hardware options available from MacStadium. How to connect via Screen Sharing, VNC, or SSH when you first receive your hardware. VPN access, site-to-site tunnels, firewall configuration, and IP management for MacStadium infrastructure. How ABM and MDM tools like Jamf, Kandji, and Intune integrate with MacStadium for host-level enrollment. # MacStadium VDI business outcomes and use cases Source: https://docs.macstadium.com/remote-desktop-vdi/overview/business-outcomes-use-cases How MacStadium VDI addresses global distribution, security, and operational challenges, with customer examples and business outcomes. ## Business problems solved ### Global distribution hassles Shipping physical Macs across time zones is slow, inefficient, and sometimes impossible due to customs regulations or remote locations. *"We have contractors in one-off locations and in other countries where we are having trouble and where it doesn't make sense to try and procure equipment or it's difficult to procure equipment."* -- A major payment processing provider *"We have business critical roles that don't come into an office so we drop ship them a machine as quickly as possible. But that can take a couple days, or in our global offices it could take up to a week."* -- A blockchain-based digital payment company **Solution:** MacStadium VDI eliminates physical shipping entirely by provisioning virtual macOS desktops instantly accessible from any device. ### Security risks Physical Mac endpoints are vulnerable to theft, loss, and unauthorized access. Traditional Mobile Device Management (MDM) solutions have limitations: data still resides on the device, policies can be bypassed by savvy users, and protection depends on internet connectivity. Organizations with data sovereignty requirements face additional challenges ensuring that sensitive information remains within specific geographic boundaries. *"We have a need to have a United States based VDI solution for our international contractors who need to be able to access data that can only reside and be accessed within the United States."* - U.S.-based healthcare technology leader **Solution:** With MacStadium VDI, all data resides in MacStadium's SOC 2 and ISO 27001 compliant data centers. No local storage means zero risk from lost or stolen devices, and you control exactly where your intellectual property lives. ### Operational inefficiency Manually provisioning and shipping physical MacBooks creates bottlenecks that delay projects and frustrate teams. Contracted workers cannot begin productive work until they receive hardware, putting timelines at risk. **Solution:** MacStadium VDI reduces end-user onboarding time from weeks to hours with instant provisioning and eliminates the administrative burden of configuring and shipping MacBooks. ## Business outcomes ### Improved operational efficiency, cost, and uptime * **Reduce end-user onboarding time from weeks to hours**: International employees, contractors, and partners can be productive immediately instead of waiting for hardware shipments * **Eliminate administrative burden**: Pre-configured remote access agents (such as Citrix VDA) and hosted Mac hardware are ready for distribution on demand * **Reduce Hardware CapEx**: No need to purchase top-tier MacBooks that risk damage or loss in transit; easily upgrade Mac hardware as your team's needs evolve ### Reduced security risks * **Control where your IP lives**: Source code and assets remain within the data center rather than distributed across individual devices vulnerable to theft or loss * **Meet data sovereignty requirements**: Ensure offshore contractors access data hosted only in approved jurisdictions with full auditability and access control ### Solution at scale * **Enable more offshore development work**: Virtual Mac workstations make it realistic to support large teams of offshore developers who need macOS but are located in regions without easy access to physical Macs * **Easily accommodate onboarding bursts**: Support project-based or seasonal workers as required to meet business goals and deadlines without procurement delays ## Deployment patterns ### Offshore macOS developers Development teams distributed across time zones need reliable, secure access to macOS build environments without the complexity and cost of shipping physical hardware internationally. **Learn more:** [Mac Remote Desktops for a Global Development Team](https://www.macstadium.com/blog/citrix-macstadium-mac-remote-desktops-for-a-global-development-team) ### Shared Mac resource pools Teams that need occasional access to macOS for testing, notarization, or Mac-specific tooling can share a pool of resources rather than procuring dedicated hardware for each user. **Learn more:** [Powerful Mac Resources for a Global Team](https://www.macstadium.com/blog/citrix-macstadium-powerful-mac-resources-for-a-global-team) ### High-performance tasks Media rendering, complex iOS builds, AI/ML workloads, and other compute-intensive tasks benefit from high-performance Apple silicon (M1, M2, M3, M4) with centralized management and instant scalability. **Learn more:** [Investing in High-Performance Apple Hardware](https://www.macstadium.com/blog/citrix-macstadium-investing-in-high-performance-apple-hardware) ### Mobile developers requiring Android testing Mobile developers building cross-platform apps need Android emulator access alongside their macOS desktop. Because Android emulators require bare metal hardware virtualization, they cannot run inside a macOS VM. MacStadium VDI solves this by running the Android emulator natively on the Apple silicon host node (the same physical machine as the macOS VM) and establishing an ADB relay between the host-side emulator and the developer's remote desktop session. The result is a single desktop experience with both macOS and Android accessible without leaving the VDI session. **Learn more:** [Android Virtual Devices](/remote-desktop-vdi/configuration/android-virtual-devices) ## Why choose MacStadium VDI **Genuine Apple Hardware:** MacStadium provides access to authentic Mac mini and Studio hardware in cloud compute environments, with no emulation and no compromises. [View available models](https://www.macstadium.com/bare-metal-mac). **Proven Remote Access Technology:** Works with leading remote access tools including Citrix, with established security posture, SSO/MFA integration, and a familiar administration experience. **Simplified Orchestration:** Ansible-based management eliminates Kubernetes complexity while providing automation and repeatability. **Scalable Architecture:** Start with a pilot deployment of 10-20 seats and scale to hundreds as your needs grow, all managed through the same consistent toolset. **Enterprise Support:** MacStadium coordinates directly with your remote access vendor when needed. For Citrix-based deployments, MacStadium is a certified launch partner for VDA on macOS. # Choose your deployment model Source: https://docs.macstadium.com/remote-desktop-vdi/overview/choose-your-deployment-model Compare MSDC-Hosted, Self-Hosted On-Premises, and Self-Hosted AWS to find the right MacStadium VDI deployment for your organization. MacStadium VDI runs in three deployment configurations. The architecture and capabilities are the same across all three. What differs is where the hardware lives, who manages the control plane, and how much operational responsibility you take on. ## MSDC-Hosted MacStadium hosts the Apple silicon hardware in a MacStadium data center and operates the control plane on your behalf. You manage the VDI broker, golden images, identity, and shared services such as MDM and monitoring. MSDC-Hosted architecture **Best for:** Organizations that want macOS VDI without managing Mac hardware or the orchestration layer. This is the fastest path to production. **You manage:** VDI broker, golden images, identity provider, MDM, monitoring. **MacStadium manages:** Mac hardware, networking, Orka Engine, control plane. *** ## Self-Hosted (On-Premises) You own and operate the Apple silicon hardware and the control plane in your own data center. MacStadium provides the software and support. You're responsible for all hardware, networking, and shared services. Self-Hosted On-Premises architecture **Best for:** Organizations with existing data center infrastructure, strict data residency requirements, or a preference for full operational control. **You manage:** Everything: Mac hardware, networking, control plane, VDI broker, images, identity, MDM, monitoring. **MacStadium manages:** Nothing on-site. MacStadium provides software licensing and support. *** ## Self-Hosted (AWS) The control plane and Mac hosts run on [EC2 Mac dedicated instances](https://aws.amazon.com/ec2/instance-types/mac/) in your AWS account. The architecture is otherwise identical to on-premises. You use AWS-native services for networking, storage, and monitoring where it makes sense. Self-Hosted AWS architecture **Best for:** Organizations already running workloads on AWS that want Mac VDI in the same cloud account. EC2 Mac instances carry a 24-hour minimum allocation per host. **You manage:** AWS account, EC2 Mac instances, VPC and networking, control plane, VDI broker, images, identity, MDM. **MacStadium manages:** Software licensing and support. *** ## Comparison | | MSDC-Hosted | Self-Hosted (On-Prem) | Self-Hosted (AWS) | | ---------------------------- | ------------- | --------------------- | ---------------------- | | **Hardware location** | MacStadium DC | Your data center | AWS (customer account) | | **Hardware management** | MacStadium | You | You (via AWS) | | **Control plane management** | MacStadium | You | You | | **Data residency** | MacStadium DC | Your facility | Your AWS account | | **Fastest to deploy** | Yes | No | No | | **Full operational control** | No | Yes | Yes | | **AWS-native integrations** | No | No | Yes | *** ## Not using MacStadium VDI? If you want VDI on Mac hardware without the MacStadium VDI control plane (no Orka Engine, no VM abstraction), Bare Metal Mac is an alternative. You run your VDI software directly on physical Mac hardware co-located in a MacStadium data center. Run VDI software directly on physical Mac hardware in a MacStadium data center, without the MacStadium VDI orchestration layer. # Prerequisites Source: https://docs.macstadium.com/remote-desktop-vdi/overview/prerequisites Hardware, account, software, and capacity planning requirements to review before deploying MacStadium VDI in self-hosted or MSDC-hosted environments. Confirm everything on this page is in place before you start deploying MacStadium VDI. Items that vary by deployment model are called out in each section. ## Mac hosts Apple's software license agreement limits each host to two concurrent macOS VMs. Plan your host count accordingly: divide your peak concurrent user count by two and round up. ### Hardware specifications MacStadium VDI supports any Apple silicon Mac meeting the following requirements. Intel-based Macs are not supported. | Specification | Minimum | Recommended | | ------------- | ---------------------------- | ---------------------------------------- | | Processor | Apple silicon (any M-series) | M2 Pro, M4 Pro, or higher | | RAM | 8 GB | 32 GB | | Storage | 256 GB | 1 TB+ | | Ethernet | 1 GbE | 10 GbE | | macOS | 13 (Ventura) or later | 14 (Sonoma), 15 (Sequoia), or 26 (Tahoe) | MacStadium provisions and manages the Mac hardware. Contact your MacStadium account team to confirm host availability and reserve capacity before you begin setup. You provide Mac mini or Mac Studio hardware meeting the host specifications listed in this section. Hosts must have SSH access enabled and be reachable from your control plane machine over the network. You provision EC2 Mac dedicated instances in your AWS account. Supported instance types: mac2, mac2-m2, and mac2-m2pro. A 24-hour minimum allocation period applies per host. Hosts must be in a VPC subnet that can reach your control plane. ## Control plane The control plane runs on a dedicated machine separate from your Mac hosts. It hosts Docker (for the management UI) and acts as the Ansible control node. | Requirement | Minimum | | ---------------- | --------------------------- | | Operating system | macOS or Linux | | CPU | 2 vCPUs | | RAM | 4 GB | | Disk | 20 GB | | Network | SSH access to all Mac hosts | ## Software Install the following on the control plane machine before setup: | Software | Purpose | | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | [Docker](https://docs.docker.com/get-docker/) and Docker Compose | Runs the management UI | | [Ansible](https://docs.ansible.com/ansible/latest/installation_guide/) | Runs orchestration playbooks | | [uv](https://docs.astral.sh/uv/) | Python package manager used by the orchestration layer | | Python 3.x | Required by Ansible and the orchestration layer | | `sshpass` | Required for Ansible playbooks that SSH into VMs via the host as a jump proxy | ## Accounts and licenses | Item | Notes | | --------------------------------- | ----------------------------------------------------------------------- | | MacStadium account | Required for all deployments | | Orka Engine license key | Provided by MacStadium at onboarding | | VDI broker subscription | Any platform that supports macOS VDI, such as Citrix DaaS or HP Anyware | | AWS account with EC2 Mac capacity | Self-Hosted (AWS) only | ## VDI broker Before setup, confirm you have: * An active VDI broker subscription and Delivery Controller configured * The VDA installer for macOS (for Citrix DaaS, a `.dmg` file; MacStadium recommends hosting it in S3 with a presigned URL) * An enrollment token for registering VMs with your Delivery Controller ## Identity provider MacStadium VDI uses your VDI broker's identity integration. You need one of the following: * Active Directory (on-premises or Microsoft Entra ID) * Okta * Any SAML 2.0-compatible provider your VDI broker supports No MacStadium-specific identity configuration is required. ## MDM (optional, recommended for production) Supported MDM platforms: Jamf, Kandji, and Intune. MDM is not required to run VMs, but it's the recommended way to manage configuration profiles, compliance reporting, and app deployment in production. If you plan to use MDM, have your MDM server URL and an enrollment invitation ready before you seal your golden image. See [MDM enrollment](/remote-desktop-vdi/configuration/mdm-enrollment) for a full walkthrough. ## Capacity planning Use the following to size your deployment before onboarding. ### Host count Each host runs a maximum of two macOS VMs. Divide your peak concurrent user count by 2 and round up, then add 10 to 15 percent for maintenance windows, rolling updates, and peak headroom. | Concurrent users | Hosts needed | | ---------------- | ------------ | | 10 | 5 | | 25 | 13 | | 50 | 25 | | 100 | 50 | For **dedicated (persistent) desktops**, size for your total user count rather than peak concurrency: each user holds a VM whether they're logged in or not. For **pooled (non-persistent) desktops**, size for peak concurrency, typically 60 to 80 percent of total users. ### VM resource defaults | Resource | Default | | ---------------- | -------------- | | vCPUs per VM | 2 | | RAM per VM | 4,096 MB | | Max VMs per host | 2 (Apple EULA) | ### RAM guidance by workload | Workload type | RAM per VM | Recommended host RAM | | ------------------------------- | ---------- | -------------------- | | Standard office / browser-based | 4 GB | 16 GB | | Developer / Xcode / compilation | 8 GB | 32 GB | | Heavy creative / ML inference | 8 to 16 GB | 64 GB+ (Mac Studio) | Start conservative. MacStadium hosted deployments can add nodes without re-architecting. It's easier to add hosts than to right-size VM RAM after users are in production. # Use cases Source: https://docs.macstadium.com/remote-desktop-vdi/overview/use-cases Common scenarios where MacStadium VDI fits: iOS and macOS development, secure remote access, creative production, and compliance-sensitive environments. MacStadium VDI is built for organizations that need managed macOS desktops at scale. It's the right fit if your work requires macOS specifically, or if you need to keep data in a controlled infrastructure while giving users access from anywhere. ## iOS and macOS development Development teams working on iOS, macOS, or cross-platform Apple apps need Macs. There's no substitute: Xcode, the iOS Simulator, and code-signing workflows only run on macOS on Apple hardware. MacStadium VDI lets you provision macOS desktops for remote or distributed developers without shipping physical Macs or managing hardware per person. Each developer gets a consistent, pre-configured environment with the right toolchain, and you can add capacity in minutes as the team grows. ## Secure remote access Organizations that handle sensitive data often can't let that data touch unmanaged personal devices. MacStadium VDI keeps all work inside a managed macOS environment: files stay on the VM, nothing is stored locally on the user's device, and access is brokered through your existing identity provider. This makes it a practical option for contractors, temporary workers, and employees in regulated roles who need access to internal systems without loosening your security posture. ## Creative and media production Video editing, audio production, and other creative workflows that depend on Final Cut Pro, Logic Pro, or macOS-native tools require genuine Apple silicon performance. MacStadium VDI gives remote editors and producers access to that performance over a remoting protocol, without the logistics of managing physical workstations across locations. Storage and project assets can live on shared network storage in the same data center, keeping transfer overhead low. ## Compliance-sensitive environments Industries subject to SOC 2, HIPAA, or other data handling requirements often need to demonstrate that sensitive work happens in an auditable, controlled infrastructure. MacStadium VDI keeps compute and data in a fixed, known location (either a MacStadium data center or your own infrastructure), rather than distributed across employee laptops. Combined with MDM enrollment and your existing identity and access controls, it provides a consistent surface for compliance reporting. ## When MacStadium VDI may not be the right fit MacStadium VDI is purpose-built for macOS. It's not a general-purpose VDI platform. Consider these factors before committing: * **You need Windows or Linux desktops.** MacStadium VDI only delivers macOS. For mixed-OS desktop environments, you'll need a separate solution for non-Mac users. * **Your team is small and stable.** For a handful of users with predictable needs, individual Macs or Mac minis may be simpler and cheaper than a full VDI deployment. * **Your use case doesn't require macOS.** If your work runs equally well on any OS, a platform with broader hardware support may give you more flexibility. * **You need full-screen GPU acceleration.** macOS VMs on Apple silicon don't support direct GPU passthrough. If your workflow depends on hardware-accelerated graphics (3D rendering, ML training), [VDI on Bare Metal Mac](/remote-desktop-vdi/overview/bare-metal-mac-vdi) is a better fit. # What is MacStadium VDI Source: https://docs.macstadium.com/remote-desktop-vdi/overview/what-is-macstadium-vdi MacStadium VDI delivers cloud-hosted macOS virtual desktops on Apple silicon hardware, accessible from anywhere via your VDI client. MacStadium VDI is a virtual desktop infrastructure solution built on genuine Apple silicon hardware. It lets organizations provision, manage, and deliver macOS virtual desktops to users anywhere, without shipping physical Macs or managing on-site hardware. Each virtual desktop runs as a macOS VM on a bare metal Mac host, orchestrated through Orka Engine and automated via [Ansible](https://docs.ansible.com). Users connect through the VDI client of your choice. MacStadium provides primary support for [Citrix DaaS](https://docs.citrix.com/en-us/citrix-daas), but the architecture works with any compatible VDI tool. ## How it works MacStadium VDI is built on four layers: **Apple silicon hosts** Each macOS VM runs on a physical Mac. Apple's EULA limits each host to two concurrent macOS VMs, so the host count scales directly with your user count. **Orka Engine** Orka Engine is MacStadium's virtualization layer for Mac hardware. It manages VM lifecycle: provisioning, starting, stopping, and deleting macOS VMs on each host. **Ansible-based orchestration** A set of Ansible playbooks handles everything from engine installation to VM deployment to image management. IT admins interact with these playbooks through a web-based management UI, which provides a browser interface for running and monitoring operations without CLI access. **VDI software** A VDI agent (such as [Citrix VDA for macOS](https://docs.citrix.com/en-us/mac-vda)) is installed on each VM and registered with your delivery controller. End users connect through the corresponding client app. MacStadium provides guides and validated configurations for Citrix DaaS; other VDI tools that support macOS can also work with this architecture. MacStadium VDI overview showing end users connecting through a VDI broker to macOS VMs managed by the MacStadium VDI control plane See [Architecture](/remote-desktop-vdi/overview/architecture) for a visual breakdown of how the layers connect across deployment models. ## Key capabilities * **Instant provisioning:** Deploy macOS VMs in minutes from the management UI or CLI * **Centralized management:** Manage VMs, images, and users from a single orchestration layer across all hosts * **Data sovereignty:** All data stays on the host infrastructure; no local storage on end-user devices * **MDM enrollment support:** MacStadium provides enrollment workflows for Jamf, Kandji, and Intune. * **Scalability:** Add hosts to increase capacity without re-architecting your deployment * **Android AVD support:** Run Android Virtual Devices alongside macOS VMs for mobile development workflows ## Deployment models MacStadium VDI supports three deployment models: * **MSDC-Hosted (MacStadium Data Centers):** MacStadium owns and operates the Mac hosts in its data centers. You manage VMs and users; MacStadium manages the hardware. * **Self-Hosted (On-Premises):** You own the Mac hosts and run them in your own facility. MacStadium provides the software and support. * **Self-Hosted (AWS):** You run Mac hosts on AWS EC2 Mac instances. Setup follows the on-premises path with AWS-specific networking considerations. Not sure which model fits your situation? See [Choose Your Deployment Model](/remote-desktop-vdi/overview/choose-your-deployment-model). ## Next steps See how the layers connect and review deployment model diagrams Hardware, licensing, network, and account requirements before you start Compare MSDC-Hosted and Self-Hosted options side by side # Ansible quick reference Source: https://docs.macstadium.com/remote-desktop-vdi/reference/ansible-quick-reference Quick-reference Ansible commands for Orka-based Citrix VDI: connectivity tests, Orka Engine checks, VM lifecycle, VDA management, and image operations. ## Setup Commands ### Test Connectivity ``` ansible hosts -i dev/inventory -m ping ``` ### Check Orka Engine Version ``` ansible hosts -i dev/inventory -m shell -a "orka-engine --version" ``` ### Verify Python Version ``` ansible hosts -i dev/inventory -m shell -a "python3 --version" ``` *** ## One-Liner Examples ### Install/Upgrade Orka Engine ``` ansible-playbook -i dev/inventory install_engine.yml -e "orka_license_key=YOUR_KEY" -e "engine_url=https://download.url/orka-engine" ``` ### Plan Deployment (Dry Run) ``` ansible-playbook -i dev/inventory deploy.yml -e "vm_name=my-vm" --tags plan ``` ### Deploy VM ``` ansible-playbook -i dev/inventory deploy.yml -e "vm_name=my-vm" -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" ``` ### Plan Deletion (Dry Run) ``` ansible-playbook -i dev/inventory delete.yml -e "vm_name=my-vm" --tags plan ``` ### Delete VM ``` ansible-playbook -i dev/inventory delete.yml -e "vm_name=my-vm" ``` ### Stop VM ``` ansible-playbook -i dev/inventory vm.yml -e "vm_name=my-vm" -e "desired_state=stopped" ``` ### Start VM ``` ansible-playbook -i dev/inventory vm.yml -e "vm_name=my-vm" -e "desired_state=running" ``` ### Delete Single VM ``` ansible-playbook -i dev/inventory vm.yml -e "vm_name=my-vm" -e "desired_state=absent" ``` ### List All VMs ``` ansible-playbook -i dev/inventory list.yml ``` ### List VMs by Name ``` ansible-playbook -i dev/inventory list.yml -e "vm_name=my-vm" ``` ### Pull Image to All Hosts ``` ansible-playbook -i dev/inventory pull_image.yml -e "remote_image_name=ghcr.io/macstadium/orka-images/sonoma:latest" ``` ### Create and Push Custom Image ``` ansible-playbook -i dev/inventory create_image.yml -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" -e "remote_image_name=registry.example.com/custom:v1.0" ``` ### Create Image with OS Upgrade ``` ansible-playbook -i dev/inventory create_image.yml -e "vm_image=base:latest" -e "remote_image_name=registry.example.com/custom:v1.0" -e "upgrade_os=true" ``` *** ## Android Virtual Devices ### Install Android SDK on Hosts ``` ansible-playbook -i dev/inventory install_android_sdk.yml ``` To force reinstallation on hosts where the SDK is already present: ``` ansible-playbook -i dev/inventory install_android_sdk.yml -e "install_android_sdk_force=true" ``` ### Install SDK Platforms and System Images ``` ansible-playbook -i dev/inventory sdkmanager_install.yml ``` With a specific platform and image types: ``` ansible-playbook -i dev/inventory sdkmanager_install.yml -e "platform=android-34" -e "image_types=default,google_apis,google_apis_playstore" ``` ### Create an AVD (Plan First) ``` ansible-playbook -i dev/inventory deploy_avd.yml -e "vm_name=my-vm" --tags plan ``` ### Create an AVD ``` ansible-playbook -i dev/inventory deploy_avd.yml -e "vm_name=my-vm" ``` With custom platform, image type, and resources: ``` ansible-playbook -i dev/inventory deploy_avd.yml -e "vm_name=my-vm" -e "platform=android-34" -e "image_type=google_apis" -e "cpu=4" -e "memory=2048" ``` ### Manage AVD State ``` # Start AVD ansible-playbook -i dev/inventory avd.yml -e "vm_name=my-vm" -e "desired_state=running" # Stop AVD ansible-playbook -i dev/inventory avd.yml -e "vm_name=my-vm" -e "desired_state=stopped" # Delete AVD (specify index if multiple exist) ansible-playbook -i dev/inventory avd.yml -e "vm_name=my-vm" -e "desired_state=absent" -e "avd_index=0" ``` ### List AVDs ``` # All AVDs across all hosts ansible-playbook -i dev/inventory list_avds.yml # Filter by VM ansible-playbook -i dev/inventory list_avds.yml -e "vm_name=my-vm" ``` ### Delete AVD by Index ``` ansible-playbook -i dev/inventory delete_avd.yml -e "vm_name=my-vm" -e "avd_index=0" ``` ### Uninstall SDK Platform ``` ansible-playbook -i dev/inventory sdkmanager_uninstall.yml # Target a specific platform ansible-playbook -i dev/inventory sdkmanager_uninstall.yml -e "platform=android-34" ``` *** ## Common Variable Combinations ### Deploy with Custom CPU and Memory ``` ansible-playbook -i inventory deploy.yml -e "vm_name=dev-desktop" -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" -e "cpu=4" -e "memory=8192" ``` ### Deploy with Network Interface ``` ansible-playbook -i inventory deploy.yml -e "vm_name=prod-desktop" -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" -e "network_interface=en0" ``` ### Deploy to Specific Host ``` ansible-playbook -i inventory deploy.yml -e "vm_name=build-01" -e "vm_image=ghcr.io/macstadium/orka-images/sonoma:latest" --limit mac-node-1 ``` ### Image Creation with Auth ``` ansible-playbook -i inventory create_image.yml -e "vm_image=base:latest" -e "remote_image_name=registry.company.com/app:v2.0" -e "registry_username=deploy" -e "registry_password=secret" -e "insecure_push=false" ``` ### Insecure Registry ``` ansible-playbook -i inventory pull_image.yml -e "remote_image_name=insecure-registry:5000/image:latest" -e "insecure_pull=true" ``` *** ## Image Naming Patterns ### MacStadium Public Images * **Tahoe**: `ghcr.io/macstadium/orka-images/tahoe:latest` * **Sequoia**: `ghcr.io/macstadium/orka-images/sequoia:latest` * **Sonoma**: `ghcr.io/macstadium/orka-images/sonoma:latest` ### Private Registry Format * **Full path**: `registry.example.com/organization/repository:tag` * **With port**: `registry.example.com:5000/orka/image:v1.0` ### VM Naming Convention VMs are identified individually by name. Use clear, descriptive names: * `dev-desktop-01`, `dev-desktop-02` * `prod-build-runner`, `prod-build-runner-2` * `ci-macOS-sonoma` AVDs are named automatically based on the VM: `{vm_name}-avd-0`, `{vm_name}-avd-1`, etc. *** ## Ansible Shortcuts ### Run on Single Host ``` ansible-playbook -i dev/inventory --limit mac-node-1 ``` ### Dry Run (Check Mode) ``` ansible-playbook -i dev/inventory --check ``` ### Verbose Output ``` # Verbose output ansible-playbook -i dev/inventory -v # More verbose output ansible-playbook -i dev/inventory -vv # Debug level output ansible-playbook -i dev/inventory -vvv ``` ### Run Specific Tags ``` # Run only tasks tagged with 'configure' ansible-playbook -i dev/inventory create_image.yml --tags configure # Run only tasks tagged with 'push' ansible-playbook -i dev/inventory create_image.yml --tags push ``` ### Skip Tags ``` ansible-playbook -i dev/inventory create_image.yml --skip-tags delete ``` ### Step Through Tasks ``` ansible-playbook -i dev/inventory --step ``` *** ## Best Practices Checklist ### Planning and Safety * Always use `--tags plan` before production deployments * Test playbooks on single host first with `--limit` * Review deployment plan output before executing * Verify capacity before large deployments ### Naming and Organization * Use clear, descriptive VM names (for example, `prod-desktop-01`, `build-runner-sonoma`) * Version your images with tags (`:v1.0`, `:v2.0`, not `:latest` in prod) * Document VM purposes in inventory comments ### Capacity Management * Set appropriate `max_vms_per_host` limits * Monitor disk space on hosts regularly * Keep Orka Engine updated across all hosts * Track VM distribution across hosts ### Image Management * Place custom configuration scripts in `/scripts` directory * Test image builds in dev before production * Keep base images cached on all hosts * Implement regular image rebuild schedule ### Security and Operations * Store credentials securely (Ansible Vault) * Maintain inventory file accuracy * Use SSH keys (not passwords) for host access * Rotate credentials regularly * Review deployment logs for errors ### State and Tracking * Let Ansible manage VMs (use playbooks, not manual creation) * Use `list.yml` to verify state before changes * Keep group vars consistent across environments *** ## Support Resources * **Documentation**: [MacStadium](https://docs.macstadium.com) * **Support Portal**: [support@macstadium.com](mailto:support@macstadium.com) * **CLI Reference**: `orka-engine --help` * **VM Commands**: `orka-engine vm --help` * **Image Commands**: `orka-engine image --help` * **Project README**: Check your repository's README.md for architecture details # MacStadium VDI known issues and limitations Source: https://docs.macstadium.com/remote-desktop-vdi/reference/known-issues Current known issues and platform limitations for MacStadium VDI, including macOS version constraints, VM capacity limits, and enrollment restrictions. This page lists known issues and platform limitations that affect MacStadium VDI deployments. Issues are documented as confirmed and will be updated when resolved or when a workaround becomes available. ## HP Anyware agent 26.01.0: first connection after reboot always fails **Status:** Fixed in 26.01.1 **Affects:** Hosts running HP Anyware Graphics Agent version 26.01.0 ### Summary Version 26.01.0 contains a bug where the first PCoIP connection attempt after any host reboot fails with a 6405 error. Retrying the connection immediately succeeds. The session itself is unaffected once connected. ### Resolution Upgrade to HP Anyware agent 26.01.1 or later. The current recommended release is 26.05.1. Download from [HP Anyware](https://anyware.hp.com/). If an upgrade is not yet possible, inform users that a single retry after a reboot will succeed. *** ## macOS Tahoe guest: video and media playback fails **Status:** Open (no fix available as of macOS 26.5.1) **Affects:** All macOS Tahoe (26.x) guest VMs, regardless of VDI remoting protocol (Citrix HDX, HP Anyware, or direct VNC) ### Summary Video and media content does not render inside macOS Tahoe guest VMs. This includes web-based video, streaming apps, QuickTime Player, and any application that uses platform media frameworks. The desktop shell and static UI render correctly, but video frames are never displayed. ### Root cause This is a confirmed bug in Apple's Virtualization.framework compositor in macOS Tahoe. Inside a Tahoe guest VM, application windows are registered with the window server but are never assigned a pixel backing store. The `kCGWindowMemoryUsage` value for affected windows is approximately 2368 bytes, which is significantly less than the 1.2 MB expected for a window with an active framebuffer. Window sharing state (`kCGWindowSharingState`) is 0, which means the window server reports no capturable content. The result is that VNC-based screen capture (the mechanism underlying all remote desktop protocols) only sees the desktop shell. Video content layers are composited at the driver level but never reach the framebuffer that the screen capture API reads from. This issue is not specific to any VDI remoting protocol, Citrix VDA version, or MacStadium configuration. It is a guest OS behavior that affects all screen-capture-based remote access on Tahoe VMs. ### Workaround Use macOS Sequoia (15.x) guest VMs. Video and media playback is confirmed working on Sequoia guests running on Apple silicon hosts. Do not qualify macOS Tahoe for production VDI deployments that require video playback, media applications, or any workloads that use macOS platform media frameworks. These workloads are not supported on Tahoe guests until Apple resolves the Virtualization.framework compositor bug. *** ## Maximum of 2 macOS VMs per Apple silicon host **Status:** Permanent (Apple software license restriction) **Affects:** All MacStadium VDI deployments using macOS virtual desktops ### Summary Apple's macOS software license limits each Apple silicon host to a maximum of 2 concurrently running macOS VMs. This is a hard constraint enforced at the platform level and applies regardless of the host's hardware specifications, RAM, or CPU capacity. This limit governs how many virtual desktops a single host node can deliver. Capacity planning for MacStadium VDI must account for this constraint. See [Prerequisites](/remote-desktop-vdi/overview/prerequisites) for capacity planning guidance and the hardware requirements that follow from this limit. *** ## VMs cannot be enrolled via Apple Business Manager **Status:** Permanent (Apple platform restriction) **Affects:** Organizations using Apple Business Manager (ABM) for device management ### Summary Orka-provisioned macOS VMs cannot be enrolled in ABM. ABM device enrollment relies on Apple's Automated Device Enrollment (ADE) program, which is tied to hardware serial numbers assigned at manufacturing. VMs do not receive ABM-eligible serial numbers and therefore cannot be enrolled through ADE. Only physical Mac host machines can be enrolled in ABM. MDM profiles can still be deployed to VMs through supported MDM providers using golden image-based enrollment. See [Apple Business Manager and MDM with MacStadium](/remote-desktop-vdi/configuration/apple-business-manager-and-mobile-device-management-with-macstadium) for supported MDM enrollment workflows for VMs. *** ## Nested virtualization is not supported **Status:** Permanent (Apple platform restriction) **Affects:** Workloads that require running virtual machines inside macOS VMs ### Summary Running virtual machines inside MacStadium VDI macOS guests is not supported. Apple's Virtualization.framework does not expose the hardware virtualization extensions (VT-x/AMD-V equivalents) to guest VMs, which means hypervisors cannot run inside a guest. Workloads that require nested virtualization, such as Android emulators run inside VMs, are not compatible with macOS VM guests. Android Virtual Devices (AVDs) must run directly on a bare metal Apple silicon host node. See [Android Virtual Devices](/remote-desktop-vdi/configuration/android-virtual-devices) for information on running Android emulators alongside VDI on bare metal host nodes. # Networking requirements Source: https://docs.macstadium.com/remote-desktop-vdi/reference/networking-requirements Port and firewall requirements, network topology, DNS, and VPN/connectivity requirements for MacStadium VDI, covering all three deployment models. This page reflects current knowledge of MacStadium VDI networking requirements. It is pending engineering review for completeness and accuracy. If you encounter requirements not listed here, contact [support@macstadium.com](mailto:support@macstadium.com). This page covers the network requirements for a MacStadium VDI deployment. Requirements differ by deployment model where noted. *** ## Port and firewall requirements ### Citrix VDA and HDX traffic These rules apply to all deployment models. | Traffic | Source | Destination | Protocol / Port | Purpose | | --------------------- | ------------------ | ------------------------------ | --------------- | ---------------------------------------- | | HDX sessions | End-user clients | macOS VMs | TCP/UDP 1494 | ICA/HDX protocol | | HDX sessions (CGP) | End-user clients | macOS VMs | TCP/UDP 2598 | Session Reliability | | VDA → Citrix Cloud | macOS VMs | `[customer_ID].xendesktop.net` | TCP 443 | VDA registration and brokering | | VDA → Gateway Service | macOS VMs | `*.*.nssvc.net` | TCP/UDP 443 | Rendezvous protocol (HDX direct routing) | | VDA → Workspace API | macOS VMs | `*.citrixworkspacesapi.net` | TCP 443 | Gateway connectivity checks | | Cloud Connector | Cloud Connector VM | Citrix Cloud | TCP 443 | Connector heartbeat and communication | If you're using Citrix Rendezvous protocol (recommended for MSDC-Hosted), ensure outbound TCP/UDP 443 from VMs to `*.*.nssvc.net` is permitted. Rendezvous routes HDX traffic directly to the Gateway Service without proxying through the Cloud Connector, improving performance. ### Orka Engine and management plane | Traffic | Source | Destination | Protocol / Port | Purpose | | ---------------------- | ------------------ | ------------------ | --------------- | ------------------------------------ | | Ansible → Orka hosts | Ansible controller | Mac hosts | TCP 22 | SSH (playbook execution) | | Orka API | Ansible controller | Mac hosts | TCP 80, 443 | Orka Engine API | | VM → Host (jump proxy) | Ansible controller | Mac hosts → VMs | TCP 22 | VM management via host as jump proxy | | Management UI | Admin browser | Ansible controller | TCP 3000 | Web access to the management UI | ### MDM traffic | Traffic | Source | Destination | Protocol / Port | Purpose | | ------------------- | --------------- | ---------------------------------------------- | --------------- | ------------------------------- | | Jamf Pro enrollment | macOS VMs | Jamf Pro server | TCP 443 | MDM enrollment and management | | Kandji enrollment | macOS VMs | Kandji cloud | TCP 443 | MDM enrollment and management | | Apple ADE (hosts) | Mac hosts | `gdmf.apple.com`, `deviceenrollment.apple.com` | TCP 443 | Automated Device Enrollment | | APNs | Mac hosts / VMs | `*.push.apple.com` | TCP 443, 5223 | Apple Push Notification service | ### OCI registry | Traffic | Source | Destination | Protocol / Port | Purpose | | ---------- | --------- | --------------------------------- | --------------- | ------------------------------ | | Image pull | Mac hosts | OCI registry (GHCR, Harbor, etc.) | TCP 443 | Pulling base and golden images | | Image push | Mac hosts | OCI registry | TCP 443 | Pushing custom golden images | *** ## Network topology by deployment model MacStadium manages the Mac hardware and data center network. Your responsibilities: * Connect to your MacStadium environment via VPN (credentials and configuration provided by MacStadium) * Your Ansible controller can be located anywhere with VPN access (on your corporate network, a cloud VM, or a MacStadium-hosted VM) * MacStadium assigns static IPs to your Mac hosts; you don't configure host networking directly * VMs use bridged networking by default, receiving IPs from your DHCP-enabled management VLAN **VPN requirement:** Active VPN connection between your Ansible controller and the MacStadium network is required for all management operations. See [VPN Connection](/orka/networking-with-orka-at-macstadium/vpn-connection) for setup instructions. **Citrix traffic:** VMs connect outbound to Citrix Cloud over the internet. Ensure the MacStadium firewall permits outbound TCP 443 from your VM subnet to Citrix Cloud endpoints in the Port and firewall requirements section. You manage all hardware and network infrastructure. * Assign static IPs to Mac hosts before installing Orka Engine (manual configuration or DHCP reservation) * Place Mac hosts on a management VLAN with connectivity to your Ansible controller * VMs use bridged networking: they receive IPs from your network's DHCP server and appear as native devices on your LAN * Your corporate firewall must permit outbound traffic from VMs to Citrix Cloud and inbound HDX traffic from end users **Recommended VLAN segmentation:** | VLAN | Hosts | Purpose | | ---------- | ------------------------------------- | ------------------------- | | Management | Ansible controller, Orka hosts | Admin access only | | VM | macOS VMs | VDA traffic, HDX sessions | | User | End-user devices (if on same network) | HDX client traffic | On-premises steps apply. AWS-specific considerations: * Mac hosts on AWS use [EC2 Mac instances](https://aws.amazon.com/ec2/instance-types/mac/) in a Dedicated Host configuration * Place Mac hosts in a VPC subnet with access to your Ansible controller * Security groups must permit the same traffic as on-premises firewall rules * For connectivity between AWS and on-premises or MacStadium: use Direct Connect or a site-to-site VPN tunnel. See [AWS networking with Orka](/orka/networking-with-orka-at-macstadium/aws-orka-connections) for VPN tunnel setup * VMs on AWS bridged networking receive IPs from your VPC subnet DHCP **Security group requirements for Mac hosts:** | Rule | Direction | Port | Source / Destination | | -------------------------------- | --------- | ------------------ | --------------------------------- | | SSH from Ansible controller | Inbound | TCP 22 | Ansible controller IP/SG | | Orka API from Ansible controller | Inbound | TCP 80, 443 | Ansible controller IP/SG | | HDX to VMs | Inbound | TCP/UDP 1494, 2598 | End-user IPs or 0.0.0.0/0 | | Citrix Cloud outbound | Outbound | TCP 443 | `*.xendesktop.net`, `*.nssvc.net` | | Image registry outbound | Outbound | TCP 443 | Registry endpoint | *** ## DNS requirements All deployment models require DNS resolution for Citrix Cloud endpoints from your VM subnet: * `[customer_ID].xendesktop.net` * `*.nssvc.net` * `*.citrixworkspacesapi.net` * `gdmf.apple.com` (for macOS software updates) Configure DNS servers in your golden image or via DHCP. If VMs can't resolve these hostnames, VDA registration will fail. For Self-Hosted deployments, ensure your internal DNS doesn't block or intercept resolution of `*.xendesktop.net` and `*.nssvc.net`. *** ## Proxy considerations If your network requires a proxy for outbound internet access: * Configure HTTP/HTTPS proxy settings in your golden image before deploying VMs * Set `HTTP_PROXY` and `HTTPS_PROXY` environment variables at the system level * Ensure the proxy does not perform TLS inspection on Citrix Cloud traffic. Citrix VDA uses certificate pinning and TLS inspection will break VDA registration * Whitelist Citrix Cloud endpoints at the proxy level if deep inspection is required *** ## VPN and direct connect requirements (Self-Hosted) For Self-Hosted deployments where your Ansible controller is on a different network than your Mac hosts, a site-to-site VPN or Direct Connect is required. * **AWS VPN tunnel:** See [AWS VPN setup](/orka/networking-with-orka-at-macstadium/1-aws-side-of-the-vpn-tunnel) * **On-premises VPN:** Configure using your existing VPN infrastructure; ensure TCP 22 and TCP 443 are permitted between the Ansible controller and all Mac hosts For end users connecting to their VDI desktops remotely, a Citrix Gateway or equivalent is required for external access. Citrix Rendezvous protocol (outbound TCP/UDP 443 from VMs to `*.nssvc.net`) enables direct HDX routing without on-premises Gateway hardware. # Shared responsibility guide Source: https://docs.macstadium.com/remote-desktop-vdi/reference/shared-user-responsibility-guide-for-macstadium-customers Shared responsibility model for MacStadium VDI: what MacStadium, the customer, and any Citrix Service Provider own across the three deployment models. MacStadium VDI is a shared responsibility model. MacStadium manages the infrastructure layer; you manage the orchestration, user access, and application layer. Where you've engaged a [Citrix Service Provider (CSP)](https://www.citrix.com/partner-programs/), some customer responsibilities may transfer to that partner. This guide defines responsibilities across all three deployment models: * **MSDC-Hosted:** MacStadium manages the Mac hardware and data center infrastructure. * **Self-Hosted (On-Prem):** You manage your own hardware, on your premises. * **Self-Hosted (AWS):** You manage Mac hardware on AWS (via EC2 Mac instances or a colocation partner). *** ## Responsibility matrix | Symbol | Meaning | | ------------ | -------------------------------------------------- | | **MS** | MacStadium | | **Customer** | You (or your Citrix Service Provider, where noted) | | **Shared** | Both parties have responsibilities in this area | | Area | MSDC-Hosted | Self-Hosted (On-Prem) | Self-Hosted (AWS) | | ---------------------------------------------------------- | ------------ | --------------------- | ------------------ | | Physical hardware provisioning | **MS** | **Customer** | **Customer** | | Data center facilities (power, cooling, physical security) | **MS** | **Customer** | **Customer** / AWS | | macOS installation on hosts | **MS** | **Customer** | **Customer** | | Network infrastructure (switches, uplinks, VLANs) | **MS** | **Customer** | **Customer** / AWS | | VPN connectivity to infrastructure | **Shared** | **Customer** | **Customer** | | Static IP assignment and DHCP | **MS** | **Customer** | **Customer** | | Orka Engine installation and licensing | **Shared** | **Customer** | **Customer** | | Orka Engine upgrades | **Shared** | **Customer** | **Customer** | | Ansible controller setup and maintenance | **Customer** | **Customer** | **Customer** | | Orchestration playbook configuration | **Customer** | **Customer** | **Customer** | | Management UI setup | **Customer** | **Customer** | **Customer** | | Golden image creation and maintenance | **Customer** | **Customer** | **Customer** | | VM deployment and lifecycle | **Customer** | **Customer** | **Customer** | | Citrix VDA installation and registration | **Customer** | **Customer** | **Customer** | | Citrix Cloud account and licensing | **Customer** | **Customer** | **Customer** | | Delivery group and policy configuration | **Customer** | **Customer** | **Customer** | | End-user access and entitlements | **Customer** | **Customer** | **Customer** | | MDM enrollment (hosts) | **Shared** | **Customer** | **Customer** | | MDM enrollment (VMs) | **Customer** | **Customer** | **Customer** | | Hardware replacement | **MS** | **Customer** | **Customer** / AWS | | Remote hands (KVM, hard reset, disk reimaging) | **MS** | **Customer** | **Customer** | | Host OS updates (macOS) | **Customer** | **Customer** | **Customer** | | Security patching (VMs and golden images) | **Customer** | **Customer** | **Customer** | | SSH key rotation | **Customer** | **Customer** | **Customer** | | Audit logging and compliance | **Shared** | **Customer** | **Customer** | | Capacity planning | **Shared** | **Customer** | **Customer** | *** ## Detail by area ### Infrastructure **MSDC-Hosted:** MacStadium owns and operates the data center, network, and Mac hardware. Your fleet is provisioned and networked before you receive access. MacStadium handles hardware failures, drive reimaging, and physical support through its Data Center Technician (DCT) team. **Self-Hosted:** You own and operate all hardware and facilities. MacStadium provides software (Orka Engine) and support, but has no visibility into or control over your infrastructure. ### Orka Engine MacStadium provides the Orka Engine license key, installer URL, and version updates. You run the `install_engine.yml` playbook to install and upgrade Orka Engine on your hosts. For MSDC-Hosted deployments, MacStadium can assist with installation if needed. Contact [support@macstadium.com](mailto:support@macstadium.com) for help. ### Orchestration and VM management You are responsible for the orchestration layer across all deployment models. This includes: * The Ansible controller machine * The `orka-engine-orchestration` repository configuration (inventory, group vars, playbooks) * The management UI * All VM deployments, image management, and lifecycle operations ### Citrix integration You are responsible for your Citrix Cloud account, licensing, VDA installation, machine catalog setup, delivery groups, and policies. MacStadium does not have access to your Citrix environment. If you're working with a **Citrix Service Provider (CSP)**, your CSP typically manages the Citrix layer on your behalf, including VDA installation, SSO setup, HDX policy tuning, and session troubleshooting. MacStadium currently partners with [Whitehat Virtual](https://whitehatvirtual.com/) for CSP services. Confirm the scope of your CSP's responsibilities before deployment. MacStadium's support boundary ends at the infrastructure layer regardless of whether you use a CSP. ### MDM enrollment Mac hosts support ADE via [Apple Business Manager (ABM)](https://support.apple.com/guide/apple-business-manager). MacStadium can assist with host enrollment for MSDC-Hosted customers. macOS VMs cannot be registered with ABM directly. MacStadium provides scripts and guidance for automated user-driven MDM enrollment instead. Supported MDM tools include Jamf, Kandji, and Intune. See [Apple Business Manager and MDM with MacStadium](/remote-desktop-vdi/configuration/apple-business-manager-and-mobile-device-management-with-macstadium) for details. ### Security and compliance Both MacStadium and you share responsibility for security: * **MacStadium:** Physical security, data center access controls, network infrastructure security (MSDC-Hosted), hardware-level audit logs. * **You:** SSH key management, VM and image security patching, Citrix policy configuration, application-level access controls, and compliance with your organization's regulatory requirements (GDPR, HIPAA, SOC 2, etc.). For MSDC-Hosted customers, MacStadium can provide data center compliance documentation on request. Contact your account representative. *** ## Support boundaries | Issue | Who to contact | | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | Hardware failure (MSDC-Hosted) | [MacStadium Support](mailto:support@macstadium.com) | | Network connectivity to MSDC infrastructure | [MacStadium Support](mailto:support@macstadium.com) | | Orka Engine errors or crashes | [MacStadium Support](mailto:support@macstadium.com) | | Orchestration playbook issues | [MacStadium Support](mailto:support@macstadium.com) or [GitHub](https://github.com/macstadium/orka-engine-orchestration) | | Citrix VDA registration or session issues | Your Citrix administrator or CSP | | Citrix Cloud account or licensing | [Citrix Support](https://support.citrix.com) | | End-user application issues | Your IT team or CSP | | MDM configuration | Your MDM administrator or CSP | When contacting MacStadium Support, include your account ID, affected host IPs or VM names, a description of the issue, and any relevant log excerpts. # MacStadium VDI troubleshooting quick reference Source: https://docs.macstadium.com/remote-desktop-vdi/reference/troubleshooting-quick-reference Quick-reference for MacStadium VDI issues organized by symptom. Each section lists likely causes, diagnostic commands, and recommended solutions. ## MacStadium VDI Environment ### How to Use This Guide This is a quick reference for troubleshooting common issues. Each section is organized by symptom (what users report or what you observe), followed by its likely causes and diagnostic steps. During an incident: 1. Find the symptom that matches your situation 2. Follow the diagnostic commands in order 3. Apply the recommended solution 4. Document what worked for your post-incident review Tool usage guidelines: * **Primary method:** Always use Ansible playbooks for VM operations (deploy, delete, start, stop, image management) * Advanced diagnostics: You can SSH to hosts and use `orka-engine` CLI commands for lower-level troubleshooting * Examples: `orka-engine vm list`, `orka-engine vm run --image --net-interface en0` * Note: All production operations should go through Ansible playbooks to maintain consistency If your issue isn't listed here, see [Incident Response](/remote-desktop-vdi/operations/incident-response) for escalation procedures. ## VM Provisioning Issues ### Symptom: VM Deployment Fails Completely What you see: `deploy.yml` playbook fails with error messages Quick diagnostic: ```bash theme={null} ansible-playbook -i dev/inventory deploy.yml -e "vm_name=test-01" -e "vm_image=" -vvv ansible-playbook -i dev/inventory pull_image.yml -e "remote_image_name=" -v ansible hosts -i dev/inventory -m shell -a "df -h /var/orka" ansible hosts -i dev/inventory -m shell -a "orka-engine --version" ``` Likely causes and solutions: | **Cause** | **How to Verify** | **Solution** | | ------------------------------ | --------------------------------------------------------- | -------------------------------------------------- | | Image doesn’t exist | Pulling image fails with error 404/not found | Check image name/tag; verify in container registry | | Registry authentication failed | Image pull fails with authentication error | Verify `registry_username` and `registry_password` | | Host out of disk space | `df` shows >90% of available space is used on `/var/orka` | Clean up old images; add storage | | Host out of CPU/memory | Error mentions resource limits | Reduce VMs per host or add hosts | | Image incompatible with host | Error mentions architecture mismatch | Use ARM images for Apple silicon hosts | | Network timeout pulling image | Pull times out | Check network connectivity to registry | | Orka Engine is unresponsive | Commands hang or timeout | Restart Orka Engine; contact MacStadium | Most common fix: Image name/tag typo or a registry authentication failure. ### Symptom: VMs Deploy But Won't Start What you see: Deployment succeeds but VMs show "Stopped" or error status Quick diagnostic: ```bash theme={null} ansible-playbook -i dev/inventory list.yml | grep ansible-playbook -i dev/inventory vm.yml -e "vm_name=" -e "desired_state=running" -v ssh admin@ sudo log show --predicate 'process == "orka-engine"' --last 30m | grep -i error ssh admin@ orka-engine vm list --format json ``` #### Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------- | ------------------------------------- | ----------------------------------------------------------------------- | | Corrupted VM image | Logs show image errors | Re-pull image using `pull_image.yml`; redeploy VM | | Insufficient host resources | Logs show resource allocation failure | Free resources on host; delete unused VMs or deploy to different host | | VM configuration invalid | JSON shows invalid CPU/memory values | Verify all deployment parameters are correct; check image compatibility | | Storage backend issue | Logs show I/O errors | Check host storage health with `df -h`; contact MacStadium | | Boot disk missing | Logs show disk not found | Delete VM and redeploy from scratch using fresh image pull | **Most common fix:** Corrupted image during pull. Re-pull the image to the host and redeploy. ### Symptom: Wrong Number of VMs Deployed **What you see:** Requested 10 VMs but only 7 deployed, or deployment stopped partway through Quick diagnostic: ```bash theme={null} ansible-playbook -i dev/inventory list.yml -e "vm_name=" ansible hosts -i dev/inventory -m shell -a "top -l 1 | head -20" ``` **Likely causes and solutions:** | **Cause** | **How to verify** | **Solution** | | ---------------------------- | --------------------------------- | -------------------------------------------------------------------- | | Hit `max_vms_per_host` limit | VMs distributed but stopped early | Increase limit or add more hosts | | One or more hosts failed | Some hosts show errors | Fix failed hosts; redeploy remaining VMs | | Ran out of IP addresses | Bridged mode: DHCP exhausted | Expand DHCP pool or use different subnet | | Partial playbook failure | Playbook shows some failed tasks | Review errors in verbose output (`-vvv`); fix issues; rerun playbook | **Most common fix:** You may have hit the max\_vms\_per\_host limit. Add more hosts to distribute VM load. ### Symptom: Can't Delete VMs **What you see:** `delete.yml` or `vm.yml` with `desired_state=absent` fails **Quick diagnostic:** ```bash theme={null} ansible-playbook -i dev/inventory vm.yml -e "vm_name=" -e "desired_state=absent" -vvv ansible-playbook -i dev/inventory list.yml | grep ssh admin@ orka-engine vm stop --force ssh admin@ orka-engine vm delete ssh admin@ ps aux | grep ``` **Likely causes and solutions:** | **Cause** | **How to verify** | **Solution** | | ------------------------ | ------------------------------------ | ------------------------------------------------------------------------------ | | VM already deleted | `list.yml` doesn't show VM | Ignore error; VM is already deleted | | VM stuck in a hung state | Force stop succeeds; delete succeeds | SSH to host; use `orka-engine vm stop --force` then delete | | Orka Engine issue | All delete operations failing | SSH to host; check Orka Engine service status; contact MacStadium | | VM disk locked | Logs show disk busy error | Stop all VMs using the disk; retry | | Permission issue | Logs show permission denied | Verify `ansible_user` has sudo access; check `ansible_become=yes` in inventory | **Most common fix:** VM is stuck in a hung state. Force stop and delete the VM via SSH to the host. ### Symptom: VM Deploys But Never Boots or Services Don't Start **What you see:** Ansible playbook completes but VM never becomes usable. VM created but stuck in an unresponsive state. Quick diagnostic: ```bash theme={null} # Check Orka Engine status on all hosts ansible hosts -i dev/inventory -m shell -a "orka-engine --version" # Check available disk space ansible hosts -i dev/inventory -m shell -a "df -h /var/orka" # Review Orka Engine logs ansible hosts -i dev/inventory -m shell -a "sudo tail -100 /var/log/orka-engine.log" # List VMs to confirm state ansible hosts -i dev/inventory -m shell -a "orka-engine vm list" ``` **Likely causes and solutions:** | Cause | How to verify | Solution | | ---------------------------------- | ------------------------------------------------- | ----------------------------------------------- | | Corrupted image | Orka logs show image errors | Re-pull image with `pull_image.yml`; redeploy | | Insufficient disk space | `df` shows >90% usage on `/var/orka` | Delete old images; add storage | | Host resource exhaustion | Orka logs show resource allocation failure | Reduce VM count on host; add hosts | | Apple 2-VM licensing limit reached | `orka-engine vm list` shows 2 VMs already on host | Deploy to a different host using `--limit` | | Network bridge misconfiguration | VM has no IP | Verify `network_interface` variable; check DHCP | **Most common fix:** Apple's EULA limits macOS VMs to 2 per host. Use `list.yml` to check capacity before deploying. ## Citrix VDA Registration Failures ### Symptom: New VMs Won't Register with Citrix What you see: VMs show as "Unregistered" in Citrix Cloud Console → Monitor → Machines Quick diagnostic: ```bash theme={null} ansible-playbook -i dev/inventory list.yml | grep # Connect via VNC to inspect VDA status: # Navigate to: System Preferences → Citrix VDA # Should show: "Registered" with Cloud Connector details # Test network connectivity from the VM (run from VM Terminal): ping curl https://api.cloud.com # Check VDA service logs: # On the VM: Console.app → Search for "Citrix" ``` **Likely causes and solutions:** **Most common fix:** Firewall blocking outbound HTTPS from VMs to Citrix Cloud Connector. Verify ports `443`, `1494`, and `2598` are open. ### Symptom: VMs Were Registered, Now Show as Unregistered **What you see:** VMs that were working now show "Unregistered" status **Quick diagnostic:** 1. Verify the VM is running: `ansible-playbook -i dev/inventory list.yml | grep ` 2. VNC into the VM and check VDA status: `ssh admin@ open vnc://:5900` 3. Navigate to: System Preferences → Citrix VDA. Should show: "Registered" with Cloud Connector details. 4. Test network connectivity from the VM: `ping curl https://api.cloud.com` 5. Check VDA service logs. On the VM: Console.app → Search for "Citrix" **Likely causes and solutions:** | **Cause** | **How to verify** | **Solution** | | ----------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------- | | VDA not installed in image | System Preferences has no Citrix VDA pane | Rebuild golden image with VDA installed | | VDA not configured | VDA pane shows "Not configured" | Configure VDA with Cloud Connector details | | VDA service crashed on VMs | VDA status shows "Stopped" on multiple VMs | Restart affected VMs using `vm.yml` with `desired_state=stopped` then `running` | | Host reboot without VM auto-start | All VMs on one host unregistered simultaneously | Start VMs using Ansible; configure auto-start in Orka if available | | Network can't reach Cloud Connector | Ping/curl fails | Check firewall rules; verify outbound HTTPS | | Wrong Cloud Connector configured | VDA shows wrong Cloud Connector IP | Reconfigure VDA in golden image | | VDA service not running | VDA status shows "Stopped" | Restart VDA service or reboot VM | | Firewall blocking required ports | Ports 443, 1494, 2598 are blocked | Open required ports in firewall | | Citrix licensing issue | VDA shows licensing error | Check Citrix Cloud licenses; contact support | **Most common fix:** Cloud Connector lost network connectivity or service crashed. Restart the Cloud Connector. ### Symptom: VDA Shows "Registration in Progress" Indefinitely What you see: VDA status remains stuck on "Registering..." and never completes Quick diagnostic: 1. Check if Cloud Connector is up by navigating to Citrix Cloud Console → Monitor → Cloud Connectors, and look for: Status "Up" or "Down". 2. Check if multiple VMs are affected: Monitor → Machines → Filter by Delivery Group. Check if all VMs show as unregistered, or just some. 3. Test connectivity from VM to Cloud Connector by running `ssh admin@`, VNC to the VM, then run: `ping ` 4. Check the VDA service on the VM: System Preferences → Citrix VDA. Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------- | | Cloud Connector down | Console shows "Down" status | Restart Cloud Connector VM/service | | DNS resolution failing | `nslookup ` fails from VM | Fix DNS configuration in golden image or via DHCP; use IP address temporarily | | Incorrect broker address | VDA configured with wrong Cloud Connector address | Fix broker address in VDA configuration in golden image; redeploy VMs | | Network path failure | VMs can't ping Cloud Connector | Check network/firewall; contact network team | | VDA service crashed | VDA status shows "Stopped" on VMs | Restart affected VMs | | Citrix Cloud service issue | Cloud Connector up but VMs unregistered | Check Citrix status page: Contact support | | Host reboot without VM auto-start | All VMs on one host unregistered | Start VMs manually; configure auto-start | | Certificate expiration | VDA logs show cert errors | Renew certificates; update VDA configuration | Most common fix: Verify that the VM can resolve the Cloud Connector hostname or configure it with a correct/updated IP address. ### Symptom: VMs Register But Users Can't Connect **What you see:** Citrix Console shows VMs are "Registered" but users get connection errors Quick diagnostic: 1. Verify the user is in the correct Delivery Group by navigating to Citrix Cloud Console → Manage → Delivery Groups → Search for the user 2. Check that the VM is actually in an "Available" state by navigating to Monitor → Machines → and checking the "Status" column. This should show "Available" not "In Use" or "Maintenance". 3. Test the connection yourself with a test account by launching a desktop from Citrix Workspace. 4. Check for Citrix policy issues. Policies → Review policies applied to the impacted Delivery Group. Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ---------------------------- | ---------------------------------------------- | -------------------------------------------- | | User not in Delivery Group | Search shows no assignment | Add user to the appropriate Delivery Group | | VM in maintenance mode | Status shows "Maintenance Mode" | Take the VM out of maintenance mode | | Delivery Group misconfigured | No desktops published | Check Delivery Group configuration | | Session limit reached | Policies show max sessions = 1, already in use | Increase session limit or deploy more VMs | | HDX protocol failure | Users get protocol error | Check HDX policies; test with different user | | VM networking issue | VM registered but can't be reached | Verify VM network connectivity | Most common fix: User was not added to the Delivery Group. Add the user via Citrix Cloud Console. ### Symptom: Session Fails to Launch or Times Out **What you see:** Desktop appears in Citrix Workspace but won't launch. Connection progress bar stalls. "Unable to connect" error. Quick diagnostic: ```bash theme={null} # Verify VM is running ansible-playbook -i dev/inventory list.yml | grep # Test Rendezvous connectivity from the VM ansible mac_vms -i dev/inventory -m shell -a "curl -v https://*.*.nssvc.net 2>&1 | grep Connected" # Test HDX ports are reachable nc -zv 1494 nc -zv 2598 ``` **Likely causes and solutions:** | Cause | How to verify | Solution | | ----------------------------- | --------------------------------- | ------------------------------------------------------- | | VM powered off or crashed | `list.yml` shows stopped state | Start VM with `vm.yml desired_state=running` | | Firewall blocking HDX ports | `nc` test fails | Open TCP/UDP 1494 and 2598 from client to VM | | Rendezvous connection broken | Curl to `*.nssvc.net` fails | Check Gateway Service availability; verify outbound 443 | | VM in maintenance mode | Console shows "Maintenance" | Take VM out of maintenance mode | | Citrix Workspace app outdated | Specific client versions fail | Update Citrix Workspace app; clear app cache | | Network routing issue | Works on one network, not another | Check firewall/proxy; try from different network | **Most common fix:** Firewall blocking HDX ports. Ensure TCP/UDP 1494 and 2598 are open from client to VM. ### Symptom: Clipboard or File Transfer Not Working **What you see:** Can't copy/paste between client and VM. File drag-and-drop fails. Quick diagnostic: 1. Check HDX policies: Citrix Cloud Console → Policies → HDX Settings * "Client clipboard redirection" should be **Allowed** * "Client drive redirection" should be **Allowed** 2. Log out and back in; policies don't always apply to existing sessions. 3. Test with plain text first, then formatted text, then files. **Likely causes and solutions:** | Cause | How to verify | Solution | | ------------------------------------------ | ------------------------------------------- | ------------------------------------------------------------------- | | HDX clipboard policy disabled | Policy shows "Prohibited" | Set clipboard redirection to "Allowed" in the Delivery Group policy | | Security policy restricting file transfers | Drive redirection policy shows "Prohibited" | Update policy for the relevant Delivery Group | | Citrix Workspace app bug | Specific app version affected | Update to latest Citrix Workspace app | | Content exceeds size limit | Large file transfers fail | Increase clipboard/file size limits in HDX policy | **Most common fix:** HDX clipboard or drive redirection policy is set to Prohibited. Update the policy in Citrix Cloud Console → Policies. ## Network and Connectivity Problems ### Symptom: VMs Can't Reach Internet What you see: Users report "No internet connection" / Can't browse web or download updates Quick diagnostic: 1. Test basic connectivity from the VM by VNCing into the VM:\ `ping 8.8.8.8`\ `ping google.com`\ `curl https://google.com` 2. Check the VM network configuration\ `ifconfig route -n get default` 3. Check DNS configuration\ `cat /etc/resolv.conf` 4. Test connecting from the host to rule out any host issues\ `ssh admin@ `\ `ping 8.8.8.8` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------- | ------------------------------------------ | ------------------------------------------------------------------- | | DNS not configured | `resolv.conf` is empty or incorrect | Add DNS servers to golden image or DHCP | | No default gateway | `route -n get default` shows no route | Configure gateway in image or via DHCP | | Proxy required | Network requires proxy for internet access | Configure proxy settings in golden image; set HTTP\_PROXY variables | | DHCP not providing DNS/gateway | Bridged mode: VM has IP but no DNS/gateway | Fix DHCP server configuration to provide DNS and gateway options | | Firewall is blocking VM traffic | Ping fails but host succeeds | Add firewall rule for VM subnet | | NAT not working | Host reaches internet but VM doesn't | Check Orka NAT configuration on host | | Upstream network outage | Host also can't reach internet | Contact network team/ISP | | VM subnet not routed | Traceroute shows no path | Add routing for VM subnet | Most common fix: DNS is not configured in the golden image. Add DNS servers (e.g., 8.8.8.8, 8.8.4.4) to network config in the image template. ### Symptom: VMs Can't Reach Internal Corporate Services What you see: "Can't access file shares" / "Internal apps unreachable" / "Need VPN" Quick diagnostic: 1. Test connecting from the VM to internal services `ping telnet `\ ` ` 2. Check routing: `traceroute ` 3. Test from host (confirm the host has access) `ssh admin@ `\ `ping ` 4. Check if the VM subnet is allowed through company firewalls. Contact your network IT team with the following information: Source: VM or subnet\ Destination: Internal service IP\ Ports needed Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ---------------------------------- | -------------------------------- | ------------------------------------------------- | | Firewall is blocking the VM subnet | Host can reach but VM cannot | Add firewall rule to allow VM subnet | | VMs are on an isolated VLAN | Traceroute shows no route | Move VMs to correct VLAN or add routing | | Missing static route | No path to internal network | Add static route on VMs or router | | Server-side firewall | Server blocks VM IPs | Update server firewall to allow VM subnet | | ACL blocking traffic | Traffic dropped at switch/router | Update ACLs to permit VM traffic | | Split-tunnel VPN required | Services only accessible via VPN | Configure VPN on VMs or route through VPN gateway | Most common fix: Your firewall rules don't include the VM subnet. Work with your network team to add the appropriate `allow` rules. ### Symptom: Bridged Mode VMs Getting Wrong IPs (192.168.64.x) What you see: VMs should get corporate IPs but are getting 192.168.64.x private range instead Important prerequisite: Bridged networking requires a DHCP server on your network that can assign IP addresses to VMs. If you don't have DHCP configured, VMs will fall back to NAT mode with 192.168.64.x addresses. Quick diagnostic: 1. Check cluster configuration on the MacStadium VDI management node: `cat /path/to/cluster.yml | grep vm_network_mode`. This should show: `vm_network_mode: bridge`. 2. Check host interface configuration: `cat /path/to/nodes.yml | grep osx_node_vm_network_interface` or check the `hosts` file: `cat /path/to/hosts | grep osx_node_vm_network_interface` 3. Verify that the interface exists on the host: `ssh admin@ ifconfig | grep ` 4. Check DHCP traffic on the interface: `ssh admin@ sudo tcpdump -i port 67 and port 68` 5. Deploy a test VM and watch for DHCP requests/replies Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------------------ | -------------------------------------- | ----------------------------------------------------- | | `osx_node_vm_network_interface` is not set | Config files missing interface setting | Add to `nodes.yml` or `hosts` file | | Wrong interface name specified | Interface doesn't exist on `ifconfig` | SSH to host; verify the correct interface name | | Deployment missing bridge mode flag | Check deploy command history | Redeploy with `--extra-vars "vm_network_mode=bridge"` | | Configuration not applied to hosts | Config updated but not rerun | Rerun the host configuration Ansible playbook | | DHCP server is unreachable | `tcpdump` shows no DHCP replies | Verify DHCP server; check interface connection | | Some VMs are still using NAT | Mixed NAT and bridge VMs | Delete all VMs; redeploy after config change | Solution steps: 1. Delete all VMs (this is required before switching networking modes) `ansible-playbook -i dev/inventory delete.yml \ `\ `-e "vm_name="`\ *Run this command once for each additional VM, using a unique `vm_name` each time.* 2. Verify configuration files `cat cluster.yml` should have: `vm_network_mode: bridge`\ `cat nodes.yml` should have: `osx_node_vm_network_interface: ` 3. Reapply the host configuration: `ansible-playbook -i dev/inventory configure-hosts.yml` 4. Deploy a test VM: `ansible-playbook -i dev/inventory deploy.yml \ `\ `-e "vm_name=test-01" \ `\ `-e "vm_image="` 5. Verify that the VM received a corporate IP address: `ansible-playbook -i dev/inventory list.yml -e "vm_name=test-01"` Most common fix: `osx_node_vm_network_interface` is not set or was set incorrectly. Verify the interface name, then reapply the configuration. ### Symptom: Intermittent Network Connectivity What you see: Network works sometimes, drops randomly, packet loss Quick diagnostic: 1. Run a continuous ping test from the VM by VNCing into the VM and running: `ping -c 100 8.8.8.8`. Look for the packet loss percentage. 2. Check for interface errors on the host, and look for errors/drops in output: `ssh admin@ `\ `netstat -i` 3. Check host network utilization: `ssh admin@ `\ `nload (or: iftop)` 4. Check if the connectivity issue is specific to one host, or impacts all hosts. Test VMs on different hosts to confirm. Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ----------------------------------- | --------------------------------- | ---------------------------------------- | | Network congestion | `nload` shows saturated bandwidth | QoS configuration; add bandwidth | | Faulty network hardware | Errors show on specific interface | Replace cable/switch; contact MacStadium | | Host overloaded | High CPU/memory on host | Reduce VMs on host or upgrade host | | Spanning tree reconvergence | Brief outages periodically | Tune STP or use rapid STP | | IP address conflicts | Multiple devices with same IP | Check DHCP pool size; fix duplicates | | Wireless interference (if wireless) | Packet loss at specific times | Use wired connection; change channel | Most common fix: Network congestion or host overloaded. Reduce VMs per host or work with network team on quality of service improvements. ## Image Cache and Distribution Issues ### Symptom: Image Pull Extremely Slow What you see: `pull_image.yml` takes 30+ minutes for reasonably sized images Quick diagnostic: 1. Test registry connection and speed: `ssh admin@ `\ `time curl -o /dev/null https:///test-file` 2. Check image size by viewing this in your container registry UI 3. Monitor network utilization during the image pull process `ssh admin@ `\ `nload` 4. Check if the repository is rate limiting. Look for throttling messages in the image pull output to confirm/deny this. `ansible-playbook -i dev/inventory pull_image.yml \ `\ `-e "remote_image_name=" \ `\ `-vvv | grep -i "limit\|throttle"` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------------------------- | ------------------------------------- | ---------------------------------------------------- | | Image is extremely large | Image size >50GB | Optimize image; remove unnecessary files | | Registry is located in a different datacenter | High latency/slow speeds to registry | Deploy registry in the same datacenter or use mirror | | Network congestion | Bandwidth saturated during pull | Schedule pulls during off-hours | | Registry is rate limiting | Pull logs show throttling | Contact registry admin; increase limits | | Slow registry storage | Registry on slow disks | Upgrade registry storage backend | | Shared bandwidth limits | Multiple hosts pulling simultaneously | Stagger pulls across hosts | Most common fix: Registry is located in a geographically distant datacenter. Deploy the registry closer to Orka hosts or use registry replication. ### Symptom: Image Pull Fails with Authentication Error What you see: "unauthorized" / "authentication required" / "403 Forbidden" Quick diagnostic: 1. Test registry authentication manually: `curl -u : https:///v2/_catalog` 2. Verify credentials in the Ansible playbook command, and check that the `registry_username` and `registry_password` are correct 3. Test pull with credentials: `ansible-playbook -i dev/inventory pull_image.yml \ `\ `-e "remote_image_name=" \ `\ `-e "registry_username=" \ `\ `-e "registry_password=" \ `\ `-vvv` 4. If available, check the registry access logs. Look for any authentication failures. Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------ | --------------------------------------------- | -------------------------------------------- | | Wrong credentials | Manual `curl` fails with the same credentials | Verify username/password; reset if needed | | Credentials expired | Were working before, now failing | Update credentials; refresh tokens | | User lacks pull permissions | Auth succeeds but pull denied | Grant pull permissions in registry | | Registry requires token auth | Password auth doesn't work | Use token-based auth; update playbook params | | Network blocking auth endpoint | Can't reach registry auth server | Check firewall rules for auth endpoint | | Insecure registry without flag | TLS/cert verification fails | Add `-e "insecure_pull=true"` if appropriate | Most common fix: Credentials are outdated or incorrect. Verify and update your `registry_username` and `registry_password` values. ### Symptom: Image Pull Succeeds, But Deploy Fails What you see: `pull_image.yml` succeeds but `deploy.yml` can't find image Quick diagnostic: 1. Verify the image was pulled successfully: `ansible-playbook -i dev/inventory list.yml` 2. Try pulling the image again with verbose output: `ansible-playbook -i dev/inventory pull_image.yml \ `\ `-e "remote_image_name=" \ `\ `-vvv` 3. Check the image name and tags match exactly 4. Try pulling the image to a specific host `ansible-playbook -i dev/inventory deploy.yml \ `\ `-e "vm_name=test-01" \ `\ `-e "vm_image=" \ `\ `--limit ` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | -------------------------------- | --------------------------------------------------- | ---------------------------------------------------------------- | | Image name mismatch | Image pulled with a different name/tag | Use exact same image name in `deploy` command | | Image tag omitted or incorrect | Image pulled with `:latest` but deploy uses `:v1.0` | Always specify explicit tags; avoid `:latest` in production | | Image pulled to wrong host | Deploy targeting host without image | Pull image to all hosts using `pull_image.yml` without `--limit` | | Image tag changed | Image exists, but with different tag(s) | Use correct image tag (including `:latest` if needed) | | Deployment targeting wrong image | Deploy command references different image path | Verify `vm_image` parameter matches pulled image exactly | | Image corrupted during pull | Image exists, but is damaged | Delete image; re-pull from container registry | | Case sensitivity issue | Image names differ only in case | Use exact, case-sensitive image name | Most common fix: Image name/tag mismatch between pull and deploy. Ensure an exact match, including image tags. ### Symptom: Can't Push New Image to Registry What you see: `create_image.yml` fails during push phase Quick diagnostic: 1. Run the `create_image.yml` Ansible playbook with verbose output: `ansible-playbook -i dev/inventory create_image.yml \ `\ `-e "vm_image=" \ `\ `-e "remote_image_name=" \ `\ `-e "registry_username=" \ `\ `-e "registry_password=" \ `\ `-vvv` 2. Check registry authentication\ `curl -u : https:///v2/_catalog` 3. Check registry storage space 4. Verify sufficient host disk space: `ansible hosts -i dev/inventory -m shell -a "df -h /var/orka"` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ----------------------------------- | ------------------------------------------- | -------------------------------------------------------------------- | | Registry authentication failed | Curl returns 401 error | Verify push credentials; check permissions | | Registry out of storage | Push fails with storage error | Expand registry storage; clean old images | | Registry quota exceeded | Error mentions quota | Increase quota or clean up images | | Insufficient host disk space | Can't create/prepare image locally for push | Free space on host; delete unused VMs using `delete.yml` or `vm.yml` | | Source VM not stopped | Image creation requires stopped VM | Stop source VM before running `create_image.yml` playbook | | Insecure registry without flag | TLS/cert error | Add `-e "insecure_push=true"` if appropriate | | Network timeout during push | Push times out | Check network; try again during off-hours | | Image name violates registry policy | Push rejected by policy | Follow registry naming conventions | | Insufficient host disk space | Can't create image to push | Free space on host; delete unused VMs using `delete.yml` or `vm.yml` | Most common fix: Registry authentication or insufficient storage space. Verify credentials and check registry capacity. ### Symptom: Inconsistent Images Across Hosts What you see: The same image name on different hosts, but with different behavior/versions Quick diagnostic: 1. List VMs on all hosts to check deployment times `ansible-playbook -i dev/inventory list.yml` 2. Check when VMs were last deployed using `list.yml` to show the VM status 3. Test pulling an image to verify registry performance `ansible-playbook -i dev/inventory pull_image.yml \ `\ `-e "remote_image_name=" \ `\ `--limit ` 4. Check the registry for image versions Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------------- | ------------------------------------------------- | ------------------------------------------- | | Images pulled at different times | Timestamps differ; registry updated between pulls | Re-pull image to all hosts | | Cached old version | Digest doesn't match registry | Force re-pull with `docker pull --no-cache` | | Different image tags used | Tags differ across hosts | Standardize on specific tag (not `:latest`) | | Registry changed without notification | Registry version changed | Coordinate with registry team on updates | | Partial pull failure | Some hosts have corrupted image | Delete and re-pull on affected hosts | #### Solution steps: 1. Pull a fresh image to all hosts\ `ansible-playbook -i dev/inventory pull_image.yml \ `\ `-e "remote_image_name="` 2. Verify all hosts completed pull successfully, check playbook output for any errors 3. Redeploy VMs from the freshly pulled image\ `ansible-playbook -i dev/inventory deploy.yml \ `\ `-e "vm_name=" \ `\ `-e "vm_image="`\ *Run this command once for each VM to deploy.* Most common fix: Images were pulled at different times, with registry updates between. Re-pull images to all hosts for consistency. ## Performance and Latency Problems Symptom: Desktop Feels Sluggish for Users **What you see:** Users report slow response, lag, choppy mouse movement, etc. Quick diagnostic: 1. Check host resource utilization\ `ansible hosts -i dev/inventory -m shell -a "top -l 1 | head -20"` 2. Count VMs per host\ `ansible-playbook -i dev/inventory list.yml | grep | wc -l` 3. Check specific VM resources by VNCing into the VM:\ `open vnc://:5900 `\ Open Activity Monitor → Check CPU, Memory, Disk, Network 4. Test the user's network latency (if remote). Ask the user to ping the VM IP, or use the Citrix HDX Tester tool Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------------ | | Host overloaded | CPU consistently >85% shown in `top` output | Redistribute VMs to other hosts using delete/redeploy; add more hosts | | Too many VMs per host | VM count exceeds 2 per host | Move VMs to other hosts; respect `max_vms_per_host` limits | | VM resource exhaustion | Activity Monitor shows VM maxed CPU/memory | Restart VM using `vm.yml` playbook; consider increasing VM resources in golden image | | Network latency (remote users) | Ping >100ms or visible packet loss | Tune HDX policies for high latency; user needs better network connection | | Disk I/O bottleneck | Activity Monitor shows red disk pressure indicator | Check host storage performance with MacStadium; reduce VM count on host | | Background processes | Spotlight indexing (`mds`) or updates consuming CPU | Wait for processes to complete; configure indexing schedules in golden image | | Insufficient VM CPU/memory | VM configured with too few resources | Create new golden image with more CPU/memory allocation; redeploy VMs | | Host storage saturation | Multiple VMs competing for disk I/O | Move VMs to hosts with faster storage; contact MacStadium about storage upgrades | Most common fix: Host is overloaded. Redistribute VMs across hosts or add capacity. ### Symptom: Poor Video Quality or Choppy Playback What you see: Pixelated screen, blurry text, stuttering video Quick diagnostic: 1. Check the user's network bandwidth 2. Ask the user to run: [Speedtest by Ookla - The Global Broadband Speed Test](https://speedtest.net/) ``` 1. <5 Mbps indicates the user is experiencing low bandwidth issues ``` 3. Check the user’s HDX Visual Quality policy by navigating to: Citrix Cloud Console → Policies. ``` 1. Find the user's policy in → HDX Settings → Visual Quality ``` 4. Test bandwidth/performance with Citrix HDX Monitor (if available), as this shows real-time HDX metrics 5. Check the user’s connection type (Are they connecting remotely/via VPN? On wifi? Wired?) Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------- | | Low bandwidth connection | User speed test shows \<5 Mbps download | Adjust HDX Visual Quality policy to "Low" or "Medium" for user's Delivery Group | | Visual Quality policy too low | Policy shows "Medium" or "Low" setting | Increase to "High" or "Build to Lossless" for users with good connections | | High latency connection | Ping shows >150ms round-trip time | Enable HDX Adaptive Transport (Framehawk) in Citrix policies | | VPN throttling bandwidth | User on VPN with constrained bandwidth | Contact network team about VPN QoS settings; increase VPN bandwidth allocation | | WiFi interference/weak signal | User on WiFi with poor signal strength | Switch user to wired Ethernet connection; improve WiFi signal; use 5GHz band | | Application not HDX-optimized | Specific app shows poor graphics | Check for HDX optimization packs for that application; use app remoting instead | | Host CPU overloaded | Multiple users experiencing poor quality | Reduce VMs per host; add more hosts to distribute load | | User's client device underpowered | Old/slow computer struggling with HDX | Update Citrix Workspace app; consider thin client hardware upgrade | Most common fix: HDX Visual Quality policy too conservative. Increase quality for users with good connections. ### Symptom: Slow Login Times (>2 Minutes) What you see: Long wait from launching desktop to usable desktop Quick diagnostic: 1. Measure login time components ``` 1. Time for desktop to appear in Workspace: Citrix delivery time 2. Time from click to login prompt: VM boot time (if stopped) 3. Time from login to desktop: User profile load time ``` 2. Check if VM had to boot `ansible-playbook -i dev/inventory list.yml | grep ` ``` 1. If VM was stopped, boot time is included ``` 3. Check user profile size (if using roaming profiles) ``` 1. VNC to VM after user login: `du -sh /Users/` ``` 4. Monitor VM resources during login: Watch Activity Monitor during the login process | **Cause** | **How to verify** | **Solution** | | --------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------- | | VM boot time included | VM was stopped and had to start | Keep VMs running 24/7; deploy adequate pool size to avoid stopping VMs | | Large roaming profile | User's home directory >10GB in size | Implement folder redirection; enable profile cleanup policies; limit profile size | | Login scripts timing out | Console shows script errors or delays during login | Fix or remove problematic login scripts; optimize script performance | | Slow network share access | Profile stored on congested network storage | Optimize network storage performance; use faster storage for profiles | | Spotlight indexing on first login | First login after VM creation triggers indexing | Allow indexing to complete once; optimize indexing settings in golden image | | Too many login items | Many applications launching at login | Remove unnecessary startup items; configure minimal login items in golden image | | GPO processing delay | Long wait at "Applying policies" screen | Optimize Group Policy Objects; reduce number of policies; use loopback processing | | Profile corruption | Login hangs or fails repeatedly | Delete local profile; force fresh profile download from server | Most common fix: Large roaming profiles. Implement folder redirection and profile cleanup policies. ### Symptom: Application Launches Are Slow What you see: Apps take 30+ seconds to launch after clicking Quick diagnostic: 1. Test from within the VM directly ``` 1. VNC to the VM 2. Launch the app; and time the launch ``` 2. Check if the app is on network share vs. local storage ``` 1. Applications on network drives are slower ``` 3. Check VM disk I/O ``` 1. Activity Monitor → Disk tab during application launch ``` 4. Check available memory ``` 1. Activity Monitor → Memory tab 2. Look for increased memory pressure ``` | **Cause** | **How to verify** | **Solution** | | ------------------------------------ | --------------------------------------------------- | ------------------------------------------------------------------------------- | | Apps installed on network share | App path shows network/UNC location | Install applications locally in golden image; update image; redeploy VMs | | Insufficient memory | Memory pressure high; heavy swap usage shown | Create golden image with more RAM allocation; redeploy VMs for power users | | Slow disk I/O | Disk wait times high in Activity Monitor | Check host storage performance with MacStadium; redistribute VMs | | App requires more resources | Large app (Xcode, video editing) on small VM | Create high-spec golden image variant; deploy separate VM group for power users | | Antivirus scanning on launch | AV process active during app startup | Exclude app folders from real-time scanning; configure AV exceptions | | App not optimized for virtualization | Native app expects physical hardware resources | Use published applications instead of full desktop; optimize app settings | | First launch initialization | App creating caches/configs on first use | Subsequent launches will be faster; pre-configure apps in golden image | | Network dependency | App verifying license or downloading data on launch | Ensure good network connectivity; pre-cache data if possible | Most common fix: Applications installed on network shares. Pre-install in golden image for local execution. ### Symptom: High CPU Usage Even When Idle What you see: VM consuming 50%+ CPU with no user activity Quick diagnostic: 1. Identify the process consuming CPU by VNCing into the VM, then navigate to Activity Monitor → Sort by %CPU 2. Check for runaway processes ``` 1. Look for: Spotlight indexing (mds), kernel_task, unexpected processes ``` 3. Check for malware (unlikely but possible) ``` 1. Run security scan if suspicious ``` 4. Monitor over time: Is the CPU spike temporary or sustained? Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------- | | Spotlight indexing | `mds` or `mdworker` processes using high CPU | Wait 30-60 minutes for completion; configure indexing exclusions in golden image | | Background macOS updates | `softwareupdated` or related processes active | Allow updates to complete; schedule updates during maintenance windows | | Runaway application process | Specific app/process stuck consuming CPU continuously | Kill process via Activity Monitor; investigate app issue; report bug | | Malware or cryptominer | Unknown suspicious process using CPU | Run malware scan; rebuild VM from clean golden image if infected | | System maintenance tasks | Normal macOS background maintenance (periodic) | Wait for completion (typically 30-60 min); occurs daily at specific times | | GPU acceleration disabled | Software rendering using CPU instead of GPU | Enable GPU passthrough if available (M4 hosts); verify GPU settings in VM | | Memory pressure causing swapping | High swap activity consuming CPU | Increase VM memory allocation in golden image; reduce memory-intensive apps | | Browser with many tabs/extensions | Browser process consuming CPU | Close unnecessary tabs; disable resource-heavy extensions; restart browser | Most common fix: Spotlight indexing or macOS maintenance tasks. Usually resolves itself within an hour. ## Authentication and Access Control ### Symptom: User Can't Log Into Desktop (Credentials Rejected) What you see: The user enters their credentials, but gets an "Invalid username or password" error Quick diagnostic: 1. Verify the user exists in your identity provider by checking Active Directory or Azure AD 2. Test user login capabilities with a known-good account ``` 1. Use an admin account or test account to attempt logging in ``` 3. Check if the issue is specific to one VM or is impacting all VMs ``` 1. Try launching a different desktop in the pool ``` 4. Check VDA domain binding (if using AD) ``` 1. VNC into the VM: System Preferences → Citrix VDA → Check domain binding status ``` | **Cause** | **How to verify** | **Solution** | | ------------------------------- | ---------------------------------------------------- | ---------------------------------------------------------------------------- | | User account disabled in AD/IdP | Check Active Directory or identity provider status | Re-enable user account; verify account is active | | Password expired | User confirms password expired or needs change | Have user reset password through normal corporate password reset process | | VM not bound to domain | VDA shows "Not bound" or incorrect domain | Rebuild golden image with proper domain binding; verify domain credentials | | Time sync issue | VM time differs by >5 minutes from domain controller | Configure NTP in golden image; manually sync time; verify host time correct | | Domain controller unreachable | VM can't ping or connect to DC | Check network connectivity; verify DNS resolution for domain; check firewall | | Cached credentials expired | Works for some users but not others | Clear Keychain cached credentials; force fresh authentication | | Wrong identity provider | VDA bound to wrong domain or tenant | Reconfigure VDA with correct domain/tenant in golden image; redeploy VMs | **Most common fix:** The user’s password is expired. Have the user reset their password through your normal corporate process. ### Symptom: User Can Log In But Has the Wrong Permissions What you see: User is authenticated, but they can't access files/apps they should have access to Quick diagnostic: 1. Check the user's group memberships ``` 1. VNC into the VM: 2. In the Terminal, enter: `groups ` or `dscl . -read /Users/ GroupMembership` ``` 2. Verify user permissions on restricted resources ``` 1. Check file/folder permissions ``` 3. Test with a known-good user from the same group ``` 1. Do other users have the correct group access? ``` 4. Check GPO application (if using AD) ``` 1. In the Terminal, enter: `sudo gpupdate --user` ``` | **Cause** | **How to verify** | **Solution** | | -------------------------------- | -------------------------------------------- | ----------------------------------------------------------------------------- | | User not in required AD groups | `groups` command doesn't show expected group | Add user to appropriate Active Directory security groups | | GPO not applied correctly | `gpupdate` shows no policies or errors | Force GPO refresh with `sudo gpupdate --force --user`; verify DC connectivity | | Local file permissions incorrect | File ACLs don't include user or group | Fix file/folder permissions; verify inheritance settings | | Profile not loaded correctly | User profile appears incomplete or corrupted | Delete local profile cache; force fresh profile download on next login | | Network share mapping failed | Expected drives not appearing | Verify network connectivity; manually map shares to test; check GPO mappings | | Cached credentials out of sync | Using old cached authentication | Clear macOS Keychain; force re-authentication with current credentials | | Group Policy precedence issue | Conflicting GPOs applied in wrong order | Review GPO precedence; adjust GPO link order; use block inheritance carefully | | Domain trust relationship issue | Cross-domain permissions not working | Verify domain trusts are functional; contact domain administrators | Most common fix: The user is not in the required AD group(s). Add them to the appropriate group(s), and then force a GPO refresh. ### Symptom: Single Sign-On (SSO) Not Working What you see: Users are prompted for their SSO credentials despite being logged into iCloud/corporate network Quick diagnostic: 1. Check Citrix Workspace SSO configuration ``` 1. Ask the user to log into Citrix Workspace → Preferences → and verify their SSO settings ``` 2. Verify Citrix Gateway/SSO configuration is correct ``` 1. If using Citrix Gateway: Check pass-through authentication settings ``` 3. Test SSO login capability with manual credentials ``` 1. Does SSO login work if the user enters their credentials manually? ``` 4. Check the user's SSO/company domain login ``` 1. Are they logged in with the correct SSO/company domain account? ``` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ----------------------------------- | -------------------------------------------------- | ----------------------------------------------------------------------------------- | | SSO not enabled in Citrix Workspace | Workspace preferences show SSO disabled | Enable SSO in Citrix Workspace settings under "Account preferences" | | Gateway pass-through not configured | Citrix Gateway shows no SSO/pass-through config | Configure pass-through authentication on Citrix Gateway; enable domain pass-through | | User on non-domain computer | Computer not joined to corporate domain | Join computer to domain or use manual credential entry | | Certificate authentication issue | SSO uses cert auth; certificate is invalid/expired | Renew user certificate; reinstall certificate; verify cert trust chain | | Wrong authentication method | SAML/OAuth/SSO login configured incorrectly | Verify auth method matches identity provider; check Citrix Cloud auth settings | | Browser security settings | Browser blocking credential passing | Adjust browser security settings; add Citrix URLs to trusted sites | | VPN interfering with SSO | VPN tunnel disrupting authentication flow | Configure split-tunnel VPN; ensure SSO endpoints reachable | Most common fix: SSO is not enabled in Citrix Workspace. Enable SSO in the user's Workspace preferences. ### Symptom: Can't Access Citrix Cloud Admin Console **What you see:** Admins can't log into Citrix Cloud Console to manage environment(s) Quick diagnostic: 1. Try using a different browser * Some browsers cache authentication differently 2. Clear browser cookies and cache, then try logging in again 3. Verify your admin account is not locked, check with Citrix support or another admin 4. Check Citrix Cloud status: [https://status.cloud.com](https://status.cloud.com/) | **Cause** | **How to verify** | **Solution** | | ------------------------------------ | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | | Browser cache/cookies issue | Login works in incognito/private mode | Clear browser cookies and cache; restart browser; try again | | MFA/2FA device failure | Error occurs during two-factor authentication step | Re-register MFA device in account settings; use backup codes if available | | Account locked after failed attempts | Multiple failed login attempts triggered lock | Contact Citrix support to unlock; wait for auto-unlock period (usually 30 min) | | Citrix Cloud service outage | Status page shows service issues | Check [status.cloud.com](http://status.cloud.com/); wait for Citrix to resolve; monitor status updates | | Network blocking Citrix Cloud | Can't reach [cloud.com](http://cloud.com/) domains | Check firewall/proxy; verify outbound HTTPS allowed; try different network | | Browser version incompatible | Using old/unsupported browser version | Update to current Chrome, Firefox, Edge, or Safari version | | Admin permissions revoked | Account no longer has admin role | Contact Citrix Cloud organization admin; verify role assignments | | Session timeout | Logged out due to inactivity | Log back in; adjust session timeout settings if available | Most common fix: Browser cache issue. Clear your cookies and cache, or try using incognito/private mode. ## Ansible Playbook Errors ### Symptom: Playbook Fails with "Host unreachable" What you see: Playbook errors: "Failed to connect to the host via ssh" / "Host is unreachable" Quick diagnostic: 1. Test basic connectivity `ping ` 2. Test SSH manually `ssh admin@` 3. Check inventory file `cat dev/inventory` ``` 1. Verify host IP addresses are correct ``` 4. Test Ansible ping module `ansible hosts -i dev/inventory -m ping` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | --------------------------------------- | -------------------------------------------------- | ---------------------------------------------------------------------------- | | Host powered off or unreachable | Ping test fails completely | Power on host via MacStadium portal; contact MacStadium support | | Wrong IP address in inventory | IP doesn't match actual host address | Update `dev/inventory` file with correct host IP addresses | | SSH service not running on host | Ping works but SSH connection refused/timeout | Restart SSH service on host; contact MacStadium support | | Firewall blocking SSH from control node | SSH works from some locations but not control node | Check firewall rules; allow SSH (port 22) from Ansible control node IP | | SSH key not in authorized\_keys | SSH prompts for password instead of using key | Add Ansible control node's public SSH key to host's `~/.ssh/authorized_keys` | | Wrong username configured | Using incorrect `ansible_user` value | Verify `ansible_user=admin` (or correct user) in inventory `[all:vars]` | | Network routing issue | Can't reach host network from control node | Verify routing; check if VPN required; test from different network location | | Host SSH configuration changed | SSH settings preventing key-based auth | Verify host SSH config allows public key authentication | Most common fix: SSH key is not in `authorized_keys` on host. Add the Ansible control node's public key to the host. ### Symptom: Playbook Fails with "Permission denied" What you see: Playbook errors with permission/sudo errors during execution Quick diagnostic: 1. Test sudo access manually\ `ssh admin@ `\ `sudo ls /var/orka` 2. Check Ansible inventory settings:\ `cat dev/inventory | grep ansible_become` 3. Run the playbook with verbose output `ansible-playbook -i dev/inventory -vvv` 4. Check if a specific task is failing, and/or look at which task in the playbook fails Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ------------------------------------ | ------------------------------------------------- | --------------------------------------------------------------------------------- | | `ansible_become` is not set | Inventory missing `ansible_become=yes` | Add `ansible_become=yes` to `[all:vars]` section in inventory | | User lacks sudo permissions | Manual `sudo` command prompts for password | Add Ansible user to sudoers; configure passwordless sudo for admin user | | Sudo password is required | Playbook needs `become_password` but not provided | Add `-K` flag when running playbook to prompt for sudo password | | File permissions are too restrictive | Specific files/dirs not readable/writable | Fix file permissions on host; verify ownership is correct | | SELinux/security policy blocking | macOS security policies preventing operation | Adjust security settings; may need to disable SIP temporarily for some operations | | Wrong sudo path or configuration | Sudo command not found or misconfigured | Verify sudo is installed and in PATH; check `/etc/sudoers` configuration | | Ansible connection user mismatch | Connecting as one user, trying to become another | Verify `ansible_user` matches expected user account on hosts | Most common fix: `ansible_become=yes` not set in inventory. Add to `[all:vars]` section. ### Symptom: Playbook Times Out What you see: Your Ansible playbook runs, but it times out on specific tasks without completing Quick diagnostic: 1. Run with verbose output to see where the playbook hangs: `ansible-playbook -i dev/inventory -vvv` 2. Test the specific command manually by SSHing to the host and running the command that's timing out 3. Check if the task requires a long time to complete ``` 1. Note that image pulls and VM deployments can take more time than initially anticipated ``` 4. Monitor host resources during tasks by running:\ `ssh admin@ `\ `top` Likely causes and solutions: | **Cause** | **How to verify** | **Solution** | | ---------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | Task legitimately takes a long time | Image pull or VM deployment in progress | Be patient; increase the task timeout in your playbook if needed; and monitor progress with `-vv` | | Host is overloaded and responding slowly | High CPU/memory usage on host during task | Reduce load on host; stop some VMs; retry during low-usage period | | Network timeout during download | Downloading a large image from a slow source | Improve network path to registry; use closer registry; retry during off-hours | | Task(s) hanging indefinitely | No progress visible for an extended period of time | Cancel with Ctrl+C; SSH to host to debug; check for stuck processes | | Insufficient async timeout | Default timeout is too short for the operation | Increase `async` timeout parameter in playbook task definition | | Host became unresponsive | Host not responding to any commands | SSH to host to check status; may need host reboot; contact MacStadium | | Deadlock or resource contention | Task waiting for resource held by another process | Identify and kill blocking processes; restart Orka Engine service | | Network connection is unstable | Intermittent connectivity during long operations | Improve network stability; use a more reliable connection; and/or retry the operation | Most common fix: Legitimate long-running task (such as an image pull). Increase the `async` timeout or be patient. ### Symptom: Playbook Variables Not Being Applied What you see: Playbook runs but doesn't use the variables you specified with `-e` Quick diagnostic: 1. Check command syntax ``` 1. Verify `-e` flags are formatted correctly ``` 2. Run with verbose output: `ansible-playbook -i dev/inventory \ ` `-e "var1=value1" \ ` `-e "var2=value2" \ ` `-vv` 3. Check playbook for variable names, and ensure they match exactly (variable names are case-sensitive) 4. Check for hard-coded values in the playbook, these might override other variables Likely causes and solutions: | **Cause** | **How to identify** | **Solution** | | -------------------------------------- | ------------------------------------------------------ | -------------------------------------------------------------------------- | | Variable name typo or case mismatch | Names don't match exactly (case-sensitive) | Use the exact variable name from your playbook’s documentation; check case | | Variable already set with precedence | Playbook has default; your var has lower precedence | Extra vars (`-e`) should override; verify syntax is correct | | Wrong variable data type | Passing string where an integer expected or vice versa | Check playbook documentation for expected data type; convert if needed | | Variable not used in playbook | Playbook doesn't reference that variable | Verify playbook supports variable; check playbook source code or docs | | Syntax error in `-e` flag | Command line parsing failed silently | Use proper quotes: `-e "vm_name=test"` not `-e vm_name=test` | | Multiple `-e` flags parsed incorrectly | Only first `-e` being applied | Ensure each `-e` flag is separate and properly formatted | | Variable scope issue | Variable defined in wrong `group_vars` location | Check variable is in correct inventory group or `all` group | | Special characters not escaped | Variable value contains spaces or special chars | Quote values properly: `-e "vm_name=test vm"` needs quotes | Most common fix: Variable name typo. Check playbook documentation for exact variable names (these are case-sensitive). ### Symptom: Playbook Fails Partway Through What you see: The playbook starts successfully, but fails on a specific task Quick diagnostic: 1. Run the playbook with verbose output to see the exact error: `ansible-playbook -i dev/inventory -vvv` 2. Check the specific task that failed, reviewing the error logs carefully 3. Test the failing task’s command manually by SSHing into the host and running the command 4. Check if the task is stuck in a partially successful state and needs cleanup, or needs to be re-run | **Cause** | **How to verify** | **Solution** | | ----------------------------- | ------------------------------------------------------- | -------------------------------------------------------------------------------- | | Resource exhaustion mid-task | Host ran out of disk space or memory during operation | Free resources on the host; delete unused VMs; retry playbook from the beginning | | Network interruption | Connection to host lost during task execution | Verify network stability; check for network issues; rerun playbook | | Task dependency not met | Previous task didn't fully complete before next started | Review task dependencies; add explicit wait/pause between tasks if needed | | Invalid parameter value | Task received bad input causing failure | Verify all parameter values are valid; check for typos in variables | | Race condition | Task timing-sensitive; failed due to timing issue | Add explicit `pause` or `wait_for` tasks between dependent operations | | External service unavailable | Registry, DNS, or API temporarily unavailable | Check external service status; retry when service available; implement retries | | Disk write failure | File system full or read-only during write | Check disk space with `df -h`; verify filesystem not read-only | | Concurrent playbook execution | Another playbook is modifying the same resources | Ensure only one playbook runs at a time; implement locking if needed | Most common fix: Network or resource interruption. Verify connectivity and available resources, then re-run the playbook. ### Symptom: Playbook Says "Changed" But Nothing Actually Changed What you see: Playbook reports changes, but its state appears identical Quick diagnostic: 1. Check what the playbook claims to change, look at the task output while the playbook is running 2. Verify the actual state on the MacStadium VDI host `ssh admin@` and check if the claimed changes actually exist 3. Run the playbook in check mode: `ansible-playbook -i dev/inventory --check` 4. Check for idempotency issues, and run the playbook twice. The task status should display "ok," the second time, and not "changed". | **Cause** | **How to verify** | **Solution** | | -------------------------- | ---------------------------------------- | ------------------------------------- | | Playbook not idempotent | Playbook status always reports "changed" | Fix playbook to properly check state | | Task reporting incorrectly | Code bug in the playbook | Review/fix task logic | | Cached state outdated | Playbook is using old state info | Force refresh of facts | | External state changed | Something else modified playbook state | Determine what else is changing state | | Task has side effects | Change occurs but not where expected | Review full task behavior | Most common fix: The playbook is not properly checking the existing state before making changes (idempotency issue). ## Escalation Quick Reference When to escalate: | **Issue Pattern** | **Escalate To** | **Contact** | **SLA** | | ------------------------- | ------------------------ | ------------------------------------------------------- | ---------------------- | | Single user problem | Handle yourself | N/A | Immediate | | 5-10 users affected | Infrastructure team lead | Internal | 30+ minutes | | 10+ users affected | Infrastructure manager | Internal | Immediate | | Host hardware failure | MacStadium support | [support@macstadium.com](mailto:support@macstadium.com) | 1 business day | | Orka Engine issues | MacStadium support | [support@macstadium.com](mailto:support@macstadium.com) | 1 business day | | Network infrastructure | Network team | Internal | Varies | | Citrix Cloud outage | Citrix support | [support@citrix.com](mailto:support@citrix.com) | Varies by support tier | | VDA failures (widespread) | Citrix support | [support@citrix.com](mailto:support@citrix.com) | Varies by support tier | | Storage/registry down | Storage team | Internal | Varies | *** ## Troubleshooting best practices 1. Start simple: verify basic connectivity before diving into application-layer issues. 2. Check one layer at a time: network → host → VM → VDA → Citrix. 3. Use verbose playbook output for any failing task: `ansible-playbook -i dev/inventory -vvv` 4. Test on a single host before assuming an issue is widespread: add `--limit mac-node-1` 5. Document what you tried and what worked. Add it to your internal runbook. 6. Monitor logs proactively rather than reactively. See [Monitoring & Observability](/remote-desktop-vdi/operations/monitoring) for setup guidance.