Franz Franz

Run an IOTA Node on Guix

TL;DR How to run an IOTA full node on Guix System.

Here’s how to get a full node running.

Networks

IOTA runs three networks:

Network RPC Endpoint Use
Mainnet https://api.mainnet.iota.cafe:443 Production
Testnet https://api.testnet.iota.cafe:443 Pre-production
Devnet https://api.devnet.iota.cafe:443 Development

Setup

Create the config directory and get the starter config:

mkdir -p /etc/iota && cd /etc/iota
curl -L https://fullnode-docker-setup.iota.org/mainnet | tar -zx
mv data/config/fullnode.yaml .

Download the genesis and migration files:

# mainnet, testnet
curl -fLJ https://dbfiles.mainnet.iota.cafe/genesis.blob -o genesis.blob
# mainnet
curl -fLJ https://dbfiles.mainnet.iota.cafe/migration.blob -o migration.blob

For testnet, replace mainnet with testnet in the URLs above. Testnet doesn’t need the migration.blob.

Configuration

The default config uses /opt/iota which is a Docker convention. On Guix, we use /var/lib for service data. Edit /etc/iota/fullnode.yaml:

# Database
db-path: "/var/lib/iota/db"

# Genesis files
genesis:
  genesis-file-location: "/etc/iota/genesis.blob"
migration-tx-data-path: "/etc/iota/migration.blob"  # mainnet only

# Your public hostname - peers need this to find you
p2p-config:
  external-address: /dns/your-hostname.example.com/udp/8084

Leave the rest (seed peers, archive fallback) as-is.

Ports

Make sure these are open:

Port Protocol Purpose
8084 UDP P2P sync
9000 TCP JSON-RPC

Test Run

Before setting up the service, you can run the node manually to make sure everything works:

guix shell iota -- iota-node --config-path /etc/iota/fullnode.yaml

Or with debug logging:

guix shell iota -- sh -c 'RUST_LOG="info,iota_core=debug,consensus=debug" iota-node --config-path /etc/iota/fullnode.yaml'

Once you see checkpoints coming in, you’re good to set up the service.

System Service

Add the service:

(use-modules (px services iota))

(services
 (cons* (service iota-node-service-type
                 (iota-node-configuration
                  (config-file "/etc/iota/fullnode.yaml")))
        %base-services))

The service creates an iota user, sets up directories, and handles log rotation.

Start

sudo guix system reconfigure /etc/system.scm

The node starts automatically. Check on it:

sudo herd status iota-node
sudo tail -f /var/log/iota-node.log

Verify

Query the node to see if it’s syncing:

curl -X POST http://localhost:9000 \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"iota_getLatestCheckpointSequenceNumber","id":1}'

The checkpoint number should increase over time. Initial sync from genesis is slow - IOTA provides snapshots at dbfiles.iota.org if you want to speed things up.

CLI

The package also includes the iota CLI:

guix shell iota -- iota client

For validator nodes (staking, key generation), see the IOTA operator docs.
The IOTA package is available from my Guix channel: panther.