/
wodin-deploy
executable file
·161 lines (145 loc) · 3.9 KB
/
wodin-deploy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/usr/bin/env bash
set -eEuo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")"
API_BRANCH="${API_BRANCH:-main}"
APP_BRANCH="${APP_BRANCH:-main}"
API_NAME=odin.api
APP_NAME=wodin
REDIS_NAME=redis
PROXY_NAME=proxy
API_IMAGE=mrcide/odin.api:$API_BRANCH
APP_IMAGE=mrcide/wodin:$APP_BRANCH
REDIS_IMAGE=redis:6
PROXY_IMAGE=reside/proxy-nginx:master
REDIS_VOLUME=wodin-data
NETWORK=wodin-nw
USAGE="Usage: $0 {up|pull|down|redeploy|configure-proxy}"
ACTION=
PROXY_MODE=
while [[ $# -gt 0 ]]; do
case $1 in
--help)
echo $USAGE
exit 0
;;
-*|--*)
echo "Unknown option $1"
exit 1
;;
*)
if [[ $ACTION == "configure-proxy" && -z $PROXY_MODE ]]; then
PROXY_MODE=$1
shift
elif [ ! -z $ACTION ]; then
echo "Too many positional arguments"
echo $USAGE
exit 1
else
ACTION=$1
shift
fi
;;
esac
done
function wodin_pull {
docker pull $API_IMAGE
docker pull $APP_IMAGE
docker pull $REDIS_IMAGE
docker pull $PROXY_IMAGE
}
function wodin_down {
if [ -f .proxy ]; then
docker kill $PROXY_NAME || /bin/true
fi
docker kill $API_NAME $APP_NAME || /bin/true
docker stop $REDIS_NAME || /bin/true
docker network rm $NETWORK
}
function wodin_up {
docker volume create $REDIS_VOLUME
docker network create $NETWORK 2>/dev/null || /bin/true
docker run -d --name $API_NAME --rm --network=$NETWORK $API_IMAGE
docker run -d --name $REDIS_NAME --rm --network=$NETWORK \
-v $REDIS_VOLUME:/data $REDIS_IMAGE
if [ -f .proxy ]; then
PROXY_HOST=$(cat .proxy)
wodin_up_proxy $PROXY_HOST
else
wodin_up_no_proxy
fi
}
function wodin_up_proxy {
PROXY_HOST=$1
docker run -d --name $APP_NAME --rm --network=$NETWORK \
-v $PWD/config:/config:ro \
$APP_IMAGE /config
docker run -d --name $PROXY_NAME --rm --network=$NETWORK \
-v $PWD/ssl/certificate.pem:/run/proxy/certificate.pem:ro \
-v $PWD/ssl/key.pem:/run/proxy/key.pem:ro \
-p 443:443 -p 80:80 \
$PROXY_IMAGE wodin:3000 $PROXY_HOST 80 443
echo "Wodin now available at https://$PROXY_HOST"
}
function wodin_up_no_proxy {
docker run -d --name $APP_NAME --rm --network=$NETWORK \
-v $PWD/config:/config:ro -p 3000:3000 \
$APP_IMAGE /config
echo "Wodin now available at http://localhost:3000"
}
function wodin_configure_proxy {
case $PROXY_MODE in
dev)
echo "Using wodin-dev.dide.ic.ac.uk"
wodin_ssl dev
echo wodin-dev.dide.ic.ac.uk > .proxy
;;
epimodels)
echo "Using epimodels.dide.ic.ac.uk"
wodin_ssl epimodels
echo epimodels.dide.ic.ac.uk > .proxy
;;
none)
echo "Using no proxy"
rm -rf ssl
rm -f .proxy
;;
*)
echo "Invald name for configure-proxy"
echo "Should be one of dev|epimodels|none"
exit 1
;;
esac
}
function wodin_ssl {
SSL_NAME=$1
export VAULT_ADDR=https://vault.dide.ic.ac.uk:8200
echo "Authenticating with the vault"
export VAULT_TOKEN=$(vault login -method=github -token-only)
echo "Copying keys"
mkdir -p ssl/
vault read -field=cert "secret/wodin/ssl/$SSL_NAME" > ssl/certificate.pem
vault read -field=key "secret/wodin/ssl/$SSL_NAME" > ssl/key.pem && \
chmod 600 ssl/key.pem
}
case "$ACTION" in
up)
wodin_up
;;
configure-proxy)
wodin_configure_proxy
;;
pull)
wodin_pull
;;
down)
wodin_down
;;
redeploy)
wodin_pull
wodin_down
wodin_up
;;
*)
echo $USAGE
exit 1
esac