From 381cf9e5a2ea4b5f7601545ad37b7fb70f74150b Mon Sep 17 00:00:00 2001 From: jholdstock Date: Tue, 2 Jun 2020 07:38:32 +0100 Subject: [PATCH] Add deployment guide. --- README.md | 30 ++++------------- docs/deployment.md | 78 +++++++++++++++++++++++++++++++++++++++++++++ docs/stakey.png | Bin 0 -> 31057 bytes 3 files changed, 85 insertions(+), 23 deletions(-) create mode 100644 docs/deployment.md create mode 100644 docs/stakey.png diff --git a/README.md b/README.md index b0cf964..09dff08 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ ## Overview + + vspd is a from scratch implementation of a Voting Service Provider (VSP) for the Decred network. @@ -52,32 +54,14 @@ libraries: ## Deployment -- Single server running vspd and dcrd. dcrd on this server is used for fishing - ticket details out of the chain, and for broadcasting and checking the status - of fee transactions. `--txindex` is required so `getrawtransaction` can be - used. - -- A xpub key is provided to vspd via config. vspd will use this key to - derive a new addresses for each fee payments. It is recommended to export an - xpub from a cold wallet which is not a part of the vspd deployment. - -- Multiple remote voting servers, each running dcrwallet and dcrd. dcrwallet on - these servers should be constantly unlocked and have voting enabled. Three - voting servers in different physical locations are recommended for production. - -## Backup - -The bbolt database file used by vspd is stored in the process home directory, at -the path `{homedir}/data/{network}/vspd.db`. vspd keeps a file lock on this -file, so it cannot be opened by any other processes while vspd is running. - -To facilitate back-ups, vspd will write periodically write a copy of the bbolt -database to the path `{homedir}/data/{network}/vspd.db-backup`. A copy of the -database file will also be written to this path when vspd shuts down. +A vspd deployment consists of a single front-end server which handles web +requests, and a number of remote servers which host voting wallets. For more +information about deploying vspd, check out +[deployment.md](./docs/deployment.md). ## Issue Tracker -The [integrated github issue tracker](https://github.com/decred/vspd/issues) +The [integrated GitHub issue tracker](https://github.com/decred/vspd/issues) is used for this project. ## License diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 0000000..98e624f --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,78 @@ +# Deployment Guide + +This guide is deliberately written at a high level and with minimal details +because it is assumed that VSP operators will already have a level of +familiarity with Decred software and a level of sysadmin experience. + +## Prerequisites + +### Build from source + +Compiled binaries are not provided for vspd - VSP operators are expected to +build vspd from source. + +### Fee wallet + +A wallet should be created to collect VSP fees. Ideally this would be a cold +wallet which is not used for any other purpose, and it should be completely +separate from the vspd infrastructure. The dcrwallet `getmasterpubkey` RPC +should be used to export an extended public (xpub) key from one of the wallet +accounts. This xpub key will be provided to vspd via config, and vspd will use +it to derive a new addresses for receiving fee payments. + +## Front-end Server + +The front-end server is where vspd will be running. The port vspd is listening +on (default `3000`) should be available for clients to reach over the internet. +This port is used for both the API and serving the HTML front end. + +dcrd needs to be running on this server with transaction index enabled +(`--txindex`). dcrd is used for fishing ticket details out of the chain, for +receiving `blockconnected` notifications, and for broadcasting and checking the +status of fee transactions. + +## Voting Servers + +A vspd deployment should have a minimum of three remote voting wallets. The +servers hosting these wallets should ideally be in geographically seperate +locations. + +Each voting server should be running an instance of dcrd and dcrwallet. The +wallet on these servers should be completely empty and not used of any other +purpose. dcrwallet should be permenantly unlocked and have voting enabled +(`--enablevoting`). vspd on the front-end server must be able to reach each +instance of dcrwallet over RPC. + +## Deploying alongside dcrstakepool + +It is possible to run vspd on the same infrastructure as an existing +dcrstakepool deployment. + +- On the voting servers... + - The existing dcrd instance requires no changes. + - Create a new instance of dcrwallet listening for RPC connections on a + different port. Ensure wallet is unlocked and voting is enabled + (dcrstakepool wallet should have voting disabled). + +- On the front-end server... + - Run an instance of dcrd with txindex enabled. + - Run the vspd binary and ensure the listening port can be reached over the + internet. Configure vspd to use the newly created dcrwallet instances. + +## Monitoring + +// TODO + +## Backup + +The bbolt database file used by vspd is stored in the process home directory, at +the path `{homedir}/data/{network}/vspd.db`. vspd keeps a file lock on this +file, so it cannot be opened by any other processes while vspd is running. + +To facilitate back-ups, vspd will periodically write a copy of the bbolt +database to the path `{homedir}/data/{network}/vspd.db-backup`. A copy of the +database file will also be written to this path when vspd shuts down. + +## Disaster Recovery + +// TODO diff --git a/docs/stakey.png b/docs/stakey.png new file mode 100644 index 0000000000000000000000000000000000000000..55009b0664abcb5f539aeea78c8ca4d7ad1bd49f GIT binary patch literal 31057 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