> For the complete documentation index, see [llms.txt](https://docs.layeronecloud.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.layeronecloud.com/node-agent/install.md).

# Installation and updates

This directory contains the standalone CloudLinux node agent, its tests, and architecture documentation.

This directory contains the standalone CloudLinux node agent, its tests, and architecture documentation. Pulsar hosts its code-only installation artifacts; the privileged agent runs on the hosting node, separately from Django.

The source was imported from the LayerOne Web Server checkout with its pending file-manager/PHP fixes. The original checkout was preserved for review.

Make future node changes here. Do not keep updating a separate source copy; Pulsar's image build publishes artifacts from this directory.

## Installation and updates <a href="#installation-and-updates" id="installation-and-updates"></a>

After deploying Pulsar, open **Web hosting** in the operations console and copy the install/update command. Run it on the CloudLinux 9 hosting node, never on the Pulsar application server. The command downloads a public bootstrap over verified HTTPS, verifies a digest-addressed runtime bundle, then runs this directory's existing `install.py` host reconciler with root privileges.

The same command updates an existing node without supplying a new API key, node identity, domain, or listen address. The reconciler retains the existing configuration and customer state. First installation uses the server's FQDN and default API bind address, then prints the identity/key for private registration in Pulsar. Set a correct FQDN before running it; the bootstrap also accepts `--domain` and `--listen` when invoked directly. Neither the bootstrap nor the public bundle contains credentials or customer data.

Install commands use Pulsar's canonical site, `https://layeronecloud.com`, even if the deployment still has a legacy `APP_BASE_URL`. Downloads are public under `/downloads/webhosting-agent/`; node management remains authenticated. See [distribution and trust details](/platform/web-hosting/nodes.md#id-613-agent-distribution).

SMTP TLS is operator-managed: updates preserve existing Postfix TLS settings and submission-service entries. Setup jobs do not probe SMTP/SMTPS/STARTTLS; their `tls_verified` field covers IMAP TLS only. IMAP and webmail HTTPS checks run on this node's loopback interface, not from the Pulsar application server. Check your SMTP configuration and actual delivery independently; successful setup is not SMTP TLS verification. Existing settings from older installers are preserved, not automatically undone.

## Development <a href="#development" id="development"></a>

From the Pulsar repository root:

```sh
python3 scripts/build_webhosting_agent.py
cd agents/web-server
python3 -m unittest discover -s tests -t . -v
python3 -m tests.simulate
```

The agent suite is separate from Django's suite and automatically finds the colocated Pulsar wire-contract declarations. Public archives exclude tests, documentation, Django code, Git/IDE metadata, databases, and local settings.

Read [architecture](/node-agent/architecture.md) and [production qualification limits](/node-agent/production-readiness.md). Public distribution does not establish that a node is production-qualified.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.layeronecloud.com/node-agent/install.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
