-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
379 lines (318 loc) · 12.8 KB
/
deploy.sh
File metadata and controls
379 lines (318 loc) · 12.8 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
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
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
#!/bin/bash
# =============================================================================
# ClinicCloud - Script de Deployment Automatizado para Contabo
# =============================================================================
# Servidor: 31.220.73.136
# Usuario: root
# =============================================================================
set -e # Exit on error
echo "======================================================================"
echo " ClinicCloud - Deployment en Servidor Contabo"
echo "======================================================================"
echo ""
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Function to print colored output
print_success() {
echo -e "${GREEN}✅ $1${NC}"
}
print_error() {
echo -e "${RED}❌ $1${NC}"
}
print_info() {
echo -e "${YELLOW}ℹ️ $1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠️ $1${NC}"
}
# =============================================================================
# PASO 0: Detectar Deployment Anterior
# =============================================================================
echo "PASO 0: Verificando deployment anterior..."
OLD_DEPLOYMENT_DETECTED=false
# Verificar contenedores existentes
if docker ps -a | grep -q "cliniccloud\|desarrollocliniccloud"; then
print_warning "Se detectaron contenedores de deployment anterior"
OLD_DEPLOYMENT_DETECTED=true
fi
# Verificar imágenes existentes
if docker images | grep -q "cliniccloud\|desarrollocliniccloud"; then
print_warning "Se detectaron imágenes Docker de deployment anterior"
OLD_DEPLOYMENT_DETECTED=true
fi
# Verificar directorio existente
if [ -d "/root/ClinicCloud" ] || [ -d "/root/DesarrolloClinicCloud" ]; then
print_warning "Se detectaron directorios de deployment anterior"
OLD_DEPLOYMENT_DETECTED=true
fi
if [ "$OLD_DEPLOYMENT_DETECTED" = true ]; then
echo ""
print_warning "=========================================================="
print_warning " SE DETECTÓ UN DEPLOYMENT ANTERIOR"
print_warning "=========================================================="
echo ""
echo "Es altamente recomendado limpiar el deployment anterior antes de continuar."
echo ""
echo "Opciones:"
echo " 1. Ejecutar script de limpieza (RECOMENDADO)"
echo " 2. Continuar sin limpiar (puede causar conflictos)"
echo " 3. Cancelar deployment"
echo ""
read -p "Selecciona una opción (1/2/3): " cleanup_option
case $cleanup_option in
1)
if [ -f "./cleanup-old-deployment.sh" ]; then
print_info "Ejecutando script de limpieza..."
chmod +x ./cleanup-old-deployment.sh
./cleanup-old-deployment.sh
echo ""
print_success "Limpieza completada. Continuando con deployment..."
echo ""
else
print_error "Script de limpieza no encontrado: cleanup-old-deployment.sh"
echo "Por favor descarga y ejecuta primero cleanup-old-deployment.sh"
exit 1
fi
;;
2)
print_warning "Continuando sin limpiar. Pueden ocurrir conflictos..."
;;
3)
print_info "Deployment cancelado"
exit 0
;;
*)
print_error "Opción inválida"
exit 1
;;
esac
else
print_success "No se detectó deployment anterior"
fi
# =============================================================================
# PASO 1: Verificar Pre-requisitos
# =============================================================================
echo ""
echo "PASO 1: Verificando pre-requisitos..."
# Verificar si estamos como root
if [ "$EUID" -ne 0 ]; then
print_error "Este script debe ejecutarse como root"
exit 1
fi
print_success "Usuario root verificado"
# Verificar conexión a internet
print_info "Verificando conexión a internet..."
if ping -c 4 -W 5 8.8.8.8 &> /dev/null || ping -c 4 -W 5 1.1.1.1 &> /dev/null; then
print_success "Conexión a internet OK"
else
print_warning "No se pudo verificar conexión a internet (continuando de todos modos)"
print_info "Si tienes problemas, verifica tu conexión de red"
fi
# =============================================================================
# PASO 2: Instalar Docker y Docker Compose
# =============================================================================
echo ""
echo "PASO 2: Instalando Docker y Docker Compose..."
if ! command -v docker &> /dev/null; then
print_info "Instalando Docker..."
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
rm get-docker.sh
print_success "Docker instalado"
else
print_success "Docker ya está instalado ($(docker --version))"
fi
if ! command -v docker-compose &> /dev/null; then
print_info "Instalando Docker Compose..."
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
print_success "Docker Compose instalado"
else
print_success "Docker Compose ya está instalado ($(docker-compose --version))"
fi
# =============================================================================
# PASO 3: Configurar Firewall
# =============================================================================
echo ""
echo "PASO 3: Configurando firewall..."
if command -v ufw &> /dev/null; then
print_info "Configurando UFW..."
ufw allow 22/tcp # SSH
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw allow 8000/tcp # API
ufw allow 8001/tcp # Search Engine
ufw allow 9000/tcp # Portainer HTTP
ufw allow 9443/tcp # Portainer HTTPS
echo "y" | ufw enable || true
print_success "Firewall configurado"
else
print_info "UFW no disponible, saltando configuración de firewall"
fi
# =============================================================================
# PASO 4: Crear Directorios de Datos
# =============================================================================
echo ""
echo "PASO 4: Creando directorios de datos..."
mkdir -p /root/cliniccloud-data/pgdata
mkdir -p /root/cliniccloud-data/transformers-cache
mkdir -p /root/cliniccloud-data/backups
chmod 777 /root/cliniccloud-data/pgdata
chmod 777 /root/cliniccloud-data/transformers-cache
chmod 755 /root/cliniccloud-data/backups
print_success "Directorios creados y configurados"
# =============================================================================
# PASO 5: Clonar Repositorio
# =============================================================================
echo ""
echo "PASO 5: Clonando repositorio desde GitHub..."
cd /root
if [ -d "ClinicCloud" ]; then
print_info "Directorio ClinicCloud ya existe, actualizando..."
cd ClinicCloud
git pull origin main || git pull origin master
else
print_info "Clonando repositorio..."
git clone https://github.com/RubenGarrod/ClinicCloud.git
cd ClinicCloud
fi
print_success "Repositorio clonado/actualizado"
# =============================================================================
# PASO 6: Configurar Variables de Entorno
# =============================================================================
echo ""
echo "PASO 6: Configurando variables de entorno..."
if [ ! -f .env ]; then
print_info "Creando archivo .env..."
cp .env.example .env
# Generar credenciales seguras
POSTGRES_PASSWORD=$(openssl rand -base64 32)
REDIS_PASSWORD=$(openssl rand -base64 32)
JWT_SECRET=$(openssl rand -hex 64)
# Reemplazar en .env
sed -i "s/POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$POSTGRES_PASSWORD/" .env
sed -i "s/REDIS_PASSWORD=.*/REDIS_PASSWORD=$REDIS_PASSWORD/" .env
sed -i "s/JWT_SECRET_KEY=.*/JWT_SECRET_KEY=$JWT_SECRET/" .env
print_success "Archivo .env creado con credenciales seguras"
# Guardar credenciales en archivo seguro
cat > /root/cliniccloud-credentials.txt <<EOF
====================================================================
ClinicCloud - Credenciales de Producción
====================================================================
Generadas el: $(date)
POSTGRES_PASSWORD=$POSTGRES_PASSWORD
REDIS_PASSWORD=$REDIS_PASSWORD
JWT_SECRET_KEY=$JWT_SECRET
IMPORTANTE: Guarda este archivo en un lugar seguro y elimínalo del servidor
====================================================================
EOF
chmod 600 /root/cliniccloud-credentials.txt
print_success "Credenciales guardadas en /root/cliniccloud-credentials.txt"
else
print_success "Archivo .env ya existe"
fi
# =============================================================================
# PASO 7: Iniciar Base de Datos
# =============================================================================
echo ""
echo "PASO 7: Inicializando base de datos..."
print_info "Iniciando contenedor de PostgreSQL..."
docker-compose up -d db
print_info "Esperando a que PostgreSQL esté listo (30 segundos)..."
sleep 30
# Verificar que PostgreSQL está corriendo
if docker-compose ps | grep -q "db.*Up"; then
print_success "PostgreSQL está corriendo"
else
print_error "PostgreSQL no pudo iniciar"
docker-compose logs db
exit 1
fi
# =============================================================================
# PASO 8: Aplicar Schema y Migraciones
# =============================================================================
echo ""
echo "PASO 8: Aplicando schema y migraciones..."
print_info "Aplicando schema consolidado..."
docker-compose exec -T db psql -U admin -d cliniccloud < database/consolidated_schema.sql
print_info "Aplicando migraciones..."
for migration in database/migrations/*.sql; do
migration_name=$(basename "$migration")
echo " Aplicando: $migration_name"
docker-compose exec -T db psql -U admin -d cliniccloud < "$migration"
done
print_success "Schema y migraciones aplicadas"
# Verificar tablas
echo ""
print_info "Verificando tablas creadas..."
docker-compose exec db psql -U admin -d cliniccloud -c "\dt" | head -20
# =============================================================================
# PASO 9: Build y Start de Todos los Servicios
# =============================================================================
echo ""
echo "PASO 9: Building y iniciando todos los servicios..."
print_info "Building servicios (esto puede tomar varios minutos)..."
docker-compose build --parallel
print_info "Iniciando servicios en modo producción..."
docker-compose up -d
print_success "Todos los servicios iniciados"
# =============================================================================
# PASO 10: Verificar Servicios
# =============================================================================
echo ""
echo "PASO 10: Verificando servicios..."
sleep 10
print_info "Estado de contenedores:"
docker-compose ps
echo ""
print_info "Verificando health check de API..."
sleep 5
if curl -f http://localhost:8000/api/health &> /dev/null; then
print_success "API está respondiendo correctamente"
else
print_error "API no responde al health check"
echo "Logs de API:"
docker-compose logs --tail=50 api
fi
# =============================================================================
# PASO 11: Configurar Backups Automáticos
# =============================================================================
echo ""
echo "PASO 11: Configurando backups automáticos..."
# Añadir cron job para backup diario a las 3 AM
CRON_JOB="0 3 * * * /root/ClinicCloud/scripts/backup-db.sh"
(crontab -l 2>/dev/null | grep -v backup-db.sh; echo "$CRON_JOB") | crontab -
print_success "Backup automático configurado (diariamente a las 3 AM)"
# =============================================================================
# DEPLOYMENT COMPLETADO
# =============================================================================
echo ""
echo "======================================================================"
echo " ✅ DEPLOYMENT COMPLETADO EXITOSAMENTE"
echo "======================================================================"
echo ""
echo "URLs de acceso:"
echo " - Frontend: http://31.220.73.136"
echo " - API: http://31.220.73.136:8000"
echo " - API Docs: http://31.220.73.136:8000/docs"
echo " - Search Engine: http://31.220.73.136:8001"
echo ""
echo "Credenciales guardadas en:"
echo " /root/cliniccloud-credentials.txt"
echo ""
echo "Comandos útiles:"
echo " - Ver logs: docker-compose logs -f"
echo " - Ver estado: docker-compose ps"
echo " - Restart: docker-compose restart"
echo " - Stop: docker-compose down"
echo ""
echo "Siguiente paso:"
echo " 1. Abre http://31.220.73.136 en tu navegador"
echo " 2. Verifica que todo funciona correctamente"
echo " 3. Guarda las credenciales en un lugar seguro"
echo " 4. Elimina /root/cliniccloud-credentials.txt del servidor"
echo ""
echo "======================================================================"