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 | # The Mempool Open Source Project | ||||||
| ## a mempool visualizer and explorer for Bitcoin | 
 | ||||||
|  | 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 | # Installation | ||||||
| 
 |  | ||||||
| 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) |  | ||||||
| 
 | 
 | ||||||
| ## Dependencies | ## Dependencies | ||||||
| 
 | 
 | ||||||
| * Bitcoin (full node required, no pruning, txindex=1) | * Bitcoin Core (no pruning, txindex=1) | ||||||
|  | * Electrum Server (romanz/electrs) | ||||||
| * NodeJS (official stable LTS) | * NodeJS (official stable LTS) | ||||||
| * MySQL or MariaDB (default config) | * MariaDB (default config) | ||||||
| * Nginx (use supplied nginx.conf) | * 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 | ```bash | ||||||
|   git clone https://github.com/mempool/mempool |   git clone https://github.com/mempool/mempool | ||||||
|   cd 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) | ## Bitcoin Core (bitcoind) | ||||||
| 
 | 
 | ||||||
| Enable RPC and txindex in bitcoin.conf | Enable RPC and txindex in `bitcoin.conf`: | ||||||
| 
 |  | ||||||
| ```bash | ```bash | ||||||
|   rpcuser=mempool |   rpcuser=mempool | ||||||
|   rpcpassword=71b61986da5b03a5694d7c7d5165ece5 |   rpcpassword=71b61986da5b03a5694d7c7d5165ece5 | ||||||
|   txindex=1 |   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 | ## MySQL | ||||||
| 
 | 
 | ||||||
| Install MariaDB: | Install MariaDB from OS package manager: | ||||||
| 
 |  | ||||||
| ```bash | ```bash | ||||||
|   # Linux |   # Linux | ||||||
|   apt-get install mariadb-server mariadb-client |   apt-get install mariadb-server mariadb-client | ||||||
| @ -108,47 +57,69 @@ Create database and grant privileges: | |||||||
|   Query OK, 0 rows affected (0.00 sec) |   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 | ```bash | ||||||
|   mysql -u mempool -p mempool < mariadb-structure.sql |   mysql -u mempool -p mempool < mariadb-structure.sql | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## Running (Backend) | ## Mempool Backend | ||||||
| 
 | Install mempool dependencies from npm and build the backend: | ||||||
| Create an initial empty cache and start the app: |  | ||||||
| 
 | 
 | ||||||
| ```bash | ```bash | ||||||
|   touch cache.json |   # backend | ||||||
|   npm run start # node dist/index.js |   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 | ```bash | ||||||
|   Server started on port 8999 :) |   cp mempool-config.sample.json mempool-config.json | ||||||
|   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 |  | ||||||
| ``` | ``` | ||||||
| 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. | Edit `mempool-config.json` to add your Bitcoin Core node RPC credentials: | ||||||
| When it's ready you will see output like this: | ```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 | ```bash | ||||||
|   Mempool updated in 0.189 seconds |   Mempool updated in 0.189 seconds | ||||||
| @ -171,43 +142,38 @@ When it's ready you will see output like this: | |||||||
|   Updating mempool |   Updating mempool | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| ## nginx + CertBot (LetsEncrypt) | ## Mempool Frontend | ||||||
| Setup nginx using the supplied nginx.conf | 
 | ||||||
|  | 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 | ```bash | ||||||
|   # install nginx and certbot |   # install nginx and certbot | ||||||
|   apt-get install -y nginx python-certbot-nginx |   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 |   # replace example.com with your domain name | ||||||
|   certbot --nginx -d example.com |   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: | 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; | worker_processes auto; | ||||||
| pid /run/nginx.pid; | worker_rlimit_nofile 100000; | ||||||
| include /etc/nginx/modules-enabled/*.conf; |  | ||||||
| 
 | 
 | ||||||
| events { | events { | ||||||
| 	worker_connections 768; | 	worker_connections 9000; | ||||||
| 	# multi_accept on; | 	multi_accept on; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| http { | http { | ||||||
| 	sendfile on; | 	sendfile on; | ||||||
| 	tcp_nopush on; | 	tcp_nopush on; | ||||||
| 	tcp_nodelay 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; | 	include /etc/nginx/mime.types; | ||||||
| 	default_type application/octet-stream; | 	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; | 	access_log /var/log/nginx/access.log; | ||||||
| 	error_log /var/log/nginx/error.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 on; | ||||||
| 	gzip_comp_level    5; | 	gzip_vary on; | ||||||
| 	gzip_min_length    256; | 	gzip_comp_level 6; | ||||||
| 	gzip_proxied       any; | 	gzip_min_length 1000; | ||||||
| 	gzip_vary          on; | 	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 { | 	# proxy cache | ||||||
| 		listen 80; | 	proxy_cache off; | ||||||
| 		listen [::]:80; | 	proxy_cache_path /var/cache/nginx keys_zone=cache:20m levels=1:2 inactive=600s max_size=500m; | ||||||
| 		server_name example.com; | 	types_hash_max_size 2048; | ||||||
| 
 | 
 | ||||||
| 		if ($host = example.com) { | 	# exempt localhost from rate limit | ||||||
| 			return 301 https://$host$request_uri; | 	geo $limited_ip { | ||||||
| 		} # managed by Certbot | 		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 { | 	server { | ||||||
| 		listen [::]:443 ssl http2; # managed by Certbot | 		listen 127.0.0.1:80; | ||||||
| 		listen 443 ssl http2; # managed by Certbot | 		include /etc/nginx/nginx-mempool.conf; | ||||||
| 		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"; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										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