Рефакторизация структуры кода для улучшения читаемости и удобства сопровождения.

This commit is contained in:
2026-04-30 07:41:41 +03:00
parent eec534760e
commit 89b17ea2b2
1406 changed files with 38483 additions and 3 deletions
View File
View File
View File
+91
View File
@@ -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
+85
View File
@@ -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}"
+81
View File
@@ -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
+61
View File
@@ -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
+46
View File
@@ -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()
+13
View File
@@ -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