-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy_prod.sh
More file actions
executable file
·163 lines (147 loc) · 5.59 KB
/
Copy pathdeploy_prod.sh
File metadata and controls
executable file
·163 lines (147 loc) · 5.59 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
#!/bin/bash
set -euo pipefail
# ==============================================
# CONFIGURACIÓN - Completar antes de ejecutar
# ==============================================
PROD_USER="PROD_USER" # ej: ubuntu, odoo, deploy
PROD_HOST="PROD_HOST" # ej: 192.168.1.100 o mi-servidor.com
MODULE_NAME="modulo_rg5329"
REMOTE_ADDONS="/usr/lib/python3/dist-packages/odoo/addons"
MODULE_SOURCE_PATH="$REMOTE_ADDONS/$MODULE_NAME"
ODOO_SERVICE="odoo"
DB_NAME="odoo"
ODOO_BIN="odoo"
ODOO_SYSTEM_USER="odoo"
LOCAL_MODULE_PATH="$(cd "$(dirname "$0")" && pwd)"
BACKUP_DIR="$LOCAL_MODULE_PATH/backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# ==============================================
# HELPERS
# ==============================================
log() { echo "[$(date '+%H:%M:%S')] $*"; }
error() { echo "[ERROR] $*" >&2; exit 1; }
confirm() {
read -r -p "$1 [s/N]: " resp
[[ "$resp" =~ ^[sS]$ ]] || error "Cancelado por el usuario."
}
# ==============================================
# VALIDACIONES PREVIAS
# ==============================================
log "=== Deploy $MODULE_NAME → Producción ==="
log "Destino : $PROD_USER@$PROD_HOST"
log "Addons : $REMOTE_ADDONS"
log "Servicio: $ODOO_SERVICE | DB: $DB_NAME"
if [[ "$PROD_USER" == "PROD_USER" || "$PROD_HOST" == "PROD_HOST" ]]; then
error "Configurar PROD_USER y PROD_HOST antes de ejecutar este script."
fi
log "Verificando acceso SSH..."
ssh -o ConnectTimeout=10 -o BatchMode=yes "$PROD_USER@$PROD_HOST" "echo OK" \
|| error "Sin acceso SSH a $PROD_USER@$PROD_HOST. Verificar clave y host."
confirm "Continuar con el deploy a produccion?"
# ==============================================
# STEP 1: BACKUP
# ==============================================
log ""
log "--- STEP 1: Backup de base de datos ---"
mkdir -p "$BACKUP_DIR"
BACKUP_FILE="$BACKUP_DIR/backup_${DB_NAME}_${TIMESTAMP}.sql.gz"
log "Generando backup → $BACKUP_FILE"
ssh "$PROD_USER@$PROD_HOST" \
"sudo -u postgres pg_dump $DB_NAME | gzip" > "$BACKUP_FILE"
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
log "Backup OK ($BACKUP_SIZE) → $BACKUP_FILE"
# ==============================================
# STEP 2: SYNC MÓDULO
# ==============================================
log ""
log "--- STEP 2: Sincronizar módulo al servidor ---"
rsync -avz --delete \
--exclude='__pycache__/' \
--exclude='*.pyc' \
--exclude='.git/' \
--exclude='backups/' \
--exclude='*.sh' \
--exclude='*.md' \
--exclude='my_module/' \
"$LOCAL_MODULE_PATH/" \
"$PROD_USER@$PROD_HOST:/tmp/${MODULE_NAME}_deploy/"
# Mover con sudo al path de addons y corregir permisos
ssh "$PROD_USER@$PROD_HOST" "
sudo cp -r /tmp/${MODULE_NAME}_deploy/ $REMOTE_ADDONS/$MODULE_NAME
sudo chown -R $ODOO_SYSTEM_USER:$ODOO_SYSTEM_USER $REMOTE_ADDONS/$MODULE_NAME
rm -rf /tmp/${MODULE_NAME}_deploy/
echo 'Sync OK'
"
# ==============================================
# STEP 3: UPGRADE
# ==============================================
log ""
log "--- STEP 3: Upgrade del módulo ---"
log "Deteniendo servicio Odoo..."
ssh "$PROD_USER@$PROD_HOST" "sudo systemctl stop $ODOO_SERVICE"
log "Ejecutando upgrade (puede tardar unos minutos)..."
UPGRADE_OUTPUT=$(ssh "$PROD_USER@$PROD_HOST" \
"sudo -u $ODOO_SYSTEM_USER $ODOO_BIN \
-c /etc/odoo/odoo.conf \
-u $MODULE_NAME \
--stop-after-init \
2>&1" || true)
# Detectar errores críticos en el output del upgrade
if echo "$UPGRADE_OUTPUT" | grep -qiE "^[0-9-]+ [0-9:]+ [0-9]+ (ERROR|CRITICAL)"; then
log ""
log "=== OUTPUT DEL UPGRADE (últimas 60 líneas) ==="
echo "$UPGRADE_OUTPUT" | tail -60
log ""
log "Reiniciando Odoo con el código anterior..."
ssh "$PROD_USER@$PROD_HOST" "sudo systemctl start $ODOO_SERVICE" || true
error "El upgrade reportó errores. Odoo reiniciado. Backup disponible en: $BACKUP_FILE"
fi
log "Upgrade completado sin errores críticos."
log "Iniciando servicio Odoo..."
ssh "$PROD_USER@$PROD_HOST" "sudo systemctl start $ODOO_SERVICE"
# Esperar que Odoo levante (max 60s)
log "Esperando respuesta HTTP de Odoo..."
for i in $(seq 1 30); do
STATUS=$(ssh "$PROD_USER@$PROD_HOST" \
"curl -s -o /dev/null -w '%{http_code}' http://localhost:8069/web/health 2>/dev/null" || echo "000")
if [[ "$STATUS" == "200" ]]; then
log "Odoo respondiendo OK (HTTP 200)"
break
fi
if [[ "$i" -eq 30 ]]; then
log ""
log "Odoo no respondio en 60s. Ver logs con:"
log " ssh $PROD_USER@$PROD_HOST 'sudo journalctl -u $ODOO_SERVICE -n 50'"
error "Timeout esperando Odoo. Verificar manualmente."
fi
sleep 2
done
# ==============================================
# STEP 4: TESTS POST-UPGRADE
# ==============================================
log ""
log "--- STEP 4: Tests post-upgrade ---"
TEST_SCRIPT="$(dirname "$0")/test_upgrade.py"
if [[ -f "$TEST_SCRIPT" ]] && command -v python3 &>/dev/null; then
python3 "$TEST_SCRIPT" \
--host "http://$PROD_HOST:8069" \
--db "$DB_NAME" \
&& log "Tests OK" \
|| { log "Algunos tests fallaron. Ver salida arriba."; TESTS_FAILED=1; }
else
log "python3 o test_upgrade.py no disponibles, saltando tests automaticos"
fi
# ==============================================
# RESUMEN
# ==============================================
log ""
log "================================================"
log "DEPLOY COMPLETADO"
log " Backup : $BACKUP_FILE ($BACKUP_SIZE)"
log " Odoo : http://$PROD_HOST:8069"
if [[ "${TESTS_FAILED:-0}" == "1" ]]; then
log " Tests : ALGUNOS FALLARON - revisar manualmente"
else
log " Tests : OK"
fi
log "================================================"