Move ENV-NOTES to ENVIRONMENT.rst
Improve environment documentation
This commit is contained in:
parent
d951898b01
commit
beb546219a
143
docs/ENV-NOTES
143
docs/ENV-NOTES
@ -1,143 +0,0 @@
|
|||||||
The following environment variables are required:
|
|
||||||
|
|
||||||
DB_DIRECTORY - path to the database directory (if relative, to `run` script)
|
|
||||||
USERNAME - the username the server will run as, if using `run` script
|
|
||||||
ELECTRUMX - path to the electrumx_server.py script (if relative,
|
|
||||||
to `run` script)
|
|
||||||
DAEMON_URL - A comma-separated list of daemon URLS. If more than one is
|
|
||||||
provided ElectrumX will failover to the next when one stops
|
|
||||||
working. The generic form is:
|
|
||||||
http://username:password@hostname:port/
|
|
||||||
The leading 'http://' is optional, as is the trailing
|
|
||||||
slash. The ':port' part is also optional and will default
|
|
||||||
to the standard RPC port for COIN if omitted.
|
|
||||||
|
|
||||||
The other environment variables are all optional and will adopt
|
|
||||||
sensible defaults if not specified.
|
|
||||||
|
|
||||||
COIN - see lib/coins.py, must be a coin NAME. Defaults to Bitcoin.
|
|
||||||
NETWORK - see lib/coins.py, must be a coin NET. Defaults to mainnet.
|
|
||||||
DB_ENGINE - database engine for the transaction database. Default is
|
|
||||||
leveldb. Supported alternatives are rocksdb and lmdb.
|
|
||||||
You will need to install the appropriate python packages.
|
|
||||||
Not case sensitive.
|
|
||||||
REORG_LIMIT - maximum number of blocks to be able to handle in a chain
|
|
||||||
reorganisation. ElectrumX retains some fairly compact
|
|
||||||
undo information for this many blocks in levelDB.
|
|
||||||
Default is 200.
|
|
||||||
HOST - the host that the TCP and SSL servers will use. Defaults to
|
|
||||||
localhost. Set to blank to listen on all addresses (IPv4
|
|
||||||
and IPv6).
|
|
||||||
TCP_PORT - if set will serve Electrum TCP clients on that HOST:TCP_PORT
|
|
||||||
SSL_PORT - if set will serve Electrum SSL clients on that HOST:SSL_PORT
|
|
||||||
If set, SSL_CERTFILE and SSL_KEYFILE must be filesystem paths.
|
|
||||||
RPC_PORT - Listen on this port for local RPC connections, defaults to
|
|
||||||
8000.
|
|
||||||
BANNER_FILE - a path to a banner file to serve to clients. The banner file
|
|
||||||
is re-read for each new client. The string $VERSION in your
|
|
||||||
banner file will be replaced with the ElectrumX version you
|
|
||||||
are runnning, such as 'ElectrumX 0.7.11'.
|
|
||||||
LOG_SESSIONS - the number of seconds between printing session statistics to
|
|
||||||
the log. Defaults to 3600. Set to zero to suppress this
|
|
||||||
logging.
|
|
||||||
ANON_LOGS - set to anything non-empty to remove IP addresses from
|
|
||||||
logs. By default IP addresses will be logged.
|
|
||||||
DONATION_ADDRESS - server donation address. Defaults to none.
|
|
||||||
|
|
||||||
These following environment variables are to help limit server
|
|
||||||
resource consumption and to prevent simple DoS. Address subscriptions
|
|
||||||
in ElectrumX are very cheap - they consume about 100 bytes of memory
|
|
||||||
each and are processed efficiently. I feel the defaults are low and
|
|
||||||
encourage you to raise them.
|
|
||||||
|
|
||||||
MAX_SESSIONS - maximum number of sessions. Once reached, TCP and SSL
|
|
||||||
listening sockets are closed until the session count drops
|
|
||||||
naturally to 95% of the limit. Defaults to 1,000.
|
|
||||||
MAX_SEND - maximum size of a response message to send over the wire,
|
|
||||||
in bytes. Defaults to 1,000,000 and will treat values
|
|
||||||
smaller than 350,000 as 350,000 because standard Electrum
|
|
||||||
protocol header chunk requests are almost that large.
|
|
||||||
The Electrum protocol has a flaw in that address
|
|
||||||
histories must be served all at once or not at all,
|
|
||||||
an obvious avenue for abuse. MAX_SEND is a
|
|
||||||
stop-gap until the protocol is improved to admit
|
|
||||||
incremental history requests. Each history entry
|
|
||||||
is appoximately 100 bytes so the default is
|
|
||||||
equivalent to a history limit of around 10,000
|
|
||||||
entries, which should be ample for most legitimate
|
|
||||||
users. If you increase this bear in mind one client
|
|
||||||
can request history for multiple addresses. Also,
|
|
||||||
the largest raw transaction you will be able to serve
|
|
||||||
to a client is just under half of MAX_SEND, as each raw
|
|
||||||
byte becomes 2 hexadecimal ASCII characters on the wire.
|
|
||||||
MAX_SUBS - maximum number of address subscriptions across all
|
|
||||||
sessions. Defaults to 250,000.
|
|
||||||
MAX_SESSION_SUBS - maximum number of address subscriptions permitted to a
|
|
||||||
single session. Defaults to 50,000.
|
|
||||||
BANDWIDTH_LIMIT - per-session periodic bandwith usage limit in bytes.
|
|
||||||
Bandwidth usage over each period is totalled, and
|
|
||||||
when this limit is exceeded each subsequent request
|
|
||||||
is stalled by sleeping before handling it,
|
|
||||||
effectively yielding processing resources to other
|
|
||||||
sessions. Each time this happens the event is
|
|
||||||
logged. The more bandwidth usage exceeds the limit
|
|
||||||
the longer the next request will sleep. Each sleep
|
|
||||||
is a round number of seconds with a minimum of one.
|
|
||||||
The bandwith usage counter is reset to zero at the
|
|
||||||
end of each period. Currently the period is
|
|
||||||
hard-coded to be one hour. The default limit value
|
|
||||||
is 2 million bytes.
|
|
||||||
SESSION_TIMEOUT - an integer number of seconds defaulting to 600.
|
|
||||||
Sessions with no activity for longer than this are
|
|
||||||
disconnected.
|
|
||||||
|
|
||||||
If you want IRC connectivity to advertise your node:
|
|
||||||
|
|
||||||
IRC - set to anything non-empty
|
|
||||||
IRC_NICK - the nick to use when connecting to IRC. The default is a
|
|
||||||
hash of REPORT_HOST. Either way 'E_' will be prepended.
|
|
||||||
REPORT_HOST - the host to advertise. Defaults to HOST.
|
|
||||||
REPORT_TCP_PORT - the TCP port to advertise. Defaults to TCP_PORT.
|
|
||||||
'0' disables publishing the port.
|
|
||||||
REPORT_SSL_PORT - the SSL port to advertise. Defaults to SSL_PORT.
|
|
||||||
'0' disables publishing the port.
|
|
||||||
REPORT_HOST_TOR - Tor .onion address to advertise. Appends '_tor" to nick.
|
|
||||||
REPORT_TCP_PORT_TOR - the TCP port to advertise for Tor. Defaults to
|
|
||||||
REPORT_TCP_PORT, unless it is '0', then use TCP_PORT.
|
|
||||||
'0' disables publishing the port.
|
|
||||||
REPORT_SSL_PORT_TOR - the SSL port to advertise for Tor. Defaults to
|
|
||||||
REPORT_SSL_PORT, unless it is '0', then use SSL_PORT.
|
|
||||||
'0' disables publishing the port.
|
|
||||||
|
|
||||||
If synchronizing from the Genesis block your performance might change
|
|
||||||
by tweaking the following cache variables. Cache size is only checked
|
|
||||||
roughly every minute, so the caches can grow beyond the specified
|
|
||||||
size. Also the Python process is often quite a bit fatter than the
|
|
||||||
combined cache size, because of Python overhead and also because
|
|
||||||
leveldb consumes a lot of memory during UTXO flushing. So I recommend
|
|
||||||
you set the sum of these to nothing over half your available physical
|
|
||||||
RAM:
|
|
||||||
|
|
||||||
HIST_MB - amount of history cache, in MB, to retain before flushing to
|
|
||||||
disk. Default is 300; probably no benefit being much larger
|
|
||||||
as history is append-only and not searched.
|
|
||||||
|
|
||||||
UTXO_MB - amount of UTXO and history cache, in MB, to retain before
|
|
||||||
flushing to disk. Default is 1000. This may be too large
|
|
||||||
for small boxes or too small for machines with lots of RAM.
|
|
||||||
Larger caches generally perform better as there is
|
|
||||||
significant searching of the UTXO cache during indexing.
|
|
||||||
However, I don't see much benefit in my tests pushing this
|
|
||||||
too high, and in fact performance begins to fall. My
|
|
||||||
machine has 24GB RAM; the slow down is probably because of
|
|
||||||
leveldb caching and Python GC effects. However this may be
|
|
||||||
very dependent on hardware and you may have different
|
|
||||||
results.
|
|
||||||
|
|
||||||
The following are for debugging purposes.
|
|
||||||
|
|
||||||
FORCE_REORG - if set to a positive integer, it will simulate a reorg
|
|
||||||
of the blockchain for that number of blocks on startup.
|
|
||||||
Although it should fail gracefully if set to a value
|
|
||||||
greater than REORG_LIMIT, I do not recommend it as I have
|
|
||||||
not tried it and there is a chance your DB might corrupt.
|
|
||||||
304
docs/ENVIRONMENT.rst
Normal file
304
docs/ENVIRONMENT.rst
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
=====================
|
||||||
|
Environment Variables
|
||||||
|
=====================
|
||||||
|
|
||||||
|
ElectrumX takes no command line arguments, instead its behaviour is
|
||||||
|
controlled by environment variables. Only a few are required to be
|
||||||
|
given, the rest will have sensible defaults if not specified. Many of
|
||||||
|
the defaults around resource usage are conservative; I encourage you
|
||||||
|
to review them.
|
||||||
|
|
||||||
|
Required
|
||||||
|
--------
|
||||||
|
|
||||||
|
These environment variables are always required:
|
||||||
|
|
||||||
|
* **DB_DIRECTORY**
|
||||||
|
|
||||||
|
The path to the database directory. Relative paths should be
|
||||||
|
relative to the parent process working directory. This is the
|
||||||
|
directory of the `run` script if you use it.
|
||||||
|
|
||||||
|
* **DAEMON_URL**
|
||||||
|
|
||||||
|
A comma-separated list of daemon URLs. If more than one is provided
|
||||||
|
ElectrumX will initially connect to the first, and failover to
|
||||||
|
subsequent ones round-robin style if one stops working.
|
||||||
|
|
||||||
|
The generic form of a daemon URL is:
|
||||||
|
|
||||||
|
`http://username:password@hostname:port/`
|
||||||
|
|
||||||
|
The leading `http://` is optional, as is the trailing slash. The
|
||||||
|
`:port` part is also optional and will default to the standard RPC
|
||||||
|
port for **COIN** and **NETWORK** if omitted.
|
||||||
|
|
||||||
|
|
||||||
|
For the `run` script
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
The following are required if you use the `run` script:
|
||||||
|
|
||||||
|
* **ELECTRUMX**
|
||||||
|
|
||||||
|
The path to the electrumx_server.py script. Relative paths should
|
||||||
|
be relative to the directory of the `run` script.
|
||||||
|
|
||||||
|
* **USERNAME**
|
||||||
|
|
||||||
|
The username the server will run as.
|
||||||
|
|
||||||
|
Miscellaneous
|
||||||
|
-------------
|
||||||
|
|
||||||
|
These environment variables are optional:
|
||||||
|
|
||||||
|
* **COIN**
|
||||||
|
|
||||||
|
Must be a *NAME* from one of the **Coin** classes in
|
||||||
|
`lib/coins.py`_. Defaults to `Bitcoin`.
|
||||||
|
|
||||||
|
* **NETWORK**
|
||||||
|
|
||||||
|
Must be a *NET* from one of the **Coin** classes in `lib/coins.py`_.
|
||||||
|
Defaults to `mainnet`.
|
||||||
|
|
||||||
|
* **DB_ENGINE**
|
||||||
|
|
||||||
|
Database engine for the transaction database. The default is
|
||||||
|
`leveldb`. Supported alternatives are `rocksdb` and `lmdb`. You
|
||||||
|
will need to install the appropriate python package for your engine.
|
||||||
|
The value is not case sensitive. Note that the current way
|
||||||
|
ElectrumX uses LMDB gives poor performance .
|
||||||
|
|
||||||
|
* **REORG_LIMIT**
|
||||||
|
|
||||||
|
The maximum number of blocks to be able to handle in a chain
|
||||||
|
reorganisation. ElectrumX retains some fairly compact undo
|
||||||
|
information for this many blocks in levelDB. The default is a
|
||||||
|
function of **COIN** and **NETWORK**; for Bitcoin mainnet it is 200.
|
||||||
|
|
||||||
|
* **HOST**
|
||||||
|
|
||||||
|
The host that the TCP and SSL servers will use. Defaults to
|
||||||
|
`localhost`. Set to blank to listen on all addresses (IPv4 and IPv6).
|
||||||
|
|
||||||
|
* **TCP_PORT**
|
||||||
|
|
||||||
|
If set ElectrumX will serve TCP clients on **HOST**:**TCP_PORT**.
|
||||||
|
|
||||||
|
* **SSL_PORT**
|
||||||
|
|
||||||
|
If set ElectrumX will serve SSL clients on **HOST**:**SSL_PORT**.
|
||||||
|
If set SSL_CERTFILE and SSL_KEYFILE must be defined and be
|
||||||
|
filesystem paths to those SSL files.
|
||||||
|
|
||||||
|
* **RPC_PORT**
|
||||||
|
|
||||||
|
ElectrumX will listen on this port for local RPC connections.
|
||||||
|
ElectrumX listens for RPC connections unless this is explicity set
|
||||||
|
to blank. It defaults appropriately for **COIN** and **NETWORK**
|
||||||
|
(e.g., 8000 for Bitcoin mainnet) if not set.
|
||||||
|
|
||||||
|
* **DONATION_ADDRESS**
|
||||||
|
|
||||||
|
The server donation address reported to Electrum clients. Defaults
|
||||||
|
to empty, which Electrum interprets as meaning there is none.
|
||||||
|
|
||||||
|
* **BANNER_FILE**
|
||||||
|
|
||||||
|
The path to a banner file to serve to clients. Relative file paths
|
||||||
|
must be relative to **DB_DIRECTORY**. The banner file is re-read
|
||||||
|
for each new client.
|
||||||
|
|
||||||
|
You can place several meta-variables in your banner file, which will be
|
||||||
|
replaced before serving to a client.
|
||||||
|
|
||||||
|
+ **$VERSION** is replaced with the ElectrumX version you are
|
||||||
|
runnning, such as *ElectrumX 0.9.22*.
|
||||||
|
+ **$DAEMON_VERSION** is replaced with the daemon's version as a
|
||||||
|
dot-separated string. For example *0.12.1*.
|
||||||
|
+ **$DAEMON_SUBVERSION** is replaced with the daemon's user agent
|
||||||
|
string. For example, `/BitcoinUnlimited:0.12.1(EB16; AD4)/`.
|
||||||
|
+ **$DONATION_ADDRESS** is replaced with the address from the
|
||||||
|
**DONATION_ADDRESS** environment variable.
|
||||||
|
|
||||||
|
* **ANON_LOGS**
|
||||||
|
|
||||||
|
Set to anything non-empty to replace IP addresses in logs with
|
||||||
|
redacted text like 'xx.xx.xx.xx:xxx'. By default IP addresses will
|
||||||
|
be written to logs.
|
||||||
|
|
||||||
|
* **LOG_SESSIONS**
|
||||||
|
|
||||||
|
The number of seconds between printing session statistics to the
|
||||||
|
log. The output is identical to the **sessions** RPC command except
|
||||||
|
that **ANON_LOGS** is honoured. Defaults to 3600. Set to zero to
|
||||||
|
suppress this logging.
|
||||||
|
|
||||||
|
Resource Usage Limits
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The following environment variables are all optional and help to limit
|
||||||
|
server resource consumption and prevent simple DoS.
|
||||||
|
|
||||||
|
Address subscriptions in ElectrumX are very cheap - they consume about
|
||||||
|
100 bytes of memory each (160 bytes from version 0.10.0) and are
|
||||||
|
processed efficiently. I feel the two subscription-related defaults
|
||||||
|
below are low and encourage you to raise them.
|
||||||
|
|
||||||
|
* **MAX_SESSIONS**
|
||||||
|
|
||||||
|
The maximum number of incoming connections. Once reached, TCP and
|
||||||
|
SSL listening sockets are closed until the session count drops
|
||||||
|
naturally to 95% of the limit. Defaults to 1,000.
|
||||||
|
|
||||||
|
* **MAX_SEND**
|
||||||
|
|
||||||
|
The maximum size of a response message to send over the wire, in
|
||||||
|
bytes. Defaults to 1,000,000. Values smaller than 350,000 are
|
||||||
|
taken as 350,000 because standard Electrum protocol header "chunk"
|
||||||
|
requests are almost that large.
|
||||||
|
|
||||||
|
The Electrum protocol has a flaw in that address histories must be
|
||||||
|
served all at once or not at all, an obvious avenue for abuse.
|
||||||
|
**MAX_SEND** is a stop-gap until the protocol is improved to admit
|
||||||
|
incremental history requests. Each history entry is appoximately
|
||||||
|
100 bytes so the default is equivalent to a history limit of around
|
||||||
|
10,000 entries, which should be ample for most legitimate users. If
|
||||||
|
you use a higher default bear in mind one client can request history
|
||||||
|
for multiple addresses. Also note that the largest raw transaction
|
||||||
|
you will be able to serve to a client is just under half of
|
||||||
|
MAX_SEND, as each raw byte becomes 2 hexadecimal ASCII characters on
|
||||||
|
the wire. Very few transactions on Bitcoin mainnet are over 500KB
|
||||||
|
in size.
|
||||||
|
|
||||||
|
* **MAX_SUBS**
|
||||||
|
|
||||||
|
The maximum number of address subscriptions across all sessions.
|
||||||
|
Defaults to 250,000.
|
||||||
|
|
||||||
|
* **MAX_SESSION_SUBS**
|
||||||
|
|
||||||
|
The maximum number of address subscriptions permitted to a single
|
||||||
|
session. Defaults to 50,000.
|
||||||
|
|
||||||
|
* **BANDWIDTH_LIMIT**
|
||||||
|
|
||||||
|
Per-session periodic bandwith usage limit in bytes. This is a soft,
|
||||||
|
not hard, limit. Currently the period is hard-coded to be one hour.
|
||||||
|
The default limit value is 2 million bytes.
|
||||||
|
|
||||||
|
Bandwidth usage over each period is totalled, and when this limit is
|
||||||
|
exceeded each subsequent request is stalled by sleeping before
|
||||||
|
handling it, effectively giving higher processing priority to other
|
||||||
|
sessions. Each time this happens the event is logged.
|
||||||
|
|
||||||
|
The more bandwidth usage exceeds this soft limit the longer the next
|
||||||
|
request will sleep. Sleep times are a round number of seconds with
|
||||||
|
a minimum of 1.
|
||||||
|
|
||||||
|
Bandwidth usage is gradually reduced over time by "refunding" a
|
||||||
|
proportional part of the limit every now and then.
|
||||||
|
|
||||||
|
* **SESSION_TIMEOUT**
|
||||||
|
|
||||||
|
An integer number of seconds defaulting to 600. Sessions with no
|
||||||
|
activity for longer than this are disconnected. Properly
|
||||||
|
functioning Electrum clients by default will send pings roughly
|
||||||
|
every 60 seconds.
|
||||||
|
|
||||||
|
IRC
|
||||||
|
---
|
||||||
|
|
||||||
|
Use the following environment variables if you want to advertise
|
||||||
|
connectivity on IRC:
|
||||||
|
|
||||||
|
* **IRC**
|
||||||
|
|
||||||
|
Set to anything non-empty to advertise on IRC
|
||||||
|
|
||||||
|
* **IRC_NICK**
|
||||||
|
|
||||||
|
The nick to use when connecting to IRC. The default is a hash of
|
||||||
|
**REPORT_HOST**. Either way a prefix will be prepended depending on
|
||||||
|
**COIN** and **NETWORK**.
|
||||||
|
|
||||||
|
* **REPORT_HOST**
|
||||||
|
|
||||||
|
The host to advertise. Defaults to **HOST**.
|
||||||
|
|
||||||
|
* **REPORT_TCP_PORT**
|
||||||
|
|
||||||
|
The TCP port to advertise. Defaults to **TCP_PORT**. '0' disables
|
||||||
|
publishing the port.
|
||||||
|
|
||||||
|
* **REPORT_SSL_PORT**
|
||||||
|
|
||||||
|
The SSL port to advertise. Defaults to **SSL_PORT**. '0' disables
|
||||||
|
publishing the port.
|
||||||
|
|
||||||
|
* **REPORT_HOST_TOR**
|
||||||
|
|
||||||
|
The tor .onion address to advertise. If set, an additional
|
||||||
|
connection to IRC happens with '_tor" appended to **IRC_NICK**.
|
||||||
|
|
||||||
|
* **REPORT_TCP_PORT_TOR**
|
||||||
|
|
||||||
|
The TCP port to advertise for Tor. Defaults to **REPORT_TCP_PORT**,
|
||||||
|
unless it is '0', otherwise **TCP_PORT**. '0' disables publishing
|
||||||
|
the port.
|
||||||
|
|
||||||
|
* **REPORT_SSL_PORT_TOR**
|
||||||
|
|
||||||
|
The SSL port to advertise for Tor. Defaults to **REPORT_SSL_PORT**,
|
||||||
|
unless it is '0', otherwise **SSL_PORT**. '0' disables publishing
|
||||||
|
the port.
|
||||||
|
|
||||||
|
Cache
|
||||||
|
-----
|
||||||
|
|
||||||
|
If synchronizing from the Genesis block your performance might change
|
||||||
|
by tweaking the following cache variables. Cache size is only checked
|
||||||
|
roughly every minute, so the caches can grow beyond the specified
|
||||||
|
size. Also the Python process is often quite a bit fatter than the
|
||||||
|
combined cache size, because of Python overhead and also because
|
||||||
|
leveldb consumes a lot of memory during UTXO flushing. So I recommend
|
||||||
|
you set the sum of these to nothing over half your available physical
|
||||||
|
RAM:
|
||||||
|
|
||||||
|
* **HIST_MB**
|
||||||
|
|
||||||
|
The amount of history cache, in MB, to retain before flushing to
|
||||||
|
disk. Default is 300; probably no benefit being much larger as
|
||||||
|
history is append-only and not searched.
|
||||||
|
|
||||||
|
I do not recommend setting this above 500.
|
||||||
|
|
||||||
|
* **UTXO_MB**
|
||||||
|
|
||||||
|
The amount of UTXO and history cache, in MB, to retain before
|
||||||
|
flushing to disk. Default is 1000. This may be too large for small
|
||||||
|
boxes or too small for machines with lots of RAM. Larger caches
|
||||||
|
generally perform better as there is significant searching of the
|
||||||
|
UTXO cache during indexing. However, I don't see much benefit in my
|
||||||
|
tests pushing this too high, and in fact performance begins to fall.
|
||||||
|
My machine has 24GB RAM; the slow down is probably because of
|
||||||
|
leveldb caching and Python GC effects.
|
||||||
|
|
||||||
|
I do not recommend setting this above 2000.
|
||||||
|
|
||||||
|
Debugging
|
||||||
|
---------
|
||||||
|
|
||||||
|
The following are for debugging purposes:
|
||||||
|
|
||||||
|
* **FORCE_REORG**
|
||||||
|
|
||||||
|
If set to a positive integer, it will simulate a reorg of the
|
||||||
|
blockchain for that number of blocks on startup. Although it should
|
||||||
|
fail gracefully if set to a value greater than **REORG_LIMIT**, I do
|
||||||
|
not recommend it as I have not tried it and there is a chance your
|
||||||
|
DB might corrupt.
|
||||||
|
|
||||||
|
.. _lib/coins.py: https://github.com/kyuupichan/electrumx/blob/master/lib/coins.py
|
||||||
Loading…
Reference in New Issue
Block a user