File size: 8,414 Bytes
b29a1f0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#!/bin/bash
################################################################################
# CodePilot GCP Deployment Script
# Deploys CodePilot to Google Cloud Platform VM with zero manual steps
################################################################################

set -e  # Exit on error

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# Configuration
TARBALL_NAME="codepilot-deployment.tar.gz"
REMOTE_DIR="~/codepilot"
BACKUP_DIR="~/codepilot_backup"

################################################################################
# Helper Functions
################################################################################

log_info() {
    echo -e "${BLUE}ℹ️  $1${NC}"
}

log_success() {
    echo -e "${GREEN}βœ… $1${NC}"
}

log_warning() {
    echo -e "${YELLOW}⚠️  $1${NC}"
}

log_error() {
    echo -e "${RED}❌ $1${NC}"
}

################################################################################
# Load and Validate Environment
################################################################################

log_info "Loading environment configuration..."

# Load .env file if exists
if [ -f .env ]; then
    source .env
    log_success "Loaded .env file"
else
    log_warning ".env file not found - using environment variables only"
fi

# Validate required variables
if [ -z "$GCP_VM_IP" ]; then
    log_error "GCP_VM_IP not set"
    echo "Please set GCP_VM_IP in .env file or environment"
    echo "Example: export GCP_VM_IP=34.123.45.67"
    exit 1
fi

# Set defaults
GCP_SSH_USER=${GCP_SSH_USER:-$(whoami)}
GCP_SSH_KEY=${GCP_SSH_KEY:-~/.ssh/google_compute_engine}

log_info "Deployment Configuration:"
echo "  β€’ Target VM: $GCP_VM_IP"
echo "  β€’ SSH User: $GCP_SSH_USER"
echo "  β€’ SSH Key: $GCP_SSH_KEY"

# Verify SSH key exists
if [ ! -f "$GCP_SSH_KEY" ]; then
    log_error "SSH key not found: $GCP_SSH_KEY"
    echo "Generate one with: ssh-keygen -t rsa -f $GCP_SSH_KEY"
    exit 1
fi

################################################################################
# Pre-Deployment Checks
################################################################################

log_info "Running pre-deployment checks..."

# Test SSH connectivity
log_info "Testing SSH connection to $GCP_VM_IP..."
if ssh -i "$GCP_SSH_KEY" -o ConnectTimeout=10 -o BatchMode=yes "$GCP_SSH_USER@$GCP_VM_IP" "echo 'SSH connection successful'" &>/dev/null; then
    log_success "SSH connection verified"
else
    log_error "Cannot connect to $GCP_VM_IP"
    echo "Check that:"
    echo "  1. VM is running"
    echo "  2. Firewall allows SSH (port 22)"
    echo "  3. SSH key is added to VM"
    exit 1
fi

################################################################################
# Build Deployment Package
################################################################################

log_info "Building deployment package..."

# Remove old tarball if exists
rm -f "$TARBALL_NAME"

# Create tarball excluding unnecessary files
tar -czf "$TARBALL_NAME" \
    --exclude=venv \
    --exclude=.git \
    --exclude=__pycache__ \
    --exclude='*.pyc' \
    --exclude='*.pyo' \
    --exclude='.pytest_cache' \
    --exclude='*.egg-info' \
    --exclude='.DS_Store' \
    --exclude='node_modules' \
    --exclude="$TARBALL_NAME" \
    .

TARBALL_SIZE=$(du -h "$TARBALL_NAME" | cut -f1)
log_success "Created tarball: $TARBALL_NAME ($TARBALL_SIZE)"

################################################################################
# Upload to GCP VM
################################################################################

log_info "Uploading to GCP VM..."

scp -i "$GCP_SSH_KEY" \
    -o StrictHostKeyChecking=no \
    "$TARBALL_NAME" \
    "$GCP_SSH_USER@$GCP_VM_IP:/tmp/"

log_success "Upload complete"

################################################################################
# Deploy on Remote VM
################################################################################

log_info "Deploying on remote VM..."

ssh -i "$GCP_SSH_KEY" \
    -o StrictHostKeyChecking=no \
    "$GCP_SSH_USER@$GCP_VM_IP" << 'REMOTE_SCRIPT'

set -e  # Exit on error

# Colors for remote output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}ℹ️  $1${NC}"; }
log_success() { echo -e "${GREEN}βœ… $1${NC}"; }
log_warning() { echo -e "${YELLOW}⚠️  $1${NC}"; }
log_error() { echo -e "${RED}❌ $1${NC}"; }

################################################################################
# Backup existing deployment
################################################################################

if [ -d ~/codepilot ]; then
    log_info "Backing up existing deployment..."
    
    # Stop current containers
    cd ~/codepilot
    if [ -f docker-compose.yml ]; then
        docker-compose down || log_warning "Failed to stop containers (may not be running)"
    fi
    
    # Create backup
    BACKUP_NAME="codepilot_backup_$(date +%Y%m%d_%H%M%S)"
    mv ~/codepilot ~/"$BACKUP_NAME"
    log_success "Backup created: ~/$BACKUP_NAME"
fi

################################################################################
# Extract new deployment
################################################################################

log_info "Extracting deployment package..."
mkdir -p ~/codepilot
cd /tmp
tar -xzf codepilot-deployment.tar.gz -C ~/codepilot
log_success "Extracted to ~/codepilot"

################################################################################
# Deploy with Docker Compose
################################################################################

cd ~/codepilot

log_info "Starting Docker containers..."

# Check if docker-compose.yml exists
if [ ! -f docker-compose.yml ]; then
    log_error "docker-compose.yml not found in deployment package"
    exit 1
fi

# Pull latest images and start
docker-compose pull || log_warning "Failed to pull images (using cached)"
docker-compose up -d

log_success "Docker containers started"

################################################################################
# Health Check
################################################################################

log_info "Running health check..."
sleep 5  # Wait for containers to initialize

# Check if containers are running
RUNNING_CONTAINERS=$(docker-compose ps --services --filter "status=running" | wc -l)
TOTAL_CONTAINERS=$(docker-compose ps --services | wc -l)

if [ "$RUNNING_CONTAINERS" -eq "$TOTAL_CONTAINERS" ]; then
    log_success "All containers healthy ($RUNNING_CONTAINERS/$TOTAL_CONTAINERS running)"
else
    log_warning "Some containers not running ($RUNNING_CONTAINERS/$TOTAL_CONTAINERS)"
    docker-compose ps
fi

################################################################################
# Cleanup
################################################################################

log_info "Cleaning up..."
rm -f /tmp/codepilot-deployment.tar.gz
log_success "Cleanup complete"

echo ""
log_success "πŸŽ‰ Deployment successful!"
echo "Access CodePilot at: http://$(hostname -I | awk '{print $1}'):8000"

REMOTE_SCRIPT

################################################################################
# Local Cleanup
################################################################################

log_info "Cleaning up local files..."
rm -f "$TARBALL_NAME"
log_success "Local cleanup complete"

################################################################################
# Final Status
################################################################################

echo ""
echo "╔════════════════════════════════════════════════════════════╗"
echo "β•‘                  DEPLOYMENT SUCCESSFUL                     β•‘"
echo "β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•"
echo ""
log_success "CodePilot deployed to $GCP_VM_IP"
echo ""
echo "Next steps:"
echo "  1. Access UI: http://$GCP_VM_IP:8000"
echo "  2. Check logs: ssh $GCP_SSH_USER@$GCP_VM_IP 'cd ~/codepilot && docker-compose logs -f'"
echo "  3. Stop: ssh $GCP_SSH_USER@$GCP_VM_IP 'cd ~/codepilot && docker-compose down'"
echo ""