This is Path 1: you have a fresh Linux VM or bare-metal host and an SSH session. One line turns it into a DarkMoon node.
curl -fsSL https://portal.dark-moon.org/cloud | sudo DARKMOON_LICENSE_KEY=<KEY> bash -s -- \
--provider anthropic --model claude-opus-4-6 --api-key sk-ant-...The URL serves deploy/cloud-install.sh. Piped into sudo bash, it runs three steps in
order:
- Installs Docker — Docker Engine + Compose v2, via the official
get.docker.comconvenience script. - Runs
install.shnon-interactively — it fetches the DarkMoon installer and runs it with the flags you passed after--.install.shrequires the Pro license (viaDARKMOON_LICENSE_KEYor as the first positional argument) and a provider selection. - Runs
darkmoon doctor— verifies runtime, containers, images, license, AI provider, Privacy Gateway, ports, disk and memory before handing back.
Everything after bash -s -- is passed straight through to install.sh.
DarkMoon Pro will not install without a valid license. Provide it either as an
environment variable (recommended, shown above) or as the first positional argument
to install.sh:
# env var form (preferred)
sudo DARKMOON_LICENSE_KEY=<KEY> bash -s -- --provider anthropic --model claude-opus-4-6 --api-key sk-ant-...
# first-positional form
sudo bash -s -- <KEY> --provider anthropic --model claude-opus-4-6 --api-key sk-ant-...Each fresh VM consumes a device/machine slot on the license (machine-code fingerprint). See Doctor & lifecycle before you script the creation of many ephemeral VMs.
Pick exactly one AI backend. See AI modes for what each means.
--provider <name> # e.g. anthropic
--model <model-id> # e.g. claude-opus-4-6
--api-key <key> # e.g. sk-ant-...
--anthropic-url <base-url>
--anthropic-model <model-id>
--anthropic-key <key>
Use the native
anthropicpath (not an OpenAI-compatible shim) when you want Anthropic prompt caching honoured.
--local
--local-engine ollama|llama.cpp
--local-url <endpoint> # e.g. http://127.0.0.1:11434
--local-model <model-id>
Local mode needs extra RAM/VRAM per model — see Sizing and AI modes.
# Connected — hosted provider
curl -fsSL https://portal.dark-moon.org/cloud | sudo DARKMOON_LICENSE_KEY=<KEY> bash -s -- \
--provider anthropic --model claude-opus-4-6 --api-key sk-ant-...
# Private — customer LLM endpoint via the native anthropic path
curl -fsSL https://portal.dark-moon.org/cloud | sudo DARKMOON_LICENSE_KEY=<KEY> bash -s -- \
--anthropic-url https://llm.internal.example.com --anthropic-model claude-opus-4-6 --anthropic-key <KEY>
# Local — on-node inference, no LLM egress
curl -fsSL https://portal.dark-moon.org/cloud | sudo DARKMOON_LICENSE_KEY=<KEY> bash -s -- \
--local --local-engine ollama --local-url http://127.0.0.1:11434 --local-model <model-id>- Open the dashboard on the node's
ui_port(default80). Restrict that port to trusted CIDRs — see Security. - Re-run diagnostics any time with
darkmoon doctor. - Operate the node through the
darkmoonCLI, not the raw containers — see Doctor & lifecycle.
When you script this (user-data, Terraform, CI), do not inline the license key or the API key in plaintext where instance metadata or the console can read them. Fetch them from the cloud secret manager at boot. See Security.
Piping a URL into sudo bash executes remote code as root. If your policy requires
review first, download and read it, then run it:
curl -fsSL https://portal.dark-moon.org/cloud -o cloud-install.sh
less cloud-install.sh
sudo DARKMOON_LICENSE_KEY=<KEY> bash cloud-install.sh --provider anthropic --model claude-opus-4-6 --api-key sk-ant-...