minor typos in HOWTO
[electrum-server.git] / HOWTO.md
1 How to run your own Electrum server
2 ===================================
3
4 Abstract
5 --------
6
7 This document is an easy to follow guide to installing and running your own
8 Electrum server on Linux. It is structured as a series of steps you need to
9 follow, ordered in the most logical way. The next two sections describe some
10 conventions we use in this document and hardware, software and expertise
11 requirements.
12
13 The most up-to date version of this document is available at:
14
15     https://github.com/spesmilo/electrum-server/blob/master/HOWTO.md
16
17 Conventions
18 -----------
19
20 In this document, lines starting with a hash sign (#) or a dollar sign ($)
21 contain commands. Commands starting with a hash should be run as root,
22 commands starting with a dollar should be run as a normal user (in this
23 document, we assume that user is called 'bitcoin'). We also assume the
24 bitcoin user has sudo rights, so we use '$ sudo command' when we need to.
25
26 Strings that are surrounded by "lower than" and "greater than" ( < and > )
27 should be replaced by the user with something appropriate. For example,
28 <password> should be replaced by a user chosen password. Do not confuse this
29 notation with shell redirection ('command < file' or 'command > file')!
30
31 Lines that lack hash or dollar signs are pastes from config files. They
32 should be copied verbatim or adapted, without the indentation tab.
33
34 Prerequisites
35 -------------
36
37 **Expertise.** You should be familiar with Linux command line and
38 standard Linux commands. You should have basic understanding of git,
39 Python packages. You should have knowledge about how to install and
40 configure software on your Linux distribution. You should be able to
41 add commands to your distribution's startup scripts. If one of the
42 commands included in this document is not available or does not
43 perform the operation described here, you are expected to fix the
44 issue so you can continue following this howto.
45
46 **Software.** A recent Linux distribution with the following software
47 installed: `python`, `easy_install`, `git`, a SQL server, standard C/C++
48 build chain. You will need root access in order to install other software or
49 Python libraries. You will need access to the SQL server to create users and
50 databases.
51
52 **Hardware.** It's recommended to run a pruning server with leveldb.
53 It is a light setup with diskspace requirements well under 1 GB growing 
54 very moderately and less taxing on I/O and CPU once it's up and running. 
55 Full (archival) servers on the other hand use SQL. At the time of this writing, 
56 the Bitcoin blockchain is 5.5 GB large. The corresponding SQL database is 
57 about 4 times larger, so you should have a minimum of 22 GB free space just 
58 for SQL, growing continuously. 
59 CPU speed is also important, mostly for the initial block chain import, but 
60 also if you plan to run a public Electrum server, which could serve tens 
61 of concurrent requests. See step 6 below for some initial import benchmarks 
62 on SQL.
63
64 Instructions
65 ------------
66
67 ### Step 0. Create a user for running bitcoind and Electrum server
68
69 This step is optional, but for better security and resource separation I
70 suggest you create a separate user just for running `bitcoind` and Electrum.
71 We will also use the `~/bin` directory to keep locally installed files
72 (others might want to use `/usr/local/bin` instead). We will download source
73 code files to the `~/src` directory.
74
75     # sudo adduser bitcoin
76     # su - bitcoin
77     $ mkdir ~/bin ~/src
78     $ echo $PATH
79
80 If you don't see `/home/bitcoin/bin` in the output, you should add this line
81 to your `.bashrc`, `.profile` or `.bash_profile`, then logout and relogin:
82
83     PATH="$HOME/bin:$PATH"
84
85 ### Step 1. Download and install Electrum
86
87 We will download the latest git snapshot for Electrum and 'install' it in
88 our ~/bin directory:
89
90     $ mkdir -p ~/src/electrum
91     $ cd ~/src/electrum
92     $ git clone https://github.com/spesmilo/electrum-server.git server
93     $ chmod +x ~/src/electrum/server/server.py
94     $ ln -s ~/src/electrum/server/server.py ~/bin/electrum
95
96 ### Step 2. Download Bitcoind from git & patch it
97
98 In order for the latest versions of Electrum to work properly we will need to use the latest 
99 build from Git and also patch it with an electrum specific patch.
100
101    $ cd src && git clone git://github.com/bitcoin/bitcoin.git
102    $ cd bitcoin 
103    $ patch -p1 < ~/src/electrum/server/patch/patch
104    $ cd src && make -f makefile.unix
105
106 ### Step 3. Configure and start bitcoind
107
108 In order to allow Electrum to "talk" to `bitcoind`, we need to set up a RPC
109 username and password for `bitcoind`. We will then start `bitcoind` and
110 wait for it to complete downloading the blockchain.
111
112     $ mkdir ~/.bitcoin
113     $ $EDITOR ~/.bitcoin/bitcoin.conf
114
115 Write this in `bitcoin.conf`:
116
117     rpcuser=<rpc-username>
118     rpcpassword=<rpc-password>
119     daemon=1
120
121 Restart `bitcoind`:
122
123     $ bitcoind
124
125 Allow some time to pass, so `bitcoind` connects to the network and starts
126 downloading blocks. You can check its progress by running:
127
128     $ bitcoind getinfo
129
130 You should also set up your system to automatically start bitcoind at boot
131 time, running as the 'bitcoin' user. Check your system documentation to
132 find out the best way to do this.
133
134
135 ### Step 4. Select your backend - pruning leveldb or full abe server
136
137 Electrum server can currently be operated in two modes - as a pruning server
138 or as a full server. The pruning server uses leveldb and keeps a smaller and
139 faster database by pruning spent transactions. It's a lot quicker to get up
140 and running and requires less maintenance and diskspace than the full abe
141 server.
142
143 The full version uses abe as a backend. While the blockchain in bitcoind
144 is at roughly 5.5 GB in January 2013, the abe mysql for a full server requires
145 ~25 GB diskspace for innodb and can take a week or two (!) to freshly index 
146 on most but the fastest of hardware.
147
148 Full servers are useful for recovering all past transactions when restoring 
149 from seed. Those are then stored in electrum.dat and won't need to be recovered
150 until electrum.dat is removed. Pruning servers summarize spent transactions
151 when restoring from seed which can be feature. Once seed recovery is done
152 switching between pruning and full servers can be done at any time without effect
153 to the transaction history stored in electrum.dat.
154
155 While it's useful for Electrum to have a number of full servers it is 
156 expected that the vast majority of servers available publicly will be 
157 pruning servers.
158
159 If you decide to setup a pruning server with leveldb take a break from this 
160 document, read and work through README.leveldb then come back
161 install jsonrcp (but not abe) from step 5 and then skip to step 8
162
163 ### Step 5. Install Electrum dependencies
164
165 Electrum server depends on various standard Python libraries. These will be
166 already installed on your distribution, or can be installed with your
167 package manager. Electrum also depends on two Python libraries which we wil
168 l need to install "by hand": `Abe` and `JSONRPClib`.
169
170     $ sudo easy_install jsonrpclib
171     $ cd ~/src
172     $ wget https://github.com/jtobey/bitcoin-abe/archive/v0.7.1.tar.gz
173     $ cd bitcoin-abe
174     $ sudo python setup.py install
175
176 Electrum server does not currently support abe > 0.7.1 so please stick 
177 with 0.7.1 for the time being. If you're version is < 0.7 you need to upgrade
178 to 0.7.1!
179
180 Please note that the path below might be slightly different on your system,
181 for example python2.6 or 2.8.
182
183     $ sudo chmod +x /usr/local/lib/python2.7/dist-packages/Abe/abe.py
184     $ ln -s /usr/local/lib/python2.7/dist-packages/Abe/abe.py ~/bin/abe
185
186
187 ### Step 6. Configure the database
188
189 Electrum server uses a SQL database to store the blockchain data. In theory,
190 it supports all databases supported by Abe. At the time of this writing,
191 MySQL and PostgreSQL are tested and work ok, SQLite was tested and *does not
192 work* with Electrum server.
193
194 For MySQL:
195
196     $ mysql -u root -p
197     mysql> create user 'electrum'@'localhost' identified by '<db-password>';
198     mysql> create database electrum;
199     mysql> grant all on electrum.* to 'electrum'@'localhost';
200     mysql> exit
201
202 For PostgreSQL:
203
204     TBW!
205
206 ### Step 7. Configure Abe and import blockchain into the database
207
208 When you run Electrum server for the first time, it will automatically
209 import the blockchain into the database, so it is safe to skip this step.
210 However, our tests showed that, at the time of this writing, importing the
211 blockchain via Abe is much faster (about 20-30 times faster) than
212 allowing Electrum to do it.
213
214     $ cp ~/src/bitcoin-abe/abe.conf ~/abe.conf
215     $ $EDITOR ~/abe.conf
216
217 For MySQL, you need these lines:
218
219     dbtype MySQLdb
220     connect-args = { "db" : "electrum", "user" : "electrum" , "passwd" : "<database-password>" }
221
222 For PostgreSQL, you need these lines:
223
224     TBD!
225
226 Start Abe:
227
228     $ abe --config ~/abe.conf
229
230 Abe will now start to import blocks. You will see a lot of lines like this:
231
232     'block_tx <block-number> <tx-number>'
233
234 You should wait until you see this message on the screen:
235
236     Listening on http://localhost:2750
237
238 It means the blockchain is imported and you can exit Abe by pressing CTRL-C.
239 You will not need to run Abe again after this step, Electrum server will
240 update the blockchain by itself. We only used Abe because it is much faster
241 for the initial import.
242
243 Important notice: This is a *very* long process. Even on fast machines,
244 expect it to take hours. Here are some benchmarks for importing
245 ~196K blocks (size of the Bitcoin blockchain in Septeber 2012):
246
247   * System 1: ~9 hours.
248           * CPU: Intel Core i7 Q740 @ 1.73GHz
249           * HDD: very fast SSD
250   * System 2: ~55 hours.
251           * CPU: Intel Xeon X3430 @ 2.40GHz
252           * HDD: 2 x SATA in a RAID1.
253
254 ### Step 8. Configure Electrum server
255
256 Electrum reads a config file (/etc/electrum.conf) when starting up. This
257 file includes the database setup, bitcoind RPC setup, and a few other
258 options.
259
260     $ sudo cp ~/src/electrum/server/electrum.conf.sample /etc/electrum.conf
261     $ sudo $EDITOR /etc/electrum.conf
262
263 Go through the sample config options and set them to your liking.
264 If you intend to run the server publicly have a look at README-IRC.md 
265
266 If you're looking to run SSL / HTTPS you need to generate a self-signed certificate
267 using openssl. Otherwise you can just comment out the SSL / HTTPS ports and run 
268 without.
269
270 ### Step 9. (Finally!) Run Electrum server
271
272 The magic moment has come: you can now start your Electrum server:
273
274     $ server
275
276 You should see this on the screen:
277
278     starting Electrum server
279     cache: yes
280
281 If you want to stop Electrum server, open another shell and run:
282
283     $ electrum-server stop
284
285 You should also take a look at the 'start' and 'stop' scripts in
286 `~/src/electrum/server`. You can use them as a starting point to create a
287 init script for your system.
288
289 ### Step 10. Test the Electrum server
290
291 We will assume you have a working Electrum client, a wallet and some
292 transactions history. You should start the client and click on the green
293 checkmark (last button on the right of the status bar) to open the Server
294 selection window. If your server is public, you should see it in the list
295 and you can select it. If you server is private, you need to enter its IP
296 or hostname and the port. Press Ok, the client will disconnect from the
297 current server and connect to your new Electrum server. You should see your
298 addresses and transactions history. You can see the number of blocks and
299 response time in the Server selection window. You should send/receive some
300 bitcoins to confirm that everything is working properly.
301
302 ### Step 11. Join us on IRC
303
304 Say hi to the dev crew, other server operators and fans on 
305 irc.freenode.net #electrum and we'll try to congratulate you
306 on supporting the community by running an Electrum node