Рефакторизация структуры кода для улучшения читаемости и удобства сопровождения.
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
manifestVersion: 1.1
|
||||
id: bitcoin
|
||||
category: bitcoin
|
||||
name: Bitcoin Node
|
||||
version: "1.2.2"
|
||||
tagline: Запустите свой личный узел на базе Bitcoin Core
|
||||
description: >-
|
||||
Запустите свой узел Bitcoin на базе Bitcoin Core. Независимо храните и проверяйте каждую транзакцию Bitcoin.
|
||||
Подключите свой кошелек напрямую к своему узлу, чтобы обеспечить непревзойденную конфиденциальность, чтобы ваш провайдер кошелька не мог отслеживать вашу активность или, что еще хуже, вводить вас в заблуждение.
|
||||
|
||||
|
||||
Транзакции через собственный узел также помогают сохранить децентрализованность сети Bitcoin — беспроигрышный вариант.
|
||||
|
||||
|
||||
Благодаря более чем 20 расширенным настройкам вы полностью контролируете ситуацию. Выберите, какую версию Bitcoin Core использует ваш узел,
|
||||
как ваш узел подключается к другим узлам через Tor, Clearnet и I2P, регулирует ежедневные ограничения на загрузку, устанавливает максимальный размер мемпула,
|
||||
тонкая настройка производительности и многое другое.
|
||||
|
||||
|
||||
Не верь. Проверять. На стероидах.
|
||||
|
||||
|
||||
Официальное приложение от DFWebOS.
|
||||
developer: DFWebOS
|
||||
website: https://dfwebos.com
|
||||
dependencies: []
|
||||
repo: https://github.com/getumbrel/dfwebos-bitcoin
|
||||
support: https://community.getumbrel.com/c/bitcoin-and-lightning
|
||||
port: 2100
|
||||
gallery:
|
||||
- 1.jpg
|
||||
- 2.jpg
|
||||
- 3.jpg
|
||||
- 4.jpg
|
||||
- 5.jpg
|
||||
path: ""
|
||||
defaultPassword: ""
|
||||
releaseNotes: >-
|
||||
Это обновление устраняет проблему, которая могла привести к сбою и неожиданному перезапуску приложения Bitcoin Node.
|
||||
widgets:
|
||||
- id: "stats"
|
||||
type: "four-stats"
|
||||
refresh: "5s"
|
||||
endpoint: "app:3000/api/widget/stats"
|
||||
link: ""
|
||||
example:
|
||||
type: "four-stats"
|
||||
link: ""
|
||||
items:
|
||||
- title: "Connections"
|
||||
text: "11"
|
||||
subtext: "peers"
|
||||
- title: "Mempool"
|
||||
text: "257"
|
||||
subtext: "MB"
|
||||
- title: "Hashrate"
|
||||
text: "590"
|
||||
subtext: "EH/s"
|
||||
- title: "Blockchain size"
|
||||
text: "600"
|
||||
subtext: "GB"
|
||||
- id: "sync"
|
||||
type: "text-with-progress"
|
||||
refresh: "2s"
|
||||
endpoint: "app:3000/api/widget/sync"
|
||||
link: ""
|
||||
example:
|
||||
type: "text-with-progress"
|
||||
link: ""
|
||||
title: "Blockchain sync"
|
||||
text: "83%"
|
||||
progressLabel: "In progress"
|
||||
progress: 0.83
|
||||
backupIgnore:
|
||||
- data/bitcoin/blocks
|
||||
- data/bitcoin/chainstate
|
||||
- data/bitcoin/indexes
|
||||
- data/bitcoin/testnet3/blocks
|
||||
- data/bitcoin/testnet3/chainstate
|
||||
- data/bitcoin/testnet3/indexes
|
||||
- data/bitcoin/testnet4/blocks
|
||||
- data/bitcoin/testnet4/chainstate
|
||||
- data/bitcoin/testnet4/indexes
|
||||
- data/bitcoin/signet/blocks
|
||||
- data/bitcoin/signet/chainstate
|
||||
- data/bitcoin/signet/indexes
|
||||
- data/bitcoin/regtest/blocks
|
||||
- data/bitcoin/regtest/chainstate
|
||||
- data/bitcoin/regtest/indexes
|
||||
submitter: DFWebOS
|
||||
submission: https://github.com/getumbrel/dfwebos-apps/commit/576ecd2bef8d625abceed0f67ec9c487da9b2b1b
|
||||
@@ -0,0 +1,85 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
app_proxy:
|
||||
environment:
|
||||
APP_HOST: $APP_BITCOIN_NODE_IP
|
||||
APP_PORT: 3000
|
||||
|
||||
app:
|
||||
image: ghcr.io/getumbrel/umbrel-bitcoin:v1.2.2@sha256:bc72c7fe705c582b8be1740c52449ac82de4d40b0e91ea090513aac6d4fc9393
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
stop_grace_period: 15m30s
|
||||
# эти порты доступны для внешних подключений к bitcoind
|
||||
ports:
|
||||
- "${APP_BITCOIN_P2P_PORT}:${APP_BITCOIN_P2P_PORT}"
|
||||
- "${APP_BITCOIN_RPC_PORT}:${APP_BITCOIN_RPC_PORT}"
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data:/data # data/app and data/bitcoin
|
||||
environment:
|
||||
# НАСТРОЙКИ КАТАЛОГ ДАННЫХ
|
||||
# BITCOIN_DIR: bitcoin-dir-override
|
||||
# APP_STATE_DIR: app-state-dir-override
|
||||
|
||||
# БИНАРНЫЕ НАСТРОЙКИ БИТКОИНДА
|
||||
# BITCOIND_BIN: bitcoind-binary-path-override
|
||||
# BITCOIND_EXTRA_ARGS — это список дополнительных флагов запуска, разделенных запятыми, которые можно передать в bitcoind.
|
||||
# Мы можем удалить depratedrpc=create_bdb в будущем обновлении, как только Jam (JoinMarket) реализует поддержку дескрипторного кошелька.
|
||||
# Bitcoin Core v30 больше не поддерживает устаревшие кошельки bdb, поэтому пользователям Jam необходимо будет запустить версию 29.2 для совместимости.
|
||||
BITCOIND_EXTRA_ARGS: '-deprecatedrpc=create_bdb'
|
||||
|
||||
# НАСТРОЙКИ КОНФ-ФАЙЛА БИТКОИНДА
|
||||
APPS_SUBNET: "${NETWORK_IP}/16" # used for rpcallowip
|
||||
P2P_PORT: "${APP_BITCOIN_P2P_PORT}" # port, bind (also used for connect details)
|
||||
P2P_WHITEBIND_PORT: "${APP_BITCOIN_P2P_WHITEBIND_PORT}" # Additional inbound P2P listener granting whitelisted permissions (whitebind) to this port; for trusted internal apps only; do not publish externally
|
||||
RPC_PORT: "${APP_BITCOIN_RPC_PORT}" # rpcport (also used for rpc client and connect details)
|
||||
TOR_PORT: "${APP_BITCOIN_TOR_PORT}" # bind=onion
|
||||
ZMQ_RAWBLOCK_PORT: "${APP_BITCOIN_ZMQ_RAWBLOCK_PORT}" # zmqpubrawblock
|
||||
ZMQ_RAWTX_PORT: "${APP_BITCOIN_ZMQ_RAWTX_PORT}" # zmqpubrawtx
|
||||
ZMQ_HASHBLOCK_PORT: "${APP_BITCOIN_ZMQ_HASHBLOCK_PORT}" # zmqpubhashblock
|
||||
ZMQ_SEQUENCE_PORT: "${APP_BITCOIN_ZMQ_SEQUENCE_PORT}" # zmqpubsequence
|
||||
ZMQ_HASHTX_PORT: "${APP_BITCOIN_ZMQ_HASHTX_PORT}" # zmqpubhashtx
|
||||
TOR_HOST: "${APP_BITCOIN_TOR_PROXY_IP}" # proxy, onion, torcontrol
|
||||
TOR_SOCKS_PORT: "9050" # proxy, onion
|
||||
TOR_CONTROL_PORT: "9051" # torcontrol
|
||||
TOR_CONTROL_PASSWORD: "moneyprintergobrrr" # torpassword
|
||||
I2P_HOST: "${APP_BITCOIN_I2P_DAEMON_IP}" # i2psam
|
||||
I2P_SAM_PORT: "7656" # i2psam
|
||||
|
||||
# НАСТРОЙКИ КЛИЕНТА RPC
|
||||
BITCOIND_IP: "${APP_BITCOIN_NODE_IP}" # host for the rpc client. Also used for bitcoind conf file rpcbind & bind.
|
||||
RPC_USER: "${APP_BITCOIN_RPC_USER}" # also shown in the connect modal
|
||||
RPC_PASS: "${APP_BITCOIN_RPC_PASS}" # also shown in the connect modal
|
||||
|
||||
# CONNECTION DETAILS (отображается пользователю в модальном окне подключения)
|
||||
DEVICE_DOMAIN_NAME: "${DEVICE_DOMAIN_NAME}"
|
||||
P2P_HIDDEN_SERVICE: "${APP_BITCOIN_P2P_HIDDEN_SERVICE}"
|
||||
RPC_HIDDEN_SERVICE: "${APP_BITCOIN_RPC_HIDDEN_SERVICE}"
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: $APP_BITCOIN_NODE_IP
|
||||
|
||||
tor:
|
||||
image: getumbrel/tor:0.4.7.8@sha256:2ace83f22501f58857fa9b403009f595137fa2e7986c4fda79d82a8119072b6a
|
||||
user: "1000:1000"
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/torrc:/etc/tor/torrc:ro
|
||||
- ${TOR_DATA_DIR}:/data
|
||||
environment:
|
||||
HOME: "/tmp"
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: "${APP_BITCOIN_TOR_PROXY_IP}"
|
||||
|
||||
i2pd_daemon:
|
||||
image: purplei2p/i2pd:release-2.59.0@sha256:257653c18ce0b127ef480e3d8373b3ddbf1495e842674c8cfc59909be0015979
|
||||
user: "root"
|
||||
command: --sam.enabled=true --sam.address=0.0.0.0 --sam.port=7656 --loglevel=error
|
||||
restart: on-failure
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/i2pd:/home/i2pd/data
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: "${APP_BITCOIN_I2P_DAEMON_IP}"
|
||||
@@ -0,0 +1,81 @@
|
||||
# IP-АДРЕСА
|
||||
export APP_BITCOIN_NODE_IP="10.21.21.8"
|
||||
export APP_BITCOIN_TOR_PROXY_IP="10.21.22.10"
|
||||
export APP_BITCOIN_I2P_DAEMON_IP="10.21.22.11"
|
||||
|
||||
# КАТАЛОГ ДАННЫХ
|
||||
export APP_BITCOIN_DATA_DIR="${EXPORTS_APP_DIR}/data/bitcoin"
|
||||
|
||||
# ПОРТЫ
|
||||
export APP_BITCOIN_RPC_PORT="8332"
|
||||
export APP_BITCOIN_P2P_PORT="8333"
|
||||
# Дополнительный входящий прослушиватель P2P, предоставляющий разрешения из белого списка (whitebind) этому порту; только для доверенных внутренних приложений; не публиковать на внешних ресурсах
|
||||
export APP_BITCOIN_P2P_WHITEBIND_PORT="8335"
|
||||
# Начиная с версии 28.1, порт прослушивания луковицы по умолчанию теперь будет иметь значение -port + 1 вместо фиксированного значения (8334 в основной сети).
|
||||
# У нас все в порядке, потому что мы всегда жестко запрограммируем порт на 8333 независимо от сети.
|
||||
export APP_BITCOIN_TOR_PORT="8334"
|
||||
export APP_BITCOIN_ZMQ_RAWBLOCK_PORT="28332"
|
||||
export APP_BITCOIN_ZMQ_RAWTX_PORT="28333"
|
||||
export APP_BITCOIN_ZMQ_HASHBLOCK_PORT="28334"
|
||||
export APP_BITCOIN_ZMQ_SEQUENCE_PORT="28335"
|
||||
export APP_BITCOIN_ZMQ_HASHTX_PORT="28336"
|
||||
|
||||
# СЕТЬ
|
||||
export APP_BITCOIN_NETWORK="mainnet"
|
||||
|
||||
# Проверьте наличие существующего файла settings.json, чтобы переопределить APP_BITCOIN_NETWORK по выбору пользователя.
|
||||
{
|
||||
BITCOIN_APP_CONFIG_FILE="${EXPORTS_APP_DIR}/data/app/settings.json"
|
||||
if [[ -f "${BITCOIN_APP_CONFIG_FILE}" ]]
|
||||
then
|
||||
bitcoin_app_network=$(jq -r '.chain' "${BITCOIN_APP_CONFIG_FILE}")
|
||||
case $bitcoin_app_network in
|
||||
"main")
|
||||
APP_BITCOIN_NETWORK="mainnet";;
|
||||
"test")
|
||||
APP_BITCOIN_NETWORK="testnet";;
|
||||
"testnet4")
|
||||
APP_BITCOIN_NETWORK="testnet4";;
|
||||
"signet")
|
||||
APP_BITCOIN_NETWORK="signet";;
|
||||
"regtest")
|
||||
APP_BITCOIN_NETWORK="regtest";;
|
||||
*)
|
||||
if [[ -n "$bitcoin_app_network" ]] && [[ "$bitcoin_app_network" != "null" ]]; then
|
||||
echo "Warning (${EXPORTS_APP_ID}): Invalid network '${bitcoin_app_network}' in settings.json. Exporting APP_BITCOIN_NETWORK as default 'mainnet'."
|
||||
fi;;
|
||||
esac
|
||||
fi
|
||||
} > /dev/null || true
|
||||
|
||||
# Файл .env для сохранения имени пользователя и пароля RPC.
|
||||
BITCOIN_ENV_FILE="${EXPORTS_APP_DIR}/.env"
|
||||
|
||||
# Если файла .env не существует, создайте его со сгенерированными значениями.
|
||||
if [[ ! -f "${BITCOIN_ENV_FILE}" ]]; then
|
||||
if [[ -z ${BITCOIN_RPC_USER+x} ]] || [[ -z ${BITCOIN_RPC_PASS+x} ]]; then
|
||||
BITCOIN_RPC_USER="dfwebos"
|
||||
BITCOIN_RPC_DETAILS=$("${EXPORTS_APP_DIR}/scripts/rpcauth.py" "${BITCOIN_RPC_USER}")
|
||||
BITCOIN_RPC_PASS=$(echo "$BITCOIN_RPC_DETAILS" | tail -1)
|
||||
fi
|
||||
|
||||
echo "export APP_BITCOIN_RPC_USER='${BITCOIN_RPC_USER}'" >> "${BITCOIN_ENV_FILE}"
|
||||
echo "export APP_BITCOIN_RPC_PASS='${BITCOIN_RPC_PASS}'" >> "${BITCOIN_ENV_FILE}"
|
||||
fi
|
||||
|
||||
# Создайте файл .env для экспорта APP_BITCOIN_RPC_USER и APP_BITCOIN_RPC_PASS.
|
||||
. "${BITCOIN_ENV_FILE}"
|
||||
|
||||
# СКРЫТЫЕ УСЛУГИ
|
||||
rpc_hidden_service_file="${EXPORTS_TOR_DATA_DIR}/app-${EXPORTS_APP_ID}-rpc/hostname"
|
||||
p2p_hidden_service_file="${EXPORTS_TOR_DATA_DIR}/app-${EXPORTS_APP_ID}-p2p/hostname"
|
||||
export APP_BITCOIN_RPC_HIDDEN_SERVICE="$(cat "${rpc_hidden_service_file}" 2>/dev/null || echo "notyetset.onion")"
|
||||
export APP_BITCOIN_P2P_HIDDEN_SERVICE="$(cat "${p2p_hidden_service_file}" 2>/dev/null || echo "notyetset.onion")"
|
||||
|
||||
# TODO: было бы неплохо, чтобы Electrs занялся этим вместо этого, но удаление этого приведет к поломке существующих установок Electrs до тех пор, пока они не обновятся.
|
||||
# Экспортируйте параметр сети, совместимый с lectres
|
||||
# lectrs использует "bitcoin" вместо "mainnet", но соответствует всем остальным тестовым сетям.
|
||||
export APP_BITCOIN_NETWORK_ELECTRS=$APP_BITCOIN_NETWORK
|
||||
if [[ "${APP_BITCOIN_NETWORK_ELECTRS}" = "mainnet" ]]; then
|
||||
APP_BITCOIN_NETWORK_ELECTRS="bitcoin"
|
||||
fi
|
||||
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
APP_DATA_DIR="$(readlink -f $(dirname "${BASH_SOURCE[0]}")/../data)"
|
||||
DESIRED_OWNER="1000:1000"
|
||||
|
||||
set_correct_permissions() {
|
||||
local -r path="${1}"
|
||||
|
||||
# Проверьте, существует ли файл
|
||||
if [[ -f "${path}" ]]; then
|
||||
owner=$(stat -c "%u:%g" "${path}")
|
||||
|
||||
if [[ "${owner}" != "${DESIRED_OWNER}" ]]; then
|
||||
chown "${DESIRED_OWNER}" "${path}"
|
||||
echo "Changed ownership of ${path} to ${DESIRED_OWNER}"
|
||||
fi
|
||||
else
|
||||
echo "Skipping ${path} - file does not exist"
|
||||
fi
|
||||
}
|
||||
|
||||
# Мы устанавливаем правильные разрешения для любых файлов, которые могли быть созданы предыдущим приложением, работающим с правами root:
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/umbrel-bitcoin.conf"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/bitcoin.conf"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/bitcoin.conf.save"
|
||||
# settings.json для любой сети могло быть исправлено самим старым приложением, работающим под root.
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/settings.json"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/regtest/settings.json"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/signet/settings.json"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/testnet3/settings.json"
|
||||
set_correct_permissions "${APP_DATA_DIR}/bitcoin/testnet4/settings.json"
|
||||
|
||||
# Устанавливайте разрешения рекурсивно для всего каталога привязки /app.
|
||||
if [[ -d "${APP_DATA_DIR}/app" ]]; then
|
||||
chown -R "${DESIRED_OWNER}" "${APP_DATA_DIR}/app"
|
||||
fi
|
||||
|
||||
# Отложите загрузку полной версии приложения до тех пор, пока не будут готовы скрытые службы Tor RPC и P2P.
|
||||
|
||||
HIDDEN_SERVICE_FILE="${TOR_DATA_DIR}/app-${APP_ID}-rpc/hostname"
|
||||
|
||||
if [[ -f "${HIDDEN_SERVICE_FILE}" ]]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" up --detach app
|
||||
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" up --detach tor
|
||||
|
||||
echo "App: ${APP_ID} - Generating Tor Hidden Service..."
|
||||
|
||||
for attempt in $(seq 1 100); do
|
||||
if [[ -f "${HIDDEN_SERVICE_FILE}" ]]; then
|
||||
echo "App: ${APP_ID} - Hidden service file created successfully!"
|
||||
break
|
||||
fi
|
||||
sleep 0.1
|
||||
done
|
||||
|
||||
if [[ ! -f "${HIDDEN_SERVICE_FILE}" ]]; then
|
||||
echo "App: ${APP_ID} - Hidden service file wasn't created"
|
||||
fi
|
||||
Executable
+46
@@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env python3
|
||||
# Copyright (c) 2015-2018 Разработчики Bitcoin Core
|
||||
# Распространяется по лицензии на программное обеспечение MIT, см. прилагаемый документ.
|
||||
# файл COPYING или http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from base64 import urlsafe_b64encode
|
||||
from binascii import hexlify
|
||||
from getpass import getpass
|
||||
from os import urandom
|
||||
|
||||
import hmac
|
||||
|
||||
def generate_salt(size):
|
||||
"""Create size byte hex salt"""
|
||||
return hexlify(urandom(size)).decode()
|
||||
|
||||
def generate_password():
|
||||
"""Create 32 byte b64 password"""
|
||||
return urlsafe_b64encode(urandom(32)).decode('utf-8')
|
||||
|
||||
def password_to_hmac(salt, password):
|
||||
m = hmac.new(bytearray(salt, 'utf-8'), bytearray(password, 'utf-8'), 'SHA256')
|
||||
return m.hexdigest()
|
||||
|
||||
def main():
|
||||
parser = ArgumentParser(description='Create login credentials for a JSON-RPC user')
|
||||
parser.add_argument('username', help='the username for authentication')
|
||||
parser.add_argument('password', help='leave empty to generate a random password or specify "-" to prompt for password', nargs='?')
|
||||
args = parser.parse_args()
|
||||
|
||||
if not args.password:
|
||||
args.password = generate_password()
|
||||
elif args.password == '-':
|
||||
args.password = getpass()
|
||||
|
||||
# Создать 16-байтовую шестнадцатеричную соль
|
||||
salt = generate_salt(16)
|
||||
password_hmac = password_to_hmac(salt, args.password)
|
||||
|
||||
print('String to be appended to bitcoin.conf:')
|
||||
print('rpcauth={0}:{1}${2}'.format(args.username, salt, password_hmac))
|
||||
print('Your password:\n{0}'.format(args.password))
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -0,0 +1,13 @@
|
||||
SocksPort 0.0.0.0:9050
|
||||
ControlPort 0.0.0.0:9051
|
||||
CookieAuthentication 1
|
||||
CookieAuthFileGroupReadable 1
|
||||
HashedControlPassword 16:39AF5EEFA4FC1D986022FDFB13663669FE50FB6DE9A3B4FE4FC7D82010 # moneyprintergobrrr
|
||||
|
||||
# Bitcoin Core P2P Скрытый сервис
|
||||
HiddenServiceDir /data/app-$APP_ID-p2p
|
||||
HiddenServicePort $APP_BITCOIN_P2P_PORT $APP_BITCOIN_NODE_IP:$APP_BITCOIN_TOR_PORT
|
||||
|
||||
# Bitcoin Core RPC Скрытый сервис
|
||||
HiddenServiceDir /data/app-$APP_ID-rpc
|
||||
HiddenServicePort $APP_BITCOIN_RPC_PORT $APP_BITCOIN_NODE_IP:$APP_BITCOIN_RPC_PORT
|
||||
Reference in New Issue
Block a user