Skip to content

Create Startup Service

A Cardano blockchain data node written in Go which actively participates in network communications on the Cardano blockchain using the Ouroboros Network Node-to-Node family of mini-protocols.

⚠️ This is a work in progress and is currently under heavy development



For this guide we will walk you through setting up a systemd service. Using a systemd service to run a Dingo Node maximizes the uptime by automatically restarting the Dingo node when the computer reboots. To get started follow the steps below.


✅ This guide assumes typical Linux setup. Please adjust commands and paths as needed.

✅ For this guide we assume you have already completed the Quick Start guide.



Step 1 - Move Dingo Binary and Configuration

Section titled “Step 1 - Move Dingo Binary and Configuration”

We will move the Dingo binary to /usr/local/bin/ and the configuration to /etc/dingo/ so they are accessible system-wide.


Copy the binary:

sudo cp ~/dingo/dingo /usr/local/bin/

✅ You can verify the binary was copied by running which dingo


Create the config directory and copy the configuration:

sudo mkdir -p /etc/dingo
sudo cp ~/dingo/dingo.yaml /etc/dingo/


Since the service will run as your user but the config is now in /etc/dingo/, we need to make sure the database and socket paths use absolute paths. Run the following to regenerate the config with your $HOME expanded:

sudo bash -c "cat <<EOF > /etc/dingo/dingo.yaml
# Database
database:
blob:
plugin: \"badger\"
badger:
block-cache-size: 0
compression: false
data-dir: \"$HOME/dingo/.dingo/badger\"
gc: true
index-cache-size: 0
metadata:
plugin: \"sqlite\"
sqlite:
data-dir: \"$HOME/dingo/.dingo/metadata.db\"
databasePath: \"$HOME/dingo/.dingo\"
# Mempool
# `mempoolCapacity` is an optional override, not a required setting.
# Default: 1 MiB for Praos mode and normal serve mode, and 25 MiB for Leios mode.
# Leave the key commented or omit it to use the mode default.
# mempoolCapacity: 1048576
# Mithril
mithril:
aggregatorUrl: \"\"
cleanupAfterLoad: true
enabled: true
verifyCertificates: true
# Network
bindAddr: \"0.0.0.0\"
metricsPort: 12798
debugPort: 0
network: \"preview\"
privateBindAddr: \"127.0.0.1\"
privatePort: 3002
relayPort: 3001
socketPath: \"$HOME/dingo/dingo.socket\"
# Storage
barkBaseUrl: \"\"
barkPort: 0
barkPrunerFrequency: 1h
blockfrostPort: 0
meshPort: 0
storageMode: \"core\"
utxorpcPort: 0
EOF"

📝 SQLite remains the simple documented default for metadata, and v0.46.4 improves metadata path performance for this default setup.

📝 If a systemd managed node uses mysql or postgres for metadata, v0.46.4 now lets genesis bootstrap complete on preview, preprod, and custom devnets whose genesis files include initial pools, delegations, or DReps. This matters on non mainnet networks because their genesis state exercises these paths.

📝 v0.46.4 also improves repeated or resumed genesis bootstrap behavior across sqlite, mysql, and postgres when genesis governance state is present.

📝 Operators who want Blockfrost compatible HTTP endpoints must switch to API capable storage and set blockfrostPort to a non zero value.

storageMode: "api"
blockfrostPort: 3000


Step 3 - Bootstrap from Mithril (First Run Only)

Section titled “Step 3 - Bootstrap from Mithril (First Run Only)”

Before starting the service for the first time, bootstrap the database from a Mithril snapshot:

dingo mithril sync --config /etc/dingo/dingo.yaml

This downloads and loads a snapshot, saving hours of sync time. See Step 4 of the Quick Start guide for details.

📝 dingo mithril sync now exposes Prometheus progress metrics on the configured metricsPort while the bootstrap runs. With the example config above, operators can monitor temporary bootstrap metrics on port 12798 before dingo serve starts under systemd.

📝 You only need to do this once. After the initial bootstrap, the systemd service will keep the node synced.



Create the systemd service file. Replace YOUR_USER with your username (echo $USER):

cat <<ENDFILE | sudo tee /etc/systemd/system/dingo.service > /dev/null
[Unit]
Description=Dingo Node
After=network-online.target
[Service]
Type=simple
Restart=on-failure
RestartSec=10
User=YOUR_USER
ExecStart=/usr/local/bin/dingo serve --config /etc/dingo/dingo.yaml
SyslogIdentifier=dingo
TimeoutStopSec=5
[Install]
WantedBy=multi-user.target
ENDFILE

⚠️ debugPort controls a separate optional pprof listener, not the metricsPort endpoint. Leave it at 0 by default and enable it only for temporary profiling or debugging.



Enable the service to start on boot and start it now:

sudo systemctl enable dingo.service
sudo systemctl start dingo.service


Verify the service is running:

sudo systemctl status dingo.service

To follow the logs in real time:

sudo journalctl -u dingo -f

To see recent logs if there is an error:

sudo journalctl -u dingo -n 50 --no-pager


Congratulations you have setup a startup service for Dingo!

Section titled “Congratulations you have setup a startup service for Dingo!”