8091sigma, which you may ignore.python synth/miner/run.py
$ CORRECT
8091btcli to:
miner.local.config.js using the config from this link: miner.config.js#L1pm2 start miner.local.config.js
https://api.synthdata.co/validation/miner?uid=<your UID>
To ensure a miner can successfully connect to the network, the port 8091 MUST be open.
Before the beginning, check what ports are open:
nmap localhost
which should output:
$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-15 12:43 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000079s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
⚠️ NOTE: You can install
nmapviasudo apt install nmap.
ufwIt is RECOMMENDED that ufw (Uncomplicated Firewall) is used to handle port connections.
ufw is a minimal front-end for managing iptables rules. It allows you to easily open ports with simple commands
First, enable ufw using:
sudo ufw enable
Next, allow incoming traffic on the correct port:
sudo ufw allow 8091
To ensure the port is accessible and the rule is active, execute:
sudo ufw status
which should output:
$ sudo ufw status
Status: active
To Action From
-- ------ ----
8091 ALLOW Anywhere
8091 (v6) ALLOW Anywhere (v6)
Using nmap you can check if the port is open using:
nmap -p 8091 localhost
which should output:
$ nmap -p 8091 localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-15 12:50 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000073s latency).
PORT STATE SERVICE
8091/tcp open jamlink
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds
If you have set up your miner on a remote server/VM using a cloud provider (GCP, AWS, Azure, e.t.c.), you will also need to add an ingress rule on port TCP/8091 to allow for incoming connections.
Please refer to your cloud provider’s documentation on adding ingress rules to your server.
Install rust:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Add the required apt repositories:
sudo add-apt-repository ppa:deadsnakes/ppa
⚠️ NOTE: The deadsnakes repository, while unofficial, it is hugely popular and used by many Python projects.
Install Python and Node/npm:
sudo apt update && \
sudo apt install nodejs npm python3.11 python3.11-venv pkg-config
Install PM2 via npm:
sudo npm install pm2 -g
Clone the synth subnet repository:
git clone https://github.com/synthdataco/synth-subnet.git
Change directory to the project root
cd ./synth-subnet
Create a new Python virtual environment:
python3.11 -m venv bt_venv
Activate and switch to the newly created Python virtual environment:
source bt_venv/bin/activate
⚠️ NOTE: This should activate the
bt_venvenvironment, and you will see the command line prefixed with(bt_venv).
Install local Python dependencies within the virtual environment:
pip install -r requirements.txt
💡 TIP: For a more extensive list of the Bittensor CLI commands see here.
You will need to create the cold and hot wallets:
btcli wallet create \
--wallet.name miner \
--wallet.hotkey default
🚨 WARNING: You must ensure your wallets have enough TAO (0.25 should be enough) to be able to start mining. For testnet, check out the faucet on the Discord.
Next, register the wallets by acquiring a slot on the Bittensor subnet:
btcli subnet register \
--wallet.name miner \
--wallet.hotkey default \
--netuid 50
if you want to try it on testnet first, run the following command:
btcli subnet register \
--wallet.name miner \
--wallet.hotkey default \
--network test \
--netuid 247
You can verify the wallet registration by running:
btcli wallet overview \
--wallet.name miner \
--wallet.hotkey default
And, you can also check the network metagraph:
btcli subnet metagraph \
--netuid 50
for testnet it’s:
btcli subnet metagraph \
--network test \
--netuid 247
Simply start PM2 with the miner config:
pm2 start miner.config.js
for testnet use:
pm2 start miner.test.config.js
You can check if the miner is running by using:
pm2 list