-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·149 lines (119 loc) · 4.75 KB
/
deploy.sh
File metadata and controls
executable file
·149 lines (119 loc) · 4.75 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
#!/usr/bin/env bash
set -euo pipefail
# ──────────────────────────────────────────────
# ClawdLab Deploy / Upgrade
# ──────────────────────────────────────────────
COMPOSE_FILE="docker-compose.prod.yml"
MAX_WAIT=60
echo "============================================"
echo " ClawdLab Deploy / Upgrade"
echo "============================================"
echo ""
# ── 1. Pre-flight checks ─────────────────────
if ! command -v docker &>/dev/null; then
echo "ERROR: docker is not installed. Please install Docker first."
echo " https://docs.docker.com/get-docker/"
exit 1
fi
if ! docker compose version &>/dev/null; then
echo "ERROR: docker compose (v2) is not available."
echo " Please install the Docker Compose plugin."
exit 1
fi
echo "[OK] docker and docker compose detected"
# ── 2. Environment file ──────────────────────
if [ ! -f .env ]; then
echo ""
echo "No .env file found. Creating one from .env.example ..."
if [ -f .env.example ]; then
cp .env.example .env
else
# Create a minimal .env if no example exists
touch .env
fi
# Generate secure secrets
JWT_SECRET=$(openssl rand -base64 32)
PG_PASSWORD="clawdlab_prod_$(openssl rand -hex 8)"
# Write or append secrets
if grep -q "^JWT_SECRET_KEY=" .env 2>/dev/null; then
sed -i.bak "s|^JWT_SECRET_KEY=.*|JWT_SECRET_KEY=${JWT_SECRET}|" .env && rm -f .env.bak
else
echo "JWT_SECRET_KEY=${JWT_SECRET}" >> .env
fi
if grep -q "^POSTGRES_PASSWORD=" .env 2>/dev/null; then
sed -i.bak "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=${PG_PASSWORD}|" .env && rm -f .env.bak
else
echo "POSTGRES_PASSWORD=${PG_PASSWORD}" >> .env
fi
echo ""
echo "[OK] .env created with generated secrets."
echo " Review and edit .env before continuing if needed:"
echo " vi .env"
echo ""
read -rp "Press Enter to continue (or Ctrl-C to abort) ..."
fi
echo "[OK] .env file present"
# ── 3. Pull latest code ──────────────────────
echo ""
echo "Pulling latest code from origin/main ..."
git pull origin main
echo "[OK] Code up to date"
# ── 3.5. Pre-deployment backup ─────────────────
if docker compose -f "${COMPOSE_FILE}" ps postgres 2>/dev/null | grep -q "running"; then
echo ""
echo "Taking pre-deployment database backup..."
./scripts/backup.sh pre-deploy
echo "[OK] Pre-deployment backup complete"
else
echo "[SKIP] Postgres not running — skipping backup"
fi
# ── 4. Build images ──────────────────────────
echo ""
echo "Building images (pulling latest base images) ..."
docker compose -f "${COMPOSE_FILE}" build --pull
echo "[OK] Images built"
# ── 5. Start / restart services ──────────────
echo ""
echo "Starting services ..."
docker compose -f "${COMPOSE_FILE}" up -d
echo "[OK] Services started"
# ── 6. Wait for health checks ────────────────
echo ""
echo "Waiting for services to become healthy (max ${MAX_WAIT}s) ..."
elapsed=0
while [ $elapsed -lt $MAX_WAIT ]; do
# Check if the api service is healthy
api_health=$(docker compose -f "${COMPOSE_FILE}" ps --format json 2>/dev/null \
| grep -o '"Health":"[^"]*"' \
| head -n 1 \
|| true)
# Fallback: check via docker compose ps text output
if docker compose -f "${COMPOSE_FILE}" ps 2>/dev/null | grep -q "api.*healthy"; then
echo "[OK] API service is healthy (${elapsed}s)"
break
fi
sleep 3
elapsed=$((elapsed + 3))
printf " ... %ds\n" "$elapsed"
done
if [ $elapsed -ge $MAX_WAIT ]; then
echo ""
echo "WARNING: Health check did not pass within ${MAX_WAIT}s."
echo " Services may still be starting. Check logs with:"
echo " docker compose -f ${COMPOSE_FILE} logs -f api"
fi
# ── 7. Print status ──────────────────────────
echo ""
echo "============================================"
echo " Deployment complete"
echo "============================================"
echo ""
docker compose -f "${COMPOSE_FILE}" ps
echo ""
echo "ClawdLab is available at: http://localhost"
echo ""
echo "Useful commands:"
echo " Logs: docker compose -f ${COMPOSE_FILE} logs -f"
echo " Stop: docker compose -f ${COMPOSE_FILE} down"
echo " Restart: docker compose -f ${COMPOSE_FILE} restart"
echo ""