-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·177 lines (147 loc) · 4.33 KB
/
Copy pathdeploy.sh
File metadata and controls
executable file
·177 lines (147 loc) · 4.33 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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#!/bin/bash
# Exit on error
set -e
# Configuration
LOG_FILE="/var/log/auroville-deploy.log"
MAX_MEMORY_USAGE=90 # Maximum memory usage percentage
MAX_CPU_USAGE=90 # Maximum CPU usage percentage
HEALTH_CHECK_RETRIES=5
HEALTH_CHECK_INTERVAL=10
# Logging function
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# Monitor system resources
check_resources() {
local memory_usage=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
local cpu_total=0
local cpu_samples=10
for ((i=0; i<cpu_samples; i++)); do
cpu_total=$(echo "$cpu_total + $(top -bn1 | grep "Cpu(s)" | awk '{print $2}')" | bc)
sleep 0.1
done
local cpu_usage=$(echo "$cpu_total / $cpu_samples" | bc)
if (( $(echo "$memory_usage > $MAX_MEMORY_USAGE" | bc -l) )); then
log "ERROR: Memory usage too high: ${memory_usage}%"
return 1
fi
if (( $(echo "$cpu_usage > $MAX_CPU_USAGE" | bc -l) )); then
log "ERROR: CPU usage too high: ${cpu_usage}%"
return 1
fi
return 0
}
# Health check function
health_check() {
local retries=$HEALTH_CHECK_RETRIES
while [ $retries -gt 0 ]; do
if docker exec auroville_app curl -f -s http://localhost:5000/health > /dev/null; then
log "Health check passed"
return 0
fi
retries=$((retries-1))
sleep $HEALTH_CHECK_INTERVAL
done
log "ERROR: Health check failed after $HEALTH_CHECK_RETRIES attempts"
return 1
}
# Cleanup function
cleanup() {
log "Cleaning up build artifacts..."
rm -rf dist/* || true
docker system prune -f || true
log "Cleanup completed"
}
# Backup current state
backup_current_state() {
log "Backing up current state..."
cp -r dist dist_backup || true
docker-compose ps > docker_state_backup
}
# Rollback function
rollback() {
log "Rolling back to previous state..."
if [ -d "dist_backup" ]; then
rm -rf dist
mv dist_backup dist
fi
docker-compose down
docker-compose up -d
rm -f docker_state_backup
}
# Main deployment process
main() {
log "Starting deployment process..."
# Check initial system resources
if ! check_resources; then
log "System resources exceeded limits. Aborting deployment."
return 1
fi
# Backup current state
backup_current_state
# Clean up before build
cleanup
# Build frontend with resource monitoring
log "Building frontend..."
NODE_OPTIONS="--max-old-space-size=512" npm run build &
BUILD_PID=$!
while kill -0 $BUILD_PID 2>/dev/null; do
if ! check_resources; then
log "System resources exceeded limits during build. Aborting build."
kill $BUILD_PID
wait $BUILD_PID
return 1
fi
sleep 2
done
wait $BUILD_PID
if [ ! -d "dist" ] || [ ! -f "dist/index.html" ]; then
log "Frontend build failed. Rolling back..."
rollback
return 1
fi
# Check resources after build
if ! check_resources; then
log "System resources exceeded limits after build. Rolling back..."
rollback
return 1
fi
# Stop current containers
log "Stopping current containers..."
docker-compose down
# Start new containers with PM2 management
log "Starting new containers..."
docker-compose up -d
log "Containers started successfully"
# Wait for container to be ready
sleep 5
# Check PM2 process status
log "Checking PM2 process status..."
if ! docker exec auroville_app pm2 list | grep -q "online"; then
log "ERROR: PM2 process not running correctly"
rollback
return 1
fi
# Monitor logs for startup
log "Monitoring application logs..."
docker logs -f auroville_app &
LOGS_PID=$!
# Wait for 10 seconds while monitoring logs
sleep 10
kill $LOGS_PID 2>/dev/null || true
# Final resource check
if ! check_resources; then
log "System resources exceeded limits after deployment. Rolling back..."
rollback
return 1
fi
# Cleanup backup files if deployment successful
rm -rf dist_backup docker_state_backup
log "Deployment completed successfully"
return 0
}
# Trap for errors
trap 'log "Error occurred. Rolling back..."; rollback; exit 1' ERR
# Execute main function
main
exit $?