8.7 KiB
Aether — Management Platform for Incus + OVN
Aether is a web-based management application that connects to Incus clusters and Operations Center instances. It provides VM/container deployment via blueprints, OVN network management, NSX firewall rule translation to OVN ACLs, HAProxy load balancer management, Ansible automation, and RBAC.
Deployment
Requirements
- Image: Ubuntu Noble (24.04) golden image (~6.6 GiB compressed, 200 GiB virtual disk)
- Resources: 8 GiB RAM minimum
- Networking: needs direct LAN/VLAN access (macvlan recommended)
- Services: PostgreSQL (bundled), FFSDN Go application on port 8443
Deployment on Incus cluster
# Import image
incus image import sources/aether-golden-image-v6.tar.gz \
--alias aether-golden-image-v6 <remote>:
# Create VM (200 GiB disk required — qcow2 virtual size)
incus init <remote>:aether-golden-image-v6 <remote>:aether --vm \
--target <node> --config limits.memory=8GiB -d root,size=200GiB
# Configure macvlan networking for direct VLAN access
incus config device remove <remote>:aether eth0 2>/dev/null
incus config device add <remote>:aether eth0 nic nictype=macvlan parent=mgmt
# Start and wait ~30s for boot
incus start <remote>:aether
# Run post-deploy (configures static IP, regenerates SSH keys, sets up DB)
incus exec <remote>:aether -- /home/ffsdn/post_deploy.sh <IP/PREFIX> <GATEWAY> <DNS>
Disk size considerations
The golden image is a qcow2 with 200 GiB virtual size but only ~11 GiB actual data. The target node must have at least 200 GiB of allocatable storage (even if thin-provisioned). On a fresh IncusOS node with a 64 GiB disk, only ~29 GiB is free after the OS. Nodes with 50 GiB disks (~8.5 GiB free) cannot host Aether. Target the node with the most available storage.
Lab deployment details
| Setting | Value |
|---|---|
| VM name | aether |
| Location | oc-node-01 |
| IP | 192.168.102.160/22 (VLAN 69) |
| Gateway | 192.168.100.1 |
| DNS | 192.168.100.1 |
| Port | 8443 (HTTPS) |
| RAM | 8 GiB |
| Disk | 200 GiB (virtual), ~11 GiB actual |
Web UI
Access at https://<IP>:8443. Default credentials: admin / (set during setup).
Post-deploy script
/home/ffsdn/post_deploy.sh performs 7 steps:
- Configure network (netplan)
- Apply network configuration
- Regenerate SSH host keys
- Wait for FFSDN to create PostgreSQL user
- Transfer database ownership
- Transfer table and sequence ownership
- Restart FFSDN service
The script deletes itself after successful execution.
Navigation
The sidebar provides access to all features:
| Menu Item | URL Path | Description |
|---|---|---|
| Home | /home |
Dashboard, welcome page |
| Manage Global FW rules | /global-acls |
Global firewall / ACL management |
| Manage Cluster FW rules | (submenu) | Per-cluster firewall rules |
| Manage RBAC | (submenu) | Role-based access control |
| Manage VMs/Containers | /infra |
View and manage instances |
| Deploy VM/Container/Blueprint | /deploy |
Launch new workloads |
| Deployed Blueprints | /deployedblueprints |
Track blueprint deployments |
| Blueprint Design | /blueprintdesign |
Create deployment templates |
| Ansible Automation | /awx-endpoints |
Ansible playbook management |
| Manage INCUS Clusters | /incus-infra |
Connect and manage Incus clusters |
| Operations Center | /operationcenter |
Connect to OC instances |
| HAProxy Load Balancers | /haproxy |
Load balancer configuration |
| Trace Network Flow | /traceflow |
Network flow analysis (NSX → OVN ACL translation?) |
| View Live GO Log | /logs/live |
Real-time application logs |
| AETHER Ledger | /logs |
Audit/activity ledger |
| View Sync Logs | /synclogs |
Synchronization logs |
| AETHER Health | /health |
System health checks |
| Change Password | /change-password |
Change admin password |
| Licensing | /licensing |
License management |
| Settings | /settings |
Application settings |
Initial Setup
Step 1: Connect Incus Cluster
Navigate to Manage INCUS Clusters (/incus-infra) → click
Add/Edit/Delete INCUS clusters from/to AETHER.
The form requires:
- Cluster Name: label for this cluster (e.g.,
oc-lab-cluster) - URL: Incus API endpoint (e.g.,
https://192.168.102.141:8443) - Trust Token: generated on the cluster
Generate a trust token on the Incus cluster:
incus config trust add <remote>:AETHER
Paste the token into the form and click Add Cluster. The cluster appears in the "Current INCUS Clusters" table with its TLS certificate fingerprint and expiry date.
After adding, select the cluster from the Select Cluster dropdown on the INCUS Infrastructure Management page. This loads the cluster dashboard with tabs:
| Tab | Description |
|---|---|
| Clustering: Members | Cluster nodes with status, memory, load, roles |
| Clustering: Cluster Groups | Logical groupings of nodes |
| Storage: Pools | Storage pool configuration |
| Storage: Volumes | Storage volume management |
| Profiles | Instance profiles with devices and config |
| Operations | Running and completed operations |
| Warnings | Cluster warnings |
| Settings | Cluster configuration |
| Images | Cached images across the cluster |
| Configuration | Cluster-level config keys |
| Instances | All instances with actions (Start/Stop/Migrate/Console/etc.) |
| Networking | Networks (bridge, OVN, physical) with View/Edit |
| ACLs | Network ACL management |
| Address Sets | Address set management for ACLs |
| OS | IncusOS node management |
The Instances tab provides per-instance action buttons: Start, Restart, Freeze, Unfreeze, Stop, Migrate, Snapshot, Console, Logs, Delete. Instances can be filtered by type (VM/Container) and status. Each row shows name, type, status, IPv4, memory usage, image, snapshots, and location (cluster member).
The Cluster Members view shows real-time memory and load bars per node, OVN roles, and an Evacuate action button.
Step 2: Connect Operations Center
Navigate to Operations Center (/operationcenter) → click
+ Add Operations Center.
The form requires:
- Name: label for this OC (e.g.,
oc-lab) - URL: OC API endpoint (e.g.,
https://192.168.102.120:8443) - Certificate (PEM): client TLS certificate (PEM format)
- Private Key (PEM): matching private key (PEM format)
Unlike Incus (which uses trust tokens), OC uses mutual TLS — Aether
connects with a client certificate that must already be in the OC trust store.
Use the same client.crt and client.key that were injected into the OC
seed during deployment (typically at ~/.config/incus/client.crt and
~/.config/incus/client.key).
Click Test Connection to verify — a successful test shows:
Connected! API: 1.0 (devel).
Click Save to add the OC. The OC appears in the "Configured Operations Centers" table with status, fingerprint, last connected timestamp, and Edit/Test/Delete actions. A green Manage badge indicates an active connection.
Connection comparison
| Incus Cluster | Operations Center | |
|---|---|---|
| Auth method | Trust token | Mutual TLS (client cert + key) |
| Token/cert source | incus config trust add |
Existing client cert from ~/.config/incus/ |
| API version | Incus REST API | OC API 1.0 |
| Port | 8443 | 8443 |
Lab State After Setup
Connected infrastructure
| Connection | Name | URL | Status |
|---|---|---|---|
| Incus Cluster | oc-lab-cluster | https://192.168.102.141:8443 | Connected |
| Operations Center | oc-lab | https://192.168.102.120:8443 | Connected |
Cluster members (as seen in Aether)
| Node | URL | Status | Memory | Load | Roles |
|---|---|---|---|---|---|
| oc-node-01 | https://192.168.102.140:8443 | Online | 35% (5.5/16.0 GB) | 19% | ovn-chassis, database |
| oc-node-02 | https://192.168.102.141:8443 | Online | 92% (14.7/16.0 GB) | 28% | ovn-chassis, database-leader |
| oc-node-03 | https://192.168.102.142:8443 | Online | 54% (8.7/16.0 GB) | 25% | ovn-chassis, database |
Instances visible in Aether
| Name | Type | Status | IPv4 | Image | Location |
|---|---|---|---|---|---|
| aether | VM | Running | 192.168.102.160 | ubuntu noble | oc-node-01 |
| ovn-central | Container | Running | 10.207.217.23 | Debian bookworm | oc-node-02 |
| ha-web-02 | Container | Stopped | 10.10.10.3 | Debian bookworm | oc-node-02 |
| ha-web-03 | Container | Stopped | 10.10.10.4 | Debian bookworm | oc-node-03 |
Networks visible in Aether
| Name | Type | IPv4 | Uplink | NAT | Used By |
|---|---|---|---|---|---|
| UPLINK | physical | 192.168.100.1/22 | - | - | 1 |
| incusbr0 | bridge | 10.207.217.1/24 | - | IPv4, IPv6 | 2 |
| meshbr0 | bridge | none | - | IPv6 | 1 |
| net-prod | ovn | 10.10.10.1/24 | UPLINK | IPv4, IPv6 | 2 |