-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
155 lines (139 loc) · 4.31 KB
/
Copy pathinstall.sh
File metadata and controls
155 lines (139 loc) · 4.31 KB
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
#!/usr/bin/env bash
set -euo pipefail
if [ "$(id -u)" -eq 0 ]; then
SUDO=""
else
SUDO="sudo"
fi
INSTALL_DIR="${DIGIDART_INSTALL_DIR:-/opt/digidart}"
COMPOSE_FILE="$INSTALL_DIR/docker-compose.yml"
ENV_FILE="$INSTALL_DIR/.env"
BACKEND_IMAGE="${DIGIDART_BACKEND_IMAGE:-ghcr.io/lpwithpaul/digidart-backend}"
WEB_IMAGE="${DIGIDART_WEB_IMAGE:-ghcr.io/lpwithpaul/digidart-web}"
IMAGE_TAG="${DIGIDART_IMAGE_TAG:-latest}"
HTTP_PORT="${DIGIDART_HTTP_PORT:-3000}"
API_PORT="${DIGIDART_API_PORT:-8000}"
WATCHTOWER_TOKEN="${DIGIDART_WATCHTOWER_TOKEN:-$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')}"
require_linux() {
if [ "$(uname -s)" != "Linux" ]; then
echo "Dieses Install-Skript unterstuetzt aktuell nur Linux."
exit 1
fi
}
install_docker() {
if command -v docker >/dev/null 2>&1; then
return
fi
echo "Docker ist nicht installiert. Installiere Docker ueber das offizielle Convenience Script..."
if command -v curl >/dev/null 2>&1; then
curl -fsSL https://get.docker.com | $SUDO sh
elif command -v wget >/dev/null 2>&1; then
wget -qO- https://get.docker.com | $SUDO sh
else
echo "Weder curl noch wget sind verfuegbar. Bitte eines von beiden vorinstallieren."
exit 1
fi
$SUDO systemctl enable docker
$SUDO systemctl start docker
}
ensure_compose() {
if $SUDO docker compose version >/dev/null 2>&1; then
return
fi
echo "Docker Compose Plugin fehlt. Installation wird versucht..."
if command -v apt-get >/dev/null 2>&1; then
$SUDO apt-get update
$SUDO apt-get install -y docker-compose-plugin
else
echo "Docker Compose Plugin konnte nicht automatisch installiert werden."
exit 1
fi
}
write_env() {
$SUDO tee "$ENV_FILE" > /dev/null <<EOF
DIGIDART_BACKEND_IMAGE=$BACKEND_IMAGE
DIGIDART_WEB_IMAGE=$WEB_IMAGE
DIGIDART_IMAGE_TAG=$IMAGE_TAG
DIGIDART_HTTP_PORT=$HTTP_PORT
DIGIDART_API_PORT=$API_PORT
DIGIDART_WATCHTOWER_TOKEN=$WATCHTOWER_TOKEN
EOF
}
write_compose() {
$SUDO tee "$COMPOSE_FILE" > /dev/null <<'EOF'
services:
backend:
image: ${DIGIDART_BACKEND_IMAGE}:${DIGIDART_IMAGE_TAG}
restart: always
volumes:
- digidart-data:/data
- /dev:/dev
environment:
DIGIDARTS_DATABASE_URL: sqlite:////data/digidarts.db
PYTHONPATH: /app:/app/apps/client-backend
DIGIDARTS_WATCHTOWER_URL: http://watchtower:8080/v1/update
DIGIDARTS_WATCHTOWER_TOKEN: ${DIGIDART_WATCHTOWER_TOKEN}
ports:
- "${DIGIDART_API_PORT}:8000"
device_cgroup_rules:
- "c 81:* rmw"
labels:
- "com.centurylinklabs.watchtower.enable=true"
healthcheck:
test: ["CMD", "python", "-c", "from urllib.request import urlopen; urlopen('http://127.0.0.1:8000/api/health').read()"]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
web:
image: ${DIGIDART_WEB_IMAGE}:${DIGIDART_IMAGE_TAG}
restart: always
environment:
DIGIDARTS_INTERNAL_API_URL: http://backend:8000/api
ports:
- "${DIGIDART_HTTP_PORT}:3000"
depends_on:
backend:
condition: service_healthy
labels:
- "com.centurylinklabs.watchtower.enable=true"
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000', (res) => process.exit(res.statusCode < 500 ? 0 : 1)).on('error', () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 5
start_period: 20s
watchtower:
image: ghcr.io/nicholas-fedor/watchtower:latest
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
WATCHTOWER_HTTP_API_TOKEN: ${DIGIDART_WATCHTOWER_TOKEN}
WATCHTOWER_LABEL_ENABLE: "true"
WATCHTOWER_CLEANUP: "true"
command: --http-api-update --label-enable --cleanup
labels:
- "com.centurylinklabs.watchtower.enable=false"
volumes:
digidart-data:
EOF
}
deploy() {
$SUDO mkdir -p "$INSTALL_DIR"
write_env
write_compose
cd "$INSTALL_DIR"
$SUDO docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" pull
$SUDO docker compose --env-file "$ENV_FILE" -f "$COMPOSE_FILE" up -d
}
require_linux
install_docker
ensure_compose
deploy
echo
echo "DigiDart wurde installiert oder aktualisiert."
echo "Web UI: http://$(hostname -I | awk '{print $1}'):$HTTP_PORT"
echo "API: http://$(hostname -I | awk '{print $1}'):$API_PORT/api"
echo
echo "Zum spaeteren Update reicht erneut derselbe Befehl mit install.sh."