Major Changes: - Updated all code references from hvacknowitall/hvacnkowitall to hkia - Renamed all existing markdown files to use hkia_ prefix - Updated configuration files, scrapers, and production scripts - Modified systemd service descriptions to use HKIA - Changed NAS sync path to /mnt/nas/hkia Files Updated: - 20+ source files updated with new naming convention - 34 markdown files renamed to hkia_* format - All ScraperConfig brand_name parameters now use 'hkia' - Documentation updated to reflect new naming Rationale: - Shorter, cleaner filenames - Consistent branding across all outputs - Easier to type and reference - Maintains same functionality with improved naming Next Steps: - Deploy updated services to production - Update any external references to old naming - Monitor scrapers to ensure proper operation 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
250 lines
No EOL
6.6 KiB
Bash
Executable file
250 lines
No EOL
6.6 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# HKIA - Production Deployment Script
|
|
# Sets up systemd services, directories, and configuration
|
|
#
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Production paths
|
|
PROD_DIR="/opt/hvac-kia-content"
|
|
SERVICE_USER="hvac-content"
|
|
REPO_DIR="$(pwd)"
|
|
|
|
# Print colored output
|
|
print_status() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
print_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
print_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Check if running as root
|
|
check_root() {
|
|
if [[ $EUID -ne 0 ]]; then
|
|
print_error "This script must be run as root (use sudo)"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Create service user
|
|
setup_user() {
|
|
print_status "Setting up service user..."
|
|
|
|
if ! id "$SERVICE_USER" &>/dev/null; then
|
|
useradd --system --shell /bin/bash --home-dir "$PROD_DIR" --create-home "$SERVICE_USER"
|
|
print_success "Created service user: $SERVICE_USER"
|
|
else
|
|
print_warning "Service user $SERVICE_USER already exists"
|
|
fi
|
|
}
|
|
|
|
# Setup production directory
|
|
setup_directories() {
|
|
print_status "Setting up production directories..."
|
|
|
|
# Create production directory
|
|
mkdir -p "$PROD_DIR"
|
|
mkdir -p "$PROD_DIR/data"
|
|
mkdir -p "$PROD_DIR/logs"
|
|
mkdir -p "$PROD_DIR/backups"
|
|
mkdir -p "$PROD_DIR/venv"
|
|
|
|
# Create NAS mount point (if doesn't exist)
|
|
mkdir -p "/mnt/nas/hkia"
|
|
|
|
# Copy application files
|
|
cp -r "$REPO_DIR/src" "$PROD_DIR/"
|
|
cp -r "$REPO_DIR/config" "$PROD_DIR/"
|
|
cp "$REPO_DIR/pyproject.toml" "$PROD_DIR/"
|
|
cp "$REPO_DIR/run_production.py" "$PROD_DIR/"
|
|
cp "$REPO_DIR/production_backlog_capture.py" "$PROD_DIR/"
|
|
cp "$REPO_DIR/automated_backlog_capture.py" "$PROD_DIR/"
|
|
|
|
# Copy environment template
|
|
if [[ -f "$REPO_DIR/.env.production" ]]; then
|
|
cp "$REPO_DIR/.env.production" "$PROD_DIR/.env.template"
|
|
print_warning "Remember to configure $PROD_DIR/.env with actual credentials"
|
|
fi
|
|
|
|
# Set ownership
|
|
chown -R "$SERVICE_USER:$SERVICE_USER" "$PROD_DIR"
|
|
|
|
print_success "Production directories configured"
|
|
}
|
|
|
|
# Install Python dependencies
|
|
setup_python() {
|
|
print_status "Setting up Python environment..."
|
|
|
|
# Install uv if not available
|
|
if ! command -v uv &> /dev/null; then
|
|
print_status "Installing uv package manager..."
|
|
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
source ~/.bashrc
|
|
fi
|
|
|
|
# Switch to service user for Python setup
|
|
sudo -u "$SERVICE_USER" bash << EOF
|
|
cd "$PROD_DIR"
|
|
export PATH="/home/$SERVICE_USER/.local/bin:\$PATH"
|
|
|
|
# Create virtual environment and install dependencies
|
|
uv venv venv
|
|
source venv/bin/activate
|
|
uv pip install -e .
|
|
|
|
# Install playwright browsers
|
|
if uv pip list | grep -q playwright; then
|
|
playwright install chromium
|
|
fi
|
|
EOF
|
|
|
|
print_success "Python environment configured"
|
|
}
|
|
|
|
# Install systemd services
|
|
install_services() {
|
|
print_status "Installing systemd services..."
|
|
|
|
# Copy systemd files
|
|
cp "$REPO_DIR/systemd/"*.service /etc/systemd/system/
|
|
cp "$REPO_DIR/systemd/"*.timer /etc/systemd/system/
|
|
|
|
# Update service files with correct paths and user
|
|
for service_file in /etc/systemd/system/hvac-*.service; do
|
|
sed -i "s|/home/ben/dev/hvac-kia-content|$PROD_DIR|g" "$service_file"
|
|
sed -i "s|User=ben|User=$SERVICE_USER|g" "$service_file"
|
|
sed -i "s|Group=ben|Group=$SERVICE_USER|g" "$service_file"
|
|
done
|
|
|
|
# Reload systemd
|
|
systemctl daemon-reload
|
|
|
|
# Enable services (but don't start yet)
|
|
systemctl enable hvac-content-aggregator.timer
|
|
systemctl enable hvac-monitoring.timer
|
|
systemctl enable hvac-tiktok-captions.timer
|
|
|
|
print_success "Systemd services installed and enabled"
|
|
}
|
|
|
|
# Setup monitoring
|
|
setup_monitoring() {
|
|
print_status "Setting up monitoring..."
|
|
|
|
# Copy monitoring files
|
|
cp -r "$REPO_DIR/monitoring" "$PROD_DIR/"
|
|
chown -R "$SERVICE_USER:$SERVICE_USER" "$PROD_DIR/monitoring"
|
|
|
|
# Create monitoring dashboard
|
|
sudo -u "$SERVICE_USER" bash << EOF
|
|
cd "$PROD_DIR"
|
|
source venv/bin/activate
|
|
python monitoring/setup_monitoring.py
|
|
EOF
|
|
|
|
print_success "Monitoring configured"
|
|
}
|
|
|
|
# Create logrotate configuration
|
|
setup_logrotate() {
|
|
print_status "Setting up log rotation..."
|
|
|
|
cat > /etc/logrotate.d/hvac-content << EOF
|
|
$PROD_DIR/logs/*.log {
|
|
daily
|
|
missingok
|
|
rotate 30
|
|
compress
|
|
delaycompress
|
|
notifempty
|
|
create 644 $SERVICE_USER $SERVICE_USER
|
|
postrotate
|
|
systemctl reload hvac-content-aggregator.service || true
|
|
endscript
|
|
}
|
|
EOF
|
|
|
|
print_success "Log rotation configured"
|
|
}
|
|
|
|
# Verify installation
|
|
verify_installation() {
|
|
print_status "Verifying installation..."
|
|
|
|
# Check Python environment
|
|
if sudo -u "$SERVICE_USER" "$PROD_DIR/venv/bin/python" -c "import src.orchestrator; print('✓ Python modules OK')"; then
|
|
print_success "Python environment verified"
|
|
else
|
|
print_error "Python environment verification failed"
|
|
return 1
|
|
fi
|
|
|
|
# Check systemd services
|
|
for service in hvac-content-aggregator hvac-monitoring hvac-tiktok-captions; do
|
|
if systemctl is-enabled "${service}.timer" &>/dev/null; then
|
|
print_success "Service ${service}.timer is enabled"
|
|
else
|
|
print_error "Service ${service}.timer is not enabled"
|
|
return 1
|
|
fi
|
|
done
|
|
|
|
# Check directories
|
|
for dir in data logs backups; do
|
|
if [[ -d "$PROD_DIR/$dir" ]]; then
|
|
print_success "Directory $dir exists"
|
|
else
|
|
print_error "Directory $dir missing"
|
|
return 1
|
|
fi
|
|
done
|
|
|
|
print_success "Installation verification complete"
|
|
}
|
|
|
|
# Main deployment function
|
|
main() {
|
|
print_status "Starting HKIA production deployment..."
|
|
echo
|
|
|
|
check_root
|
|
setup_user
|
|
setup_directories
|
|
setup_python
|
|
install_services
|
|
setup_monitoring
|
|
setup_logrotate
|
|
verify_installation
|
|
|
|
echo
|
|
print_success "🎉 Production deployment complete!"
|
|
echo
|
|
print_warning "Next steps:"
|
|
echo "1. Configure $PROD_DIR/.env with actual credentials"
|
|
echo "2. Test the installation: sudo -u $SERVICE_USER $PROD_DIR/venv/bin/python $PROD_DIR/run_production.py --dry-run"
|
|
echo "3. Start services: sudo systemctl start hvac-content-aggregator.timer"
|
|
echo "4. Monitor logs: sudo journalctl -u hvac-content-aggregator.service -f"
|
|
echo "5. Check monitoring dashboard: http://localhost:8080"
|
|
echo
|
|
}
|
|
|
|
# Run main function
|
|
main "$@" |