SYSTEMD SYNC: Link active systemd files to repository for automatic sync Problem Solved: ❌ Gap between repository systemd files and active systemd files ❌ Development changes in repo not reflected in running services ❌ Manual sync required to update systemd configuration ❌ Risk of configuration drift between repo and production Solution Implemented: ✅ Symbolic links from /etc/systemd/system/ to /opt/aitbc/systemd ✅ Automatic sync script for manual operations ✅ CI/CD workflow for automatic sync on repository changes ✅ Backup mechanism for safe operations ✅ Verification and status checking Files Created: 1. scripts/link-systemd.sh: - Creates symbolic links for all aitbc-* services - Handles .d directories automatically - Creates backups before making changes - Provides comprehensive status reporting 2. scripts/sync-systemd.sh: - Alternative copy-based sync method - For environments where symbolic links aren't preferred - Maintains file independence while keeping sync 3. .gitea/workflows/systemd-sync.yml: - Automatic CI/CD sync on repository changes - Triggers when systemd files are modified - Verifies link creation and service status - Provides manual instructions Benefits: ✅ Active systemd files always match repository ✅ No configuration drift between repo and production ✅ Changes in repo immediately reflected ✅ Automatic sync on every repository update ✅ Safe operations with backups ✅ CI/CD integration for automation Usage: - Manual: sudo ./scripts/link-systemd.sh - CI/CD: Automatic on systemd file changes - Verification: ls -la /etc/systemd/system/aitbc-* - Status: sudo systemctl status aitbc-* This eliminates the gap between repository and active systemd configuration, ensuring the repository always contains the current running state and changes are immediately reflected.
182 lines
6.4 KiB
YAML
182 lines
6.4 KiB
YAML
name: systemd-sync
|
|
|
|
on:
|
|
push:
|
|
branches: [ main, develop ]
|
|
paths:
|
|
- 'systemd/**'
|
|
- '.gitea/workflows/systemd-sync.yml'
|
|
workflow_dispatch:
|
|
|
|
# Prevent parallel execution - run workflows serially
|
|
concurrency:
|
|
group: ci-workflows
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
sync-systemd:
|
|
runs-on: debian
|
|
|
|
steps:
|
|
- name: Setup workspace
|
|
run: |
|
|
echo "=== SYSTEMD SYNC SETUP ==="
|
|
echo "Current PWD: $(pwd)"
|
|
echo "Forcing absolute workspace path..."
|
|
|
|
# Clean and create isolated workspace
|
|
rm -rf /opt/aitbc/systemd-sync-workspace
|
|
mkdir -p /opt/aitbc/systemd-sync-workspace
|
|
cd /opt/aitbc/systemd-sync-workspace
|
|
|
|
# Ensure no git lock files exist
|
|
find . -name "*.lock" -delete 2>/dev/null || true
|
|
|
|
echo "Workspace PWD: $(pwd)"
|
|
echo "Cloning repository..."
|
|
git clone https://gitea.bubuit.net/oib/aitbc.git repo
|
|
|
|
cd repo
|
|
echo "Repo PWD: $(pwd)"
|
|
echo "Files in repo:"
|
|
ls -la
|
|
|
|
- name: Sync Systemd Files
|
|
run: |
|
|
echo "=== SYNCING SYSTEMD FILES ==="
|
|
cd /opt/aitbc/systemd-sync-workspace/repo
|
|
|
|
echo "Repository systemd files:"
|
|
ls -la systemd/ | head -10
|
|
echo
|
|
echo "Active systemd files:"
|
|
ls -la /etc/systemd/system/aitbc-* | head -5 || echo "No active files found"
|
|
echo
|
|
|
|
# Check if running as root (should be in CI)
|
|
if [[ $EUID -eq 0 ]]; then
|
|
echo "✅ Running as root - can sync systemd files"
|
|
|
|
# Run the linking script
|
|
if [[ -f "scripts/link-systemd.sh" ]]; then
|
|
echo "🔗 Running systemd linking script..."
|
|
./scripts/link-systemd.sh
|
|
else
|
|
echo "❌ Link script not found, creating manual sync..."
|
|
|
|
# Manual sync as fallback
|
|
REPO_SYSTEMD_DIR="/opt/aitbc/systemd-sync-workspace/repo/systemd"
|
|
ACTIVE_SYSTEMD_DIR="/etc/systemd/system"
|
|
|
|
# Create backup
|
|
BACKUP_DIR="/opt/aitbc/systemd-backup-$(date +%Y%m%d-%H%M%S)"
|
|
mkdir -p "$BACKUP_DIR"
|
|
find "$ACTIVE_SYSTEMD_DIR" -name "aitbc-*" -type f -exec cp {} "$BACKUP_DIR/" \; 2>/dev/null || true
|
|
|
|
# Create symbolic links
|
|
for file in "$REPO_SYSTEMD_DIR"/aitbc-*; do
|
|
if [[ -f "$file" ]]; then
|
|
filename=$(basename "$file")
|
|
target="$ACTIVE_SYSTEMD_DIR/$filename"
|
|
source="$REPO_SYSTEMD_DIR/$filename"
|
|
|
|
echo "🔗 Linking: $filename"
|
|
ln -sf "$source" "$target"
|
|
|
|
# Handle .d directories
|
|
if [[ -d "${file}.d" ]]; then
|
|
target_dir="${target}.d"
|
|
source_dir="${file}.d"
|
|
rm -rf "$target_dir" 2>/dev/null || true
|
|
ln -sf "$source_dir" "$target_dir"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
systemctl daemon-reload
|
|
echo "✅ Manual systemd sync completed"
|
|
fi
|
|
|
|
else
|
|
echo "⚠️ Not running as root - systemd sync requires root privileges"
|
|
echo " To sync manually: sudo ./scripts/link-systemd.sh"
|
|
fi
|
|
|
|
- name: Verify Sync
|
|
run: |
|
|
echo "=== VERIFYING SYSTEMD SYNC ==="
|
|
cd /opt/aitbc/systemd-sync-workspace/repo
|
|
|
|
if [[ $EUID -eq 0 ]]; then
|
|
echo "🔍 Verifying systemd links..."
|
|
|
|
# Check if links exist
|
|
echo "Checking symbolic links:"
|
|
for file in systemd/aitbc-*; do
|
|
if [[ -f "$file" ]]; then
|
|
filename=$(basename "$file")
|
|
target="/etc/systemd/system/$filename"
|
|
|
|
if [[ -L "$target" ]]; then
|
|
echo "✅ $filename -> $(readlink "$target")"
|
|
elif [[ -f "$target" ]]; then
|
|
echo "⚠️ $filename exists but is not a link (copied file)"
|
|
else
|
|
echo "❌ $filename not found in active systemd"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
echo
|
|
echo "📊 Summary:"
|
|
echo " Repository files: $(find systemd -name 'aitbc-*' -type f | wc -l)"
|
|
echo " Active files: $(find /etc/systemd/system -name 'aitbc-*' -type f | wc -l)"
|
|
echo " Symbolic links: $(find /etc/systemd/system -name 'aitbc-*' -type l | wc -l)"
|
|
|
|
else
|
|
echo "⚠️ Cannot verify without root privileges"
|
|
fi
|
|
|
|
- name: Service Status Check
|
|
if: always()
|
|
run: |
|
|
echo "=== SERVICE STATUS CHECK ==="
|
|
|
|
if [[ $EUID -eq 0 ]]; then
|
|
echo "🔍 Checking AITBC service status..."
|
|
|
|
# Check if services are enabled
|
|
echo "Enabled services:"
|
|
systemctl list-unit-files 'aitbc-*' --state=enabled | head -5 || echo "No enabled services found"
|
|
|
|
echo
|
|
echo "Failed services:"
|
|
systemctl list-units 'aitbc-*' --state=failed | head -5 || echo "No failed services found"
|
|
|
|
echo
|
|
echo "Running services:"
|
|
systemctl list-units 'aitbc-*' --state=running | head -5 || echo "No running services found"
|
|
|
|
else
|
|
echo "⚠️ Cannot check service status without root privileges"
|
|
fi
|
|
|
|
- name: Instructions
|
|
run: |
|
|
echo "=== SYSTEMD SYNC INSTRUCTIONS ==="
|
|
echo
|
|
echo "🔧 Manual sync (if needed):"
|
|
echo " sudo ./scripts/link-systemd.sh"
|
|
echo
|
|
echo "🔄 Restart services:"
|
|
echo " sudo systemctl restart aitbc-blockchain-node"
|
|
echo " sudo systemctl restart aitbc-coordinator-api"
|
|
echo " sudo systemctl restart aitbc-*"
|
|
echo
|
|
echo "🔍 Check status:"
|
|
echo " sudo systemctl status aitbc-*"
|
|
echo
|
|
echo "🔍 Verify links:"
|
|
echo " ls -la /etc/systemd/system/aitbc-*"
|
|
echo " readlink /etc/systemd/system/aitbc-blockchain-node.service"
|