Bitcoin Core Docker Setup [TH]
> คู่มือนี้จะแนะนำการ run docker container จาก docker image ของ [lnliz/docker-bitcoind](https://github.com/lnliz/docker-bitcoind)ใน repository นี้ จะมี Dockerfile ที่ใช้ในการสร้าง image bitcoin สามารถเข้าไปตรวจสอบกันได้เลยครับ
สวัสดีครับ เจอกันอีกแล้วหลังจากที่ผมได้มีโอกาสสอนในคอร์ส "Set up your own Node" ของ RightShift มาสองครั้งแล้ว การติดตั้งซอฟต์แวร์ด้วยตนเองนั้นดีจริง ๆ สำหรับผม แต่บางครั้งมันก็มีความยุ่งยากอยู่บ้าง และอาจจะไม่เหมาะกับทุกคนที่อยากจะเป็นเจ้าของ Bitcoin Node ของตัวเอง จึงลองทดสอบติดตั้งบน Docker เพื่อดูว่ามันจะง่ายขึ้นหรือไม่ และได้ออกมาเป็นบทความนี้
ไม่ต้องพูดมากแล้ว เรามาเริ่มกันเลยดีกว่า
## Requirements
ก่อนเริ่มต้น โปรดตรวจสอบว่าคุณมีสิ่งต่อไปนี้:
- คอมพิวเตอร์ที่ใช้ระบบปฏิบัติการ Linux (Ubuntu, Debian เป็นต้น)
- Docker
- พื้นที่ดิสก์: แนะนำ SSD ขนาด 1TB ขึ้นไป (สำหรับข้อมูล Full Blockchain)
## ซอฟต์แวร์ที่ใช้ (Software Used)
ในบทความนี้จะใช้ซอฟต์แวร์ดังต่อไปนี้:
- Bitcoin Core: ซอฟต์แวร์หลักสำหรับรัน Bitcoin Node
- Tor: สำหรับการเชื่อมต่อแบบไม่ระบุตัวตนและเพิ่มเสริมความเป็นส่วนตัว
- I2P: สำหรับการเชื่อมต่อแบบไม่ระบุตัวตนและเพิ่มเสริมความเป็นส่วนตัว
## โครงสร้างไฟล์ (File Structure)
โครงสร้างไฟล์สำหรับการตั้งค่า Bitcoin Node ด้วย Docker มีลักษณะดังนี้:
```text
.
├── docker-compose.yml
└── data
├── bitcoin
│ └── bitcoin.conf
├── tor
│ └── config
│ └── torrc
└── i2pd
```
## พอร์ตที่ใช้ (Ports Used)
| Port | Service |
| ---- | ------------ |
| 8332 | Bitcoin RPC |
| 8333 | Bitcoin P2P |
| 9050 | Tor SOCKS |
| 9051 | Tor Control |
| 7656 | I2P SAM |
## ขั้นตอนการติดตั้ง (Step-by-Step)
### 1. อัปเดตแพ็กเกจให้เป็นปัจจุบัน:
1.1 อัปเดตแพ็กเกจและอัปเกรดระบบ:
```bash
sudo apt update && sudo apt upgrade -y
```
1.2 ติดตั้งแพ็กเกจที่จำเป็น:
```bash
sudo apt install wget curl gnupg tar ufw python3 -y
```
### 2. ติดตั้ง Docker:
2.1 ดาวน์โหลดสคริปต์ติดตั้ง Docker:
```bash
curl -fsSL https://get.docker.com -o get-docker.sh
```
2.2 รันสคริปติดตั้ง Docker:
```bash
sudo sh get-docker.sh
```
2.3 ตรวจสอบเวอร์ชั่นของ Docker:
```bash
docker --version
```
2.4 ตั้งค่าสิทธิ์ให้กับกลุ่ม Docker:
โดยเริ่มต้น คำสั่ง Docker จำเป็นต้องใช้สิทธิ์ root หรือใช้ sudo ในการรันคำสั่ง เราจะมาตั้งค่าให้อยู่ในกลุ่มเดียวกันโดยใช้คำสั่งนี้
```bash
sudo usermod -aG docker ${USER}
```
2.5 สลับเข้าสู่ user อีกครั้ง
```bash
su - ${USER}
```
2.6 ทดสอบคำสั่ง:
```bash
docker ps
```
ถ้าทุกอย่างถูกต้อง คุณจะเห็น output แบบนี้:
```
notoshi@notoshi:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
```
### 3. ตั้งค่า Firewall:
3.1 เปิดพอร์ตที่จำเป็นสำหรับ Bitcoin Node:
```bash
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 8333/tcp comment 'Bitcoin P2P'
sudo ufw allow 8332/tcp comment 'Bitcoin RPC'
sudo ufw allow 9050/tcp comment 'Tor SOCKS'
sudo ufw allow 9051/tcp comment 'Tor Control'
sudo ufw allow 7656/tcp comment 'I2P SAM'
```
3.2 เปิดใช้งาน Firewall:
```bash
sudo ufw enable
```
3.3 ตรวจสอบสถานะของ Firewall:
```bash
sudo ufw status
```
### 4. สร้างโฟลเดอร์สำหรับเก็บข้อมูลและไฟล์คอนฟิก:
4.1 สร้างโฟลเดอร์หลัก
```bash
mkdir bitcoin-node && cd bitcoin-node
```
4.2 สร้างโฟลเดอร์ย่อยตามโครงสร้าง:
```bash
mkdir -p data/bitcoin data/tor/config data/i2pd
```
4.3 สร้างไฟล์คอนฟิกสำหรับ Bitcoin Core:
```bash
nano data/bitcoin/bitcoin.conf
```
เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์:
```conf
# Bitcoin Core configuration file
# Network settings
server=1
daemon=0
maxconnections=40
# Indexing options
txindex=1
blockfilterindex=1
coinstatsindex=1
# ZMQ settings
zmqpubrawblock=tcp://0.0.0.0:28332
zmqpubrawtx=tcp://0.0.0.0:28333
zmqpubhashblock=tcp://0.0.0.0:28334
# RPC settings
rpcauth=rpcuser:hashed_password
rpcport=8332
rpcbind=0.0.0.0
rpcallowip=0.0.0/0
rpcallowip=127.0.0.1
rpcallowip=172.0.0.0/16
# Privacy & Tor proxy
proxy=tor:9050
onion=tor:9050
listen=1
bind=0.0.0.0
# Tor integration
proxyrandomize=1
onlynet=onion
listenonion=1
torcontrol=tor:9051
torpassword=change_me
# I2P integration
i2p=1
onlynet=i2p
i2pacceptincoming=1
i2psam=i2p:7656
# Transaction broadcast settings
mempoolexpiry=336
maxmempool=300
minrelaytxfee=0.00001
# Logging
debug=net
debug=tor
logips=0
```
> บันทึกและออกจาก nano โดยกด Ctrl + O แล้วกด Enter จากนั้นกด Ctrl + X
4.4 สร้าง rpcauth สำหรับการเข้าถึง RPC:
ดาวน์โหลดสคริปต์ rpcauth:
```bash
wget https://raw.githubusercontent.com/bitcoin/bitcoin/master/share/rpcauth/rpcauth.py
```
รันสคริปต์เพื่อสร้าง rpcauth:
```bash
python3 rpcauth.py rpcuser rpcpassword
```
ผลลัพธ์จะมีลักษณะดังนี้:
```
notoshi@notoshi:~/test$ python3 rpcauth.py bitcoin bitcoin
String to be appended to bitcoin.conf:
rpcauth=bitcoin:ffcd7d2c9d797345bbb5729d93233342$b719656c7bf93101bfa9bd03cf44ac87261f483f731a6d0896eb82c6e0a6760b
Your password:
bitcoin
```
คัดลอกผลลัพธ์ที่ได้และเพิ่มลงในไฟล์ bitcoin.conf ของคุณ:
```conf
rpcauth=bitcoin:ffcd7d2c9d797345bbb5729d93233342$b719656c7bf93101bfa9bd03cf44ac87261f483f731a6d0896eb82c6e0a6760b
```
4.5 สร้างไฟล์คอนฟิกสำหรับ Tor:
```bash
nano data/tor/config/torrc
```
เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์:
```torrc
# Tor configuration for Bitcoin Docker setup
# SOCKS proxy
SocksPort 0.0.0.0:9050
SocksPolicy accept 0.0.0.0/0
# Control port
ControlPort 0.0.0.0:9051
CookieAuthentication 0
HashedControlPassword hashed_password
# Log level
Log notice stdout
# Bitcoin-specific settings
StrictNodes 1
NumEntryGuards 4
# Allow IPv6
ClientUseIPv6 1
# Hidden service (optional)
#HiddenServiceDir /var/lib/tor/bitcoin_peer
#HiddenServicePort 8333 172.17.0.1:8333
```
> บันทึกและออกจาก nano โดยกด Ctrl + O แล้วกด Enter จากนั้นกด Ctrl + X
สร้าง hash password สำหรับ Tor control port:
```bash
docker run --rm dockurr/tor tor --hash-password yourstrongpassword
```
ผลลัพธ์จะมีลักษณะดังนี้:
```
notoshi@notoshi:~/test$ docker run --rm dockurr/tor tor --hash-password bitcoin
16:891233E13110497E60FFE39190BD987748C17C6624862B7CEA38F1267E
```
คัดลอกผลลัพธ์ที่ได้และแทนที่ hashed_password ในไฟล์ torrc ด้วย hash ที่ได้จากคำสั่งด้านบน
```
HashedControlPassword 16:891233E13110497E60FFE39190BD987748C17C6624862B7CEA38F1267E
```
แก้ไขไฟล์ bitcoin.conf เพื่อเพิ่มรหัสผ่านสำหรับ Tor control port:
```conf
torpassword=bitcoin
```
### 5. สร้างไฟล์ docker-compose.yml และใช้งาน:
5.1 สร้างไฟล์ docker-compose.yml ในโฟลเดอร์หลักของคุณ:
```bash
nano docker-compose.yml
```
เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์:
```yaml
# Docker Compose configuration for Bitcoin, Tor, and I2P services
services:
bitcoin:
container_name: bitcoind
image: lnliz/bitcoind:v30.2
user: 1000:1000
restart: always
stopgraceperiod: 15m30s
ports:
- "8333:8333"
- "8332:8332"
- "28332:28332"
- "28333:28333"
volumes:
- ./data/bitcoin:/data/.bitcoin
tor:
container_name: tor
image: dockurr/tor:latest
user: root
command: tor -f /etc/tor/torrc
restart: always
ports:
- "9050:9050"
- "9051:9051"
volumes:
- ./data/tor/config:/etc/tor
- ./data/tor/data:/var/lib/tor
i2p:
container_name: i2p
image: purplei2p/i2pd:latest
user: root
command: --sam.enabled=true --sam.address=0.0.0.0 --sam.port=7656 --loglevel=error
restart: always
ports:
- "7656:7656"
volumes:
- ./data/i2pd:/home/i2pd/data
```
> บันทึกและออกจาก nano โดยกด Ctrl + O แล้วกด Enter จากนั้นกด Ctrl + X
5.2 รัน Docker Compose:
```bash
docker-compose up -d
```
5.3 ตรวจสอบสถานะของคอนเทนเนอร์:
```bash
docker-compose ps
```
คุณจะเห็นสถานะของคอนเทนเนอร์ทั้งสาม (bitcoin, tor, i2p) ว่ากำลังทำงานอยู่หรือไม่
5.4 วิธีตรวจสอบดู log ของคอนเทนเนอร์แต่ละ service:
```
docker-compose logs -f bitcoin
docker-compose logs -f tor
docker-compose logs -f i2p
```
## วิธีใช้งาน bitcoin-cli:
อยากใช้คำสั่ง bitcoin-cli ต้องเข้าสู่ shell ของคอนเทนเนอร์ก่อน
วิธีเข้าสู่ shell ของคอนเทนเนอร์ bitcoind:
```bash
docker exec -it bitcoind sh
```
จากนั้นคุณสามารถใช้คำสั่ง bitcoin-cli ได้ตามปกติ เช่น:
```
notoshi@notoshi:~/test$ docker exec -it bitcoind sh
/ $ bitcoin-cli -netinfo
Bitcoin Core client v30.2.0 - server 70016/Satoshi:30.2.0/
onion i2p total block
in 0 0 0
out 6 4 10 2
total 6 4 10
Local services: network, witness, network limited, p2p v2
Local addresses
f2vh2kkbwxpg7nunggxzi72i2bjlqo2ymdbhdsyd72sp6f3yxgvezsqd.onion port 8333 score 4
r7lkobgevhrzr5drrljpkehs75jctnluqouzc6vuecr2p4e3vgqa.b32.i2p port 0 score 4
/ $
```
วิธีออกจาก shell ของคอนเทนเนอร์:
```bash
exit
```
เป็นอย่างไรกันบ้างครับกับการ Set up Bitcoin Node ด้วย Docker หวังว่าบทความนี้จะช่วยให้ทุกคนสามารถมี Bitcoin Node ของตัวเองได้ง่ายขึ้นนะครับ ถ้ามีจุดไหนผิดพลาดสามรถแจ้งได้เลยครับผมยินดีรับฟังและแก้ไขให้ดีขึ้นครับ
หากบทความนี้มีประโยชน์ อย่าลืม zap หรือแชร์ต่อ และฝากติดตามผลงานของผมด้วยนะครับ ขอบคุณครับ!
> หมายเหตุ: บทความได้ไอเดียตั้งต้นมากจาก https://github.com/notoshi404/node-guide-th/tree/main/docker/bitcoin ขอบคุณ [kohanucha](https://github.com/kohanucha) ที่ PR มาเข้ามาใน repository นี้ครับ
#Siamstr #Bitcoin