# API Authentication Source: https://docs.xloud.tech/api-reference/authentication Authenticate with the Xloud API using password tokens, application credentials, and scoped tokens. Includes token lifecycle management and CLI examples. ## Overview All Xloud API requests require a valid bearer token in the `X-Auth-Token` request header. The Identity service (Keystone) issues tokens upon successful authentication. Tokens are time-limited, project-scoped, and carry the role assignments of the authenticated user. **Prerequisites** * An active Xloud account * Project name, username, and password (or application credential ID and secret) * Identity endpoint: `https://api./identity/v3` *** ## Token-Based Authentication ### Password Authentication Authenticate with a username and password to receive a project-scoped token: ```bash title="cURL" theme={null} curl -i -X POST https://api./identity/v3/auth/tokens \ -H "Content-Type: application/json" \ -d '{ "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "myuser", "domain": { "name": "Default" }, "password": "mypassword" } } }, "scope": { "project": { "name": "myproject", "domain": { "name": "Default" } } } } }' ``` ```python title="Python (requests)" theme={null} import requests auth_payload = { "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "myuser", "domain": {"name": "Default"}, "password": "mypassword" } } }, "scope": { "project": { "name": "myproject", "domain": {"name": "Default"} } } } } resp = requests.post( "https://api./identity/v3/auth/tokens", json=auth_payload ) token = resp.headers["X-Subject-Token"] print(f"Token: {token}") ``` The response contains: * `X-Subject-Token` header — the token string to use in subsequent calls * JSON body with token metadata including expiry time and service catalog ```json title="Token metadata response (excerpt)" theme={null} { "token": { "expires_at": "2026-03-19T10:00:00.000000Z", "issued_at": "2026-03-18T10:00:00.000000Z", "methods": ["password"], "project": { "id": "abc123", "name": "myproject", "domain": { "id": "default", "name": "Default" } }, "roles": [ { "id": "def456", "name": "member" } ], "catalog": [...] } } ``` *** ## Application Credentials Application credentials allow services and automation scripts to authenticate without exposing user passwords. They are scoped to a specific project and role set at creation time. Log in to the **Xloud Dashboard** (`https://connect.`) and navigate to **Project → Identity → Application Credentials**. Click **Create Application Credential**. | Field | Value | Description | | ---------------- | ------------------------ | ----------------------------------------------------------- | | **Name** | `ci-deploy-prod` | Descriptive identifier | | **Secret** | Auto-generated or custom | Store this immediately — it is shown only once | | **Expiration** | Optional date | Leave blank for non-expiring credentials | | **Roles** | `member` | Restrict to minimum required roles | | **Unrestricted** | Disabled | Only enable if the credential must manage other credentials | Copy the **Secret** value immediately after creation. It cannot be retrieved again. If lost, delete and recreate the credential. Click **Download clouds.yaml** to get a ready-to-use configuration file for the Xloud CLI and Python SDK. The `clouds.yaml` file is saved to your local machine and can be placed at `~/.config/xloud/clouds.yaml`. ```bash title="Create an application credential" theme={null} openstack application credential create ci-deploy-prod \ --role member \ --description "CI/CD deployment credential for production project" ``` Store the `secret` value from the output immediately. ```bash title="Authenticate using an application credential" theme={null} curl -i -X POST https://api./identity/v3/auth/tokens \ -H "Content-Type: application/json" \ -d '{ "auth": { "identity": { "methods": ["application_credential"], "application_credential": { "id": "", "secret": "" } } } }' ``` *** ## Scoped Tokens Tokens can be scoped to different resources depending on the operation required: | Scope | Use Case | Request `scope` field | | ------------------ | --------------------------------------------- | ------------------------------------ | | **Project-scoped** | Manage resources within a project | `"project": { "name": "myproject" }` | | **Domain-scoped** | Manage users and projects within a domain | `"domain": { "name": "Default" }` | | **System-scoped** | Administrative operations across all projects | `"system": { "all": true }` | | **Unscoped** | Discover available projects before scoping | Omit the `scope` field | ### Exchange an Unscoped Token for a Project-Scoped Token ```bash title="Step 1: Obtain unscoped token" theme={null} curl -i -X POST https://api./identity/v3/auth/tokens \ -H "Content-Type: application/json" \ -d '{ "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "myuser", "domain": { "name": "Default" }, "password": "mypassword" } } } } }' ``` ```bash title="Step 2: List available projects" theme={null} curl -X GET https://api./identity/v3/auth/projects \ -H "X-Auth-Token: $UNSCOPED_TOKEN" ``` ```bash title="Step 3: Exchange for project-scoped token" theme={null} curl -i -X POST https://api./identity/v3/auth/tokens \ -H "Content-Type: application/json" \ -H "X-Auth-Token: $UNSCOPED_TOKEN" \ -d '{ "auth": { "identity": { "methods": ["token"], "token": { "id": "'"$UNSCOPED_TOKEN"'" } }, "scope": { "project": { "id": "" } } } }' ``` *** ## Token Lifecycle | Operation | Endpoint | Method | | ------------------- | ----------------------------- | ------------------------------- | | Create token | `/identity/v3/auth/tokens` | POST | | Validate token | `/identity/v3/auth/tokens` | GET (with `X-Subject-Token`) | | Revoke token | `/identity/v3/auth/tokens` | DELETE (with `X-Subject-Token`) | | List tokens (admin) | `/identity/v3/OS-PKI/revoked` | GET | ```bash title="Validate a token" theme={null} curl -i -X GET https://api./identity/v3/auth/tokens \ -H "X-Auth-Token: $OS_TOKEN" \ -H "X-Subject-Token: $TOKEN_TO_VALIDATE" ``` ```bash title="Revoke a token" theme={null} curl -i -X DELETE https://api./identity/v3/auth/tokens \ -H "X-Auth-Token: $OS_TOKEN" \ -H "X-Subject-Token: $TOKEN_TO_REVOKE" ``` Tokens expire after the configured token TTL (default: 1 hour). Long-running automation scripts should implement token refresh logic — detect `401 Unauthorized` responses and re-authenticate automatically. *** ## Using the OpenRC File For CLI and script use, source an OpenRC credentials file instead of manually passing credentials: ```bash title="Source OpenRC file" theme={null} source admin-openrc.sh ``` ```bash title="Sample OpenRC file content" theme={null} export OS_AUTH_URL=https://api./identity/v3 export OS_PROJECT_NAME=myproject export OS_USERNAME=myuser export OS_PASSWORD=mypassword export OS_USER_DOMAIN_NAME=Default export OS_PROJECT_DOMAIN_NAME=Default export OS_IDENTITY_API_VERSION=3 ``` Download the OpenRC file from **Xloud Dashboard → Project → API Access → Download OpenStack RC File**. *** ## Troubleshooting **Cause**: Token is expired, invalid, or not included in the request header. **Resolution**: 1. Re-authenticate to obtain a fresh token 2. Confirm the token is passed in `X-Auth-Token` (not `Authorization: Bearer`) 3. Verify the Identity endpoint URL is correct **Cause**: The token is valid but the user's role does not permit this operation. **Resolution**: Verify your role assignment in the project: ```bash title="Check role assignments" theme={null} openstack role assignment list --user $OS_USERNAME --project $OS_PROJECT_NAME ``` Contact your administrator to assign the appropriate role. **Cause**: The token is scoped to a different project than the resource being accessed. **Resolution**: Re-authenticate with the correct project scope. Confirm the `OS_PROJECT_NAME` environment variable matches the project containing the resource. *** ## Next Steps Launch and manage instances using the Compute API Manage users, projects, and roles via the Identity API Scripting patterns and token refresh strategies for automation Create and manage application credentials for non-interactive access # Compute API Reference Source: https://docs.xloud.tech/api-reference/compute-api Xloud Compute API (Nova) overview, key endpoints, request/response examples, and common operations for managing virtual machine instances programmatically. ## Overview The Xloud Compute API provides programmatic control over virtual machine instances, flavors, keypairs, availability zones, server groups, and hypervisor resources. The API follows RESTful conventions with JSON request and response bodies. **Prerequisites** * A valid project-scoped token from the [Identity API](/api-reference/authentication) * Base URL: `https://api./compute/v2.1` * Minimum API microversion: `2.1` *** ## API Versioning (Microversions) The Compute API uses microversions to add new capabilities without breaking existing clients. Specify the desired microversion in the `X-OpenStack-Nova-Microversion` header: ```bash title="Request with specific microversion" theme={null} curl -X GET https://api./compute/v2.1/servers \ -H "X-Auth-Token: $OS_TOKEN" \ -H "X-OpenStack-Nova-Microversion: 2.79" ``` ```bash title="Query supported microversions" theme={null} curl -X GET https://api./compute \ -H "X-Auth-Token: $OS_TOKEN" ``` *** ## Key Endpoints | Resource | Method | Endpoint | Description | | --------------- | ------ | ----------------------------- | ------------------------------------------- | | List instances | GET | `/servers` | List all instances in the project | | Instance detail | GET | `/servers/detail` | List instances with full details | | Get instance | GET | `/servers/{id}` | Get a specific instance | | Create instance | POST | `/servers` | Launch a new instance | | Delete instance | DELETE | `/servers/{id}` | Delete an instance | | Instance action | POST | `/servers/{id}/action` | Perform an action (reboot, resize, etc.) | | List flavors | GET | `/flavors/detail` | List all available instance sizes | | List images | GET | `/images` | List available images | | List keypairs | GET | `/os-keypairs` | List SSH keypairs | | Create keypair | POST | `/os-keypairs` | Register or generate an SSH keypair | | List AZs | GET | `/os-availability-zone` | List availability zones | | Server groups | GET | `/os-server-groups` | List server groups (affinity/anti-affinity) | | Hypervisors | GET | `/os-hypervisors/detail` | List hypervisors (admin) | | Quotas | GET | `/os-quota-sets/{project_id}` | Show project compute quotas | *** ## Create an Instance Display name for the instance. Flavor ID or URL. Determines vCPU, RAM, and disk allocation. Image ID or URL to boot from. Omit when booting from volume. List of network objects. Each must include `uuid` (network ID) or `port` (port ID). SSH keypair name to inject into the instance for key-based authentication. List of security group name objects. Defaults to the `default` group. Base64-encoded cloud-init user data script executed at first boot. Target availability zone. Omit to let the scheduler choose. ```bash title="cURL" theme={null} curl -X POST https://api./compute/v2.1/servers \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "server": { "name": "web-server-01", "flavorRef": "m1.medium", "imageRef": "ubuntu-22.04-amd64", "networks": [{ "uuid": "a1b2c3d4-e5f6-..." }], "key_name": "my-keypair", "security_groups": [{ "name": "web-servers" }] } }' ``` ```python title="Python" theme={null} import requests token = "your-token" server = { "server": { "name": "web-server-01", "flavorRef": "m1.medium", "imageRef": "ubuntu-22.04-amd64", "networks": [{"uuid": "a1b2c3d4-e5f6-..."}], "key_name": "my-keypair", "security_groups": [{"name": "web-servers"}] } } resp = requests.post( "https://api./compute/v2.1/servers", json=server, headers={"X-Auth-Token": token, "Content-Type": "application/json"} ) print(resp.json()["server"]["id"]) ``` ```json title="202 Accepted" theme={null} { "server": { "id": "b1c2d3e4-f5a6-7890-b1c2-d3e4f5a67890", "name": "web-server-01", "status": "BUILD", "links": [ { "href": "https://api./compute/v2.1/servers/b1c2d3e4...", "rel": "self" } ], "adminPass": "auto-generated-password", "OS-DCF:diskConfig": "MANUAL" } } ``` *** ## Instance Actions Perform operations on a running instance via the `/action` endpoint: ```bash title="Soft reboot (graceful OS restart)" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "reboot": { "type": "SOFT" } }' ``` ```bash title="Hard reboot (power cycle)" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "reboot": { "type": "HARD" } }' ``` ```bash title="Stop instance (power off)" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "os-stop": null }' ``` ```bash title="Start stopped instance" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "os-start": null }' ``` ```bash title="Resize to a larger flavor" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "resize": { "flavorRef": "m1.large" } }' ``` ```bash title="Confirm the resize" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "confirmResize": null }' ``` ```bash title="Create instance snapshot (image)" theme={null} curl -X POST https://api./compute/v2.1/servers/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "createImage": { "name": "web-server-01-snapshot", "metadata": {} } }' ``` *** ## List Instances with Filtering ```bash title="List all running instances" theme={null} curl -X GET "https://api./compute/v2.1/servers?status=ACTIVE" \ -H "X-Auth-Token: $OS_TOKEN" ``` ```bash title="List instances with full details" theme={null} curl -X GET https://api./compute/v2.1/servers/detail \ -H "X-Auth-Token: $OS_TOKEN" ``` ```bash title="List instances across all projects (admin)" theme={null} curl -X GET "https://api./compute/v2.1/servers/detail?all_tenants=1" \ -H "X-Auth-Token: $OS_TOKEN" ``` Common filter parameters: | Parameter | Description | | ------------- | ---------------------------------------------------------------- | | `status` | Filter by instance status: `ACTIVE`, `SHUTOFF`, `BUILD`, `ERROR` | | `name` | Filter by instance name (supports regex) | | `flavor` | Filter by flavor ID | | `image` | Filter by image ID | | `all_tenants` | `1` to list across all projects (admin only) | | `limit` | Maximum number of results per page | | `marker` | Pagination cursor — last instance ID from previous page | *** ## Error Reference | HTTP Status | Error Code | Description | | ----------- | -------------------- | --------------------------------------------- | | `400` | `badRequest` | Invalid request body or parameter | | `401` | `unauthorized` | Token missing, invalid, or expired | | `403` | `forbidden` | Insufficient permissions for this operation | | `404` | `itemNotFound` | Instance or resource not found | | `409` | `conflictingRequest` | Operation not valid in current instance state | | `413` | `entityTooLarge` | Request exceeds quota limits | | `429` | `overLimit` | Rate limit exceeded | *** ## Next Steps Attach volumes and manage snapshots via the Storage API Create networks and assign floating IPs for your instances Manage tokens and application credentials Automate instance lifecycle with scripts and SDKs # API Reference Source: https://docs.xloud.tech/api-reference/index REST API documentation for the Xloud Cloud Platform. Programmatically control compute, storage, networking, and identity services. ## Overview The Xloud Cloud Platform exposes a comprehensive set of RESTful APIs. These APIs give you programmatic control over every infrastructure resource — compute instances, block storage volumes, networks, identity tokens, and more. All APIs use token-based authentication and return JSON-formatted responses. **Prerequisites** * An active Xloud account with project membership * API access enabled (contact your administrator if not available) * API base URL: `https://api.` or the internal endpoint provided during deployment *** ## API Services Token-based auth, application credentials, and scoped tokens Instances, flavors, keypairs, and console access Volumes, snapshots, backups, and volume types Networks, subnets, routers, security groups, and floating IPs Projects, users, roles, domains, and service catalog Scripting patterns, SDK usage, and webhook integration *** ## Quick Reference | Service | Base Path | Current Version | | ---------------------- | ------------------ | --------------- | | Identity (Keystone) | `/identity/v3` | v3 | | Compute (Nova) | `/compute/v2.1` | v2.1 | | Block Storage (Cinder) | `/volume/v3` | v3 | | Networking (Neutron) | `/networking/v2.0` | v2.0 | | Image Service (Glance) | `/image/v2` | v2 | | Object Storage (Swift) | `/object-store/v1` | v1 | | Object Storage (S3) | `/s3` | S3 v4 | *** ## Authentication Overview All API calls require a valid token in the `X-Auth-Token` header. Obtain a token by authenticating against the Identity service: ```bash title="Obtain authentication token" theme={null} curl -i -X POST https://api./identity/v3/auth/tokens \ -H "Content-Type: application/json" \ -d '{ "auth": { "identity": { "methods": ["password"], "password": { "user": { "name": "admin", "domain": { "name": "Default" }, "password": "your_password" } } }, "scope": { "project": { "name": "admin", "domain": { "name": "Default" } } } } }' ``` The `X-Subject-Token` response header contains the token value. Use it in all subsequent API calls: ```bash title="Use token in API calls" theme={null} export OS_TOKEN="" curl -X GET https://api./compute/v2.1/servers \ -H "X-Auth-Token: $OS_TOKEN" ``` See the [Authentication reference](/api-reference/authentication) for application credentials, token scoping, and token renewal. *** ## Response Format All API responses use JSON. Standard HTTP status codes indicate success or failure: | Status | Meaning | | ----------------------- | ------------------------------------------------------------- | | `200 OK` | Request succeeded. Response body contains the resource. | | `201 Created` | Resource created. Response body contains the new resource. | | `202 Accepted` | Asynchronous operation started. Poll the resource for status. | | `204 No Content` | Request succeeded. No response body (common for DELETE). | | `400 Bad Request` | Invalid request body or parameters. Check the error message. | | `401 Unauthorized` | Invalid or expired token. Re-authenticate. | | `403 Forbidden` | Valid token, but insufficient permissions for this operation. | | `404 Not Found` | Resource does not exist or is not visible to your project. | | `409 Conflict` | Operation conflicts with current resource state. | | `429 Too Many Requests` | Rate limit exceeded. Back off and retry. | *** ## Next Steps Start here — learn how to obtain tokens and use application credentials Scripting, SDK usage, and CI/CD pipeline integration examples # Networking API Reference Source: https://docs.xloud.tech/api-reference/networking-api Xloud Networking API (Neutron) overview, key endpoints, and examples for managing networks, subnets, routers, security groups, and floating IPs. ## Overview The Xloud Networking API provides full programmatic control over virtual network resources — networks, subnets, routers, ports, security groups, floating IPs, and QoS policies. The API uses a RESTful design with JSON bodies and project-scoped resource isolation. **Prerequisites** * A valid project-scoped token from the [Identity API](/api-reference/authentication) * Base URL: `https://api./networking/v2.0` * Network resources are project-isolated by default — shared resources are admin-managed *** ## Key Endpoints | Resource | Method | Endpoint | Description | | --------------------- | ------ | --------------------------------------- | ------------------------------------ | | List networks | GET | `/networks` | List networks visible to the project | | Create network | POST | `/networks` | Create a new tenant network | | Get network | GET | `/networks/{id}` | Get network details | | Delete network | DELETE | `/networks/{id}` | Delete a network | | List subnets | GET | `/subnets` | List subnets in the project | | Create subnet | POST | `/subnets` | Create a subnet on a network | | List routers | GET | `/routers` | List routers in the project | | Create router | POST | `/routers` | Create a new router | | Add interface | PUT | `/routers/{id}/add_router_interface` | Attach subnet to router | | Remove interface | PUT | `/routers/{id}/remove_router_interface` | Detach subnet from router | | List ports | GET | `/ports` | List all ports | | Create port | POST | `/ports` | Create a network port | | List security groups | GET | `/security-groups` | List security groups | | Create security group | POST | `/security-groups` | Create a security group | | Add SG rule | POST | `/security-group-rules` | Add a rule to a security group | | List floating IPs | GET | `/floatingips` | List floating IP allocations | | Create floating IP | POST | `/floatingips` | Allocate a floating IP | | Associate floating IP | PUT | `/floatingips/{id}` | Associate with a port | | List QoS policies | GET | `/qos/policies` | List QoS policies (admin) | | Create QoS policy | POST | `/qos/policies` | Create a QoS policy (admin) | *** ## Create a Network and Subnet ```bash title="Create network" theme={null} curl -X POST https://api./networking/v2.0/networks \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "network": { "name": "app-network", "admin_state_up": true } }' ``` ```bash title="Create subnet on the network" theme={null} curl -X POST https://api./networking/v2.0/subnets \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "subnet": { "name": "app-subnet", "network_id": "", "ip_version": 4, "cidr": "192.168.10.0/24", "enable_dhcp": true, "dns_nameservers": ["8.8.8.8", "8.8.4.4"], "allocation_pools": [ { "start": "192.168.10.10", "end": "192.168.10.200" } ] } }' ``` ```json title="201 Created — Network" theme={null} { "network": { "id": "d4e5f6a7-b8c9-0123-d4e5-f6a7b8c90123", "name": "app-network", "status": "ACTIVE", "admin_state_up": true, "subnets": [], "shared": false, "tenant_id": "abc123" } } ``` *** ## Routers ```bash title="Create a router with external gateway" theme={null} curl -X POST https://api./networking/v2.0/routers \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "router": { "name": "app-router", "admin_state_up": true, "external_gateway_info": { "network_id": "" } } }' ``` ```bash title="Attach subnet to router" theme={null} curl -X PUT \ "https://api./networking/v2.0/routers/{router_id}/add_router_interface" \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "subnet_id": "" }' ``` ```bash title="Remove subnet from router" theme={null} curl -X PUT \ "https://api./networking/v2.0/routers/{router_id}/remove_router_interface" \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "subnet_id": "" }' ``` *** ## Security Groups ```bash title="Create a security group" theme={null} curl -X POST https://api./networking/v2.0/security-groups \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "security_group": { "name": "web-servers", "description": "Allow HTTP/HTTPS and SSH inbound" } }' ``` ```bash title="Allow SSH inbound (TCP 22)" theme={null} curl -X POST https://api./networking/v2.0/security-group-rules \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "security_group_rule": { "security_group_id": "", "direction": "ingress", "protocol": "tcp", "port_range_min": 22, "port_range_max": 22, "remote_ip_prefix": "0.0.0.0/0" } }' ``` ```bash title="Allow HTTPS inbound (TCP 443)" theme={null} curl -X POST https://api./networking/v2.0/security-group-rules \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "security_group_rule": { "security_group_id": "", "direction": "ingress", "protocol": "tcp", "port_range_min": 443, "port_range_max": 443, "remote_ip_prefix": "0.0.0.0/0" } }' ``` Security group rule parameters: | Parameter | Values | Description | | ------------------ | ---------------------------- | -------------------------------- | | `direction` | `ingress`, `egress` | Traffic direction | | `protocol` | `tcp`, `udp`, `icmp`, `null` | IP protocol | | `port_range_min` | `1`–`65535` | Start of port range | | `port_range_max` | `1`–`65535` | End of port range | | `remote_ip_prefix` | CIDR e.g. `10.0.0.0/8` | Source or destination IP range | | `remote_group_id` | Security group ID | Allow traffic from another group | *** ## Floating IPs ```bash title="Allocate a floating IP from external network" theme={null} curl -X POST https://api./networking/v2.0/floatingips \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "floatingip": { "floating_network_id": "" } }' ``` ```bash title="Associate floating IP with a port" theme={null} curl -X PUT https://api./networking/v2.0/floatingips/{floatingip_id} \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "floatingip": { "port_id": "" } }' ``` ```bash title="Disassociate floating IP (keep allocated)" theme={null} curl -X PUT https://api./networking/v2.0/floatingips/{floatingip_id} \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "floatingip": { "port_id": null } }' ``` ```bash title="Release floating IP back to the pool" theme={null} curl -X DELETE https://api./networking/v2.0/floatingips/{floatingip_id} \ -H "X-Auth-Token: $OS_TOKEN" ``` *** ## Ports Network ID to create the port on. Display name for the port. List of objects specifying `subnet_id` and optionally a specific `ip_address`. List of security group IDs to apply to this port. ```bash title="Create a port with specific IP" theme={null} curl -X POST https://api./networking/v2.0/ports \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "port": { "network_id": "", "name": "db-port", "fixed_ips": [ { "subnet_id": "", "ip_address": "192.168.10.50" } ], "security_groups": [""] } }' ``` *** ## Network Resource Status | Status | Meaning | | -------- | ------------------------------------------ | | `ACTIVE` | Resource is operational | | `DOWN` | Resource exists but is not passing traffic | | `BUILD` | Resource is being provisioned | | `ERROR` | Provisioning or operation failed | *** ## Next Steps Launch instances connected to the networks you create Apply bandwidth limits and DSCP marking via the QoS API Manage project membership and resource access Script full network topology provisioning end-to-end # Storage API Reference Source: https://docs.xloud.tech/api-reference/storage-api Xloud Block Storage API (Cinder) overview, key endpoints, and examples for managing volumes, snapshots, backups, and volume types programmatically. ## Overview The Xloud Block Storage API provides programmatic management of persistent storage volumes, volume snapshots, volume backups, volume types, and QoS specifications. Volumes attach to compute instances as block devices — independent of instance lifecycle. **Prerequisites** * A valid project-scoped token from the [Identity API](/api-reference/authentication) * Base URL: `https://api./volume/v3` * All operations are project-scoped unless using admin credentials *** ## Key Endpoints | Resource | Method | Endpoint | Description | | --------------- | ------ | ----------------------------- | ----------------------------------- | | List volumes | GET | `/volumes` | List volumes in the current project | | Volume detail | GET | `/volumes/detail` | List volumes with full metadata | | Get volume | GET | `/volumes/{id}` | Get a specific volume | | Create volume | POST | `/volumes` | Create a new volume | | Extend volume | POST | `/volumes/{id}/action` | Extend volume size | | Delete volume | DELETE | `/volumes/{id}` | Delete a volume | | Attach volume | POST | `/volumes/{id}/action` | Reserve for attachment | | List snapshots | GET | `/snapshots` | List volume snapshots | | Create snapshot | POST | `/snapshots` | Create a volume snapshot | | Delete snapshot | DELETE | `/snapshots/{id}` | Delete a snapshot | | List backups | GET | `/backups` | List volume backups | | Create backup | POST | `/backups` | Create a volume backup | | Restore backup | POST | `/backups/{id}/restore` | Restore backup to a volume | | Volume types | GET | `/types` | List available volume types | | QoS specs | GET | `/qos-specs` | List QoS specifications (admin) | | Quotas | GET | `/os-quota-sets/{project_id}` | Show project storage quotas | *** ## Create a Volume Display name for the volume. Volume size in gigabytes. Volume type name or ID. Determines the storage backend and QoS policy. Target availability zone. Must match the compute availability zone to attach. Clone from an existing volume by providing its ID. Create from a snapshot by providing the snapshot ID. Key-value metadata pairs for custom tagging. ```bash title="cURL" theme={null} curl -X POST https://api./volume/v3/volumes \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "volume": { "name": "db-data-01", "size": 200, "volume_type": "ssd-standard", "availability_zone": "nova", "metadata": { "environment": "production", "service": "mysql" } } }' ``` ```python title="Python" theme={null} import requests volume = { "volume": { "name": "db-data-01", "size": 200, "volume_type": "ssd-standard", "availability_zone": "nova", "metadata": {"environment": "production"} } } resp = requests.post( "https://api./volume/v3/volumes", json=volume, headers={"X-Auth-Token": token} ) print(resp.json()["volume"]["id"]) ``` ```json title="202 Accepted" theme={null} { "volume": { "id": "c3d4e5f6-a7b8-9012-c3d4-e5f6a7b89012", "name": "db-data-01", "status": "creating", "size": 200, "volume_type": "ssd-standard", "availability_zone": "nova", "metadata": { "environment": "production" }, "created_at": "2026-03-18T10:00:00.000000", "bootable": "false", "encrypted": false } } ``` *** ## Volume Operations Volumes are attached to instances via the Compute API. The Storage API provides the `os-reserve` and `os-attach` actions for low-level attachment management. ```bash title="Attach volume via Compute API (recommended)" theme={null} curl -X POST https://api./compute/v2.1/servers/{server_id}/os-volume_attachments \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "volumeAttachment": { "volumeId": "", "device": "/dev/vdb" } }' ``` ```bash title="Detach volume from instance" theme={null} curl -X DELETE \ "https://api./compute/v2.1/servers/{server_id}/os-volume_attachments/{volume_id}" \ -H "X-Auth-Token: $OS_TOKEN" ``` Always detach a volume from the guest OS before issuing the API detach call to prevent filesystem corruption. ```bash title="Extend volume to 400 GB" theme={null} curl -X POST https://api./volume/v3/volumes/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "os-extend": { "new_size": 400 } }' ``` Extending a volume only expands the block device. After extension, resize the filesystem from inside the guest OS (e.g., `resize2fs` for ext4, `xfs_growfs` for XFS). ```bash title="Change volume type (live migration)" theme={null} curl -X POST https://api./volume/v3/volumes/{id}/action \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "os-retype": { "new_type": "archive-hdd", "migration_policy": "on-demand" } }' ``` Set `migration_policy` to `on-demand` to migrate data immediately, or `never` to only change the type metadata without data migration. ```bash title="Clone an existing volume" theme={null} curl -X POST https://api./volume/v3/volumes \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "volume": { "name": "db-data-01-clone", "size": 200, "source_volid": "" } }' ``` *** ## Snapshots ```bash title="Create a volume snapshot" theme={null} curl -X POST https://api./volume/v3/snapshots \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "snapshot": { "name": "db-data-01-snap-20260318", "volume_id": "", "force": false, "metadata": { "backup_type": "daily" } } }' ``` ```bash title="Create volume from snapshot" theme={null} curl -X POST https://api./volume/v3/volumes \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "volume": { "name": "db-data-restored", "snapshot_id": "", "size": 200 } }' ``` Set `force: true` in the snapshot request to snapshot a volume that is currently attached to a running instance. Ensure the filesystem is quiesced (via `sync` or application-level flush) before forcing a snapshot. *** ## Backups Backups are stored in Xloud Object Storage and are independent of volume availability. ```bash title="Create a full backup" theme={null} curl -X POST https://api./volume/v3/backups \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "backup": { "name": "db-data-01-backup-20260318", "volume_id": "", "incremental": false, "container": "volume-backups" } }' ``` ```bash title="Create incremental backup (faster, less storage)" theme={null} curl -X POST https://api./volume/v3/backups \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "backup": { "name": "db-data-01-incr-20260318", "volume_id": "", "incremental": true } }' ``` ```bash title="Restore backup to a new volume" theme={null} curl -X POST https://api./volume/v3/backups/{backup_id}/restore \ -H "X-Auth-Token: $OS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "restore": { "name": "db-data-01-restored" } }' ``` *** ## Volume Status Reference | Status | Description | | ------------------ | --------------------------------------- | | `creating` | Volume is being provisioned | | `available` | Ready to attach | | `in-use` | Currently attached to an instance | | `deleting` | Deletion in progress | | `extending` | Size extension in progress | | `retyping` | Volume type change in progress | | `backing-up` | Backup in progress | | `restoring-backup` | Backup restore in progress | | `error` | An error occurred — check volume events | | `error_deleting` | Deletion failed | *** ## Next Steps Attach volumes to compute instances via the Compute API Configure networks for your storage-backed instances Configure IOPS and throughput limits for volume types Automate backup workflows with scripts and scheduling # CLI Setup Source: https://docs.xloud.tech/cli-setup Install and configure the command-line interface for managing Xloud Cloud Platform resources. ## Overview The Xloud command-line interface gives you full control over every platform service directly from your terminal. With a single authenticated session you can provision instances, manage volumes, configure networks, and automate infrastructure workflows — without opening a browser. The CLI is compatible with all major operating systems and integrates cleanly into CI/CD pipelines and shell scripts. **Prerequisites** * An active Xloud account with project access * Python 3.8 or later installed on your workstation * Network access to your Xloud API endpoint *** ## Installation Install the Xloud CLI using the package manager for your operating system. ```bash title="Install on Ubuntu / Debian" theme={null} sudo apt update sudo apt install -y python3-pip python3-venv pip3 install python-openstackclient ``` Install into a virtual environment to avoid conflicts with system Python packages: `python3 -m venv ~/.xloud-cli && source ~/.xloud-cli/bin/activate && pip install python-openstackclient` ```bash title="Install on CentOS / RHEL" theme={null} sudo dnf install -y python3-pip pip3 install --user python-openstackclient ``` Add the user bin directory to your PATH if it is not already present: ```bash title="Update PATH" theme={null} echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc source ~/.bashrc ``` ```bash title="Install on macOS (Homebrew)" theme={null} brew install python@3 pip3 install python-openstackclient ``` Alternatively, use `pipx` for an isolated installation: ```bash title="Install with pipx" theme={null} brew install pipx pipx install python-openstackclient ``` ```bash title="Install via pip" theme={null} pip install python-openstackclient ``` Python 3.8 or later is required. Verify with `python3 --version` before installing. Confirm the installation completed successfully: ```bash title="Verify installation" theme={null} openstack --version ``` The command prints the installed version, e.g., `openstack 6.x.x`. *** ## Authentication The CLI authenticates using an RC (credentials) file that sets environment variables for your session. Your administrator provides this file, or you can create it manually. Your administrator provides the RC (credentials) file for your project. This file contains the authentication endpoint, project name, and your username. Alternatively, create the file manually with the following content: ```bash title="openrc.sh" theme={null} export OS_AUTH_URL=https://api.:5000/v3 export OS_PROJECT_NAME= export OS_PROJECT_DOMAIN_NAME=Default export OS_USERNAME= export OS_USER_DOMAIN_NAME=Default export OS_REGION_NAME=RegionOne export OS_IDENTITY_API_VERSION=3 echo "Please enter your Xloud password for project $OS_PROJECT_NAME as user $OS_USERNAME:" read -sr OS_PASSWORD_INPUT export OS_PASSWORD=$OS_PASSWORD_INPUT ``` Each project has its own RC file. Ask your administrator for the correct `OS_AUTH_URL` and `OS_PROJECT_NAME` values for your environment. Open a terminal and source the file to load your credentials into the current shell session: ```bash title="Load credentials" theme={null} source openrc.sh ``` Enter your Xloud account password when prompted. Confirm the CLI can authenticate successfully: ```bash title="Verify token" theme={null} openstack token issue ``` A valid response displays a token ID, expiry, and your project details. Authentication is working. Your session is valid for 1 hour by default. The RC file exports the following environment variables to configure the CLI client. You can also set these manually or store them in a `clouds.yaml` file for multi-cloud management. | Variable | Purpose | | ------------------------- | ------------------------------------ | | `OS_AUTH_URL` | Xloud Identity service endpoint | | `OS_PROJECT_NAME` | Target project for all operations | | `OS_PROJECT_DOMAIN_NAME` | Project domain (typically `Default`) | | `OS_USERNAME` | Your Xloud account username | | `OS_USER_DOMAIN_NAME` | User domain (typically `Default`) | | `OS_REGION_NAME` | Target region for API calls | | `OS_IDENTITY_API_VERSION` | Identity API version (`3`) | *** ## Command Structure Every CLI command follows the same pattern: resource type, action, and optional flags. ``` openstack [options] [arguments] ``` ```bash title="List resources" theme={null} # Pattern: openstack list [--filter value] openstack server list --status ACTIVE openstack volume list --status available openstack network list --internal ``` ```bash title="Create resources" theme={null} # Pattern: openstack create --option value openstack server create \ --flavor m1.medium \ --image ubuntu-24.04 \ --network private \ --key-name my-keypair \ web-server-01 ``` ```bash title="Show / delete resources" theme={null} # Pattern: openstack show openstack server show web-server-01 openstack server show --format json web-server-01 # Pattern: openstack delete openstack server delete web-server-01 ``` Most commands accept either the resource **name** or **UUID** as the final argument. Use UUIDs in scripts to avoid ambiguity when multiple resources share the same name. *** ## Output Formats The CLI supports multiple output formats controlled by the `--format` flag. | Flag | Output Type | Best Used For | | ---------------- | ------------------------------ | ------------------------------------------- | | `--format table` | Human-readable table (default) | Interactive use, quick inspection | | `--format json` | JSON object or array | Scripts, parsing, API-like output | | `--format yaml` | YAML document | Configuration files, readable serialization | | `--format csv` | Comma-separated values | Spreadsheet import, bulk reporting | | `--format value` | Plain values, one per line | Shell variable assignment, `grep` pipelines | ```bash title="JSON output" theme={null} openstack server show my-vm --format json ``` ```bash title="Extract a single field" theme={null} # Use --format value with -c to extract one column openstack server show my-vm --format value -c status ``` ```bash title="CSV for reporting" theme={null} openstack server list --format csv --quote all ``` *** ## Tips and Tricks Add aliases to your shell profile (`~/.bashrc` or `~/.zshrc`) to speed up repetitive tasks: ```bash title="Recommended aliases (~/.bashrc)" theme={null} alias osl='openstack server list' alias ovl='openstack volume list' alias onl='openstack network list' alias oil='openstack image list' alias oss='openstack server show' alias osrc='source ~/openrc.sh' ``` Reload your shell after adding aliases: ```bash title="Reload shell config" theme={null} source ~/.bashrc ``` The CLI ships with a completion script that enables tab-completion for commands, resource names, and flags. ```bash title="Enable bash completion" theme={null} # Add to ~/.bashrc eval "$(openstack complete)" ``` ```zsh title="Enable zsh completion" theme={null} # Add to ~/.zshrc eval "$(openstack complete)" ``` After reloading your shell, press **Tab** after any partial command to see available completions. Pass `--debug` to any command to print the full HTTP request and response, including headers and token details. This is useful for diagnosing authentication errors or unexpected API responses. ```bash title="Debug a failing command" theme={null} openstack server list --debug 2>&1 | less ``` Debug output includes your authentication token. Avoid sharing or storing this output in logs or tickets. Instead of sourcing separate RC files, define all your environments in a single `clouds.yaml` file stored at `~/.config/openstack/clouds.yaml`: ```yaml title="~/.config/openstack/clouds.yaml" theme={null} clouds: xloud-prod: auth: auth_url: https://api.:5000/v3 project_name: production username: your-username password: your-password user_domain_name: Default project_domain_name: Default region_name: RegionOne identity_api_version: 3 xloud-dev: auth: auth_url: https://api-dev.:5000/v3 project_name: development username: your-username password: your-password user_domain_name: Default project_domain_name: Default region_name: RegionOne identity_api_version: 3 ``` Switch between environments using `--os-cloud`: ```bash title="Use a named cloud profile" theme={null} openstack --os-cloud xloud-prod server list openstack --os-cloud xloud-dev server list ``` Set `OS_CLOUD=xloud-prod` in your shell to make a profile the default for all commands in that session. *** ## Service CLI References Each service has a dedicated CLI reference with complete command syntax, options, and examples. Instances, flavors, keypairs, server groups, console, and live migration commands. Volumes, snapshots, backups, volume types, and cross-project transfers. Networks, subnets, routers, floating IPs, security groups, and ports. Upload, download, share, and manage virtual machine images. Heat stacks, resources, events, outputs, and template validation. Projects, users, roles, groups, and application credentials. Load balancers, listeners, pools, members, and health monitors. Zones, record sets, PTR records, and zone transfers. Secrets, containers, orders, and access control lists. Containers, objects, large object uploads, and temporary URLs. Cluster templates, clusters, and node group management. Ceph cluster health, pools, OSDs, RBD images, and RGW buckets. # Advanced Configuration Source: https://docs.xloud.tech/deployment/advanced-config Per-service config file editor with syntax validation and Git version control ## Overview When the [Configuration](/deployment/configuration) forms do not expose a specific setting, Advanced Configuration provides a full code editor for individual service configuration files. It supports YAML, INI, and Jinja2 templates with syntax validation and auto-formatting. Integrated Git version control tracks every change. **Prerequisites** * [Configuration](/deployment/configuration) completed with base settings saved * Services selected for deployment * Understanding of the specific service configuration options being modified *** ## Editor Layout Log in to **XDeploy** (`https://xdeploy.`) on the deployment node using administrative access. Navigate to **Advanced Configuration** in the left sidebar. The editor interface is organized into three panels. Searchable tree of all services organized by category: compute, network, storage, identity, and orchestration. Click a service to browse its configuration files. Full text editor for YAML, INI, and Jinja2 files. Includes syntax validation, auto-formatting, file preview, multi-tab support, and a cursor position status bar. Lists configuration files for the selected service. Toolbar actions include New File, Upload, Download, and Delete. *** ## Editing Configuration Files Use the Service Tree on the left to browse or search for the service you want to configure. Services are organized by category: | Category | Services | | ----------------- | ----------------------------------------------------------- | | **Compute** | Xloud Compute (nova), Libvirt, Scheduler | | **Network** | Xloud Networking (neutron), L3 Agent, DHCP Agent, OVS Agent | | **Storage** | Xloud Block Storage (cinder), Backup | | **Identity** | Xloud Identity (keystone) | | **Orchestration** | Xloud Orchestration (heat) | | **Dashboard** | Xloud Dashboard | | **Monitoring** | Prometheus, Grafana | Click a service name to load its configuration files in the File Browser panel. Select a file from the File Browser to open it in the Code Editor. The editor provides: * **Syntax highlighting** for YAML, INI, and Jinja2 formats * **Validation** that flags syntax errors before saving * **Auto-formatting** to normalize indentation and spacing * **Multi-tab editing** to work on multiple files simultaneously Make your changes in the editor. The validation engine checks for syntax errors in real time. Click **Save** to persist the changes to the configuration directory. The file is saved to the configuration override directory and will be applied during the next deployment or reconfiguration. Use the **Preview** button to view the final rendered configuration before saving. This is especially useful for Jinja2 templates where the rendered output may differ from the source template. *** ## Git Integration Advanced Configuration includes built-in version control for tracking configuration changes. Every modification is trackable, reversible, and auditable. Click **Initialize Git** to create a version control repository in the configuration directory. This is a one-time operation. After initialization, the editor tracks all file modifications. Use **View Diff** to see pending changes before committing them. Commit your changes with a descriptive message. The commit history provides a complete audit trail of who changed what and when. Create a branch before making experimental changes (e.g., `test-nova-tuning`). If something breaks during testing, switch back to the main branch to restore the working configuration instantly. Additional Git operations available in the toolbar: | Operation | Description | | ------------------ | ---------------------------------------------------- | | **Pull** | Fetch and merge changes from a remote repository | | **Push** | Push local commits to a remote repository | | **Branch** | Create, switch, or delete branches | | **Resolve Issues** | Handle merge conflicts when branch histories diverge | Create a branch before making experimental changes. If something breaks, switch back to the main branch to restore working configuration immediately. *** ## How Config Overrides Work The deployment automation supports per-service configuration overrides. Dropping a configuration file into the service-specific override directory merges your custom settings into the deployed configuration on the next **Reconfigure** operation. Override files do not replace the entire service configuration. They are **merged** with the base configuration generated by the deployment automation. Only the specific keys you define in your override file are changed --- all other settings retain their default values. After modifying configuration overrides, you must run a **Reconfigure** operation from the [Operations](/deployment/operations) tool for changes to take effect. Editing files here does not automatically apply changes to running services. *** ## Next Steps Deploy or reconfigure services to apply your configuration changes Return to the guided configuration forms for common deployment settings # Bootstrap Source: https://docs.xloud.tech/deployment/bootstrap Server readiness validation and dependency installation for cloud deployment Bootstrap is the preflight checklist for your server. Before deploying cloud services, every target server must meet hardware requirements and have all software dependencies installed. Bootstrap automates detection, validation, and installation — ensuring a clean foundation for deployment. **Prerequisites** * Physical or virtual server with root or sudo access * Internet connection (required for package installation) * Ubuntu 24.04 LTS (XOS) recommended as the base operating system *** ## Bootstrap Tabs The Bootstrap module is organized into four tabs. Navigate between tabs to inspect specific subsystems or install dependencies. Quick snapshot of server health without modifying anything. Four information cards are displayed: Linux distribution, kernel version, package manager, and XDeploy mode (AIO or Multi-Node) Uptime, CPU load average and usage percentage, memory used vs total Root filesystem type and free space, total disk count, storage type (SSD/HDD) Interface count, internet connectivity, primary IP address, DNS resolution status Quick Actions at the bottom: **Run Hardware Checks** and **Install All Information**. Runs automated hardware requirement checks and shows detailed specifications. Each check shows a green checkmark (pass) or red indicator (fail). **5 Requirement Checks:** | Check | Minimum | Why | | ------------------------------- | -------------------------- | ----------------------------------------------------- | | Root Filesystem | 100 GB | Services, Docker images, and logs | | Network Interfaces | 2 | Management NIC + provider/external NIC | | Additional Disk or Volume Group | Optional | Required for persistent block storage volumes | | CPU Cores | 4 (16+ production) | Control plane needs \~2 cores, compute needs the rest | | RAM | 8 GB (32-64 GB production) | Each service container uses 200-500 MB | Servers below minimums are flagged but not blocked — you can proceed for development and testing. **Hardware Details** (expandable sections): Model name, physical cores, logical threads, architecture (x86\_64/ARM), and hardware virtualization support (VT-x/AMD-V). Virtualization is required for running VMs. Total installed, currently available, in use, and swap size. Root filesystem type (ext4, xfs), all block devices (sda, nvme0n1, etc.), LVM volume groups, and mount points. Identifies disks available for block storage. Active interfaces, link types (ethernet, bond, bridge), all IP addresses, and default gateway. The Dependencies tab validates and installs 7 software groups required for deployment. Each group addresses a specific layer of the deployment stack. ALL 7 dependency groups must pass before proceeding to the next stage. If even one group fails, deployment will break — sometimes 45 minutes in, when a missing library causes a playbook task to fail. | Group | What It Installs | Why | | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Python Dependencies** | git, python3-dev, libffi-dev, gcc, libssl-dev, python3-venv | Ansible modules and Python libraries require compilation of C extensions | | **System Tools** | Monitoring, networking, storage, and virtualization CLI utilities | Ansible playbooks detect interfaces, disks, and containers using these tools | | **Python Environment** | Isolated Python virtual environment | Prevents version conflicts between system Python packages and deployment tooling | | **XDeploy Dependencies** | Ansible + XAVS Deployment Automation | Core deployment engine and service playbooks that provision every cloud component | | **CLI Clients** | nova, neutron, cinder, keystone, swift, octavia, magnum, barbican | Command-line tools for post-deployment management and troubleshooting | | **Configuration Setup** | `/etc/xavs` directory with correct ownership and permissions | Scaffolds the configuration directory structure: globals, inventory, and password files | | **Password Generation** | Auto-generated secure random passwords | Produces 50+ internal passwords for databases, service accounts, and message queue authentication | Use **Install All** to install every dependency group in sequence with a single action. Once a group passes validation, its individual Install button is disabled to prevent accidental re-installation. Every Bootstrap action is recorded in a live scrolling terminal log with timestamps. Use this log to diagnose failures — it captures the full output of every package installation, validation check, and error message. The log persists across page refreshes, so you can return to it at any time during the session. *** ## Validation After all dependency groups are installed, verify readiness: Every dependency group in the Bootstrap interface displays a green status indicator. No group should show a warning or error state. Return to the Overview tab and confirm that hardware values (CPU, RAM, disk, network interfaces) meet or exceed the minimums listed above. The Network tab must show successful internet connectivity and DNS resolution. Offline deployments require pre-staged package archives. All 7 dependency groups installed and passing — the server is ready for the next stage. *** ## Troubleshooting **Cause**: Missing build tools or development headers on the base operating system. **Resolution**: Verify that `build-essential`, `python3-dev`, and `libffi-dev` are available in the system package repository. On XOS, these packages are pre-installed. On other Ubuntu 24.04 installations, run: ```bash title="Install build prerequisites" theme={null} sudo apt update && sudo apt install -y build-essential python3-dev libffi-dev libssl-dev ``` Retry the Python Dependencies installation after installing the missing packages. **Cause**: DNS resolution failure or firewall blocking outbound connections. **Resolution**: Verify that `/etc/resolv.conf` contains valid nameservers and that outbound HTTPS (port 443) is not blocked by a firewall or proxy. Bootstrap requires internet access to download packages from Ubuntu and Python package repositories. ```bash title="Test DNS and connectivity" theme={null} nslookup archive.ubuntu.com curl -s https://pypi.org/simple/ | head -1 ``` **Cause**: Slow or unreliable network connection to package repositories. **Resolution**: Check network throughput between the server and the internet. If using a corporate proxy, ensure the proxy is configured in the system environment variables (`http_proxy`, `https_proxy`). Consider using a local package mirror for air-gapped or bandwidth-constrained environments. *** ## Next Steps Define your cluster inventory and establish SSH connectivity to all nodes Set up networking, storage backends, and enable optional cloud services # Cloud Fleet Source: https://docs.xloud.tech/deployment/cloud-fleet Interactive topology map for visualizing your entire cloud infrastructure Cloud Fleet provides a visual bird's-eye map of your entire cluster. Every host appears as a node in an interactive force-directed graph, colored by health status and connected by network planes. Click any host to inspect live metadata. Use Cloud Fleet to understand relationships between servers, validate high availability placement, and explain architecture to stakeholders. **Prerequisites** * All cluster hosts configured in [Hosts](/deployment/hosts) * At least one successful deployment via [Operations](/deployment/operations) * SSH connectivity established to all nodes *** ## Fleet Dashboard The top statistics bar provides an immediate summary of your entire infrastructure. These values update in real time as Cloud Fleet queries the cluster. | Metric | Description | | ------------------ | ------------------------------------------------------------------------ | | **Hosts Online** | Total number of reachable hosts across all roles | | **Role Groups** | Count of distinct role groups (controller, compute, storage, monitoring) | | **Active Links** | Number of network pathways between hosts currently carrying traffic | | **Overall Health** | Aggregate cluster status: Healthy, Degraded, or Critical | | **Cluster Name** | The configured cluster identifier from your deployment | | **Region** | Geographic or logical region label assigned during configuration | | **Version** | Currently deployed XAVS platform version | A cluster is **Healthy** when all hosts are reachable and all services are running. **Degraded** indicates at least one host or service is in a warning state. **Critical** means one or more hosts are unreachable or core services have failed. *** ## Topology View The topology view is a three-panel layout that displays infrastructure relationships, the interactive map, and detailed metadata simultaneously. Displays role distribution with host counts per role, available network planes (management, storage, external, octavia), and a searchable, filterable host list. Use the search bar to locate specific hosts by name or IP address. SVG force-directed topology graph with drag-to-pan, scroll-to-zoom, and dedicated controls for zoom in, zoom out, fit-to-screen, and reset. Hosts are rendered as color-coded nodes based on health status. Network connections between hosts appear as color-coded lines representing their respective network planes. Click any host node or network connection to populate the inspector panel. Displays: resource type, hostname, metadata (IP addresses, role assignments, installed services), health signals, dependency chain, and related network paths. ### Health Status Colors Each host node in the topology graph is colored by its current health state: | Color | Status | Meaning | | ------ | -------- | -------------------------------------------------------------------- | | Green | Healthy | All services running, host reachable, no active alerts | | Yellow | Warning | One or more services degraded, resource usage approaching thresholds | | Red | Critical | Host unreachable, core service failure, or active critical alert | | Gray | Standby | Host configured but not yet deployed or intentionally powered off | *** ## Network Planes Cloud Fleet visualizes the four distinct network planes that connect your cluster nodes. Each plane is rendered as a separate set of color-coded connections on the topology map. | Plane | Color | Purpose | | ---------- | ------ | --------------------------------------------------------------------- | | Management | Blue | API calls, SSH access, Ansible communication, inter-service messaging | | Storage | Green | Xloud Distributed Storage replication traffic and client I/O | | External | Orange | Virtual machine internet access, floating IP routing | | Octavia | Purple | Load balancer management traffic and health monitor probes | Export the topology as SVG or PNG for architecture documentation and stakeholder presentations. Use the export controls in the top-right corner of the interactive map. If a network plane appears disconnected between two hosts, verify the physical cabling, VLAN tagging, and interface assignment in [Hosts](/deployment/hosts). A missing storage plane connection degrades replication performance and can lead to data unavailability. *** ## Connection Inventory Below the topology map, a tabular inventory lists every link between hosts in the cluster. Use this table to audit connectivity at a glance. | Column | Description | | --------------- | --------------------------------------------------------------------------------- | | **Source** | Originating host name and IP address | | **Destination** | Target host name and IP address | | **Plane** | Network plane this connection belongs to (management, storage, external, octavia) | | **Status** | Connection health: Active, Degraded, or Down | | **Latency** | Measured round-trip time between the two hosts | The connection inventory updates automatically as the topology map refreshes. Filter by plane type or status to focus on specific segments of your infrastructure. *** ## Next Steps Deploy, upgrade, reconfigure, and manage cloud services across the cluster Configure distributed storage tiers and manage the storage cluster # Cluster License Source: https://docs.xloud.tech/deployment/cluster-license License your deployed cloud cluster with hardware-bound activation keys The Cluster License activates your deployed cloud infrastructure. It collects hardware fingerprints from all nodes, generates encrypted license requests, and distributes signed licenses across the cluster. **Prerequisites** * Cloud infrastructure deployed and operational via [Operations](/deployment/operations) * All cluster nodes accessible via SSH from the management node * Access to [license.xloud.tech](https://license.xloud.tech) for license file submission This licenses the **cloud cluster itself** — the deployed infrastructure running your workloads. To license the XDeploy management tool, use [XDeploy Key](/deployment/xdeploy-key) instead. *** ## License Dashboard The License Dashboard presents two panels: an overview of the current license state and a per-node status table. Four summary indicators at the top of the dashboard: | Indicator | Values | | ------------------ | -------------------------------------- | | **License Status** | Active, Expired, or None | | **Days Remaining** | Countdown to license expiration | | **Licensed Nodes** | Number of nodes covered by the license | | **License Type** | Trial or Enterprise | Below the indicators, a details section displays the customer name, issue and expiry dates, and enabled features. Use the **Verify** button to re-validate license integrity against the current hardware state. A per-node table showing which hosts in the cluster have the license installed and verified. Each row displays: | Column | Description | | --------------------- | ------------------------------------------------------------ | | **Hostname** | The node's configured hostname | | **IP Address** | Management network IP | | **License Installed** | Whether the signed license file is present on this node | | **Verified** | Whether the license passes integrity validation on this node | The **Verify** button performs a live integrity check. It re-reads the hardware fingerprint and compares it against the signed license. If hardware has changed (e.g., a node was replaced), the verification will fail and a new license request is required. *** ## Activation Process Click **Request License** to open the license generation modal. The tool scans all cluster nodes over SSH and collects hardware fingerprints including server UUID and Machine ID. A preview displays before generating the request: | Field | Description | | --------------- | ------------------------------------------- | | **Total Nodes** | Number of hosts discovered in the cluster | | **CPU Sockets** | Total physical CPU sockets across all nodes | | **Total Cores** | Aggregate CPU core count across the cluster | The tool generates an encrypted `.xlic` request file. Download this file to your local machine. The `.xlic` request file contains only hardware fingerprints — no sensitive data such as passwords, IP addresses, or configuration details are included. Upload the `.xlic` request file to [license.xloud.tech](https://license.xloud.tech). After validation, you receive a signed license file in return. License processing is typically immediate for existing customers with active support agreements. New customers may require manual approval. Return to the Cluster License page in XDeploy. Drag and drop the signed `.xlic` file into the upload area. The tool validates the digital signature and confirms the license details before installation. Click **Activate** to distribute the license to all Dashboard nodes via automation. The tool connects to each node over SSH, installs the license file, and verifies integrity. License installed and verified on all cluster nodes. The cluster is fully activated. *** ## License Features The license controls which features are available in the Xloud Dashboard and enforces node count limits. Without a valid license, the cloud infrastructure runs with restricted functionality. | Aspect | Licensed | Unlicensed | | ---------------------- | ------------------------------------ | --------------------------- | | **Node Count** | Up to the licensed maximum | Limited to evaluation count | | **Dashboard Features** | All enabled features accessible | Core features only | | **Support Access** | Full support based on agreement tier | Community support only | | **Updates** | Access to platform updates | Updates restricted | An expired license does not shut down running workloads, but it prevents new deployments, configuration changes, and Dashboard access to premium features. Renew before expiration to avoid operational disruptions. *** ## Troubleshooting **Cause**: The hardware fingerprint of the replacement node does not match the original fingerprint in the signed license. **Resolution**: Generate a new license request that includes the updated hardware fingerprint. Upload the new request to [license.xloud.tech](https://license.xloud.tech) and install the new signed license file. **Cause**: The `.xlic` file was corrupted during download or transfer, or the file was modified after signing. **Resolution**: Re-download the signed license file from the license portal. Ensure no text editors or transfer tools modify the file content (binary-safe transfer required). Upload the file again. **Cause**: SSH connectivity issues between the management node and the target node, or insufficient permissions on the target node. **Resolution**: Verify SSH connectivity from the management node to the failing node. Confirm that the deployment user has write access to the license directory. Check the [Hosts](/deployment/hosts) configuration for SSH credential issues. *** ## Next Steps Activate the XDeploy management platform with a hardware-bound license Create users, projects, and quotas for your activated cluster # Configuration Source: https://docs.xloud.tech/deployment/configuration Configure networking, storage, monitoring, and security settings for your cloud deployment ## Overview Configuration is the main settings interface for your entire cloud. All settings are saved to `globals.yml` --- the master deployment configuration file that controls every aspect of your environment. Instead of editing YAML manually, XDeploy provides forms, dropdowns, toggles, and validation across eight configuration tabs. **Prerequisites** * Bootstrap completed on the deployment server * Hosts configured with verified SSH access * Network interface names identified on all target servers * Virtual IP (VIP) addresses planned for your management subnet *** ## Configuration Tabs Log in to **XDeploy** (`https://xdeploy.`) on the deployment node using administrative access. Navigate to **Configuration** in the left sidebar. The configuration interface is organized into eight tabs, each handling a distinct area of your deployment settings. The primary settings tab covering networking, domains, and TLS configuration. These settings form the foundation of your entire deployment. *** ### Network Configuration | Field | Required | Description | | ------------------------------------ | -------- | --------------------------------------------------------------------------------------------------------------------- | | **API/Management Network Interface** | Yes | Select the NIC used for management traffic. Auto-fills the Internal VIP field based on the selected interface subnet. | | **Internal VIP Address** | Yes | Virtual IP for internal API calls. Floats between controllers via HAProxy for high availability. | | **External VIP Address** | No | Public-facing VIP for external access and the Xloud Dashboard. Required only if external access is needed. | The Internal VIP is the single most important setting in your deployment. If it is wrong, nothing works. Ensure it is an **unused** IP address on the management subnet that does not conflict with any existing host. *** ### Domain Configuration | Field | Description | | ----------------------- | ----------------------------------------------------------------------------------------------------- | | **Enable Domain Setup** | Toggle to configure FQDNs instead of raw IP addresses for service endpoints | | **Internal FQDN** | Hostname for internal API endpoints (e.g., `xavs-int.example.com`). Must resolve to the Internal VIP. | | **External FQDN** | Hostname for external access (e.g., `xavs.example.com`). Must resolve to the External VIP. | *** ### TLS/SSL Configuration Visible when Domain Setup is enabled. Configure certificate-based encryption for API endpoints. | Field | Description | | -------------------- | ----------------------------------------------------------------------------------------------------- | | **Internal API TLS** | Toggle to enable TLS for internal service communication. Upload the certificate and private key. | | **External API TLS** | Toggle to enable TLS for the public-facing Dashboard and API. Upload the certificate and private key. | Certificates are saved to `/etc/xavs/certificates/` on the deployment node and distributed to all controllers during deployment. For production deployments, always enable TLS on external endpoints. Internal TLS is recommended when the management network is shared or untrusted. Configures the Xloud Networking service --- interfaces, provider networks, and optional networking features. *** ### External Interface | Field | Description | | ------------------------------ | ------------------------------------------------------------------------------------ | | **External Interface Mode** | **Single** (one NIC for all external traffic) or **Multiple** (per-host NIC mapping) | | **Neutron External Interface** | The NIC used for provider networks and external VM connectivity | The selected external interface **loses its current IP address** after deployment. It is enslaved to a network bridge for provider traffic. Ensure this NIC name exists on **all hosts** that require external connectivity. *** ### Feature Toggles | Feature | Default | Purpose | | --------------------- | ------- | ------------------------------------------------------------------ | | **Provider Networks** | ON | Direct VM connection to physical networks, floating IP support | | **VPNaaS** | OFF | Site-to-site VPN tunnels between tenant networks | | **QoS** | OFF | Bandwidth limits, DSCP marking, minimum rate guarantees | | **Trunk** | OFF | 802.1Q VLAN trunking on VM ports | | **Agent HA** | OFF | High availability for L3 and DHCP agents across multiple nodes | | **SR-IOV** | OFF | Hardware-accelerated networking via Single Root I/O Virtualization | Feature toggles marked OFF are premium or specialized capabilities. Enable them based on your workload requirements. Each can be activated at any time via reconfiguration. Configures Xloud Block Storage --- the persistent volume service for VM disks. *** ### Service Toggles | Field | Description | | ------------------------------- | ---------------------------------------------------------------------------------- | | **Enable Block Storage** | Master switch for the volume service. Disabling removes all storage functionality. | | **Enable Block Storage Backup** | Enables volume backup and restore capabilities | | **Storage Backend Type** | **Single** (one backend) or **Multiple** (tiered storage with multiple backends) | *** ### Backend Options | Backend | Description | Best For | | ---------------- | ----------------------------------------------- | ------------------------------------------- | | **LVM** | Local disk volumes using Logical Volume Manager | Single-node deployments, testing | | **Ceph RBD** | Distributed replicated block storage | Production, high availability (recommended) | | **NFS** | Network file share as a volume backend | NAS appliance integration | | **iSCSI** | Block storage over the network | Enterprise SAN arrays | | **VMware VMDK** | VMware datastore volumes | VMware-integrated environments | | **Pure Storage** | FlashArray via iSCSI, Fibre Channel, or NVMe | High-performance enterprise storage | For production multi-node deployments, Xloud recommends **Ceph RBD**. It provides data replication across nodes, eliminating single points of failure for VM disks. Configures the Xloud Load Balancer service for distributing network traffic across backend instances. *** ### Enable Load Balancer | Field | Description | | ------------------------ | ----------------------------------------------------------------------- | | **Enable Load Balancer** | Master switch to enable the load balancer service across the deployment | Enabling the load balancer service deploys additional infrastructure components including controller agents and amphora VMs. Ensure sufficient compute capacity before enabling. *** ### Controller Interface | Field | Description | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------- | | **LB Management Network Interface** | Select the network interface used for load balancer management traffic between the controller and amphora instances | *** ### Amphora Network Configuration Configure the dedicated management network used for communication between the load balancer controller and amphora instances. | Field | Description | | -------------------- | --------------------------------------------------------------- | | **Network Name** | Name for the load balancer management network | | **Network CIDR** | Subnet range for the management network (e.g., `172.24.0.0/24`) | | **Physical Network** | The underlying physical network for the management VLAN | | **VLAN ID** | VLAN tag for isolating load balancer management traffic | | **IP Pool Start** | First IP address in the allocation pool for amphora instances | | **IP Pool End** | Last IP address in the allocation pool for amphora instances | *** ### Amphora Flavor Configuration Define the compute resources allocated to each amphora instance. Amphora instances are lightweight VMs that perform the actual load balancing. | Field | Default | Description | | --------- | ------- | ------------------------------------------- | | **vCPUs** | 2 | Number of virtual CPUs per amphora instance | | **RAM** | 4096 MB | Memory allocation per amphora instance | | **Disk** | 20 GB | Root disk size per amphora instance | *** ### Topology | Option | Description | | ------------------- | -------------------------------------------------------------------------------------------- | | **SINGLE** | One amphora instance per load balancer. Suitable for non-critical workloads. | | **ACTIVE\_STANDBY** | Two amphora instances per load balancer with automatic failover. Recommended for production. | *** ### Certificate Configuration Configure the certificate authority parameters used for secure communication between the load balancer controller and amphora instances. | Field | Description | | ---------------- | ----------------------------------------------------------- | | **Country** | Two-letter country code for the CA certificate (e.g., `US`) | | **State** | State or province for the CA certificate | | **Organization** | Organization name for the CA certificate | | **Org Unit** | Organizational unit for the CA certificate | The ACTIVE\_STANDBY topology provides high availability for load balancers at the cost of double the amphora resources. For production deployments, always use ACTIVE\_STANDBY. Configure observability, logging, and security monitoring for your cloud environment. | Feature | Default | Description | | -------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------- | | **Enable Prometheus** | OFF | Metrics collection from all cloud services and infrastructure | | **Enable Grafana** | OFF | Visual dashboards for metrics visualization and analysis | | **Enable Central Logging** | OFF | Aggregated log search and analysis across all nodes | | **Enable Security Suite** | OFF | Integrated SIEM, vulnerability scanning, OS hardening, and security posture dashboard (visible when Central Logging is enabled) | *** ### CIS Compliance Level Visible when Security Suite is enabled. Select the compliance benchmark level: | Level | Description | | ----------- | ------------------------------------------------------------------------------ | | **Level 1** | Essential security controls with minimal performance impact | | **Level 2** | Extended controls for high-security environments | | **STIG** | Defense-grade hardening based on DISA Security Technical Implementation Guides | | **All** | Apply all available compliance benchmarks | *** ### Alert Configuration Visible when Prometheus is enabled. Configure alert delivery channels. | Field | Description | | --------------- | ---------------------------------------------- | | **SMTP Server** | Mail server for email alert delivery | | **Alert Email** | Recipient address for alert notifications | | **Webhook URL** | HTTP endpoint for webhook-based alert delivery | Each channel includes a **Test** button to verify connectivity before deployment. Configure at least one alert channel before deploying to production. Without alerts, critical infrastructure issues may go undetected. Enable or disable premium and specialized services. Each toggle activates the corresponding service and its dependencies during deployment. | Feature | Default | Description | | --------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Enable KMS** | OFF | When enabled, the Xloud Key Management service (Barbican) is deployed for secret storage, encryption keys, and certificate management | | **Enable Host HA** | OFF | Enable high availability for hosts. Automatically detects and recovers from compute node failures by evacuating affected instances to healthy nodes. | | **Enable Dynamic Cluster Optimization** | OFF | Enable the dynamic cluster optimization service for automated workload balancing, resource consolidation, and thermal management across the cluster | | **Enable DB Backup Utility** | OFF | Enable the database backup utility for scheduled and on-demand backups of cloud service databases | | **Enable ProxySQL** | OFF | Enable ProxySQL for database load balancing and query routing across multiple database replicas | | **Enable Disk Encryption** | OFF | Enable disk encryption using key management for volume-level encryption at rest. Requires KMS to be enabled first. | | **Enable Insecure Registry** | OFF | Enable custom Docker registry configuration (`docker-registry:4000`) for internal container image distribution | **Enable Disk Encryption** depends on **Enable KMS**. If KMS is not enabled, the disk encryption toggle has no effect. Enable KMS first, then enable disk encryption. These are premium or specialized capabilities that are disabled by default. Enable them based on your workload requirements. Each feature can be activated at any time via reconfiguration and redeployment. A raw YAML editor for deployment settings not covered by the other tabs. Content entered here is appended directly to `globals.yml` during deployment. | Field | Description | | ------------------------ | ----------------------------------------------------------------- | | **Custom Configuration** | Raw YAML key-value pairs appended to the deployment configuration | | **Documentation** | Free-text area for comments and notes about custom settings | Use Custom Configuration as an escape hatch. There are hundreds of deployment variables available in the underlying automation --- the other tabs cover the most common ones. Consult the [xavs-ansible variable reference](https://docs.xloud.tech) for the full list. ```yaml title="Example custom configuration" theme={null} nova_compute_virt_type: "kvm" neutron_plugin_agent: "openvswitch" haproxy_max_connections: 40000 ``` View the history of configuration changes --- what was saved, when it was saved, and what changed between versions. XDeploy automatically backs up the last **5 versions** of your configuration. If a configuration change causes issues, you can review previous versions to identify what changed. | Column | Description | | ------------- | ----------------------------------------- | | **Timestamp** | Date and time the configuration was saved | | **Changes** | Summary of fields that were modified | | **Version** | Sequential version number for tracking | *** ## Next Steps Pull or extract container images required for deploying cloud services Deploy, upgrade, reconfigure, and manage cloud services across your cluster # Hosts Source: https://docs.xloud.tech/deployment/hosts Build your cluster inventory, configure SSH access, and manage target nodes ## Overview Hosts is where you build your cluster inventory --- the list of servers that form your cloud. Define which servers exist, their IP addresses, assign roles (controller, compute, storage), and set up SSH for remote configuration. Every server that participates in your cloud must be registered here before deployment can proceed. **Prerequisites** * Bootstrap completed on the deployment server * IP addresses of all target servers * SSH credentials (username and password) for all target servers * Network connectivity between the deployment node and every target server *** ## Deployment Modes Everything on **one server**. For labs, demos, and testing environments. XDeploy auto-detects the local hostname and IP address, then assigns all roles to localhost. No SSH configuration is required --- the deployment node is also the target. Production setup with **separate servers** for different roles. Supports high availability, horizontal scaling, and workload isolation. Each server is assigned one or more roles and connected via SSH for remote configuration management. *** ## Node Roles Every server in your cluster is assigned one or more roles that determine which services run on it. The following table describes each role and the services it hosts. | Role | Purpose | Services | | ------------------- | --------------------- | ------------------------------------------------------------------------------------------------------- | | **Controller** | Cloud control plane | Xloud Identity, Xloud Dashboard, Xloud Compute API, Xloud Networking Server, MariaDB, RabbitMQ, HAProxy | | **Network** | Network agents | L3 Router Agent, DHCP Agent (often combined with Controller) | | **Compute** | Virtual machine hosts | Xloud Compute, Libvirt --- where VMs run | | **Storage** | Persistent volumes | Xloud Block Storage volumes --- where VM disk data lives | | **Monitoring** | Observability stack | Prometheus, Grafana, logging services | | **XAVS-Deployment** | Ansible controller | Runs deployment playbooks (usually the same server as Controller) | | **XSDS-Bootstrap** | First storage node | Bootstraps the Xloud Distributed Storage cluster | | **XSDS** | Storage nodes | Additional Xloud Distributed Storage nodes | A single server can hold multiple roles. In smaller deployments, it is common to combine Controller, Network, and XAVS-Deployment on the same server. *** ## Hosts Tabs The Hosts module is organized into four tabs. Each tab handles a distinct part of the cluster inventory and connectivity workflow. The Hosts tab is where you register servers into the cluster inventory. Choose your deployment mode first (AIO or Multi-Node), then add hosts using one of three methods. Three ways to add hosts: Add one host at a time through the form. Enter hostname (e.g., xd1.example), IP address, SSH port (default 22), then select roles using the toggle buttons: Controller, Network, Compute, Storage, Monitoring, XAVS-Deployment, XSDS-Bootstrap, XSDS. Click **Ping** to verify connectivity before adding. Paste multiple hosts, one per line: `hostname,ip,roles` (roles separated by `|` or `;`). ```text title="Example" theme={null} ctrl-01,192.168.1.10,controller|network|xavs-deployment compute-01,192.168.1.11,compute compute-02,192.168.1.12,compute|storage ``` Click **Preview** to verify, **Ping All** to check connectivity, then **Commit** to add. Upload a JSON or CSV file with host definitions. Download sample files for the correct format. Useful for replicating host configs across environments. **Network Scanner**: Enter a subnet (e.g., `192.168.1.0/24`) and click **Scan Network** to discover responsive hosts automatically. **Node Inventory Table**: Shows all added hosts with columns for Hostname, IP, Port, Roles (as colored badges), Ping status, SSH status. Searchable and paginated with **Ping All** and **SSH Check All** buttons. The inventory table generates the Ansible inventory file automatically — you never need to manually edit the nodes file. SSH connectivity is required for XDeploy to remotely configure and deploy services on every node. The SSH Access tab handles key generation, distribution, and connectivity verification. Select which hosts to configure SSH for. Quick-select buttons: **ALL**, **CTRL**, **NET**, **COMP**, **STOR**. Individual checkboxes also available. Enter the SSH username and password. Used **once** to copy the SSH public key — after that, password-based auth is no longer needed. Generates an SSH key pair (if needed), distributes the public key to every selected host via `ssh-copy-id`. Adds `docker-registry` hostname to `/etc/hosts` on each node so all servers can pull container images from the local registry. Tests SSH connectivity to every host. Green = ready for deployment, red = check credentials or firewall. After SSH keys are working, use **Disable Password Auth** to prevent brute-force attacks on production deployments. Manages hostname resolution across the cluster. Many services communicate using hostnames, not just IP addresses. This tab distributes hostname-to-IP mappings to `/etc/hosts` on every node. If a compute node cannot resolve the controller hostname, internal API calls fail silently. Always verify DNS resolution after setup. The Logs tab records all host management operations with timestamps --- SSH key distribution, host additions, connectivity tests, and DNS distribution results. Use this log to diagnose SSH failures or trace when hosts were added or modified. *** ## Next Steps Configure networking, storage, monitoring, and security settings for your deployment Deploy, upgrade, reconfigure, and manage cloud services across your cluster # Images Source: https://docs.xloud.tech/deployment/images Manage Docker container images and local registry for cloud service deployment Every cloud service in your Xloud environment runs inside a Docker container. Before deployment, container images must be available on every target server. The Images tool helps you pull, extract, store, and distribute container images. This is a critical step for both online and air-gapped (offline) deployments. **Prerequisites** * [Bootstrap](/deployment/bootstrap) completed with all dependency groups passing * Docker installed and running on all target nodes * Network connectivity to the internet (online mode) or a `.tar.gz` image archive file (offline mode) *** ## Overview Tab The Overview tab provides a real-time status dashboard for Docker and the local registry without modifying anything on the system. Running status, installed Docker version, and total number of locally cached images on the current server. Registry container (`docker-registry:4000`) operational status and total stored image count. The registry serves images to all cluster nodes over the internal network. Action buttons to Deploy, Start, and Stop the local registry container. Deploy creates the container for the first time; Start and Stop manage its lifecycle afterward. The local registry runs as a Docker container listening on port 4000. It is accessible to all cluster nodes at `docker-registry:4000` — no TLS required for internal communication. *** ## Getting Images Container images can be loaded from two sources depending on your network environment. After loading images into Docker, push them to the local registry so all cluster nodes can access them. Use this tab to load container images from offline archives or pull them from an online registry. The tab provides two sub-tabs: **Extract** for offline deployments and **Pull** for online deployments. *** ### Extract (Offline) Use Extract when your servers have no internet access or when deploying in air-gapped environments. Images can be loaded from two sources: Load images directly from a USB storage device connected to the deployment server. This is the primary method for air-gapped data centers where images are delivered on physical media. Connect the USB storage device containing the image archive to the deployment server. The tool automatically detects connected USB storage devices and displays them in the **USB Storage Detection** section. Browse the detected USB device and select the `.tar.gz` image archive file. The tool displays the archive filename and size for confirmation. Set the **Destination** path (default: `/var/lib/xavs/images`) and click **Copy to Server** to transfer the archive from the USB device to local server storage. This ensures extraction runs from local disk for maximum performance. Copying from USB to local storage first avoids slow extraction speeds caused by USB transfer rates. The default destination has sufficient space for full release archives. After the copy completes, click **Extract & Load Images** to decompress the archive and load all container images into the local Docker daemon. Load images from an archive file already present on the server's local storage. Use this when the archive was transferred via SCP, SFTP, or other file transfer methods. Browse the server filesystem and select the `.tar.gz` image archive file. The tool validates the archive format before proceeding. Click **Extract** to load all images from the archive into the local Docker daemon. This process reads each image layer from the archive and registers it with Docker. Extraction duration depends on archive size and disk speed. A full release archive typically takes 5-15 minutes to extract. After extraction completes from either source, click **Push to Local Registry** to distribute all loaded images to `docker-registry:4000`. This makes images available to every node in the cluster. *** ### Pull (Online) Use Pull when the deployment node has internet access and can reach the Xloud cloud registry. Confirm that the deployment node can reach the Xloud container registry over HTTPS. The tool tests connectivity automatically and displays the result. Click **Pull** to download all required container images from the configured image catalog. Each image is downloaded with its full layer chain and stored in the local Docker daemon. After pulling completes, push all images to the local registry so cluster nodes pull from the internal network instead of the internet during deployment. A local registry makes image pulls instant and deterministic across the cluster. Without it, multiple nodes pulling simultaneously from the internet is slow and unreliable — especially during initial deployment when 50+ images are needed. *** ## Registry Management The local Docker registry is the central image distribution point for your cluster. All nodes pull container images from this registry during deployment and scaling operations. Creates and starts the `docker-registry` container for the first time. The registry listens on port 4000 and stores images in a persistent Docker volume. Lifecycle controls for the registry container. Stop halts the registry; Start resumes it. Stored images persist across restarts in the backing volume. Displays the complete catalog of images stored in the registry, including all available tags per image. Use this view to verify that all required service images are present before running deployment. Shows disk space consumed by the registry volume. Large environments with multiple image versions can consume significant storage — monitor usage and clean up unused tags periodically. Removes old or unused image tags from the registry to reclaim disk space. Exercise caution — deleting an image that a running container depends on prevents that container from restarting. The local registry serves images to your entire cluster. If it goes down, new containers cannot start during maintenance, scaling operations, or node recovery. Keep the registry running at all times in production. *** ## Docker Configuration The Images tool provides an editor for `/etc/docker/daemon.json` — the Docker daemon configuration file. Changes here affect how Docker pulls, stores, and logs container images. | Setting | Purpose | Default | | ------------------------- | -------------------------------------------------------------------- | ----------------------- | | **Insecure Registries** | Allow Docker to pull from `docker-registry:4000` over HTTP (non-TLS) | `docker-registry:4000` | | **Registry Mirrors** | Configure Docker Hub mirror URLs for faster or cached pulls | None | | **Storage Driver** | Set the filesystem driver for image layer storage | `overlay2` | | **Logging Configuration** | Configure container log rotation to prevent disk exhaustion | JSON file with rotation | The most common deployment issue is Docker refusing to pull from the local registry because `docker-registry:4000` is not listed as an insecure registry. Verify this setting on every node before running deployment. Changes to the Docker daemon configuration require a Docker service restart to take effect. Restarting Docker stops all running containers briefly — schedule configuration changes during maintenance windows on production clusters. *** ## Validation After loading images and configuring the registry, verify readiness before proceeding to deployment. The Overview tab shows the local registry with a green running status. Confirm the stored image count matches the expected number for your release version. Browse the registry catalog and verify that all core service images are present — including compute, networking, identity, storage, and dashboard images. From a compute or storage node, verify that Docker can pull an image from the local registry: ```bash title="Test registry pull from a cluster node" theme={null} docker pull docker-registry:4000/xloud/nova-compute:2025.1 ``` A successful pull confirms that the registry is accessible from across the cluster. Registry running, all images loaded, and cross-node pulls verified — images are ready for deployment. *** ## Troubleshooting **Cause**: The local registry is not listed as an insecure registry in the Docker daemon configuration. **Resolution**: Open the Docker Configuration section in the Images tool and add `docker-registry:4000` to the insecure registries list. Restart the Docker daemon after saving the change. Repeat on every node in the cluster. **Cause**: The `.tar.gz` archive was corrupted during transfer. **Resolution**: Re-download or re-transfer the archive file and verify its integrity using the checksum provided with the release. Retry extraction after replacing the corrupted file. **Cause**: Port 4000 is already in use by another process, or the Docker volume is corrupted. **Resolution**: Check for port conflicts with `ss -tlnp | grep 4000`. If no conflicts exist, remove and redeploy the registry container to recreate the volume from scratch. *** ## Next Steps Deploy cloud services across the cluster using the loaded container images Review and adjust cloud service configuration before deployment # XDeploy Platform Source: https://docs.xloud.tech/deployment/index Complete deployment and lifecycle management for your Xloud cloud infrastructure XDeploy is the deployment and management platform that transforms bare servers into a fully operational cloud infrastructure. It provides a guided wizard-style interface for every stage. This covers server preparation, hardware validation, production deployment, and ongoing lifecycle management. **Prerequisites** — Before starting any deployment workflow, ensure you have: * Physical or virtual servers running [XOS](/products/xos) * Root or sudo access on all target nodes * Network connectivity between all cluster nodes * A valid XDeploy activation key from [license.xloud.tech](https://license.xloud.tech) *** ## Full Deployment Walkthrough
End-to-end XDEPLOY walkthrough — activation, hosts, XSDS storage, cluster configuration, load balancer, monitoring, advanced features, cluster licensing, and the Operations workflow that brings the cluster live. Watch this before you begin — the 20-minute tour covers every module and decision point you will hit during a production deployment.