Add .gitignore and production deployment script

This commit is contained in:
devmatrix 2026-02-20 22:50:34 +00:00
parent 25d24f07de
commit ae6fa92d55
3 changed files with 87 additions and 230 deletions

51
.gitignore vendored Normal file
View File

@ -0,0 +1,51 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual environments
venv/
env/
ENV/
# IDEs
.vscode/
.idea/
*.swp
*.swo
*~
# Application data
data/
*.json
!data/.gitkeep
# Logs
*.log
logs/
# OS
.DS_Store
Thumbs.db
# Temp files
tmp/
temp/
*.tmp

View File

@ -1,242 +1,42 @@
#!/bin/bash #!/bin/bash
# IPMI Controller - Production Deployment Script # Deploy IPMI Controller to production
# Run this on the production server to set up auto-start and persistence
set -e set -e
INSTALL_DIR="/opt/ipmi-controller" PROD_HOST="192.168.5.210"
DATA_DIR="$INSTALL_DIR/data" PROD_USER="devmatrix"
PROD_DIR="/opt/ipmi-controller"
SERVICE_NAME="ipmi-controller" SERVICE_NAME="ipmi-controller"
USER="devmatrix"
echo "🌡️ IPMI Controller - Production Deployment" echo "=== Deploying IPMI Controller to Production ==="
echo "=============================================" echo "Target: $PROD_HOST"
echo ""
# Check if running as root # Create remote directory
if [ "$EUID" -ne 0 ]; then echo "Creating remote directory..."
echo "❌ Please run as root: sudo ./deploy-prod.sh" ssh $PROD_USER@$PROD_HOST "sudo mkdir -p $PROD_DIR && sudo chown $PROD_USER:$PROD_USER $PROD_DIR"
exit 1
fi
# Get the source directory # Copy files
SOURCE_DIR="${1:-$(pwd)}" echo "Copying files..."
if [ ! -f "$SOURCE_DIR/web_server.py" ]; then rsync -avz --exclude='.git' --exclude='__pycache__' --exclude='data/*.json' \
echo "❌ Cannot find web_server.py in $SOURCE_DIR" ./ $PROD_USER@$PROD_HOST:$PROD_DIR/
echo "Usage: sudo ./deploy-prod.sh [source-directory]"
exit 1
fi
echo "📁 Source: $SOURCE_DIR" # Install systemd service
echo "📁 Install: $INSTALL_DIR" echo "Installing systemd service..."
echo "" ssh $PROD_USER@$PROD_HOST "sudo cp $PROD_DIR/ipmi-controller.service /etc/systemd/system/"
ssh $PROD_USER@$PROD_HOST "sudo systemctl daemon-reload"
ssh $PROD_USER@$PROD_HOST "sudo systemctl enable $SERVICE_NAME"
# Create directories # Restart service
echo "📂 Creating directories..." echo "Restarting service..."
mkdir -p "$INSTALL_DIR" ssh $PROD_USER@$PROD_HOST "sudo systemctl restart $SERVICE_NAME"
mkdir -p "$DATA_DIR"
mkdir -p /var/log/ipmi-controller
# Copy application files
echo "📋 Copying application files..."
cp "$SOURCE_DIR/web_server.py" "$INSTALL_DIR/"
cp "$SOURCE_DIR/fan_controller.py" "$INSTALL_DIR/"
cp "$SOURCE_DIR/requirements.txt" "$INSTALL_DIR/"
# Install dependencies
echo "🐍 Installing Python dependencies..."
pip3 install -q -r "$SOURCE_DIR/requirements.txt" || pip install -q -r "$SOURCE_DIR/requirements.txt"
# Install ipmitool if not present
if ! command -v ipmitool &> /dev/null; then
echo "📦 Installing ipmitool..."
apt-get update -qq
apt-get install -y -qq ipmitool
fi
# Preserve existing config if it exists
if [ -f "$DATA_DIR/config.json" ]; then
echo "💾 Preserving existing configuration..."
cp "$DATA_DIR/config.json" "$DATA_DIR/config.json.backup.$(date +%Y%m%d%H%M%S)"
else
echo "⚙️ Creating default configuration..."
cat > "$DATA_DIR/config.json" << 'EOF'
{
"ipmi_host": "",
"ipmi_username": "",
"ipmi_password": "",
"ipmi_port": 623,
"http_sensor_enabled": false,
"http_sensor_url": "",
"http_sensor_timeout": 10,
"enabled": false,
"poll_interval": 10,
"min_speed": 10,
"max_speed": 100,
"panic_temp": 85,
"panic_speed": 100,
"panic_on_no_data": true,
"no_data_timeout": 60,
"primary_sensor": "cpu",
"sensor_preference": "auto",
"fans": {},
"fan_groups": {},
"fan_curves": {
"Balanced": {
"points": [
{"temp": 30, "speed": 10},
{"temp": 35, "speed": 12},
{"temp": 40, "speed": 15},
{"temp": 45, "speed": 20},
{"temp": 50, "speed": 30},
{"temp": 55, "speed": 40},
{"temp": 60, "speed": 55},
{"temp": 65, "speed": 70},
{"temp": 70, "speed": 85},
{"temp": 75, "speed": 95},
{"temp": 80, "speed": 100}
],
"sensor_source": "cpu",
"applies_to": "all"
},
"Silent": {
"points": [
{"temp": 30, "speed": 5},
{"temp": 40, "speed": 10},
{"temp": 50, "speed": 15},
{"temp": 55, "speed": 25},
{"temp": 60, "speed": 35},
{"temp": 65, "speed": 50},
{"temp": 70, "speed": 70},
{"temp": 75, "speed": 85},
{"temp": 80, "speed": 100}
],
"sensor_source": "cpu",
"applies_to": "all"
},
"Performance": {
"points": [
{"temp": 30, "speed": 20},
{"temp": 35, "speed": 25},
{"temp": 40, "speed": 35},
{"temp": 45, "speed": 45},
{"temp": 50, "speed": 55},
{"temp": 55, "speed": 70},
{"temp": 60, "speed": 85},
{"temp": 65, "speed": 95},
{"temp": 70, "speed": 100}
],
"sensor_source": "cpu",
"applies_to": "all"
}
},
"active_curve": "Balanced",
"theme": "dark"
}
EOF
fi
# Create users file if not exists
if [ ! -f "$DATA_DIR/users.json" ]; then
echo '{"users": {}}' > "$DATA_DIR/users.json"
fi
# Set ownership
chown -R "$USER:$USER" "$INSTALL_DIR"
chown -R "$USER:$USER" /var/log/ipmi-controller
# Create systemd service
echo "🔧 Creating systemd service..."
cat > "/etc/systemd/system/$SERVICE_NAME.service" << EOF
[Unit]
Description=IPMI Controller - Fan Control for Dell Servers
After=network.target
Wants=network.target
[Service]
Type=simple
User=$USER
Group=$USER
WorkingDirectory=$INSTALL_DIR
Environment="PYTHONUNBUFFERED=1"
Environment="DATA_DIR=$DATA_DIR"
Environment="LOG_DIR=/var/log/ipmi-controller"
ExecStart=/usr/bin/python3 $INSTALL_DIR/web_server.py
ExecStop=/bin/kill -TERM \$MAINPID
ExecReload=/bin/kill -HUP \$MAINPID
# Restart policy
Restart=always
RestartSec=10
StartLimitInterval=60s
StartLimitBurst=3
# Logging
StandardOutput=append:/var/log/ipmi-controller/server.log
StandardError=append:/var/log/ipmi-controller/error.log
# Security
NoNewPrivileges=false
ProtectSystem=no
ProtectHome=no
[Install]
WantedBy=multi-user.target
EOF
# Create logrotate config
echo "📝 Creating logrotate config..."
cat > "/etc/logrotate.d/ipmi-controller" << EOF
/var/log/ipmi-controller/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 644 $USER $USER
sharedscripts
postrotate
systemctl reload ipmi-controller
endscript
}
EOF
# Reload systemd
echo "🔄 Reloading systemd..."
systemctl daemon-reload
# Enable service
echo "✅ Enabling service to start on boot..."
systemctl enable "$SERVICE_NAME"
echo ""
echo "🚀 Starting IPMI Controller..."
systemctl start "$SERVICE_NAME"
sleep 2
# Check status # Check status
if systemctl is-active --quiet "$SERVICE_NAME"; then echo "Checking service status..."
sleep 2
ssh $PROD_USER@$PROD_HOST "sudo systemctl status $SERVICE_NAME --no-pager"
echo "" echo ""
echo "✅ IPMI Controller is running!" echo "=== Deployment Complete ==="
echo "IPMI Controller is now running at: http://$PROD_HOST:8000"
echo "" echo ""
echo "🌐 Access: http://$(hostname -I | awk '{print $1}'):8000" echo "To check logs: ssh $PROD_USER@$PROD_HOST 'sudo journalctl -u $SERVICE_NAME -f'"
echo ""
echo "📋 Management Commands:"
echo " Status: sudo systemctl status $SERVICE_NAME"
echo " Logs: sudo journalctl -u $SERVICE_NAME -f"
echo " Restart: sudo systemctl restart $SERVICE_NAME"
echo " Stop: sudo systemctl stop $SERVICE_NAME"
echo ""
echo "💾 Settings: $DATA_DIR/config.json"
echo "📜 Logs: /var/log/ipmi-controller/"
echo ""
echo "✅ Production deployment complete!"
echo " Service will auto-start on boot."
else
echo ""
echo "⚠️ Service failed to start. Check logs:"
echo " sudo journalctl -u $SERVICE_NAME -f"
exit 1
fi

View File

@ -464,3 +464,9 @@ NameError: name 'padding' is not defined
2026-02-20 22:46:56,801 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C) 2026-02-20 22:46:56,801 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C)
2026-02-20 22:47:12,899 - fan_controller - INFO - Fan 0xff speed set to 14% 2026-02-20 22:47:12,899 - fan_controller - INFO - Fan 0xff speed set to 14%
2026-02-20 22:47:12,900 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C) 2026-02-20 22:47:12,900 - fan_controller - INFO - All fans set to 14% (Temp 38.0°C)
2026-02-20 22:48:44,782 - fan_controller - INFO - Fan 0xff speed set to 16%
2026-02-20 22:48:44,783 - fan_controller - INFO - All fans set to 16% (Temp 41.0°C)
2026-02-20 22:49:00,730 - fan_controller - INFO - Fan 0xff speed set to 15%
2026-02-20 22:49:00,730 - fan_controller - INFO - All fans set to 15% (Temp 40.0°C)
2026-02-20 22:49:16,428 - fan_controller - INFO - Fan 0xff speed set to 14%
2026-02-20 22:49:16,428 - fan_controller - INFO - All fans set to 14% (Temp 39.0°C)