Merge branch 'master' into knorrium/umbrel_updater

This commit is contained in:
Felipe Knorr Kuhn 2026-05-31 15:46:21 +09:00 committed by GitHub
commit 4e21267dd0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 110 additions and 36 deletions

View file

@ -38,6 +38,7 @@ class BitcoinRoutes {
.get(config.MEMPOOL.API_URL_PREFIX + 'difficulty-adjustment', this.getDifficultyChange)
.get(config.MEMPOOL.API_URL_PREFIX + 'fees/recommended', this.getRecommendedFees)
.get(config.MEMPOOL.API_URL_PREFIX + 'fees/precise', this.getPreciseRecommendedFees)
.get(config.MEMPOOL.API_URL_PREFIX + 'fee-estimates', this.getPreciseRecommendedFeesEsploraTransformed)
.get(config.MEMPOOL.API_URL_PREFIX + 'fees/mempool-blocks', this.getMempoolBlocks)
.get(config.MEMPOOL.API_URL_PREFIX + 'backend-info', this.getBackendInfo)
.get(config.MEMPOOL.API_URL_PREFIX + 'init-data', this.getInitData)
@ -134,6 +135,47 @@ class BitcoinRoutes {
res.json(result);
}
private getPreciseRecommendedFeesEsploraTransformed(req: Request, res: Response) {
if (!mempool.isInSync()) {
res.statusCode = 503;
res.send('Service Unavailable');
return;
}
const result = feeApi.getPreciseRecommendedFee();
res.json({
'warning': 'This endpoint is deprecated and will be removed in a future release. Please use /api/v1/fees/precise instead.',
'1': result.fastestFee,
'2': result.fastestFee,
'3': result.halfHourFee,
'4': result.halfHourFee,
'5': result.halfHourFee,
'6': result.hourFee,
'7': result.hourFee,
'8': result.hourFee,
'9': result.hourFee,
'10': result.hourFee,
'11': result.hourFee,
'12': result.hourFee,
'13': result.hourFee,
'14': result.hourFee,
'15': result.hourFee,
'16': result.hourFee,
'17': result.hourFee,
'18': result.hourFee,
'19': result.hourFee,
'20': result.hourFee,
'21': result.hourFee,
'22': result.hourFee,
'23': result.hourFee,
'24': result.hourFee,
'25': result.hourFee,
'144': result.economyFee,
'504': result.economyFee,
'1008': result.minimumFee,
});
}
private getMempoolBlocks(req: Request, res: Response) {
try {
const result = mempoolBlocks.getMempoolBlocks();

View file

@ -13,7 +13,7 @@ RUN npm install --omit=dev --omit=optional
RUN npm run build
FROM nginx:1.27.0-alpine
FROM nginx:1.30.1-alpine
WORKDIR /patch
@ -21,6 +21,7 @@ COPY --from=builder /build/entrypoint.sh .
COPY --from=builder /build/wait-for .
COPY --from=builder /build/dist/mempool /var/www/mempool
COPY --from=builder /build/nginx.conf /etc/nginx/
COPY --from=builder /build/http-basic.conf /etc/nginx/
COPY --from=builder /build/nginx-mempool.conf /etc/nginx/conf.d/
RUN chmod +x /patch/entrypoint.sh
@ -30,6 +31,7 @@ RUN chown -R 1000:1000 /patch && chmod -R 755 /patch && \
chown -R 1000:1000 /var/cache/nginx && \
chown -R 1000:1000 /var/log/nginx && \
chown -R 1000:1000 /etc/nginx/nginx.conf && \
chown -R 1000:1000 /etc/nginx/http-basic.conf && \
chown -R 1000:1000 /etc/nginx/conf.d && \
chown -R 1000:1000 /var/www/mempool

View file

@ -12,6 +12,7 @@ wget -O ./backend/GeoIP/GeoLite2-ASN.mmdb https://raw.githubusercontent.com/memp
localhostIP="127.0.0.1"
cp ./docker/frontend/* ./frontend
cp ./nginx.conf ./frontend/
cp ./http-basic.conf ./frontend/
cp ./nginx-mempool.conf ./frontend/
sed -i"" -e "s/${localhostIP}:80/0.0.0.0:__MEMPOOL_FRONTEND_HTTP_PORT__/g" ./frontend/nginx.conf
sed -i"" -e "s/${localhostIP}/0.0.0.0/g" ./frontend/nginx.conf

36
http-basic.conf Normal file
View file

@ -0,0 +1,36 @@
variables_hash_max_size 4096;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_name_in_redirect off;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# reset timed out connections freeing ram
reset_timedout_connection on;
# maximum time between packets the client can pause when sending nginx any data
client_body_timeout 10s;
# maximum time the client has to send the entire header to nginx
client_header_timeout 10s;
# timeout which a single keep-alive client connection will stay open
keepalive_timeout 69s;
# maximum time between packets nginx is allowed to pause when sending the client data
send_timeout 69s;
# number of requests per connection, does not affect SPDY
keepalive_requests 1337;
# enable gzip compression
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
# text/html is always compressed by gzip module
gzip_types application/javascript application/json application/ld+json application/manifest+json application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard;
# limit request body size
client_max_body_size 10m;

View file

@ -10,45 +10,12 @@ events {
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
server_tokens off;
server_name_in_redirect off;
# HTTP basic configuration
include /etc/nginx/http-basic.conf;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# reset timed out connections freeing ram
reset_timedout_connection on;
# maximum time between packets the client can pause when sending nginx any data
client_body_timeout 10s;
# maximum time the client has to send the entire header to nginx
client_header_timeout 10s;
# timeout which a single keep-alive client connection will stay open
keepalive_timeout 69s;
# maximum time between packets nginx is allowed to pause when sending the client data
send_timeout 69s;
# number of requests per connection, does not affect SPDY
keepalive_requests 1337;
# enable gzip compression
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_proxied expired no-cache no-store private auth;
# text/html is always compressed by gzip module
gzip_types application/javascript application/json application/ld+json application/manifest+json application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard;
# limit request body size
client_max_body_size 10m;
# proxy cache
proxy_cache off;
proxy_cache_path /var/cache/nginx keys_zone=cache:20m levels=1:2 inactive=600s max_size=500m;

View file

@ -8,6 +8,7 @@ heat()
}
heatURLs=(
'/api/fee-estimates'
'/api/v1/fees/recommended'
'/api/v1/accelerations'
)

View file

@ -1,4 +1,5 @@
# basics
variables_hash_max_size 4096;
sendfile on;
tcp_nopush on;
tcp_nodelay on;

View file

@ -50,6 +50,12 @@ location /api/v1 {
# esplora #
###########
# route /api/fee-estimates to mempool backend instead of esplora
location = /api/fee-estimates {
rewrite ^/api/(.*) /api/v1/$1 break;
try_files /dev/null @mempool-api-v1-cache-hot;
}
# it's ok to cache blockchain data "forever", so we do 30d
location /api/block/ {
rewrite ^/api/(.*) /$1 break;

View file

@ -42,6 +42,12 @@ location /signet/api/v1 {
# esplora #
###########
# route /signet/api/fee-estimates to mempool backend instead of esplora
location = /signet/api/fee-estimates {
rewrite ^/signet/api/(.*) /api/v1/$1 break;
try_files /dev/null @mempool-signet-api-v1-cache-normal;
}
# it's ok to cache blockchain data "forever", so we do 30d
location /signet/api/block/ {
rewrite ^/signet/api/(.*) /$1 break;

View file

@ -42,6 +42,12 @@ location /testnet/api/v1 {
# esplora #
###########
# route /testnet/api/fee-estimates to mempool backend instead of esplora
location = /testnet/api/fee-estimates {
rewrite ^/testnet/api/(.*) /api/v1/$1 break;
try_files /dev/null @mempool-testnet-api-v1-cache-normal;
}
# it's ok to cache blockchain data "forever", so we do 30d
location /testnet/api/block/ {
rewrite ^/testnet/api/(.*) /$1 break;

View file

@ -42,6 +42,12 @@ location /testnet4/api/v1 {
# esplora #
###########
# route /testnet4/api/fee-estimates to mempool backend instead of esplora
location = /testnet4/api/fee-estimates {
rewrite ^/testnet4/api/(.*) /api/v1/$1 break;
try_files /dev/null @mempool-testnet4-api-v1-cache-normal;
}
# it's ok to cache blockchain data "forever", so we do 30d
location /testnet4/api/block/ {
rewrite ^/testnet4/api/(.*) /$1 break;