Skip to content

Instantly share code, notes, and snippets.

@mks-m
Forked from romanz/fullnode.md
Last active November 13, 2023 14:26
Show Gist options
  • Save mks-m/e0f1c7555e8f3e7da4a103c2418e82d8 to your computer and use it in GitHub Desktop.
Save mks-m/e0f1c7555e8f3e7da4a103c2418e82d8 to your computer and use it in GitHub Desktop.
Bitcoin Full Node on AWS Free Tier
# Bitcoin Full Node on AWS Free Tier
## Provisioning
- Launch one T2 micro instance, using Ubuntu 14.04 LTS AMI.
- Open SSH and Bitcoin Protocol TCP ports: 22, 8333.
- Attach 40GB EBS volume for blockchain storage to /dev/sdf.
- Attach 1GB EBS volume for swap to /dev/sdp.
The pricing should be ~3$ for the first year (assuming 30GB upload per month).
See [here](http://calculator.s3.amazonaws.com/index.html#r=IAD&s=EC2&key=calc-7C655B73-FA35-40F0-9518-4773E3E4A8C7) for more details.
## Installing
- Run as superuser:
```
$ sudo add-apt-repository -y ppa:bitcoin/bitcoin
$ sudo apt-get update -y
$ mkdir ~/.bitcoin/
$ sudo apt-get install bitcoind -y
```
- Add the following to /etc/fstab configuration:
```
# /dev/xvdf is EXT4 filesystem under /home/ubuntu/.bitcoin
/dev/xvdf /home/ubuntu/.bitcoin ext4 defaults 0 0
# /dev/xvdp1 is a swap partition
/dev/xvdp1 none swap sw 0 0
```
Mount them using:
```
sudo mount -a
```
- Use the following configuration file (`.bitcoin/bitcoin.conf`):
```
server=1
daemon=1
connections=40
rpcuser=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
rpcpassword=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
disablewallet=1
```
- Use the following traffic control script (`.bitcoin/utils/tc.sh`) for bandwidth throttling:
```
#network interface on which to limit traffic
IF="eth0"
#limit of the network interface in question
LINKCEIL="1gbit"
#limit outbound Bitcoin protocol traffic to this rate
LIMIT="200kbit"
#defines the address space for which you wish to disable rate limiting
LOCALNET="172.31.0.0/16"
#delete existing rules
tc qdisc del dev ${IF} root
#add root class
tc qdisc add dev ${IF} root handle 1: htb default 10
#add parent class
tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL}
#add our two classes. one unlimited, another limited
tc class add dev ${IF} parent 1:1 classid 1:10 htb rate ${LINKCEIL} ceil ${LINKCEIL} prio 0
tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} prio 1
#add handles to our classes so packets marked with <x> go into the class with "... handle <x> fw ..."
tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11
#limit outgoing traffic to and from port 8333. but not when dealing with a host on the local network
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET} -j MARK --set-mark 0x2
```
- Use the following logrotate script (`.bitcoin/utils/rotate.conf`):
```
"/home/ubuntu/.bitcoin/debug.log" {
daily
missingok
rotate 5
copytruncate
compress
}
```
- Use the following crontab:
```
@reboot bitcoind
@reboot sudo /home/ubuntu/.bitcoin/utils/tc.sh
@daily logrotate /home/ubuntu/.bitcoin/utils/logrotate.conf
```
# Testing
- Run bitcoin server and watch its log file:
```
bitcoind
tail -F ~/.bitcoin/debug.log
```
- Connect to its public IP from https://getaddr.bitnodes.io/, to make sure it is accepting connections from other nodes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment