├── .gitignore ├── .gitmodules ├── Makefile ├── README.md ├── config.json ├── docker-compose.yaml ├── nginx ├── Dockerfile ├── entrypoint.bash └── nginx.conf └── scripts ├── create-genesis.bash ├── install-docker.bash └── issue-cert.bash /.gitignore: -------------------------------------------------------------------------------- 1 | genesis.json 2 | .idea 3 | datadir/ 4 | tmp_config.json -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "genesis"] 2 | path = genesis 3 | url = https://github.com/Ankr-network/bas-genesis-config 4 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: check-env 2 | check-env: 3 | ifndef DOMAIN_NAME 4 | $(warning env DOMAIN_NAME is undefined) 5 | endif 6 | ifndef CHAIN_ID 7 | $(error env CHAIN_ID is undefined) 8 | endif 9 | 10 | .PHONY: install-docker 11 | install-docker: 12 | bash ./scripts/install-docker.bash 13 | 14 | .PHONY: install-acme 15 | install-acme: 16 | curl https://get.acme.sh | sh -s email=dmitry@ankr.com || true 17 | bash ./scripts/issue-cert.bash 18 | 19 | .PHONY: create-genesis 20 | create-genesis: check-env 21 | bash ./scripts/create-genesis.bash 22 | 23 | .PHONY: start 24 | start: check-env 25 | cat ./docker-compose.yaml | envsubst | docker-compose -f - pull 26 | cat ./docker-compose.yaml | envsubst | docker-compose -f - up -d 27 | 28 | .PHONY: stop 29 | stop: 30 | docker compose stop 31 | 32 | .PHONE: reset-explorer 33 | reset-explorer: check-env stop 34 | docker compose stop 35 | rm -rf ./datadir/blockscout 36 | cat ./docker-compose.yaml | envsubst | docker-compose -f - up -d 37 | 38 | .PHONE: delete-state 39 | delete-state: 40 | rm -rf ./datadir genesis.json 41 | 42 | .PHONE: reset 43 | reset: stop delete-state create-genesis start 44 | 45 | .PHONY: all 46 | all: create-genesis start -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | BAS DevNet Setup 2 | ================ 3 | 4 | This repository contains scripts for running an independent instance of BAS. 5 | 6 | Before running command you must do following steps: 7 | - Buy a dedicated machine that have at least 8 dedicated CPU core and 32GB RAM (it runs 7 nodes) 8 | - Make sure you have wildcard domain `*.example.com` set to your machine (use dedicated machine with public IP) 9 | - Modify `config.json` file to update parameters you need (you can find all addresses in keystore folder) 10 | 11 | Config structure: 12 | - `chainId` - identifier of your BAS chain 13 | - `validators` - list of initial validator set (make sure that you have the same list in docker compose file) 14 | - `systemTreasury` - address of system treasury that accumulates 1/16 of rewards (might be governance) 15 | - `consensusParams` - parameters for the consensus and staking 16 | - `activeValidatorsLength` - total amount of active validators (suggested values are 3k+1, where k is honest validators, even better, for example 7, 13, 19, 25, 31...) 17 | - `epochBlockInterval` - better to use 1 day epoch (86400/3=28800, where 3s is block time) 18 | - `misdemeanorThreshold` - after missing this amount of blocks per day validator losses all daily rewards (penalty) 19 | - `felonyThreshold` - after missing this amount of blocks per day validator goes in jail for N epochs 20 | - `validatorJailEpochLength` - how many epochs validator should stay in jail (7 epochs = ~7 days) 21 | - `undelegatePeriod` - allow claiming funds only after 6 epochs (~7 days) 22 | - `minValidatorStakeAmount` - how many tokens validator must stake to create a validator (in ether) 23 | - `minStakingAmount` - minimum staking amount for delegators (in ether) 24 | - `initialStakes` - initial stakes fot the validators (must match with validators list) 25 | - `votingPeriod` - default voting period for the governance proposals 26 | - `faucet` - map with initial balances for faucet and other needs 27 | 28 | You can check Makefile to choose the most interesting commands, but if you just need to set up everything just run next command: 29 | 30 | ```bash 31 | apt update 32 | apt install -y build-essential socat 33 | git clone https://github.com/Ankr-network/bas-devnet-setup bas --recursive 34 | cd bas 35 | make install-docker 36 | make install-acme 37 | export CHAIN_ID=14000 38 | export DOMAIN_NAME=dev-01.bas.ankr.com 39 | make all 40 | ``` 41 | 42 | P.S: Variable `DOMAIN_NAME` should be set to your domain 43 | 44 | Deployed services can be access though next endpoints: 45 | - https://rpc.${DOMAIN_NAME} - Web3 RPC endpoint 46 | - https://explorer.${DOMAIN_NAME} - Blockchain Explorer 47 | - https://faucet.${DOMAIN_NAME} - Faucet 48 | - https://staking.${DOMAIN_NAME} - Staking UI 49 | 50 | If you want to run node w/o load balancer and SSL certificates then use next command: 51 | ```bash 52 | CHAIN_ID=14000 make create-genesis start 53 | ``` 54 | 55 | Docker compose files exposes next ports: 56 | - 30303 - bootnode endpoint 57 | - 8545 - RPC endpoint 58 | - 8546 - WS endpoint 59 | - 3000 - faucet UI 60 | - 3001 - staking UI 61 | - 3002 - config UI 62 | - 8080 - genesis config endpoint 63 | - 7432 - blockscout PostgreSQL database 64 | - 4000 - blockscout explorer 65 | - 9000 - explorer -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- 1 | { 2 | "chainId": $CHAIN_ID, 3 | "validators": [ 4 | "0x08fae3885e299c24ff9841478eb946f41023ac69", 5 | "0x751aaca849b09a3e347bbfe125cf18423cc24b40", 6 | "0xa6ff33e3250cc765052ac9d7f7dfebda183c4b9b" 7 | ], 8 | "systemTreasury": { 9 | "0x00a601f45688dba8a070722073b015277cf36725": 9000, 10 | "0x100dd6c27454cb1DAdd1391214A344C6208A8C80": 1000 11 | }, 12 | "consensusParams": { 13 | "activeValidatorsLength": 25, 14 | "epochBlockInterval": 1200, 15 | "misdemeanorThreshold": 50, 16 | "felonyThreshold": 150, 17 | "validatorJailEpochLength": 7, 18 | "undelegatePeriod": 6, 19 | "minValidatorStakeAmount": "0xde0b6b3a7640000", 20 | "minStakingAmount": "0xde0b6b3a7640000" 21 | }, 22 | "initialStakes": { 23 | "0x08fae3885e299c24ff9841478eb946f41023ac69": "0x3635c9adc5dea00000", 24 | "0x751aaca849b09a3e347bbfe125cf18423cc24b40": "0x3635c9adc5dea00000", 25 | "0xa6ff33e3250cc765052ac9d7f7dfebda183c4b9b": "0x3635c9adc5dea00000" 26 | }, 27 | "votingPeriod": 60, 28 | "faucet": { 29 | "0x00a601f45688dba8a070722073b015277cf36725": "0x21e19e0c9bab2400000", 30 | "0xb891fe7b38f857f53a7b5529204c58d5c487280b": "0x52b7d2dcc80cd2e4000000" 31 | } 32 | } -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: "3.5" 2 | services: 3 | 4 | bootnode: 5 | image: ankrnetwork/bas-template-bsc:devel 6 | command: 7 | - "geth" 8 | - "--datadir=/datadir" 9 | - "--genesis=/datadir/genesis.json" 10 | - "--networkid=17243" 11 | - "--nodekeyhex=633ab917d09441de38ae9251e79ced41df39a1c338842b826c18fb1773246e18" 12 | - "--syncmode=full" 13 | volumes: 14 | - "./genesis.json:/datadir/genesis.json" 15 | - "./datadir/bootnode:/datadir/geth" 16 | ports: 17 | - "30303:30303" 18 | extra_hosts: 19 | - 'host.docker.internal:host-gateway' 20 | restart: always 21 | 22 | validator_1: 23 | image: ankrnetwork/bas-template-bsc:devel 24 | command: 25 | - "geth" 26 | - "--datadir=/datadir" 27 | - "--genesis=/datadir/genesis.json" 28 | - "--mine" 29 | - "--password=/datadir/password.txt" 30 | - "--allow-insecure-unlock" 31 | - "--unlock=0x08fae3885e299c24ff9841478eb946f41023ac69" 32 | - "--miner.etherbase=0x08fae3885e299c24ff9841478eb946f41023ac69" 33 | - "--bootnodes=enode://5c8e90050fabb7e14e4921dc107caf533140112245e7a231d0edc49861cd779760ad4804e7034952a5cc79422fa9d31c54e9a6141fb4995af7a6bfce7a39140f@host.docker.internal:30303" 34 | - "--gcmode=archive" 35 | - "--syncmode=full" 36 | - "--networkid=17243" 37 | volumes: 38 | - "./genesis.json:/datadir/genesis.json" 39 | - "./genesis/keystore:/datadir/keystore" 40 | - "./genesis/password.txt:/datadir/password.txt" 41 | - "./datadir/validator_1:/datadir/geth" 42 | extra_hosts: 43 | - 'host.docker.internal:host-gateway' 44 | restart: always 45 | validator_2: 46 | image: ankrnetwork/bas-template-bsc:devel 47 | command: 48 | - "geth" 49 | - "--datadir=/datadir" 50 | - "--genesis=/datadir/genesis.json" 51 | - "--mine" 52 | - "--password=/datadir/password.txt" 53 | - "--allow-insecure-unlock" 54 | - "--unlock=0x751aaca849b09a3e347bbfe125cf18423cc24b40" 55 | - "--miner.etherbase=0x751aaca849b09a3e347bbfe125cf18423cc24b40" 56 | - "--bootnodes=enode://5c8e90050fabb7e14e4921dc107caf533140112245e7a231d0edc49861cd779760ad4804e7034952a5cc79422fa9d31c54e9a6141fb4995af7a6bfce7a39140f@host.docker.internal:30303" 57 | - "--gcmode=archive" 58 | - "--syncmode=full" 59 | - "--networkid=17243" 60 | volumes: 61 | - "./genesis.json:/datadir/genesis.json" 62 | - "./genesis/keystore:/datadir/keystore" 63 | - "./genesis/password.txt:/datadir/password.txt" 64 | - "./datadir/validator_2:/datadir/geth" 65 | extra_hosts: 66 | - 'host.docker.internal:host-gateway' 67 | restart: always 68 | validator_3: 69 | image: ankrnetwork/bas-template-bsc:devel 70 | command: 71 | - "geth" 72 | - "--datadir=/datadir" 73 | - "--genesis=/datadir/genesis.json" 74 | - "--mine" 75 | - "--password=/datadir/password.txt" 76 | - "--allow-insecure-unlock" 77 | - "--unlock=0xa6ff33e3250cc765052ac9d7f7dfebda183c4b9b" 78 | - "--miner.etherbase=0xa6ff33e3250cc765052ac9d7f7dfebda183c4b9b" 79 | - "--bootnodes=enode://5c8e90050fabb7e14e4921dc107caf533140112245e7a231d0edc49861cd779760ad4804e7034952a5cc79422fa9d31c54e9a6141fb4995af7a6bfce7a39140f@host.docker.internal:30303" 80 | - "--gcmode=archive" 81 | - "--syncmode=full" 82 | - "--networkid=17243" 83 | extra_hosts: 84 | - 'host.docker.internal:host-gateway' 85 | volumes: 86 | - "./genesis.json:/datadir/genesis.json" 87 | - "./genesis/keystore:/datadir/keystore" 88 | - "./genesis/password.txt:/datadir/password.txt" 89 | - "./datadir/validator_3:/datadir/geth" 90 | restart: always 91 | 92 | rpc: 93 | image: ankrnetwork/bas-template-bsc:devel 94 | command: 95 | - "geth" 96 | - "--datadir=/datadir" 97 | - "--genesis=/datadir/genesis.json" 98 | - "--bootnodes=enode://5c8e90050fabb7e14e4921dc107caf533140112245e7a231d0edc49861cd779760ad4804e7034952a5cc79422fa9d31c54e9a6141fb4995af7a6bfce7a39140f@host.docker.internal:30303" 99 | - "--networkid=17243" 100 | - "--gcmode=archive" 101 | - "--syncmode=full" 102 | - "--http" 103 | - "--http.addr=0.0.0.0" 104 | - "--http.api=eth,net,web3,debug,trace,txpool" 105 | - "--http.port=8545" 106 | - "--http.corsdomain=*" 107 | - "--http.vhosts=*" 108 | - "--ws" 109 | - "--ws.addr=0.0.0.0" 110 | - "--ws.api=eth,net,web3,debug,trace,txpool" 111 | - "--ws.port=8546" 112 | - "--ws.origins=*" 113 | extra_hosts: 114 | - 'host.docker.internal:host-gateway' 115 | ports: 116 | - "8545:8545" 117 | - "8546:8546" 118 | volumes: 119 | - "./genesis.json:/datadir/genesis.json" 120 | - "./genesis/keystore:/datadir/keystore" 121 | - "./genesis/password.txt:/datadir/password.txt" 122 | - "./datadir/rpc:/datadir/geth" 123 | restart: always 124 | 125 | faucet: 126 | image: ankrnetwork/bas-template-bsc:devel 127 | command: 128 | - "faucet" 129 | - "--genesis=/datadir/genesis.json" 130 | - "--bootnodes=enode://5c8e90050fabb7e14e4921dc107caf533140112245e7a231d0edc49861cd779760ad4804e7034952a5cc79422fa9d31c54e9a6141fb4995af7a6bfce7a39140f@host.docker.internal:30303" 131 | - "--network=17243" 132 | - "--account.json=/datadir/keystore/UTC--2022-02-02T10-59-47.185Z--b891fe7b38f857f53a7b5529204c58d5c487280b" 133 | - "--account.pass=/datadir/password.txt" 134 | - "--rpcapi=ws://host.docker.internal:8546" 135 | - "--noauth=true" 136 | - "--faucet.name=BAS" 137 | - "--faucet.amount=10" 138 | - "--faucet.tiers=5" 139 | ports: 140 | - "3000:8080" 141 | volumes: 142 | - "./genesis.json:/datadir/genesis.json" 143 | - "./genesis/keystore:/datadir/keystore" 144 | - "./genesis/password.txt:/datadir/password.txt" 145 | extra_hosts: 146 | - 'host.docker.internal:host-gateway' 147 | restart: always 148 | genesis-config: 149 | image: ankrnetwork/bas-genesis-config:devel 150 | command: ["--http"] 151 | extra_hosts: 152 | - 'host.docker.internal:host-gateway' 153 | ports: 154 | - "8080:8080" 155 | restart: always 156 | 157 | staking-ui: 158 | image: ankrnetwork/bas-staking-ui:devel 159 | environment: 160 | REACT_APP_ENVIRONMENT: "env" 161 | CHAIN_ID: "${CHAIN_ID}" 162 | CHAIN_NAME: "BAS devnet" 163 | CHAIN_RPC: "https://rpc.${DOMAIN_NAME}" 164 | EXPLORER_HOME_URL: "https://explorer.${DOMAIN_NAME}/" 165 | EXPLORER_TX_URL: "https://explorer.${DOMAIN_NAME}/tx/{tx}" 166 | EXPLORER_ADDRESS_URL: "https://explorer.${DOMAIN_NAME}/address/{address}" 167 | EXPLORER_BLOCK_URL: "https://explorer.${DOMAIN_NAME}/block/{block}" 168 | # new env 169 | REACT_APP_API_ENDPOINT: "https://rpc.${DOMAIN_NAME}" 170 | REACT_APP_DEFAULT_NETWORK: "default" 171 | REACT_APP_CHAIN_ID: "${CHAIN_ID}" 172 | REACT_APP_EXPLORER_URL: "https://explorer.${DOMAIN_NAME}/" 173 | REACT_APP_CHAIN_NAME: "BAS devnet #${CHAIN_ID}" 174 | extra_hosts: 175 | - 'host.docker.internal:host-gateway' 176 | ports: 177 | - "3001:80" 178 | restart: always 179 | config-ui: 180 | image: ankrnetwork/bas-config-ui:devel 181 | ports: 182 | - "3002:80" 183 | extra_hosts: 184 | - 'host.docker.internal:host-gateway' 185 | restart: always 186 | 187 | blockscout-db: 188 | image: postgres:13.6 189 | restart: always 190 | environment: 191 | POSTGRES_PASSWORD: '' 192 | POSTGRES_USER: 'postgres' 193 | POSTGRES_HOST_AUTH_METHOD: 'trust' 194 | volumes: 195 | - ./datadir/blockscout:/var/lib/postgresql/data 196 | extra_hosts: 197 | - 'host.docker.internal:host-gateway' 198 | ports: 199 | - "7432:5432" 200 | blockscout: 201 | depends_on: 202 | - blockscout-db 203 | image: blockscout/blockscout:${DOCKER_TAG:-4.1.5} 204 | restart: always 205 | links: 206 | - blockscout-db:database 207 | command: 'mix do ecto.create, ecto.migrate, phx.server' 208 | extra_hosts: 209 | - 'host.docker.internal:host-gateway' 210 | environment: 211 | ETHEREUM_JSONRPC_VARIANT: "geth" 212 | BLOCK_TRANSFORMER: "clique" 213 | ETHEREUM_JSONRPC_HTTP_URL: "http://host.docker.internal:8545/" 214 | DATABASE_URL: "postgresql://postgres:@host.docker.internal:7432/blockscout?ssl=false" 215 | ECTO_USE_SSL: "false" 216 | ports: 217 | - "4000:4000" 218 | blockscout-redis: 219 | image: redis 220 | command: redis-server --requirepass 123456 221 | volumes: 222 | - ./datadir/redis:/data 223 | ports: 224 | - "6379:6379" 225 | restart: always 226 | blockscout-gateway: 227 | depends_on: 228 | - blockscout 229 | image: ankrnetwork/sidechain-explorer:devel 230 | extra_hosts: 231 | - 'host.docker.internal:host-gateway' 232 | environment: 233 | DATABASE_POSTGRES_URL: "postgres://postgres:@host.docker.internal:7432/blockscout?sslmode=disable" 234 | DATABASE_REDIS_URL: "host.docker.internal:6379" 235 | DATABASE_REDIS_PASSWORD: "123456" 236 | GATEWAY_HTTP_ADDRESS: ":9000" 237 | STAKING_ETH1_URL: "http://host.docker.internal:8545/" 238 | REACT_APP_API_ENDPOINT: "/" 239 | REACT_APP_DEFAULT_NETWORK: "default" 240 | ports: 241 | - "9000:9000" 242 | 243 | nginx: 244 | build: "./nginx" 245 | environment: 246 | DOMAIN_NAME: "${DOMAIN_NAME}" 247 | volumes: 248 | - /root/.acme.sh/:/root/.acme.sh/ 249 | extra_hosts: 250 | - 'host.docker.internal:host-gateway' 251 | ports: 252 | - "80:80" 253 | - "443:443" 254 | restart: always -------------------------------------------------------------------------------- /nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:latest 2 | COPY ./nginx.conf /nginx.conf 3 | COPY ./entrypoint.bash /entrypoint.bash 4 | RUN chmod +x /entrypoint.bash 5 | ENTRYPOINT ["/entrypoint.bash"] -------------------------------------------------------------------------------- /nginx/entrypoint.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | env 3 | envsubst '${DOMAIN_NAME}' < /nginx.conf > /etc/nginx/conf.d/00-default.conf 4 | cat /etc/nginx/conf.d/00-default.conf 5 | nginx -g 'daemon off;' -------------------------------------------------------------------------------- /nginx/nginx.conf: -------------------------------------------------------------------------------- 1 | map $host $host_upstream_mapped { 2 | hostnames; 3 | 4 | rpc.${DOMAIN_NAME} rpc:8545; 5 | blockscout.${DOMAIN_NAME} blockscout:4000; 6 | explorer.${DOMAIN_NAME} blockscout-gateway:9000; 7 | staking.${DOMAIN_NAME} staking-ui; 8 | genesis-config.${DOMAIN_NAME} genesis-config:8080; 9 | config.${DOMAIN_NAME} config-ui; 10 | faucet.${DOMAIN_NAME} faucet:8080; 11 | } 12 | 13 | server { 14 | listen 443 ssl; 15 | 16 | ssl_certificate /root/.acme.sh/rpc.${DOMAIN_NAME}_ecc/fullchain.cer; 17 | ssl_certificate_key /root/.acme.sh/rpc.${DOMAIN_NAME}_ecc/rpc.${DOMAIN_NAME}.key; 18 | 19 | server_name _; 20 | 21 | location / { 22 | auth_basic off; 23 | 24 | add_header Access-Control-Allow-Origin "$http_origin"; 25 | add_header Access-Control-Allow-Headers "authorization, content-type"; 26 | add_header Access-Control-Allow-Methods "DELETE, GET, OPTIONS, POST, PUT, UPDATE"; 27 | 28 | proxy_hide_header Access-Control-Allow-Origin; 29 | proxy_set_header Host $host; 30 | proxy_set_header X-Real-IP $remote_addr; 31 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 32 | proxy_set_header X-Forwarded-Proto $scheme; 33 | proxy_http_version 1.1; 34 | proxy_set_header Upgrade $http_upgrade; 35 | proxy_set_header Connection "upgrade"; 36 | 37 | resolver 127.0.0.11; 38 | proxy_pass http://$host_upstream_mapped$request_uri; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /scripts/create-genesis.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [ ! -f "./genesis.json" ]; then 3 | docker build -t bas-genesis-config ./genesis 4 | rm -rf ./genesis.json 5 | envsubst < config.json > tmp_config.json 6 | docker run --rm -v ${PWD}/tmp_config.json:/config.json -t bas-genesis-config /config.json > ./genesis.json 7 | rm -f tmp_config.json 8 | fi -------------------------------------------------------------------------------- /scripts/install-docker.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Docker for ubuntu 4 | apt-get update 5 | apt-get install -y \ 6 | apt-transport-https \ 7 | ca-certificates \ 8 | curl \ 9 | software-properties-common 10 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - 11 | apt-key fingerprint 0EBFCD88 12 | add-apt-repository \ 13 | "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ 14 | $(lsb_release -cs) \ 15 | stable" 16 | apt-get update 17 | apt-get install -y docker-ce 18 | curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose 19 | chmod +x /usr/local/bin/docker-compose 20 | 21 | echo "{\"dns\": [\"1.1.1.1\"], 22 | \"log-driver\": \"json-file\", 23 | \"log-opts\": { \"max-size\": \"50m\", \"max-file\": \"3\" } 24 | }" > /etc/docker/daemon.json 25 | 26 | service docker restart 27 | 28 | # Swap 29 | fallocate -l 4G /swapfile 30 | chmod 600 /swapfile 31 | mkswap /swapfile 32 | swapon /swapfile 33 | echo '/swapfile none swap sw 0 0' | tee -a /etc/fstab 34 | 35 | sysctl vm.swappiness=10 36 | sysctl vm.vfs_cache_pressure=50 37 | echo 'vm.swappiness=10' >> /etc/sysctl.conf 38 | echo 'vm.vfs_cache_pressure=50' >> /etc/sysctl.conf 39 | 40 | wget https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-linux-x86_64 41 | mv docker-compose-linux-x86_64 /usr/libexec/docker/cli-plugins/docker-compose 42 | chmod +x /usr/libexec/docker/cli-plugins/docker-compose 43 | -------------------------------------------------------------------------------- /scripts/issue-cert.bash: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | [ ! -d "/root/.acme.sh/rpc.${DOMAIN_NAME}" ] && ~/.acme.sh/acme.sh --issue --standalone \ 3 | -d rpc.${DOMAIN_NAME} \ 4 | -d blockscout.${DOMAIN_NAME} \ 5 | -d genesis-config.${DOMAIN_NAME} \ 6 | -d config.${DOMAIN_NAME} \ 7 | -d explorer.${DOMAIN_NAME} \ 8 | -d staking.${DOMAIN_NAME} \ 9 | -d faucet.${DOMAIN_NAME} || true --------------------------------------------------------------------------------