Add a server to the cluster
Use this page to add a server to a running cluster through Apelora: register it, approve it, enrol it, then admit it once its checks pass.
Before you start:
- The new server runs the same Incus release as the cluster (see
upstream.lock.yaml), reaches the members' cluster addresses on port 8443, and has not been initialised. - You have an API token with the
fabric-adminrole. - The control plane has the unrestricted admin identity (
APELORA_INCUS_ADMIN_CLIENT_CERT/KEY, ADR 0003).
Design: node enrolment.
- Add the machine: Fabric Console → Servers → Machines and join tokens → name (the member name it will
have) and an optional note, or
POST /api/v1/machines {"name": "<name>"}. State: Not approved. - Approve it: Approve (or
POST /api/v1/machines/<name>/approve). The join token and the command to run are shown once; the token is single-use and expires (cluster.join_token_expiry, keep it at 1 hour or less). State: Waiting to join. - Enrol the server: copy
scripts/enrol/enrol-member.shto it and run, as root,bash enrol-member.sh --name <name> --address <its cluster address> --pool-size <size>.--pool-size 20GiBis the sized loop pool namedlocal: it answerssizeand an emptysource, so Incus creates the loop file. A pool on a disk uses--member-config <file>instead (one YAML item per key; do not pass both). With OVN, add--ovn-remote tcp:<ovn-db>:6642 --ovn-encap-ip <its address>. Paste the token when asked (it is not echoed; pass it on standard input in automation — never on the command line). The script checks Incus ≥ 7.0 and kernel ≥ 6.12, configures the OVN controller, joins, and holds the member out of automatic placement (scheduler.instance=manual). State: Joined, not admitted. - Admit it: Check and admit… runs the admission checks (online, Incus and kernel versions, architecture, storage pools and networks created on it; OVN and clock reported as not checked). Fix any failed check on the server and Check again; Admit server then lets Incus place instances on it. State: In service.
- With OVN, confirm that an instance on the new member reaches one on another member. For
example:
incus launch … --target <name>on the application network, thenpingthe other instance and resolve<instance>.incus.
If the server never joins, Withdraw approval (the token stops working) or Remove… the
machine. Every step is audited (machine.register, machine.approve,
machine.approval.withdraw, machine.admit, machine.remove); the token itself is never stored,
logged or audited. A member that joined without being held is flagged joined without being
held: Incus may already place instances on it, so run the admission checks at once.
This page is a copy of docs/runbooks/member-join.md in the repository, which is the source of truth. Suggest a change.