Skip to main content

Manas Network

The Manas network is open: guardians can join and leave whenever they choose without harming the network. As a guardian you help build a data availability (DA) layer with customizable privacy and security. You can also offer your hardware for compute or verification work, which grows the data, compute and AI ecosystem on Palliora. Follow the rules set by the runtime and you will not face any negative economic impact. This page covers how to run your own guardian from start to finish: the hardware it needs, starting the node and its compute services, joining on chain, and keeping it healthy afterwards.
You do not build anything. The guardian node and every compute service ship as prebuilt container images on a public registry. All you need is Docker, the two files attached below, and the palliora-cli npm package.

What a guardian runs

A guardian machine runs one guardian node plus the services that execute compute jobs. All of them start together from one docker-compose.yml using the operator profile.

System Requirements

Plan disk for an archive node. By default the guardian keeps the full block and state history (OPERATOR_PRUNING=archive), because the compute services read from it and a pruned node answers questions about old blocks as if those blocks never existed. The orchestrator also stores job payloads on disk. Keep at least 200 GB free and watch how fast it grows.

Supported Platforms

The node runs in containers. Images are published for:
  • Linux/amd64: Ubuntu 24.04 (reference platform)
  • Mac/arm64

Pre-Requisites

  • Docker Engine with the Compose plugin
  • Nvidia drivers and the NVIDIA Container Toolkit (Nvidia GPUs on Linux only)
  • Ollama, with your models already pulled
  • Node.js 22 and npm
  • palliora-cli
Install dependencies Docker
Install Docker on macOS: https://docs.docker.com/desktop/setup/install/mac-install/
Install Docker on Linux: https://docs.docker.com/engine/install/ubuntu/
On Linux, let your user run Docker without sudo, and note the group ID of the Docker socket. You will need it later as DOCKER_GID:
Nvidia drivers (Linux with an Nvidia GPU)
The orchestrator starts job containers through the Docker socket. To let those containers use the GPU, install the NVIDIA Container Toolkit: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html Ollama
Download and install Ollama: https://ollama.com/download
Node.js
Install Node.js: https://nodejs.org/en/download
NOTE: Installing with nvm is recommended.
Palliora-cli
The CLI talks to wss://manas-rpc.palliora.org by default. To send a command through a different node, set PALLIORA_WS. You will need this for the guardian steps below.
Amounts are in PALI. Every --amount and --fee flag takes whole PALI and accepts decimals up to 18 places. The CLI converts them to base units for you. Older versions of this guide used base-unit numbers such as 1000000. Do not use those numbers anymore.

Setup a Guardian Node

To become an active guardian, complete these steps in order:
  1. Create and fund an account
  2. Bond tokens
  3. Prepare the machine and configure .env
  4. Set up Ollama
  5. Generate session keys and join as a guardian
  6. Start the full stack
  7. Verify

docker-compose.yml

The compose file. Use the same file on every machine; the .env file chooses the role.

palliora-manas.json

The Manas chain spec.
Always use the chain spec from this page. The spec contains the network’s runtime. A spec that differs by even one byte creates a separate chain, and your node never connects to Manas. No error is shown: the node just stays at peers: 0. When the network is upgraded, this attachment is replaced; download it again.
Create an account This account is your guardian’s identity. It holds the bond, signs the guardian transactions, and receives rewards.
The account is saved to ~/.palliora/account.key. To use a different location, set PALLIORA_DIR. Back up this file. Anyone who has it controls your stake. To use an account you already have, import it instead:
Get test tokens On the Manas test network, fund the account from the faucet. You need the 1,000 PALI bond plus some extra to pay transaction fees:
Bond Tokens Bonding locks PALI behind your guardian. While bonded, the tokens cannot be transferred or spent; they secure your place in the network. The minimum guardian bond is 1,000 PALI.
--amount must be at least the minimum guardian bond. To change your stake later:
Prepare the machine Create a working directory and put the two attached files in it:
Configure .env Create ~/node/.env next to docker-compose.yml. Use absolute paths (no ~ or $HOME), because Docker resolves them on the host.
Configure result submission The orchestrator’s result relay submits compute.result transactions from a separate account. That account needs PALI to pay fees.
  • SUBMITTER_ACCOUNT_ID: its SS58 address.
  • PRIVATE_KEY: its private key.
Use a different account from your guardian account. Create it in its own CLI directory, fund it, and read out its key:
Put address in SUBMITTER_ACCOUNT_ID and privateKey in PRIVATE_KEY.
.env holds private keys. Restrict who can read it (chmod 600 .env), and never commit it or share it.
Firewall
Never open the RPC port to 0.0.0.0/0. A cloud security group that allows all inbound traffic does exactly that, and exposes your node’s keystore to the internet.
Ollama setup Ollama runs directly on the host, not in Docker, and holds the GPU. The orchestrator reaches it at host.docker.internal, so on Linux it must listen on an address other than 127.0.0.1:
  1. Pull the models you want to serve (for example llama3.1:latest):
  2. Start the server so containers can reach it:
    If you installed Ollama as a systemd service, set Environment="OLLAMA_HOST=0.0.0.0:11434" with sudo systemctl edit ollama, then restart it.
A missing Ollama does not show up as unhealthy. The node and every container still report healthy, but every inference job fails. Its result is still submitted, and that submission settles the contract as failed. Check Ollama first if jobs complete with failed results.
Generate session keys and join To accept agreements, your guardian signs its verdicts with a guardian session key. Two conditions must hold:
  1. The key is in the node’s keystore.
  2. The key is registered on chain for your account with session.setKeys.
If either is missing, the node runs and peers normally but never signs anything. When the stack runs normally, the keystore is mounted read-only and the node allows only safe RPC methods. That is deliberate: a wrong keystore path then crashes the node instead of letting it run with no keys. Because of this, create the keys once, with a temporary node that can write to the keystore and that accepts RPC calls from this machine only.
1

Start a temporary node

Make sure nothing else is using ports 9947 and 30336, then run this from ~/node:
It uses the same database directory as the real guardian. That matters because your node’s peer ID is stored there, and the join step records that peer ID on chain.
2

Wait for it to sync

Continue once isSyncing is false and peers is above zero.
3

Join as a guardian and register the keys

Send the join through your own node:
This single command does three things:The worker step reads the peer ID from the node you connect to. If you run join-guardian against the public RPC or any other node, it links the wrong node to your account, and your guardian skips every agreement without logging why.Afterwards, ~/my-guardian/keystore/ contains five key files (babe, gran, guar, imon and audi key types). Back up this directory.
4

Remove the temporary node

Choosing compute types and fees How your guardian decides on an agreement that names it:
  • The submitter cannot afford the agreement: ignored.
  • Dormant contracts: always accepted. No rate applies to them.
  • Offered rate at or above your threshold for that compute type: accepted.
  • Offered rate below your threshold: rejected.
  • No fee set for a compute type: any rate is accepted for that type.
  • The agreement carries a price-oracle quote: the quoted rate is used instead of your threshold. If the quote cannot be fetched, your own threshold applies.
Start the stack
Container images come from a public registry, so you no longer need to log in to Docker. Check that the operator profile started what you expect:
Right after startup, the orchestrator log may show one Abnormal Closure on host.docker.internal:9947. That is normal: the compute services start before the guardian’s RPC is ready, and they reconnect by themselves. Verify your guardian 1. The node is synced and has peers. peers should rise above 1 within a few minutes as other guardians connect. Stuck at 1 means only the bootnode reaches you; see Troubleshooting.
2. You are on Manas, not a chain of your own. system_chain should return Palliora Manas Network, and the genesis hash should match what the public RPC returns:
3. You appear in the guardian list. Ask your guardian node; never ask a validator, because validators always return an empty list.
Or with the CLI:
Having peers does not mean you are registered. A guardian that has not joined still syncs and connects to peers, but it is never named in guardianList and never receives work. Guardian preferences take effect at the next era (an era is three 1-hour sessions), so give a fresh join up to about three hours.
4. The compute services respond.
Ports 7777 and 4141 return 404 on /. That is healthy: they only answer on their own routes.

Operate and Maintain

Day-to-day checks Every service uses restart: always, so the stack comes back on its own after a reboot or crash. Ollama is not part of the stack; make sure it also starts at boot (for example with its systemd service). The node logs at trace level by default. To make the logs quieter, set GUARDIAN_RUST_LOG=dac_guardian=info in .env. Changing fees or compute types Run join-guardian again with the new values, through your own node. You do not need --rotate-keys this time; your keys are already registered.
The new preferences apply from the next era. Claiming rewards Rewards are calculated per era. Claim them for one or more eras:
They are paid to your reward destination, which is your own account unless you set --reward-destination when bonding. Updating the node and services When a new image is released, update NODE_IMAGE in .env if the tag changed, then:
This keeps your database, keys and on-chain registration. The compute images use the latest tag, so pull picks up new versions. Job containers are left in place on purpose; remove old compute-<block>-<index> containers when they pile up. When your public IP changes Other guardians reach you only at PUBLIC_IP. If the machine’s public address changes, for example when an AWS instance without an Elastic IP is stopped and started, the node keeps syncing from the bootnode, but no guardian can connect to it. Update .env and recreate the node:
This keeps your database, keys and on-chain registration; nothing needs to be done on chain. When the network is reset If Palliora announces a new genesis (a new palliora-manas.json), your old database cannot be used, and everything you did on chain has to be done again:
Then repeat funding, bonding, key generation and join, and start the stack.
docker compose down -v deletes the orchestrator’s job database. Run it only for a network reset, never for a normal restart: against the same chain, the orchestrator picks up jobs that were still running.
Leaving the network

Troubleshooting