|
Bogdan Timofte
authored
3 months ago
|
1
|
#!/bin/bash
|
|
|
2
|
|
|
|
3
|
# autoSMART Production Deployment Script
|
|
|
4
|
# Version: 1.0
|
|
|
5
|
# Description: Deploy autoSMART system to Proxmox cluster
|
|
|
6
|
|
|
|
7
|
set -e
|
|
|
8
|
|
|
|
9
|
# Configuration
|
|
|
10
|
DB_HOST="192.168.2.102"
|
|
|
11
|
DB_USER="autosmart"
|
|
|
12
|
DB_PASS="autoSMART2025!"
|
|
|
13
|
DB_NAME="autosmart"
|
|
|
14
|
|
|
|
15
|
CLUSTER_JSON="$(dirname "$0")/../cluster.json"
|
|
|
16
|
NODES=()
|
|
|
17
|
NODE_IPS=()
|
|
|
18
|
if [[ -f "$CLUSTER_JSON" ]] && command -v jq &> /dev/null; then
|
|
|
19
|
while IFS= read -r node; do
|
|
|
20
|
NODES+=("$(echo "$node" | jq -r '.hostname')")
|
|
|
21
|
NODE_IPS+=("$(echo "$node" | jq -r '.ip')")
|
|
|
22
|
done < <(jq -c '.cluster.nodes[]' "$CLUSTER_JSON")
|
|
|
23
|
fi
|
|
|
24
|
DEPLOY_DIR="/opt/autoSMART"
|
|
|
25
|
CONFIG_DIR="/etc/pve/autoSMART"
|
|
|
26
|
|
|
|
27
|
echo "🚀 autoSMART Production Deployment"
|
|
|
28
|
echo "=================================="
|
|
|
29
|
|
|
|
30
|
for idx in "${!NODES[@]}"; do
|
|
|
31
|
NODE="${NODES[$idx]}"
|
|
|
32
|
NODE_IP="${NODE_IPS[$idx]}"
|
|
|
33
|
echo ""
|
|
|
34
|
echo "🔧 Deploying to node: $NODE ($NODE_IP)"
|
|
|
35
|
echo "------------------------"
|
|
|
36
|
|
|
|
37
|
# Create directories
|
|
|
38
|
ssh root@$NODE_IP "mkdir -p $DEPLOY_DIR $CONFIG_DIR"
|
|
|
39
|
|
|
|
40
|
# Copy files
|
|
|
41
|
scp -r /tmp/autoSMART-deploy/* root@$NODE_IP:$DEPLOY_DIR/
|
|
|
42
|
|
|
|
43
|
# Install Perl dependencies
|
|
|
44
|
ssh root@$NODE_IP "
|
|
|
45
|
apt-get update -qq
|
|
|
46
|
apt-get install -y libdbi-perl libdbd-pg-perl libjson-perl libfile-slurp-perl smartmontools
|
|
|
47
|
"
|
|
|
48
|
|
|
|
49
|
# Make scripts executable
|
|
|
50
|
ssh root@$NODE_IP "chmod +x $DEPLOY_DIR/scripts/*.sh $DEPLOY_DIR/scripts/*.pl"
|
|
|
51
|
|
|
|
52
|
# Create node-specific configuration
|
|
|
53
|
ssh root@$NODE_IP "cat > $CONFIG_DIR/cluster-$NODE.conf << EOF
|
|
|
54
|
# autoSMART Configuration for $NODE
|
|
|
55
|
ExecStart=$DEPLOY_DIR/scripts/smart-collector-daemon.pl --config $CONFIG_DIR/cluster-$NODE.conf
|
|
|
56
|
Restart=always
|
|
|
57
|
RestartSec=30
|
|
|
58
|
User=root
|
|
|
59
|
|
|
|
60
|
[Install]
|
|
|
61
|
WantedBy=multi-user.target
|
|
|
62
|
EOF"
|
|
|
63
|
|
|
|
64
|
# Enable service (but don't start yet)
|
|
|
65
|
ssh root@192.168.2.$NODE "systemctl daemon-reload && systemctl enable autosmart"
|
|
|
66
|
|
|
|
67
|
echo "✅ Node $NODE deployment complete"
|
|
|
68
|
done
|
|
|
69
|
|
|
|
70
|
# Test database connectivity
|
|
|
71
|
|
|
|
72
|
# Install systemd service
|
|
|
73
|
ssh root@$NODE_IP "cat > /etc/systemd/system/autosmart.service << EOF
|
|
|
74
|
echo ""
|
|
|
75
|
echo "🔍 Testing database connectivity..."
|
|
|
76
|
PGPASSWORD="$DB_PASS" psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "
|
|
|
77
|
SELECT
|
|
|
78
|
COUNT(*) as total_drives,
|
|
|
79
|
COUNT(DISTINCT current_node_id) as active_nodes
|
|
|
80
|
FROM hdd_inventory;
|
|
|
81
|
"
|
|
|
82
|
|
|
|
83
|
echo ""
|
|
|
84
|
echo "🎉 Production deployment complete!"
|
|
|
85
|
echo ""
|
|
|
86
|
echo "To start services on all nodes:"
|
|
|
87
|
echo " for node in ebony ivory obsidian; do ssh root@192.168.2.\$node 'systemctl start autosmart'; done"
|
|
|
88
|
echo ""
|
|
|
89
|
echo "To monitor services:"
|
|
|
90
|
echo " for node in ebony ivory obsidian; do echo \"=== \$node ===\"; ssh root@192.168.2.\$node 'systemctl status autosmart'; done"
|
|
|
91
|
echo ""
|
|
|
92
|
echo "Database monitoring:"
|
|
|
93
|
echo " PGPASSWORD='$DB_PASS' psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c 'SELECT * FROM storage_efficiency_stats;'"
|
|
|
94
|
|
|
|
95
|
# Cleanup
|
|
|
96
|
rm -rf /tmp/autoSMART-deploy
|
|
|
97
|
|
|
|
98
|
echo "✅ Deployment script complete!"
|