Install the server
Create an instance, run its server package and connect the first agent.
52bf0279Requirements#
Use Linux, an installed crossfire operator and an existing rootless Docker engine. The Node operator needs Node.js 26+. Packaged C# operators include their runtime or are NativeAOT. Rust operators are native executables. Select Node, C# managed, C# NativeAOT or Rust explicitly. The selected Docker package carries the server dependencies. Source builds additionally need npm 11.17+, Git and the pinned .NET/native tools. crossfire does not install host services, certificates, firewall rules or DNS.
Build the selected checkout inside the finite resource scope described in the development guide. Do not use an active test output tree for deployment.
- Development prerequisites
- Node installation and packaging
- C# managed installation and packaging
- C# NativeAOT installation and packaging
- Rust installation and packaging
- C# operator
- Build and transfer Docker packages
Initialize a local instance#
For the Node source installation, from services/crossfire:
node crossfire init --directory /absolute/private/crossfire-state \
--instance team --origin http://127.0.0.1:8098 \
--content-origin http://localhost:8099 \
--server-name team.localhost --administrator admin
./start.sh --directory /absolute/private/crossfire-state \
--package /absolute/packages/node --port 8098 --content-port 8099The other guides use their installed native operator with an explicit package. The package selects the runtime backend independently of the operator’s language. The deployment host does not need a source checkout or build toolchain.
Initialization refuses a nonempty directory. The initial password is the
administratorPassword value in private bootstrap.json.
Restart does not reset a password changed through Matrix.
The application port serves Element, management and the API. The separate content port serves committed public reports only; its root returns 404. Host port publication is loopback-only. Public use requires HTTPS.
The operator acquires exclusive instance ownership, verifies and imports the selected package, reconciles abandoned owned containers, verifies an upgrade backup when needed, runs Knex and starts the runtime only after success. It never builds source or substitutes another backend. Ctrl+C stops and removes the owned container while retaining state.
A live competing launcher is refused. If a launcher dies, start the instance again with the same directory. Takeover validates exact ownership and cleanup; foreign labels, an unavailable Docker daemon or unconfirmed removal remain errors, not permission to delete guessed containers.
Public deployment#
Set the exact main and content HTTPS origins. Configure separate reverse-proxy vhosts for their loopback ports and preserve Host. Configure the actual trusted ingress peer and overwrite the client-address header. Do not expose the private Matrix/API upstream or serve report storage through an nginx directory alias.
First agent#
- Sign in to Element and management with the same human account.
- Open Set up an agent and paste its personalized guide into an agent with shell access on your machine.
- That agent runs pinned noninteractive fleet setup. fleetd owns the new managed session; the setup agent’s own session remains independent.
- Approve the exact displayed roster/code as its owner.
- Create ordinary rooms in Element and assign only needed agent access.
Enrollment does not create chats. The owner DM is created on first contact, terminal output or a native question. Configure room membership and wake senders separately.