Merge pull request #993 from konstantinzolotarev/dockerize
Dockerize blockscout (for local usage)pull/1014/head
commit
83693f0313
@ -0,0 +1,9 @@ |
|||||||
|
_build |
||||||
|
deps |
||||||
|
apps/block_scout_web/assets/node_modules |
||||||
|
apps/explorer/node_modules |
||||||
|
test |
||||||
|
.git |
||||||
|
.circleci |
||||||
|
logs |
||||||
|
apps/*/test |
@ -0,0 +1,39 @@ |
|||||||
|
FROM bitwalker/alpine-elixir-phoenix:latest |
||||||
|
|
||||||
|
RUN apk --no-cache --update add automake libtool inotify-tools autoconf |
||||||
|
|
||||||
|
EXPOSE 4000 |
||||||
|
|
||||||
|
ENV PORT=4000 \ |
||||||
|
MIX_ENV="prod" \ |
||||||
|
SECRET_KEY_BASE="RMgI4C1HSkxsEjdhtGMfwAHfyT6CKWXOgzCboJflfSm4jeAlic52io05KB6mqzc5" |
||||||
|
|
||||||
|
# Cache elixir deps |
||||||
|
ADD mix.exs mix.lock ./ |
||||||
|
ADD apps/block_scout_web/mix.exs ./apps/block_scout_web/ |
||||||
|
ADD apps/explorer/mix.exs ./apps/explorer/ |
||||||
|
ADD apps/ethereum_jsonrpc/mix.exs ./apps/ethereum_jsonrpc/ |
||||||
|
ADD apps/indexer/mix.exs ./apps/indexer/ |
||||||
|
|
||||||
|
RUN mix do deps.get, deps.compile |
||||||
|
|
||||||
|
ADD . . |
||||||
|
|
||||||
|
# Run forderground build and phoenix digest |
||||||
|
RUN mix compile |
||||||
|
|
||||||
|
# Add blockscout npm deps |
||||||
|
RUN cd apps/block_scout_web/assets/ && \ |
||||||
|
npm install && \ |
||||||
|
npm run deploy && \ |
||||||
|
cd - |
||||||
|
|
||||||
|
RUN cd apps/explorer/ && \ |
||||||
|
npm install && \ |
||||||
|
cd - |
||||||
|
|
||||||
|
# RUN mix do ecto.drop --force, ecto.create, ecto.migrate |
||||||
|
|
||||||
|
# USER default |
||||||
|
|
||||||
|
# CMD ["mix", "phx.server"] |
@ -0,0 +1,101 @@ |
|||||||
|
SYSTEM = $(shell uname -s)
|
||||||
|
HOST = host.docker.internal
|
||||||
|
DOCKER_IMAGE = blockscout_prod
|
||||||
|
PG_CONTAINER_NAME = postgres
|
||||||
|
PG_CONTAINER_IMAGE = postgres:10.4
|
||||||
|
THIS_FILE = $(lastword $(MAKEFILE_LIST))
|
||||||
|
|
||||||
|
ifeq ($(SYSTEM), Linux) |
||||||
|
HOST=localhost
|
||||||
|
endif |
||||||
|
|
||||||
|
DB_URL = postgresql://postgres:@$(HOST):5432/explorer?ssl=false
|
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS = -e 'MIX_ENV=prod' \
|
||||||
|
-e 'DATABASE_URL=$(DB_URL)'
|
||||||
|
ifeq ($(SYSTEM), Linux) |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += --network=host
|
||||||
|
endif |
||||||
|
ifdef ETHEREUM_JSONRPC_VARIANT |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'ETHEREUM_JSONRPC_VARIANT=$(ETHEREUM_JSONRPC_VARIANT)'
|
||||||
|
endif |
||||||
|
ifdef ETHEREUM_JSONRPC_HTTP_URL |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'ETHEREUM_JSONRPC_HTTP_URL=$(ETHEREUM_JSONRPC_HTTP_URL)'
|
||||||
|
endif |
||||||
|
ifdef ETHEREUM_JSONRPC_WS_URL |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'ETHEREUM_JSONRPC_WS_URL=$(ETHEREUM_JSONRPC_WS_URL)'
|
||||||
|
endif |
||||||
|
ifdef ETHEREUM_JSONRPC_TRACE_URL |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'ETHEREUM_JSONRPC_TRACE_URL=$(ETHEREUM_JSONRPC_TRACE_URL)'
|
||||||
|
endif |
||||||
|
ifdef COIN |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'COIN=$(COIN)'
|
||||||
|
endif |
||||||
|
ifdef LOGO |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'LOGO=$(LOGO)'
|
||||||
|
endif |
||||||
|
ifdef NETWORK |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'NETWORK=$(NETWORK)'
|
||||||
|
endif |
||||||
|
ifdef SUBNETWORK |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'SUBNETWORK=$(SUBNETWORK)'
|
||||||
|
endif |
||||||
|
ifdef NETWORK_ICON |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'NETWORK_ICON=$(NETWORK_ICON)'
|
||||||
|
endif |
||||||
|
ifdef NETWORK_PATH |
||||||
|
BLOCKSCOUT_CONTAINNER_PARAMS += -e 'NETWORK_PATH=$(NETWORK_PATH)'
|
||||||
|
endif |
||||||
|
|
||||||
|
HAS_BLOCKSCOUT_IMAGE := $(shell docker images | grep ${DOCKER_IMAGE})
|
||||||
|
build: |
||||||
|
@echo "==> Checking for blockscout image $(DOCKER_IMAGE)"
|
||||||
|
ifdef HAS_BLOCKSCOUT_IMAGE |
||||||
|
@echo "==> Image exist. Using $(DOCKER_IMAGE)"
|
||||||
|
else |
||||||
|
@echo "==> No image found trying to build one..."
|
||||||
|
@docker build -f ./Dockerfile -t $(DOCKER_IMAGE) ../
|
||||||
|
endif |
||||||
|
|
||||||
|
migrate: build postgres |
||||||
|
@echo "==> Running migrations"
|
||||||
|
@docker run --rm \
|
||||||
|
$(BLOCKSCOUT_CONTAINNER_PARAMS) \
|
||||||
|
$(DOCKER_IMAGE) /bin/sh -c "echo $$MIX_ENV && mix do ecto.drop --force, ecto.create, ecto.migrate"
|
||||||
|
|
||||||
|
|
||||||
|
PG_EXIST := $(shell docker ps -a | grep ${PG_CONTAINER_NAME})
|
||||||
|
PG_STARTED := $(shell docker ps | grep ${PG_CONTAINER_NAME})
|
||||||
|
postgres: |
||||||
|
ifdef PG_EXIST |
||||||
|
@echo "==> Checking PostrgeSQL container"
|
||||||
|
ifdef PG_STARTED |
||||||
|
@echo "==> PostgreSQL Already started"
|
||||||
|
else |
||||||
|
@echo "==> Starting PostgreSQL container"
|
||||||
|
@docker start $(PG_CONTAINER_NAME)
|
||||||
|
endif |
||||||
|
else |
||||||
|
@echo "==> Creating new PostgreSQL container"
|
||||||
|
@docker run -d --name $(PG_CONTAINER_NAME) \
|
||||||
|
-e POSTGRES_PASSWORD="" \
|
||||||
|
-e POSTGRES_USER="postgres" \
|
||||||
|
-p 5432:5432 \
|
||||||
|
$(PG_CONTAINER_IMAGE)
|
||||||
|
@sleep 1
|
||||||
|
@$(MAKE) -f $(THIS_FILE) migrate
|
||||||
|
endif |
||||||
|
|
||||||
|
start: build postgres |
||||||
|
@echo "==> Starting blockscout"
|
||||||
|
@docker run --rm \
|
||||||
|
$(BLOCKSCOUT_CONTAINNER_PARAMS) \
|
||||||
|
-p 4000:4000 \
|
||||||
|
$(DOCKER_IMAGE) /bin/sh -c "mix phx.server"
|
||||||
|
|
||||||
|
run: start |
||||||
|
|
||||||
|
.PHONY: build \
|
||||||
|
migrate \
|
||||||
|
start \
|
||||||
|
postgres \
|
||||||
|
run
|
@ -0,0 +1,77 @@ |
|||||||
|
# BlockScout Docker integration |
||||||
|
|
||||||
|
For now this integration is not production ready. It made only for local usage only ! |
||||||
|
|
||||||
|
## How to use ? |
||||||
|
First of all blockscout requires `PostgreSQL` server for working. |
||||||
|
It will be provided by starting script (new docker image will be created named `postgres`) |
||||||
|
|
||||||
|
**Starting command** |
||||||
|
`make start` - will set everything up and start blockscout in container. |
||||||
|
To connect it to your local environment you will have to configure it using [env variables](#env-variables) |
||||||
|
|
||||||
|
Exmaple connecting to local `ganache` instance running on port `2000` on Mac/Windows: |
||||||
|
```bash |
||||||
|
COIN=DAI \ |
||||||
|
ETHEREUM_JSONRPC_VARIANT=ganache \ |
||||||
|
ETHEREUM_JSONRPC_HTTP_URL=http://host.docker.internal:2000 \ |
||||||
|
ETHEREUM_JSONRPC_WEB_SOCKET_URL=ws://host.docker.internal:2000 \ |
||||||
|
make start |
||||||
|
``` |
||||||
|
|
||||||
|
Blockscout will be available on `localhost:4000` |
||||||
|
|
||||||
|
**Note** |
||||||
|
On mac/Windows Docker provides with a special URL `host.docker.internal` that will be available into container and routed to your local machine. |
||||||
|
On Linux docker is starting using `--network=host` and all services should be available on `localhost` |
||||||
|
|
||||||
|
### Migrations |
||||||
|
|
||||||
|
By default `Makefile` will do migrations for you on `PostgreSQL` creation. |
||||||
|
But you could run migrations manualy using `make migrate` command. |
||||||
|
|
||||||
|
**WARNING** Migrations will clean up your local database ! |
||||||
|
|
||||||
|
## Env variables |
||||||
|
|
||||||
|
BlockScout support 3 different JSON RPC Variants. |
||||||
|
Vriant could be configured using `ETHEREUM_JSONRPC_VARIANT` environment variable. |
||||||
|
|
||||||
|
Example: |
||||||
|
```bash |
||||||
|
ETHEREUM_JSONRPC_VARIANT=ganache make start |
||||||
|
``` |
||||||
|
|
||||||
|
Available options are: |
||||||
|
|
||||||
|
* `parity` - Parity JSON RPC (**Default one**) |
||||||
|
* `geth` - Geth JSON RPC |
||||||
|
* `ganache` - Ganache JSON RPC |
||||||
|
|
||||||
|
|
||||||
|
| Variable | Description | Default value | |
||||||
|
| -------- | ----------- | ------------- | |
||||||
|
| `ETHEREUM_JSONRPC_VARIANT` | Variant of your JSON RPC service: `parity`, `geth` or `ganache` | `parity` | |
||||||
|
| `ETHEREUM_JSONRPC_HTTP_URL` | HTTP JSON RPC URL Only for `geth` or `ganache` variant | Different per JSONRPC variant | |
||||||
|
| `ETHEREUM_JSONRPC_WS_URL` | WS JSON RPC url | Different per JSONRPC variant | |
||||||
|
| `ETHEREUM_JSONRPC_TRACE_URL` | Trace URL **Only for `parity` variant** | `https://sokol-trace.poa.network` | |
||||||
|
| `COIN` | Default Coin | `POA` | |
||||||
|
| `LOGO` | Coin logo | Empty | |
||||||
|
| `NETWORK` | Network | Empty | |
||||||
|
| `SUBNETWORK` | Subnetwork | Empty | |
||||||
|
| `NETWORK_ICON` | Network icon | Empty | |
||||||
|
| `NETWORK_PATH` | Network path | `/` | |
||||||
|
|
||||||
|
|
||||||
|
`ETHEREUM_JSONRPC_HTTP_URL` default values: |
||||||
|
|
||||||
|
* For `parity` - `https://sokol.poa.network` |
||||||
|
* For `geth` - `https://mainnet.infura.io/8lTvJTKmHPCHazkneJsY` |
||||||
|
* For `ganache` - `http://localhost:7545` |
||||||
|
|
||||||
|
`ETHEREUM_JSONRPC_WS_URL` default values: |
||||||
|
|
||||||
|
* For `parity` - `wss://sokol-ws.poa.network/ws` |
||||||
|
* For `geth` - `wss://mainnet.infura.io/8lTvJTKmHPCHazkneJsY/ws` |
||||||
|
* For `ganache` - `ws://localhost:7545` |
||||||
|
|
Loading…
Reference in new issue