Skip to content

Commit 42a37a0

Browse files
authored
Merge pull request #299 from dedis/fix-ports
fix: overhauled Docker environment
2 parents 2aa1565 + 4de8701 commit 42a37a0

7 files changed

+256
-51
lines changed

Dockerfiles/Dockerfile.backend

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
FROM node:20-bookworm
22

3+
# install backend
34
WORKDIR /web/backend
45
COPY ../web/backend .
56
RUN npm install
6-
ENTRYPOINT ["npm", "start"]
7+
ENTRYPOINT ["/bin/bash", "-c", "npm start"]
78

Dockerfiles/Dockerfile.dela

+1-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,5 @@ WORKDIR /go/d-voting/cli/memcoin
99
RUN go build
1010
ENV PATH=/go/dela/cli/crypto:/go/d-voting/cli/memcoin:${PATH}
1111
WORKDIR /go
12-
RUN mkdir /data
13-
RUN crypto bls signer new --save /data/private.key
14-
ENTRYPOINT ["/bin/bash", "-c", "memcoin --config /tmp/node start --postinstall --proxyaddr :$PROXYPORT --proxykey $PROXYKEY --listen tcp://$HOSTNAME:2000 --routing tree"]
12+
ENTRYPOINT ["/bin/bash", "-c", "memcoin --config /data/node start --postinstall --proxyaddr :$PROXYPORT --proxykey $PROXYKEY --listen tcp://0.0.0.0:2000 --public http://$HOSTNAME:2000 --routing tree"]
1513
CMD []

Dockerfiles/Dockerfile.dela.debug

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
FROM golang:1.20.6-bookworm
2+
3+
# https://blog.jetbrains.com/go/2020/05/06/debugging-a-go-application-inside-a-docker-container/
4+
RUN go install github.com/go-delve/delve/cmd/dlv@latest
5+
6+
RUN apt-get update && apt-get install git
7+
RUN git clone https://github.com/dedis/dela.git
8+
RUN git clone https://github.com/dedis/d-voting.git
9+
WORKDIR /go/dela/cli/crypto
10+
RUN go install
11+
WORKDIR /go/d-voting/cli/memcoin
12+
13+
RUN go build -gcflags="all=-N -l"
14+
15+
ENV PATH=/go/dela/cli/crypto:/go/d-voting/cli/memcoin:${PATH}
16+
WORKDIR /go
17+
ENTRYPOINT ["/bin/bash", "-c", "dlv --listen=:40000 --headless=true --api-version=2 --accept-multiclient exec /go/d-voting/cli/memcoin/memcoin -- --config /data/node start --postinstall --proxyaddr :$PROXYPORT --proxykey $PROXYKEY --listen tcp://0.0.0.0:2000 --public http://$HOSTNAME:2000 --routing tree"]
18+
CMD []

README.docker.md

+16-7
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,12 @@ The relevant files are:
1111
You need to create a local .env file with the following content:
1212

1313
```
14-
DELA_REPLICAS=3 # number of Dela nodes to deploy
15-
DELA_NODE_URL=http://localhost:8080 # Dela node URL (port must be in DELA_PROXY_PORT_RANGE)
16-
DELA_PORT_RANGE=2000-2002 # Dela ports (at least DELA_REPLICAS ports)
17-
DELA_PROXY_PORT_RANGE=8080-8082 # Dela proxy ports (at least DELA_REPLICAS ports)
14+
DELA_NODE_URL=http://127.0.0.1:80 # reverse proxy within backend container
1815
DATABASE_USERNAME=dvoting # choose any PostgreSQL username
1916
DATABASE_PASSWORD= # choose any PostgreSQL password
20-
DATABASE_HOST=db # PostgreSQL host
17+
DATABASE_HOST=db # PostgreSQL host *within the Docker network*
2118
DATABASE_PORT=5432 # PostgreSQL port
19+
DB_PATH=dvoting # LMDB database path
2220
FRONT_END_URL=http://localhost:3000 # frontend URL
2321
BACKEND_HOST=backend # backend host
2422
BACKEND_PORT=5000 # backend port
@@ -52,6 +50,17 @@ to delete the volumes (this will reset your instance).
5250

5351
## Post-install commands
5452

55-
1. run the script `DELA_REPLICAS=... init_dela.sh` to initialize the DELA network with `DELA_REPLICAS set to the same value as in .env`
56-
2. run `docker exec -it d-voting-backend-1 /bin/bash` to connect to the backend
53+
1. `./init_dela.sh`
54+
2. `docker compose exec backend /bin/bash`
5755
3. execute `npx cli addAdmin --sciper 123455` with your SCIPER to add yourself as admin
56+
5. exit the container and run `docker compose down && docker compose up -d`
57+
58+
## Go debugging environment
59+
60+
To use the Go debugging environment, pass the
61+
62+
```
63+
--file docker-compose.debug.yml
64+
```
65+
66+
flag to all `docker compose` invocations.

docker-compose.debug.yml

+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
services:
2+
3+
dela-worker-0: # inital DELA leader node
4+
image: dela
5+
build:
6+
dockerfile: ./Dockerfiles/Dockerfile.dela.debug
7+
environment:
8+
PROXYKEY: ${PUBLIC_KEY}
9+
PROXYPORT: ${PROXYPORT}
10+
LLVL: debug
11+
volumes:
12+
- dela-worker-0-data:/data
13+
hostname: dela-worker-0
14+
ports:
15+
- 127.0.0.1:40000:40000
16+
security_opt:
17+
- apparmor:unconfined
18+
cap_add:
19+
- SYS_PTRACE
20+
networks:
21+
d-voting:
22+
ipv4_address: 172.19.0.255
23+
dela-worker-1: # DELA worker node
24+
image: dela
25+
build:
26+
dockerfile: ./Dockerfiles/Dockerfile.dela.debug
27+
environment:
28+
PROXYKEY: ${PUBLIC_KEY}
29+
PROXYPORT: ${PROXYPORT}
30+
LLVL: debug
31+
volumes:
32+
- dela-worker-1-data:/data
33+
hostname: dela-worker-1
34+
ports:
35+
- 127.0.0.1:40001:40000
36+
security_opt:
37+
- apparmor:unconfined
38+
cap_add:
39+
- SYS_PTRACE
40+
networks:
41+
d-voting:
42+
ipv4_address: 172.19.0.254
43+
dela-worker-2: # DELA worker node
44+
image: dela
45+
build:
46+
dockerfile: ./Dockerfiles/Dockerfile.dela.debug
47+
environment:
48+
PROXYKEY: ${PUBLIC_KEY}
49+
PROXYPORT: ${PROXYPORT}
50+
LLVL: debug
51+
volumes:
52+
- dela-worker-2-data:/data
53+
hostname: dela-worker-2
54+
ports:
55+
- 127.0.0.1:40002:40000
56+
security_opt:
57+
- apparmor:unconfined
58+
cap_add:
59+
- SYS_PTRACE
60+
networks:
61+
d-voting:
62+
ipv4_address: 172.19.0.253
63+
64+
frontend: # web service frontend
65+
image: frontend
66+
build:
67+
dockerfile: ./Dockerfiles/Dockerfile.frontend
68+
ports:
69+
- 127.0.0.1:3000:3000
70+
volumes:
71+
- ./web/frontend/src:/web/frontend/src
72+
environment:
73+
BACKEND_HOST: ${BACKEND_HOST}
74+
BACKEND_PORT: ${BACKEND_PORT}
75+
networks:
76+
d-voting:
77+
ipv4_address: 172.19.0.2
78+
79+
backend: # web service backend
80+
image: backend
81+
build:
82+
dockerfile: ./Dockerfiles/Dockerfile.backend
83+
environment:
84+
DATABASE_USERNAME: ${DATABASE_USERNAME}
85+
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
86+
DATABASE_HOST: ${DATABASE_HOST}
87+
DATABASE_PORT: ${DATABASE_PORT}
88+
DB_PATH: /data/${DB_PATH}
89+
FRONT_END_URL: ${FRONT_END_URL}
90+
DELA_NODE_URL: ${DELA_NODE_URL}
91+
SESSION_SECRET: ${SESSION_SECRET}
92+
PUBLIC_KEY: ${PUBLIC_KEY}
93+
PRIVATE_KEY: ${PRIVATE_KEY}
94+
ports:
95+
- 127.0.0.1:5000:5000
96+
- 127.0.0.1:80:80
97+
depends_on:
98+
db:
99+
condition: service_started
100+
volumes:
101+
- backend-data:/data
102+
- ./web/backend/src:/web/backend/src
103+
networks:
104+
d-voting:
105+
ipv4_address: 172.19.0.3
106+
107+
db: # PostgreSQL database
108+
image: postgres:15
109+
environment:
110+
POSTGRES_USER: ${DATABASE_USERNAME}
111+
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
112+
volumes:
113+
- postgres-data:/var/lib/postgresql/data
114+
- ./web/backend/src/migration.sql:/docker-entrypoint-initdb.d/init.sql
115+
networks:
116+
d-voting:
117+
ipv4_address: 172.19.0.4
118+
119+
volumes:
120+
postgres-data: # PostgreSQL database
121+
dela-worker-0-data:
122+
dela-worker-1-data:
123+
dela-worker-2-data:
124+
backend-data:
125+
126+
networks:
127+
d-voting:
128+
ipam:
129+
config:
130+
- subnet: 172.19.0.0/16
131+
gateway: 172.19.0.1

docker-compose.yml

+59-10
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,47 @@
11
services:
22

3-
dela: # DELA nodes
3+
dela-worker-0: # inital DELA leader node
44
image: dela
55
build:
6-
dockerfile: ./Dockerfile.dela
7-
context: ./Dockerfiles
8-
deploy:
9-
replicas: ${DELA_REPLICAS}
10-
ports:
11-
- 127.0.0.1:${DELA_PORT_RANGE}:2000
12-
- 127.0.0.1:${DELA_PROXY_PORT_RANGE}:8080
6+
dockerfile: ./Dockerfiles/Dockerfile.dela
7+
environment:
8+
PROXYKEY: ${PUBLIC_KEY}
9+
PROXYPORT: ${PROXYPORT}
10+
LLVL: info
11+
volumes:
12+
- dela-worker-0-data:/data
13+
hostname: dela-worker-0
14+
networks:
15+
d-voting:
16+
ipv4_address: 172.19.0.255
17+
dela-worker-1: # DELA worker node
18+
image: dela
19+
build:
20+
dockerfile: ./Dockerfiles/Dockerfile.dela
1321
environment:
1422
PROXYKEY: ${PUBLIC_KEY}
1523
PROXYPORT: ${PROXYPORT}
1624
LLVL: info
25+
volumes:
26+
- dela-worker-1-data:/data
27+
hostname: dela-worker-1
28+
networks:
29+
d-voting:
30+
ipv4_address: 172.19.0.254
31+
dela-worker-2: # DELA worker node
32+
image: dela
33+
build:
34+
dockerfile: ./Dockerfiles/Dockerfile.dela
35+
environment:
36+
PROXYKEY: ${PUBLIC_KEY}
37+
PROXYPORT: ${PROXYPORT}
38+
LLVL: info
39+
volumes:
40+
- dela-worker-2-data:/data
41+
hostname: dela-worker-2
42+
networks:
43+
d-voting:
44+
ipv4_address: 172.19.0.253
1745

1846
frontend: # web service frontend
1947
image: frontend
@@ -24,6 +52,9 @@ services:
2452
environment:
2553
BACKEND_HOST: ${BACKEND_HOST}
2654
BACKEND_PORT: ${BACKEND_PORT}
55+
networks:
56+
d-voting:
57+
ipv4_address: 172.19.0.2
2758

2859
backend: # web service backend
2960
image: backend
@@ -34,6 +65,7 @@ services:
3465
DATABASE_PASSWORD: ${DATABASE_PASSWORD}
3566
DATABASE_HOST: ${DATABASE_HOST}
3667
DATABASE_PORT: ${DATABASE_PORT}
68+
DB_PATH: /data/${DB_PATH}
3769
FRONT_END_URL: ${FRONT_END_URL}
3870
DELA_NODE_URL: ${DELA_NODE_URL}
3971
SESSION_SECRET: ${SESSION_SECRET}
@@ -44,6 +76,11 @@ services:
4476
depends_on:
4577
db:
4678
condition: service_started
79+
volumes:
80+
- backend-data:/data
81+
networks:
82+
d-voting:
83+
ipv4_address: 172.19.0.3
4784

4885
db: # PostgreSQL database
4986
image: postgres:15
@@ -53,8 +90,20 @@ services:
5390
volumes:
5491
- postgres-data:/var/lib/postgresql/data
5592
- ./web/backend/src/migration.sql:/docker-entrypoint-initdb.d/init.sql
56-
ports:
57-
- 127.0.0.1:5432:${DATABASE_PORT}
93+
networks:
94+
d-voting:
95+
ipv4_address: 172.19.0.4
5896

5997
volumes:
6098
postgres-data: # PostgreSQL database
99+
dela-worker-0-data:
100+
dela-worker-1-data:
101+
dela-worker-2-data:
102+
backend-data:
103+
104+
networks:
105+
d-voting:
106+
ipam:
107+
config:
108+
- subnet: 172.19.0.0/16
109+
gateway: 172.19.0.1

init_dela.sh

+29-30
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,44 @@
11
#!/bin/bash
22

3-
# check if DELA_REPLICAS environment variable is set
4-
if [ -z ${DELA_REPLICAS} ]; then
5-
echo "DELA_REPLICAS environment variable needs to be set to use this script";
6-
exit 1;
7-
fi
8-
9-
LEADER_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' d-voting-dela-1);
103
MEMBERS="";
114

5+
126
# share the certificate
13-
for i in $(seq 2 "$DELA_REPLICAS"); do
14-
TOKEN_ARGS=$(docker exec d-voting-dela-1 /bin/bash -c 'LLVL=error memcoin --config /tmp/node minogrpc token');
15-
docker exec d-voting-dela-"$i" memcoin --config /tmp/node minogrpc join --address //"$LEADER_IP":2000 $TOKEN_ARGS;
7+
for container in dela-worker-1 dela-worker-2; do
8+
TOKEN_ARGS=$(docker compose exec dela-worker-0 /bin/bash -c 'LLVL=error memcoin --config /data/node minogrpc token');
9+
docker compose exec "$container" memcoin --config /data/node minogrpc join --address //dela-worker-0:2000 $TOKEN_ARGS;
1610
done
1711

1812
# create a new chain with the nodes
19-
for i in $(seq 1 "$DELA_REPLICAS"); do
13+
for container in dela-worker-0 dela-worker-1 dela-worker-2; do
2014
# add node to the chain
21-
MEMBERS="$MEMBERS --member $(docker exec d-voting-dela-$i /bin/bash -c 'LLVL=error memcoin --config /tmp/node ordering export')";
15+
MEMBERS="$MEMBERS --member $(docker compose exec $container /bin/bash -c 'LLVL=error memcoin --config /data/node ordering export')";
2216
done
23-
docker exec d-voting-dela-1 memcoin --config /tmp/node ordering setup $MEMBERS;
17+
docker compose exec dela-worker-0 memcoin --config /data/node ordering setup $MEMBERS;
2418

2519
# authorize the signer to handle the access contract on each node
26-
for i in $(seq 1 "$DELA_REPLICAS"); do
27-
docker exec d-voting-dela-"$i" /bin/bash -c 'memcoin --config /tmp/node access add --identity $(crypto bls signer read --path /data/private.key --format BASE64_PUBKEY)';
20+
for signer in dela-worker-0 dela-worker-1 dela-worker-2; do
21+
IDENTITY=$(docker compose exec "$signer" crypto bls signer read --path /data/node/private.key --format BASE64_PUBKEY);
22+
for node in dela-worker-0 dela-worker-1 dela-worker-2; do
23+
docker compose exec "$node" memcoin --config /data/node access add --identity "$IDENTITY";
24+
done
2825
done
2926

30-
IDENTITY=$(docker exec d-voting-dela-1 crypto bls signer read --path /data/private.key --format BASE64_PUBKEY);
3127
# update the access contract
32-
docker exec d-voting-dela-1 memcoin --config /tmp/node pool add\
33-
--key /data/private.key\
34-
--args go.dedis.ch/dela.ContractArg\
35-
--args go.dedis.ch/dela.Access\
36-
--args access:grant_id\
37-
--args 0200000000000000000000000000000000000000000000000000000000000000\
38-
--args access:grant_contract\
39-
--args go.dedis.ch/dela.Value\
40-
--args access:grant_command\
41-
--args all\
42-
--args access:identity\
43-
--args $IDENTITY\
44-
--args access:command\
45-
--args GRANT
28+
for container in dela-worker-0 dela-worker-1 dela-worker-2; do
29+
IDENTITY=$(docker compose exec "$container" crypto bls signer read --path /data/node/private.key --format BASE64_PUBKEY);
30+
docker compose exec dela-worker-0 memcoin --config /data/node pool add\
31+
--key /data/node/private.key\
32+
--args go.dedis.ch/dela.ContractArg\
33+
--args go.dedis.ch/dela.Access\
34+
--args access:grant_id\
35+
--args 0300000000000000000000000000000000000000000000000000000000000000\
36+
--args access:grant_contract\
37+
--args go.dedis.ch/dela.Evoting \
38+
--args access:grant_command\
39+
--args all\
40+
--args access:identity\
41+
--args $IDENTITY\
42+
--args access:command\
43+
--args GRANT
44+
done

0 commit comments

Comments
 (0)