Update README instructions and nginx.conf for v2.0 release
This commit is contained in:
		
							parent
							
								
									a05af48059
								
							
						
					
					
						commit
						beb99bcfc6
					
				
							
								
								
									
										62
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								Dockerfile
									
									
									
									
									
								
							@ -1,62 +0,0 @@
 | 
			
		||||
FROM alpine:latest
 | 
			
		||||
 | 
			
		||||
RUN mkdir /mempool.space/
 | 
			
		||||
COPY ./backend /mempool.space/backend/
 | 
			
		||||
COPY ./frontend /mempool.space/frontend/
 | 
			
		||||
COPY ./mariadb-structure.sql /mempool.space/mariadb-structure.sql
 | 
			
		||||
#COPY ./nginx.conf /mempool.space/nginx.conf
 | 
			
		||||
 | 
			
		||||
RUN apk add mariadb mariadb-client jq git nginx npm rsync
 | 
			
		||||
 | 
			
		||||
RUN mysql_install_db --user=mysql --datadir=/var/lib/mysql/
 | 
			
		||||
RUN /usr/bin/mysqld_safe --datadir='/var/lib/mysql/'& \
 | 
			
		||||
    sleep 60 && \
 | 
			
		||||
    mysql -e "create database mempool" && \
 | 
			
		||||
    mysql -e "grant all privileges on mempool.* to 'mempool'@'localhost' identified by 'mempool'" && \
 | 
			
		||||
    mysql mempool < /mempool.space/mariadb-structure.sql
 | 
			
		||||
RUN sed -i "/^skip-networking/ c#skip-networking" /etc/my.cnf.d/mariadb-server.cnf
 | 
			
		||||
 | 
			
		||||
RUN export NG_CLI_ANALYTICS=ci && \
 | 
			
		||||
    npm install -g typescript && \
 | 
			
		||||
    cd /mempool.space/frontend && \
 | 
			
		||||
    npm install && \
 | 
			
		||||
    cd /mempool.space/backend && \
 | 
			
		||||
    npm install && \
 | 
			
		||||
    tsc
 | 
			
		||||
 | 
			
		||||
COPY ./nginx-nossl-docker.conf /etc/nginx/nginx.conf
 | 
			
		||||
    
 | 
			
		||||
ENV ENV dev
 | 
			
		||||
ENV DB_HOST localhost
 | 
			
		||||
ENV DB_PORT 3306
 | 
			
		||||
ENV DB_USER mempool
 | 
			
		||||
ENV DB_PASSWORD mempool
 | 
			
		||||
ENV DB_DATABASE mempool
 | 
			
		||||
ENV HTTP_PORT 80
 | 
			
		||||
ENV API_ENDPOINT /api/v1/
 | 
			
		||||
ENV CHAT_SSL_ENABLED false
 | 
			
		||||
#ENV CHAT_SSL_PRIVKEY
 | 
			
		||||
#ENV CHAT_SSL_CERT
 | 
			
		||||
#ENV CHAT_SSL_CHAIN
 | 
			
		||||
ENV MEMPOOL_REFRESH_RATE_MS 500
 | 
			
		||||
ENV INITIAL_BLOCK_AMOUNT 8
 | 
			
		||||
ENV DEFAULT_PROJECTED_BLOCKS_AMOUNT 8
 | 
			
		||||
ENV KEEP_BLOCK_AMOUNT 24
 | 
			
		||||
ENV BITCOIN_NODE_HOST bitcoinhost
 | 
			
		||||
ENV BITCOIN_NODE_PORT 8332
 | 
			
		||||
ENV BITCOIN_NODE_USER bitcoinuser
 | 
			
		||||
ENV BITCOIN_NODE_PASS bitcoinpass
 | 
			
		||||
ENV TX_PER_SECOND_SPAN_SECONDS 150
 | 
			
		||||
 | 
			
		||||
#RUN echo "mysqld_safe& sleep 20 && cd /mempool.space/backend && rm -f mempool-config.json && rm -f cache.json && touch cache.json && jq -n env > mempool-config.json && node dist/index.js" > /entrypoint.sh
 | 
			
		||||
 | 
			
		||||
RUN cd /mempool.space/frontend/ && \
 | 
			
		||||
    npm run build && \
 | 
			
		||||
    rsync -av --delete dist/mempool/ /var/www/html/
 | 
			
		||||
 | 
			
		||||
EXPOSE 80
 | 
			
		||||
 | 
			
		||||
COPY ./entrypoint.sh /mempool.space/entrypoint.sh
 | 
			
		||||
RUN chmod +x /mempool.space/entrypoint.sh
 | 
			
		||||
WORKDIR /mempool.space
 | 
			
		||||
CMD ["/mempool.space/entrypoint.sh"]
 | 
			
		||||
							
								
								
									
										210
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										210
									
								
								README.md
									
									
									
									
									
								
							@ -1,37 +1,22 @@
 | 
			
		||||
# mempool
 | 
			
		||||
## a mempool visualizer and explorer for Bitcoin
 | 
			
		||||
# The Mempool Open Source Project
 | 
			
		||||
 | 
			
		||||
Mempool is the fully featured mempool visualizer and block explorer website and API service running on [mempool.space](https://mempool.space/). The instructions below are for most users at home running on low-powered Raspberry Pi devices, but if you want to run a production website on a powerful server, see the [production setup guide](https://github.com/mempool/mempool/tree/master/production)
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
## Mempool V1 vs Mempool V2
 | 
			
		||||
 | 
			
		||||
Mempool V1 features basic mempool visualization, fee estimation, and transaction tracking and can run directly off a Bitcoin Core full node on a Raspberry Pi.
 | 
			
		||||
 | 
			
		||||
Mempool V2 is the fully featured explorer running on [mempool.space](https://mempool.space/), but it requires a fully synced electrs backend running on powerful server hardware. [Guide to install Mempool V2](https://github.com/mempool/mempool/tree/master/production)
 | 
			
		||||
 | 
			
		||||
# Mempool V1 using Docker (easy)
 | 
			
		||||
 | 
			
		||||
Install from Docker Hub, passing your Bitcoin Core RPC credentials as environment variables:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
docker pull mempool/mempool:v1.0
 | 
			
		||||
docker create -p 80:80 -e BITCOIN_NODE_HOST=192.168.1.102 -e BITCOIN_NODE_USER=foo -e BITCOIN_NODE_PASS=bar --name mempool mempool/mempool:v1.0
 | 
			
		||||
docker start mempool
 | 
			
		||||
docker logs mempool
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
You should see mempool starting up, which takes over an hour (needs 8 blocks). When it's ready, visit http://127.0.0.1/ to see your mempool.
 | 
			
		||||
 | 
			
		||||
# Mempool V1 not using Docker (advanced)
 | 
			
		||||
# Installation
 | 
			
		||||
 | 
			
		||||
## Dependencies
 | 
			
		||||
 | 
			
		||||
* Bitcoin (full node required, no pruning, txindex=1)
 | 
			
		||||
* Bitcoin Core (no pruning, txindex=1)
 | 
			
		||||
* Electrum Server (romanz/electrs)
 | 
			
		||||
* NodeJS (official stable LTS)
 | 
			
		||||
* MySQL or MariaDB (default config)
 | 
			
		||||
* Nginx (use supplied nginx.conf)
 | 
			
		||||
* MariaDB (default config)
 | 
			
		||||
* Nginx (use supplied nginx.conf and nginx-mempool.conf)
 | 
			
		||||
 | 
			
		||||
## Checking out release tag
 | 
			
		||||
## Mempool
 | 
			
		||||
 | 
			
		||||
Clone the mempool repo, and checkout the latest release tag:
 | 
			
		||||
```bash
 | 
			
		||||
  git clone https://github.com/mempool/mempool
 | 
			
		||||
  cd mempool
 | 
			
		||||
@ -41,52 +26,16 @@ You should see mempool starting up, which takes over an hour (needs 8 blocks). W
 | 
			
		||||
 | 
			
		||||
## Bitcoin Core (bitcoind)
 | 
			
		||||
 | 
			
		||||
Enable RPC and txindex in bitcoin.conf
 | 
			
		||||
 | 
			
		||||
Enable RPC and txindex in `bitcoin.conf`:
 | 
			
		||||
```bash
 | 
			
		||||
  rpcuser=mempool
 | 
			
		||||
  rpcpassword=71b61986da5b03a5694d7c7d5165ece5
 | 
			
		||||
  txindex=1
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## NodeJS
 | 
			
		||||
 | 
			
		||||
Install dependencies and build code:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  # Install TypeScript Globally
 | 
			
		||||
  npm install -g typescript
 | 
			
		||||
 | 
			
		||||
  # Frontend
 | 
			
		||||
  cd frontend
 | 
			
		||||
  npm install
 | 
			
		||||
  npm run build
 | 
			
		||||
 | 
			
		||||
  # Backend
 | 
			
		||||
  cd ../backend/
 | 
			
		||||
  npm install
 | 
			
		||||
  npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Mempool Configuration
 | 
			
		||||
In the `backend` folder, make a copy of the sample config and modify it to fit your settings.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  cp mempool-config.sample.json mempool-config.json
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Edit `mempool-config.json` to add your Bitcoin Core node RPC credentials:
 | 
			
		||||
```bash
 | 
			
		||||
  "BITCOIN_NODE_HOST": "192.168.1.5",
 | 
			
		||||
  "BITCOIN_NODE_PORT": 8332,
 | 
			
		||||
  "BITCOIN_NODE_USER": "mempool",
 | 
			
		||||
  "BITCOIN_NODE_PASS": "71b61986da5b03a5694d7c7d5165ece5",
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## MySQL
 | 
			
		||||
 | 
			
		||||
Install MariaDB:
 | 
			
		||||
 | 
			
		||||
Install MariaDB from OS package manager:
 | 
			
		||||
```bash
 | 
			
		||||
  # Linux
 | 
			
		||||
  apt-get install mariadb-server mariadb-client
 | 
			
		||||
@ -108,47 +57,69 @@ Create database and grant privileges:
 | 
			
		||||
  Query OK, 0 rows affected (0.00 sec)
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
From the root folder, initialize database structure:
 | 
			
		||||
 | 
			
		||||
From the mempool repo's top-level folder, import the database structure:
 | 
			
		||||
```bash
 | 
			
		||||
  mysql -u mempool -p mempool < mariadb-structure.sql
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Running (Backend)
 | 
			
		||||
 | 
			
		||||
Create an initial empty cache and start the app:
 | 
			
		||||
## Mempool Backend
 | 
			
		||||
Install mempool dependencies from npm and build the backend:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  touch cache.json
 | 
			
		||||
  npm run start # node dist/index.js
 | 
			
		||||
  # backend
 | 
			
		||||
  cd ../backend/
 | 
			
		||||
  npm install
 | 
			
		||||
  npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
After starting you should see:
 | 
			
		||||
In the `backend` folder, make a copy of the sample config and modify it to fit your settings.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  Server started on port 8999 :)
 | 
			
		||||
  New block found (#586498)! 0 of 1986 found in mempool. 1985 not found.
 | 
			
		||||
  New block found (#586499)! 0 of 1094 found in mempool. 1093 not found.
 | 
			
		||||
  New block found (#586500)! 0 of 2735 found in mempool. 2734 not found.
 | 
			
		||||
  New block found (#586501)! 0 of 2675 found in mempool. 2674 not found.
 | 
			
		||||
  New block found (#586502)! 0 of 975 found in mempool. 974 not found.
 | 
			
		||||
  New block found (#586503)! 0 of 2130 found in mempool. 2129 not found.
 | 
			
		||||
  New block found (#586504)! 0 of 2770 found in mempool. 2769 not found.
 | 
			
		||||
  New block found (#586505)! 0 of 2759 found in mempool. 2758 not found.
 | 
			
		||||
  Updating mempool
 | 
			
		||||
  Calculated fee for transaction 1 / 3257
 | 
			
		||||
  Calculated fee for transaction 2 / 3257
 | 
			
		||||
  Calculated fee for transaction 3 / 3257
 | 
			
		||||
  Calculated fee for transaction 4 / 3257
 | 
			
		||||
  Calculated fee for transaction 5 / 3257
 | 
			
		||||
  Calculated fee for transaction 6 / 3257
 | 
			
		||||
  Calculated fee for transaction 7 / 3257
 | 
			
		||||
  Calculated fee for transaction 8 / 3257
 | 
			
		||||
  Calculated fee for transaction 9 / 3257
 | 
			
		||||
  cp mempool-config.sample.json mempool-config.json
 | 
			
		||||
```
 | 
			
		||||
You need to wait for at least *8 blocks to be mined*, so please wait ~80 minutes.
 | 
			
		||||
The backend also needs to index transactions, calculate fees, etc.
 | 
			
		||||
When it's ready you will see output like this:
 | 
			
		||||
 | 
			
		||||
Edit `mempool-config.json` to add your Bitcoin Core node RPC credentials:
 | 
			
		||||
```bash
 | 
			
		||||
{
 | 
			
		||||
  "MEMPOOL": {
 | 
			
		||||
    "NETWORK": "mainnet",
 | 
			
		||||
    "BACKEND": "electrum",
 | 
			
		||||
    "HTTP_PORT": 8999,
 | 
			
		||||
    "API_URL_PREFIX": "/api/v1/",
 | 
			
		||||
    "POLL_RATE_MS": 2000
 | 
			
		||||
  },
 | 
			
		||||
  "CORE_RPC": {
 | 
			
		||||
    "USERNAME": "mempool",
 | 
			
		||||
    "PASSWORD": "71b61986da5b03a5694d7c7d5165ece5"
 | 
			
		||||
  },
 | 
			
		||||
  "ELECTRUM": {
 | 
			
		||||
    "HOST": "127.0.0.1",
 | 
			
		||||
    "PORT": 50002,
 | 
			
		||||
    "TLS_ENABLED": true,
 | 
			
		||||
    "TX_LOOKUPS": false
 | 
			
		||||
  },
 | 
			
		||||
  "DATABASE": {
 | 
			
		||||
    "ENABLED": true,
 | 
			
		||||
    "HOST": "localhost",
 | 
			
		||||
    "PORT": 3306,
 | 
			
		||||
    "USERNAME": "mempool",
 | 
			
		||||
    "PASSWORD": "mempool",
 | 
			
		||||
    "DATABASE": "mempool"
 | 
			
		||||
  },
 | 
			
		||||
  "STATISTICS": {
 | 
			
		||||
    "ENABLED": true,
 | 
			
		||||
    "TX_PER_SECOND_SAMPLE_PERIOD": 150
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Start the backend:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  npm run start
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
When it's running you should see output like this:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  Mempool updated in 0.189 seconds
 | 
			
		||||
@ -171,43 +142,38 @@ When it's ready you will see output like this:
 | 
			
		||||
  Updating mempool
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## nginx + CertBot (LetsEncrypt)
 | 
			
		||||
Setup nginx using the supplied nginx.conf
 | 
			
		||||
## Mempool Frontend
 | 
			
		||||
 | 
			
		||||
Install mempool dependencies from npm and build the frontend static HTML/CSS/JS:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  # frontend
 | 
			
		||||
  cd frontend
 | 
			
		||||
  npm install
 | 
			
		||||
  npm run build
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Install the output into nginx webroot folder:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  sudo rsync -av --delete dist/mempool/ /var/www/html/
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## nginx + certbot
 | 
			
		||||
 | 
			
		||||
Install the supplied nginx.conf and nginx-mempool.conf in /etc/nginx
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  # install nginx and certbot
 | 
			
		||||
  apt-get install -y nginx python-certbot-nginx
 | 
			
		||||
 | 
			
		||||
  # install the mempool configuration for nginx
 | 
			
		||||
  cp nginx.conf nginx-mempool.conf /etc/nginx/nginx.conf
 | 
			
		||||
 | 
			
		||||
  # replace example.com with your domain name
 | 
			
		||||
  certbot --nginx -d example.com
 | 
			
		||||
 | 
			
		||||
  # install the mempool configuration for nginx
 | 
			
		||||
  cp nginx.conf /etc/nginx/nginx.conf
 | 
			
		||||
 | 
			
		||||
  # edit the installed nginx.conf, and replace all
 | 
			
		||||
  # instances of example.com with your domain name
 | 
			
		||||
```
 | 
			
		||||
Make sure you can access https://<your-domain-name>/ in browser before proceeding
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Running (Frontend)
 | 
			
		||||
 | 
			
		||||
Build the frontend static HTML/CSS/JS, rsync the output into nginx folder:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  cd frontend/
 | 
			
		||||
  npm run build
 | 
			
		||||
  sudo rsync -av --delete dist/mempool/ /var/www/html/
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Optional frontend configuration
 | 
			
		||||
In the `frontend` folder, make a copy of the sample config and modify it to fit your settings.
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
  cp mempool-frontend-config.sample.json mempool-frontend-config.json
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Try It Out
 | 
			
		||||
 | 
			
		||||
If everything went okay you should see the beautiful mempool :grin:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,10 +0,0 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
mysqld_safe&
 | 
			
		||||
sleep 5
 | 
			
		||||
nginx
 | 
			
		||||
cd /mempool.space/backend 
 | 
			
		||||
rm -f mempool-config.json
 | 
			
		||||
rm -f cache.json
 | 
			
		||||
touch cache.json
 | 
			
		||||
jq -n env > mempool-config.json
 | 
			
		||||
node dist/index.js
 | 
			
		||||
							
								
								
									
										62
									
								
								nginx-mempool.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								nginx-mempool.conf
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,62 @@
 | 
			
		||||
	access_log /var/log/nginx/access_mempool.log;
 | 
			
		||||
	error_log /var/log/nginx/error_mempool.log;
 | 
			
		||||
 | 
			
		||||
	root /var/www/mempool/browser;
 | 
			
		||||
 | 
			
		||||
	index index.html;
 | 
			
		||||
 | 
			
		||||
	# fallback for all URLs i.e. /address/foo /tx/foo /block/000
 | 
			
		||||
	location / {
 | 
			
		||||
		try_files /$lang/$uri /$lang/$uri/ $uri $uri/ /en-US/$uri @index-redirect;
 | 
			
		||||
	}
 | 
			
		||||
	location @index-redirect {
 | 
			
		||||
		add_header vary accept-language;
 | 
			
		||||
		rewrite (.*) /$lang/index.html;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# location block using regex are matched in order
 | 
			
		||||
 | 
			
		||||
	# used to rewrite resources from /<lang>/ to /en-US/
 | 
			
		||||
	location ~ ^/(ar|bg|bs|ca|cs|da|de|et|el|es|eo|eu|fa|fr|gl|ko|hr|id|it|he|ka|lv|lt|hu|mk|ms|nl|ja|ka|no|nb|nn|pl|pt|pt-BR|ro|ru|sk|sl|sr|sh|fi|sv|th|tr|uk|vi|zh)/resources/ {
 | 
			
		||||
		rewrite ^/[a-zA-Z-]*/resources/(.*) /en-US/resources/$1;
 | 
			
		||||
	}
 | 
			
		||||
	# used for cookie override
 | 
			
		||||
	location ~ ^/(ar|bg|bs|ca|cs|da|de|et|el|es|eo|eu|fa|fr|gl|ko|hr|id|it|he|ka|lv|lt|hu|mk|ms|nl|ja|ka|no|nb|nn|pl|pt|pt-BR|ro|ru|sk|sl|sr|sh|fi|sv|th|tr|uk|vi|zh)/ {
 | 
			
		||||
		try_files $uri $uri/ /$1/index.html =404;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# static API docs
 | 
			
		||||
	location = /api {
 | 
			
		||||
		try_files $uri $uri/ /en-US/index.html =404;
 | 
			
		||||
	}
 | 
			
		||||
	location = /api/ {
 | 
			
		||||
		try_files $uri $uri/ /en-US/index.html =404;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# mainnet API
 | 
			
		||||
	location /api/v1/donations {
 | 
			
		||||
		proxy_pass https://mempool.space;
 | 
			
		||||
	}
 | 
			
		||||
	location /api/v1/donations/images {
 | 
			
		||||
		proxy_pass https://mempool.space;
 | 
			
		||||
	}
 | 
			
		||||
	location /api/v1/ws {
 | 
			
		||||
		proxy_pass http://127.0.0.1:8999/;
 | 
			
		||||
		proxy_http_version 1.1;
 | 
			
		||||
		proxy_set_header Upgrade $http_upgrade;
 | 
			
		||||
		proxy_set_header Connection "Upgrade";
 | 
			
		||||
	}
 | 
			
		||||
	location /api/v1 {
 | 
			
		||||
		proxy_pass http://127.0.0.1:8999/api/v1;
 | 
			
		||||
	}
 | 
			
		||||
	location /api/ {
 | 
			
		||||
		proxy_pass http://127.0.0.1:8999/api/v1/;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# mainnet API
 | 
			
		||||
	location /ws {
 | 
			
		||||
		proxy_pass http://127.0.0.1:8999/;
 | 
			
		||||
		proxy_http_version 1.1;
 | 
			
		||||
		proxy_set_header Upgrade $http_upgrade;
 | 
			
		||||
		proxy_set_header Connection "Upgrade";
 | 
			
		||||
	}
 | 
			
		||||
@ -1,60 +0,0 @@
 | 
			
		||||
user root;
 | 
			
		||||
worker_processes auto;
 | 
			
		||||
pid /run/nginx.pid;
 | 
			
		||||
include /etc/nginx/modules-enabled/*.conf;
 | 
			
		||||
 | 
			
		||||
events {
 | 
			
		||||
	worker_connections 768;
 | 
			
		||||
	# multi_accept on;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
http {
 | 
			
		||||
	sendfile on;
 | 
			
		||||
	tcp_nopush on;
 | 
			
		||||
	tcp_nodelay on;
 | 
			
		||||
	keepalive_timeout 65;
 | 
			
		||||
	types_hash_max_size 2048;
 | 
			
		||||
 | 
			
		||||
	include /etc/nginx/mime.types;
 | 
			
		||||
	default_type application/octet-stream;
 | 
			
		||||
 | 
			
		||||
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
 | 
			
		||||
	ssl_prefer_server_ciphers on;
 | 
			
		||||
 | 
			
		||||
	access_log /var/log/nginx/access.log;
 | 
			
		||||
	error_log /var/log/nginx/error.log;
 | 
			
		||||
 | 
			
		||||
	gzip on;
 | 
			
		||||
	gzip_comp_level    5;
 | 
			
		||||
	gzip_min_length    256;
 | 
			
		||||
	gzip_proxied       any;
 | 
			
		||||
	gzip_vary          on;
 | 
			
		||||
 | 
			
		||||
	gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject 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 text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; # text/html is always compressed by gzip module
 | 
			
		||||
 | 
			
		||||
	server {
 | 
			
		||||
		listen 80;
 | 
			
		||||
		listen [::]:80;
 | 
			
		||||
		server_name docker.lan;
 | 
			
		||||
 | 
			
		||||
		root /var/www/html;
 | 
			
		||||
 | 
			
		||||
		index index.html;
 | 
			
		||||
		server_name example.com; # managed by Certbot
 | 
			
		||||
 | 
			
		||||
		location / {
 | 
			
		||||
			try_files $uri $uri/ /index.html =404;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		location /api {
 | 
			
		||||
			proxy_pass http://127.0.0.1:8999/api;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		location /ws {
 | 
			
		||||
			proxy_pass http://127.0.0.1:8999/;
 | 
			
		||||
			proxy_http_version 1.1;
 | 
			
		||||
			proxy_set_header Upgrade $http_upgrade;
 | 
			
		||||
			proxy_set_header Connection "Upgrade";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										153
									
								
								nginx.conf
									
									
									
									
									
								
							
							
						
						
									
										153
									
								
								nginx.conf
									
									
									
									
									
								
							@ -1,81 +1,126 @@
 | 
			
		||||
user www-data;
 | 
			
		||||
user nobody;
 | 
			
		||||
pid /var/run/nginx.pid;
 | 
			
		||||
 | 
			
		||||
worker_processes auto;
 | 
			
		||||
pid /run/nginx.pid;
 | 
			
		||||
include /etc/nginx/modules-enabled/*.conf;
 | 
			
		||||
worker_rlimit_nofile 100000;
 | 
			
		||||
 | 
			
		||||
events {
 | 
			
		||||
	worker_connections 768;
 | 
			
		||||
	# multi_accept on;
 | 
			
		||||
	worker_connections 9000;
 | 
			
		||||
	multi_accept on;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
http {
 | 
			
		||||
	sendfile on;
 | 
			
		||||
	tcp_nopush on;
 | 
			
		||||
	tcp_nodelay on;
 | 
			
		||||
	keepalive_timeout 300s;
 | 
			
		||||
	types_hash_max_size 2048;
 | 
			
		||||
 | 
			
		||||
	server_tokens off;
 | 
			
		||||
	server_name_in_redirect off;
 | 
			
		||||
 | 
			
		||||
	include /etc/nginx/mime.types;
 | 
			
		||||
	default_type application/octet-stream;
 | 
			
		||||
 | 
			
		||||
	ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
 | 
			
		||||
	ssl_prefer_server_ciphers on;
 | 
			
		||||
 | 
			
		||||
	access_log /var/log/nginx/access.log;
 | 
			
		||||
	error_log /var/log/nginx/error.log;
 | 
			
		||||
 | 
			
		||||
	proxy_cache off;
 | 
			
		||||
	# 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 10s;
 | 
			
		||||
 | 
			
		||||
	# number of requests per connection, does not affect SPDY
 | 
			
		||||
	keepalive_requests 100;
 | 
			
		||||
 | 
			
		||||
	# enable gzip compression
 | 
			
		||||
	gzip on;
 | 
			
		||||
	gzip_comp_level    5;
 | 
			
		||||
	gzip_min_length    256;
 | 
			
		||||
	gzip_proxied       any;
 | 
			
		||||
	gzip_vary          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;
 | 
			
		||||
 | 
			
		||||
	gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject 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 text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; # text/html is always compressed by gzip module
 | 
			
		||||
	# limit request body size
 | 
			
		||||
	client_max_body_size 10m;
 | 
			
		||||
 | 
			
		||||
	server {
 | 
			
		||||
		listen 80;
 | 
			
		||||
		listen [::]:80;
 | 
			
		||||
		server_name example.com;
 | 
			
		||||
	# proxy cache
 | 
			
		||||
	proxy_cache off;
 | 
			
		||||
	proxy_cache_path /var/cache/nginx keys_zone=cache:20m levels=1:2 inactive=600s max_size=500m;
 | 
			
		||||
	types_hash_max_size 2048;
 | 
			
		||||
 | 
			
		||||
		if ($host = example.com) {
 | 
			
		||||
			return 301 https://$host$request_uri;
 | 
			
		||||
		} # managed by Certbot
 | 
			
		||||
	# exempt localhost from rate limit
 | 
			
		||||
	geo $limited_ip {
 | 
			
		||||
		default		1;
 | 
			
		||||
		127.0.0.1	0;
 | 
			
		||||
	}
 | 
			
		||||
	map $limited_ip $limited_ip_key {
 | 
			
		||||
		1 $binary_remote_addr;
 | 
			
		||||
		0 '';
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		return 404; # managed by Certbot
 | 
			
		||||
	# rate limit requests
 | 
			
		||||
	limit_req_zone $limited_ip_key zone=api:5m rate=200r/m;
 | 
			
		||||
	limit_req_zone $limited_ip_key zone=electrs:5m rate=2000r/m;
 | 
			
		||||
	limit_req_status 429;
 | 
			
		||||
 | 
			
		||||
	# rate limit connections
 | 
			
		||||
	limit_conn_zone $limited_ip_key zone=websocket:10m;
 | 
			
		||||
	limit_conn_status 429;
 | 
			
		||||
 | 
			
		||||
	map $http_accept_language $header_lang {
 | 
			
		||||
		default en-US;
 | 
			
		||||
		~*^en-US en-US;
 | 
			
		||||
		~*^en en-US;
 | 
			
		||||
	        ~*^ar ar;
 | 
			
		||||
	        ~*^cs cs;
 | 
			
		||||
	        ~*^de de;
 | 
			
		||||
	        ~*^es es;
 | 
			
		||||
	        ~*^fa fa;
 | 
			
		||||
	        ~*^fr fr;
 | 
			
		||||
	        ~*^ja ja;
 | 
			
		||||
	        ~*^ka ka;
 | 
			
		||||
	        ~*^nl nl;
 | 
			
		||||
	        ~*^nn nn;
 | 
			
		||||
	        ~*^pt pt;
 | 
			
		||||
	        ~*^sl sl;
 | 
			
		||||
	        ~*^sv sv;
 | 
			
		||||
	        ~*^tr tr;
 | 
			
		||||
	        ~*^uk uk;
 | 
			
		||||
	        ~*^vi vi;
 | 
			
		||||
	        ~*^zh zh;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	map $cookie_lang $lang {
 | 
			
		||||
		default $header_lang;
 | 
			
		||||
		~*^en-US en-US;
 | 
			
		||||
		~*^en en-US;
 | 
			
		||||
	        ~*^ar ar;
 | 
			
		||||
	        ~*^cs cs;
 | 
			
		||||
	        ~*^de de;
 | 
			
		||||
	        ~*^es es;
 | 
			
		||||
	        ~*^fa fa;
 | 
			
		||||
	        ~*^fr fr;
 | 
			
		||||
	        ~*^ja ja;
 | 
			
		||||
	        ~*^ka ka;
 | 
			
		||||
	        ~*^nl nl;
 | 
			
		||||
	        ~*^nn nn;
 | 
			
		||||
	        ~*^pt pt;
 | 
			
		||||
	        ~*^sl sl;
 | 
			
		||||
	        ~*^sv sv;
 | 
			
		||||
	        ~*^tr tr;
 | 
			
		||||
	        ~*^uk uk;
 | 
			
		||||
	        ~*^vi vi;
 | 
			
		||||
	        ~*^zh zh;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server {
 | 
			
		||||
		listen [::]:443 ssl http2; # managed by Certbot
 | 
			
		||||
		listen 443 ssl http2; # managed by Certbot
 | 
			
		||||
		ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
 | 
			
		||||
		ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
 | 
			
		||||
		include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
 | 
			
		||||
		ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
 | 
			
		||||
 | 
			
		||||
		server_name example.com; # managed by Certbot
 | 
			
		||||
 | 
			
		||||
		index index.html;
 | 
			
		||||
		root /var/www/html;
 | 
			
		||||
 | 
			
		||||
		location / {
 | 
			
		||||
			try_files $uri $uri/ /index.html =404;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		location /api {
 | 
			
		||||
			proxy_pass http://127.0.0.1:8999/api;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		location /electrs/ {
 | 
			
		||||
			proxy_pass http://127.0.0.1:3000/;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		location /ws {
 | 
			
		||||
			proxy_pass http://127.0.0.1:8999/;
 | 
			
		||||
			proxy_http_version 1.1;
 | 
			
		||||
			proxy_set_header Upgrade $http_upgrade;
 | 
			
		||||
			proxy_set_header Connection "Upgrade";
 | 
			
		||||
		}
 | 
			
		||||
		listen 127.0.0.1:80;
 | 
			
		||||
		include /etc/nginx/nginx-mempool.conf;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										29
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								package.json
									
									
									
									
									
								
							@ -1,29 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "mempool",
 | 
			
		||||
  "version": "2.0.0",
 | 
			
		||||
  "description": "Bitcoin mempool visualizer and blockchain explorer",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "homepage": "https://mempool.space",
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "git+https://github.com/mempool/mempool"
 | 
			
		||||
  },
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/mempool/mempool/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "bitcoin",
 | 
			
		||||
    "mempool",
 | 
			
		||||
    "blockchain",
 | 
			
		||||
    "explorer",
 | 
			
		||||
    "liquid"
 | 
			
		||||
  ],
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "test": "echo \"Error: no test specified\" && exit 1"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "mempool-frontend": "2.0.0",
 | 
			
		||||
    "mempool-backend": "2.0.0"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user