-
Notifications
You must be signed in to change notification settings - Fork 1k
Quick Start Guide
Before you start working with this guide: Do not create issue reports if you fail to get it working! This is most often caused by a setup mistake, over-reading a configuration or system step or simply not being into Linux, Apache and MySQL enough. But don't fret! MPOS has a very active community, so if you are struggling to get things to work, try our IRC Channel FIRST! New issue reports regarding the setup or running of MPOS will always be closed by commenting to join IRC for further assistance: https://webchat.freenode.net/?channels=#mpos
Now, onwards! Make sure to always try fixing things yourself before asking others to hold your hands!
Before following this guide this warning is given as advice and a word of warning. Running a live pool is a job which requires in depth knowledge of pool code as well as the ability to debug and fix the pool. By NO means is this an in depth guide to running a pool and as such should only be used for private/testnet pools! As running a pool is a long and tiresome process where many different things can affect the stability and usability of the pool, it is guaranteed that problems will occur. If help is required it can be obtained in the MPOS channel however a person must be able to show that they have tried to resolve a problem themselves. Otherwise help will not be given as the running of the pool in itself is a difficult process
This guide will help you get your MPOS interface setup including all dependencies and software required. Please use this as a guide on how get things to work but keep in mind that things change and maybe this Wiki page is outdated and things do not work anymore as expected.
If you intend to follow this quick start guide please ensure you know what you are doing. Basic concepts in Linux like compiling and installing software, configuring Apache and other services should be a no-brainer to you.
This guide is NOT taking care of security or any special setups to make this installation secure. You should consider:
- adding a special DB user just for
MPOS
- ensures you are not using root which could break things
- create a new virtual host and point the DocumentRoot towards the public folder
- This way the cronjobs folder can be locked down and not be available to the website itself
- run all 3rd party services as non-root
- if one of them has a flaw your root account is not compromised
When you decide to use MPOS
please be so kind and leave the footer intact. You are not the author of the software and should honor those that have worked on it. I don't mind changing the LTC donation address at the bottom, but keep in mind who really wrote this software and would deserve those ;-).
My base system used in this guide is Ubuntu Server 16.10 LTS. During setup I kept most defaults and installed the OpenSSH (for easier access) and LAMP Server groups during software selection. Other software and tools required will be mentioned in this guide.
Update your server:
sudo apt-get update
sudo apt-get dist-upgrade
Run these two commands till there are no more updates. Remember to run these commands again any time you install dependencies to make sure you have the latest versions.
In order to get started install some basic tools. Other tools will be installed when needed.
sudo apt-get install git
sudo apt-get install build-essential libcurl4-openssl-dev libdb5.3-dev libdb5.3++-dev mysql-server
I have organized all the dependencies you will need here at the beginning of the guide, so that they may be put out of the way right away.
For NOMP stratum
Install Redis Server following these instructions.
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
For python-stratum
sudo apt-get install python-twisted python-mysqldb python-dev python-setuptools python-memcache python-simplejson python-pylibmc
sudo easy_install -U distribute
For MPOS:
sudo apt-get install memcached php-memcached php7.0-mysqlnd php7.0-curl php7.0-json php7.0-curl libapache2-mod-php7.0
sudo apt-get install php-mbstring php-dom
sudo apache2ctl -k stop; sleep 2; sudo apache2ctl -k start
sudo apt-get install libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils python3
sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev
# Alternative for boost:
sudo apt-get install libboost-all-dev
Because of Bitcoin, the crypto world just loves to use BerkeleyDB 4.8 - it is available from the archive
wget http://download.oracle.com/berkeley-db/db-4.8.30.zip
unzip db-4.8.30.zip
cd db-4.8.30
cd build_unix/
../dist/configure --prefix=/usr/local --enable-cxx
make
make install
cd ..
Note: Litecoin is only used as an example, as it should guarantee a working MPOS, please, replace litecoind with the coin of your choice.
You can grab the latest version from Litecoin @ Github:
cd ~
git clone git://github.com/litecoin-project/litecoin.git
With that all set up we can compile and install:
# Change to litecoin folder
cd ~
cd litecoin
./autogen.sh
./configure --with-incompatible-bdb
make
make check
make install
Again, this is not necessary for a real MPOS pool. Testing MPOS on the testnet of your coin is suggested
Now that we have a working executable we can fetch the testnet for Litecoin from Github:
cd ~
git clone git://github.com/xrobau/litecoin-testnet-box.git
cd litecoin-testnet-box
The included .conf in the /1 folder will not function properly if the username and password remain the same, so you will have to edit the file so that one of them does not match the other.
vi 1/litecoin.conf
Now you can start your server.
make start
If everything went well you should now get some information from the RPCs, this data can vary depending on version numbers used and changes to the net since the first access:
root@ubuntu-server:~/litecoin-testnet-box# make getinfo
litecoind -datadir=1 getinfo
{
"version" : 60300,
"protocolversion" : 60001,
"walletversion" : 60000,
"balance" : 0.00000000,
"blocks" : 0,
"connections" : 1,
"proxy" : "",
"difficulty" : 0.00024414,
"testnet" : true,
"keypoololdest" : 1369211361,
"keypoolsize" : 101,
"paytxfee" : 0.00000000,
"mininput" : 0.00010000,
"errors" : ""
}
litecoind -datadir=2 getinfo
{
"version" : 60300,
"protocolversion" : 60001,
"walletversion" : 60000,
"balance" : 0.00000000,
"blocks" : 0,
"connections" : 1,
"proxy" : "",
"difficulty" : 0.00024414,
"testnet" : true,
"keypoololdest" : 1369211361,
"keypoolsize" : 101,
"paytxfee" : 0.00000000,
"mininput" : 0.00010000,
"errors" : ""
}
Success! Litecoin is now setup and working properly running on a test network. No actual blocks are calculated here but this is enough for testing purposes later.
You can fetch your wallet address via litecoind inside your testnet checkout from the testnet folder:
litecoind -datadir=1 getaccountaddress ""
Remember this address, you'll need it later.
To mine on this server with a remote graphic card on your network you need to determine your machines IP.
ifconfig
Now point your miner, I will be using cgminer.
cgminer.exe --scrypt -o http://yourip:19334 -u -p
You should now be mining!
There exists many stratum mining server software alternatives which you have to choose one from and configure MPOS to work with;
Stratum Mining
Stratum Mining is a software which supports all PoW and PoS coins including Litecoin, Bitcoin, PPcoin and Novacoin.This is rather easy to implement so here a quick start guide if you wish to try it out. MPOS
does support stratum, For VARDIFF support MPOS must be set to match the initial pool target in the stratum-mining
config file.
NOMP
A new stratum has been created, named NOMP, if you would like to use this instead of stratum-mining, please follow this link. Either one will work. NOMP supports x11, quark, scrypt, sha, and more. NOMP is written in node.js
CoiniumServ
Yet another stratum server alternative called CoiniumServ exists which can run on any platform (Windows, Linux and MacOS) and supports many algorithms. Check project's documentation wiki for setup & configuration guides.
First we need to install some packages required to run stratum-mining
:
cd ~
sudo apt-get install python-twisted python-mysqldb python-dev python-setuptools python-memcache python-simplejson python-pylibmc
sudo easy_install -U distribute
We need to fetch stratum-mining
and some additional code for a stratum
implementation:
git clone https://github.com/Tydus/litecoin_scrypt.git
git clone https://github.com/ahmedbodi/stratum-mining.git
git clone https://github.com/ahmedbodi/stratum.git
That covers the download. Lets go ahead and prepare the software!
We need to install litecoin_scrypt
and stratum
:
cd stratum-mining
git submodule init
git submodule update
cd externals/litecoin_scrypt
sudo python setup.py install
cd ~
cd stratum-mining/externals/stratum
sudo python setup.py install
Now that we have everything installed we can configure stratum-mining
to run with our testnet:
cd ~
cp stratum-mining/conf/config_sample.py stratum-mining/conf/config.py
vi stratum-mining/conf/config.py
You will need to adjust some settings for this to work:
CENTRAL_WALLET = 'Your_Valid_Bitcoin_or_Litecoin_Address'
[...]
COINDAEMON_TRUSTED_HOST = 'localhost'
COINDAEMON_TRUSTED_PORT = 19334
COINDAEMON_TRUSTED_USER = 'testnet'
COINDAEMON_TRUSTED_PASSWORD = 'testnet'
COINDAEMON_ALGO = 'scrypt'
COINDAEMON_Reward = 'POW'
COINDAEMON_SHA256_TX = 'no
[...]
HOSTNAME = 'yourservername'
[...]
DATABASE_DRIVER = 'mysql'
DB_MYSQL_HOST = 'localhost'
DB_MYSQL_DBNAME = 'mpos'
DB_MYSQL_USER = 'root'
DB_MYSQL_PASS = 'root'
[...]
POOL_TARGET = 16
[...]
SOLUTION_BLOCK_HASH = True
This is the easy part, but don't do it till you set up the database in the next steps. Change to the stratum-mining
folder and fire up the service:
cd stratum-mining
twistd -ny launcher.tac
If you want to run it in the background you can remove the -ny
and replace it with -y
:
twistd -y launcher.tac
When running stratum-mining I noticed that stratum and pushpoold use different settings. @pooler was nice enough to explain it to me in detail:
pushpoold
uses a target bits terminology and stratum a difficulty setting. These are different. When running pushpoold
at a target bit of 20 you will match the default setting of 16 in stratum-mining
. This will ensure that hashrates on MPOS
match up! If you'd think you could set pushpoold
to 16 and match it with stratum you will be off.
He devised a formula that can be used to change stratum
difficulty and match pushpoold
and MPOS
to it:
(stratum diff) ~= 2^((target bits in pushpool) - 16)
Add The Result To The Stratum Pool_Target
We need to install some additional software to ensure MPOS
will work as expected. This is a sample for Debian based systems and PHP 5, please adjust your packages if you are using a more recent PHP version:
sudo apt-get install memcached php5-memcached php5-mysqlnd php5-curl php5-json libapache2-mod-php5 php5-xml
sudo apache2ctl -k stop; sleep 2; sudo apache2ctl -k start
Note: PHP7 will require an additional package called php-dom
for Composer to work. You may also receive a warning that zip
is missing, the run apt-get install php-zip zip
as well.
Also, please download and check out the security warnings and errors triggered by phpsecinfo and fix those before attempting to run MPOS: http://phpsec.org/projects/phpsecinfo/
Just download the ZIP archive, unzip into your pools webroot and run the index.php
. Do not continue until everything shows green! The only exception is Maximum post size which needs to be a bit bigger so MPOS can store admin panel settings to the DB when clicking save.
Fetch the latest version of MPOS
:
# We move into the default webroot of Ubuntu
cd /var/www
sudo git clone git://github.com/MPOS/php-mpos.git MPOS
cd MPOS
sudo git checkout master
php composer.phar install
To allow your site to send messages you need to set up the mail server.
sudo apt-get install postfix
Accept 'internet server' and keep the defaults. This will set up Postfix.
During server installation MySQL was installed by using the LAMP Server
group. This also setup a password for your root
user. Use this password now to create the database and import the structure:
# Create database
sudo mysql -p -e "create database mpos"
# Import structure
sudo mysql -p mpos < sql/000_base_structure.sql
First, give proper permissions to our compiled templates and caching folder. This example shows the procedure in Ubuntu, other distributions may vary (apache in CentOS, httpd in others). Ensure to give the service user access that will be executing the scripts!
sudo chown -R www-data templates/compile templates/cache logs
We need to configure the project to work on our newly installed server:
sudo cp include/config/global.inc.dist.php include/config/global.inc.php
Now edit the configuration file and adjust the settings to match your database and litecoin RPC Client:
$config['db']['host'] = 'localhost';
$config['db']['user'] = 'root';
$config['db']['pass'] = 'root';
$config['db']['port'] = 3306;
$config['db']['name'] = 'mpos';
[...]
$config['wallet']['type'] = 'http';
$config['wallet']['host'] = 'localhost:19334';
$config['wallet']['username'] = 'testnet';
$config['wallet']['password'] = 'testnet';
[...]
$config['gettingstarted']['stratumurl'] = 'localhost';
You will also need to setup a proper, random (!) $config['SALT']
and another $config['SALTY']
secret! If you forgot that, you will get an error message after installing MPOS: You absolutely SHOULD NOT leave your SALT or SALTY default changing them will require registering again
.
SALT and SALTY must be a minimum of 24 characters or you will get an error message: 'SALT or SALTY is too short, they should be more than 24 characters and changing them will require registering again'
One final edit should be to edit: /usr/local/lib/python2.7/dist-packages/stratum-0.2.13-py2.7.egg/stratum/websocket_transport.py
Change:
from autobahn.websocket import WebSocketServerProtocol, WebSocketServerFactory
To:
from autobahn.twisted.websocket import WebSocketServerProtocol, WebSocketServerFactory
Now everything is setup and we should be able to test things.
Open your browser and head over to MPOS
on your server `http:///MPOS/public
You should be greeted with the homepage. Create a new account on the registration page (the first account will have admin rights and does not require a mail confirmation) and add a new worker!
Now with everything in place and running you can fire up a miner of your choice and test if shares are committed:
minerd -o stratum+tcp://<yourserverIP>:3333 -O YourAccount.worker:WorkerPassword -t 1
If all went well you should see this:
minerd -o stratum+tcp://localhost:3333 -O DummyUser.test:test -t 1
[2013-05-22 11:01:20] 1 miner threads started, using 'scrypt' algorithm.
[...]
[2013-05-22 11:01:21] thread 0: 4104 hashes, 6.38 khash/s
[2013-05-22 11:01:34] thread 0: 137208 hashes, 10.85 khash/s
[2013-05-22 11:01:34] accepted: 1/1 (100.00%), 10.85 khash/s (yay!!!)
[2013-05-22 11:01:34] thread 0: 288 hashes, 10.66 khash/s
Please test the same with cgminer
or a similar tool supporting stratum on port 3333
, the default port opened by the configuration in stratum-mining
.
Now with shares being committed and new blocks being generated in our test network head to the webinterface and your stats should be updated!
MPOS
comes with a few cronjobs that are part of the backend. Please set the up according to regular cron guides. MPOS
comes with a wrapper script that will run all crons for you. It is called run-crons.sh
and can be found in the cronjobs folder. Adjust this script to suit your needs, then add it to your cron service.
For testing purposes you can also run them from command line:
cd /var/www/MPOS/cronjobs
./run-crons.sh
You will not receive any output. Please check in cronjobs/logs
for the appropriate logfiles. For more detailed logs you can turn on debugging in the cronjobs/shared.inc.php
file.
For a small pool, this will work fine. If you are planning to run a medium sized pool in the future or expect a lot of shares, please read: cronjob advanced setup.
You are required to have a proper mail setup running on your box. Keep in mind that large pools can have quite excessive e-mails being sent over all. This is by design and increases security while also notifying uses about state changes in the pool. For smaller pools, running via an external provider will suffice. For larger once, you should look into a contract for Mail Relays.
A simple guide to get started with Gmail and Postfix can be found here: https://rtcamp.com/tutorials/linux/ubuntu-postfix-gmail-smtp/
You are required to secure your server, Using internal and external means. Pasting the below rules into your SSH console one line at a time from top to bottom would be a good start, But there are other considerations as well.
This assumes you will be using port 53 for DNS and you don't want UDP for anything else, And your webserver is serving on port 80, This doesn't restrict services such as SSH or FTP. You want to limit the rate your clients can connect at the door, and not rely solely on a cache to do it.
sudo iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
sudo iptables -A PORT_SCANNING -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j RETURN
sudo iptables -A PORT-SCANNING j DROP
sudo iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p udp -j DROP
sudo iptables -A OUTPUT -p udp -j DROP
You can find a more detailed explanation of what these do: HERE
Congratulations! You have now a running instance of MPOS
to test with! Please consider donating if you like my work and find this guide helpful!
Follow these instructions to perform this entire setup, minus the file configurations, in a quick and efficient bundle.
cd ~
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install git
sudo apt-get install build-essential libboost-all-dev libcurl4-openssl-dev libdb5.1-dev libdb5.1++-dev mysql-server
git clone git://github.com/litecoin-project/litecoin.git
cd litecoin/src
make -f makefile.unix USE_UPNP=-
sudo cp litecoind /usr/bin
cd ~
git clone git://github.com/xrobau/litecoin-testnet-box.git
cd litecoin-testnet-box
cd ~
sudo apt-get install python-twisted python-mysqldb python-dev python-setuptools python-memcache python-simplejson
easy_install -U distribute
git clone https://github.com/Tydus/litecoin_scrypt.git
git clone https://github.com/ahmedbodi/stratum-mining.git
git clone https://github.com/ahmedbodi/stratum.git
cd stratum-mining
git submodule init
git submodule update
cd externals/litecoin_scrypt
sudo python setup.py install
cd ~
cd stratum-mining/externals/stratum
sudo python setup.py install
cd ~
cp stratum-mining/conf/config_sample.py stratum-mining/conf/config.py
sudo apt-get install memcached php5-memcached php5-mysqlnd php5-curl
sudo apache2ctl -k stop; sleep 2; sudo apache2ctl -k start
cd ..
cd ..
cd var/www
sudo git clone git://github.com/MPOS/php-mpos.git MPOS
cd MPOS
php composer.phar install
sudo git checkout master
mysql -u -p -e "create database mpos"
mysql -u -p mpos < sql/000_base_structure.sql
sudo chown -R www-data templates/compile templates/cache
sudo cp include/config/global.inc.dist.php include/config/global.inc.php
Make sure you allow for 2 Gb of RAM in memory settings, if you leave it at the default 512 Mb some compiling commands won't be able to execute properly.
Or you can create a pagefile if more RAM is not available by using these commands.
sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048k
sudo mkswap /swapfile
sudo chown root:root /swapfile
sudo chmod 0600 /swapfile
sudo swapon /swapfile
This is temporary unless you add the file to your fstab.
sudo vi /etc/fstab
Add the following line to the end of the file
/swapfile swap swap defaults 0 0
Remember to set VMware to bridge your adapter so that your server will show up on the local network.
The server can be really touchy when trying to get a miner to connect to it. Keep trying, restart, fiddle with the .conf settings, etc, eventually it will begin working properly, though I had to create the server 8 times before it worked.
If easy_install doesn't work then run these additional lines first.
cd ~
sudo rm /usr/bin/easy_install*
sudo rm /usr/local/bin/easy_install*
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
sudo rm distribute_setup.py
This will compile and install two libraries that are required to run stratum-mining
. If running the git commands does not pull the git subfiles the first time, try deleting the stratum-mining folder and downloading it again.
To remove the slightly annoying "Could not reliably determine server name" warning message when restarting apache, just insert this line of code into the /etc/apache2/httpd.conf file:
ServerName yourservername
``` ikikeee
-
- installation of Redis requires TCL 8.5 or newer TCL Download Page