diff --git a/docker-compose/.env b/docker-compose/.env
deleted file mode 100644
index 16d5c88..0000000
--- a/docker-compose/.env
+++ /dev/null
@@ -1,42 +0,0 @@
-##
-# Monero Wallet Address for mining rewards (replace this with your own address)
-WALLET_ADDRESS="44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg"
-
-##
-# p2pool settings
-#
-# Use p2pool-mini (uncomment to enable)
-#P2POOL_MINI="--mini"
-#
-# Which port to listen for miner connections
-P2POOL_STRATUM_PORT=3333
-#
-# How much logging - (Less) 0 - 6 (More)
-P2POOL_LOGLEVEL=2
-
-
-##
-# Monero Node Settings
-#
-# Version of Monero to build. Must be v0.17.3.0 or later for p2pool support. "latest" pulls the most recent release tag
-MONERO_GIT_TAG=latest
-#
-# Limit the size of the blockchain on disk (comment to disable)
-PRUNE_NODE="--prune-blockchain"
-#
-# Other monerod commandline options
-MONERO_EXTRA_OPTIONS=""
-
-
-##
-# Xmrig Miner Settings
-#
-# Submit shares at a lower fixed difficulty to show mining progress (comment to disable, edit to customize)
-FIXED_MINING_DIFFICULTY="-u x+500000"
-#
-# set process priority (0 idle, 2 normal to 5 highest)
-MINING_CPU_PRIORITY="--cpu-priority=2"
-#
-# Other XMRIG commandline options
-# See: https://xmrig.com/docs/miner/command-line-options
-XMRIG_EXTRA_OPTIONS=""
diff --git a/docker-compose/README.md b/docker-compose/README.md
index 9fa797a..f4c3c01 100644
--- a/docker-compose/README.md
+++ b/docker-compose/README.md
@@ -8,6 +8,8 @@ Run your own Monero Node + P2Pool + XMRig in Docker
[Install Docker](https://docs.docker.com/engine/install/)
[Install Docker Compose](https://docs.docker.com/compose/install/)
+Note: The docker compose plugin uses the command "docker compose" while the pip installed command is "docker-compose".
+
#### Clone the P2Pool project
```
git clone --recursive https://github.com/SChernykh/p2pool
@@ -16,18 +18,18 @@ git clone --recursive https://github.com/SChernykh/p2pool
#### Configure your Monero address for mining rewards
```
cd p2pool/docker-compose
-vi .env
+./configure
```
-**WALLET_ADDRESS** is the only setting that needs to be updated in that file
+Make sure to set your own monero **Wallet Address**. The default is to donate mining to P2Pool development.
#### Build the docker containers
```
-docker-compose build
+docker compose build
```
-#### Run the node, pool, and CPU miner
+#### Run the node, pool, and CPU miner (or updated configuration)
```
-docker-compose up
+docker compose up
```
#### Optional
@@ -38,15 +40,15 @@ docker-compose up
#### Other usefull commands
-* You can **run everythng in the background** by adding the "-d" argument to the "docker-compose up" command: ```docker-compose up -d```
-* You can **stop everything** with CTRL-C or ```docker-compose down```
+* You can **run everything in the background** by adding the "-d" argument to the "docker compose up" command: ```docker compose up -d```
+* You can **stop everything** with CTRL-C or ```docker compose down```
* You can see logs when running in the background for with the "docker logs" command: ```docker logs -f p2pool-xmrig``` or ```docker logs -f p2pool-p2pool``` or ```docker logs -f p2pool-monero```
-* You can pause mining with: ```docker-compose pause xmrig``` and resume mining with: ```docker-compose unpause xmrig```
-* You can disable mining with: ```docker-compose stop xmrig``` and re-enable mining with: ```docker-compose start xmrig```
+* You can pause mining with: ```docker compose pause xmrig``` and resume mining with: ```docker compose unpause xmrig```
+* You can disable mining with: ```docker compose stop xmrig``` and re-enable mining with: ```docker compose start xmrig```
#### Uninstall
Change to p2pool/docker-compose directory
-Stop and remove all containers: ```docker-compose down```
+Stop and remove all containers: ```docker compose down```
Remove the p2pool data: ```docker volume rm p2pool```
Remove the monero data: ```docker volume rm monero```
diff --git a/docker-compose/cfg/Dockerfile b/docker-compose/cfg/Dockerfile
new file mode 100644
index 0000000..7c6f3ab
--- /dev/null
+++ b/docker-compose/cfg/Dockerfile
@@ -0,0 +1,14 @@
+FROM python:3.10.5-bullseye
+
+WORKDIR /app
+
+ADD requirements.txt /app/
+RUN /usr/local/bin/pip3 install -r requirements.txt
+
+ADD configure.py /app/
+ADD defaults /app/
+ADD current_config.jinja2 /app/
+ADD docker-compose.jinja2 /app/
+
+ENTRYPOINT ["/usr/local/bin/python3"]
+CMD ["/app/configure.py"]
diff --git a/docker-compose/cfg/configure.py b/docker-compose/cfg/configure.py
new file mode 100755
index 0000000..076b187
--- /dev/null
+++ b/docker-compose/cfg/configure.py
@@ -0,0 +1,597 @@
+#!/bin/env python3
+import time
+import json
+from jinja2 import Template
+import npyscreen
+
+
+def load_default_config():
+ # Read defaults
+ with open("defaults") as defaults_file:
+ defaults = json.load(defaults_file)
+ return defaults
+
+
+def load_current_config():
+ # Read current config
+ with open("/docker-compose/current_config") as current_config:
+ config = json.load(current_config)
+ return config
+
+
+##
+# Help text in a box at the bottom of the screen
+class HelpBox(npyscreen.BoxTitle):
+ def display_help_message(self, field):
+ if field == "Configure Monero Node":
+ self.set_values(
+ [
+ "Configure and run a Monero Node",
+ "",
+ "Note: You must either configure a local node or specify a public node",
+ ]
+ )
+ elif field == "Configure XMRig CPU Miner":
+ self.set_values(
+ [
+ "Configure and run an XMRig CPU Miner",
+ "",
+ "Note: You must either configure am XMRig CPU Miner or expose the",
+ " P2Pool stratum port and connect an external miner, or both",
+ ]
+ )
+ elif field == "Wallet Address:":
+ self.set_values(
+ [
+ "Your monero wallet address for receiving mining reqards",
+ "",
+ "Note: You have to use a primary wallet address for mining",
+ " Subaddresses and integrated addresses are not supported!",
+ ]
+ )
+ elif field == "P2Pool Sidechain:":
+ self.set_values(
+ [
+ "Which P2Pool sidechain to mine on",
+ " use main for faster miners",
+ " use mini for slower miners",
+ ]
+ )
+ elif field == "Expose Stratum Port":
+ self.set_values(
+ [
+ "Expose the P2Pool stratum port to your network so external miners",
+ "can connect",
+ "Note: You may choose to open this port in your hosts firewall and/or",
+ " router to allow miners outside your network to connect",
+ ]
+ )
+ elif field == "Stratum Port:":
+ self.set_values(
+ [
+ "Port number to expose P2Pool stratum to your network to allow",
+ "external miners to connect",
+ ]
+ )
+ elif field == "P2Pool Log Level:":
+ self.set_values(["Verbosity of the log; (Less) 0 - 6 (More)"])
+ elif field == "Enable Autodiff":
+ self.set_values(
+ ["Use automatic difficulty adjustment for miners connected to stratum"]
+ )
+ elif field == "Additional P2Pool Options:":
+ self.set_values(
+ [
+ "Additional options to pass to p2pool commandline",
+ "",
+ "Note: Advanced - Only add options if you know what you are doing",
+ " See ouput of 'p2pool --help' for available options",
+ ]
+ )
+ elif field == "Monero Version:":
+ self.set_values(
+ [
+ "Version of Monero to build; 'latest' for the most recent release",
+ "",
+ "Note: Must be v0.17.3.0 or later for p2pool support",
+ " See: https://github.com/monero-project/monero/tags",
+ ]
+ )
+ elif field == "Prune Blockchain":
+ self.set_values(
+ ["Prune the Monero node to limit the size of the blockchain on disk"]
+ )
+ elif field == "Monero Log Level:":
+ self.set_values(["Verbosity of the log; (Less) 0 - 4 (More)"])
+ elif field == "Additional monerod Options:":
+ self.set_values(
+ [
+ "Additional options to pass to monerod commandline",
+ "",
+ "Note: Advanced - Only add options if you know what you are doing",
+ " See 'https://monerodocs.org/interacting/monerod-reference/'",
+ ]
+ )
+ elif field == "Public Node:":
+ self.set_values(
+ [
+ "Public Monero Node to Use",
+ "",
+ "Note: The public node must have both Monero RPC and zmq-pub ports",
+ " available",
+ ]
+ )
+ elif field == "Node Login:":
+ self.set_values(
+ [
+ "Specify username[:password] required to connect to public monero",
+ "node RPC API (if required)"
+ ]
+ )
+ elif field == "Username:":
+ self.set_values(["Set a username for the miner"])
+ elif field == "Use Fixed Difficulty":
+ self.set_values(
+ [
+ "Used a fixed minig difficulty",
+ "",
+ "Note: Allows you to see XMRig submitting shares below P2Pool threshold",
+ ]
+ )
+ elif field == "Fixed Difficulty:":
+ self.set_values(
+ [
+ "Set a fixed mining difficulty",
+ "",
+ "Note: Allows you to see XMRig submitting shares below P2Pool threshold",
+ ]
+ )
+ elif field == "CPU Use %:":
+ self.set_values(
+ ["maximum CPU threads count (in percentage) hint for autoconfig"]
+ )
+ elif field == "Additional XMRig Options:":
+ self.set_values(
+ [
+ "Additional options to pass to xmrig",
+ "",
+ "Note: Advanced - Only add options if you know what you are doing",
+ " See 'https://xmrig.com/docs/miner/command-line-options'",
+ ]
+ )
+ elif field == "Save":
+ self.set_values(["Save current configuration"])
+ elif field == "Cancel":
+ self.set_values(["Exit without saving"])
+ self.clear()
+ self.display()
+
+
+##
+# Custom (integer) values for title slider
+class IntegerSlider(npyscreen.Slider):
+ def translate_value(self):
+ from_val = int(str(self.value).split(".")[0])
+ out_of_val = int(str(self.out_of).split(".")[0])
+ if from_val >= 1000:
+ from_val = str(from_val / 1000).split(".")[0] + "K"
+ out_of_val = str(out_of_val / 1000).split(".")[0] + "K"
+ return "{}/{}".format(from_val, out_of_val)
+
+
+class TitleIntegerSlider(npyscreen.TitleSlider):
+ _entry_type = IntegerSlider
+
+
+##
+# Patched updateDependents for FormControlCheckbox
+class PatchedFormControlCheckbox(npyscreen.FormControlCheckbox):
+ def updateDependents(self):
+ if self.value:
+ for w in self._visibleWhenSelected:
+ try:
+ w.fc_visible
+ except AttributeError:
+ w.fc_visible = {}
+ w.fc_visible[self.name] = True
+ for w in self._notVisibleWhenSelected:
+ try:
+ w.fc_visible
+ except AttributeError:
+ w.fc_visible = {}
+ w.fc_visible[self.name] = False
+ else:
+ for w in self._visibleWhenSelected:
+ try:
+ w.fc_visible
+ except AttributeError:
+ w.fc_visible = {}
+ w.fc_visible[self.name] = False
+ for w in self._notVisibleWhenSelected:
+ try:
+ w.fc_visible
+ except AttributeError:
+ w.fc_visible = {}
+ w.fc_visible[self.name] = True
+ for w in self._visibleWhenSelected + self._notVisibleWhenSelected:
+ w.hidden = False in w.fc_visible.values()
+ w.editable = not False in w.fc_visible.values()
+ self.parent.display()
+
+ def set_value(self, value):
+ self.value = value
+ self.display()
+
+ def display(self):
+ self.updateDependents()
+ super()
+
+
+class SaveButton(npyscreen.Button):
+ def whenToggled(self):
+ self.parent.save_and_exit()
+
+
+class CancelButton(npyscreen.Button):
+ def whenToggled(self):
+ self.parent.cancel_and_exit()
+
+
+##
+# Configuration Form
+class ConfigForm(npyscreen.FormBaseNew):
+ ALLOW_RESIZE = False
+ name_size = 20
+ indent = 5
+
+ def while_editing(self, arg):
+ self.help.display_help_message(arg.name)
+
+ def create(self):
+ # Add Hot-Key Controls
+ self.add_handlers({"^D": self.load_defaults})
+ # Add Global Configuration
+ self.add(
+ npyscreen.TitleText,
+ name="## General Configuration",
+ editable=False,
+ begin_entry_at=50,
+ )
+ self.configure_monero_node = self.add(
+ PatchedFormControlCheckbox,
+ name="Configure Monero Node",
+ value=True,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner = self.add(
+ PatchedFormControlCheckbox,
+ name="Configure XMRig CPU Miner",
+ value=True,
+ relx=self.indent,
+ )
+ self.nextrely += 1
+ self.nextrely += 1
+ # Add P2Pool Configuration
+ self.add(
+ npyscreen.TitleText,
+ name="## P2Pool Configuration",
+ editable=False,
+ begin_entry_at=50,
+ )
+ self.wallet_address = self.add(
+ npyscreen.TitleText,
+ name="Wallet Address:",
+ value="",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.sidechain = self.add(
+ npyscreen.TitleSelectOne,
+ name="P2Pool Sidechain:",
+ values=["main", "mini"],
+ scroll_exit=True,
+ max_height=2,
+ value=[
+ 0,
+ ],
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.expose_stratum_port = self.add(
+ PatchedFormControlCheckbox,
+ name="Expose Stratum Port",
+ value=True,
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.stratum_port = self.add(
+ npyscreen.TitleText,
+ name="Stratum Port:",
+ value="3333",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.expose_stratum_port.addVisibleWhenSelected(self.stratum_port)
+ self.p2pool_log_level = self.add(
+ TitleIntegerSlider,
+ name="P2Pool Log Level:",
+ out_of=6,
+ value=3,
+ lowest=0,
+ step=1,
+ width=43,
+ begin_entry_at=20,
+ label=True,
+ block_color=None,
+ relx=self.indent,
+ )
+ self.autodiff = self.add(
+ PatchedFormControlCheckbox,
+ name="Enable Autodiff",
+ value=True,
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.p2pool_extra = self.add(
+ npyscreen.TitleText,
+ name="Additional P2Pool Options:",
+ value="",
+ begin_entry_at=self.name_size + 10,
+ relx=self.indent,
+ )
+ self.nextrely += 1
+ self.nextrely += 1
+ # Add Monero Configuration
+ self.add(
+ npyscreen.TitleText,
+ name="## Monero Node Configuration",
+ editable=False,
+ begin_entry_at=50,
+ )
+ self.monero_git_tag = self.add(
+ npyscreen.TitleText,
+ name="Monero Version:",
+ value="latest",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addVisibleWhenSelected(self.monero_git_tag)
+ self.prune_node = self.add(
+ npyscreen.Checkbox,
+ name="Prune Blockchain",
+ value=True,
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addVisibleWhenSelected(self.prune_node)
+ self.monero_log_level = self.add(
+ TitleIntegerSlider,
+ name="Monero Log Level:",
+ out_of=4,
+ value=0,
+ lowest=0,
+ step=1,
+ width=43,
+ begin_entry_at=20,
+ label=True,
+ block_color=None,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addVisibleWhenSelected(self.monero_log_level)
+ self.monero_extra = self.add(
+ npyscreen.TitleText,
+ name="Additional monerod Options:",
+ value="",
+ begin_entry_at=self.name_size + 10,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addVisibleWhenSelected(self.monero_extra)
+ self.public_node = self.add(
+ npyscreen.TitleText,
+ name="Public Node:",
+ value="",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addInvisibleWhenSelected(self.public_node)
+ self.node_login = self.add(
+ npyscreen.TitleText,
+ name="Node Login:",
+ value="",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.configure_monero_node.addInvisibleWhenSelected(self.node_login)
+ self.nextrely += 1
+ self.nextrely += 1
+ # Add XMRig Configuration
+ self.add(
+ npyscreen.TitleText,
+ name="## XMRig Miner Configuration",
+ editable=False,
+ begin_entry_at=50,
+ )
+ self.username = self.add(
+ npyscreen.TitleText,
+ name="Username:",
+ value="",
+ begin_entry_at=self.name_size,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner.addVisibleWhenSelected(self.username)
+ self.use_fixed_difficulty = self.add(
+ PatchedFormControlCheckbox,
+ name="Use Fixed Difficulty",
+ value=True,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner.addVisibleWhenSelected(self.use_fixed_difficulty)
+ self.autodiff.addInvisibleWhenSelected(self.use_fixed_difficulty)
+ self.fixed_difficulty = self.add(
+ TitleIntegerSlider,
+ name="Fixed Difficulty:",
+ out_of=2000000,
+ value=500000,
+ lowest=50000,
+ step=50000,
+ width=51,
+ begin_entry_at=20,
+ label=True,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner.addVisibleWhenSelected(self.fixed_difficulty)
+ self.use_fixed_difficulty.addVisibleWhenSelected(self.fixed_difficulty)
+ self.autodiff.addInvisibleWhenSelected(self.fixed_difficulty)
+ self.cpu_threads = self.add(
+ TitleIntegerSlider,
+ name="CPU Use %:",
+ out_of=100,
+ value=100,
+ lowest=1,
+ step=10,
+ width=48,
+ begin_entry_at=20,
+ label=True,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner.addVisibleWhenSelected(self.cpu_threads)
+ self.xmrig_extra = self.add(
+ npyscreen.TitleText,
+ name="Additional XMRig Options:",
+ value="",
+ begin_entry_at=self.name_size + 10,
+ relx=self.indent,
+ )
+ self.configure_xmrig_miner.addVisibleWhenSelected(self.xmrig_extra)
+ self.nextrely += 1
+ self.nextrely += 1
+ # Add "Save" button
+ self.save_button = self.add(SaveButton, name="Save", relx=1)
+ self.nextrely -= 1
+ self.cancel_button = self.add(CancelButton, name="Cancel", relx=8)
+ self.nextrely += 1
+ # Add Help Box
+ self.help = self.add(
+ HelpBox,
+ name="Commands: ^D: Load Defaults - ^C: Exit Without Saving",
+ values=[""],
+ rely=-8,
+ editable=False,
+ )
+ # Start with current config
+ self.set_config(load_current_config())
+
+ def set_config(self, config):
+ self.configure_monero_node.set_value(config["configure_monero"])
+ self.configure_xmrig_miner.set_value(config["configure_xmrig"])
+ self.wallet_address.set_value(config["wallet_address"])
+ self.sidechain.set_value(config["sidechain"])
+ self.expose_stratum_port.set_value(config["expose_stratum_port"])
+ self.stratum_port.set_value(config["stratum_port"])
+ self.p2pool_log_level.set_value(config["p2pool_log_level"])
+ self.autodiff.set_value(config["enable_autodiff"])
+ self.p2pool_extra.set_value(config["p2pool_options"])
+ self.monero_git_tag.set_value(config["monero_version"])
+ self.prune_node.value = config["prune_blockchain"]
+ self.monero_log_level.set_value(config["monero_log_level"])
+ self.monero_extra.set_value(config["monero_options"])
+ self.public_node.set_value(config["public_monero_node"])
+ self.node_login.set_value(config["monero_node_login"])
+ self.username.set_value(config["xmrig_username"])
+ self.use_fixed_difficulty.set_value(config["use_fixed_difficulty"])
+ self.fixed_difficulty.set_value(config["fixed_difficulty"])
+ self.cpu_threads.set_value(config["cpu_percent"])
+ self.xmrig_extra.set_value(config["xmrig_options"])
+ self.DISPLAY()
+
+ def get_config(self):
+ config = {
+ "configure_monero": self.configure_monero_node.value,
+ "configure_xmrig": self.configure_xmrig_miner.value,
+ "wallet_address": self.wallet_address.value,
+ "sidechain": self.sidechain.value,
+ "expose_stratum_port": self.expose_stratum_port.value,
+ "stratum_port": self.stratum_port.value,
+ "p2pool_log_level": self.p2pool_log_level.value,
+ "enable_autodiff": self.autodiff.value,
+ "p2pool_options": self.p2pool_extra.value,
+ "monero_version": self.monero_git_tag.value,
+ "prune_blockchain": self.prune_node.value,
+ "monero_log_level": self.monero_log_level.value,
+ "monero_options": self.monero_extra.value,
+ "public_monero_node": self.public_node.value,
+ "monero_node_login": self.node_login.value,
+ "xmrig_username": self.username.value,
+ "use_fixed_difficulty": self.use_fixed_difficulty.value,
+ "fixed_difficulty": self.fixed_difficulty.value,
+ "cpu_percent": self.cpu_threads.value,
+ "xmrig_options": self.xmrig_extra.value,
+ }
+ return config
+
+ # Control methods
+ def load_defaults(self, arg):
+ ok = npyscreen.notify_ok_cancel(
+ "Set all values to defaults", title="Load Defaults"
+ )
+ if not ok:
+ return
+ defaults = load_default_config()
+ self.set_config(defaults)
+
+ def save_and_exit(self):
+ config = self.get_config()
+ # Save "current config" values file
+ with open("current_config.jinja2", "r") as current_config:
+ template = current_config.read()
+ rendered = Template(template).render(config)
+ with open("/docker-compose/current_config", "w") as current_config:
+ current_config.write(rendered)
+ # Render and save docker-compose file
+ with open("docker-compose.jinja2", "r") as compose_file:
+ template = compose_file.read()
+ rendered = Template(template).render(config, trim_blocks=True)
+ with open("/docker-compose/docker-compose.yml", "w") as compose_file:
+ compose_file.write(rendered)
+ npyscreen.notify("Saved current settings", title="Saved")
+ self.find_parent_app().switchForm(None)
+ self.find_parent_app().saved = True
+
+ def cancel_and_exit(self):
+ self.find_parent_app().switchForm(None)
+ self.find_parent_app().saved = False
+
+
+##
+# Our P2Pool configuration App
+class ConfigApp(npyscreen.NPSAppManaged):
+ def onStart(self):
+ self.f = self.addForm(
+ "MAIN",
+ ConfigForm,
+ name="P2Pool for docker-compose: Global Configuration",
+ lines=45,
+ columns=80,
+ minimum_lines=45,
+ minimum_columns=80,
+ )
+
+
+if __name__ == "__main__":
+ try:
+ time.sleep(1) # Give docker a second to initialize the terminal
+ App = ConfigApp()
+ App.run()
+ print("\n\n")
+ if App.saved:
+ print("Configuration Saved")
+ print(
+ 'Run "docker compose up -d" to start (if you are using the docker-compose plugin'
+ )
+ print(
+ 'or, "docker-compose up -d" (if you are using pip installed docker-compose)'
+ )
+ else:
+ print("Configuration Aborted")
+ except KeyboardInterrupt:
+ print("Configuration Aborted")
diff --git a/docker-compose/cfg/current_config.jinja2 b/docker-compose/cfg/current_config.jinja2
new file mode 100644
index 0000000..fc9c86e
--- /dev/null
+++ b/docker-compose/cfg/current_config.jinja2
@@ -0,0 +1,22 @@
+{
+ "wallet_address": {{ wallet_address | tojson(indent=2) }},
+ "configure_monero": {{ configure_monero | tojson(indent=2) }},
+ "configure_xmrig": {{ configure_xmrig | tojson(indent=2) }},
+ "sidechain": {{ sidechain | tojson(indent=2) }},
+ "expose_stratum_port": {{ expose_stratum_port | tojson(indent=2) }},
+ "stratum_port": {{ stratum_port | tojson(indent=2) }},
+ "p2pool_log_level": {{ p2pool_log_level | int | tojson(indent=2) }},
+ "enable_autodiff": {{ enable_autodiff | tojson(indent=2) }},
+ "p2pool_options": {{ p2pool_options | tojson(indent=2) }},
+ "monero_version": {{ monero_version | tojson(indent=2) }},
+ "prune_blockchain": {{ prune_blockchain | tojson(indent=2) }},
+ "monero_log_level": {{ monero_log_level | int | tojson(indent=2) }},
+ "monero_options": {{ monero_options | tojson(indent=2) }},
+ "public_monero_node": {{ public_monero_node | tojson(indent=2) }},
+ "monero_node_login": {{ monero_node_login | tojson(indent=2) }},
+ "xmrig_username": {{ xmrig_username | tojson(indent=2) }},
+ "use_fixed_difficulty": {{ use_fixed_difficulty | tojson(indent=2) }},
+ "fixed_difficulty": {{ fixed_difficulty | int | tojson(indent=2) }},
+ "cpu_percent": {{ cpu_percent | int | tojson(indent=2) }},
+ "xmrig_options": {{ xmrig_options | tojson(indent=2) }}
+}
diff --git a/docker-compose/cfg/defaults b/docker-compose/cfg/defaults
new file mode 100644
index 0000000..eb9729d
--- /dev/null
+++ b/docker-compose/cfg/defaults
@@ -0,0 +1,22 @@
+{
+ "wallet_address": "44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg",
+ "configure_monero": true,
+ "configure_xmrig": true,
+ "sidechain": [0],
+ "expose_stratum_port": false,
+ "stratum_port": "3333",
+ "p2pool_log_level": 3,
+ "enable_autodiff": true,
+ "p2pool_options": "",
+ "monero_version": "latest",
+ "prune_blockchain": true,
+ "monero_log_level": 0,
+ "monero_options": "",
+ "public_monero_node": "",
+ "monero_node_login": "",
+ "xmrig_username": "p2pool",
+ "use_fixed_difficulty": true,
+ "fixed_difficulty": 500000,
+ "cpu_percent": 100,
+ "xmrig_options": ""
+}
diff --git a/docker-compose/cfg/docker-compose.jinja2 b/docker-compose/cfg/docker-compose.jinja2
new file mode 100644
index 0000000..5381de3
--- /dev/null
+++ b/docker-compose/cfg/docker-compose.jinja2
@@ -0,0 +1,125 @@
+---
+version: '3.4'
+
+networks:
+ p2pool:
+ driver: bridge
+
+volumes:
+ p2pool:
+ name: p2pool
+{% if configure_monero == True %}
+ monero:
+ name: monero
+{% endif %}
+
+services:
+ p2pool:
+ image: p2pool:latest
+ build: ../
+ container_name: p2pool-p2pool
+ networks:
+ - p2pool
+ ports:
+{% if sidechain[0] == 0 %}
+ - 37888:37888/tcp
+{% else %}
+ - 37889:37889/tcp
+{% endif %}
+{% if expose_stratum_port == True %}
+ - {{ stratum_port | int }}:3333/tcp
+{% endif %}
+ volumes:
+ - p2pool:/home/p2pool/.p2pool:rw
+ - /dev/null:/home/p2pool/.p2pool/p2pool.log:rw
+ - /dev/hugepages:/dev/hugepages:rw
+{% if configure_monero == True %}
+ depends_on:
+ - monero
+{% endif %}
+ restart: unless-stopped
+ command: >-
+{% if configure_monero == True %}
+ --host monero
+{% else %}
+ --host {{ public_monero_node }}
+ --rpc-login {{ monero_node_login }}
+{% endif %}
+ --wallet {{ wallet_address }}
+ --loglevel {{ p2pool_log_level | int }}
+{% if sidechain[0] == 1 %}
+ --mini
+{% endif %}
+{% if enable_autodiff == False %}
+ --no-autodiff
+{% endif %}
+{% if p2pool_options != "" %}
+ {{ p2pool_options }}
+{% endif %}
+
+
+{% if configure_monero == True %}
+ monero:
+ image: monero:latest
+ build:
+ context: monero
+ args:
+ - MONERO_GIT_TAG={{ monero_version }}
+ container_name: p2pool-monero
+ networks:
+ - p2pool
+ ports:
+ - 18080:18080/tcp
+ volumes:
+ - monero:/home/monero/.bitmonero:rw
+ - /dev/null:/home/monero/.bitmonero/bitmonero.log:rw
+ - /dev/hugepages:/dev/hugepages:rw
+ restart: unless-stopped
+ command: >-
+ --zmq-pub tcp://0.0.0.0:18083
+ --disable-dns-checkpoints
+ --enable-dns-blocklist
+ --non-interactive
+ --p2p-bind-ip=0.0.0.0
+ --p2p-bind-port=18080
+ --rpc-bind-ip=0.0.0.0
+ --rpc-bind-port=18081
+ --confirm-external-bind
+ --log-level={{ monero_log_level | int }}
+{% if prune_blockchain == True %}
+ --prune-blockchain
+{% endif %}
+{% if monero_options != "" %}
+ {{ monero_options }}
+{% endif %}
+{% endif %}
+
+
+{% if configure_xmrig == True %}
+ xmrig:
+ image: xmrig:latest
+ build: xmrig
+ container_name: p2pool-xmrig
+ networks:
+ - p2pool
+ privileged: true
+ volumes:
+ - /dev:/dev:ro
+ - /lib/modules:/lib/modules:ro
+ - /dev/hugepages:/dev/hugepages:rw
+ depends_on:
+ - p2pool
+ restart: unless-stopped
+ command: >-
+ --randomx-1gb-pages
+ -o p2pool:3333
+{% if enable_autodiff == False and use_fixed_difficulty == True %}
+ -u {{ xmrig_username }}+{{ fixed_difficulty | int }}
+{% else %}
+ -u {{ xmrig_username }}
+{% endif %}
+ --cpu-max-threads-hint={{ cpu_percent | int }}
+{% if xmrig_options != "" %}
+ {{ xmrig_options }}
+{% endif %}
+{% endif %}
diff --git a/docker-compose/cfg/requirements.txt b/docker-compose/cfg/requirements.txt
new file mode 100644
index 0000000..e5a00db
--- /dev/null
+++ b/docker-compose/cfg/requirements.txt
@@ -0,0 +1,3 @@
+npyscreen==4.10.5
+MarkupSafe==2.0.1
+jinja2==2.11.3
diff --git a/docker-compose/configure b/docker-compose/configure
new file mode 100755
index 0000000..8bf01af
--- /dev/null
+++ b/docker-compose/configure
@@ -0,0 +1,6 @@
+#!/bin/bash
+echo ""
+echo ""
+echo "Building and Running P2Pool docker-compose Configuration"
+docker build -t p2pool_config:latest cfg
+docker run -it --rm -v $PWD:/docker-compose --user $(id -u):$(id -g) p2pool_config:latest
diff --git a/docker-compose/current_config b/docker-compose/current_config
new file mode 100644
index 0000000..4ae9bf9
--- /dev/null
+++ b/docker-compose/current_config
@@ -0,0 +1,24 @@
+{
+ "wallet_address": "44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg",
+ "configure_monero": true,
+ "configure_xmrig": true,
+ "sidechain": [
+ 0
+],
+ "expose_stratum_port": false,
+ "stratum_port": "3333",
+ "p2pool_log_level": 3,
+ "enable_autodiff": true,
+ "p2pool_options": "",
+ "monero_version": "latest",
+ "prune_blockchain": true,
+ "monero_log_level": 0,
+ "monero_options": "",
+ "public_monero_node": "",
+ "monero_node_login": "",
+ "xmrig_username": "p2pool",
+ "use_fixed_difficulty": true,
+ "fixed_difficulty": 500000,
+ "cpu_percent": 100,
+ "xmrig_options": ""
+}
\ No newline at end of file
diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml
index 178217b..be20774 100644
--- a/docker-compose/docker-compose.yml
+++ b/docker-compose/docker-compose.yml
@@ -8,16 +8,50 @@ networks:
volumes:
p2pool:
name: p2pool
+
monero:
name: monero
+
services:
+ p2pool:
+ image: p2pool:latest
+ build: ../
+ container_name: p2pool-p2pool
+ networks:
+ - p2pool
+ ports:
+
+ - 37888:37888/tcp
+
+
+ volumes:
+ - p2pool:/home/p2pool/.p2pool:rw
+ - /dev/null:/home/p2pool/.p2pool/p2pool.log:rw
+ - /dev/hugepages:/dev/hugepages:rw
+
+ depends_on:
+ - monero
+
+ restart: unless-stopped
+ command: >-
+
+ --host monero
+
+ --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg
+ --loglevel 3
+
+
+
+
+
+
monero:
image: monero:latest
build:
context: monero
args:
- - MONERO_GIT_TAG=${MONERO_GIT_TAG}
+ - MONERO_GIT_TAG=latest
container_name: p2pool-monero
networks:
- p2pool
@@ -25,6 +59,7 @@ services:
- 18080:18080/tcp
volumes:
- monero:/home/monero/.bitmonero:rw
+ - /dev/null:/home/monero/.bitmonero/bitmonero.log:rw
- /dev/hugepages:/dev/hugepages:rw
restart: unless-stopped
command: >-
@@ -36,34 +71,15 @@ services:
--p2p-bind-port=18080
--rpc-bind-ip=0.0.0.0
--rpc-bind-port=18081
- --restricted-rpc
--confirm-external-bind
- --log-file /dev/stdout
- ${PRUNE_NODE}
- ${MONERO_EXTRA_OPTIONS}
+ --log-level=0
+
+ --prune-blockchain
+
+
+
+
- p2pool:
- image: p2pool:latest
- build: ../
- container_name: p2pool-p2pool
- networks:
- - p2pool
- ports:
- - ${P2POOL_STRATUM_PORT}:3333/tcp
- - 37888:37888/tcp
- - 37889:37889/tcp
- volumes:
- - p2pool:/home/p2pool/.p2pool:rw
- - /dev/null:/home/p2pool/.p2pool/p2pool.log:rw
- - /dev/hugepages:/dev/hugepages:rw
- depends_on:
- - monero
- restart: unless-stopped
- command: >-
- --host monero
- --wallet ${WALLET_ADDRESS}
- --loglevel ${P2POOL_LOGLEVEL}
- ${P2POOL_MINI}
xmrig:
image: xmrig:latest
@@ -80,8 +96,10 @@ services:
- p2pool
restart: unless-stopped
command: >-
- ${FIXED_MINING_DIFFICULTY}
- ${MINING_CPU_PRIORITY}
- ${XMRIG_EXTRA_OPTIONS}
--randomx-1gb-pages
-o p2pool:3333
+
+ -u p2pool
+
+ --cpu-max-threads-hint=100
+