more modularisation
[electrum-server.git] / HOWTO
1 How to run your own Electrum server
2
3
4 Abstract
5
6 This document is an easy to follow guide to installing and running your own Electrum server on Linux. It is structured as a series of steps you need to follow, ordered in the most logical way. The next two sections describe some conventions we use in this document and hardware, software and expertise requirements.
7
8 The most up-to date version of this document is available at: https://gitorious.org/electrum/electrum/blobs/master/server/HOWTO
9
10
11 Conventions
12
13 In this document, lines starting with a hash sign (#) or a dollar sign ($) contain commands. Commands starting with a hash should be run as root, commands starting with a dollar should be run as a normal user (in this document, we assume that user is called 'bitcoin'). We also assume the bitcoin user has sudo rights, so we use '$ sudo command' when we need to.
14
15 Strings that are surrounded by "lower than" and "greater than" ( < and > ) should be replaced by the user with something appropriate. For example, <password> should be replaced by a user chosen password. Do not confuse this notation with shell redirection ('command < file' or 'command > file')!
16
17 Lines that are indented with a tab are pastes from config files. They should be copied verbatim or adapted, without the indentation tab.
18
19
20 Prerequisites
21
22 Expertise. You should be familiar with Linux command line and standard Linux commands. You should have basic understanding of git, Python packages, compiling and applying patches to source code. You should have knowledge about how to install and configure software on your Linux distribution. You should be able to add commands to your distribution's startup scripts. If one of the commands included in this document is not available or does not perform the operation described here, you are expected to fix the issue so you can continue following this howto.
23
24 Software. A recent Linux distribution with the following software installed: python, easy_install, git, a SQL server, standard C/C++ build chain. You will need root access in order to install other software or Python libraries. You will need access to the SQL server to create users and databases.
25
26 Hardware. Running a Bitcoin node and Electrum server is resource intensive. At the time of this writing, the Bitcoin blockchain is 1.2 GB large. The corresponding SQL database is about 4 time larger, so you should have a minimum of 6.5 GB free space. You should expect the total size to grow with time. CPU speed is also important, mostly for the initial blockchain import, but also if you plan to run a public Electrum server, which could serve tens of concurrent requests. See step 6 below for some initial import benchmarks.
27
28
29 Step 0.  Create a user for running bitcoind and Electrum server
30
31 This step is optional, but for better security and resource separation I suggest you create a separate user just for running bitcoind and Electrum. We will also use the ~/bin directory to keep locally installed files (others might want to use /usr/local/bin instead). We will download source code files to the ~/src directory.
32
33 # sudo adduser bitcoin
34 # su - bitcoin
35 $ mkdir ~/bin ~/src
36 $ echo $PATH
37
38 If you don't see /home/bitcoin/bin in the output, you should add this line to your .bashrc, .profile or .bash_profile, then logout and relogin:
39
40         PATH="$HOME/bin:$PATH"
41
42
43 Step 1. Download and install Electrum
44
45 We will download the latest git snapshot for Electrum and 'install' it in our ~/bin directory:
46
47 $ cd ~/src
48 $ git clone git://gitorious.org/electrum/electrum.git
49 $ chmod +x ~/src/electrum/server/server.py
50 $ ln -s ~/src/electrum/server/server.py ~/bin/electrum-server
51
52
53 Step 2. Install a patched version of bitcoind
54
55 Electrum server requires some small modifications to the bitcoind daemon. The patch is included in the Electrum sources we just downloaded, now we will download the Bitcoin sources, patch, compile and install the binary to our ~/bin directory.
56
57 $ cd ~/src
58 $ wget https://github.com/bitcoin/bitcoin/tarball/v0.5.2 -O bitcoin-0.5.2.tgz
59 $ tar xvzf bitcoin-0.5.2.tgz
60 $ mv bitcoin-bitcoin-fb24b05 bitcoin-0.5.2
61 $ cd bitcoin-0.5.2/src
62 $ patch -p 2 < ~/src/electrum/server/patches/bitcoin-0.5.2.diff
63 $ make -f makefile.unix
64 $ strip bitcoind
65 $ mv bitcoind ~/bin
66
67
68 Step 3. Configure and start bitcoind.
69
70 In order to allow Electrum to "talk" to bitcoind, we need to set up a RPC username and password for bitcoind. We will then start bitcoind and wait for it to complete downloading the blockchain.
71
72 $ mkdir ~/.bitcoin
73 $ $EDITOR ~/.bitcoin/bitcoin.conf
74
75         rpcuser=<rpc-username>
76         rpcpassword=<rpc-password>
77         daemon=1
78
79 $ bitcoind
80
81 Allow some time to pass, so bitcoind connects to the network and starts downloading blocks. You can check its progress by running:
82
83 $ bitcoind getinfo
84
85 You should also set up your system to automatically start bitcoind at boot time, running as the 'bitcoin' user. Check your system documentation to find out the best way to do this.
86
87
88 Step 4. Install Electrum dependencies
89
90 Electrum server depends on various standard Python libraries. These will be already installed on your distribution, or can be installed with your package manager. Electrum also depends on two Python libraries which we will need to install "by hand": Abe and JSONRPClib.
91
92 $ sudo easy_install jsonrpclib
93 $ cd ~/src
94 $ git clone git://github.com/jtobey/bitcoin-abe.git
95 $ cd bitcoin-abe
96 $ sudo python setup.py install
97 $ sudo chmod +x /usr/local/lib/python2.7/dist-packages/Abe/abe.py
98 $ ln -s /usr/local/lib/python2.7/dist-packages/Abe/abe.py ~/bin/abe
99
100
101 Step 5. Configure the database
102
103 Electrum server uses a SQL database to store the blockchain data. In theory, it supports all databases supported by Abe. At the time of this writing, MySQL and PostgreSQL are tested and work ok, SQLite was tested and does not work with Electrum server.
104
105 For MySQL:
106
107 $ mysql -u root -p
108 mysql> create user 'electrum'@'localhost' identified by '<database-password>';
109 mysql> create database electrum;
110 mysql> grant all on electrum.* to 'electrum'@'localhost';
111 mysql> exit
112
113 For PostgreSQL:
114
115 TDB!
116
117
118 Step 6. Configure Abe and import blockchain into the database
119
120 When you run Electrum server for the first time, it will automatically import the blockchain into the database, so it is safe to skip this step. However, our tests showed that, at the time of this writing, importing the blockchaind via Abe is much faster (about 20-30 times faster) than allowing Electrum to do it.
121
122 $ cp ~/src/bitcoin-abe/abe.conf ~/abe.conf
123 $ $EDITOR ~/abe.conf
124
125 For MySQL, you need these lines:
126
127         dbtype MySQLdb
128         connect-args = { "db" : "electrum", "user" : "electrum" , "passwd" : "<database-password>" }
129
130 For PostgreSQL, you need these lines:
131
132         TBD!
133
134 Start Abe:
135
136 $ abe --config ~/abe.conf
137
138 Abe will now start to import blocks. You will see a lot of lines like this: 'block_tx <block-number> <tx-number>'. You should wait until you see this message on the screen:
139
140 Listening on http://localhost:2750
141
142 It means the blockchain is imported and you can exit Abe by pressing CTRL-C. You will not need to run Abe again after this step, Electrum server will update the blockchain by itsself. We only used Abe because it is much faster for the initial import.
143
144 Important notice: This is a *very* long process. Even on fast machines you can expect it to take hours. Here are some benchmarks for importing ~159.400 blocks (size of the Bitcoin blockchain at the time of this writing):
145
146 System 1: ~8 hours.
147         * CPU: Intel Core i7 Q740 @ 1.73GHz
148         * HDD: very fast SSD
149 System 2: ~48 hours.
150         * CPU: Intel Xeon X3430 @ 2.40GHz
151         * HDD: 2 x SATA in a RAID1.
152
153
154 Step 7. Configure Electrum server
155
156 Electrum reads a config file (/etc/electrum.conf) when starting up. This file includes the database setup, bitcoind RPC setup and a few other options.
157
158 $ sudo cp ~/src/electrum/server/electrum.conf.sample /etc/electrum.conf
159 $ sudo $EDITOR /etc/electrum.conf
160
161         # sample server config for a public Electrum server     
162         [server]
163         host = host-fqdn
164         port = 50000
165         password = <electrum-server-password>
166         banner = Welcome to Electrum server!
167         irc = yes
168         ircname = public Electrum server
169         cache = yes
170
171         # sample server config for a private (does not advertise on IRC) Electrum server
172         [server]
173         host = localhost
174         port = 50000
175         password = <electrum-server-password>
176         banner = Welcome to Electrum server!
177         irc = no
178         ircname = foo
179         cache = yes
180
181         # database setup - MySQL
182         [database]
183         type = MySQLdb
184         database = electrum
185         username = electrum
186         password = <database-password>
187
188         # database setup - PostgreSQL
189         TBD!
190
191         # bitcoind RPC setup
192         [bitcoind]
193         host = localhost
194         port = 8332
195         user = <rpc-username>
196         password = <rpc-password>
197
198         
199 Step 8. (Finally!) Run Electrum server
200
201 The magic moment has come: you can now start your Electrum server:
202
203 $ electrum-server
204
205 You should see this on the screen:
206
207 starting Electrum server
208 cache: yes
209
210 If you want to stop Electrum server, open another shell and run:
211
212 $ electrum-server stop
213
214 You should also take a look at the 'start' and 'stop' scripts in ~/src/electrum/server . You can use them as a starting point to create a init script for your system.
215
216
217 9. Test the Electrum server
218
219 We will assume you have a working Electrum client, a wallet and some transactions history. You should start the client and click on the green check mark (last button on the right of the status bar) to open the Server selection window. If your server is public, you should see it in the list and you can select it. If you server is private, you need to enter its IP or hostname and the port. Press Ok, the client will disconnect from the current server and connect to your new Electrum server. You should see your addresses and transactions history. You can see the number of blocks and response time in the Server selection window. You should send/receive some bitcoins to confirm that everything is working properly.
220